update-nanoclaw
update-nanoclaw brings upstream NanoClaw repository changes into a customized local fork while preserving custom modifications. It performs preflight checks, creates timestamped backups, previews upstream changes by category (skills, source, container, config), offers merge/cherry-pick/rebase strategies with conflict preview, validates builds and tests, checks for breaking changes, and enables one-command rollback. Use this skill when your NanoClaw installation has drifted from the official repository and you want to incorporate upstream updates efficiently without losing local customizations.
git clone --depth 1 https://github.com/nanocoai/nanoclaw /tmp/update-nanoclaw && cp -r /tmp/update-nanoclaw/.claude/skills/update-nanoclaw ~/.claude/skills/update-nanoclawSKILL.md
# About Your NanoClaw fork drifts from upstream as you customize it. This skill pulls upstream changes into your install without losing your modifications. Run `/update-nanoclaw` in Claude Code. ## How it works **Preflight**: checks for clean working tree (`git status --porcelain`). If `upstream` remote is missing, asks you for the URL (defaults to `https://github.com/nanocoai/nanoclaw.git`) and adds it. Detects the upstream branch name (`main` or `master`). **Backup**: creates a timestamped backup branch and tag (`backup/pre-update-<hash>-<timestamp>`, `pre-update-<hash>-<timestamp>`) before touching anything. Safe to run multiple times. **Preview**: runs `git log` and `git diff` against the merge base to show upstream changes since your last sync. Groups changed files into categories: - **Skills** (`.claude/skills/`): unlikely to conflict unless you edited an upstream skill - **Host source** (`src/`): may conflict if you modified the same files - **Container** (`container/`): triggers container rebuild - **Build/config** (`package.json`, `pnpm-lock.yaml`, `tsconfig*.json`): lockfile changes trigger dep install **Update paths** (you pick one): - `merge` (default): `git merge upstream/<branch>`. Resolves all conflicts in one pass. - `cherry-pick`: `git cherry-pick <hashes>`. Pull in only the commits you want. - `rebase`: `git rebase upstream/<branch>`. Linear history, but conflicts resolve per-commit. - `abort`: just view the changelog, change nothing. **Conflict preview**: before merging, runs a dry-run (`git merge --no-commit --no-ff`) to show which files would conflict. You can still abort at this point. **Conflict resolution**: opens only conflicted files, resolves the conflict markers, keeps your local customizations intact. **Validation**: runs `pnpm run build` and `pnpm test`. If container files changed, also runs the container typecheck and `./container/build.sh`. **Breaking changes check**: after validation, reads CHANGELOG.md for any `[BREAKING]` entries introduced by the update. If found, shows each breaking change and offers to run the recommended skill to migrate. ## Rollback The backup tag is printed at the end of each run: ``` git reset --hard pre-update-<hash>-<timestamp> ``` Backup branch `backup/pre-update-<hash>-<timestamp>` also exists. ## Token usage Only opens files with actual conflicts. Uses `git log`, `git diff`, and `git status` for everything else. Does not scan or refactor unrelated code. --- # Goal Help a user with a customized NanoClaw install safely incorporate upstream changes without a fresh reinstall and without blowing tokens. # Operating principles - Never proceed with a dirty working tree. - Always create a rollback point (backup branch + tag) before touching anything. - Prefer git-native operations (fetch, merge, cherry-pick). Do not manually rewrite files except conflict markers. - Default to MERGE (one-pass conflict resolution). Offer REBASE as an explicit option. - Keep token usage low: rely on `git status`, `git log`, `git diff`, and open only conflicted files. # Step 0a: Refresh this skill first The update process itself evolves, so run its newest version before doing anything else: - Ensure the `upstream` remote exists (default `https://github.com/nanocoai/nanoclaw.git`) and fetch: `git fetch upstream --prune`. Detect the upstream branch (`main` or `master`). - Refresh this skill from upstream: `git checkout upstream/<branch> -- .claude/skills/update-nanoclaw/` - Re-read `.claude/skills/update-nanoclaw/SKILL.md`. If it changed, **follow the updated version from the top** instead of this one. This is the only working-tree change expected before the preflight check; the full update commits it along with everything else. # Step 0: Preflight (stop early if unsafe) Run: - `git status --porcelain` If output is non-empty: - Tell the user to commit or stash first, then stop. - Exception: changes limited to `.claude/skills/update-nanoclaw/` are the Step 0a self-refresh — ignore those and proceed. Confirm remotes: - `git remote -v` If `upstream` is missing: - Ask the user for the upstream repo URL (default: `https://github.com/nanocoai/nanoclaw.git`). - Add it: `git remote add upstream <user-provided-url>` - Then: `git fetch upstream --prune` Determine the upstream branch name: - `git branch -r | grep upstream/` - If `upstream/main` exists, use `main`. - If only `upstream/master` exists, use `master`. - Otherwise, ask the user which branch to use. - Store this as UPSTREAM_BRANCH for all subsequent commands. Every command below that references `upstream/main` should use `upstream/$UPSTREAM_BRANCH` instead. Fetch: - `git fetch upstream --prune` # Step 1: Create a safety net Capture current state: - `HASH=$(git rev-parse --short HEAD)` - `TIMESTAMP=$(date +%Y%m%d-%H%M%S)` Create backup branch and tag (using timestamp to avoid collisions on retry): - `git branch backup/pre-update-$HASH-$TIMESTAMP` - `git tag pre-update-$HASH-$TIMESTAMP` Save the tag name for later reference in the summary and rollback instructions. # Step 2: Preview what upstream changed (no edits yet) Compute common base: - `BASE=$(git merge-base HEAD upstream/$UPSTREAM_BRANCH)` Show upstream commits since BASE: - `git log --oneline $BASE..upstream/$UPSTREAM_BRANCH` Show local commits since BASE (custom drift): - `git log --oneline $BASE..HEAD` Show file-level impact from upstream: - `git diff --name-only $BASE..upstream/$UPSTREAM_BRANCH` Bucket the upstream changed files: - **Skills** (`.claude/skills/`): unlikely to conflict unless the user edited an upstream skill - **Host source** (`src/`): may conflict if user modified the same files - **Container** (`container/`): triggers container rebuild (+ typecheck if `agent-runner/src/` changed) - **Build/config** (`package.json`, `pnpm-lock.yaml`, `tsconfig*.json`): lockfile changes trigger dep install - **Other**: docs, tests, setup scripts, misc **Large drift check:** If the upstream commit count and age sug
Add Atomic Chat MCP server so the container agent can call local models served by the Atomic Chat desktop app via its OpenAI-compatible API.
Use Codex (CLI + AppServer) as the full agent provider — planning, tool orchestration, native compaction, MCP tools, session resume — in place of the Claude Agent SDK. ChatGPT subscription or OPENAI_API_KEY. Per-group via agent_provider. Distinct from using OpenAI as an MCP tool (where Claude remains the planner).
Add a monitoring dashboard to NanoClaw. Installs @nanoco/nanoclaw-dashboard and a pusher that sends periodic JSON snapshots.
Add DeltaChat channel integration via @deltachat/stdio-rpc-server. Native adapter — no Chat SDK bridge. Email-based messaging with end-to-end encryption.
Add Discord bot channel integration via Chat SDK.
Add Emacs as a channel. Opens an interactive chat buffer and org-mode integration so you can talk to NanoClaw from within Emacs (Doom, Spacemacs, or vanilla). Local HTTP bridge — no bot token or external service needed.
Add Google Calendar as an MCP tool (list calendars, list/search/create events, free/busy queries) using OneCLI-managed OAuth. Multi-calendar and multi-account supported. Mirrors /add-gmail-tool's stub pattern — no raw credentials ever reach the container; OneCLI injects real tokens at request time.
Add Google Chat channel integration via Chat SDK.