Migrate Core Code to Submodules
tinyhumansai/openhuman
Plans and carries out moving non-host-specific code and its tests from the OpenHuman core into vendored tiny submodule libraries, then releases the submodule and re-pins the host.
Extracts user customizations from a fork, generates a replayable migration guide, and upgrades to upstream by reapplying customizations on a clean base.
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nanocoai/nanoclaw migrate-nanoclaw --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .claude/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .claude/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclawType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nanocoai/nanoclaw migrate-nanoclaw --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .agents/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .agents/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nanocoai/nanoclaw migrate-nanoclaw --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .cursor/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .cursor/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/nanocoai/nanoclaw.git --path .claude/skills/migrate-nanoclaw--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nanocoai/nanoclaw migrate-nanoclaw --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .gemini/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .gemini/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install nanocoai/nanoclaw migrate-nanoclawInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .github/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .github/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nanocoai/nanoclaw migrate-nanoclaw --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/migrate-nanoclaw .opencode/skills/migrate-nanoclaw && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "migrate-nanoclaw" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/migrate-nanoclaw into .opencode/skills/migrate-nanoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "migrate-nanoclaw", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
migrate-nanoclawExtracts user customizations from a fork, generates a replayable migration guide, and upgrades to upstream by reapplying customizations on a clean base.
Migrate Nanoclaw is an agent skill from nanocoai/nanoclaw. Extracts user customizations from a fork, generates a replayable migration guide, and upgrades to upstream by reapplying customizations on a clean base. Replaces merge-based upgrades with intent-based migration.
Its SKILL.md is about 6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `diagnostics.md`).
It sits in Development, covering Code migrations. The repository describes itself as: A lightweight alternative to OpenClaw that runs in containers for security. Connects to WhatsApp, Telegram, Slack, Discord, Gmail and other messaging apps,, has memory, scheduled…. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit af699e7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitpnpmbunFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
DEEPL_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Migrate Nanoclaw loads about 6k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 2,667 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
ectories (`groups/`, `store/`, `data/`, `.env`) are never touched — only code.ln -s "$PROJECT_ROOT/.env" "$WORKTREE/.env"TREE/data" "$WORKTREE/groups" "$WORKTREE/.env"Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from nanocoai/nanoclaw at commit af699e7, republished under its MIT licence (© nanocoai). 2,667 words, ~5,951 tokens.
.claude/skills/migrate-nanoclaw/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.NanoClaw users fork the repo and customize it — changing config values, editing source files, modifying personas, adding skills. When upstream ships updates or refactors, git merge produces painful conflicts because the same core files were changed on both sides.
This skill extracts the user's customizations into a migration guide — capturing both the intent (what they want) and the implementation details (how they did it, with code snippets, API calls, and specific configurations). On upgrade, it checks out clean upstream in a worktree, then reapplies customizations using the guide. No merge conflicts because there's nothing to merge.
The migration guide is markdown, not structured data. It needs to capture the full range of what a user might customize, with enough implementation detail that a fresh Claude session can reapply it without having seen the original code. Standard changes (config values, simple logic) can be described briefly. Non-standard changes (specific APIs, custom integrations, unusual patterns) need code snippets and precise instructions.
Two phases: Extract (build the migration guide) and Upgrade (use it). If a guide already exists, offer to skip to Upgrade.
groups/, store/, data/, .env) are never touched — only code.cd .upgrade-worktree — always use the full absolute path: cd /absolute/path/.upgrade-worktree && <command>. Store the worktree absolute path in a variable at creation time and reference it throughout.The migration process itself evolves, so run its newest version before doing anything else:
upstream remote exists (default https://github.com/nanocoai/nanoclaw.git) and fetch: git fetch upstream --prune. Detect the upstream branch (main or master).git checkout upstream/<branch> -- .claude/skills/migrate-nanoclaw/.claude/skills/migrate-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 below; changes limited to .claude/skills/migrate-nanoclaw/ are this self-refresh — ignore them in the 1.0 clean-tree check and proceed.
Run git status --porcelain. If non-empty, offer to stash or commit for them (AskUserQuestion: "Stash changes" / "Commit changes" / "I'll handle it"). If they want to commit, stage and commit with a descriptive message. If they want to stash, run git stash push -m "pre-migration stash".
Check remotes with git remote -v. If upstream is missing, ask for the URL (default: https://github.com/nanocoai/nanoclaw.git), add it, then git fetch upstream --prune.
Detect upstream branch: check git branch -r | grep upstream/ for main or master. Store as UPSTREAM_BRANCH.
Quickly assess the scale of divergence, check for an existing guide, and determine the right approach — all before asking the user anything.
BASE=$(git merge-base HEAD upstream/$UPSTREAM_BRANCH)
# Divergence stats
git rev-list --count $BASE..upstream/$UPSTREAM_BRANCH # upstream commits
git rev-list --count $BASE..HEAD # user commits
git diff --name-only $BASE..HEAD | wc -l # user changed files
git diff --stat $BASE..HEAD | tail -1 # insertions/deletions
git diff --name-only $BASE..upstream/$UPSTREAM_BRANCH | wc -l # upstream changed filesCheck for existing guide: .nanoclaw-migrations/guide.md or .nanoclaw-migrations/index.md.
Determine the tier based on the total diff from base:
/update-nanoclaw insteadConditions (any of):
Tell the user the scope is small and suggest /update-nanoclaw might be simpler. Let them choose.
Conditions:
Conditions (any of):
src/index.ts, src/container-runner.ts, etc.) beyond what skills introducedUse the full process: multiple sub-agents in parallel, directory-based guide, migration plan.
Now combine the scope assessment with initial user input in one interaction. Present the scope summary (how many commits, files, which tier) and ask (AskUserQuestion):
For Tier 1:
For Tier 2/3 (with or without existing guide):
Present the scope summary, gather the user's input, and resolve the existing-guide choice in this single interaction.
If the user chose to update an existing guide rather than re-extract:
Diff HEAD against
<guide-recorded-hash>. For each changed file, summarize what changed and why.
Spawn a haiku sub-agent (Agent tool, model: haiku) for initial exploration:
Explore this NanoClaw fork to identify all changes from the upstream base. Run these commands and report back:
git diff --name-only $BASE..HEAD— all changed filesgit log --oneline $BASE..HEAD— all commitsls .claude/skills/— installed skills, then for eachadd-*skill read itsSKILL.mdto learn which files it fetches/writes (e.g.src/channels/<name>.ts,import './<name>.js';in a barrel, pinned deps)Report: (a) list of installed
add-*skills and the files each one owns, (b) list of all changed files, (c) any custom skill directories under.claude/skills/not matching an upstreamadd-*skill.
From the sub-agent results, identify:
add-<name> skill owns — these are reapplied by re-running that skill's own apply in Phase 2Don't try to distinguish "user modified a skill-owned file" from "user made their own change" at this stage. The sub-agents in 1.4 will look at all non-skill changes together and surface what matters.
For each applied skill, ask the user in a single batched question (AskUserQuestion, multiSelect):
"I found these applied skills. Select any you customized further after applying:"
Options: one per skill, plus "None — all used as-is".
Then spawn sub-agents to analyze all non-skill changes. For Tier 2, one or two agents. For Tier 3, run in parallel by area:
src/*.ts) — one sub-agentorigin/<branch>, diff the working copy against that source:diff <(git show origin/<branch>:<path>) <path>Each sub-agent task:
Read these diffs and the current file contents. For each change:
git diff $BASE..HEAD -- <file>(ordiff <(git show origin/<branch>:<file>) <file>for skill-owned files)- Read the full current file for context
- Summarize: what changed, what the likely intent is
- Assess detail level: could a fresh Claude session reproduce this from intent alone, or does it need specific code snippets, API details, import paths?
- For non-standard changes, extract the key code, imports, API calls, and configurations verbatim.
Inter-skill conflicts: If multiple skills are applied, spawn an additional sub-agent to check for interactions between them. Look for:
Document any findings in the "Skill Interactions" section of the migration guide so they can be resolved after the skills are reapplied during upgrade.
After sub-agents report back, compile the findings and present to the user.
For customizations where the intent is clear (config values, simple modifications): present as a batch for confirmation. Use AskUserQuestion with multiSelect to let the user flag any entries that need correction.
For customizations where the intent is ambiguous: ask specific questions. Don't ask "what did you do?" — instead ask "I see you added X in this file. Was this for Y or something else?"
The user can select "Other" on any question to provide their own description.
For complex migrations, before writing the guide, create a migration plan:
Present the plan to the user for review before proceeding to the guide.
Storage: .nanoclaw-migrations/guide.md for Tier 2. .nanoclaw-migrations/ directory with index.md and section files for Tier 3.
Verification: After writing the guide, read it back and verify:
The guide is structured markdown that a fresh Claude session can follow to reproduce this user's exact setup on a clean upstream checkout.
Structure:
# NanoClaw Migration Guide
Generated: <timestamp>
Base: <BASE hash>
HEAD at generation: <HEAD hash>
Upstream: <upstream HEAD hash>
## Migration Plan
(Tier 3 only — big-picture overview of order, staging, risks)
## Applied Skills
List each installed skill by its slash-command name. Each is reapplied by re-running its own `/add-<name>` apply on the clean base — those skills fetch their files additively and pin their own deps, so re-running them is safe and reproducible.
- `add-telegram`
- `add-slack`
Custom skills (user-created, not from upstream): `.claude/skills/my-custom-skill/` — copy as-is from main tree.
## Skill Interactions
(Document known conflicts or interactions between applied skills.
When two or more skills modify the same file or depend on shared
config, describe the conflict and how to resolve it after reapplying.
Example: skill A and skill B both add a PROXY_BIND_HOST declaration —
after reapplying both, deduplicate. Or: skill A throws if ENV_VAR is
missing, but skill B provides a fallback — use the fallback version.)
## Modifications to Applied Skills
### <Skill name>: <what was modified>
**Intent:** ...
**Files:** ...
**How to apply:** (after the skill's `/add-<name>` apply has been re-run)
...
## Customizations
### <Descriptive title for customization>
**Intent:** What the user wants and why.
**Files:** Which files to modify.
**How to apply:**
<For standard changes, a brief description is enough.>
<For non-standard changes, include code snippets, API details,
specific values, import paths — everything needed to reproduce
without seeing the original diff.>
### <Next customization...>Judging detail level: For each customization, assess whether a fresh Claude session could reproduce it from intent alone:
POLL_INTERVAL in src/config.ts from 2000 to 1000."Example entries at different detail levels:
Standard (brief):
### Custom trigger word
**Intent:** Use `@Bob` instead of the default `@Andy`.
**Files:** `src/config.ts`
**How to apply:** Change the default value of `ASSISTANT_NAME` from `'Andy'` to `'Bob'`.Non-standard (detailed):
### Spanish translation for outbound messages
**Intent:** All outbound messages are translated to Spanish before sending. Uses the DeepL API via the `deepl-node` package.
**Files:** `src/router.ts`, `package.json`
**How to apply:**
1. Add dependency: `npm install deepl-node`
2. In `src/router.ts`, add import at top:
```typescript
import * as deepl from 'deepl-node';
const translator = new deepl.Translator(process.env.DEEPL_API_KEY!);formatOutbound function, before the return statement, add:const result = await translator.translateText(text, null, 'es');
text = result.text;
After writing, offer to commit for the user:
```bash
git add .nanoclaw-migrations/
git commit -m "chore: save migration guide"Ask (AskUserQuestion): "Migration guide saved. Want to upgrade now or later?"
Same checks as 1.0 — clean tree (offer to stash/commit if dirty), upstream configured, fetch latest.
Read the migration guide. If missing, tell the user you need to extract customizations first and ask if they want to do that now.
New-changes guard: Compare the guide's "HEAD at generation" hash against current HEAD. If there are commits since the guide was generated, warn the user:
"You've made changes since the migration guide was generated. These changes won't be included in the upgrade."
AskUserQuestion:
HASH=$(git rev-parse --short HEAD)
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
git branch backup/pre-migrate-$HASH-$TIMESTAMP
git tag pre-migrate-$HASH-$TIMESTAMPSave the tag name for rollback instructions at the end.
BASE=$(git merge-base HEAD upstream/$UPSTREAM_BRANCH)
git log --oneline $BASE..upstream/$UPSTREAM_BRANCH
git diff $BASE..upstream/$UPSTREAM_BRANCH -- CHANGELOG.mdIf there are [BREAKING] entries, show them and explain how they interact with the user's customizations from the migration guide.
Ask (AskUserQuestion) to proceed or abort.
PROJECT_ROOT=$(pwd)
git worktree add .upgrade-worktree upstream/$UPSTREAM_BRANCH --detach
WORKTREE="$PROJECT_ROOT/.upgrade-worktree"Store $PROJECT_ROOT and $WORKTREE as absolute paths. Use $WORKTREE in all subsequent commands — never cd .upgrade-worktree with a relative path.
The clean upstream base already carries every skill's SKILL.md under .claude/skills/. Reapply each installed skill by re-running its own apply against the worktree — each /add-<name> skill fetches its files additively (git fetch origin <branch> + git show origin/<branch>:path > path), pins its own dependencies, and is safe to re-run, so this reproduces the install on the new base without merging branches.
For each skill listed in the migration guide's "Applied Skills" section:
$WORKTREE/.claude/skills/<name>/SKILL.md.SKILL.md's apply steps with the worktree as the working tree — run its git fetch origin <branch>, write its files with git show origin/<branch>:path > $WORKTREE/path, append its import lines, and run its pinned pnpm install/bun install inside the worktree.Copy any custom skills mentioned in the guide from the main tree into the worktree.
Work in .upgrade-worktree/. Follow each customization section in the migration guide, including "Modifications to Applied Skills."
For Tier 3 migrations with a migration plan, follow the plan's ordering and staging. If the plan calls for staged validation (e.g. validate after skills, then validate after source changes), do so.
For each customization:
For behavior customizations (CLAUDE.md files): copy from the main tree. These are user content, not code.
cd "$WORKTREE" && pnpm install && pnpm run build && pnpm testIf build fails, show the error. Fix only issues caused by the migration. If unclear, ask the user.
Ask (AskUserQuestion):
If testing live:
Stop the service (do this directly). Service labels are per-install — derive them from setup/lib/install-slug.sh:
source setup/lib/install-slug.sh
# macOS (Darwin):
launchctl bootout gui/$(id -u)/$(launchd_label) 2>/dev/null || true
# Linux:
# systemctl --user stop $(systemd_unit) 2>/dev/null || trueSymlink data into the worktree:
ln -s "$PROJECT_ROOT/store" "$WORKTREE/store"
ln -s "$PROJECT_ROOT/data" "$WORKTREE/data"
ln -s "$PROJECT_ROOT/groups" "$WORKTREE/groups"
ln -s "$PROJECT_ROOT/.env" "$WORKTREE/.env"Start from worktree: cd "$WORKTREE" && pnpm run dev
Ask the user to send a test message from their phone. Wait for them to confirm it works.
After confirmation, stop the dev server.
Clean up symlinks:
rm "$WORKTREE/store" "$WORKTREE/data" "$WORKTREE/groups" "$WORKTREE/.env"The swap must be done carefully — the worktree has the upgraded code, but main needs to point to it cleanly. Use absolute paths throughout.
# 1. Capture the worktree HEAD before removing it
WORKTREE_PATH=$(cd "$PROJECT_ROOT/.upgrade-worktree" && pwd)
UPGRADE_COMMIT=$(git -C "$WORKTREE_PATH" rev-parse HEAD)
# 2. Copy the migration guide out of the worktree before removing it
cp -r "$WORKTREE_PATH/.nanoclaw-migrations" /tmp/nanoclaw-migrations-backup 2>/dev/null || true
# 3. Remove the worktree
git worktree remove "$WORKTREE_PATH" --force
# 4. Point the current branch at the upgraded commit
git reset --hard $UPGRADE_COMMIT
# 5. Restore the migration guide and update its hashes
cp -r /tmp/nanoclaw-migrations-backup/* .nanoclaw-migrations/ 2>/dev/null || true
rm -rf /tmp/nanoclaw-migrations-backupUpdate the guide's header hashes to reflect the new state. Offer to commit:
git add .nanoclaw-migrations/
git commit -m "chore: upgrade to upstream $(git rev-parse --short upstream/$UPSTREAM_BRANCH)"Point the branch at the upgraded state with git reset --hard <upgrade-commit> (step 4 above). The backup tag from 2.1 preserves the pre-upgrade state, so this is the cleanest path.
Run pnpm install && pnpm run build in the main tree to confirm.
Stamp the upgrade marker (required — without it the startup tripwire stops the host on next start). Only do this after the build above succeeds:
pnpm exec tsx scripts/upgrade-state.ts set "" migrate-nanoclawRestart the service. Service labels are per-install — derive them from setup/lib/install-slug.sh:
source setup/lib/install-slug.sh
# macOS (Darwin):
launchctl kickstart -k gui/$(id -u)/$(launchd_label)
# Linux:
# systemctl --user restart $(systemd_unit)Show summary:
git reset --hard <backup-tag>Offer to pop the stash if one was created in preflight: git stash pop
.claude/skills/migrate-nanoclaw/diagnostics.md.© nanocoai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/migrate-nanoclaw of nanocoai/nanoclaw.
Open the folder on GitHubat commit af699e7
Migrate Nanoclaw next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Migrate Nanoclaw this skillnanocoai/nanoclaw | 31k | — | ~6k | Automated safety check: Notes | MIT | |
| Migrate Core Code to Submodulestinyhumansai/openhuman | 42k | — | ~2.6k | Automated safety check: Pass | GPL-3.0 | |
| Migrate Internal Package into GhostTryGhost/Ghost | 56k | — | ~3.8k | Automated safety check: Pass | MIT | |
| ast-grep Structural Searchcode-yeongyu/oh-my-openagent | 70k | — | ~3.3k | Automated safety check: Pass | MIT | |
| Next Cache Components Adoptionvercel/next.js | 143k | 6 repos | ~8.3k | Automated safety check: Pass | MIT | |
| Deprecate R Functions and Argumentstidyverse/dplyr | 5.1k | 1 repos | ~1.2k | Automated safety check: Pass | Custom licence |
tinyhumansai/openhuman
Plans and carries out moving non-host-specific code and its tests from the OpenHuman core into vendored tiny submodule libraries, then releases the submodule and re-pins the host.
TryGhost/Ghost
Moves a package from another TryGhost repository into Ghost as an internal workspace package while keeping its Git history, with checkpoints for the steps that need an administrator.
code-yeongyu/oh-my-openagent
Searches and rewrites code by syntax-tree shape across 25 languages with ast-grep, for codemods, structural queries and YAML lint rules, using a Python wrapper script.
vercel/next.js
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces.
tidyverse/dplyr
Walks through deprecating an R function or argument in a package: lifecycle warning, silenced tests, a new snapshot test, documentation badge and NEWS entry.
openinterpreter/openinterpreter
Rules for choosing Rust types for filesystem paths in new Codex code, covering protocol types, internal use and model tool arguments.
nanocoai/nanoclaw
Installs or refreshes Iron Proxy and its Iron Control web console for NanoClaw, with a local Docker setup, database, credentials and a human approval bridge.
nanocoai/nanoclaw
Installs or refreshes OneCLI as the gateway provider for NanoClaw, copying the adapter files, registering the provider and running the setup script.
nanocoai/nanoclaw
Drives a web browser from the shell with the agent-browser CLI: open pages, read an element snapshot, click and fill by reference, grab text and screenshots.
nanocoai/nanoclaw
Installs the `dial` CLI and a credential in NanoClaw agent containers so chosen agents can send SMS, place AI voice calls and receive verification codes.
nanocoai/nanoclaw
Guides a conversational migration from an OpenClaw install to NanoClaw v2, carrying over identity, channel credentials, scheduled tasks and workspace files.
nanocoai/nanoclaw
Wires up an additional phone number onto an already-installed Dial channel, so one NanoClaw install answers SMS and AI voice calls on more than one line.
Categories
Extracts user customizations from a fork, generates a replayable migration guide, and upgrades to upstream by reapplying customizations on a clean base. Migrate Nanoclaw is an agent skill from nanocoai/nanoclaw. Extracts user customizations from a fork, generates a replayable migration guide, and upgrades to upstream by reapplying customizations on a clean base.
Migrate Nanoclaw fits situations like: tasks that involve Code migrations.
Run `npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a claude-code`. Or copy the skill folder (.claude/skills/migrate-nanoclaw in nanocoai/nanoclaw) into .claude/skills/migrate-nanoclaw in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a codex`. Or copy the skill folder (.claude/skills/migrate-nanoclaw in nanocoai/nanoclaw) into .agents/skills/migrate-nanoclaw in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nanocoai/nanoclaw --skill migrate-nanoclaw -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/migrate-nanoclaw, .gemini/skills/migrate-nanoclaw, .github/skills/migrate-nanoclaw and .opencode/skills/migrate-nanoclaw in your project.
Going by SKILL.md and its folder, Migrate Nanoclaw needs the command-line tools its instructions call (git, pnpm and bun) and credentials named DEEPL_API_KEY.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Migrate Nanoclaw is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Migrate Nanoclaw: Migrate Core Code to Submodules (tinyhumansai/openhuman, 42k stars), Migrate Internal Package into Ghost (TryGhost/Ghost, 56k stars), ast-grep Structural Search (code-yeongyu/oh-my-openagent, 70k stars) and Next Cache Components Adoption (vercel/next.js, 143k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nanocoai (a GitHub organization) maintains it in nanocoai/nanoclaw, which has 30,906 GitHub stars. The repository holds 59 skills in this directory. The repository was last updated on October 9, 2026.
Source: nanocoai/nanoclaw on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.