Agent Skills › nanocoai/nanoclaw › update-nanoclaw

update-nanoclaw

GitHub

安全事务化更新 NanoClaw 定制安装,隔离工作区验证后切换,支持快照、迁移门禁及故障自动回滚。

.claude/skills/update-nanoclaw/SKILL.md nanocoai/nanoclaw

Trigger Scenarios

需要合并上游代码变更 执行选择性上游版本升级

Install

npx skills add nanocoai/nanoclaw --skill update-nanoclaw -g -y
More Options

Non-standard path

npx skills add https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/update-nanoclaw -g -y

Use without installing

npx skills use nanocoai/nanoclaw@update-nanoclaw

指定 Agent (Claude Code)

npx skills add nanocoai/nanoclaw --skill update-nanoclaw -a claude-code -g -y

安装 repo 全部 skill

npx skills add nanocoai/nanoclaw --all -g -y

预览 repo 内 skill

npx skills add nanocoai/nanoclaw --list

SKILL.md

Frontmatter
{
    "name": "update-nanoclaw",
    "description": "Transactionally update a customized NanoClaw checkout from official upstream without exposing live mounted source, with fork-safe skill refresh, mutable-state snapshots, migration gates, exact-code upgrade markers, detected service restart, health verification, and automatic local rollback. Use for routine merge, rebase, or selective upstream updates."
}

Update NanoClaw

Update a customized install through an isolated, resumable transaction. The live checkout is not touched until the staged result has passed validation.

Use ordinary conversation for decisions and confirmations. Do not depend on Claude Code, Codex, OpenCode, or any provider-specific question/skill tool.

Safety contract

  • Require a clean live checkout.
  • Stage Git integration, dependency installation, installed-skill refresh, and tests in a separate worktree.
  • Resolve registry branches from the remote that actually carries them.
  • Stop the detected service and drain this install's active containers before changing source mounted into agent containers.
  • Snapshot .env, data/, groups/, store/, and manual-service state before cutover. Sockets and other ephemeral special files are intentionally omitted.
  • Gate every breaking migration and external version-pin move.
  • Stamp the exact Git commit/tree only after all required work succeeds.
  • Restart through the detected launchd, user-systemd, system-systemd, or nohup mode; require process state, data/ncl.sock, and bin/ncl groups list.
  • Refuse cutover while an unmanaged pnpm dev/Node host is running. Stop that process explicitly, update offline, then start it again manually.
  • On build or health failure, restore Git and the mutable-state snapshot, rebuild the previous image, restart the previous service, and health-check it.

1. Load the newest controller without changing the live tree

Confirm the live tree is clean:

git status --porcelain

Stop if it prints anything.

Use the official remote if one already exists. Otherwise add it as upstream:

if git remote get-url upstream >/dev/null 2>&1; then
  upstream_remote=upstream
elif git remote get-url origin 2>/dev/null | grep -Eq '(^|[:/])nanocoai/nanoclaw(.git)?$'; then
  upstream_remote=origin
else
  git remote add upstream https://github.com/nanocoai/nanoclaw.git
  upstream_remote=upstream
fi
git fetch "$upstream_remote" --prune

Select main when present, otherwise master:

if git show-ref --verify --quiet "refs/remotes/$upstream_remote/main"; then
  upstream_ref="$upstream_remote/main"
elif git show-ref --verify --quiet "refs/remotes/$upstream_remote/master"; then
  upstream_ref="$upstream_remote/master"
else
  echo "Official remote has neither main nor master" >&2
  exit 1
fi

Materialize the newest controller from that ref. This is the self-update seam: an older local skill still executes the newest safety code before any mutation.

# pwd -P: on macOS mktemp returns a path through the /var symlink, and a
# symlinked argv defeats Node's import.meta main-module guard — the controller
# then exits 0 having done NOTHING. Canonicalize before use.
controller_dir="$(cd "$(mktemp -d)" && pwd -P)"
# Extract all of scripts/, not a hand-listed subset: the controller's import
# graph reaches across that tree, and a list has to be edited every time a
# module it loads gains a sibling import. src/install-slug.ts is the one file
# outside scripts/ that the controller imports.
git archive "$upstream_ref" scripts src/install-slug.ts | tar -x -C "$controller_dir"

2. Choose the Git strategy and prepare

Default to merge. Use rebase only when the user explicitly wants linear history. Use cherry-pick only with an explicit comma-separated commit list.

pnpm exec tsx "$controller_dir/scripts/update-nanoclaw.ts" prepare \
  --project-root "$PWD" --upstream-ref "$upstream_ref" --strategy merge

The JSON result is nanoclaw-update/v1. Record its id, stageRoot, backup branch/tag, changed files, and requirements. The live HEAD is still unchanged.

If phase is conflict, resolve conflicts only inside stageRoot, preserving intentional local customizations. Complete the merge/rebase/cherry-pick there, commit it, then run:

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" resume \
  --project-root "$PWD" --id "$id"

Show the user the upstream commits, changed-file buckets, requirements, and any resolved conflicts. To stop with no live mutation:

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" abandon \
  --project-root "$PWD" --id "$id"

3. Validate the staged result

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" validate \
  --project-root "$PWD" --id "$id"

Validation performs a fork-safe structured refresh of every installed channel and provider, commits refreshed payloads in the staging branch, installs frozen dependencies, runs the host build and full host tests, and runs the container dependency/typecheck leg when Bun is available. A provider skill that declares Bun dependencies does not require Bun on the host: refresh runs the exact Bun version pinned by container/Dockerfile through pnpm. Any selected skill refresh or validation failure blocks cutover and the completion stamp.

Fix only failures caused by the staged update, inside stageRoot, commit the fix, and re-run validation. Do not mutate the live checkout to repair staging.

4. Confirm and cut over

Before downtime, show the exact changed files, required migrations, detected backup tag, and rollback command. Ask for one confirmation to begin cutover.

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" cutover \
  --project-root "$PWD" --id "$id"

Cutover stops the detected service, then stops this install's labeled agent containers (an agent mid-turn loses that turn; wait for a quiet moment if that matters), snapshots mutable state, resets the live branch to the validated target, installs frozen dependencies, builds the host, and updates the agent image when container/ changed. Hardened-image installs use pull; local-image installs build locally. The service remains stopped while required migrations are pending.

5. Complete every requirement

Process requirements one at a time.

  • For a referenced local guide, read it from the cut-over checkout and follow its detect, fix, verify, and rollback sections.
  • For a referenced /<skill>, read that skill's current SKILL.md and follow it directly. Do not require a harness-specific skill invocation feature.
  • For OneCLI pin moves, follow docs/onecli-upgrades.md; record the exact old version or rollback command because OneCLI is outside the Git snapshot.

If a migration intentionally changes tracked files, review and commit those changes before acknowledging it. Finish refuses a dirty cut-over checkout.

After verification, acknowledge the requirement:

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" ack \
  --project-root "$PWD" --id "$id" \
  --requirement "$requirement_id" --status succeeded

For an external component, also pass a concise exact rollback instruction:

... ack ... --rollback "restore onecli-gateway to <old-version>"

Use --status failed when verification fails. A pending or failed requirement blocks finish; never offer “restart anyway.” The state snapshot is the recovery path for forward local migrations.

6. Finish and health-check

pnpm exec tsx "$stageRoot/scripts/update-nanoclaw.ts" finish \
  --project-root "$PWD" --id "$id"

Finish stamps the exact version/commit/tree, restarts the service mode detected before cutover, and waits for the process, CLI socket, and a real CLI request. Only phase: complete is success.

After success, remove the staging worktree and its temporary branch from the live checkout. This keeps the backup branch/tag and mutable snapshot intact for rollback:

pnpm exec tsx scripts/update-nanoclaw.ts cleanup --id "$id"

If health fails, the controller restores the previous Git commit and mutable state, rebuilds the previous image, restarts the old service, and verifies it. If an external component was changed, also execute the recorded external rollback instruction and verify that component; Git cannot restore it.

7. Report and retain one rollback point

Report:

  • transaction id and final phase;
  • old, target, and official upstream commits;
  • backup branch/tag and mutable snapshot location;
  • conflicts resolved;
  • registry remotes and refreshed skills;
  • validation and image result;
  • completed migrations and external rollback instructions;
  • detected service mode and health result; and
  • remaining diff from official upstream.

Manual rollback remains available while the snapshot is retained:

pnpm exec tsx scripts/update-nanoclaw.ts rollback --id "$id"

Do not describe the Git tag alone as full rollback. The transaction snapshot is what restores SQLite and other mutable local state. Keep the newest successful transaction until the next update completes. Then preview older terminal transactions that are safe to prune:

pnpm exec tsx scripts/update-nanoclaw.ts prune --id "$id" --dry-run

Show the removed list and ask for confirmation. If confirmed, run the same command without --dry-run. Pruning keeps the selected transaction, every newer transaction, and every nonterminal transaction. It removes older terminal snapshots and their staging/backup Git references. Never delete transaction directories directly.

Version History

  • 5e4f4b7 Current 2026-09-28 10:14

    修复 cutover 阶段容器停止逻辑,主动停止并排空标签匹配的代理容器,解决因等待空闲容器导致更新超时失败的问题。

  • 294ef2a 2026-08-28 20:52

    修复 macOS 环境下因缓冲区限制、符号链接路径解析错误、快照不可重试及回滚逻辑缺陷导致的七项故障,提升事务控制器在 macOS 上的正确性。

  • 882305e 2026-08-20 09:43

Same Skill Collection

.claude/skills/add-anydoc/container-skills/convert-documents-to-markdown/SKILL.md
.claude/skills/add-anydoc/SKILL.md
.claude/skills/add-atomic-chat-tool/SKILL.md
.claude/skills/add-clidash/SKILL.md
.claude/skills/add-codex/SKILL.md
.claude/skills/add-dashboard/SKILL.md
.claude/skills/add-deltachat/SKILL.md
.claude/skills/add-dial-number/SKILL.md
.claude/skills/add-dial/SKILL.md
.claude/skills/add-emacs/SKILL.md
.claude/skills/add-imessage/SKILL.md
.claude/skills/add-iron-proxy/SKILL.md
.claude/skills/add-karpathy-llm-wiki/SKILL.md
.claude/skills/add-linear/SKILL.md
.claude/skills/add-macos-statusbar/SKILL.md
.claude/skills/add-mattermost/SKILL.md
.claude/skills/add-mnemon/SKILL.md
.claude/skills/add-ollama-provider/SKILL.md
.claude/skills/add-ollama-tool/SKILL.md
.claude/skills/add-onecli/SKILL.md
.claude/skills/add-opencode/SKILL.md
.claude/skills/add-resend/SKILL.md
.claude/skills/add-rtk/SKILL.md
.claude/skills/add-signal/SKILL.md
.claude/skills/add-tavily-tool/SKILL.md
.claude/skills/add-teams/SKILL.md
.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md
.claude/skills/add-vercel/SKILL.md
.claude/skills/add-wechat/SKILL.md
.claude/skills/add-whatsapp-cloud/SKILL.md
.claude/skills/add-whatsapp/SKILL.md
.claude/skills/customize/SKILL.md
.claude/skills/debug/SKILL.md
.claude/skills/init-first-agent/SKILL.md
.claude/skills/init-onecli/SKILL.md
.claude/skills/manage-channels/SKILL.md
.claude/skills/manage-mounts/SKILL.md
.claude/skills/migrate-from-openclaw/SKILL.md
.claude/skills/migrate-from-v1/SKILL.md
.claude/skills/migrate-memory/SKILL.md
.claude/skills/migrate-nanoclaw/SKILL.md
.claude/skills/migrate-slack-agents/SKILL.md
.claude/skills/setup/SKILL.md
.claude/skills/slack-a2a-rooms/SKILL.md
.claude/skills/slack-agent-flow/SKILL.md
.claude/skills/update-skills/SKILL.md
container/skills/agent-browser/SKILL.md
container/skills/frontend-engineer/SKILL.md
container/skills/onecli-gateway/SKILL.md

Metadata

Files
0
Version
5e4f4b7
Hash
7e1617eb
Indexed
2026-08-20 09:43

ホーム - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-09-29 02:03
浙ICP备14020137号-1