`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.
8.0 KiB
8.0 KiB
Changelog
All notable changes to NanoClaw will be documented in this file.
For detailed release notes, see the full changelog on the documentation site.
[Unreleased]
- v1 → v2 migration (experimental).
bash nanoclaw.shnow detects a v1 install (~/nanoclaw,~/.nanoclaw, siblings of the v2 checkout, or$NANOCLAW_V1_PATH) and runs a best-effort port before channel pairing: seedsagent_groups/messaging_groups/wirings from v1'sregistered_groups(with trigger_pattern → engage_mode/engage_pattern), copies group folders, merges.env, installs v2 channel adapters, and portsscheduled_tasks. Hands off to/migrate-from-v1for owner seeding and fork customizations. Experimental — back updata/v2.dbandgroups/first; see 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 and docs/isolation-model.md. - [BREAKING] Two-DB session split. Each session now has
inbound.db(host writes, container reads) andoutbound.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. - [BREAKING] Install flow replaced.
bash nanoclaw.shis the new default: a scripted installer that hands off to Claude Code for error recovery and guided decisions. The/setupClaude-guided skill still works as an alternative. - [BREAKING] Channels moved to the
channelsbranch. 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 thechannelsbranch./update-nanoclawwill re-install the channels your fork had. - [BREAKING] Alternative providers moved to the
providersbranch. 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 composedCLAUDE.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 thewhatsappremote 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-oneclito install OneCLI and migrate.envcredentials 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-containerand 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 stoptimeout for faster container restarts (-t 1flag)
[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
/capabilitiesand/statuscontainer-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=processso remote-control survives service restarts
[1.2.14] - 2026-03-14
- Added
/remote-controlcommand 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 viagit merge - Added Docker Sandboxes support
- Fixed setup registration to use correct CLI commands
[1.2.12] - 2026-03-08
- Added
/compactskill 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
LIMITto 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_messagetool description for scheduled tasks
[1.2.7] - 2026-03-06
- Added
/add-ollamaskill for local model inference - Added
update_tasktool and return task ID fromschedule_task
[1.2.6] - 2026-03-04
- Updated
claude-agent-sdkto 0.2.68
[1.2.5] - 2026-03-04
- CI formatting fix
[1.2.4] - 2026-03-04
- Fixed
_chatJidrename tochatJidinonMessagecallback
[1.2.3] - 2026-03-04
- Added sender allowlist for per-chat access control
[1.2.2] - 2026-03-04
- Added
/use-local-whisperskill 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 isMainflag replaces folder-name-based main group detectionENABLED_CHANNELSremoved — 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-nanoclawskill for syncing with upstream
[1.1.3] - 2026-02-25
- Added
/add-slackskill - 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
/updateskill to pull upstream changes from within Claude Code - Enhanced container environment isolation via credential proxy