`bash nanoclaw.sh` detects a v1 install before channel pairing and does a best-effort automated port of operationally important state. Hands off to a new `/migrate-from-v1` skill for owner seeding and fork customizations. Between the timezone and channel steps, `setup/auto.ts` calls `runMigrateV1()` which orchestrates these registered sub-steps (each a separate entry in the progression log with its own raw log + status block — failures never abort the chain): - **migrate-detect** — scans siblings of the v2 checkout + common $HOME locations; `$NANOCLAW_V1_PATH` overrides authoritatively. Relaxed `package.json` check lets forks + partial installs still match; DB presence is the strongest signal. - **migrate-validate** — asserts v1 DB shape (tables + required columns); writes `schema-mismatch.json` on failure. Subsequent steps short-circuit their DB-dependent parts but still run. - **migrate-db** — seeds `agent_groups` + `messaging_groups` + `messaging_group_agents` from v1's `registered_groups`. JID decomposition (`dc:123` → `channel_type='discord'`, `platform_id='discord:123'`); `trigger_pattern` + `requires_trigger` → `engage_mode` + `engage_pattern` (mirrors migration 010 backfill). Users + user_roles are NOT seeded — the skill does that with an owner interview. Idempotent: existing rows reused, not duplicated. - **migrate-groups** — rsync group folders. v1 `CLAUDE.md` → v2 `CLAUDE.local.md` (v2 composes `CLAUDE.md` at container spawn); v1 `container_config` JSON → `.v1-container-config.json` sidecar for the skill to translate. Tight v1-pattern scan (`/workspace/ipc/tasks`, `store/messages.db`, `[PR_CONTEXT:`, etc.) flags files referencing v1-specific infrastructure — content is NOT modified, just flagged in the handoff. - **migrate-env** — merges v1 `.env` into v2 `.env`, never overwriting existing v2 keys. - **migrate-channel-auth** — per-channel registry tracks v1 env keys, v2 required keys (with source-of-key instructions — e.g. Discord needs `DISCORD_PUBLIC_KEY` which v1 never stored), and candidate on-disk auth state paths (Baileys keystore, matrix sync state, etc.). Missing required v2 keys surface as actionable followups and flip the step to `partial`. - **migrate-channels** — runs `setup/install-<channel>.sh` for each detected channel in non-interactive mode. Install-script output is captured to `logs/setup-migration/install-<channel>.log` sidecars (silent under the parent spinner). Channels with no v2 adapter get a `not_supported` followup but don't degrade status. - **migrate-tasks** — v1 `scheduled_tasks` → `messages_in` rows with `kind='task'` in each session's `inbound.db`. `schedule_type` mapping (cron / interval / once → v2 cron). Idempotent: skips v1 task ids already present. Inactive rows dumped to `inactive-tasks.json` for reference. Everything writes to `logs/setup-migration/handoff.json` — the source of truth the skill consumes. `.claude/skills/migrate-from-v1/SKILL.md`: - **Phase A** (always): owner seeding + v1 access policy flip (`unknown_sender_policy` public/strict) via `AskUserQuestion`. Pulls sender candidates from v1's `messages` table as hints. - **Phase B** (if followups exist): walks `handoff.followups` — translates `.v1-container-config.json` sidecars, handles `not_supported` channels, fills in missing required keys with instructions on where to get them. - **Phase C** (fork-aware): `git log <upstream>..HEAD` in v1. Empty → "no customizations to port." Non-empty → scope choice (mechanical / full interview / reference-only). Portable categories (`container/skills/*`, `.claude/skills/*`, docs) scan+copy with `scanForV1Patterns`. Non-portable (`src/*`, `container/agent-runner/src/*`) stash to `docs/v1-fork-reference/` — explicit "don't translate v1 infra to v2" warning because v1's IPC file queue / single DB don't exist in v2. Clearly marked in README, CLAUDE.md, SKILL.md header, and via a `p.warn` that fires once per run when v1 is detected. Users with no v1 install see a silent skip — no prompts, no noise. Verified end-to-end against a live v1 install (300 discord + 1 discord-supervisor groups, fork with ~15 commits of PR-factory work): - Detect → validate → db (301 rows seeded) → groups (301 CLAUDE.local.md + 178 other files + 1 container_config sidecar) → env (4 keys copied) → channel-auth (flagged missing `DISCORD_APPLICATION_ID` + `DISCORD_PUBLIC_KEY`) → channels (discord installed, discord-supervisor → not_supported) → tasks (0 rows, skipped) - Idempotent re-run: 0 rows created, 903 rows reused; tasks skip if id already present - Fresh-user case: silent skip, no prompts, straight to "You're ready!" - Schema-mismatch case: recorded to `schema-mismatch.json`, chain continues - Unit tests for the pure transforms (`parseJid`, `inferChannelType`, `triggerToEngage`, `scanForV1Patterns`, `looksLikeV1Install`) - Validate `requiredV2Keys` for telegram/slack/matrix/teams/webex/ resend/linear against the actual Chat SDK packages (Discord was verified from real error output) - Widen candidate auth file paths for WhatsApp/Matrix/iMessage based on real non-Discord v1 installs once we have some See docs/v1-to-v2-changes.md for the v1 → v2 architecture diff.
168 lines
8.0 KiB
Markdown
168 lines
8.0 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to NanoClaw will be documented in this file.
|
|
|
|
For detailed release notes, see the [full changelog on the documentation site](https://docs.nanoclaw.dev/changelog).
|
|
|
|
## [Unreleased]
|
|
|
|
- **v1 → v2 migration (experimental).** `bash nanoclaw.sh` now detects a v1 install (`~/nanoclaw`, `~/.nanoclaw`, siblings of the v2 checkout, or `$NANOCLAW_V1_PATH`) and runs a best-effort port before channel pairing: seeds `agent_groups`/`messaging_groups`/wirings from v1's `registered_groups` (with trigger_pattern → engage_mode/engage_pattern), copies group folders, merges `.env`, installs v2 channel adapters, and ports `scheduled_tasks`. Hands off to `/migrate-from-v1` for owner seeding and fork customizations. Experimental — back up `data/v2.db` and `groups/` first; see [docs/v1-to-v2-changes.md](docs/v1-to-v2-changes.md).
|
|
|
|
## [2.0.0] - 2026-04-22
|
|
|
|
Major version. NanoClaw v2 is a substantial architectural rewrite. Existing forks should run `/migrate-nanoclaw` (clean-base replay of customizations) or `/update-nanoclaw` (selective cherry-pick) before resuming work.
|
|
|
|
- [BREAKING] **New entity model.** Users, roles (owner/admin), messaging groups, and agent groups are now tracked as separate entities, wired via `messaging_group_agents`. Privilege is user-level instead of channel-level, so the old "main channel = admin" concept is retired. See [docs/architecture.md](docs/architecture.md) and [docs/isolation-model.md](docs/isolation-model.md).
|
|
- [BREAKING] **Two-DB session split.** Each session now has `inbound.db` (host writes, container reads) and `outbound.db` (container writes, host reads) with exactly one writer each. Replaces the single shared session DB and eliminates cross-mount SQLite contention. See [docs/db-session.md](docs/db-session.md).
|
|
- [BREAKING] **Install flow replaced.** `bash nanoclaw.sh` is the new default: a scripted installer that hands off to Claude Code for error recovery and guided decisions. The `/setup` Claude-guided skill still works as an alternative.
|
|
- [BREAKING] **Channels moved to the `channels` branch.** Trunk no longer ships Discord, Slack, Telegram, WhatsApp, iMessage, Teams, Linear, GitHub, WeChat, Matrix, Google Chat, Webex, Resend, or WhatsApp Cloud. Install them per fork via `/add-<channel>` skills, which copy from the `channels` branch. `/update-nanoclaw` will re-install the channels your fork had.
|
|
- [BREAKING] **Alternative providers moved to the `providers` branch.** OpenCode, Codex, and Ollama install via `/add-opencode`, `/add-codex`, `/add-ollama-provider`. Claude remains the default provider baked into trunk.
|
|
- [BREAKING] **Three-level channel isolation.** Wire channels to their own agent (separate agent groups), share an agent with independent conversations (`session_mode: 'shared'`), or merge channels into one shared session (`session_mode: 'agent-shared'`). Chosen per channel via `/manage-channels`.
|
|
- [BREAKING] **Apple Container removed from default setup.** Still available as an opt-in via `/convert-to-apple-container`.
|
|
- **Shared-source agent-runner.** Per-group `agent-runner-src/` overlays are gone; all groups mount the same agent-runner read-only. Per-group customization flows through composed `CLAUDE.md` (shared base + per-group fragments).
|
|
- **Agent-runner runtime moved from Node to Bun.** Container image is self-contained; no host-side impact. Host remains on Node + pnpm.
|
|
- **OneCLI Agent Vault is the sole credential path.** Containers never receive raw API keys; credentials are injected at request time.
|
|
|
|
## [1.2.36] - 2026-03-26
|
|
|
|
- [BREAKING] Replaced pino logger with built-in logger. WhatsApp users must re-merge the WhatsApp fork to pick up the Baileys logger compatibility fix: `git fetch whatsapp main && git merge whatsapp/main`. If the `whatsapp` remote is not configured: `git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git`.
|
|
|
|
## [1.2.35] - 2026-03-26
|
|
|
|
- [BREAKING] OneCLI Agent Vault replaces the built-in credential proxy. Check your runtime: `grep CONTAINER_RUNTIME_BIN src/container-runtime.ts` — if it shows `'container'` you are on Apple Container, if `'docker'` you are on Docker. Docker users: run `/init-onecli` to install OneCLI and migrate `.env` credentials to the vault. Apple Container users: re-merge the skill branch (`git fetch upstream skill/apple-container && git merge upstream/skill/apple-container`) then run `/convert-to-apple-container` and follow all instructions (configures credential proxy networking) — do NOT run `/init-onecli`, it requires Docker.
|
|
|
|
## [1.2.21] - 2026-03-22
|
|
|
|
- Added opt-in diagnostics via PostHog with explicit user consent (Yes / No / Never ask again)
|
|
|
|
## [1.2.20] - 2026-03-21
|
|
|
|
- Added ESLint configuration with error-handling rules
|
|
|
|
## [1.2.19] - 2026-03-19
|
|
|
|
- Reduced `docker stop` timeout for faster container restarts (`-t 1` flag)
|
|
|
|
## [1.2.18] - 2026-03-19
|
|
|
|
- User prompt content no longer logged on container errors — only input metadata
|
|
- Added Japanese README translation
|
|
|
|
## [1.2.17] - 2026-03-18
|
|
|
|
- Added `/capabilities` and `/status` container-agent skills
|
|
|
|
## [1.2.16] - 2026-03-18
|
|
|
|
- Tasks snapshot now refreshes immediately after IPC task mutations
|
|
|
|
## [1.2.15] - 2026-03-16
|
|
|
|
- Fixed remote-control prompt auto-accept to prevent immediate exit
|
|
- Added `KillMode=process` so remote-control survives service restarts
|
|
|
|
## [1.2.14] - 2026-03-14
|
|
|
|
- Added `/remote-control` command for host-level Claude Code access from within containers
|
|
|
|
## [1.2.13] - 2026-03-14
|
|
|
|
**Breaking:** Skills are now git branches, channels are separate fork repos.
|
|
|
|
- Skills live as `skill/*` git branches merged via `git merge`
|
|
- Added Docker Sandboxes support
|
|
- Fixed setup registration to use correct CLI commands
|
|
|
|
## [1.2.12] - 2026-03-08
|
|
|
|
- Added `/compact` skill for manual context compaction
|
|
- Enhanced container environment isolation via credential proxy
|
|
|
|
## [1.2.11] - 2026-03-08
|
|
|
|
- Added PDF reader, image vision, and WhatsApp reactions skills
|
|
- Fixed task container to close promptly when agent uses IPC-only messaging
|
|
|
|
## [1.2.10] - 2026-03-06
|
|
|
|
- Added `LIMIT` to unbounded message history queries for better performance
|
|
|
|
## [1.2.9] - 2026-03-06
|
|
|
|
- Agent prompts now include timezone context for accurate time references
|
|
|
|
## [1.2.8] - 2026-03-06
|
|
|
|
- Fixed misleading `send_message` tool description for scheduled tasks
|
|
|
|
## [1.2.7] - 2026-03-06
|
|
|
|
- Added `/add-ollama` skill for local model inference
|
|
- Added `update_task` tool and return task ID from `schedule_task`
|
|
|
|
## [1.2.6] - 2026-03-04
|
|
|
|
- Updated `claude-agent-sdk` to 0.2.68
|
|
|
|
## [1.2.5] - 2026-03-04
|
|
|
|
- CI formatting fix
|
|
|
|
## [1.2.4] - 2026-03-04
|
|
|
|
- Fixed `_chatJid` rename to `chatJid` in `onMessage` callback
|
|
|
|
## [1.2.3] - 2026-03-04
|
|
|
|
- Added sender allowlist for per-chat access control
|
|
|
|
## [1.2.2] - 2026-03-04
|
|
|
|
- Added `/use-local-whisper` skill for local voice transcription
|
|
- Atomic task claims prevent scheduled tasks from executing twice
|
|
|
|
## [1.2.1] - 2026-03-02
|
|
|
|
- Version bump (no functional changes)
|
|
|
|
## [1.2.0] - 2026-03-02
|
|
|
|
**Breaking:** WhatsApp removed from core, now a skill. Run `/add-whatsapp` to re-add.
|
|
|
|
- Channel registry: channels self-register at startup via `registerChannel()` factory pattern
|
|
- `isMain` flag replaces folder-name-based main group detection
|
|
- `ENABLED_CHANNELS` removed — channels detected by credential presence
|
|
- Prevent scheduled tasks from executing twice when container runtime exceeds poll interval
|
|
|
|
## [1.1.6] - 2026-03-01
|
|
|
|
- Added CJK font support for Chromium screenshots
|
|
|
|
## [1.1.5] - 2026-03-01
|
|
|
|
- Fixed wrapped WhatsApp message normalization
|
|
|
|
## [1.1.4] - 2026-03-01
|
|
|
|
- Added third-party model support
|
|
- Added `/update-nanoclaw` skill for syncing with upstream
|
|
|
|
## [1.1.3] - 2026-02-25
|
|
|
|
- Added `/add-slack` skill
|
|
- Restructured Gmail skill for new architecture
|
|
|
|
## [1.1.2] - 2026-02-24
|
|
|
|
- Improved error handling for WhatsApp Web version fetch
|
|
|
|
## [1.1.1] - 2026-02-24
|
|
|
|
- Added Qodo skills and codebase intelligence
|
|
- Fixed WhatsApp 405 connection failures
|
|
|
|
## [1.1.0] - 2026-02-23
|
|
|
|
- Added `/update` skill to pull upstream changes from within Claude Code
|
|
- Enhanced container environment isolation via credential proxy
|