feat: rename nanoclaw → omniclaw - #147
Conversation
Rename all identifiers, paths, env vars, container image, launchd service, MCP server name, docs, skills, and templates from nanoclaw to omniclaw. Backwards-compat fallback kept for env vars in auto-update.sh. Migration guide added at docs/MIGRATING-TO-OMNICLAW.md. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
Caution Review failedAn error occurred during the review process. Please try again later. 📝 WalkthroughWalkthroughThis PR performs a broad rename of NanoClaw → OmniClaw across the repository, updating docs, scripts, environment variables, container/image names, public type/class names (S3), IPC markers, and some setup/runtime messaging; a few runtime flows gain minor resiliency (WhatsApp retry/connect handling). Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/channels/whatsapp.ts (1)
98-110:⚠️ Potential issue | 🟠 MajorAvoid embedding project-specific branding in checked-in source.
These lines hardcode “OmniClaw” in a comment and OS notification title. The repo guideline forbids adding project/user-specific content to checked-in files; please revert or replace with a generic label/config-driven value.
As per coding guidelines: “Never edit templates or checked-in files with user-specific content like project names, directory paths, personal preferences, or org-specific details”.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/channels/whatsapp.ts` around lines 98 - 110, The code hardcodes the project name "OmniClaw" in the comment and in the OS notification title within the connectionHandler lambda (the qr handling block that sets msg and calls osascript display notification); replace the literal with a generic label or a configurable constant (e.g., APP_NAME or NOTIFICATION_TITLE) and update the comment to be neutral, ensuring the notification string is constructed from that constant rather than embedding project-specific text; also remove or neutralize the project-specific comment above shouldSyncHistoryMessage to avoid checked-in branding.
🧹 Nitpick comments (4)
.claude/skills/x-integration/lib/config.ts (1)
11-11: Consider adding backwards-compatible fallback forNANOCLAW_ROOTto match the pattern inauto-update.sh.The
auto-update.shscript maintains backwards compatibility for legacyNANOCLAW_*variables (e.g.,NANOCLAW_BRANCH). For consistency, consider adding a fallback here:-const PROJECT_ROOT = process.env.OMNICLAW_ROOT || process.cwd(); +const PROJECT_ROOT = process.env.OMNICLAW_ROOT || process.env.NANOCLAW_ROOT || process.cwd();This ensures that any existing deployments or configurations using the legacy name will continue to work.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/skills/x-integration/lib/config.ts at line 11, PROJECT_ROOT currently reads process.env.OMNICLAW_ROOT or process.cwd(); add a backwards-compatible fallback to also check process.env.NANOCLAW_ROOT so legacy NANOCLAW_* envs work. Update the PROJECT_ROOT constant in config.ts to prefer OMNICLAW_ROOT, then fall back to NANOCLAW_ROOT, then to process.cwd(), and keep the same export/name (PROJECT_ROOT) so callers are unaffected.src/container-runner.test.ts (1)
6-8: Prefer reusing shared output marker constants to avoid drift.♻️ Proposed refactor
import { describe, it, expect, beforeEach, afterEach, mock, jest } from 'bun:test'; import { mock as mockModule } from 'bun:test'; import { EventEmitter } from 'events'; import { PassThrough } from 'stream'; +import { OUTPUT_START_MARKER, OUTPUT_END_MARKER } from './backends/stream-parser.js'; // Sentinel markers must match container-runner.ts -const OUTPUT_START_MARKER = '---OMNICLAW_OUTPUT_START---'; -const OUTPUT_END_MARKER = '---OMNICLAW_OUTPUT_END---';🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/container-runner.test.ts` around lines 6 - 8, The test defines local OUTPUT_START_MARKER and OUTPUT_END_MARKER that duplicate the canonical markers in container-runner; change the test to import/reuse the shared constants (OUTPUT_START_MARKER, OUTPUT_END_MARKER) from the module that declares them instead of redefining them locally so the sentinel values stay in sync; update any references in src/container-runner.test.ts to use the imported symbols..claude/skills/debug/SKILL.md (1)
197-197: Consider adding language identifier to fenced code block.The fenced code block at line 197 is missing a language specifier. Adding
bashwould improve syntax highlighting and markdown linting compliance.📝 Suggested improvement
-``` +```bash container run --rm -it --entrypoint /bin/bash omniclaw-agent:latest</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In @.claude/skills/debug/SKILL.md at line 197, The fenced code block containing
the command snippet that starts with "omniclaw-agent:latest -c '" should include
a language identifier for proper syntax highlighting; update the opening fence
fromtobash and ensure the block is properly closed with ``` so the
shell command is highlighted as bash.</details> </blockquote></details> <details> <summary>docs/MIGRATING-TO-OMNICLAW.md (1)</summary><blockquote> `9-11`: **Add a language specifier to the fenced code block.** Static analysis flagged a missing language specifier. Since this is a Claude Code slash command, consider using `text` or `plaintext` as the language identifier. ```diff -``` +```text /setup migrate me from nanoclaw to omniclaw — see `@docs/MIGRATING-TO-OMNICLAW.md` ``` ``` <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@docs/MIGRATING-TO-OMNICLAW.mdaround lines 9 - 11, The fenced code block
containing the command "/setup migrate me from nanoclaw to omniclaw — see
@docs/MIGRATING-TO-OMNICLAW.md" is missing a language specifier; update that
backtick block to include a language identifier (e.g., use "text" or
"plaintext") so the block becomestext ...to satisfy static analysis.</details> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/skills/github/SKILL.md:
- Around line 155-167: The snippet hard-codes the org/repo "omniaura/omniclaw"
in the example commands (gh-discussion-create and gh-discussion-comment); change
those occurrences to a generic placeholder like "/" (or a variable
name such as OWNER_REPO) and update the example arguments (e.g., discussion ID)
to non-org-specific placeholders so the SKILL.md template is reusable; locate
the two commands referencing omniaura/omniclaw and replace them with the
placeholder, and adjust the comment example "15" to e.g. "<discussion_id>" if
applicable.In
@container/agent-runner/package.json:
- Around line 2-5: The package.json currently hardcodes project-specific
branding via the "name": "omniclaw-agent-runner" and "description":
"Container-side agent runner for OmniClaw"; update these fields to neutral,
template-friendly values (e.g., a generic package name like "agent-runner" or a
placeholder "{{PACKAGE_NAME}}", and a generic description like "Container-side
agent runner" or "{{PACKAGE_DESCRIPTION}}") so checked-in metadata contains no
org/user-specific identifiers; ensure only the "name" and "description" fields
are changed and leave "version" and "type" intact for publish-time branding or
documented overrides.In
@container/AUTO_UPDATE.md:
- Around line 16-19: Replace all hardcoded project-specific names and paths in
container/AUTO_UPDATE.md (e.g., "/path/to/omniclaw", "omniclaw-update.log",
"omniclaw" service) with generic placeholders or variables (like {PROJECT_ROOT},
{UPDATE_LOG}, {SERVICE_NAME}) and update every occurrence consistently
(including ranges noted: 33-39, 45-79, 85-88, 140-174, 186-189); ensure example
commands and filenames use placeholders and document their meaning at the top of
the file so scripts and references (auto-update.sh, update log names, service
identifiers) remain template-safe and editable per-repo.In
@docs/SPEC.md:
- Around line 607-608: The markdown table row contains an unescaped pipe in the
command "launchctl list | grep omniclaw" which splits the row into four columns;
fix the table by escaping the pipe (replace "|" with "|") or rewording the
solution text to avoid the pipe (e.g., "Run launchctl list and grep omniclaw" or
similar) so the table remains three columns—update the row containing "No
response to messages" / "Service not running" / the solution text accordingly.In
@scripts/upstream-tracker.sh:
- Line 9: Replace the hardcoded FORK_REPO assignment with a required
environment/config value and fail fast if missing: remove the literal
FORK_REPO="omniaura/omniclaw" and instead ensure the script reads FORK_REPO from
the environment (e.g., use shell parameter expansion to require it) so any
attempt to run the script without FORK_REPO set exits with an error; keep all
uses of ${FORK_REPO} (e.g., the reference at line using ${FORK_REPO}) unchanged.In
@src/config.ts:
- Around line 22-27: Replace the single constant MOUNT_ALLOWLIST_PATH with logic
that checks for the new path first and falls back to the legacy path;
specifically, compute newPath = path.join(HOME_DIR, '.config', 'omniclaw',
'mount-allowlist.json') and legacyPath = path.join(HOME_DIR, '.config',
'nanoclaw', 'mount-allowlist.json'), use fs.existsSync (or fs.promises.access)
to pick newPath if it exists, else legacyPath if it exists, else keep newPath as
the default; update the exported symbol MOUNT_ALLOWLIST_PATH (or provide a
getter function) and, when a legacy file is chosen, emit a warning via the
existing logger so behavior is backward-compatible and users are informed.
Outside diff comments:
In@src/channels/whatsapp.ts:
- Around line 98-110: The code hardcodes the project name "OmniClaw" in the
comment and in the OS notification title within the connectionHandler lambda
(the qr handling block that sets msg and calls osascript display notification);
replace the literal with a generic label or a configurable constant (e.g.,
APP_NAME or NOTIFICATION_TITLE) and update the comment to be neutral, ensuring
the notification string is constructed from that constant rather than embedding
project-specific text; also remove or neutralize the project-specific comment
above shouldSyncHistoryMessage to avoid checked-in branding.
Duplicate comments:
In @.claude/skills/slack/package.json:
- Line 2: The package name "omniclaw-slack-skill" hardcodes org/project branding
in checked-in package.json; update the "name" value to a neutral or templated
identifier (for example "slack-skill" or a placeholder like "{{packageName}}")
so the file contains no org-specific content—edit the "name" field in
package.json accordingly and keep the rest of the file unchanged.In @.claude/skills/slack/SKILL.md:
- Line 12: The checked-in skill doc contains hardcoded org-specific branding
(e.g., the phrase "Standalone TypeScript implementation (no OmniClaw core
modifications needed)" and other occurrences of "OmniClaw") which must be
replaced with generic placeholders; update all instances of "OmniClaw" and any
project-specific phrases in SKILL.md to neutral wording like "{{PROJECT_NAME}}",
"project core", or "core framework" (and ensure the same generic wording is used
in the other flagged occurrences), keeping the document template reusable and
free of organisation-specific names.In @.claude/skills/slack/slack.ts:
- Line 3: Replace the hardcoded "OmniClaw" branding in the top-of-file header
comment with a neutral, template-friendly phrase (e.g., "Slack integration" or a
placeholder like "<PROJECT_NAME> Slack Integration") so the checked-in source
header remains generic; update the file-level comment at the top of
.claude/skills/slack/slack.ts (the header comment that currently reads "Slack
Integration for OmniClaw") to the neutral wording and ensure any other
occurrences of the project name in that header are removed or replaced
consistently.In @.claude/skills/x-integration/SKILL.md:
- Line 3: The SKILL.md description contains project/org-specific branding
("OmniClaw") and hardcoded paths; update the description field and all other
occurrences (the "description:" line and the other referenced entries at lines
noted in the review) to use generic placeholders (e.g., {{PROJECT_NAME}},
{{ORG_NAME}}, {{REPO_PATH}}) or neutral wording, remove any direct
project-specific directory or personal references, and ensure the skill remains
generic and reusable across the file (search for "OmniClaw", repo/path strings,
and other org-specific tokens and replace them with placeholders or neutral
text).In
@CLAUDE.md:
- Line 1: Replace all project/org-specific identifiers introduced in CLAUDE.md
(e.g., the header text "OmniClaw" and any repo/org/path mentions) with neutral
placeholders (e.g., <PROJECT_NAME>, , <REPO_PATH>) and remove any user- or
org-specific directory paths; ensure occurrences of "OmniClaw" and any explicit
repo/org references are reverted to the template-neutral wording throughout the
file so the checked-in document remains generic for forks and templates.In
@launchd/com.omniclaw.plist:
- Line 6: The plist contains hard-coded, organization-specific identifiers (the
service Label value "com.omniclaw" and related log path entries around the same
block) and should be reverted to neutral placeholders; update the value
used for the LaunchDaemons Label (currently "com.omniclaw") and any embedded log
paths on lines referenced 28–30 to generic placeholders (e.g., SERVICE_LABEL,
LOG_PATH or com.example.service) so the checked-in template contains no
project/org-specific content, and ensure any documentation or comments indicate
how to substitute real values during deployment.In
@README_zh.md:
- Line 2: The README contains hardcoded org/project branding in the image tag
(<img ... alt="OmniClaw">) and other org-specific mentions; replace the
hardcodedelement and any literal "OmniClaw" mentions with a neutral
placeholder (e.g. a generic placeholder image or {{PROJECT_NAME}} and a generic
alt text) or remove the branded image, and update the other occurrences of
org-specific text in this README to use placeholders so the file remains
template-friendly.
Nitpick comments:
In @.claude/skills/debug/SKILL.md:
- Line 197: The fenced code block containing the command snippet that starts
with "omniclaw-agent:latest -c '" should include a language identifier for
proper syntax highlighting; update the opening fence fromtobash and
ensure the block is properly closed with ``` so the shell command is highlighted
as bash.In @.claude/skills/x-integration/lib/config.ts:
- Line 11: PROJECT_ROOT currently reads process.env.OMNICLAW_ROOT or
process.cwd(); add a backwards-compatible fallback to also check
process.env.NANOCLAW_ROOT so legacy NANOCLAW_* envs work. Update the
PROJECT_ROOT constant in config.ts to prefer OMNICLAW_ROOT, then fall back to
NANOCLAW_ROOT, then to process.cwd(), and keep the same export/name
(PROJECT_ROOT) so callers are unaffected.In
@docs/MIGRATING-TO-OMNICLAW.md:
- Around line 9-11: The fenced code block containing the command "/setup migrate
me from nanoclaw to omniclaw — see@docs/MIGRATING-TO-OMNICLAW.md" is missing a
language specifier; update that backtick block to include a language identifier
(e.g., use "text" or "plaintext") so the block becomestext ...to
satisfy static analysis.In
@src/container-runner.test.ts:
- Around line 6-8: The test defines local OUTPUT_START_MARKER and
OUTPUT_END_MARKER that duplicate the canonical markers in container-runner;
change the test to import/reuse the shared constants (OUTPUT_START_MARKER,
OUTPUT_END_MARKER) from the module that declares them instead of redefining them
locally so the sentinel values stay in sync; update any references in
src/container-runner.test.ts to use the imported symbols.</details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
| ```bash | ||
| # Agent 1 creates discussion with findings | ||
| gh-discussion-create omniaura/nanoclaw "Q&A" \ | ||
| gh-discussion-create omniaura/omniclaw "Q&A" \ | ||
| "Cloud-Local Communication Strategy" "Researched Sprites ↔ Apple Container communication patterns..." | ||
|
|
||
| # Agent 2 adds insights to same discussion | ||
| gh-discussion-comment omniaura/nanoclaw 15 \ | ||
| gh-discussion-comment omniaura/omniclaw 15 \ | ||
| "Found IPC file-based messaging system in src/ipc/. This could be extended for cloud-local comms." | ||
| ``` | ||
|
|
||
| ## Architecture | ||
|
|
||
| - ✅ **No NanoClaw core modifications** - Standalone bash scripts | ||
| - ✅ **No OmniClaw core modifications** - Standalone bash scripts |
There was a problem hiding this comment.
Avoid hard-coded org-specific repo names in skill templates.
Use placeholders (e.g., <owner>/<repo>) so the skill stays generic and reusable.
🔧 Example adjustment
-gh-discussion-create omniaura/omniclaw "Q&A" \
+gh-discussion-create <owner>/<repo> "Q&A" \
"Cloud-Local Communication Strategy" "Researched Sprites ↔ Apple Container communication patterns..."
-gh-discussion-comment omniaura/omniclaw 15 \
- "Found IPC file-based messaging system in src/ipc/. This could be extended for cloud-local comms."
+gh-discussion-comment <owner>/<repo> <discussion-number> \
+ "Found IPC file-based messaging system in src/ipc/. This could be extended for cloud-local comms."As per coding guidelines: "Never edit templates or checked-in files with user-specific content like project names, directory paths, personal preferences, or org-specific details".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/github/SKILL.md around lines 155 - 167, The snippet
hard-codes the org/repo "omniaura/omniclaw" in the example commands
(gh-discussion-create and gh-discussion-comment); change those occurrences to a
generic placeholder like "<owner>/<repo>" (or a variable name such as
OWNER_REPO) and update the example arguments (e.g., discussion ID) to
non-org-specific placeholders so the SKILL.md template is reusable; locate the
two commands referencing omniaura/omniclaw and replace them with the
placeholder, and adjust the comment example "15" to e.g. "<discussion_id>" if
applicable.
| "name": "omniclaw-agent-runner", | ||
| "version": "1.0.0", | ||
| "type": "module", | ||
| "description": "Container-side agent runner for NanoClaw", | ||
| "description": "Container-side agent runner for OmniClaw", |
There was a problem hiding this comment.
Avoid project/org-specific branding in checked‑in package metadata.
Renaming the package and description to OmniClaw hardcodes project-specific identifiers in a checked-in file. If this repo is intended as a reusable template/fork base, keep neutral names or placeholders and apply branding at publish time (or document an explicit exception). As per coding guidelines: “Never edit templates or checked-in files with user-specific content like project names, directory paths, personal preferences, or org-specific details.”
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@container/agent-runner/package.json` around lines 2 - 5, The package.json
currently hardcodes project-specific branding via the "name":
"omniclaw-agent-runner" and "description": "Container-side agent runner for
OmniClaw"; update these fields to neutral, template-friendly values (e.g., a
generic package name like "agent-runner" or a placeholder "{{PACKAGE_NAME}}",
and a generic description like "Container-side agent runner" or
"{{PACKAGE_DESCRIPTION}}") so checked-in metadata contains no org/user-specific
identifiers; ensure only the "name" and "description" fields are changed and
leave "version" and "type" intact for publish-time branding or documented
overrides.
| ```bash | ||
| cd /path/to/nanoclaw | ||
| cd /path/to/omniclaw | ||
| ./container/auto-update.sh | ||
| ``` |
There was a problem hiding this comment.
Avoid hardcoded project names/paths in checked-in docs; use placeholders.
This file hardcodes project-specific names, directory paths, and service identifiers (e.g., /path/to/omniclaw, omniclaw-update.log, omniclaw service). The repo guideline forbids editing checked-in templates/docs with user-specific content. Please replace these with placeholders or variables and apply consistently throughout the file.
As per coding guidelines: "Never edit templates or checked-in files with user-specific content like project names, directory paths, personal preferences, or org-specific details."
📝 Example placeholder-based edits
-cd /path/to/omniclaw
+cd /path/to/<project>
-0 */6 * * * /path/to/omniclaw/container/auto-update.sh >> /var/log/omniclaw-update.log 2>&1
+0 */6 * * * /path/to/<project>/container/auto-update.sh >> /var/log/<project>-update.log 2>&1
-# /etc/systemd/system/omniclaw-update.timer
+# /etc/systemd/system/<project>-update.timer
-Description=OmniClaw Auto-Update Service
+Description=<Project> Auto-Update Service
-ExecStart=/path/to/omniclaw/container/auto-update.sh
+ExecStart=/path/to/<project>/container/auto-update.sh
-sudo systemctl enable omniclaw-update.timer
+sudo systemctl enable <project>-update.timerAlso applies to: 33-39, 45-79, 85-88, 140-174, 186-189
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@container/AUTO_UPDATE.md` around lines 16 - 19, Replace all hardcoded
project-specific names and paths in container/AUTO_UPDATE.md (e.g.,
"/path/to/omniclaw", "omniclaw-update.log", "omniclaw" service) with generic
placeholders or variables (like {PROJECT_ROOT}, {UPDATE_LOG}, {SERVICE_NAME})
and update every occurrence consistently (including ranges noted: 33-39, 45-79,
85-88, 140-174, 186-189); ensure example commands and filenames use placeholders
and document their meaning at the top of the file so scripts and references
(auto-update.sh, update log names, service identifiers) remain template-safe and
editable per-repo.
| | No response to messages | Service not running | Check `launchctl list | grep omniclaw` | | ||
| | "Claude Code process exited with code 1" | Apple Container failed to start | Check logs; OmniClaw auto-starts container system but may fail | |
There was a problem hiding this comment.
Fix markdown table column count issue.
The pipe character in the command launchctl list | grep omniclaw is being interpreted as a table column separator, causing the table to have 4 columns instead of 3. This will cause the "Solution" column content to be truncated or malformed in rendered markdown.
📝 Proposed fix to escape the pipe
-| No response to messages | Service not running | Check `launchctl list | grep omniclaw` |
+| No response to messages | Service not running | Check `launchctl list \| grep omniclaw` |Alternatively, reword to avoid the pipe:
-| No response to messages | Service not running | Check `launchctl list | grep omniclaw` |
+| No response to messages | Service not running | Run `launchctl list` and grep for `omniclaw` |📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| | No response to messages | Service not running | Check `launchctl list | grep omniclaw` | | |
| | "Claude Code process exited with code 1" | Apple Container failed to start | Check logs; OmniClaw auto-starts container system but may fail | | |
| | No response to messages | Service not running | Check `launchctl list \| grep omniclaw` | | |
| | "Claude Code process exited with code 1" | Apple Container failed to start | Check logs; OmniClaw auto-starts container system but may fail | |
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 607-607: Table column count
Expected: 3; Actual: 4; Too many cells, extra data will be missing
(MD056, table-column-count)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@docs/SPEC.md` around lines 607 - 608, The markdown table row contains an
unescaped pipe in the command "launchctl list | grep omniclaw" which splits the
row into four columns; fix the table by escaping the pipe (replace "|" with
"\|") or rewording the solution text to avoid the pipe (e.g., "Run launchctl
list and grep omniclaw" or similar) so the table remains three columns—update
the row containing "No response to messages" / "Service not running" / the
solution text accordingly.
| NANOCLAW_REPO="qwibitai/nanoclaw" | ||
| MICROCLAW_REPO="cosmin/microclaw" | ||
| FORK_REPO="omniaura/nanoclaw" | ||
| FORK_REPO="omniaura/omniclaw" |
There was a problem hiding this comment.
Avoid hardcoding a fork repo in a checked-in script.
Line 9 embeds an org-specific repo, which violates the repo guideline. Please require an env/config value instead and fail fast if it isn’t set; Line 31 can then keep using ${FORK_REPO}.
✅ Suggested change
-FORK_REPO="omniaura/omniclaw"
+: "${FORK_REPO:?Set FORK_REPO to your fork in org/repo format}"As per coding guidelines, "Never edit templates or checked-in files with user-specific content like project names, directory paths, personal preferences, or org-specific details".
Also applies to: 31-31
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@scripts/upstream-tracker.sh` at line 9, Replace the hardcoded FORK_REPO
assignment with a required environment/config value and fail fast if missing:
remove the literal FORK_REPO="omniaura/omniclaw" and instead ensure the script
reads FORK_REPO from the environment (e.g., use shell parameter expansion to
require it) so any attempt to run the script without FORK_REPO set exits with an
error; keep all uses of ${FORK_REPO} (e.g., the reference at line using
${FORK_REPO}) unchanged.
| export const MOUNT_ALLOWLIST_PATH = path.join( | ||
| HOME_DIR, | ||
| '.config', | ||
| 'nanoclaw', | ||
| 'omniclaw', | ||
| 'mount-allowlist.json', | ||
| ); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Search for MOUNT_ALLOWLIST_PATH usage
rg -n "MOUNT_ALLOWLIST_PATH" -C3Repository: omniaura/nanoclaw
Length of output: 2913
🏁 Script executed:
# Search for mount-allowlist file references
rg -n "mount-allowlist" -C3Repository: omniaura/nanoclaw
Length of output: 2667
🏁 Script executed:
# Check if there's any migration or fallback logic
rg -n "nanoclaw" -C3Repository: omniaura/nanoclaw
Length of output: 8754
🏁 Script executed:
# Check the current state of src/config.ts
cat -n src/config.tsRepository: omniaura/nanoclaw
Length of output: 5467
Add a legacy-path fallback for the mount allowlist to support seamless migration.
The code currently only checks the new path (~/.config/omniclaw/mount-allowlist.json) without falling back to the legacy path (~/.config/nanoclaw/mount-allowlist.json). While migration documentation exists in docs/MIGRATING-TO-OMNICLAW.md and the code logs a warning when the file is missing, users who skip the migration guide will silently lose mount functionality. A code-level fallback would provide automatic backward compatibility without requiring manual file migration.
🛠️ Suggested implementation
-import path from 'path';
+import fs from 'fs';
+import path from 'path';
-export const MOUNT_ALLOWLIST_PATH = path.join(
- HOME_DIR,
- '.config',
- 'omniclaw',
- 'mount-allowlist.json',
-);
+const NEW_MOUNT_ALLOWLIST_PATH = path.join(
+ HOME_DIR,
+ '.config',
+ 'omniclaw',
+ 'mount-allowlist.json',
+);
+const LEGACY_MOUNT_ALLOWLIST_PATH = path.join(
+ HOME_DIR,
+ '.config',
+ 'nanoclaw',
+ 'mount-allowlist.json',
+);
+export const MOUNT_ALLOWLIST_PATH =
+ fs.existsSync(NEW_MOUNT_ALLOWLIST_PATH)
+ ? NEW_MOUNT_ALLOWLIST_PATH
+ : fs.existsSync(LEGACY_MOUNT_ALLOWLIST_PATH)
+ ? LEGACY_MOUNT_ALLOWLIST_PATH
+ : NEW_MOUNT_ALLOWLIST_PATH;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| export const MOUNT_ALLOWLIST_PATH = path.join( | |
| HOME_DIR, | |
| '.config', | |
| 'nanoclaw', | |
| 'omniclaw', | |
| 'mount-allowlist.json', | |
| ); | |
| import fs from 'fs'; | |
| import path from 'path'; | |
| const NEW_MOUNT_ALLOWLIST_PATH = path.join( | |
| HOME_DIR, | |
| '.config', | |
| 'omniclaw', | |
| 'mount-allowlist.json', | |
| ); | |
| const LEGACY_MOUNT_ALLOWLIST_PATH = path.join( | |
| HOME_DIR, | |
| '.config', | |
| 'nanoclaw', | |
| 'mount-allowlist.json', | |
| ); | |
| export const MOUNT_ALLOWLIST_PATH = | |
| fs.existsSync(NEW_MOUNT_ALLOWLIST_PATH) | |
| ? NEW_MOUNT_ALLOWLIST_PATH | |
| : fs.existsSync(LEGACY_MOUNT_ALLOWLIST_PATH) | |
| ? LEGACY_MOUNT_ALLOWLIST_PATH | |
| : NEW_MOUNT_ALLOWLIST_PATH; |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/config.ts` around lines 22 - 27, Replace the single constant
MOUNT_ALLOWLIST_PATH with logic that checks for the new path first and falls
back to the legacy path; specifically, compute newPath = path.join(HOME_DIR,
'.config', 'omniclaw', 'mount-allowlist.json') and legacyPath =
path.join(HOME_DIR, '.config', 'nanoclaw', 'mount-allowlist.json'), use
fs.existsSync (or fs.promises.access) to pick newPath if it exists, else
legacyPath if it exists, else keep newPath as the default; update the exported
symbol MOUNT_ALLOWLIST_PATH (or provide a getter function) and, when a legacy
file is chosen, emit a warning via the existing logger so behavior is
backward-compatible and users are informed.
…ate limits - Wrap connectWhatsApp in Effect.catchAll (matching Discord/Telegram pattern) - Use Effect.tryPromise instead of Effect.promise so rejections hit error channel - Replace process.exit() calls in WhatsApp channel with promise rejections - Add background retry scheduler with linear backoff (1m-5m, 30 retries) - Guard whatsapp references for null throughout index.ts - Fix container uid 501 crash: dynamic /etc/passwd entry in entrypoint Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
nanoclawtoomniclawacross 99 filesauto-update.sh(NANOCLAW_BRANCHstill works)docs/MIGRATING-TO-OMNICLAW.mdwith both context-preserving (sed) and fresh-start (delete) options for runtime CLAUDE.md filesqwibitai/nanoclawreferences preserved in sync workflow)repo-tokens/URLsCloses #122
What Changed
NANOCLAW_OUTPUT_START/ENDOMNICLAW_OUTPUT_START/ENDnanoclaw-agent:latestomniclaw-agent:latestmcp__nanoclaw__*mcp__omniclaw__*NANOCLAW_*env varsOMNICLAW_*env varscom.nanoclawlaunchdcom.omniclawlaunchd~/.config/nanoclaw/~/.config/omniclaw/NanoClawS3OmniClawS3Test plan
bun run buildsucceedsbun test src/— 113 pass, 3 skip, 0 fail./container/build.sh) — requires Mac restart to fix Apple Container system🤖 Generated with Claude Code
Summary by CodeRabbit
Chores
New Features
Documentation