Skip to content
This repository was archived by the owner on Feb 21, 2026. It is now read-only.

feat: rename nanoclaw → omniclaw - #147

Merged
Peyton-Spencer merged 2 commits into
mainfrom
rename/nanoclaw-to-omniclaw
Feb 20, 2026
Merged

feat: rename nanoclaw → omniclaw#147
Peyton-Spencer merged 2 commits into
mainfrom
rename/nanoclaw-to-omniclaw

Conversation

@Peyton-Spencer

@Peyton-Spencer Peyton-Spencer commented Feb 20, 2026

Copy link
Copy Markdown

Summary

  • Rename all identifiers, paths, env vars, container image, launchd service, MCP server name, docs, skills, and templates from nanoclaw to omniclaw across 99 files
  • Keep backwards-compat fallback for env vars in auto-update.sh (NANOCLAW_BRANCH still works)
  • Add migration guide at docs/MIGRATING-TO-OMNICLAW.md with both context-preserving (sed) and fresh-start (delete) options for runtime CLAUDE.md files
  • Upstream monitoring kept intact (qwibitai/nanoclaw references preserved in sync workflow)
  • Detach fork relationship: simplify CLAUDE.md git remotes section, update repo-tokens/ URLs

Closes #122

What Changed

Before After
NANOCLAW_OUTPUT_START/END OMNICLAW_OUTPUT_START/END
nanoclaw-agent:latest omniclaw-agent:latest
mcp__nanoclaw__* mcp__omniclaw__*
NANOCLAW_* env vars OMNICLAW_* env vars
com.nanoclaw launchd com.omniclaw launchd
~/.config/nanoclaw/ ~/.config/omniclaw/
NanoClawS3 OmniClawS3

Test plan

  • bun run build succeeds
  • bun test src/ — 113 pass, 3 skip, 0 fail
  • Container rebuild (./container/build.sh) — requires Mac restart to fix Apple Container system
  • Verify agent output with new IPC markers
  • GitHub repo rename (manual, Phase 8)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores

    • Branding renamed from NanoClaw → OmniClaw across docs, messages, service names, env vars, config paths and logs
    • Default container image and references updated to omniclaw-agent:latest
    • Updated setup and service scripts and migration guidance for existing installs
  • New Features

    • More resilient WhatsApp connection with retry and graceful failure handling
    • Container startup improved to handle missing host user entries and permission cases
  • Documentation

    • Detailed migration guide and updated quick-start docs

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>
@coderabbitai

coderabbitai Bot commented Feb 20, 2026

Copy link
Copy Markdown

Caution

Review failed

An error occurred during the review process. Please try again later.

📝 Walkthrough

Walkthrough

This 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

Cohort / File(s) Summary
Skill docs & examples
.claude/skills/*/SKILL.md, .claude/skills/*/*.md (add-gmail, add-graphite, add-parallel, add-telegram*, add-voice-transcription, convert-to-docker, customize, debug, github, slack, x-integration, etc.)
Comprehensive textual rebrand from NanoClaw → OmniClaw in documentation, examples, prompts, config snippets, and skill guides.
Setup scripts & assets
.claude/skills/setup/scripts/*, .claude/skills/setup/qr-auth.html, launchd/com.omniclaw.plist, Justfile
Updated setup banners, config paths (~/.config/*), launchd/systemd plist names, log paths, and standardized error/LOG output fields; no control-flow changes except message formatting.
Container tooling & runtime scripts
container/Dockerfile, container/build.sh, container/entrypoint.sh, container/auto-update.sh, container/AUTO_UPDATE.md, container/agent-runner/package.json, container/auto-update.sh
Renamed images (nanoclaw-agent → omniclaw-agent), adjusted Dockerfile permissions, added passwd fallback in entrypoint, switched env vars to OMNICLAW_* with legacy fallbacks, and introduced build invocation.
Agent-runner & IPC
container/agent-runner/src/index.ts, container/agent-runner/src/ipc-mcp-stdio.ts
Renamed environment keys, MCP server key (nanoclaw → omniclaw), IPC markers/file names, and logging prefixes; internal wiring updated to OMNICLAW_* without altering IPC control flow (constructor call name changed).
Public S3 API & file-sync
src/s3/client.ts, src/s3/file-sync.ts, src/s3/ipc-poller.ts, src/shared/s3-client.ts
Renamed public interfaces/classes (NanoClawS3Config → OmniClawS3Config, NanoClawS3 → OmniClawS3) and updated imports/parameter types across S3 usage sites.
Core app & markers
src/index.ts, src/config.ts, src/backends/*, src/backends/stream-parser.ts, src/mount-security.ts, src/types.ts, src/container-runner.test.ts, src/container-runner.ts
Updated branding, default container image (CONTAINER_IMAGE → omniclaw-agent:latest), sentinel markers (OUTPUT_START/END) and many env/default path changes (NANOCLAW_* → OMNICLAW_*). src/index.ts adds WhatsApp retry/resiliency and nullable channel handling.
Backends & provisioning
src/backends/* (hetzner, railway, local, daytona, sprites, etc.)
Renamed S3 client/type usage, container name prefixes, provision marker files, cloud-init env vars, and related labels from nanoclaw → omniclaw; types/imports adjusted where S3 class renamed.
Docs, READMEs & guides
README.md, README_zh.md, CLAUDE.md, CONTRIBUTING.md, docs/*, docs/MIGRATING-TO-OMNICLAW.md, SIMPLIFICATION_SUMMARY.md
Repository-wide documentation updates and a new migration guide describing required steps for moving from NanoClaw to OmniClaw.
Workflows, scripts & repo metadata
.github/workflows/*, scripts/*, repo-tokens/*, package.json, repo metadata, groups/*/CLAUDE.md.template
Workflow metadata and glob refs, repo/tooling references, small package.json metadata updates, MCP macro renames (mcp__nanoclaw__* → mcp__omniclaw__*), and GH command scoping updated.
Tests & small infra
src/channels/whatsapp.test.ts.skip, src/group-queue.test.ts, src/channels/whatsapp.ts, various header comment changes
Test path/name updates and WhatsApp connection improvements: connect() promise rejection handling added to allow graceful failure instead of process.exit.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • #145 — Overlaps agent-runner and IPC env/MCP identifier renames (NANOCLAW_* → OMNICLAW_*); likely touches the same channel/ENV handling.
  • #30 — Modifies container/auto-update.sh and auto-update behavior; intersects env/service naming and restart logic updated here.
  • #12 — Touches Hetzner backend/S3 client area; relevant due to S3 class/type renames and backend config changes.

Suggested reviewers

  • nicktallen
  • omarzanji

Poem

"🐰 I hopped through files, a gentle sweep,
Renamed the claws while nobody sleeps,
From Nano's shell to Omni's cheer,
Logs and plists now sound more clear.
A tiny rabbit's tidy feat—rebrand complete!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: rename nanoclaw → omniclaw' clearly and concisely describes the primary change, which is a comprehensive renaming of the project across 99 files.
Linked Issues check ✅ Passed The PR fulfills all coding requirements from issue #122: renamed package and identifiers, updated internal references and environment variables, modified documentation and configuration files, and restructured GitHub action workflows per rebranding.
Out of Scope Changes check ✅ Passed All changes are directly aligned with the renaming objective. No unrelated modifications to core logic, dependencies, or unrelated features were introduced; changes are strictly nomenclature, paths, and documentation updates.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch rename/nanoclaw-to-omniclaw

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 | 🟠 Major

Avoid 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 for NANOCLAW_ROOT to match the pattern in auto-update.sh.

The auto-update.sh script maintains backwards compatibility for legacy NANOCLAW_* 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 bash would 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
from tobash 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.md around 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 becomes text ... 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
    hardcoded element 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 from tobash 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 becomes text ... 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 -->

Comment on lines 155 to +167
```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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment on lines +2 to +5
"name": "omniclaw-agent-runner",
"version": "1.0.0",
"type": "module",
"description": "Container-side agent runner for NanoClaw",
"description": "Container-side agent runner for OmniClaw",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment thread container/AUTO_UPDATE.md
Comment on lines 16 to 19
```bash
cd /path/to/nanoclaw
cd /path/to/omniclaw
./container/auto-update.sh
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.timer

Also 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.

Comment thread docs/SPEC.md
Comment on lines +607 to +608
| 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 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

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.

Suggested change
| 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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

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.

Comment thread src/config.ts
Comment on lines 22 to 27
export const MOUNT_ALLOWLIST_PATH = path.join(
HOME_DIR,
'.config',
'nanoclaw',
'omniclaw',
'mount-allowlist.json',
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Search for MOUNT_ALLOWLIST_PATH usage
rg -n "MOUNT_ALLOWLIST_PATH" -C3

Repository: omniaura/nanoclaw

Length of output: 2913


🏁 Script executed:

# Search for mount-allowlist file references
rg -n "mount-allowlist" -C3

Repository: omniaura/nanoclaw

Length of output: 2667


🏁 Script executed:

# Check if there's any migration or fallback logic
rg -n "nanoclaw" -C3

Repository: omniaura/nanoclaw

Length of output: 8754


🏁 Script executed:

# Check the current state of src/config.ts
cat -n src/config.ts

Repository: 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.

Suggested change
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>
@Peyton-Spencer
Peyton-Spencer merged commit a4c0932 into main Feb 20, 2026
3 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Rename: nanoclaw → omniclaw

1 participant