From e69d03792861da77d4a0cb9992a1225e377a6b6e Mon Sep 17 00:00:00 2001 From: dorianzheng Date: Thu, 26 Mar 2026 18:13:41 +0800 Subject: [PATCH] refactor: rename NanoClaw to AgentLite across the codebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comprehensive rename of all NanoClaw references to AgentLite for consistent branding after the project rename. Changes include: - MCP server name: nanoclaw → agentlite - Config paths: ~/.config/nanoclaw/ → ~/.config/agentlite/ - Env vars: NANOCLAW_* → AGENTLITE_* - Output markers: NANOCLAW_OUTPUT_* → AGENTLITE_OUTPUT_* - Container name prefix: nanoclaw- → agentlite- - Service files: com.nanoclaw → com.agentlite, nanoclaw.service → agentlite.service - Launchd plist: renamed com.nanoclaw.plist → com.agentlite.plist - All docs, skills, workflows, and README translations updated --- .claude/skills/add-compact/SKILL.md | 14 +- .claude/skills/add-discord/SKILL.md | 16 +- .claude/skills/add-gmail/SKILL.md | 20 +-- .claude/skills/add-image-vision/SKILL.md | 8 +- .claude/skills/add-ollama-tool/SKILL.md | 8 +- .claude/skills/add-parallel/SKILL.md | 36 ++--- .claude/skills/add-pdf-reader/SKILL.md | 10 +- .claude/skills/add-reactions/SKILL.md | 10 +- .claude/skills/add-slack/SKILL.md | 14 +- .claude/skills/add-telegram-swarm/SKILL.md | 18 +-- .claude/skills/add-telegram/SKILL.md | 24 +-- .../skills/add-voice-transcription/SKILL.md | 14 +- .claude/skills/add-whatsapp/SKILL.md | 28 ++-- .claude/skills/claw/SKILL.md | 24 +-- .claude/skills/claw/scripts/claw | 34 ++-- .../convert-to-apple-container/SKILL.md | 12 +- .claude/skills/customize/SKILL.md | 10 +- .claude/skills/debug/SKILL.md | 32 ++-- .claude/skills/setup/SKILL.md | 40 ++--- .claude/skills/setup/diagnostics.md | 16 +- .claude/skills/update-nanoclaw/SKILL.md | 18 +-- .claude/skills/update-nanoclaw/diagnostics.md | 16 +- .claude/skills/update-skills/SKILL.md | 2 +- .claude/skills/use-local-whisper/SKILL.md | 14 +- .../use-native-credential-proxy/SKILL.md | 14 +- .claude/skills/x-integration/SKILL.md | 38 ++--- .claude/skills/x-integration/host.ts | 2 +- .claude/skills/x-integration/lib/config.ts | 2 +- .github/workflows/fork-sync-skills.yml | 6 +- .github/workflows/merge-forward-skills.yml | 20 +-- .github/workflows/update-tokens.yml | 2 +- .gitignore | 2 +- CHANGELOG.md | 4 +- CLAUDE.md | 16 +- CONTRIBUTING.md | 12 +- CONTRIBUTORS.md | 2 +- README.md | 2 +- README_ja.md | 42 ++--- README_zh.md | 20 +-- container/agent-runner/package.json | 4 +- container/agent-runner/src/index.ts | 16 +- container/agent-runner/src/ipc-mcp-stdio.ts | 10 +- container/build.sh | 4 +- container/skills/capabilities/SKILL.md | 10 +- container/skills/status/SKILL.md | 6 +- docs/APPLE-CONTAINER-NETWORKING.md | 2 +- docs/DEBUG_CHECKLIST.md | 46 +++--- docs/REQUIREMENTS.md | 8 +- docs/SECURITY.md | 4 +- docs/SPEC.md | 62 ++++---- docs/boxlite-migrate-plan.md | 8 +- docs/docker-sandboxes.md | 52 +++--- docs/skills-as-branches.md | 150 +++++++++--------- groups/global/CLAUDE.md | 2 +- groups/main/CLAUDE.md | 6 +- ...com.nanoclaw.plist => com.agentlite.plist} | 6 +- repo-tokens/README.md | 6 +- repo-tokens/action.yml | 4 +- repo-tokens/badge.svg | 2 +- setup.sh | 4 +- setup/mounts.ts | 2 +- setup/platform.ts | 2 +- setup/service.test.ts | 48 +++--- setup/service.ts | 50 +++--- setup/status.ts | 2 +- setup/verify.ts | 12 +- src/box-runtime.ts | 6 +- src/config.ts | 4 +- src/config_cli.ts | 4 +- src/container-runner.test.ts | 10 +- src/container-runner.ts | 8 +- src/group-folder.test.ts | 4 +- src/group-queue.test.ts | 2 +- src/mount-security.ts | 4 +- src/orchestrator.ts | 2 +- src/remote-control.test.ts | 4 +- src/remote-control.ts | 4 +- src/types.ts | 2 +- 78 files changed, 602 insertions(+), 602 deletions(-) rename launchd/{com.nanoclaw.plist => com.agentlite.plist} (84%) diff --git a/.claude/skills/add-compact/SKILL.md b/.claude/skills/add-compact/SKILL.md index 2041f3fec3..ef9a57d664 100644 --- a/.claude/skills/add-compact/SKILL.md +++ b/.claude/skills/add-compact/SKILL.md @@ -28,7 +28,7 @@ git fetch upstream skill/compact git merge upstream/skill/compact ``` -> **Note:** `upstream` is the remote pointing to `qwibitai/nanoclaw`. If using a different remote name, substitute accordingly. +> **Note:** `upstream` is the remote pointing to `qwibitai/agentlite`. If using a different remote name, substitute accordingly. This adds: - `src/session-commands.ts` (extract and authorize session commands) @@ -52,15 +52,15 @@ npm run build ### Restart service ```bash -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 3: Verify ### Integration Test -1. Start NanoClaw in dev mode: `npm run dev` +1. Start AgentLite in dev mode: `npm run dev` 2. From the **main group** (self-chat), send exactly: `/compact` 3. Verify: - The agent acknowledges compaction (e.g., "Conversation compacted.") @@ -101,8 +101,8 @@ launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS ### Validation on Fresh Clone ```bash -git clone /tmp/nanoclaw-test -cd /tmp/nanoclaw-test +git clone /tmp/agentlite-test +cd /tmp/agentlite-test claude # then run /add-compact npm run build npm test @@ -117,7 +117,7 @@ npm test - **Main-group or trusted/admin sender only.** The main group is the user's private self-chat and is trusted (see `docs/SECURITY.md`). Non-main groups are untrusted — a careless or malicious user could wipe the agent's short-term memory. However, the device owner (`is_from_me`) is always trusted and can compact from any group. - **No auto-compaction.** This skill implements manual compaction only. Automatic threshold-based compaction is a separate concern and should be a separate skill. -- **No config file.** NanoClaw's philosophy is customization through code changes, not configuration sprawl. +- **No config file.** AgentLite's philosophy is customization through code changes, not configuration sprawl. - **Transcript archived before compaction.** The existing `PreCompact` hook in the agent-runner archives the full transcript to `conversations/` before the SDK compacts it. - **Session continues after compaction.** This is not a destructive reset. The conversation continues with summarized context. diff --git a/.claude/skills/add-discord/SKILL.md b/.claude/skills/add-discord/SKILL.md index e46bd3ef36..09f1b3fa4e 100644 --- a/.claude/skills/add-discord/SKILL.md +++ b/.claude/skills/add-discord/SKILL.md @@ -1,11 +1,11 @@ --- name: add-discord -description: Add Discord bot channel integration to NanoClaw. +description: Add Discord bot channel integration to AgentLite. --- # Add Discord Channel -This skill adds Discord support to NanoClaw, then walks through interactive setup. +This skill adds Discord support to AgentLite, then walks through interactive setup. ## Phase 1: Pre-flight @@ -32,7 +32,7 @@ git remote -v If `discord` is missing, add it: ```bash -git remote add discord https://github.com/qwibitai/nanoclaw-discord.git +git remote add discord https://github.com/qwibitai/agentlite-discord.git ``` ### Merge the skill branch @@ -109,7 +109,7 @@ The container reads environment from `data/env/env`, not `.env` directly. ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite ``` ## Phase 4: Registration @@ -159,7 +159,7 @@ Tell the user: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` ## Troubleshooting @@ -169,7 +169,7 @@ tail -f logs/nanoclaw.log 1. Check `DISCORD_BOT_TOKEN` is set in `.env` AND synced to `data/env/env` 2. Check channel is registered: `sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'dc:%'"` 3. For non-main channels: message must include trigger pattern (@mention the bot) -4. Service is running: `launchctl list | grep nanoclaw` +4. Service is running: `launchctl list | grep agentlite` 5. Verify the bot has been invited to the server (check OAuth2 URL was used) ### Bot only responds to @mentions @@ -184,7 +184,7 @@ If the bot connects but can't read messages, ensure: 1. Go to [Discord Developer Portal](https://discord.com/developers/applications) 2. Select your application > **Bot** tab 3. Under **Privileged Gateway Intents**, enable **Message Content Intent** -4. Restart NanoClaw +4. Restart AgentLite ### Getting Channel ID @@ -198,6 +198,6 @@ The Discord bot supports: - Text messages in registered channels - Attachment descriptions (images, videos, files shown as placeholders) - Reply context (shows who the user is replying to) -- @mention translation (Discord `<@botId>` → NanoClaw trigger format) +- @mention translation (Discord `<@botId>` → AgentLite trigger format) - Message splitting for responses over 2000 characters - Typing indicators while the agent processes diff --git a/.claude/skills/add-gmail/SKILL.md b/.claude/skills/add-gmail/SKILL.md index 781a0eb8cd..7dc89ee293 100644 --- a/.claude/skills/add-gmail/SKILL.md +++ b/.claude/skills/add-gmail/SKILL.md @@ -1,11 +1,11 @@ --- name: add-gmail -description: Add Gmail integration to NanoClaw. Can be configured as a tool (agent reads/sends emails when triggered from WhatsApp) or as a full channel (emails can trigger the agent, schedule tasks, and receive replies). Guides through GCP OAuth setup and implements the integration. +description: Add Gmail integration to AgentLite. Can be configured as a tool (agent reads/sends emails when triggered from WhatsApp) or as a full channel (emails can trigger the agent, schedule tasks, and receive replies). Guides through GCP OAuth setup and implements the integration. --- # Add Gmail Integration -This skill adds Gmail support to NanoClaw — either as a tool (read, send, search, draft) or as a full channel that polls the inbox. +This skill adds Gmail support to AgentLite — either as a tool (read, send, search, draft) or as a full channel that polls the inbox. ## Phase 1: Pre-flight @@ -33,7 +33,7 @@ git remote -v If `gmail` is missing, add it: ```bash -git remote add gmail https://github.com/qwibitai/nanoclaw-gmail.git +git remote add gmail https://github.com/qwibitai/agentlite-gmail.git ``` ### Merge the skill branch @@ -97,7 +97,7 @@ Tell the user: > 2. Go to **APIs & Services > Library**, search "Gmail API", click **Enable** > 3. Go to **APIs & Services > Credentials**, click **+ CREATE CREDENTIALS > OAuth client ID** > - If prompted for consent screen: choose "External", fill in app name and email, save -> - Application type: **Desktop app**, name: anything (e.g., "NanoClaw Gmail") +> - Application type: **Desktop app**, name: anything (e.g., "AgentLite Gmail") > 4. Click **DOWNLOAD JSON** and save as `gcp-oauth.keys.json` > > Where did you save the file? (Give me the full path, or paste the file contents here) @@ -143,8 +143,8 @@ Then compile and restart: ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 4: Verify @@ -159,14 +159,14 @@ Tell the user: ### Test channel mode (Channel mode only) -Tell the user to send themselves a test email. The agent should pick it up within a minute. Monitor: `tail -f logs/nanoclaw.log | grep -iE "(gmail|email)"`. +Tell the user to send themselves a test email. The agent should pick it up within a minute. Monitor: `tail -f logs/agentlite.log | grep -iE "(gmail|email)"`. Once verified, offer filter customization via `AskUserQuestion` — by default, only emails in the Primary inbox trigger the agent (Promotions, Social, Updates, and Forums are excluded). The user can keep this default or narrow further by sender, label, or keywords. No code changes needed for filters. ### Check logs if needed ```bash -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` ## Troubleshooting @@ -206,7 +206,7 @@ npx -y @gongrzhe/server-gmail-autoauth-mcp 2. Remove `gmail` MCP server and `mcp__gmail__*` from `container/agent-runner/src/index.ts` 3. Rebuild and restart 4. Clear stale agent-runner copies: `rm -r data/sessions/*/agent-runner-src 2>/dev/null || true` -5. Rebuild: `cd container && ./build.sh && cd .. && npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `systemctl --user restart nanoclaw` (Linux) +5. Rebuild: `cd container && ./build.sh && cd .. && npm run build && launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `systemctl --user restart agentlite` (Linux) ### Channel mode @@ -217,4 +217,4 @@ npx -y @gongrzhe/server-gmail-autoauth-mcp 5. Uninstall: `npm uninstall googleapis` 6. Rebuild and restart 7. Clear stale agent-runner copies: `rm -r data/sessions/*/agent-runner-src 2>/dev/null || true` -8. Rebuild: `cd container && ./build.sh && cd .. && npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `systemctl --user restart nanoclaw` (Linux) +8. Rebuild: `cd container && ./build.sh && cd .. && npm run build && launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `systemctl --user restart agentlite` (Linux) diff --git a/.claude/skills/add-image-vision/SKILL.md b/.claude/skills/add-image-vision/SKILL.md index f227fe560c..e089f7a6cc 100644 --- a/.claude/skills/add-image-vision/SKILL.md +++ b/.claude/skills/add-image-vision/SKILL.md @@ -1,11 +1,11 @@ --- name: add-image-vision -description: Add image vision to NanoClaw agents. Resizes and processes WhatsApp image attachments, then sends them to Claude as multimodal content blocks. +description: Add image vision to AgentLite agents. Resizes and processes WhatsApp image attachments, then sends them to Claude as multimodal content blocks. --- # Image Vision Skill -Adds the ability for NanoClaw agents to see and understand images sent via WhatsApp. Images are downloaded, resized with sharp, saved to the group workspace, and passed to the agent as base64-encoded multimodal content blocks. +Adds the ability for AgentLite agents to see and understand images sent via WhatsApp. Images are downloaded, resized with sharp, saved to the group workspace, and passed to the agent as base64-encoded multimodal content blocks. ## Phase 1: Pre-flight @@ -25,7 +25,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -75,7 +75,7 @@ All tests must pass and build must be clean before proceeding. 3. Restart the service: ```bash - launchctl kickstart -k gui/$(id -u)/com.nanoclaw + launchctl kickstart -k gui/$(id -u)/com.agentlite ``` ## Phase 4: Verify diff --git a/.claude/skills/add-ollama-tool/SKILL.md b/.claude/skills/add-ollama-tool/SKILL.md index a347b4993c..71dd1ceab1 100644 --- a/.claude/skills/add-ollama-tool/SKILL.md +++ b/.claude/skills/add-ollama-tool/SKILL.md @@ -48,7 +48,7 @@ git remote -v If `upstream` is missing, add it: ```bash -git remote add upstream https://github.com/qwibitai/nanoclaw.git +git remote add upstream https://github.com/qwibitai/agentlite.git ``` ### Merge the skill branch @@ -100,8 +100,8 @@ OLLAMA_HOST=http://your-ollama-host:11434 ### Restart the service ```bash -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 4: Verify @@ -125,7 +125,7 @@ Run the watcher script for macOS notifications when Ollama is used: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log | grep -i ollama +tail -f logs/agentlite.log | grep -i ollama ``` Look for: diff --git a/.claude/skills/add-parallel/SKILL.md b/.claude/skills/add-parallel/SKILL.md index f4c19828e5..645cdde89d 100644 --- a/.claude/skills/add-parallel/SKILL.md +++ b/.claude/skills/add-parallel/SKILL.md @@ -1,18 +1,18 @@ # Add Parallel AI Integration -Adds Parallel AI MCP integration to NanoClaw for advanced web research capabilities. +Adds Parallel AI MCP integration to AgentLite for advanced web research capabilities. ## What This Adds - **Quick Search** - Fast web lookups using Parallel Search API (free to use) - **Deep Research** - Comprehensive analysis using Parallel Task API (asks permission) -- **Non-blocking Design** - Uses NanoClaw scheduler for result polling (no container blocking) +- **Non-blocking Design** - Uses AgentLite scheduler for result polling (no container blocking) ## Prerequisites User must have: 1. Parallel AI API key from https://platform.parallel.ai -2. NanoClaw already set up and running +2. AgentLite already set up and running 3. Docker installed and running ## Implementation Steps @@ -83,14 +83,14 @@ Update `container/agent-runner/src/index.ts`: Find the section where `mcpServers` is configured (around line 237-252): ```typescript const mcpServers: Record = { - nanoclaw: ipcMcp + agentlite: ipcMcp }; ``` -Add Parallel AI MCP servers after the nanoclaw server: +Add Parallel AI MCP servers after the agentlite server: ```typescript const mcpServers: Record = { - nanoclaw: ipcMcp + agentlite: ipcMcp }; // Add Parallel AI MCP servers if API key is available @@ -122,7 +122,7 @@ allowedTools: [ 'Bash', 'Read', 'Write', 'Edit', 'Glob', 'Grep', 'WebSearch', 'WebFetch', - 'mcp__nanoclaw__*', + 'mcp__agentlite__*', 'mcp__parallel-search__*', 'mcp__parallel-task__*' ], @@ -178,14 +178,14 @@ AskUserQuestion: I can do deep research on [topic] using Parallel's Task API. Th 1. Create the task using `mcp__parallel-task__create_task_run` 2. Get the `run_id` from the response -3. Create a polling scheduled task using `mcp__nanoclaw__schedule_task`: +3. Create a polling scheduled task using `mcp__agentlite__schedule_task`: ``` Prompt: "Check Parallel AI task run [run_id] and send results when ready. 1. Use the Parallel Task MCP to check the task status 2. If status is 'completed', extract the results - 3. Send results to user with mcp__nanoclaw__send_message - 4. Use mcp__nanoclaw__complete_scheduled_task to mark this task as done + 3. Send results to user with mcp__agentlite__send_message + 4. Use mcp__agentlite__complete_scheduled_task to mark this task as done If status is still 'running' or 'pending', do nothing (task will run again in 30s). If status is 'failed', send error message and complete the task." @@ -224,7 +224,7 @@ Build the container with updated agent runner: Verify the build: ```bash -echo '{}' | docker run -i --entrypoint /bin/echo nanoclaw-agent:latest "Container OK" +echo '{}' | docker run -i --entrypoint /bin/echo agentlite-agent:latest "Container OK" ``` ### 7. Restart Service @@ -233,15 +233,15 @@ Rebuild the main app and restart: ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` Wait 3 seconds for service to start, then verify: ```bash sleep 3 -launchctl list | grep nanoclaw # macOS -# Linux: systemctl --user status nanoclaw +launchctl list | grep agentlite # macOS +# Linux: systemctl --user status agentlite ``` ### 8. Test Integration @@ -257,7 +257,7 @@ Tell the user to test: Check logs to verify MCP servers loaded: ```bash -tail -20 logs/nanoclaw.log +tail -20 logs/agentlite.log ``` Look for: `Parallel AI MCP servers configured` @@ -276,7 +276,7 @@ Look for: `Parallel AI MCP servers configured` **Task polling not working:** - Verify scheduled task was created: `sqlite3 store/messages.db "SELECT * FROM scheduled_tasks"` -- Check task runs: `tail -f logs/nanoclaw.log | grep "scheduled task"` +- Check task runs: `tail -f logs/agentlite.log | grep "scheduled task"` - Ensure task prompt includes proper Parallel MCP tool names ## Uninstalling @@ -287,4 +287,4 @@ To remove Parallel AI integration: 2. Revert changes to container-runner.ts and agent-runner/src/index.ts 3. Remove Web Research Tools section from groups/main/CLAUDE.md 4. Rebuild: `./container/build.sh && npm run build` -5. Restart: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `systemctl --user restart nanoclaw` (Linux) +5. Restart: `launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `systemctl --user restart agentlite` (Linux) diff --git a/.claude/skills/add-pdf-reader/SKILL.md b/.claude/skills/add-pdf-reader/SKILL.md index a01e530979..522547c164 100644 --- a/.claude/skills/add-pdf-reader/SKILL.md +++ b/.claude/skills/add-pdf-reader/SKILL.md @@ -1,6 +1,6 @@ --- name: add-pdf-reader -description: Add PDF reading to NanoClaw agents. Extracts text from PDFs via pdftotext CLI. Handles WhatsApp attachments, URLs, and local files. +description: Add PDF reading to AgentLite agents. Extracts text from PDFs via pdftotext CLI. Handles WhatsApp attachments, URLs, and local files. --- # Add PDF Reader @@ -23,7 +23,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -62,8 +62,8 @@ npx vitest run src/channels/whatsapp.test.ts ### Restart service ```bash -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 3: Verify @@ -82,7 +82,7 @@ Ask the agent to read a PDF from a URL. It should use `pdf-reader fetch `. ### Check logs if needed ```bash -tail -f logs/nanoclaw.log | grep -i pdf +tail -f logs/agentlite.log | grep -i pdf ``` Look for: diff --git a/.claude/skills/add-reactions/SKILL.md b/.claude/skills/add-reactions/SKILL.md index 7a0790a698..a3a1f1d82d 100644 --- a/.claude/skills/add-reactions/SKILL.md +++ b/.claude/skills/add-reactions/SKILL.md @@ -5,7 +5,7 @@ description: Add WhatsApp emoji reaction support — receive, send, store, and s # Add Reactions -This skill adds emoji reaction support to NanoClaw's WhatsApp channel: receive and store reactions, send reactions from the container agent via MCP tool, and query reaction history from SQLite. +This skill adds emoji reaction support to AgentLite's WhatsApp channel: receive and store reactions, send reactions from the container agent via MCP tool, and query reaction history from SQLite. ## Phase 1: Pre-flight @@ -30,7 +30,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -76,12 +76,12 @@ npm run build Linux: ```bash -systemctl --user restart nanoclaw +systemctl --user restart agentlite ``` macOS: ```bash -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite ``` ### Test receiving reactions @@ -102,7 +102,7 @@ Ask the agent to react to a message via the `react_to_message` MCP tool. Check y ### Reactions not appearing in database -- Check NanoClaw logs for `Failed to process reaction` errors +- Check AgentLite logs for `Failed to process reaction` errors - Verify the chat is registered - Confirm the service is running diff --git a/.claude/skills/add-slack/SKILL.md b/.claude/skills/add-slack/SKILL.md index 4c86e1964b..59e6997a23 100644 --- a/.claude/skills/add-slack/SKILL.md +++ b/.claude/skills/add-slack/SKILL.md @@ -5,7 +5,7 @@ description: Add Slack as a channel. Can replace WhatsApp entirely or run alongs # Add Slack Channel -This skill adds Slack support to NanoClaw, then walks through interactive setup. +This skill adds Slack support to AgentLite, then walks through interactive setup. ## Phase 1: Pre-flight @@ -28,7 +28,7 @@ git remote -v If `slack` is missing, add it: ```bash -git remote add slack https://github.com/qwibitai/nanoclaw-slack.git +git remote add slack https://github.com/qwibitai/agentlite-slack.git ``` ### Merge the skill branch @@ -99,7 +99,7 @@ The container reads environment from `data/env/env`, not `.env` directly. ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite ``` ## Phase 4: Registration @@ -112,7 +112,7 @@ Tell the user: > 2. In that channel, the channel ID is in the URL when you open it in a browser: `https://app.slack.com/client/T.../C0123456789` — the `C...` part is the channel ID > 3. Alternatively, right-click the channel name → **Copy link** — the channel ID is the last path segment > -> The JID format for NanoClaw is: `slack:C0123456789` +> The JID format for AgentLite is: `slack:C0123456789` Wait for the user to provide the channel ID. @@ -147,7 +147,7 @@ Tell the user: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` ## Troubleshooting @@ -157,7 +157,7 @@ tail -f logs/nanoclaw.log 1. Check `SLACK_BOT_TOKEN` and `SLACK_APP_TOKEN` are set in `.env` AND synced to `data/env/env` 2. Check channel is registered: `sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'slack:%'"` 3. For non-main channels: message must include trigger pattern -4. Service is running: `launchctl list | grep nanoclaw` +4. Service is running: `launchctl list | grep agentlite` ### Bot connected but not receiving messages @@ -180,7 +180,7 @@ If the bot logs `missing_scope` errors: 3. **Reinstall the app** to your workspace — scope changes require reinstallation 4. Copy the new Bot Token (it changes on reinstall) and update `.env` 5. Sync: `mkdir -p data/env && cp .env data/env/env` -6. Restart: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw` +6. Restart: `launchctl kickstart -k gui/$(id -u)/com.agentlite` ### Getting channel ID diff --git a/.claude/skills/add-telegram-swarm/SKILL.md b/.claude/skills/add-telegram-swarm/SKILL.md index d9fd183268..9da28b2be5 100644 --- a/.claude/skills/add-telegram-swarm/SKILL.md +++ b/.claude/skills/add-telegram-swarm/SKILL.md @@ -276,7 +276,7 @@ Create *exactly* the team the user asked for — same number of agents, same rol Each team member MUST be instructed to: -1. *Share progress in the group* via `mcp__nanoclaw__send_message` with a `sender` parameter matching their exact role/character name (e.g., `sender: "Marine Biologist"` or `sender: "Alexander Hamilton"`). This makes their messages appear from a dedicated bot in the Telegram group. +1. *Share progress in the group* via `mcp__agentlite__send_message` with a `sender` parameter matching their exact role/character name (e.g., `sender: "Marine Biologist"` or `sender: "Alexander Hamilton"`). This makes their messages appear from a dedicated bot in the Telegram group. 2. *Also communicate with teammates* via `SendMessage` as normal for coordination. 3. Keep group messages *short* — 2-4 sentences max per message. Break longer content into multiple `send_message` calls. No walls of text. 4. Use the `sender` parameter consistently — always the same name so the bot identity stays stable. @@ -287,7 +287,7 @@ Each team member MUST be instructed to: When creating a teammate, include instructions like: \``` -You are the Marine Biologist. When you have findings or updates for the user, send them to the group using mcp__nanoclaw__send_message with sender set to "Marine Biologist". Keep each message short (2-4 sentences max). Use emojis for strong reactions. ONLY use single *asterisks* for bold (never **double**), _underscores_ for italic, • for bullets. No markdown. Also communicate with teammates via SendMessage. +You are the Marine Biologist. When you have findings or updates for the user, send them to the group using mcp__agentlite__send_message with sender set to "Marine Biologist". Keep each message short (2-4 sentences max). Use emojis for strong reactions. ONLY use single *asterisks* for bold (never **double**), _underscores_ for italic, • for bullets. No markdown. Also communicate with teammates via SendMessage. \``` ### Lead agent behavior @@ -314,7 +314,7 @@ TELEGRAM_BOT_POOL=TOKEN1,TOKEN2,TOKEN3,... cp .env data/env/env ``` -Also add `TELEGRAM_BOT_POOL` to the launchd plist (`~/Library/LaunchAgents/com.nanoclaw.plist`) in the `EnvironmentVariables` dict if using launchd. +Also add `TELEGRAM_BOT_POOL` to the launchd plist (`~/Library/LaunchAgents/com.agentlite.plist`) in the `EnvironmentVariables` dict if using launchd. ### Step 7: Rebuild and Restart @@ -322,10 +322,10 @@ Also add `TELEGRAM_BOT_POOL` to the launchd plist (`~/Library/LaunchAgents/com.n npm run build ./container/build.sh # Required — MCP tool changed # macOS: -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist # Linux: -# systemctl --user restart nanoclaw +# systemctl --user restart agentlite ``` Must use `unload/load` (macOS) or `restart` (Linux) because the service env vars changed. @@ -342,7 +342,7 @@ Tell the user: > - Each subagent messaging from a different bot, renamed to their role > - Short, scannable messages from each agent > -> Check logs: `tail -f logs/nanoclaw.log | grep -i pool` +> Check logs: `tail -f logs/agentlite.log | grep -i pool` ## Architecture Notes @@ -358,7 +358,7 @@ Tell the user: ### Pool bots not sending messages 1. Verify tokens: `curl -s "https://api.telegram.org/botTOKEN/getMe"` -2. Check pool initialized: `grep "Pool bot" logs/nanoclaw.log` +2. Check pool initialized: `grep "Pool bot" logs/agentlite.log` 3. Ensure all pool bots are members of the Telegram group 4. Check Group Privacy is disabled for each pool bot @@ -381,4 +381,4 @@ To remove Agent Swarm support while keeping basic Telegram: 5. Remove `sender` param from MCP tool in `container/agent-runner/src/ipc-mcp-stdio.ts` 6. Remove Agent Teams section from group CLAUDE.md files 7. Remove `TELEGRAM_BOT_POOL` from `.env`, `data/env/env`, and launchd plist/systemd unit -8. Rebuild: `npm run build && ./container/build.sh && launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist && launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist` (macOS) or `npm run build && ./container/build.sh && systemctl --user restart nanoclaw` (Linux) +8. Rebuild: `npm run build && ./container/build.sh && launchctl unload ~/Library/LaunchAgents/com.agentlite.plist && launchctl load ~/Library/LaunchAgents/com.agentlite.plist` (macOS) or `npm run build && ./container/build.sh && systemctl --user restart agentlite` (Linux) diff --git a/.claude/skills/add-telegram/SKILL.md b/.claude/skills/add-telegram/SKILL.md index 10f25ab62c..851b0b124c 100644 --- a/.claude/skills/add-telegram/SKILL.md +++ b/.claude/skills/add-telegram/SKILL.md @@ -5,7 +5,7 @@ description: Add Telegram as a channel. Can replace WhatsApp entirely or run alo # Add Telegram Channel -This skill adds Telegram support to NanoClaw, then walks through interactive setup. +This skill adds Telegram support to AgentLite, then walks through interactive setup. ## Phase 1: Pre-flight @@ -32,7 +32,7 @@ git remote -v If `telegram` is missing, add it: ```bash -git remote add telegram https://github.com/qwibitai/nanoclaw-telegram.git +git remote add telegram https://github.com/qwibitai/agentlite-telegram.git ``` ### Merge the skill branch @@ -115,8 +115,8 @@ Tell the user: ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 4: Registration @@ -162,7 +162,7 @@ Tell the user: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` ## Troubleshooting @@ -173,7 +173,7 @@ Check: 1. `TELEGRAM_BOT_TOKEN` is set in `.env` AND synced to `data/env/env` 2. Chat is registered in SQLite (check with: `sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'tg:%'"`) 3. For non-main chats: message includes trigger pattern -4. Service is running: `launchctl list | grep nanoclaw` (macOS) or `systemctl --user status nanoclaw` (Linux) +4. Service is running: `launchctl list | grep agentlite` (macOS) or `systemctl --user status agentlite` (Linux) ### Bot only responds to @mentions in groups @@ -185,21 +185,21 @@ Group Privacy is enabled (default). Fix: If `/chatid` doesn't work: - Verify token: `curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe"` -- Check bot is started: `tail -f logs/nanoclaw.log` +- Check bot is started: `tail -f logs/agentlite.log` ## After Setup If running `npm run dev` while the service is active: ```bash # macOS: -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist npm run dev # When done testing: -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist # Linux: -# systemctl --user stop nanoclaw +# systemctl --user stop agentlite # npm run dev -# systemctl --user start nanoclaw +# systemctl --user start agentlite ``` ## Agent Swarms (Teams) @@ -219,4 +219,4 @@ To remove Telegram integration: 3. Remove `TELEGRAM_BOT_TOKEN` from `.env` 4. Remove Telegram registrations from SQLite: `sqlite3 store/messages.db "DELETE FROM registered_groups WHERE jid LIKE 'tg:%'"` 5. Uninstall: `npm uninstall grammy` -6. Rebuild: `npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `npm run build && systemctl --user restart nanoclaw` (Linux) +6. Rebuild: `npm run build && launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `npm run build && systemctl --user restart agentlite` (Linux) diff --git a/.claude/skills/add-voice-transcription/SKILL.md b/.claude/skills/add-voice-transcription/SKILL.md index 8ccec324d4..f3b5995a85 100644 --- a/.claude/skills/add-voice-transcription/SKILL.md +++ b/.claude/skills/add-voice-transcription/SKILL.md @@ -1,11 +1,11 @@ --- name: add-voice-transcription -description: Add voice message transcription to NanoClaw using OpenAI's Whisper API. Automatically transcribes WhatsApp voice notes so the agent can read and respond to them. +description: Add voice message transcription to AgentLite using OpenAI's Whisper API. Automatically transcribes WhatsApp voice notes so the agent can read and respond to them. --- # Add Voice Transcription -This skill adds automatic voice message transcription to NanoClaw's WhatsApp channel using OpenAI's Whisper API. When a voice note arrives, it is downloaded, transcribed, and delivered to the agent as `[Voice: ]`. +This skill adds automatic voice message transcription to AgentLite's WhatsApp channel using OpenAI's Whisper API. When a voice note arrives, it is downloaded, transcribed, and delivered to the agent as `[Voice: ]`. ## Phase 1: Pre-flight @@ -34,7 +34,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -77,7 +77,7 @@ If the user doesn't have an API key: > > 1. Go to https://platform.openai.com/api-keys > 2. Click "Create new secret key" -> 3. Give it a name (e.g., "NanoClaw Transcription") +> 3. Give it a name (e.g., "AgentLite Transcription") > 4. Copy the key (starts with `sk-`) > > Cost: ~$0.006 per minute of audio (~$0.003 per typical 30-second voice note) @@ -104,8 +104,8 @@ The container reads environment from `data/env/env`, not `.env` directly. ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ## Phase 4: Verify @@ -119,7 +119,7 @@ Tell the user: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log | grep -i voice +tail -f logs/agentlite.log | grep -i voice ``` Look for: diff --git a/.claude/skills/add-whatsapp/SKILL.md b/.claude/skills/add-whatsapp/SKILL.md index 3dab28e568..2b4d375019 100644 --- a/.claude/skills/add-whatsapp/SKILL.md +++ b/.claude/skills/add-whatsapp/SKILL.md @@ -5,7 +5,7 @@ description: Add WhatsApp as a channel. Can replace other channels entirely or r # Add WhatsApp Channel -This skill adds WhatsApp support to NanoClaw. It installs the WhatsApp channel code, dependencies, and guides through authentication, registration, and configuration. +This skill adds WhatsApp support to AgentLite. It installs the WhatsApp channel code, dependencies, and guides through authentication, registration, and configuration. ## Phase 1: Pre-flight @@ -55,7 +55,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -264,13 +264,13 @@ Restart the service: ```bash # macOS (launchd) -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # Linux (systemd) -systemctl --user restart nanoclaw +systemctl --user restart agentlite # Linux (nohup fallback) -bash start-nanoclaw.sh +bash start-agentlite.sh ``` ### Test the connection @@ -286,7 +286,7 @@ Tell the user: ### Check logs if needed ```bash -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` ## Troubleshooting @@ -320,7 +320,7 @@ rm -rf store/auth/ && npx tsx setup/index.ts --step whatsapp-auth -- --method qr ### "conflict" disconnection -This happens when two instances connect with the same credentials. Ensure only one NanoClaw process is running: +This happens when two instances connect with the same credentials. Ensure only one AgentLite process is running: ```bash pkill -f "node dist/cli.js" @@ -332,8 +332,8 @@ pkill -f "node dist/cli.js" Check: 1. Auth credentials exist: `ls store/auth/creds.json` 3. Chat is registered: `sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE '%whatsapp%' OR jid LIKE '%@g.us' OR jid LIKE '%@s.whatsapp.net'"` -4. Service is running: `launchctl list | grep nanoclaw` (macOS) or `systemctl --user status nanoclaw` (Linux) -5. Logs: `tail -50 logs/nanoclaw.log` +4. Service is running: `launchctl list | grep agentlite` (macOS) or `systemctl --user status agentlite` (Linux) +5. Logs: `tail -50 logs/agentlite.log` ### Group names not showing @@ -351,15 +351,15 @@ If running `npm run dev` while the service is active: ```bash # macOS: -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist npm run dev # When done testing: -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist # Linux: -# systemctl --user stop nanoclaw +# systemctl --user stop agentlite # npm run dev -# systemctl --user start nanoclaw +# systemctl --user start agentlite ``` ## Removal @@ -369,4 +369,4 @@ To remove WhatsApp integration: 1. Delete auth credentials: `rm -rf store/auth/` 2. Remove WhatsApp registrations: `sqlite3 store/messages.db "DELETE FROM registered_groups WHERE jid LIKE '%@g.us' OR jid LIKE '%@s.whatsapp.net'"` 3. Sync env: `mkdir -p data/env && cp .env data/env/env` -4. Rebuild and restart: `npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `npm run build && systemctl --user restart nanoclaw` (Linux) +4. Rebuild and restart: `npm run build && launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `npm run build && systemctl --user restart agentlite` (Linux) diff --git a/.claude/skills/claw/SKILL.md b/.claude/skills/claw/SKILL.md index 10e0dc3576..3f75b9e2c1 100644 --- a/.claude/skills/claw/SKILL.md +++ b/.claude/skills/claw/SKILL.md @@ -1,11 +1,11 @@ --- name: claw -description: Install the claw CLI tool — run NanoClaw agent containers from the command line without opening a chat app. +description: Install the claw CLI tool — run AgentLite agent containers from the command line without opening a chat app. --- -# claw — NanoClaw CLI +# claw — AgentLite CLI -`claw` is a Python CLI that sends prompts directly to a NanoClaw agent container from the terminal. It reads registered groups from the NanoClaw database, picks up secrets from `.env`, and pipes a JSON payload into a container run — no chat app required. +`claw` is a Python CLI that sends prompts directly to a AgentLite agent container from the terminal. It reads registered groups from the AgentLite database, picks up secrets from `.env`, and pipes a JSON payload into a container run — no chat app required. ## What it does @@ -21,12 +21,12 @@ description: Install the claw CLI tool — run NanoClaw agent containers from th ## Prerequisites - Python 3.8 or later -- NanoClaw installed with a built and tagged container image (`nanoclaw-agent:latest`) +- AgentLite installed with a built and tagged container image (`agentlite-agent:latest`) - Either `container` (Apple Container, macOS 15+) or `docker` available in `PATH` ## Install -Run this skill from within the NanoClaw directory. The script auto-detects its location, so the symlink always points to the right place. +Run this skill from within the AgentLite directory. The script auto-detects its location, so the symlink always points to the right place. ### 1. Copy the script @@ -61,7 +61,7 @@ source ~/.zshrc # or ~/.bashrc claw --list-groups ``` -You should see registered groups. If NanoClaw isn't running or the database doesn't exist yet, the list will be empty — that's fine. +You should see registered groups. If AgentLite isn't running or the database doesn't exist yet, the list will be empty — that's fine. ## Usage Examples @@ -91,7 +91,7 @@ claw --list-groups claw --runtime docker "Hello" # Use a custom image tag (e.g. after rebuilding with a new tag) -claw --image nanoclaw-agent:dev "Hello" +claw --image agentlite-agent:dev "Hello" # Verbose mode (debug info, secrets redacted) claw -v "Hello" @@ -108,11 +108,11 @@ Install Docker Desktop or Apple Container (macOS 15+), or pass `--runtime` expli ### "no secrets found in .env" -The script auto-detects your NanoClaw directory and reads `.env` from it. Check that the file exists and contains at least one of: `CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`. +The script auto-detects your AgentLite directory and reads `.env` from it. Check that the file exists and contains at least one of: `CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`. ### Container times out -The default timeout is 300 seconds. For longer tasks, pass `--timeout 600` (or higher). If the container consistently hangs, check that your `nanoclaw-agent:latest` image is up to date by running `./container/build.sh`. +The default timeout is 300 seconds. For longer tasks, pass `--timeout 600` (or higher). If the container consistently hangs, check that your `agentlite-agent:latest` image is up to date by running `./container/build.sh`. ### "group not found" @@ -122,10 +122,10 @@ Run `claw --list-groups` to see what's registered. Group lookup does a fuzzy par Containers run with `--rm` so they are automatically removed. If the agent crashes before emitting the output sentinel, `claw` falls back to printing raw stdout. Use `-v` to see what the container produced. Rebuild the image with `./container/build.sh` if crashes are consistent. -### Override the NanoClaw directory +### Override the AgentLite directory -If `claw` can't find your database or `.env`, set the `NANOCLAW_DIR` environment variable: +If `claw` can't find your database or `.env`, set the `AGENTLITE_DIR` environment variable: ```bash -export NANOCLAW_DIR=/path/to/your/nanoclaw +export AGENTLITE_DIR=/path/to/your/agentlite ``` diff --git a/.claude/skills/claw/scripts/claw b/.claude/skills/claw/scripts/claw index 3878e4824d..4acebed0d1 100644 --- a/.claude/skills/claw/scripts/claw +++ b/.claude/skills/claw/scripts/claw @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -claw — NanoClaw CLI -Run a NanoClaw agent container from the command line. +claw — AgentLite CLI +Run a AgentLite agent container from the command line. Usage: claw "What is 2+2?" @@ -36,27 +36,27 @@ def dbg(*args): # ── Config ────────────────────────────────────────────────────────────────── -def _find_nanoclaw_dir() -> Path: - """Locate the NanoClaw installation directory. +def _find_agentlite_dir() -> Path: + """Locate the AgentLite installation directory. Resolution order: - 1. NANOCLAW_DIR env var - 2. The directory containing this script (if it looks like a NanoClaw install) - 3. ~/src/nanoclaw (legacy default) + 1. AGENTLITE_DIR env var + 2. The directory containing this script (if it looks like a AgentLite install) + 3. ~/src/agentlite (legacy default) """ - if env := os.environ.get("NANOCLAW_DIR"): + if env := os.environ.get("AGENTLITE_DIR"): return Path(env).expanduser() - # If this script lives inside the NanoClaw tree (e.g. scripts/claw), walk up + # If this script lives inside the AgentLite tree (e.g. scripts/claw), walk up here = Path(__file__).resolve() for parent in [here.parent, here.parent.parent]: if (parent / "store" / "messages.db").exists() or (parent / ".env").exists(): return parent - return Path.home() / "src" / "nanoclaw" + return Path.home() / "src" / "agentlite" -NANOCLAW_DIR = _find_nanoclaw_dir() -DB_PATH = NANOCLAW_DIR / "store" / "messages.db" -ENV_FILE = NANOCLAW_DIR / ".env" -IMAGE = "nanoclaw-agent:latest" +AGENTLITE_DIR = _find_agentlite_dir() +DB_PATH = AGENTLITE_DIR / "store" / "messages.db" +ENV_FILE = AGENTLITE_DIR / ".env" +IMAGE = "agentlite-agent:latest" SECRET_KEYS = [ "CLAUDE_CODE_OAUTH_TOKEN", @@ -163,7 +163,7 @@ def run_container(runtime: str, image: str, payload: dict, timeout: int = 300) - dbg(f"stdout: {line}") # Kill the container as soon as we see the closing sentinel — # the Node.js event loop often keeps the process alive indefinitely. - if line.strip() == "---NANOCLAW_OUTPUT_END---": + if line.strip() == "---AGENTLITE_OUTPUT_END---": dbg("output sentinel found, terminating container") done.set() try: @@ -193,7 +193,7 @@ def run_container(runtime: str, image: str, payload: dict, timeout: int = 300) - # Parse output block match = re.search( - r"---NANOCLAW_OUTPUT_START---\n(.*?)\n---NANOCLAW_OUTPUT_END---", + r"---AGENTLITE_OUTPUT_START---\n(.*?)\n---AGENTLITE_OUTPUT_END---", stdout, re.DOTALL, ) @@ -224,7 +224,7 @@ def run_container(runtime: str, image: str, payload: dict, timeout: int = 300) - def main(): parser = argparse.ArgumentParser( prog="claw", - description="Run a NanoClaw agent from the command line.", + description="Run a AgentLite agent from the command line.", ) parser.add_argument("prompt", nargs="?", help="Prompt to send") parser.add_argument("-g", "--group", help="Group name or folder (fuzzy match)") diff --git a/.claude/skills/convert-to-apple-container/SKILL.md b/.claude/skills/convert-to-apple-container/SKILL.md index caf9c2211b..b26cc87fe7 100644 --- a/.claude/skills/convert-to-apple-container/SKILL.md +++ b/.claude/skills/convert-to-apple-container/SKILL.md @@ -5,7 +5,7 @@ description: Switch from Docker to Apple Container for macOS-native container is # Convert to Apple Container -This skill switches NanoClaw's container runtime from Docker to Apple Container (macOS-only). It uses the skills engine for deterministic code changes, then walks through verification. +This skill switches AgentLite's container runtime from Docker to Apple Container (macOS-only). It uses the skills engine for deterministic code changes, then walks through verification. **What this changes:** - Container runtime binary: `docker` → `container` @@ -58,7 +58,7 @@ git remote -v If `upstream` is missing, add it: ```bash -git remote add upstream https://github.com/qwibitai/nanoclaw.git +git remote add upstream https://github.com/qwibitai/agentlite.git ``` ### Merge the skill branch @@ -103,7 +103,7 @@ container system status || container system start ### Test basic execution ```bash -echo '{}' | container run -i --entrypoint /bin/echo nanoclaw-agent:latest "Container OK" +echo '{}' | container run -i --entrypoint /bin/echo agentlite-agent:latest "Container OK" ``` ### Test readonly mounts @@ -112,7 +112,7 @@ echo '{}' | container run -i --entrypoint /bin/echo nanoclaw-agent:latest "Conta mkdir -p /tmp/test-ro && echo "test" > /tmp/test-ro/file.txt container run --rm --entrypoint /bin/bash \ --mount type=bind,source=/tmp/test-ro,target=/test,readonly \ - nanoclaw-agent:latest \ + agentlite-agent:latest \ -c "cat /test/file.txt && touch /test/new.txt 2>&1 || echo 'Write blocked (expected)'" rm -rf /tmp/test-ro ``` @@ -125,7 +125,7 @@ Expected: Read succeeds, write fails with "Read-only file system". mkdir -p /tmp/test-rw container run --rm --entrypoint /bin/bash \ -v /tmp/test-rw:/test \ - nanoclaw-agent:latest \ + agentlite-agent:latest \ -c "echo 'test write' > /test/new.txt && cat /test/new.txt" cat /tmp/test-rw/new.txt && rm -rf /tmp/test-rw ``` @@ -136,7 +136,7 @@ Expected: Both operations succeed. ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite ``` Send a message via WhatsApp and verify the agent responds. diff --git a/.claude/skills/customize/SKILL.md b/.claude/skills/customize/SKILL.md index 6898442124..a5daa03ae7 100644 --- a/.claude/skills/customize/SKILL.md +++ b/.claude/skills/customize/SKILL.md @@ -1,9 +1,9 @@ --- name: customize -description: Add new capabilities or modify NanoClaw behavior. Use when user wants to add channels (Telegram, Slack, email input), change triggers, add integrations, modify the router, or make any other customizations. This is an interactive skill that asks questions to understand what the user wants. +description: Add new capabilities or modify AgentLite behavior. Use when user wants to add channels (Telegram, Slack, email input), change triggers, add integrations, modify the router, or make any other customizations. This is an interactive skill that asks questions to understand what the user wants. --- -# NanoClaw Customization +# AgentLite Customization This skill helps users add capabilities or modify behavior. Use AskUserQuestion to understand what they want before making changes. @@ -93,10 +93,10 @@ Always tell the user: # Rebuild and restart npm run build # macOS: -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist # Linux: -# systemctl --user restart nanoclaw +# systemctl --user restart agentlite ``` ## Example Interaction diff --git a/.claude/skills/debug/SKILL.md b/.claude/skills/debug/SKILL.md index 03c34ded5f..fd4f566d66 100644 --- a/.claude/skills/debug/SKILL.md +++ b/.claude/skills/debug/SKILL.md @@ -3,7 +3,7 @@ name: debug description: Debug container agent issues. Use when things aren't working, container fails, authentication problems, or to understand how the container system works. Covers logs, environment variables, mounts, and common issues. --- -# NanoClaw Container Debugging +# AgentLite Container Debugging This guide covers debugging the containerized agent execution system. @@ -30,8 +30,8 @@ src/container-runner.ts container/agent-runner/ | Log | Location | Content | |-----|----------|---------| -| **Main app logs** | `logs/nanoclaw.log` | Host-side WhatsApp, routing, container spawning | -| **Main app errors** | `logs/nanoclaw.error.log` | Host-side errors | +| **Main app logs** | `logs/agentlite.log` | Host-side WhatsApp, routing, container spawning | +| **Main app errors** | `logs/agentlite.error.log` | Host-side errors | | **Container run logs** | `groups/{folder}/logs/container-*.log` | Per-run: input, mounts, stderr, stdout | | **Claude sessions** | `~/.claude/projects/` | Claude Code session history | @@ -90,7 +90,7 @@ To verify env vars are reaching the container: ```bash echo '{}' | docker run -i \ -v $(pwd)/data/env:/workspace/env-dir:ro \ - --entrypoint /bin/bash nanoclaw-agent:latest \ + --entrypoint /bin/bash agentlite-agent:latest \ -c 'export $(cat /workspace/env-dir/env | xargs); echo "OAuth: ${#CLAUDE_CODE_OAUTH_TOKEN} chars, API: ${#ANTHROPIC_API_KEY} chars"' ``` @@ -109,7 +109,7 @@ echo '{}' | docker run -i \ To check what's mounted inside a container: ```bash -docker run --rm --entrypoint /bin/bash nanoclaw-agent:latest -c 'ls -la /workspace/' +docker run --rm --entrypoint /bin/bash agentlite-agent:latest -c 'ls -la /workspace/' ``` Expected structure: @@ -131,7 +131,7 @@ Expected structure: The container runs as user `node` (uid 1000). Check ownership: ```bash -docker run --rm --entrypoint /bin/bash nanoclaw-agent:latest -c ' +docker run --rm --entrypoint /bin/bash agentlite-agent:latest -c ' whoami ls -la /workspace/ ls -la /app/ @@ -156,7 +156,7 @@ grep -A3 "Claude sessions" src/container-runner.ts ```bash docker run --rm --entrypoint /bin/bash \ -v ~/.claude:/home/node/.claude \ - nanoclaw-agent:latest -c ' + agentlite-agent:latest -c ' echo "HOME=$HOME" ls -la $HOME/.claude/projects/ 2>&1 | head -5 ' @@ -189,14 +189,14 @@ echo '{"prompt":"What is 2+2?","groupFolder":"test","chatJid":"test@g.us","isMai -v $(pwd)/data/env:/workspace/env-dir:ro \ -v $(pwd)/groups/test:/workspace/group \ -v $(pwd)/data/ipc:/workspace/ipc \ - nanoclaw-agent:latest + agentlite-agent:latest ``` ### Test Claude Code directly: ```bash docker run --rm --entrypoint /bin/bash \ -v $(pwd)/data/env:/workspace/env-dir:ro \ - nanoclaw-agent:latest -c ' + agentlite-agent:latest -c ' export $(cat /workspace/env-dir/env | xargs) claude -p "Say hello" --dangerously-skip-permissions --allowedTools "" ' @@ -204,7 +204,7 @@ docker run --rm --entrypoint /bin/bash \ ### Interactive shell in container: ```bash -docker run --rm -it --entrypoint /bin/bash nanoclaw-agent:latest +docker run --rm -it --entrypoint /bin/bash agentlite-agent:latest ``` ## SDK Options Reference @@ -248,7 +248,7 @@ docker builder prune -af docker images # Check what's in the image -docker run --rm --entrypoint /bin/bash nanoclaw-agent:latest -c ' +docker run --rm --entrypoint /bin/bash agentlite-agent:latest -c ' echo "=== Node version ===" node --version @@ -278,13 +278,13 @@ rm -rf data/sessions/ # Clear sessions for a specific group rm -rf data/sessions/{groupFolder}/.claude/ -# Also clear the session ID from NanoClaw's tracking (stored in SQLite) +# Also clear the session ID from AgentLite's tracking (stored in SQLite) sqlite3 store/messages.db "DELETE FROM sessions WHERE group_folder = '{groupFolder}'" ``` To verify session resumption is working, check the logs for the same session ID across messages: ```bash -grep "Session initialized" logs/nanoclaw.log | tail -5 +grep "Session initialized" logs/agentlite.log | tail -5 # Should show the SAME session ID for consecutive messages in the same group ``` @@ -320,7 +320,7 @@ cat data/ipc/{groupFolder}/current_tasks.json Run this to check common issues: ```bash -echo "=== Checking NanoClaw Container Setup ===" +echo "=== Checking AgentLite Container Setup ===" echo -e "\n1. Authentication configured?" [ -f .env ] && (grep -q "CLAUDE_CODE_OAUTH_TOKEN=sk-" .env || grep -q "ANTHROPIC_API_KEY=sk-" .env) && echo "OK" || echo "MISSING - add CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY to .env" @@ -332,7 +332,7 @@ echo -e "\n3. Container runtime running?" docker info &>/dev/null && echo "OK" || echo "NOT RUNNING - start Docker Desktop (macOS) or sudo systemctl start docker (Linux)" echo -e "\n4. Container image exists?" -echo '{}' | docker run -i --entrypoint /bin/echo nanoclaw-agent:latest "OK" 2>/dev/null || echo "MISSING - run ./container/build.sh" +echo '{}' | docker run -i --entrypoint /bin/echo agentlite-agent:latest "OK" 2>/dev/null || echo "MISSING - run ./container/build.sh" echo -e "\n5. Session mount path correct?" grep -q "/home/node/.claude" src/container-runner.ts 2>/dev/null && echo "OK" || echo "WRONG - should mount to /home/node/.claude/, not /root/.claude/" @@ -344,6 +344,6 @@ echo -e "\n7. Recent container logs?" ls -t groups/*/logs/container-*.log 2>/dev/null | head -3 || echo "No container logs yet" echo -e "\n8. Session continuity working?" -SESSIONS=$(grep "Session initialized" logs/nanoclaw.log 2>/dev/null | tail -5 | awk '{print $NF}' | sort -u | wc -l) +SESSIONS=$(grep "Session initialized" logs/agentlite.log 2>/dev/null | tail -5 | awk '{print $NF}' | sort -u | wc -l) [ "$SESSIONS" -le 2 ] && echo "OK (recent sessions reusing IDs)" || echo "CHECK - multiple different session IDs, may indicate resumption issues" ``` diff --git a/.claude/skills/setup/SKILL.md b/.claude/skills/setup/SKILL.md index e12e0eab5c..9e65bacbd0 100644 --- a/.claude/skills/setup/SKILL.md +++ b/.claude/skills/setup/SKILL.md @@ -1,9 +1,9 @@ --- name: setup -description: Run initial NanoClaw setup. Use when user wants to install dependencies, authenticate messaging channels, register their main channel, or start the background services. Triggers on "setup", "install", "configure nanoclaw", or first-time setup requests. +description: Run initial AgentLite setup. Use when user wants to install dependencies, authenticate messaging channels, register their main channel, or start the background services. Triggers on "setup", "install", "configure agentlite", or first-time setup requests. --- -# NanoClaw Setup +# AgentLite Setup Run setup steps automatically. Only pause when user action is required (channel authentication, configuration choices). Setup uses `bash setup.sh` for bootstrap, then `npx tsx setup/index.ts --step ` for all other steps. Steps emit structured status blocks to stdout. Verbose logs go to `logs/setup.log`. @@ -18,37 +18,37 @@ Check the git remote configuration to ensure the user has a fork and upstream is Run: - `git remote -v` -**Case A — `origin` points to `qwibitai/nanoclaw` (user cloned directly):** +**Case A — `origin` points to `qwibitai/agentlite` (user cloned directly):** -The user cloned instead of forking. AskUserQuestion: "You cloned NanoClaw directly. We recommend forking so you can push your customizations. Would you like to set up a fork?" +The user cloned instead of forking. AskUserQuestion: "You cloned AgentLite directly. We recommend forking so you can push your customizations. Would you like to set up a fork?" - Fork now (recommended) — walk them through it - Continue without fork — they'll only have local changes -If fork: instruct the user to fork `qwibitai/nanoclaw` on GitHub (they need to do this in their browser), then ask them for their GitHub username. Run: +If fork: instruct the user to fork `qwibitai/agentlite` on GitHub (they need to do this in their browser), then ask them for their GitHub username. Run: ```bash git remote rename origin upstream -git remote add origin https://github.com//nanoclaw.git +git remote add origin https://github.com//agentlite.git git push --force origin main ``` Verify with `git remote -v`. If continue without fork: add upstream so they can still pull updates: ```bash -git remote add upstream https://github.com/qwibitai/nanoclaw.git +git remote add upstream https://github.com/qwibitai/agentlite.git ``` **Case B — `origin` points to user's fork, no `upstream` remote:** Add upstream: ```bash -git remote add upstream https://github.com/qwibitai/nanoclaw.git +git remote add upstream https://github.com/qwibitai/agentlite.git ``` **Case C — both `origin` (user's fork) and `upstream` (qwibitai) exist:** Already configured. Continue. -**Verify:** `git remote -v` should show `origin` → user's repo, `upstream` → `qwibitai/nanoclaw.git`. +**Verify:** `git remote -v` should show `origin` → user's repo, `upstream` → `qwibitai/agentlite.git`. ## 1. Bootstrap (Node.js + Dependencies + OneCLI) @@ -149,7 +149,7 @@ Run `npx tsx setup/index.ts --step container -- --runtime ` and parse th ## 4. Anthropic Credentials via OneCLI -NanoClaw uses OneCLI to manage credentials — API keys are never stored in `.env` or exposed to containers. The OneCLI gateway injects them at request time. +AgentLite uses OneCLI to manage credentials — API keys are never stored in `.env` or exposed to containers. The OneCLI gateway injects them at request time. Check if a secret already exists: ```bash @@ -231,12 +231,12 @@ AskUserQuestion: Agent access to external directories? ## 7. Start Service If service already running: unload first. -- macOS: `launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist` -- Linux: `systemctl --user stop nanoclaw` (or `systemctl stop nanoclaw` if root) +- macOS: `launchctl unload ~/Library/LaunchAgents/com.agentlite.plist` +- Linux: `systemctl --user stop agentlite` (or `systemctl stop agentlite` if root) Run `npx tsx setup/index.ts --step service` and parse the status block. -**If FALLBACK=wsl_no_systemd:** WSL without systemd detected. Tell user they can either enable systemd in WSL (`echo -e "[boot]\nsystemd=true" | sudo tee /etc/wsl.conf` then restart WSL) or use the generated `start-nanoclaw.sh` wrapper. +**If FALLBACK=wsl_no_systemd:** WSL without systemd detected. Tell user they can either enable systemd in WSL (`echo -e "[boot]\nsystemd=true" | sudo tee /etc/wsl.conf` then restart WSL) or use the generated `start-agentlite.sh` wrapper. **If DOCKER_GROUP_STALE=true:** The user was added to the docker group after their session started — the systemd service can't reach the Docker socket. Ask user to run these two commands: @@ -254,8 +254,8 @@ Replace `USERNAME` with the actual username (from `whoami`). Run the two `sudo` **If SERVICE_LOADED=false:** - Read `logs/setup.log` for the error. -- macOS: check `launchctl list | grep nanoclaw`. If PID=`-` and status non-zero, read `logs/nanoclaw.error.log`. -- Linux: check `systemctl --user status nanoclaw`. +- macOS: check `launchctl list | grep agentlite`. If PID=`-` and status non-zero, read `logs/agentlite.error.log`. +- Linux: check `systemctl --user status agentlite`. - Re-run the service step after fixing. ## 8. Verify @@ -263,26 +263,26 @@ Replace `USERNAME` with the actual username (from `whoami`). Run the two `sudo` Run `npx tsx setup/index.ts --step verify` and parse the status block. **If STATUS=failed, fix each:** -- SERVICE=stopped → `npm run build`, then restart: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `systemctl --user restart nanoclaw` (Linux) or `bash start-nanoclaw.sh` (WSL nohup) +- SERVICE=stopped → `npm run build`, then restart: `launchctl kickstart -k gui/$(id -u)/com.agentlite` (macOS) or `systemctl --user restart agentlite` (Linux) or `bash start-agentlite.sh` (WSL nohup) - SERVICE=not_found → re-run step 7 - CREDENTIALS=missing → re-run step 4 (check `onecli secrets list` for Anthropic secret) - CHANNEL_AUTH shows `not_found` for any channel → re-invoke that channel's skill (e.g. `/add-telegram`) - REGISTERED_GROUPS=0 → re-invoke the channel skills from step 5 - MOUNT_ALLOWLIST=missing → `npx tsx setup/index.ts --step mounts -- --empty` -Tell user to test: send a message in their registered chat. Show: `tail -f logs/nanoclaw.log` +Tell user to test: send a message in their registered chat. Show: `tail -f logs/agentlite.log` ## Troubleshooting -**Service not starting:** Check `logs/nanoclaw.error.log`. Common: wrong Node path (re-run step 7), OneCLI not running (check `curl http://127.0.0.1:10254/api/health`), missing channel credentials (re-invoke channel skill). +**Service not starting:** Check `logs/agentlite.error.log`. Common: wrong Node path (re-run step 7), OneCLI not running (check `curl http://127.0.0.1:10254/api/health`), missing channel credentials (re-invoke channel skill). **Container agent fails ("Claude Code process exited with code 1"):** Ensure the container runtime is running — `open -a Docker` (macOS Docker), `container system start` (Apple Container), or `sudo systemctl start docker` (Linux). Check container logs in `groups/main/logs/container-*.log`. -**No response to messages:** Check trigger pattern. Main channel doesn't need prefix. Check DB: `npx tsx setup/index.ts --step verify`. Check `logs/nanoclaw.log`. +**No response to messages:** Check trigger pattern. Main channel doesn't need prefix. Check DB: `npx tsx setup/index.ts --step verify`. Check `logs/agentlite.log`. **Channel not connecting:** Verify the channel's credentials are set in `.env`. Channels auto-enable when their credentials are present. For WhatsApp: check `store/auth/creds.json` exists. For token-based channels: check token values in `.env`. Restart the service after any `.env` change. -**Unload service:** macOS: `launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist` | Linux: `systemctl --user stop nanoclaw` +**Unload service:** macOS: `launchctl unload ~/Library/LaunchAgents/com.agentlite.plist` | Linux: `systemctl --user stop agentlite` ## 9. Diagnostics diff --git a/.claude/skills/setup/diagnostics.md b/.claude/skills/setup/diagnostics.md index c6a42dbbfc..5732a6b166 100644 --- a/.claude/skills/setup/diagnostics.md +++ b/.claude/skills/setup/diagnostics.md @@ -9,7 +9,7 @@ uname -m node -p "process.versions.node.split('.')[0]" ``` -Write `/tmp/nanoclaw-diagnostics.json`. No paths, usernames, hostnames, or IP addresses. +Write `/tmp/agentlite-diagnostics.json`. No paths, usernames, hostnames, or IP addresses. ```json { @@ -18,7 +18,7 @@ Write `/tmp/nanoclaw-diagnostics.json`. No paths, usernames, hostnames, or IP ad "distinct_id": "", "properties": { "success": true, - "nanoclaw_version": "1.2.21", + "agentlite_version": "1.2.21", "os_platform": "darwin", "arch": "arm64", "node_major_version": 22, @@ -33,14 +33,14 @@ Show the entire JSON to the user and ask via AskUserQuestion: **Yes** / **No** / **Yes**: ```bash -curl -s -X POST https://us.i.posthog.com/capture/ -H 'Content-Type: application/json' -d @/tmp/nanoclaw-diagnostics.json -rm /tmp/nanoclaw-diagnostics.json +curl -s -X POST https://us.i.posthog.com/capture/ -H 'Content-Type: application/json' -d @/tmp/agentlite-diagnostics.json +rm /tmp/agentlite-diagnostics.json ``` -**No**: `rm /tmp/nanoclaw-diagnostics.json` +**No**: `rm /tmp/agentlite-diagnostics.json` **Never ask again**: 1. Replace contents of `.claude/skills/setup/diagnostics.md` with `# Diagnostics — opted out` -2. Replace contents of `.claude/skills/update-nanoclaw/diagnostics.md` with `# Diagnostics — opted out` -3. Remove the `## 9. Diagnostics` section from `.claude/skills/setup/SKILL.md` and the `## Diagnostics` section from `.claude/skills/update-nanoclaw/SKILL.md` -4. `rm /tmp/nanoclaw-diagnostics.json` +2. Replace contents of `.claude/skills/update-agentlite/diagnostics.md` with `# Diagnostics — opted out` +3. Remove the `## 9. Diagnostics` section from `.claude/skills/setup/SKILL.md` and the `## Diagnostics` section from `.claude/skills/update-agentlite/SKILL.md` +4. `rm /tmp/agentlite-diagnostics.json` diff --git a/.claude/skills/update-nanoclaw/SKILL.md b/.claude/skills/update-nanoclaw/SKILL.md index 2207910a3d..7a73fb9969 100644 --- a/.claude/skills/update-nanoclaw/SKILL.md +++ b/.claude/skills/update-nanoclaw/SKILL.md @@ -1,17 +1,17 @@ --- -name: update-nanoclaw -description: Efficiently bring upstream NanoClaw updates into a customized install, with preview, selective cherry-pick, and low token usage. +name: update-agentlite +description: Efficiently bring upstream AgentLite updates into a customized install, with preview, selective cherry-pick, and low token usage. --- # About -Your NanoClaw fork drifts from upstream as you customize it. This skill pulls upstream changes into your install without losing your modifications. +Your AgentLite fork drifts from upstream as you customize it. This skill pulls upstream changes into your install without losing your modifications. -Run `/update-nanoclaw` in Claude Code. +Run `/update-agentlite` in Claude Code. ## How it works -**Preflight**: checks for clean working tree (`git status --porcelain`). If `upstream` remote is missing, asks you for the URL (defaults to `https://github.com/qwibitai/nanoclaw.git`) and adds it. Detects the upstream branch name (`main` or `master`). +**Preflight**: checks for clean working tree (`git status --porcelain`). If `upstream` remote is missing, asks you for the URL (defaults to `https://github.com/qwibitai/agentlite.git`) and adds it. Detects the upstream branch name (`main` or `master`). **Backup**: creates a timestamped backup branch and tag (`backup/pre-update--`, `pre-update--`) before touching anything. Safe to run multiple times. @@ -50,7 +50,7 @@ Only opens files with actual conflicts. Uses `git log`, `git diff`, and `git sta --- # Goal -Help a user with a customized NanoClaw install safely incorporate upstream changes without a fresh reinstall and without blowing tokens. +Help a user with a customized AgentLite install safely incorporate upstream changes without a fresh reinstall and without blowing tokens. # Operating principles - Never proceed with a dirty working tree. @@ -68,7 +68,7 @@ If output is non-empty: Confirm remotes: - `git remote -v` If `upstream` is missing: -- Ask the user for the upstream repo URL (default: `https://github.com/qwibitai/nanoclaw.git`). +- Ask the user for the upstream repo URL (default: `https://github.com/qwibitai/agentlite.git`). - Add it: `git remote add upstream ` - Then: `git fetch upstream --prune` @@ -231,10 +231,10 @@ Tell the user: - To rollback: `git reset --hard ` - Backup branch also exists: `backup/pre-update--` - Restart the service to apply changes: - - If using launchd: `launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist && launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist` + - If using launchd: `launchctl unload ~/Library/LaunchAgents/com.agentlite.plist && launchctl load ~/Library/LaunchAgents/com.agentlite.plist` - If running manually: restart `npm run dev` ## Diagnostics -Send diagnostics data by following `.claude/skills/update-nanoclaw/diagnostics.md`. +Send diagnostics data by following `.claude/skills/update-agentlite/diagnostics.md`. diff --git a/.claude/skills/update-nanoclaw/diagnostics.md b/.claude/skills/update-nanoclaw/diagnostics.md index 8b06aa477d..2155787240 100644 --- a/.claude/skills/update-nanoclaw/diagnostics.md +++ b/.claude/skills/update-nanoclaw/diagnostics.md @@ -10,7 +10,7 @@ node -p "process.versions.node.split('.')[0]" git log -1 --format=%ci HEAD@{1} 2>/dev/null || echo "unknown" ``` -Write `/tmp/nanoclaw-diagnostics.json`. No paths, usernames, hostnames, or IP addresses. +Write `/tmp/agentlite-diagnostics.json`. No paths, usernames, hostnames, or IP addresses. ```json { @@ -19,7 +19,7 @@ Write `/tmp/nanoclaw-diagnostics.json`. No paths, usernames, hostnames, or IP ad "distinct_id": "", "properties": { "success": true, - "nanoclaw_version": "1.2.21", + "agentlite_version": "1.2.21", "os_platform": "darwin", "arch": "arm64", "node_major_version": 22, @@ -36,14 +36,14 @@ Show the entire JSON to the user and ask via AskUserQuestion: **Yes** / **No** / **Yes**: ```bash -curl -s -X POST https://us.i.posthog.com/capture/ -H 'Content-Type: application/json' -d @/tmp/nanoclaw-diagnostics.json -rm /tmp/nanoclaw-diagnostics.json +curl -s -X POST https://us.i.posthog.com/capture/ -H 'Content-Type: application/json' -d @/tmp/agentlite-diagnostics.json +rm /tmp/agentlite-diagnostics.json ``` -**No**: `rm /tmp/nanoclaw-diagnostics.json` +**No**: `rm /tmp/agentlite-diagnostics.json` **Never ask again**: 1. Replace contents of `.claude/skills/setup/diagnostics.md` with `# Diagnostics — opted out` -2. Replace contents of `.claude/skills/update-nanoclaw/diagnostics.md` with `# Diagnostics — opted out` -3. Remove the `## 9. Diagnostics` section from `.claude/skills/setup/SKILL.md` and the `## Diagnostics` section from `.claude/skills/update-nanoclaw/SKILL.md` -4. `rm /tmp/nanoclaw-diagnostics.json` +2. Replace contents of `.claude/skills/update-agentlite/diagnostics.md` with `# Diagnostics — opted out` +3. Remove the `## 9. Diagnostics` section from `.claude/skills/setup/SKILL.md` and the `## Diagnostics` section from `.claude/skills/update-agentlite/SKILL.md` +4. `rm /tmp/agentlite-diagnostics.json` diff --git a/.claude/skills/update-skills/SKILL.md b/.claude/skills/update-skills/SKILL.md index cbbff39522..ac07a7bda8 100644 --- a/.claude/skills/update-skills/SKILL.md +++ b/.claude/skills/update-skills/SKILL.md @@ -42,7 +42,7 @@ Check remotes: - `git remote -v` If `upstream` is missing: -- Ask the user for the upstream repo URL (default: `https://github.com/qwibitai/nanoclaw.git`). +- Ask the user for the upstream repo URL (default: `https://github.com/qwibitai/agentlite.git`). - `git remote add upstream ` Fetch: diff --git a/.claude/skills/use-local-whisper/SKILL.md b/.claude/skills/use-local-whisper/SKILL.md index ec18a090ee..649300d7a0 100644 --- a/.claude/skills/use-local-whisper/SKILL.md +++ b/.claude/skills/use-local-whisper/SKILL.md @@ -68,7 +68,7 @@ git remote -v If `whatsapp` is missing, add it: ```bash -git remote add whatsapp https://github.com/qwibitai/nanoclaw-whatsapp.git +git remote add whatsapp https://github.com/qwibitai/agentlite-whatsapp.git ``` ### Merge the skill branch @@ -94,24 +94,24 @@ npm run build ### Ensure launchd PATH includes Homebrew -The NanoClaw launchd service runs with a restricted PATH. `whisper-cli` and `ffmpeg` are in `/opt/homebrew/bin/` (Apple Silicon) or `/usr/local/bin/` (Intel), which may not be in the plist's PATH. +The AgentLite launchd service runs with a restricted PATH. `whisper-cli` and `ffmpeg` are in `/opt/homebrew/bin/` (Apple Silicon) or `/usr/local/bin/` (Intel), which may not be in the plist's PATH. Check the current PATH: ```bash -grep -A1 'PATH' ~/Library/LaunchAgents/com.nanoclaw.plist +grep -A1 'PATH' ~/Library/LaunchAgents/com.agentlite.plist ``` If `/opt/homebrew/bin` is missing, add it to the `` value inside the `PATH` key in the plist. Then reload: ```bash -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist ``` ### Build and restart ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite ``` ### Test @@ -121,7 +121,7 @@ Send a voice note in any registered group. The agent should receive it as `[Voic ### Check logs ```bash -tail -f logs/nanoclaw.log | grep -i -E "voice|transcri|whisper" +tail -f logs/agentlite.log | grep -i -E "voice|transcri|whisper" ``` Look for: diff --git a/.claude/skills/use-native-credential-proxy/SKILL.md b/.claude/skills/use-native-credential-proxy/SKILL.md index 288aa18f99..e097fe6037 100644 --- a/.claude/skills/use-native-credential-proxy/SKILL.md +++ b/.claude/skills/use-native-credential-proxy/SKILL.md @@ -5,7 +5,7 @@ description: Replace OneCLI gateway with the built-in credential proxy. For user # Use Native Credential Proxy -This skill replaces the OneCLI gateway with NanoClaw's built-in credential proxy. Containers get credentials injected via a local HTTP proxy that reads from `.env` — no external services needed. +This skill replaces the OneCLI gateway with AgentLite's built-in credential proxy. Containers get credentials injected via a local HTTP proxy that reads from `.env` — no external services needed. ## Phase 1: Pre-flight @@ -27,7 +27,7 @@ grep "@onecli-sh/sdk" package.json If `@onecli-sh/sdk` appears, OneCLI is the active credential provider. Proceed with Phase 2 to replace it. -If neither check matches, you may be on an older version. Run `/update-nanoclaw` first, then retry. +If neither check matches, you may be on an older version. Run `/update-agentlite` first, then retry. ## Phase 2: Apply Code Changes @@ -40,7 +40,7 @@ git remote -v If `upstream` is missing, add it: ```bash -git remote add upstream https://github.com/qwibitai/nanoclaw.git +git remote add upstream https://github.com/qwibitai/agentlite.git ``` ### Merge the skill branch @@ -119,14 +119,14 @@ npm run build ``` Then restart the service: -- macOS: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw` -- Linux: `systemctl --user restart nanoclaw` -- WSL/manual: stop and re-run `bash start-nanoclaw.sh` +- macOS: `launchctl kickstart -k gui/$(id -u)/com.agentlite` +- Linux: `systemctl --user restart agentlite` +- WSL/manual: stop and re-run `bash start-agentlite.sh` 2. Check logs for successful proxy startup: ```bash -tail -20 logs/nanoclaw.log | grep "Credential proxy" +tail -20 logs/agentlite.log | grep "Credential proxy" ``` Expected: `Credential proxy started` with port and auth mode. diff --git a/.claude/skills/x-integration/SKILL.md b/.claude/skills/x-integration/SKILL.md index 29a7be67a0..65897fcd25 100644 --- a/.claude/skills/x-integration/SKILL.md +++ b/.claude/skills/x-integration/SKILL.md @@ -1,13 +1,13 @@ --- name: x-integration -description: X (Twitter) integration for NanoClaw. Post tweets, like, reply, retweet, and quote. Use for setup, testing, or troubleshooting X functionality. Triggers on "setup x", "x integration", "twitter", "post tweet", "tweet". +description: X (Twitter) integration for AgentLite. Post tweets, like, reply, retweet, and quote. Use for setup, testing, or troubleshooting X functionality. Triggers on "setup x", "x integration", "twitter", "post tweet", "tweet". --- # X (Twitter) Integration Browser automation for X interactions via WhatsApp. -> **Compatibility:** NanoClaw v1.0.0. Directory structure may change in future versions. +> **Compatibility:** AgentLite v1.0.0. Directory structure may change in future versions. ## Features @@ -23,7 +23,7 @@ Browser automation for X interactions via WhatsApp. Before using this skill, ensure: -1. **NanoClaw is installed and running** - WhatsApp connected, service active +1. **AgentLite is installed and running** - WhatsApp connected, service active 2. **Dependencies installed**: ```bash npm ls playwright dotenv-cli || npm install playwright dotenv-cli @@ -49,9 +49,9 @@ npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts # 3. Rebuild host and restart service npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw -# Verify: launchctl list | grep nanoclaw (macOS) or systemctl --user status nanoclaw (Linux) +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite +# Verify: launchctl list | grep agentlite (macOS) or systemctl --user status agentlite (Linux) ``` ## Configuration @@ -61,7 +61,7 @@ launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS | Variable | Default | Description | |----------|---------|-------------| | `CHROME_PATH` | `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` | Chrome executable path | -| `NANOCLAW_ROOT` | `process.cwd()` | Project root directory | +| `AGENTLITE_ROOT` | `process.cwd()` | Project root directory | | `LOG_LEVEL` | `info` | Logging level (debug, info, warn, error) | Set in `.env` file (loaded via `dotenv-cli` at runtime): @@ -105,7 +105,7 @@ Paths relative to project root: |------|---------|-----| | `data/x-browser-profile/` | Chrome profile with X session | Ignored | | `data/x-auth.json` | Auth state marker | Ignored | -| `logs/nanoclaw.log` | Service logs (contains X operation logs) | Ignored | +| `logs/agentlite.log` | Service logs (contains X operation logs) | Ignored | ## Architecture @@ -154,7 +154,7 @@ Paths relative to project root: ### Integration Points -To integrate this skill into NanoClaw, make the following modifications: +To integrate this skill into AgentLite, make the following modifications: --- @@ -233,7 +233,7 @@ COPY .claude/skills/x-integration/agent.ts ./src/skills/x-integration/ ## Setup -All paths below are relative to project root (`NANOCLAW_ROOT`). +All paths below are relative to project root (`AGENTLITE_ROOT`). ### 1. Check Chrome Path @@ -272,14 +272,14 @@ cat data/x-auth.json # Should show {"authenticated": true, ...} ```bash npm run build -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` **Verify success:** ```bash -launchctl list | grep nanoclaw # macOS — should show PID and exit code 0 or - -# Linux: systemctl --user status nanoclaw +launchctl list | grep agentlite # macOS — should show PID and exit code 0 or - +# Linux: systemctl --user status agentlite ``` ## Usage via WhatsApp @@ -345,8 +345,8 @@ echo '{"content":"Test"}' | npx tsx .claude/skills/x-integration/scripts/post.ts ```bash npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS -# Linux: systemctl --user restart nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # macOS +# Linux: systemctl --user restart agentlite ``` ### Browser Lock Files @@ -363,10 +363,10 @@ rm -f data/x-browser-profile/SingletonCookie ```bash # Host logs (relative to project root) -grep -i "x_post\|x_like\|x_reply\|handleXIpc" logs/nanoclaw.log | tail -20 +grep -i "x_post\|x_like\|x_reply\|handleXIpc" logs/agentlite.log | tail -20 # Script errors -grep -i "error\|failed" logs/nanoclaw.log | tail -20 +grep -i "error\|failed" logs/agentlite.log | tail -20 ``` ### Script Timeout @@ -406,7 +406,7 @@ If MCP tools not found in container: ./container/build.sh 2>&1 | grep -i skill # Check container has the file -docker run nanoclaw-agent ls -la /app/src/skills/ +docker run agentlite-agent ls -la /app/src/skills/ ``` ## Security diff --git a/.claude/skills/x-integration/host.ts b/.claude/skills/x-integration/host.ts index a56269dbf7..586eb8afd6 100644 --- a/.claude/skills/x-integration/host.ts +++ b/.claude/skills/x-integration/host.ts @@ -28,7 +28,7 @@ async function runScript(script: string, args: object): Promise { return new Promise((resolve) => { const proc = spawn('npx', ['tsx', scriptPath], { cwd: process.cwd(), - env: { ...process.env, NANOCLAW_ROOT: process.cwd() }, + env: { ...process.env, AGENTLITE_ROOT: process.cwd() }, stdio: ['pipe', 'pipe', 'pipe'] }); diff --git a/.claude/skills/x-integration/lib/config.ts b/.claude/skills/x-integration/lib/config.ts index f56cde40a5..162b2a899d 100644 --- a/.claude/skills/x-integration/lib/config.ts +++ b/.claude/skills/x-integration/lib/config.ts @@ -8,7 +8,7 @@ import path from 'path'; // Project root - can be overridden for different deployments -const PROJECT_ROOT = process.env.NANOCLAW_ROOT || process.cwd(); +const PROJECT_ROOT = process.env.AGENTLITE_ROOT || process.cwd(); /** * Configuration object with all settings diff --git a/.github/workflows/fork-sync-skills.yml b/.github/workflows/fork-sync-skills.yml index 41916952d3..47d082bc81 100644 --- a/.github/workflows/fork-sync-skills.yml +++ b/.github/workflows/fork-sync-skills.yml @@ -22,7 +22,7 @@ concurrency: jobs: sync-and-merge: - if: github.repository != 'qwibitai/nanoclaw' + if: github.repository != 'boxlite-ai/agentlite' runs-on: ubuntu-latest steps: - uses: actions/create-github-app-token@v1 @@ -50,7 +50,7 @@ jobs: id: sync run: | # Add upstream remote - git remote add upstream https://github.com/qwibitai/nanoclaw.git + git remote add upstream https://github.com/boxlite-ai/agentlite.git git fetch upstream main # Check if upstream has new commits @@ -209,7 +209,7 @@ jobs: repo: context.repo.repo, title: `Upstream sync failed — merge conflict or build failure`, body: [ - 'The automated sync with `qwibitai/nanoclaw` main failed.', + 'The automated sync with `boxlite-ai/agentlite` main failed.', '', 'This usually means upstream made changes that conflict with this fork\'s channel code.', '', diff --git a/.github/workflows/merge-forward-skills.yml b/.github/workflows/merge-forward-skills.yml index 82471b041d..e0fc8cc15d 100644 --- a/.github/workflows/merge-forward-skills.yml +++ b/.github/workflows/merge-forward-skills.yml @@ -10,7 +10,7 @@ permissions: jobs: merge-forward: - if: github.repository == 'qwibitai/nanoclaw' + if: github.repository == 'boxlite-ai/agentlite' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -154,20 +154,20 @@ jobs: github-token: ${{ secrets.FORK_DISPATCH_TOKEN || secrets.GITHUB_TOKEN }} script: | const forks = [ - 'nanoclaw-whatsapp', - 'nanoclaw-telegram', - 'nanoclaw-discord', - 'nanoclaw-slack', - 'nanoclaw-gmail', - 'nanoclaw-docker-sandboxes', - 'nanoclaw-docker-sandbox', - 'nanoclaw-docker-sandbox-windows', + 'agentlite-whatsapp', + 'agentlite-telegram', + 'agentlite-discord', + 'agentlite-slack', + 'agentlite-gmail', + 'agentlite-docker-sandboxes', + 'agentlite-docker-sandbox', + 'agentlite-docker-sandbox-windows', ]; const sha = context.sha.substring(0, 7); for (const repo of forks) { try { await github.rest.repos.createDispatchEvent({ - owner: 'qwibitai', + owner: 'boxlite-ai', repo, event_type: 'upstream-main-updated', client_payload: { sha: context.sha }, diff --git a/.github/workflows/update-tokens.yml b/.github/workflows/update-tokens.yml index 753da18e86..8f91a2fe6c 100644 --- a/.github/workflows/update-tokens.yml +++ b/.github/workflows/update-tokens.yml @@ -27,7 +27,7 @@ jobs: - uses: ./repo-tokens id: tokens with: - include: 'src/**/*.ts container/agent-runner/src/**/*.ts container/Dockerfile container/build.sh launchd/com.nanoclaw.plist CLAUDE.md' + include: 'src/**/*.ts container/agent-runner/src/**/*.ts container/Dockerfile container/build.sh launchd/com.agentlite.plist CLAUDE.md' exclude: 'src/**/*.test.ts' badge-path: 'repo-tokens/badge.svg' diff --git a/.gitignore b/.gitignore index e259fbf669..744143859f 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,6 @@ groups/global/* .vscode/ # Skills system (local per-installation state) -.nanoclaw/ +.agentlite/ agents-sdk-docs diff --git a/CHANGELOG.md b/CHANGELOG.md index bcb6496395..960b115669 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Changelog -All notable changes to NanoClaw will be documented in this file. +All notable changes to AgentLite will be documented in this file. -## [1.2.0](https://github.com/qwibitai/nanoclaw/compare/v1.1.6...v1.2.0) +## [1.2.0](https://github.com/boxlite-ai/agentlite/compare/v1.1.6...v1.2.0) [BREAKING] WhatsApp removed from core, now a skill. Run `/add-whatsapp` to re-add (existing auth/groups preserved). - **fix:** Prevent scheduled tasks from executing twice when container runtime exceeds poll interval (#138, #669) diff --git a/CLAUDE.md b/CLAUDE.md index 0f1194c5e9..0b67d3ea8f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,7 +30,7 @@ API keys, secret keys, OAuth tokens, and auth credentials are managed by the One ## Skills -Four types of skills exist in NanoClaw. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full taxonomy and guidelines. +Four types of skills exist in AgentLite. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full taxonomy and guidelines. - **Feature skills** — merge a `skill/*` branch to add capabilities (e.g. `/add-telegram`, `/add-slack`) - **Utility skills** — ship code files alongside SKILL.md (e.g. `/claw`) @@ -42,7 +42,7 @@ Four types of skills exist in NanoClaw. See [CONTRIBUTING.md](CONTRIBUTING.md) f | `/setup` | First-time installation, authentication, service configuration | | `/customize` | Adding channels, integrations, changing behavior | | `/debug` | Container issues, logs, troubleshooting | -| `/update-nanoclaw` | Bring upstream NanoClaw updates into a customized install | +| `/update-agentlite` | Bring upstream AgentLite updates into a customized install | | `/qodo-pr-resolver` | Fetch and fix Qodo PR review issues interactively or in batch | | `/get-qodo-rules` | Load org- and repo-level coding rules from Qodo before code tasks | @@ -63,14 +63,14 @@ npm run build # Compile TypeScript Service management: ```bash # macOS (launchd) -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist -launchctl kickstart -k gui/$(id -u)/com.nanoclaw # restart +launchctl load ~/Library/LaunchAgents/com.agentlite.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist +launchctl kickstart -k gui/$(id -u)/com.agentlite # restart # Linux (systemd) -systemctl --user start nanoclaw -systemctl --user stop nanoclaw -systemctl --user restart nanoclaw +systemctl --user start agentlite +systemctl --user stop agentlite +systemctl --user restart agentlite ``` ## Troubleshooting diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a7816a281..711f28007d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,8 +4,8 @@ 1. **Check for existing work.** Search open PRs and issues before starting: ```bash - gh pr list --repo qwibitai/nanoclaw --search "" - gh issue list --repo qwibitai/nanoclaw --search "" + gh pr list --repo boxlite-ai/agentlite --search "" + gh issue list --repo boxlite-ai/agentlite --search "" ``` If a related PR or issue exists, build on it rather than duplicating effort. @@ -21,7 +21,7 @@ ## Skills -NanoClaw uses [Claude Code skills](https://code.claude.com/docs/en/skills) — markdown files with optional supporting files that teach Claude how to do something. There are four types of skills in NanoClaw, each serving a different purpose. +AgentLite uses [Claude Code skills](https://code.claude.com/docs/en/skills) — markdown files with optional supporting files that teach Claude how to do something. There are four types of skills in AgentLite, each serving a different purpose. ### Why skills? @@ -31,7 +31,7 @@ Every user should have clean and minimal code that does exactly what they need. #### 1. Feature skills (branch-based) -Add capabilities to NanoClaw by merging a git branch. The SKILL.md contains setup instructions; the actual code lives on a `skill/*` branch. +Add capabilities to AgentLite by merging a git branch. The SKILL.md contains setup instructions; the actual code lives on a `skill/*` branch. **Location:** `.claude/skills/` on `main` (instructions only), code on `skill/*` branch @@ -43,7 +43,7 @@ Add capabilities to NanoClaw by merging a git branch. The SKILL.md contains setu 3. Claude walks through interactive setup (env vars, bot creation, etc.) **Contributing a feature skill:** -1. Fork `qwibitai/nanoclaw` and branch from `main` +1. Fork `boxlite-ai/agentlite` and branch from `main` 2. Make the code changes (new files, modified source, updated `package.json`, etc.) 3. Add a SKILL.md in `.claude/skills//` with setup instructions — step 1 should be merging the branch 4. Open a PR. We'll create the `skill/` branch from your work @@ -71,7 +71,7 @@ Workflows and guides with no code changes. The SKILL.md is the entire skill — **Location:** `.claude/skills/` on `main` -**Examples:** `/setup`, `/debug`, `/customize`, `/update-nanoclaw`, `/update-skills` +**Examples:** `/setup`, `/debug`, `/customize`, `/update-agentlite`, `/update-skills` **Guidelines:** - Pure instructions — no code files, no branch merges diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 1d4a5de9cf..3a68f9784c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,6 +1,6 @@ # Contributors -Thanks to everyone who has contributed to NanoClaw! +Thanks to everyone who has contributed to AgentLite! - [Alakazam03](https://github.com/Alakazam03) — Vaibhav Aggarwal - [tydev-new](https://github.com/tydev-new) diff --git a/README.md b/README.md index 34bb1b1ba5..2a3f564140 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ ANTHROPIC_AUTH_TOKEN=your-token-here **How do I debug issues?** -Check `groups/{name}/logs/container-*.log` for agent execution logs, or `logs/nanoclaw.log` for the orchestrator log. +Check `groups/{name}/logs/container-*.log` for agent execution logs, or `logs/agentlite.log` for the orchestrator log. ## License diff --git a/README_ja.md b/README_ja.md index 011d3b7442..e98383de74 100644 --- a/README_ja.md +++ b/README_ja.md @@ -1,5 +1,5 @@

- NanoClaw + AgentLite

@@ -7,7 +7,7 @@

- nanoclaw.dev  •   + agentlite.dev  •   English  •   中文  •   Discord  •   @@ -21,40 +21,40 @@ **macOS (Apple Silicon)** ```bash -curl -fsSL https://nanoclaw.dev/install-docker-sandboxes.sh | bash +curl -fsSL https://agentlite.dev/install-docker-sandboxes.sh | bash ``` **Windows (WSL)** ```bash -curl -fsSL https://nanoclaw.dev/install-docker-sandboxes-windows.sh | bash +curl -fsSL https://agentlite.dev/install-docker-sandboxes-windows.sh | bash ``` > 現在、macOS(Apple Silicon)とWindows(x86)に対応しています。Linux対応は近日公開予定。 -

発表記事を読む →  ·  手動セットアップガイド →

+

発表記事を読む →  ·  手動セットアップガイド →

--- -## NanoClawを作った理由 +## AgentLiteを作った理由 [OpenClaw](https://github.com/openclaw/openclaw)は素晴らしいプロジェクトですが、理解しきれない複雑なソフトウェアに自分の生活へのフルアクセスを与えたまま安心して眠れるとは思えませんでした。OpenClawは約50万行のコード、53の設定ファイル、70以上の依存関係を持っています。セキュリティはアプリケーションレベル(許可リスト、ペアリングコード)であり、真のOS レベルの分離ではありません。すべてが共有メモリを持つ1つのNodeプロセスで動作します。 -NanoClawは同じコア機能を提供しますが、理解できる規模のコードベースで実現しています:1つのプロセスと少数のファイル。Claudeエージェントは単なるパーミッションチェックの背後ではなく、ファイルシステム分離された独自のLinuxコンテナで実行されます。 +AgentLiteは同じコア機能を提供しますが、理解できる規模のコードベースで実現しています:1つのプロセスと少数のファイル。Claudeエージェントは単なるパーミッションチェックの背後ではなく、ファイルシステム分離された独自のLinuxコンテナで実行されます。 ## クイックスタート ```bash -gh repo fork qwibitai/nanoclaw --clone -cd nanoclaw +gh repo fork boxlite-ai/agentlite --clone +cd agentlite claude ```
GitHub CLIなしの場合 -1. GitHub上で[qwibitai/nanoclaw](https://github.com/qwibitai/nanoclaw)をフォーク(Forkボタンをクリック) -2. `git clone https://github.com/<あなたのユーザー名>/nanoclaw.git` -3. `cd nanoclaw` +1. GitHub上で[boxlite-ai/agentlite](https://github.com/boxlite-ai/agentlite)をフォーク(Forkボタンをクリック) +2. `git clone https://github.com/<あなたのユーザー名>/agentlite.git` +3. `cd agentlite` 4. `claude`
@@ -65,11 +65,11 @@ claude ## 設計思想 -**理解できる規模。** 1つのプロセス、少数のソースファイル、マイクロサービスなし。NanoClawのコードベース全体を理解したい場合は、Claude Codeに説明を求めるだけです。 +**理解できる規模。** 1つのプロセス、少数のソースファイル、マイクロサービスなし。AgentLiteのコードベース全体を理解したい場合は、Claude Codeに説明を求めるだけです。 **分離によるセキュリティ。** エージェントはLinuxコンテナ(macOSではApple Container、またはDocker)で実行され、明示的にマウントされたものだけが見えます。コマンドはホストではなくコンテナ内で実行されるため、Bashアクセスは安全です。 -**個人ユーザー向け。** NanoClawはモノリシックなフレームワークではなく、各ユーザーのニーズに正確にフィットするソフトウェアです。肥大化するのではなく、オーダーメイドになるよう設計されています。自分のフォークを作成し、Claude Codeにニーズに合わせて変更させます。 +**個人ユーザー向け。** AgentLiteはモノリシックなフレームワークではなく、各ユーザーのニーズに正確にフィットするソフトウェアです。肥大化するのではなく、オーダーメイドになるよう設計されています。自分のフォークを作成し、Claude Codeにニーズに合わせて変更させます。 **カスタマイズ=コード変更。** 設定ファイルの肥大化なし。動作を変えたい?コードを変更するだけ。コードベースは変更しても安全な規模です。 @@ -80,7 +80,7 @@ claude **機能追加ではなくスキル。** コードベースに機能(例:Telegram対応)を追加する代わりに、コントリビューターは`/add-telegram`のような[Claude Codeスキル](https://code.claude.com/docs/en/skills)を提出し、あなたのフォークを変換します。あなたが必要なものだけを正確に実行するクリーンなコードが手に入ります。 -**最高のハーネス、最高のモデル。** NanoClawはClaude Agent SDK上で動作します。つまり、Claude Codeを直接実行しているということです。Claude Codeは高い能力を持ち、そのコーディングと問題解決能力によってNanoClawを変更・拡張し、各ユーザーに合わせてカスタマイズできます。 +**最高のハーネス、最高のモデル。** AgentLiteはClaude Agent SDK上で動作します。つまり、Claude Codeを直接実行しているということです。Claude Codeは高い能力を持ち、そのコーディングと問題解決能力によってAgentLiteを変更・拡張し、各ユーザーに合わせてカスタマイズできます。 ## サポート機能 @@ -89,7 +89,7 @@ claude - **メインチャネル** - 管理制御用のプライベートチャネル(セルフチャット)。各グループは完全に分離。 - **スケジュールタスク** - Claudeを実行し、メッセージを返せる定期ジョブ。 - **Webアクセス** - Webからのコンテンツ検索・取得。 -- **コンテナ分離** - エージェントは[Dockerサンドボックス](https://nanoclaw.dev/blog/nanoclaw-docker-sandboxes)(マイクロVM分離)、Apple Container(macOS)、またはDocker(macOS/Linux)でサンドボックス化。 +- **コンテナ分離** - エージェントは[Dockerサンドボックス](https://agentlite.dev/blog/agentlite-docker-sandboxes)(マイクロVM分離)、Apple Container(macOS)、またはDocker(macOS/Linux)でサンドボックス化。 - **エージェントスウォーム** - 複雑なタスクで協力する専門エージェントチームを起動。 - **オプション連携** - Gmail(`/add-gmail`)などをスキルで追加。 @@ -112,7 +112,7 @@ claude ## カスタマイズ -NanoClawは設定ファイルを使いません。変更するには、Claude Codeに伝えるだけです: +AgentLiteは設定ファイルを使いません。変更するには、Claude Codeに伝えるだけです: - 「トリガーワードを@Bobに変更して」 - 「今後はレスポンスをもっと短く直接的にして」 @@ -127,7 +127,7 @@ NanoClawは設定ファイルを使いません。変更するには、Claude Co **機能を追加するのではなく、スキルを追加してください。** -Telegram対応を追加したい場合、コアコードベースにTelegramを追加するPRを作成しないでください。代わりに、NanoClawをフォークし、ブランチでコード変更を行い、PRを開いてください。あなたのPRから`skill/telegram`ブランチを作成し、他のユーザーが自分のフォークにマージできるようにします。 +Telegram対応を追加したい場合、コアコードベースにTelegramを追加するPRを作成しないでください。代わりに、AgentLiteをフォークし、ブランチでコード変更を行い、PRを開いてください。あなたのPRから`skill/telegram`ブランチを作成し、他のユーザーが自分のフォークにマージできるようにします。 ユーザーは自分のフォークで`/add-telegram`を実行するだけで、あらゆるユースケースに対応しようとする肥大化したシステムではなく、必要なものだけを正確に実行するクリーンなコードが手に入ります。 @@ -185,11 +185,11 @@ Dockerはクロスプラットフォーム対応(macOS、Linux、さらにWSL2 **なぜ設定ファイルがないのか?** -設定の肥大化を避けたいからです。すべてのユーザーがNanoClawをカスタマイズし、汎用的なシステムを設定するのではなく、コードが必要なことを正確に実行するようにすべきです。設定ファイルが欲しい場合は、Claudeに追加するよう伝えることができます。 +設定の肥大化を避けたいからです。すべてのユーザーがAgentLiteをカスタマイズし、汎用的なシステムを設定するのではなく、コードが必要なことを正確に実行するようにすべきです。設定ファイルが欲しい場合は、Claudeに追加するよう伝えることができます。 **サードパーティやオープンソースモデルを使えますか?** -はい。NanoClawはClaude API互換のモデルエンドポイントに対応しています。`.env`ファイルで以下の環境変数を設定してください: +はい。AgentLiteはClaude API互換のモデルエンドポイントに対応しています。`.env`ファイルで以下の環境変数を設定してください: ```bash ANTHROPIC_BASE_URL=https://your-api-endpoint.com @@ -205,7 +205,7 @@ ANTHROPIC_AUTH_TOKEN=your-token-here **問題のデバッグ方法は?** -Claude Codeに聞いてください。「スケジューラーが動いていないのはなぜ?」「最近のログには何がある?」「このメッセージに返信がなかったのはなぜ?」これがNanoClawの基盤となるAIネイティブなアプローチです。 +Claude Codeに聞いてください。「スケジューラーが動いていないのはなぜ?」「最近のログには何がある?」「このメッセージに返信がなかったのはなぜ?」これがAgentLiteの基盤となるAIネイティブなアプローチです。 **セットアップがうまくいかない場合は?** diff --git a/README_zh.md b/README_zh.md index 681af307ca..d4a746316a 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,19 +1,19 @@

- NanoClaw + AgentLite

- NanoClaw —— 您的专属 Claude 助手,在容器中安全运行。它轻巧易懂,并能根据您的个人需求灵活定制。 + AgentLite —— 您的专属 Claude 助手,在容器中安全运行。它轻巧易懂,并能根据您的个人需求灵活定制。

- nanoclaw.dev  •   + agentlite.dev  •   English  •   日本語  •   Discord  •   34.9k tokens, 17% of context window

-通过 Claude Code,NanoClaw 可以动态重写自身代码,根据您的需求定制功能。 +通过 Claude Code,AgentLite 可以动态重写自身代码,根据您的需求定制功能。 **新功能:** 首个支持 [Agent Swarms(智能体集群)](https://code.claude.com/docs/en/agent-teams) 的 AI 助手。可轻松组建智能体团队,在您的聊天中高效协作。 @@ -21,13 +21,13 @@ [OpenClaw](https://github.com/openclaw/openclaw) 是一个令人印象深刻的项目,但我无法安心使用一个我不了解却能访问我个人隐私的软件。OpenClaw 有近 50 万行代码、53 个配置文件和 70+ 个依赖项。其安全性是应用级别的(通过白名单、配对码实现),而非操作系统级别的隔离。所有东西都在一个共享内存的 Node 进程中运行。 -NanoClaw 用一个您能快速理解的代码库,为您提供了同样的核心功能。只有一个进程,少数几个文件。智能体(Agent)运行在具有文件系统隔离的真实 Linux 容器中,而不是依赖于权限检查。 +AgentLite 用一个您能快速理解的代码库,为您提供了同样的核心功能。只有一个进程,少数几个文件。智能体(Agent)运行在具有文件系统隔离的真实 Linux 容器中,而不是依赖于权限检查。 ## 快速开始 ```bash -git clone https://github.com/qwibitai/nanoclaw.git -cd nanoclaw +git clone https://github.com/boxlite-ai/agentlite.git +cd agentlite claude ``` @@ -49,7 +49,7 @@ claude **技能(Skills)优于功能(Features):** 贡献者不应该向代码库添加新功能(例如支持 Telegram)。相反,他们应该贡献像 `/add-telegram` 这样的 [Claude Code 技能](https://code.claude.com/docs/en/skills),这些技能可以改造您的 fork。最终,您得到的是只做您需要事情的整洁代码。 -**最好的工具套件,最好的模型:** 本项目运行在 Claude Agent SDK 之上,这意味着您直接运行的就是 Claude Code。Claude Code 高度强大,其编码和问题解决能力使其能够修改和扩展 NanoClaw,为每个用户量身定制。 +**最好的工具套件,最好的模型:** 本项目运行在 Claude Agent SDK 之上,这意味着您直接运行的就是 Claude Code。Claude Code 高度强大,其编码和问题解决能力使其能够修改和扩展 AgentLite,为每个用户量身定制。 ## 功能支持 @@ -96,7 +96,7 @@ claude **不要添加功能,而是添加技能。** -如果您想添加 Telegram 支持,不要创建一个 PR 同时添加 Telegram 和 WhatsApp。而是贡献一个技能文件 (`.claude/skills/add-telegram/SKILL.md`),教 Claude Code 如何改造一个 NanoClaw 安装以使用 Telegram。 +如果您想添加 Telegram 支持,不要创建一个 PR 同时添加 Telegram 和 WhatsApp。而是贡献一个技能文件 (`.claude/skills/add-telegram/SKILL.md`),教 Claude Code 如何改造一个 AgentLite 安装以使用 Telegram。 然后用户在自己的 fork 上运行 `/add-telegram`,就能得到只做他们需要事情的整洁代码,而不是一个试图支持所有用例的臃肿系统。 @@ -158,7 +158,7 @@ Docker 提供跨平台支持(macOS 和 Linux)和成熟的生态系统。在 **我可以使用第三方或开源模型吗?** -可以。NanoClaw 支持任何 API 兼容的模型端点。在 `.env` 文件中设置以下环境变量: +可以。AgentLite 支持任何 API 兼容的模型端点。在 `.env` 文件中设置以下环境变量: ```bash ANTHROPIC_BASE_URL=https://your-api-endpoint.com diff --git a/container/agent-runner/package.json b/container/agent-runner/package.json index 42a994ebb7..cdc6e03de4 100644 --- a/container/agent-runner/package.json +++ b/container/agent-runner/package.json @@ -1,8 +1,8 @@ { - "name": "nanoclaw-agent-runner", + "name": "agentlite-agent-runner", "version": "1.0.0", "type": "module", - "description": "Container-side agent runner for NanoClaw", + "description": "Container-side agent runner for AgentLite", "main": "dist/index.js", "scripts": { "build": "tsc", diff --git a/container/agent-runner/src/index.ts b/container/agent-runner/src/index.ts index 96cb4a44ee..138eb66282 100644 --- a/container/agent-runner/src/index.ts +++ b/container/agent-runner/src/index.ts @@ -1,5 +1,5 @@ /** - * NanoClaw Agent Runner + * AgentLite Agent Runner * Runs inside a container, receives config via stdin, outputs result to stdout * * Input protocol: @@ -104,8 +104,8 @@ async function readStdin(): Promise { }); } -const OUTPUT_START_MARKER = '---NANOCLAW_OUTPUT_START---'; -const OUTPUT_END_MARKER = '---NANOCLAW_OUTPUT_END---'; +const OUTPUT_START_MARKER = '---AGENTLITE_OUTPUT_START---'; +const OUTPUT_END_MARKER = '---AGENTLITE_OUTPUT_END---'; function writeOutput(output: ContainerOutput): void { console.log(OUTPUT_START_MARKER); @@ -407,20 +407,20 @@ async function runQuery( 'TeamCreate', 'TeamDelete', 'SendMessage', 'TodoWrite', 'ToolSearch', 'Skill', 'NotebookEdit', - 'mcp__nanoclaw__*' + 'mcp__agentlite__*' ], env: sdkEnv, permissionMode: 'bypassPermissions', allowDangerouslySkipPermissions: true, settingSources: ['project', 'user'], mcpServers: { - nanoclaw: { + agentlite: { command: 'node', args: [mcpServerPath], env: { - NANOCLAW_CHAT_JID: containerInput.chatJid, - NANOCLAW_GROUP_FOLDER: containerInput.groupFolder, - NANOCLAW_IS_MAIN: containerInput.isMain ? '1' : '0', + AGENTLITE_CHAT_JID: containerInput.chatJid, + AGENTLITE_GROUP_FOLDER: containerInput.groupFolder, + AGENTLITE_IS_MAIN: containerInput.isMain ? '1' : '0', }, }, }, diff --git a/container/agent-runner/src/ipc-mcp-stdio.ts b/container/agent-runner/src/ipc-mcp-stdio.ts index 9de0138a08..ca0d5d61f8 100644 --- a/container/agent-runner/src/ipc-mcp-stdio.ts +++ b/container/agent-runner/src/ipc-mcp-stdio.ts @@ -1,5 +1,5 @@ /** - * Stdio MCP Server for NanoClaw + * Stdio MCP Server for AgentLite * Standalone process that agent teams subagents can inherit. * Reads context from environment variables, writes IPC files for the host. */ @@ -16,9 +16,9 @@ const MESSAGES_DIR = path.join(IPC_DIR, 'messages'); const TASKS_DIR = path.join(IPC_DIR, 'tasks'); // Context from environment variables (set by the agent runner) -const chatJid = process.env.NANOCLAW_CHAT_JID!; -const groupFolder = process.env.NANOCLAW_GROUP_FOLDER!; -const isMain = process.env.NANOCLAW_IS_MAIN === '1'; +const chatJid = process.env.AGENTLITE_CHAT_JID!; +const groupFolder = process.env.AGENTLITE_GROUP_FOLDER!; +const isMain = process.env.AGENTLITE_IS_MAIN === '1'; function writeIpcFile(dir: string, data: object): string { fs.mkdirSync(dir, { recursive: true }); @@ -35,7 +35,7 @@ function writeIpcFile(dir: string, data: object): string { } const server = new McpServer({ - name: 'nanoclaw', + name: 'agentlite', version: '1.0.0', }); diff --git a/container/build.sh b/container/build.sh index a1e70d36b6..55d0b6711d 100755 --- a/container/build.sh +++ b/container/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Build the NanoClaw agent container image +# Build the AgentLite agent container image set -e @@ -10,7 +10,7 @@ IMAGE_NAME="agentlite-agent" TAG="${1:-latest}" CONTAINER_RUNTIME="${CONTAINER_RUNTIME:-docker}" -echo "Building NanoClaw agent container image..." +echo "Building AgentLite agent container image..." echo "Image: ${IMAGE_NAME}:${TAG}" ${CONTAINER_RUNTIME} build -t "${IMAGE_NAME}:${TAG}" . diff --git a/container/skills/capabilities/SKILL.md b/container/skills/capabilities/SKILL.md index 8e8be1431b..23f14327c9 100644 --- a/container/skills/capabilities/SKILL.md +++ b/container/skills/capabilities/SKILL.md @@ -1,11 +1,11 @@ --- name: capabilities -description: Show what this NanoClaw instance can do — installed skills, available tools, and system info. Read-only. Use when the user asks what the bot can do, what's installed, or runs /capabilities. +description: Show what this AgentLite instance can do — installed skills, available tools, and system info. Read-only. Use when the user asks what the bot can do, what's installed, or runs /capabilities. --- # /capabilities — System Capabilities Report -Generate a structured read-only report of what this NanoClaw instance can do. +Generate a structured read-only report of what this AgentLite instance can do. **Main-channel check:** Only the main channel has `/workspace/project` mounted. Run: @@ -39,11 +39,11 @@ Read the allowed tools from your SDK configuration. You always have access to: - **Web:** WebSearch, WebFetch - **Orchestration:** Task, TaskOutput, TaskStop, TeamCreate, TeamDelete, SendMessage - **Other:** TodoWrite, ToolSearch, Skill, NotebookEdit -- **MCP:** mcp__nanoclaw__* (messaging, tasks, group management) +- **MCP:** mcp__agentlite__* (messaging, tasks, group management) ### 3. MCP server tools -The NanoClaw MCP server exposes these tools (via `mcp__nanoclaw__*` prefix): +The AgentLite MCP server exposes these tools (via `mcp__agentlite__*` prefix): - `send_message` — send a message to the user/group - `schedule_task` — schedule a recurring or one-time task - `list_tasks` — list scheduled tasks @@ -73,7 +73,7 @@ ls /workspace/extra/ 2>/dev/null && echo "Extra mounts: $(ls /workspace/extra/ 2 Present the report as a clean, readable message. Example: ``` -📋 *NanoClaw Capabilities* +📋 *AgentLite Capabilities* *Installed Skills:* • /agent-browser — Browse the web, fill forms, extract data diff --git a/container/skills/status/SKILL.md b/container/skills/status/SKILL.md index 3a99fcce84..d85a58477d 100644 --- a/container/skills/status/SKILL.md +++ b/container/skills/status/SKILL.md @@ -50,7 +50,7 @@ Confirm which tool families are available to you: - **Core:** Bash, Read, Write, Edit, Glob, Grep - **Web:** WebSearch, WebFetch - **Orchestration:** Task, TaskOutput, TaskStop, TeamCreate, TeamDelete, SendMessage -- **MCP:** mcp__nanoclaw__* (send_message, schedule_task, list_tasks, pause_task, resume_task, cancel_task, update_task, register_group) +- **MCP:** mcp__agentlite__* (send_message, schedule_task, list_tasks, pause_task, resume_task, cancel_task, update_task, register_group) ### 4. Container utilities @@ -65,7 +65,7 @@ claude --version 2>/dev/null Use the MCP tool to list tasks: ``` -Call mcp__nanoclaw__list_tasks to get scheduled tasks. +Call mcp__agentlite__list_tasks to get scheduled tasks. ``` If no tasks exist, report "No scheduled tasks." @@ -75,7 +75,7 @@ If no tasks exist, report "No scheduled tasks." Present as a clean, readable message: ``` -🔍 *NanoClaw Status* +🔍 *AgentLite Status* *Session:* • Channel: main diff --git a/docs/APPLE-CONTAINER-NETWORKING.md b/docs/APPLE-CONTAINER-NETWORKING.md index 6bde195b2a..f9ac9fd487 100644 --- a/docs/APPLE-CONTAINER-NETWORKING.md +++ b/docs/APPLE-CONTAINER-NETWORKING.md @@ -51,7 +51,7 @@ sysctl net.inet.ip.forwarding # Expected: net.inet.ip.forwarding: 1 # Test container internet access -container run --rm --entrypoint curl nanoclaw-agent:latest \ +container run --rm --entrypoint curl agentlite-agent:latest \ -s4 --connect-timeout 5 -o /dev/null -w "%{http_code}" https://api.anthropic.com # Expected: 404 diff --git a/docs/DEBUG_CHECKLIST.md b/docs/DEBUG_CHECKLIST.md index 5597067e2e..811b7b0341 100644 --- a/docs/DEBUG_CHECKLIST.md +++ b/docs/DEBUG_CHECKLIST.md @@ -1,4 +1,4 @@ -# NanoClaw Debug Checklist +# AgentLite Debug Checklist ## Known Issues (2026-02-08) @@ -15,23 +15,23 @@ Both timers fire at the same time, so containers always exit via hard SIGKILL (c ```bash # 1. Is the service running? -launchctl list | grep nanoclaw -# Expected: PID 0 com.nanoclaw (PID = running, "-" = not running, non-zero exit = crashed) +launchctl list | grep agentlite +# Expected: PID 0 com.agentlite (PID = running, "-" = not running, non-zero exit = crashed) # 2. Any running containers? -container ls --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw +container ls --format '{{.Names}} {{.Status}}' 2>/dev/null | grep agentlite # 3. Any stopped/orphaned containers? -container ls -a --format '{{.Names}} {{.Status}}' 2>/dev/null | grep nanoclaw +container ls -a --format '{{.Names}} {{.Status}}' 2>/dev/null | grep agentlite # 4. Recent errors in service log? -grep -E 'ERROR|WARN' logs/nanoclaw.log | tail -20 +grep -E 'ERROR|WARN' logs/agentlite.log | tail -20 # 5. Is WhatsApp connected? (look for last connection event) -grep -E 'Connected to WhatsApp|Connection closed|connection.*close' logs/nanoclaw.log | tail -5 +grep -E 'Connected to WhatsApp|Connection closed|connection.*close' logs/agentlite.log | tail -5 # 6. Are groups loaded? -grep 'groupCount' logs/nanoclaw.log | tail -3 +grep 'groupCount' logs/agentlite.log | tail -3 ``` ## Session Transcript Branching @@ -62,7 +62,7 @@ for i, line in enumerate(lines): ```bash # Check for recent timeouts -grep -E 'Container timeout|timed out' logs/nanoclaw.log | tail -10 +grep -E 'Container timeout|timed out' logs/agentlite.log | tail -10 # Check container log files for the timed-out container ls -lt groups/*/logs/container-*.log | head -10 @@ -71,23 +71,23 @@ ls -lt groups/*/logs/container-*.log | head -10 cat groups//logs/container-.log # Check if retries were scheduled and what happened -grep -E 'Scheduling retry|retry|Max retries' logs/nanoclaw.log | tail -10 +grep -E 'Scheduling retry|retry|Max retries' logs/agentlite.log | tail -10 ``` ## Agent Not Responding ```bash # Check if messages are being received from WhatsApp -grep 'New messages' logs/nanoclaw.log | tail -10 +grep 'New messages' logs/agentlite.log | tail -10 # Check if messages are being processed (container spawned) -grep -E 'Processing messages|Spawning container' logs/nanoclaw.log | tail -10 +grep -E 'Processing messages|Spawning container' logs/agentlite.log | tail -10 # Check if messages are being piped to active container -grep -E 'Piped messages|sendMessage' logs/nanoclaw.log | tail -10 +grep -E 'Piped messages|sendMessage' logs/agentlite.log | tail -10 # Check the queue state — any active containers? -grep -E 'Starting container|Container active|concurrency limit' logs/nanoclaw.log | tail -10 +grep -E 'Starting container|Container active|concurrency limit' logs/agentlite.log | tail -10 # Check lastAgentTimestamp vs latest message timestamp sqlite3 store/messages.db "SELECT chat_jid, MAX(timestamp) as latest FROM messages GROUP BY chat_jid ORDER BY latest DESC LIMIT 5;" @@ -97,24 +97,24 @@ sqlite3 store/messages.db "SELECT chat_jid, MAX(timestamp) as latest FROM messag ```bash # Check mount validation logs (shows on container spawn) -grep -E 'Mount validated|Mount.*REJECTED|mount' logs/nanoclaw.log | tail -10 +grep -E 'Mount validated|Mount.*REJECTED|mount' logs/agentlite.log | tail -10 # Verify the mount allowlist is readable -cat ~/.config/nanoclaw/mount-allowlist.json +cat ~/.config/agentlite/mount-allowlist.json # Check group's container_config in DB sqlite3 store/messages.db "SELECT name, container_config FROM registered_groups;" # Test-run a container to check mounts (dry run) # Replace with the group's folder name -container run -i --rm --entrypoint ls nanoclaw-agent:latest /workspace/extra/ +container run -i --rm --entrypoint ls agentlite-agent:latest /workspace/extra/ ``` ## WhatsApp Auth Issues ```bash # Check if QR code was requested (means auth expired) -grep 'QR\|authentication required\|qr' logs/nanoclaw.log | tail -5 +grep 'QR\|authentication required\|qr' logs/agentlite.log | tail -5 # Check auth files exist ls -la store/auth/ @@ -127,17 +127,17 @@ npm run auth ```bash # Restart the service -launchctl kickstart -k gui/$(id -u)/com.nanoclaw +launchctl kickstart -k gui/$(id -u)/com.agentlite # View live logs -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log # Stop the service (careful — running containers are detached, not killed) -launchctl bootout gui/$(id -u)/com.nanoclaw +launchctl bootout gui/$(id -u)/com.agentlite # Start the service -launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.agentlite.plist # Rebuild after code changes -npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw +npm run build && launchctl kickstart -k gui/$(id -u)/com.agentlite ``` diff --git a/docs/REQUIREMENTS.md b/docs/REQUIREMENTS.md index 227c9adfd6..9214fa6e10 100644 --- a/docs/REQUIREMENTS.md +++ b/docs/REQUIREMENTS.md @@ -1,4 +1,4 @@ -# NanoClaw Requirements +# AgentLite Requirements Original requirements and design decisions from the project creator. @@ -8,7 +8,7 @@ Original requirements and design decisions from the project creator. This is a lightweight, secure alternative to OpenClaw (formerly ClawBot). That project became a monstrosity - 4-5 different processes running different gateways, endless configuration files, endless integrations. It's a security nightmare where agents don't run in isolated processes; there's all kinds of leaky workarounds trying to prevent them from accessing parts of the system they shouldn't. It's impossible for anyone to realistically understand the whole codebase. When you run it you're kind of just yoloing it. -NanoClaw gives you the core functionality without that mess. +AgentLite gives you the core functionality without that mess. --- @@ -143,7 +143,7 @@ A personal Claude assistant accessible via WhatsApp, with minimal custom code. ### Scheduler - Built-in scheduler runs on the host, spawns containers for task execution -- Custom `nanoclaw` MCP server (inside container) provides scheduling tools +- Custom `agentlite` MCP server (inside container) provides scheduling tools - Tools: `schedule_task`, `list_tasks`, `pause_task`, `resume_task`, `cancel_task`, `send_message` - Tasks stored in SQLite with run history - Scheduler loop checks for due tasks every minute @@ -193,4 +193,4 @@ These are the creator's settings, stored here for reference: ## Project Name -**NanoClaw** - A reference to Clawdbot (now OpenClaw). +**AgentLite** - A reference to Clawdbot (now OpenClaw). diff --git a/docs/SECURITY.md b/docs/SECURITY.md index f423b26aea..c34e842b0b 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -1,4 +1,4 @@ -# NanoClaw Security Model +# AgentLite Security Model ## Trust Model @@ -23,7 +23,7 @@ This is the primary security boundary. Rather than relying on application-level ### 2. Mount Security -**External Allowlist** - Mount permissions stored at `~/.config/nanoclaw/mount-allowlist.json`, which is: +**External Allowlist** - Mount permissions stored at `~/.config/agentlite/mount-allowlist.json`, which is: - Outside project root - Never mounted into containers - Cannot be modified by agents diff --git a/docs/SPEC.md b/docs/SPEC.md index fbc1f24ac6..815a7db3c9 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -1,4 +1,4 @@ -# NanoClaw Specification +# AgentLite Specification A personal Claude assistant with multi-channel support, persistent memory per conversation, scheduled tasks, and container-isolated agent execution. @@ -64,7 +64,7 @@ A personal Claude assistant with multi-channel support, persistent memory per co │ │ • Read, Write, Edit, Glob, Grep (file operations) │ │ │ │ • WebSearch, WebFetch (internet access) │ │ │ │ • agent-browser (browser automation) │ │ -│ │ • mcp__nanoclaw__* (scheduler tools via IPC) │ │ +│ │ • mcp__agentlite__* (scheduler tools via IPC) │ │ │ │ │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ @@ -239,7 +239,7 @@ See existing skills (`/add-whatsapp`, `/add-telegram`, `/add-slack`, `/add-disco ## Folder Structure ``` -nanoclaw/ +agentlite/ ├── CLAUDE.md # Project context for Claude Code ├── docs/ │ ├── SPEC.md # This specification document @@ -314,12 +314,12 @@ nanoclaw/ │ └── ipc/ # Container IPC (messages/, tasks/) │ ├── logs/ # Runtime logs (gitignored) -│ ├── nanoclaw.log # Host stdout -│ └── nanoclaw.error.log # Host stderr +│ ├── agentlite.log # Host stdout +│ └── agentlite.error.log # Host stderr │ # Note: Per-container logs are in groups/{folder}/logs/container-*.log │ └── launchd/ - └── com.nanoclaw.plist # macOS service configuration + └── com.agentlite.plist # macOS service configuration ``` --- @@ -414,7 +414,7 @@ Or edit the default in `src/config.ts`. This changes: ### Placeholder Values in launchd Files with `{{PLACEHOLDER}}` values need to be configured: -- `{{PROJECT_ROOT}}` - Absolute path to your nanoclaw installation +- `{{PROJECT_ROOT}}` - Absolute path to your agentlite installation - `{{NODE_PATH}}` - Path to node binary (detected via `which node`) - `{{HOME}}` - User's home directory @@ -422,7 +422,7 @@ Files with `{{PLACEHOLDER}}` values need to be configured: ## Memory System -NanoClaw uses a hierarchical memory system based on CLAUDE.md files. +AgentLite uses a hierarchical memory system based on CLAUDE.md files. ### Memory Hierarchy @@ -498,7 +498,7 @@ Sessions enable conversation continuity - Claude remembers what you talked about ├── cwd: groups/{group-name}/ ├── prompt: conversation history + current message ├── resume: session_id (for continuity) - └── mcpServers: nanoclaw (scheduler) + └── mcpServers: agentlite (scheduler) │ ▼ 8. Claude processes message: @@ -555,7 +555,7 @@ This allows the agent to understand the conversation context even if it wasn't m ## Scheduled Tasks -NanoClaw has a built-in scheduler that runs tasks as full agents in their group's context. +AgentLite has a built-in scheduler that runs tasks as full agents in their group's context. ### How Scheduling Works @@ -577,7 +577,7 @@ NanoClaw has a built-in scheduler that runs tasks as full agents in their group' ``` User: @Andy remind me every Monday at 9am to review the weekly metrics -Claude: [calls mcp__nanoclaw__schedule_task] +Claude: [calls mcp__agentlite__schedule_task] { "prompt": "Send a reminder to review weekly metrics. Be encouraging!", "schedule_type": "cron", @@ -592,7 +592,7 @@ Claude: Done! I'll remind you every Monday at 9am. ``` User: @Andy at 5pm today, send me a summary of today's emails -Claude: [calls mcp__nanoclaw__schedule_task] +Claude: [calls mcp__agentlite__schedule_task] { "prompt": "Search for today's emails, summarize the important ones, and send the summary to the group.", "schedule_type": "once", @@ -616,9 +616,9 @@ From main channel: ## MCP Servers -### NanoClaw MCP (built-in) +### AgentLite MCP (built-in) -The `nanoclaw` MCP server is created dynamically per agent call with the current group's context. +The `agentlite` MCP server is created dynamically per agent call with the current group's context. **Available Tools:** | Tool | Purpose | @@ -636,12 +636,12 @@ The `nanoclaw` MCP server is created dynamically per agent call with the current ## Deployment -NanoClaw runs as a single macOS launchd service. +AgentLite runs as a single macOS launchd service. ### Startup Sequence -When NanoClaw starts, it: -1. **Ensures container runtime is running** - Automatically starts it if needed; kills orphaned NanoClaw containers from previous runs +When AgentLite starts, it: +1. **Ensures container runtime is running** - Automatically starts it if needed; kills orphaned AgentLite containers from previous runs 2. Initializes the SQLite database (migrates from JSON files if they exist) 3. Loads state from SQLite (registered groups, sessions, router state) 4. **Connects channels** — loops through registered channels, instantiates those with credentials, calls `connect()` on each @@ -652,16 +652,16 @@ When NanoClaw starts, it: - Recovers any unprocessed messages from before shutdown - Starts the message polling loop -### Service: com.nanoclaw +### Service: com.agentlite -**launchd/com.nanoclaw.plist:** +**launchd/com.agentlite.plist:** ```xml Label - com.nanoclaw + com.agentlite ProgramArguments {{NODE_PATH}} @@ -683,9 +683,9 @@ When NanoClaw starts, it: Andy StandardOutPath - {{PROJECT_ROOT}}/logs/nanoclaw.log + {{PROJECT_ROOT}}/logs/agentlite.log StandardErrorPath - {{PROJECT_ROOT}}/logs/nanoclaw.error.log + {{PROJECT_ROOT}}/logs/agentlite.error.log ``` @@ -694,19 +694,19 @@ When NanoClaw starts, it: ```bash # Install service -cp launchd/com.nanoclaw.plist ~/Library/LaunchAgents/ +cp launchd/com.agentlite.plist ~/Library/LaunchAgents/ # Start service -launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl load ~/Library/LaunchAgents/com.agentlite.plist # Stop service -launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist +launchctl unload ~/Library/LaunchAgents/com.agentlite.plist # Check status -launchctl list | grep nanoclaw +launchctl list | grep agentlite # View logs -tail -f logs/nanoclaw.log +tail -f logs/agentlite.log ``` --- @@ -762,8 +762,8 @@ chmod 700 groups/ | Issue | Cause | Solution | |-------|-------|----------| -| No response to messages | Service not running | Check `launchctl list | grep nanoclaw` | -| "Claude Code process exited with code 1" | Container runtime failed to start | Check logs; NanoClaw auto-starts container runtime but may fail | +| No response to messages | Service not running | Check `launchctl list | grep agentlite` | +| "Claude Code process exited with code 1" | Container runtime failed to start | Check logs; AgentLite auto-starts container runtime but may fail | | "Claude Code process exited with code 1" | Session mount path wrong | Ensure mount is to `/home/node/.claude/` not `/root/.claude/` | | Session not continuing | Session ID not saved | Check SQLite: `sqlite3 store/messages.db "SELECT * FROM sessions"` | | Session not continuing | Mount path mismatch | Container user is `node` with HOME=/home/node; sessions must be at `/home/node/.claude/` | @@ -772,8 +772,8 @@ chmod 700 groups/ ### Log Location -- `logs/nanoclaw.log` - stdout -- `logs/nanoclaw.error.log` - stderr +- `logs/agentlite.log` - stdout +- `logs/agentlite.error.log` - stderr ### Debug Mode diff --git a/docs/boxlite-migrate-plan.md b/docs/boxlite-migrate-plan.md index f568c8958e..18709bce9e 100644 --- a/docs/boxlite-migrate-plan.md +++ b/docs/boxlite-migrate-plan.md @@ -2,7 +2,7 @@ ## Context -NanoClaw previously used Docker to run agent containers via `spawn('docker', ['run', ...])`. This document describes the migration to BoxLite (`@boxlite-ai/boxlite`), an embedded VM runtime library. +AgentLite previously used Docker to run agent containers via `spawn('docker', ['run', ...])`. This document describes the migration to BoxLite (`@boxlite-ai/boxlite`), an embedded VM runtime library. **Why BoxLite?** - **Embedded library** (no daemon) vs Docker's client-server model @@ -60,7 +60,7 @@ JsExecution (running command) | | '-> execSync('docker info') <-- CHANGE: remove | | | | | |-> cleanupOrphans() [container-runtime.ts] | -| | |-> execSync('docker ps --filter name=nanoclaw-') <-- CHANGE | +| | |-> execSync('docker ps --filter name=agentlite-') <-- CHANGE | | | '-> execSync('docker stop -t 1 {name}') <-- CHANGE | | | | | '-> processMessages() -> runContainerAgent() [container-runner.ts] | @@ -144,7 +144,7 @@ JsExecution (running command) | | '-> JsBoxlite.withDefaultConfig() -> JsBoxlite singleton | | | | | |-> cleanupOrphans() [box-runtime.ts] * REWRITTEN | -| | |-> runtime.listInfo() -> JsBoxInfo[] -> filter nanoclaw-* names | +| | |-> runtime.listInfo() -> JsBoxInfo[] -> filter agentlite-* names | | | '-> runtime.remove(name, true) | | | | | '-> processMessages() -> runContainerAgent() [container-runner.ts] | @@ -282,7 +282,7 @@ Subsequent runs reuse the provisioned box state (BoxLite boxes are stateful). The agent-runner communicates via: - **Stdin**: Initial `ContainerInput` JSON (prompt, sessionId, groupFolder, etc.) -- **Stdout**: Results wrapped in `---NANOCLAW_OUTPUT_START---` / `---NANOCLAW_OUTPUT_END---` markers +- **Stdout**: Results wrapped in `---AGENTLITE_OUTPUT_START---` / `---AGENTLITE_OUTPUT_END---` markers - **IPC files** (`/workspace/ipc/input/`): Follow-up messages as JSON files, `_close` sentinel for shutdown - **IPC files** (`/workspace/ipc/`): Task snapshots, group lists, outbound messages diff --git a/docs/docker-sandboxes.md b/docs/docker-sandboxes.md index e887bad7ab..9c2ca30e54 100644 --- a/docs/docker-sandboxes.md +++ b/docs/docker-sandboxes.md @@ -1,17 +1,17 @@ -# Running NanoClaw in Docker Sandboxes (Manual Setup) +# Running AgentLite in Docker Sandboxes (Manual Setup) -This guide walks through setting up NanoClaw inside a [Docker Sandbox](https://docs.docker.com/ai/sandboxes/) from scratch — no install script, no pre-built fork. You'll clone the upstream repo, apply the necessary patches, and have agents running in full hypervisor-level isolation. +This guide walks through setting up AgentLite inside a [Docker Sandbox](https://docs.docker.com/ai/sandboxes/) from scratch — no install script, no pre-built fork. You'll clone the upstream repo, apply the necessary patches, and have agents running in full hypervisor-level isolation. ## Architecture ``` Host (macOS / Windows WSL) └── Docker Sandbox (micro VM with isolated kernel) - ├── NanoClaw process (Node.js) + ├── AgentLite process (Node.js) │ ├── Channel adapters (WhatsApp, Telegram, etc.) │ └── Container spawner → nested Docker daemon └── Docker-in-Docker - └── nanoclaw-agent containers + └── agentlite-agent containers └── Claude Agent SDK ``` @@ -39,16 +39,16 @@ On your host machine: ```bash # Create a workspace directory -mkdir -p ~/nanoclaw-workspace +mkdir -p ~/agentlite-workspace # Create a shell sandbox with the workspace mounted -docker sandbox create shell ~/nanoclaw-workspace +docker sandbox create shell ~/agentlite-workspace ``` If you're using WhatsApp, configure proxy bypass so WhatsApp's Noise protocol isn't MITM-inspected: ```bash -docker sandbox network proxy shell-nanoclaw-workspace \ +docker sandbox network proxy shell-agentlite-workspace \ --bypass-host web.whatsapp.com \ --bypass-host "*.whatsapp.com" \ --bypass-host "*.whatsapp.net" @@ -58,7 +58,7 @@ Telegram does not need proxy bypass. Enter the sandbox: ```bash -docker sandbox run shell-nanoclaw-workspace +docker sandbox run shell-agentlite-workspace ``` ## Step 2: Install Prerequisites @@ -70,21 +70,21 @@ sudo apt-get update && sudo apt-get install -y build-essential python3 npm config set strict-ssl false ``` -## Step 3: Clone and Install NanoClaw +## Step 3: Clone and Install AgentLite -NanoClaw must live inside the workspace directory — Docker-in-Docker can only bind-mount from the shared workspace path. +AgentLite must live inside the workspace directory — Docker-in-Docker can only bind-mount from the shared workspace path. ```bash # Clone to home first (virtiofs can corrupt git pack files during clone) cd ~ -git clone https://github.com/qwibitai/nanoclaw.git +git clone https://github.com/boxlite-ai/agentlite.git # Replace with YOUR workspace path (the host path you passed to `docker sandbox create`) -WORKSPACE=/Users/you/nanoclaw-workspace +WORKSPACE=/Users/you/agentlite-workspace # Move into workspace so DinD mounts work -mv nanoclaw "$WORKSPACE/nanoclaw" -cd "$WORKSPACE/nanoclaw" +mv agentlite "$WORKSPACE/agentlite" +cd "$WORKSPACE/agentlite" # Install dependencies npm install @@ -93,7 +93,7 @@ npm install https-proxy-agent ## Step 4: Apply Proxy and Sandbox Patches -NanoClaw needs several patches to work inside a Docker Sandbox. These handle proxy routing, CA certificates, and Docker-in-Docker mount restrictions. +AgentLite needs several patches to work inside a Docker Sandbox. These handle proxy routing, CA certificates, and Docker-in-Docker mount restrictions. ### 4a. Dockerfile — proxy args for container image build @@ -160,7 +160,7 @@ if (caCertSrc) { ### 4d. Container runtime — prevent self-termination -In `src/container-runtime.ts`, the `cleanupOrphans()` function matches containers by the `nanoclaw-` prefix. Inside a sandbox, the sandbox container itself may match (e.g., `nanoclaw-docker-sandbox`). Filter out the current hostname: +In `src/container-runtime.ts`, the `cleanupOrphans()` function matches containers by the `agentlite-` prefix. Inside a sandbox, the sandbox container itself may match (e.g., `agentlite-docker-sandbox`). Filter out the current hostname: ```typescript // In cleanupOrphans(), filter out os.hostname() from the list of containers to stop @@ -203,7 +203,7 @@ npm run build # Configure .env cat > .env << EOF TELEGRAM_BOT_TOKEN= -ASSISTANT_NAME=nanoclaw +ASSISTANT_NAME=agentlite ANTHROPIC_API_KEY=proxy-managed EOF mkdir -p data/env && cp .env data/env/env @@ -212,10 +212,10 @@ mkdir -p data/env && cp .env data/env/env npx tsx setup/index.ts --step register \ --jid "tg:" \ --name "My Chat" \ - --trigger "@nanoclaw" \ + --trigger "@agentlite" \ --folder "telegram_main" \ --channel telegram \ - --assistant-name "nanoclaw" \ + --assistant-name "agentlite" \ --is-main \ --no-trigger-required ``` @@ -242,7 +242,7 @@ npm run build # Configure .env cat > .env << EOF -ASSISTANT_NAME=nanoclaw +ASSISTANT_NAME=agentlite ANTHROPIC_API_KEY=proxy-managed EOF mkdir -p data/env && cp .env data/env/env @@ -259,10 +259,10 @@ npx tsx src/whatsapp-auth.ts --pairing-code --phone npx tsx setup/index.ts --step register \ --jid "@s.whatsapp.net" \ --name "My Chat" \ - --trigger "@nanoclaw" \ + --trigger "@agentlite" \ --folder "whatsapp_main" \ --channel whatsapp \ - --assistant-name "nanoclaw" \ + --assistant-name "agentlite" \ --is-main \ --no-trigger-required ``` @@ -316,12 +316,12 @@ npm config set strict-ssl false docker build \ --build-arg http_proxy=$http_proxy \ --build-arg https_proxy=$https_proxy \ - -t nanoclaw-agent:latest container/ + -t agentlite-agent:latest container/ ``` ### Agent containers fail with "path not shared" All bind-mounted paths must be under the workspace directory. Check: -- Is NanoClaw cloned into the workspace? (not `/home/agent/`) +- Is AgentLite cloned into the workspace? (not `/home/agent/`) - Is the CA cert copied to the project root? - Has the empty `.env` shadow file been created? @@ -347,13 +347,13 @@ docker sandbox network proxy \ ### Git clone fails with "inflate: data stream error" Clone to a non-workspace path first, then move: ```bash -cd ~ && git clone https://github.com/qwibitai/nanoclaw.git && mv nanoclaw /path/to/workspace/nanoclaw +cd ~ && git clone https://github.com/boxlite-ai/agentlite.git && mv agentlite /path/to/workspace/agentlite ``` ### WhatsApp QR code doesn't display Run the auth command interactively inside the sandbox (not piped through `docker sandbox exec`): ```bash -docker sandbox run shell-nanoclaw-workspace +docker sandbox run shell-agentlite-workspace # Then inside: npx tsx src/whatsapp-auth.ts ``` diff --git a/docs/skills-as-branches.md b/docs/skills-as-branches.md index 4a6db9b2ae..8e684e180e 100644 --- a/docs/skills-as-branches.md +++ b/docs/skills-as-branches.md @@ -2,9 +2,9 @@ ## Overview -This document covers **feature skills** — skills that add capabilities via git branch merges. This is the most complex skill type and the primary way NanoClaw is extended. +This document covers **feature skills** — skills that add capabilities via git branch merges. This is the most complex skill type and the primary way AgentLite is extended. -NanoClaw has four types of skills overall. See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full taxonomy: +AgentLite has four types of skills overall. See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full taxonomy: | Type | Location | How it works | |------|----------|-------------| @@ -17,15 +17,15 @@ NanoClaw has four types of skills overall. See [CONTRIBUTING.md](../CONTRIBUTING Feature skills are distributed as git branches on the upstream repository. Applying a skill is a `git merge`. Updating core is a `git merge`. Everything is standard git. -This replaces the previous `skills-engine/` system (three-way file merging, `.nanoclaw/` state, manifest files, replay, backup/restore) with plain git operations and Claude for conflict resolution. +This replaces the previous `skills-engine/` system (three-way file merging, `.agentlite/` state, manifest files, replay, backup/restore) with plain git operations and Claude for conflict resolution. ## How It Works ### Repository structure -The upstream repo (`qwibitai/nanoclaw`) maintains: +The upstream repo (`boxlite-ai/agentlite`) maintains: -- `main` — core NanoClaw (no skill code) +- `main` — core AgentLite (no skill code) - `skill/discord` — main + Discord integration - `skill/telegram` — main + Telegram integration - `skill/slack` — main + Slack integration @@ -39,20 +39,20 @@ Each skill branch contains all the code changes for that skill: new files, modif Skills are split into two categories: **Operational skills** (on `main`, always available): -- `/setup`, `/debug`, `/update-nanoclaw`, `/customize`, `/update-skills` +- `/setup`, `/debug`, `/update-agentlite`, `/customize`, `/update-skills` - These are instruction-only SKILL.md files — no code changes, just workflows - Live in `.claude/skills/` on `main`, immediately available to every user **Feature skills** (in marketplace, installed on demand): - `/add-discord`, `/add-telegram`, `/add-slack`, `/add-gmail`, etc. - Each has a SKILL.md with setup instructions and a corresponding `skill/*` branch with code -- Live in the marketplace repo (`qwibitai/nanoclaw-skills`) +- Live in the marketplace repo (`boxlite-ai/agentlite-skills`) Users never interact with the marketplace directly. The operational skills `/setup` and `/customize` handle plugin installation transparently: ```bash # Claude runs this behind the scenes — users don't see it -claude plugin install nanoclaw-skills@nanoclaw-skills --scope project +claude plugin install agentlite-skills@agentlite-skills --scope project ``` Skills are hot-loaded after `claude plugin install` — no restart needed. This means `/setup` can install the marketplace plugin, then immediately run any feature skill, all in one session. @@ -70,15 +70,15 @@ Dependent skills (e.g., `telegram-swarm` depends on `telegram`) are only offered ### Marketplace configuration -NanoClaw's `.claude/settings.json` registers the official marketplace: +AgentLite's `.claude/settings.json` registers the official marketplace: ```json { "extraKnownMarketplaces": { - "nanoclaw-skills": { + "agentlite-skills": { "source": { "source": "github", - "repo": "qwibitai/nanoclaw-skills" + "repo": "boxlite-ai/agentlite-skills" } } } @@ -88,11 +88,11 @@ NanoClaw's `.claude/settings.json` registers the official marketplace: The marketplace repo uses Claude Code's plugin structure: ``` -qwibitai/nanoclaw-skills/ +boxlite-ai/agentlite-skills/ .claude-plugin/ marketplace.json # Plugin catalog plugins/ - nanoclaw-skills/ # Single plugin bundling all official skills + agentlite-skills/ # Single plugin bundling all official skills .claude-plugin/ plugin.json # Plugin manifest skills/ @@ -105,7 +105,7 @@ qwibitai/nanoclaw-skills/ ... ``` -Multiple skills are bundled in one plugin — installing `nanoclaw-skills` makes all feature skills available at once. Individual skills don't need separate installation. +Multiple skills are bundled in one plugin — installing `agentlite-skills` makes all feature skills available at once. Individual skills don't need separate installation. Each SKILL.md tells Claude to merge the corresponding skill branch as step 1, then walks through interactive setup (env vars, bot creation, etc.). @@ -161,7 +161,7 @@ done This requires no state — it uses git history to determine which skills were previously merged and whether they have new commits. This logic is available in two ways: -- Built into `/update-nanoclaw` — after merging main, optionally check for skill updates +- Built into `/update-agentlite` — after merging main, optionally check for skill updates - Standalone `/update-skills` — check and merge skill updates independently ### Conflict resolution @@ -213,11 +213,11 @@ A GitHub Action runs on every push to `main`: ### New users (recommended) -1. Fork `qwibitai/nanoclaw` on GitHub (click the Fork button) +1. Fork `boxlite-ai/agentlite` on GitHub (click the Fork button) 2. Clone your fork: ```bash - git clone https://github.com//nanoclaw.git - cd nanoclaw + git clone https://github.com//agentlite.git + cd agentlite ``` 3. Run Claude Code: ```bash @@ -229,17 +229,17 @@ Forking is recommended because it gives users a remote to push their customizati ### Existing users migrating from clone -Users who previously ran `git clone https://github.com/qwibitai/nanoclaw.git` and have local customizations: +Users who previously ran `git clone https://github.com/boxlite-ai/agentlite.git` and have local customizations: -1. Fork `qwibitai/nanoclaw` on GitHub +1. Fork `boxlite-ai/agentlite` on GitHub 2. Reroute remotes: ```bash git remote rename origin upstream - git remote add origin https://github.com//nanoclaw.git + git remote add origin https://github.com//agentlite.git git push --force origin main ``` The `--force` is needed because the fresh fork's main is at upstream's latest, but the user wants their (possibly behind) version. The fork was just created so there's nothing to lose. -3. From this point, `origin` = their fork, `upstream` = qwibitai/nanoclaw +3. From this point, `origin` = their fork, `upstream` = boxlite-ai/agentlite ### Existing users migrating from the old skills engine @@ -261,7 +261,7 @@ Users who previously applied skills via the `skills-engine/` system have skill c 4. Claude assists by diffing your old fork against the new one to identify custom changes In both cases: -- Delete the `.nanoclaw/` directory (no longer needed) +- Delete the `.agentlite/` directory (no longer needed) - The `skills-engine/` code will be removed from upstream once all skills are migrated - `/update-skills` only tracks skills applied via branch merge — old-engine skills won't appear in update checks @@ -301,11 +301,11 @@ git merge upstream/main git push origin main ``` -This is the same as the existing `/update-nanoclaw` skill's merge path. +This is the same as the existing `/update-agentlite` skill's merge path. ### Updating skills -Run `/update-skills` or let `/update-nanoclaw` check after a core update. For each previously-merged skill branch that has new commits, Claude offers to merge the updates. +Run `/update-skills` or let `/update-agentlite` check after a core update. For each previously-merged skill branch that has new commits, Claude offers to merge the updates. ### Contributing back to upstream @@ -316,7 +316,7 @@ git fetch upstream main git checkout -b my-fix upstream/main # Make changes git push origin my-fix -# Create PR from my-fix to qwibitai/nanoclaw:main +# Create PR from my-fix to boxlite-ai/agentlite:main ``` Standard fork contribution workflow. Their custom changes stay on their main and don't leak into the PR. @@ -327,7 +327,7 @@ The flow below is for **feature skills** (branch-based). For utility skills (sel ### Contributor flow (feature skills) -1. Fork `qwibitai/nanoclaw` +1. Fork `boxlite-ai/agentlite` 2. Branch from `main` 3. Make the code changes (new channel file, modified integration points, updated package.json, .env.example additions, etc.) 4. Open a PR to `main` @@ -345,7 +345,7 @@ When a skill PR is reviewed and approved: ``` 2. Force-push to the contributor's PR branch, replacing it with a single commit that adds the contributor to `CONTRIBUTORS.md` (removing all code changes) 3. Merge the slimmed PR into `main` (just the contributor addition) -4. Add the skill's SKILL.md to the marketplace repo (`qwibitai/nanoclaw-skills`) +4. Add the skill's SKILL.md to the marketplace repo (`boxlite-ai/agentlite-skills`) This way: - The contributor gets merge credit (their PR is merged) @@ -374,41 +374,41 @@ Anyone can maintain their own fork with skill branches and their own marketplace A community contributor: -1. Maintains a fork of NanoClaw (e.g., `alice/nanoclaw`) +1. Maintains a fork of AgentLite (e.g., `alice/agentlite`) 2. Creates `skill/*` branches on their fork with their custom skills -3. Creates a marketplace repo (e.g., `alice/nanoclaw-skills`) with a `.claude-plugin/marketplace.json` and plugin structure +3. Creates a marketplace repo (e.g., `alice/agentlite-skills`) with a `.claude-plugin/marketplace.json` and plugin structure ### Adding a community marketplace -If the community contributor is trusted, they can open a PR to add their marketplace to NanoClaw's `.claude/settings.json`: +If the community contributor is trusted, they can open a PR to add their marketplace to AgentLite's `.claude/settings.json`: ```json { "extraKnownMarketplaces": { - "nanoclaw-skills": { + "agentlite-skills": { "source": { "source": "github", - "repo": "qwibitai/nanoclaw-skills" + "repo": "boxlite-ai/agentlite-skills" } }, - "alice-nanoclaw-skills": { + "alice-agentlite-skills": { "source": { "source": "github", - "repo": "alice/nanoclaw-skills" + "repo": "alice/agentlite-skills" } } } } ``` -Once merged, all NanoClaw users automatically discover the community marketplace alongside the official one. +Once merged, all AgentLite users automatically discover the community marketplace alongside the official one. ### Installing community skills `/setup` and `/customize` ask users whether they want to enable community skills. If yes, Claude installs community marketplace plugins via `claude plugin install`: ```bash -claude plugin install alice-skills@alice-nanoclaw-skills --scope project +claude plugin install alice-skills@alice-agentlite-skills --scope project ``` Community skills are hot-loaded and immediately available — no restart needed. Dependent skills are only offered after their prerequisites are met (e.g., community Telegram add-ons only after Telegram is installed). @@ -421,20 +421,20 @@ Users can also browse and install community plugins manually via `/plugin`. - **Multiple marketplaces coexist.** Users see skills from all trusted marketplaces in `/plugin`. - **Community skills use the same merge pattern.** The SKILL.md just points to a different remote: ```bash - git remote add alice https://github.com/alice/nanoclaw.git + git remote add alice https://github.com/alice/agentlite.git git fetch alice skill/my-cool-feature git merge alice/skill/my-cool-feature ``` -- **Users can also add marketplaces manually.** Even without being listed in settings.json, users can run `/plugin marketplace add alice/nanoclaw-skills` to discover skills from any source. +- **Users can also add marketplaces manually.** Even without being listed in settings.json, users can run `/plugin marketplace add alice/agentlite-skills` to discover skills from any source. - **CI is per-fork.** Each community maintainer runs their own CI to keep their skill branches merged-forward. They can use the same GitHub Action as the upstream repo. ## Flavors -A flavor is a curated fork of NanoClaw — a combination of skills, custom changes, and configuration tailored for a specific use case (e.g., "NanoClaw for Sales," "NanoClaw Minimal," "NanoClaw for Developers"). +A flavor is a curated fork of AgentLite — a combination of skills, custom changes, and configuration tailored for a specific use case (e.g., "AgentLite for Sales," "AgentLite Minimal," "AgentLite for Developers"). ### Creating a flavor -1. Fork `qwibitai/nanoclaw` +1. Fork `boxlite-ai/agentlite` 2. Merge in the skills you want 3. Make custom changes (trigger word, prompts, integrations, etc.) 4. Your fork's `main` IS the flavor @@ -443,15 +443,15 @@ A flavor is a curated fork of NanoClaw — a combination of skills, custom chang During `/setup`, users are offered a choice of flavors before any configuration happens. The setup skill reads `flavors.yaml` from the repo (shipped with upstream, always up to date) and presents options: -AskUserQuestion: "Start with a flavor or default NanoClaw?" -- Default NanoClaw -- NanoClaw for Sales — Gmail + Slack + CRM (maintained by alice) -- NanoClaw Minimal — Telegram-only, lightweight (maintained by bob) +AskUserQuestion: "Start with a flavor or default AgentLite?" +- Default AgentLite +- AgentLite for Sales — Gmail + Slack + CRM (maintained by alice) +- AgentLite Minimal — Telegram-only, lightweight (maintained by bob) If a flavor is chosen: ```bash -git remote add https://github.com/alice/nanoclaw.git +git remote add https://github.com/alice/agentlite.git git fetch main git merge /main ``` @@ -462,7 +462,7 @@ Then setup continues normally (dependencies, auth, container, service). After installation, the user's fork has three remotes: - `origin` — their fork (push customizations here) -- `upstream` — `qwibitai/nanoclaw` (core updates) +- `upstream` — `boxlite-ai/agentlite` (core updates) - `` — the flavor fork (flavor updates) ### Updating a flavor @@ -480,13 +480,13 @@ The flavor maintainer keeps their fork updated (merging upstream, updating skill ```yaml flavors: - - name: NanoClaw for Sales - repo: alice/nanoclaw + - name: AgentLite for Sales + repo: alice/agentlite description: Gmail + Slack + CRM integration, daily pipeline summaries maintainer: alice - - name: NanoClaw Minimal - repo: bob/nanoclaw + - name: AgentLite Minimal + repo: bob/agentlite description: Telegram-only, no container overhead maintainer: bob ``` @@ -497,7 +497,7 @@ Anyone can PR to add their flavor. The file is available locally when `/setup` r - **During setup** — flavor selection is offered as part of the initial setup flow - **`/browse-flavors` skill** — reads `flavors.yaml` and presents options at any time -- **GitHub topics** — flavor forks can tag themselves with `nanoclaw-flavor` for searchability +- **GitHub topics** — flavor forks can tag themselves with `agentlite-flavor` for searchability - **Discord / website** — community-curated lists ## Migration @@ -528,9 +528,9 @@ Migration from the old skills engine to branches is complete. All feature skills - `scripts/fix-skill-drift.ts`, `scripts/validate-all-skills.ts` - `.github/workflows/skill-drift.yml`, `.github/workflows/skill-pr.yml` - All `add/`, `modify/`, `tests/`, and `manifest.yaml` from skill directories -- `.nanoclaw/` state directory +- `.agentlite/` state directory -Operational skills (`setup`, `debug`, `update-nanoclaw`, `customize`, `update-skills`) remain on main in `.claude/skills/`. +Operational skills (`setup`, `debug`, `update-agentlite`, `customize`, `update-skills`) remain on main in `.claude/skills/`. ## What Changes @@ -538,16 +538,16 @@ Operational skills (`setup`, `debug`, `update-nanoclaw`, `customize`, `update-sk Before: ```bash -git clone https://github.com/qwibitai/NanoClaw.git -cd NanoClaw +git clone https://github.com/qwibitai/AgentLite.git +cd AgentLite claude ``` After: ``` -1. Fork qwibitai/nanoclaw on GitHub -2. git clone https://github.com//nanoclaw.git -3. cd nanoclaw +1. Fork boxlite-ai/agentlite on GitHub +2. git clone https://github.com//agentlite.git +3. cd agentlite 4. claude 5. /setup ``` @@ -556,9 +556,9 @@ After: Updates to the setup flow: -- Check if `upstream` remote exists; if not, add it: `git remote add upstream https://github.com/qwibitai/nanoclaw.git` +- Check if `upstream` remote exists; if not, add it: `git remote add upstream https://github.com/boxlite-ai/agentlite.git` - Check if `origin` points to the user's fork (not qwibitai). If it points to qwibitai, guide them through the fork migration. -- **Install marketplace plugin:** `claude plugin install nanoclaw-skills@nanoclaw-skills --scope project` — makes all feature skills available (hot-loaded, no restart) +- **Install marketplace plugin:** `claude plugin install agentlite-skills@agentlite-skills --scope project` — makes all feature skills available (hot-loaded, no restart) - **Ask which channels to add:** present channel options (Discord, Telegram, Slack, WhatsApp, Gmail), run corresponding `/add-*` skills for selected channels - **Offer dependent skills:** after a channel is set up, offer relevant add-ons (e.g., Agent Swarm after Telegram, voice transcription after WhatsApp) - **Optionally enable community marketplaces:** ask if the user wants community skills, install those marketplace plugins too @@ -570,10 +570,10 @@ Marketplace configuration so the official marketplace is auto-registered: ```json { "extraKnownMarketplaces": { - "nanoclaw-skills": { + "agentlite-skills": { "source": { "source": "github", - "repo": "qwibitai/nanoclaw-skills" + "repo": "boxlite-ai/agentlite-skills" } } } @@ -582,7 +582,7 @@ Marketplace configuration so the official marketplace is auto-registered: ### Skills directory on main -The `.claude/skills/` directory on `main` retains only operational skills (setup, debug, update-nanoclaw, customize, update-skills). Feature skills (add-discord, add-telegram, etc.) live in the marketplace repo, installed via `claude plugin install` during `/setup` or `/customize`. +The `.claude/skills/` directory on `main` retains only operational skills (setup, debug, update-agentlite, customize, update-skills). Feature skills (add-discord, add-telegram, etc.) live in the marketplace repo, installed via `claude plugin install` during `/setup` or `/customize`. ### Skills engine removal @@ -593,20 +593,20 @@ The following can be removed: - `scripts/uninstall-skill.ts` - `scripts/fix-skill-drift.ts` - `scripts/validate-all-skills.ts` -- `.nanoclaw/` — state directory +- `.agentlite/` — state directory - `add/` and `modify/` subdirectories from all skill directories - Feature skill SKILL.md files from `.claude/skills/` on main (they now live in the marketplace) -Operational skills (`setup`, `debug`, `update-nanoclaw`, `customize`, `update-skills`) remain on main in `.claude/skills/`. +Operational skills (`setup`, `debug`, `update-agentlite`, `customize`, `update-skills`) remain on main in `.claude/skills/`. ### New infrastructure -- **Marketplace repo** (`qwibitai/nanoclaw-skills`) — single Claude Code plugin bundling SKILL.md files for all feature skills +- **Marketplace repo** (`boxlite-ai/agentlite-skills`) — single Claude Code plugin bundling SKILL.md files for all feature skills - **CI GitHub Action** — merge-forward `main` into all `skill/*` branches on every push to `main`, using Claude (Haiku) for conflict resolution - **`/update-skills` skill** — checks for and applies skill branch updates using git history - **`CONTRIBUTORS.md`** — tracks skill contributors -### Update skill (`/update-nanoclaw`) +### Update skill (`/update-agentlite`) The update skill gets simpler with the branch-based approach. The old skills engine required replaying all applied skills after merging core updates — that entire step disappears. Skill changes are already in the user's git history, so `git merge upstream/main` just works. @@ -639,27 +639,27 @@ Users only need to re-merge a skill branch if the skill itself was updated (not > **Skills are now git branches** > -> We've simplified how skills work in NanoClaw. Instead of a custom skills engine, skills are now git branches that you merge in. +> We've simplified how skills work in AgentLite. Instead of a custom skills engine, skills are now git branches that you merge in. > > **What this means for you:** > - Applying a skill: `git fetch upstream skill/discord && git merge upstream/skill/discord` > - Updating core: `git fetch upstream main && git merge upstream/main` > - Checking for skill updates: `/update-skills` -> - No more `.nanoclaw/` state directory or skills engine +> - No more `.agentlite/` state directory or skills engine > > **We now recommend forking instead of cloning.** This gives you a remote to push your customizations to. > > **If you currently have a clone with local changes**, migrate to a fork: -> 1. Fork `qwibitai/nanoclaw` on GitHub +> 1. Fork `boxlite-ai/agentlite` on GitHub > 2. Run: > ``` > git remote rename origin upstream -> git remote add origin https://github.com//nanoclaw.git +> git remote add origin https://github.com//agentlite.git > git push --force origin main > ``` > This works even if you're way behind — just push your current state. > -> **If you previously applied skills via the old system**, your code changes are already in your working tree — nothing to redo. You can delete the `.nanoclaw/` directory. Future skills and updates use the branch-based approach. +> **If you previously applied skills via the old system**, your code changes are already in your working tree — nothing to redo. You can delete the `.agentlite/` directory. Future skills and updates use the branch-based approach. > > **Discovering skills:** Skills are now available through Claude Code's plugin marketplace. Run `/plugin` in Claude Code to browse and install available skills. @@ -668,10 +668,10 @@ Users only need to re-merge a skill branch if the skill itself was updated (not > **Contributing skills** > > To contribute a skill: -> 1. Fork `qwibitai/nanoclaw` +> 1. Fork `boxlite-ai/agentlite` > 2. Branch from `main` and make your code changes > 3. Open a regular PR > > That's it. We'll create a `skill/` branch from your PR, add you to CONTRIBUTORS.md, and add the SKILL.md to the marketplace. CI automatically keeps skill branches merged-forward with `main` using Claude to resolve any conflicts. > -> **Want to run your own skill marketplace?** Maintain skill branches on your fork and create a marketplace repo. Open a PR to add it to NanoClaw's auto-discovered marketplaces — or users can add it manually via `/plugin marketplace add`. +> **Want to run your own skill marketplace?** Maintain skill branches on your fork and create a marketplace repo. Open a PR to add it to AgentLite's auto-discovered marketplaces — or users can add it manually via `/plugin marketplace add`. diff --git a/groups/global/CLAUDE.md b/groups/global/CLAUDE.md index bb2c2d600f..4cc4b9d94d 100644 --- a/groups/global/CLAUDE.md +++ b/groups/global/CLAUDE.md @@ -16,7 +16,7 @@ You are {{ASSISTANT_NAME}}, a personal assistant. You help with tasks, answer qu Your output is sent to the user or group. -You also have `mcp__nanoclaw__send_message` which sends a message immediately while you're still working. This is useful when you want to acknowledge a request before starting longer work. +You also have `mcp__agentlite__send_message` which sends a message immediately while you're still working. This is useful when you want to acknowledge a request before starting longer work. ### Internal thoughts diff --git a/groups/main/CLAUDE.md b/groups/main/CLAUDE.md index e9fd8a6c7a..13a301d652 100644 --- a/groups/main/CLAUDE.md +++ b/groups/main/CLAUDE.md @@ -16,7 +16,7 @@ You are {{ASSISTANT_NAME}}, a personal assistant. You help with tasks, answer qu Your output is sent to the user or group. -You also have `mcp__nanoclaw__send_message` which sends a message immediately while you're still working. This is useful when you want to acknowledge a request before starting longer work. +You also have `mcp__agentlite__send_message` which sends a message immediately while you're still working. This is useful when you want to acknowledge a request before starting longer work. ### Internal thoughts @@ -217,7 +217,7 @@ After registering a group, explain the sender allowlist feature to the user: > > For closed groups with trusted members, I recommend setting up an allow-only list so only specific people can trigger me. Want me to configure that? -If the user wants to set up an allowlist, edit `~/.config/nanoclaw/sender-allowlist.json` on the host: +If the user wants to set up an allowlist, edit `~/.config/agentlite/sender-allowlist.json` on the host: ```json { @@ -235,7 +235,7 @@ If the user wants to set up an allowlist, edit `~/.config/nanoclaw/sender-allowl Notes: - Your own messages (`is_from_me`) explicitly bypass the allowlist in trigger checks. Bot messages are filtered out by the database query before trigger evaluation, so they never reach the allowlist. - If the config file doesn't exist or is invalid, all senders are allowed (fail-open) -- The config file is on the host at `~/.config/nanoclaw/sender-allowlist.json`, not inside the container +- The config file is on the host at `~/.config/agentlite/sender-allowlist.json`, not inside the container ### Removing a Group diff --git a/launchd/com.nanoclaw.plist b/launchd/com.agentlite.plist similarity index 84% rename from launchd/com.nanoclaw.plist rename to launchd/com.agentlite.plist index d2e1aae7d0..c4f13e6b50 100644 --- a/launchd/com.nanoclaw.plist +++ b/launchd/com.agentlite.plist @@ -3,7 +3,7 @@ Label - com.nanoclaw + com.agentlite ProgramArguments {{NODE_PATH}} @@ -25,8 +25,8 @@ Andy StandardOutPath - {{PROJECT_ROOT}}/logs/nanoclaw.log + {{PROJECT_ROOT}}/logs/agentlite.log StandardErrorPath - {{PROJECT_ROOT}}/logs/nanoclaw.error.log + {{PROJECT_ROOT}}/logs/agentlite.error.log diff --git a/repo-tokens/README.md b/repo-tokens/README.md index bd07f90679..f2eb0a6810 100644 --- a/repo-tokens/README.md +++ b/repo-tokens/README.md @@ -12,7 +12,7 @@ A GitHub Action that calculates the size of your codebase in terms of tokens and ## Usage ```yaml -- uses: qwibitai/nanoclaw/repo-tokens@v1 +- uses: boxlite-ai/agentlite/repo-tokens@v1 with: include: 'src/**/*.ts' exclude: 'src/**/*.test.ts' @@ -34,7 +34,7 @@ Repos using repo-tokens: | Repo | Badge | |------|-------| -| [NanoClaw](https://github.com/qwibitai/NanoClaw) | ![tokens](https://raw.githubusercontent.com/qwibitai/NanoClaw/main/repo-tokens/badge.svg) | +| [AgentLite](https://github.com/qwibitai/AgentLite) | ![tokens](https://raw.githubusercontent.com/qwibitai/AgentLite/main/repo-tokens/badge.svg) | ### Full workflow example @@ -59,7 +59,7 @@ jobs: with: python-version: '3.12' - - uses: qwibitai/nanoclaw/repo-tokens@v1 + - uses: boxlite-ai/agentlite/repo-tokens@v1 id: tokens with: include: 'src/**/*.ts' diff --git a/repo-tokens/action.yml b/repo-tokens/action.yml index 5443e6eca5..b169dfd8ff 100644 --- a/repo-tokens/action.yml +++ b/repo-tokens/action.yml @@ -114,7 +114,7 @@ runs: with open(readme_path, "r", encoding="utf-8") as f: content = f.read() - repo_tokens_url = "https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens" + repo_tokens_url = "https://github.com/boxlite-ai/agentlite/tree/main/repo-tokens" linked_badge = f'{badge}' new_content = marker_re.sub(rf"\1{linked_badge}\2", content) @@ -148,7 +148,7 @@ runs: lx = label_w // 2 vx = label_w + value_w // 2 - repo_tokens_url = "https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens" + repo_tokens_url = "https://github.com/boxlite-ai/agentlite/tree/main/repo-tokens" svg = f''' {full_desc} diff --git a/repo-tokens/badge.svg b/repo-tokens/badge.svg index 93aeb17b15..b2d24a13de 100644 --- a/repo-tokens/badge.svg +++ b/repo-tokens/badge.svg @@ -7,7 +7,7 @@ - + diff --git a/setup.sh b/setup.sh index c37f143f42..26d323409f 100755 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -# setup.sh — Bootstrap script for NanoClaw +# setup.sh — Bootstrap script for AgentLite # Handles Node.js/npm setup, then hands off to the Node.js setup modules. # This is the only bash script in the setup flow. @@ -136,7 +136,7 @@ elif [ "$NATIVE_OK" = "false" ]; then fi cat < { const { empty, json } = parseArgs(args); const homeDir = os.homedir(); - const configDir = path.join(homeDir, '.config', 'nanoclaw'); + const configDir = path.join(homeDir, '.config', 'agentlite'); const configFile = path.join(configDir, 'mount-allowlist.json'); if (isRoot()) { diff --git a/setup/platform.ts b/setup/platform.ts index 5544eacad9..8f35478227 100644 --- a/setup/platform.ts +++ b/setup/platform.ts @@ -1,5 +1,5 @@ /** - * Cross-platform detection utilities for NanoClaw setup. + * Cross-platform detection utilities for AgentLite setup. */ import { execSync } from 'child_process'; import fs from 'fs'; diff --git a/setup/service.test.ts b/setup/service.test.ts index 480b83496d..5015dfe18d 100644 --- a/setup/service.test.ts +++ b/setup/service.test.ts @@ -19,7 +19,7 @@ function generatePlist( Label - com.nanoclaw + com.agentlite ProgramArguments ${nodePath} @@ -39,9 +39,9 @@ function generatePlist( ${homeDir} StandardOutPath - ${projectRoot}/logs/nanoclaw.log + ${projectRoot}/logs/agentlite.log StandardErrorPath - ${projectRoot}/logs/nanoclaw.error.log + ${projectRoot}/logs/agentlite.error.log `; } @@ -53,7 +53,7 @@ function generateSystemdUnit( isSystem: boolean, ): string { return `[Unit] -Description=NanoClaw Personal Assistant +Description=AgentLite Personal Assistant After=network.target [Service] @@ -65,8 +65,8 @@ RestartSec=5 KillMode=process Environment=HOME=${homeDir} Environment=PATH=/usr/local/bin:/usr/bin:/bin:${homeDir}/.local/bin -StandardOutput=append:${projectRoot}/logs/nanoclaw.log -StandardError=append:${projectRoot}/logs/nanoclaw.error.log +StandardOutput=append:${projectRoot}/logs/agentlite.log +StandardError=append:${projectRoot}/logs/agentlite.error.log [Install] WantedBy=${isSystem ? 'multi-user.target' : 'default.target'}`; @@ -76,16 +76,16 @@ describe('plist generation', () => { it('contains the correct label', () => { const plist = generatePlist( '/usr/local/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', ); - expect(plist).toContain('com.nanoclaw'); + expect(plist).toContain('com.agentlite'); }); it('uses the correct node path', () => { const plist = generatePlist( '/opt/node/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', ); expect(plist).toContain('/opt/node/bin/node'); @@ -94,20 +94,20 @@ describe('plist generation', () => { it('points to dist/cli.js', () => { const plist = generatePlist( '/usr/local/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', ); - expect(plist).toContain('/home/user/nanoclaw/dist/cli.js'); + expect(plist).toContain('/home/user/agentlite/dist/cli.js'); }); it('sets log paths', () => { const plist = generatePlist( '/usr/local/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', ); - expect(plist).toContain('nanoclaw.log'); - expect(plist).toContain('nanoclaw.error.log'); + expect(plist).toContain('agentlite.log'); + expect(plist).toContain('agentlite.error.log'); }); }); @@ -115,7 +115,7 @@ describe('systemd unit generation', () => { it('user unit uses default.target', () => { const unit = generateSystemdUnit( '/usr/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', false, ); @@ -125,7 +125,7 @@ describe('systemd unit generation', () => { it('system unit uses multi-user.target', () => { const unit = generateSystemdUnit( '/usr/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', true, ); @@ -135,7 +135,7 @@ describe('systemd unit generation', () => { it('contains restart policy', () => { const unit = generateSystemdUnit( '/usr/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', false, ); @@ -146,7 +146,7 @@ describe('systemd unit generation', () => { it('uses KillMode=process to preserve detached children', () => { const unit = generateSystemdUnit( '/usr/bin/node', - '/home/user/nanoclaw', + '/home/user/agentlite', '/home/user', false, ); @@ -156,32 +156,32 @@ describe('systemd unit generation', () => { it('sets correct ExecStart', () => { const unit = generateSystemdUnit( '/usr/bin/node', - '/srv/nanoclaw', + '/srv/agentlite', '/home/user', false, ); expect(unit).toContain( - 'ExecStart=/usr/bin/node /srv/nanoclaw/dist/cli.js', + 'ExecStart=/usr/bin/node /srv/agentlite/dist/cli.js', ); }); }); describe('WSL nohup fallback', () => { it('generates a valid wrapper script', () => { - const projectRoot = '/home/user/nanoclaw'; + const projectRoot = '/home/user/agentlite'; const nodePath = '/usr/bin/node'; - const pidFile = path.join(projectRoot, 'nanoclaw.pid'); + const pidFile = path.join(projectRoot, 'agentlite.pid'); // Simulate what service.ts generates const wrapper = `#!/bin/bash set -euo pipefail cd ${JSON.stringify(projectRoot)} -nohup ${JSON.stringify(nodePath)} ${JSON.stringify(projectRoot)}/dist/cli.js >> ${JSON.stringify(projectRoot)}/logs/nanoclaw.log 2>> ${JSON.stringify(projectRoot)}/logs/nanoclaw.error.log & +nohup ${JSON.stringify(nodePath)} ${JSON.stringify(projectRoot)}/dist/cli.js >> ${JSON.stringify(projectRoot)}/logs/agentlite.log 2>> ${JSON.stringify(projectRoot)}/logs/agentlite.error.log & echo $! > ${JSON.stringify(pidFile)}`; expect(wrapper).toContain('#!/bin/bash'); expect(wrapper).toContain('nohup'); expect(wrapper).toContain(nodePath); - expect(wrapper).toContain('nanoclaw.pid'); + expect(wrapper).toContain('agentlite.pid'); }); }); diff --git a/setup/service.ts b/setup/service.ts index aff6f78040..48aa2e417a 100644 --- a/setup/service.ts +++ b/setup/service.ts @@ -77,7 +77,7 @@ function setupLaunchd( homeDir, 'Library', 'LaunchAgents', - 'com.nanoclaw.plist', + 'com.agentlite.plist', ); fs.mkdirSync(path.dirname(plistPath), { recursive: true }); @@ -86,7 +86,7 @@ function setupLaunchd( Label - com.nanoclaw + com.agentlite ProgramArguments ${nodePath} @@ -106,9 +106,9 @@ function setupLaunchd( ${homeDir} StandardOutPath - ${projectRoot}/logs/nanoclaw.log + ${projectRoot}/logs/agentlite.log StandardErrorPath - ${projectRoot}/logs/nanoclaw.error.log + ${projectRoot}/logs/agentlite.error.log `; @@ -128,7 +128,7 @@ function setupLaunchd( let serviceLoaded = false; try { const output = execSync('launchctl list', { encoding: 'utf-8' }); - serviceLoaded = output.includes('com.nanoclaw'); + serviceLoaded = output.includes('com.agentlite'); } catch { // launchctl list failed } @@ -160,7 +160,7 @@ function setupLinux( } /** - * Kill any orphaned nanoclaw node processes left from previous runs or debugging. + * Kill any orphaned agentlite node processes left from previous runs or debugging. * Prevents connection conflicts when two instances connect to the same channel simultaneously. */ function killOrphanedProcesses(projectRoot: string): void { @@ -168,7 +168,7 @@ function killOrphanedProcesses(projectRoot: string): void { execSync(`pkill -f '${projectRoot}/dist/cli\\.js' || true`, { stdio: 'ignore', }); - logger.info('Stopped any orphaned nanoclaw processes'); + logger.info('Stopped any orphaned agentlite processes'); } catch { // pkill not available or no orphans } @@ -187,7 +187,7 @@ function setupSystemd( let systemctlPrefix: string; if (runningAsRoot) { - unitPath = '/etc/systemd/system/nanoclaw.service'; + unitPath = '/etc/systemd/system/agentlite.service'; systemctlPrefix = 'systemctl'; logger.info('Running as root — installing system-level systemd unit'); } else { @@ -203,12 +203,12 @@ function setupSystemd( } const unitDir = path.join(homeDir, '.config', 'systemd', 'user'); fs.mkdirSync(unitDir, { recursive: true }); - unitPath = path.join(unitDir, 'nanoclaw.service'); + unitPath = path.join(unitDir, 'agentlite.service'); systemctlPrefix = 'systemctl --user'; } const unit = `[Unit] -Description=NanoClaw Personal Assistant +Description=AgentLite Personal Assistant After=network.target [Service] @@ -220,8 +220,8 @@ RestartSec=5 KillMode=process Environment=HOME=${homeDir} Environment=PATH=/usr/local/bin:/usr/bin:/bin:${homeDir}/.local/bin -StandardOutput=append:${projectRoot}/logs/nanoclaw.log -StandardError=append:${projectRoot}/logs/nanoclaw.error.log +StandardOutput=append:${projectRoot}/logs/agentlite.log +StandardError=append:${projectRoot}/logs/agentlite.error.log [Install] WantedBy=${runningAsRoot ? 'multi-user.target' : 'default.target'}`; @@ -229,7 +229,7 @@ WantedBy=${runningAsRoot ? 'multi-user.target' : 'default.target'}`; fs.writeFileSync(unitPath, unit); logger.info({ unitPath }, 'Wrote systemd unit'); - // Kill orphaned nanoclaw processes to avoid channel connection conflicts + // Kill orphaned agentlite processes to avoid channel connection conflicts killOrphanedProcesses(projectRoot); // Enable and start @@ -240,13 +240,13 @@ WantedBy=${runningAsRoot ? 'multi-user.target' : 'default.target'}`; } try { - execSync(`${systemctlPrefix} enable nanoclaw`, { stdio: 'ignore' }); + execSync(`${systemctlPrefix} enable agentlite`, { stdio: 'ignore' }); } catch (err) { logger.error({ err }, 'systemctl enable failed'); } try { - execSync(`${systemctlPrefix} start nanoclaw`, { stdio: 'ignore' }); + execSync(`${systemctlPrefix} start agentlite`, { stdio: 'ignore' }); } catch (err) { logger.error({ err }, 'systemctl start failed'); } @@ -254,7 +254,7 @@ WantedBy=${runningAsRoot ? 'multi-user.target' : 'default.target'}`; // Verify let serviceLoaded = false; try { - execSync(`${systemctlPrefix} is-active nanoclaw`, { stdio: 'ignore' }); + execSync(`${systemctlPrefix} is-active agentlite`, { stdio: 'ignore' }); serviceLoaded = true; } catch { // Not active @@ -278,12 +278,12 @@ function setupNohupFallback( ): void { logger.warn('No systemd detected — generating nohup wrapper script'); - const wrapperPath = path.join(projectRoot, 'start-nanoclaw.sh'); - const pidFile = path.join(projectRoot, 'nanoclaw.pid'); + const wrapperPath = path.join(projectRoot, 'start-agentlite.sh'); + const pidFile = path.join(projectRoot, 'agentlite.pid'); const lines = [ '#!/bin/bash', - '# start-nanoclaw.sh — Start NanoClaw without systemd', + '# start-agentlite.sh — Start AgentLite without systemd', `# To stop: kill \\$(cat ${pidFile})`, '', 'set -euo pipefail', @@ -294,20 +294,20 @@ function setupNohupFallback( `if [ -f ${JSON.stringify(pidFile)} ]; then`, ` OLD_PID=$(cat ${JSON.stringify(pidFile)} 2>/dev/null || echo "")`, ' if [ -n "$OLD_PID" ] && kill -0 "$OLD_PID" 2>/dev/null; then', - ' echo "Stopping existing NanoClaw (PID $OLD_PID)..."', + ' echo "Stopping existing AgentLite (PID $OLD_PID)..."', ' kill "$OLD_PID" 2>/dev/null || true', ' sleep 2', ' fi', 'fi', '', - 'echo "Starting NanoClaw..."', + 'echo "Starting AgentLite..."', `nohup ${JSON.stringify(nodePath)} ${JSON.stringify(projectRoot + '/dist/cli.js')} \\`, - ` >> ${JSON.stringify(projectRoot + '/logs/nanoclaw.log')} \\`, - ` 2>> ${JSON.stringify(projectRoot + '/logs/nanoclaw.error.log')} &`, + ` >> ${JSON.stringify(projectRoot + '/logs/agentlite.log')} \\`, + ` 2>> ${JSON.stringify(projectRoot + '/logs/agentlite.error.log')} &`, '', `echo $! > ${JSON.stringify(pidFile)}`, - 'echo "NanoClaw started (PID $!)"', - `echo "Logs: tail -f ${projectRoot}/logs/nanoclaw.log"`, + 'echo "AgentLite started (PID $!)"', + `echo "Logs: tail -f ${projectRoot}/logs/agentlite.log"`, ]; const wrapper = lines.join('\n') + '\n'; diff --git a/setup/status.ts b/setup/status.ts index bf73555272..3d53743886 100644 --- a/setup/status.ts +++ b/setup/status.ts @@ -7,7 +7,7 @@ export function emitStatus( step: string, fields: Record, ): void { - const lines = [`=== NANOCLAW SETUP: ${step} ===`]; + const lines = [`=== AGENTLITE SETUP: ${step} ===`]; for (const [key, value] of Object.entries(fields)) { lines.push(`${key}: ${value}`); } diff --git a/setup/verify.ts b/setup/verify.ts index 81d3bb3a22..ecae0ca70c 100644 --- a/setup/verify.ts +++ b/setup/verify.ts @@ -36,9 +36,9 @@ export async function run(_args: string[]): Promise { if (mgr === 'launchd') { try { const output = execSync('launchctl list', { encoding: 'utf-8' }); - if (output.includes('com.nanoclaw')) { + if (output.includes('com.agentlite')) { // Check if it has a PID (actually running) - const line = output.split('\n').find((l) => l.includes('com.nanoclaw')); + const line = output.split('\n').find((l) => l.includes('com.agentlite')); if (line) { const pidField = line.trim().split(/\s+/)[0]; service = pidField !== '-' && pidField ? 'running' : 'stopped'; @@ -50,14 +50,14 @@ export async function run(_args: string[]): Promise { } else if (mgr === 'systemd') { const prefix = isRoot() ? 'systemctl' : 'systemctl --user'; try { - execSync(`${prefix} is-active nanoclaw`, { stdio: 'ignore' }); + execSync(`${prefix} is-active agentlite`, { stdio: 'ignore' }); service = 'running'; } catch { try { const output = execSync(`${prefix} list-unit-files`, { encoding: 'utf-8', }); - if (output.includes('nanoclaw')) { + if (output.includes('agentlite')) { service = 'stopped'; } } catch { @@ -66,7 +66,7 @@ export async function run(_args: string[]): Promise { } } else { // Check for nohup PID file - const pidFile = path.join(projectRoot, 'nanoclaw.pid'); + const pidFile = path.join(projectRoot, 'agentlite.pid'); if (fs.existsSync(pidFile)) { try { const raw = fs.readFileSync(pidFile, 'utf-8').trim(); @@ -155,7 +155,7 @@ export async function run(_args: string[]): Promise { let mountAllowlist = 'missing'; if ( fs.existsSync( - path.join(homeDir, '.config', 'nanoclaw', 'mount-allowlist.json'), + path.join(homeDir, '.config', 'agentlite', 'mount-allowlist.json'), ) ) { mountAllowlist = 'configured'; diff --git a/src/box-runtime.ts b/src/box-runtime.ts index c58d0fc0ac..8a0a01d1fc 100644 --- a/src/box-runtime.ts +++ b/src/box-runtime.ts @@ -1,5 +1,5 @@ /** - * BoxLite runtime abstraction for NanoClaw. + * BoxLite runtime abstraction for AgentLite. * All runtime-specific logic lives here so swapping runtimes means changing one file. * Replaces the previous container-runtime.ts (Docker-based). */ @@ -62,14 +62,14 @@ export function ensureRuntimeReady(): void { } } -/** Kill orphaned NanoClaw boxes from previous runs. */ +/** Kill orphaned AgentLite boxes from previous runs. */ export async function cleanupOrphans(): Promise { try { const rt = getRuntime(); const boxes = await rt.listInfo(); const orphans = boxes.filter( (b: { name?: string; state: { running: boolean } }) => - b.name && b.name.startsWith('nanoclaw-') && b.state.running, + b.name && b.name.startsWith('agentlite-') && b.state.running, ); for (const box of orphans) { try { diff --git a/src/config.ts b/src/config.ts index 26ab264c9b..053f309af4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -67,13 +67,13 @@ export function getProjectRoot(): string { export let MOUNT_ALLOWLIST_PATH = path.join( HOME_DIR, '.config', - 'nanoclaw', + 'agentlite', 'mount-allowlist.json', ); export let SENDER_ALLOWLIST_PATH = path.join( HOME_DIR, '.config', - 'nanoclaw', + 'agentlite', 'sender-allowlist.json', ); export let STORE_DIR = ''; diff --git a/src/config_cli.ts b/src/config_cli.ts index 8b8f9c6ef2..26ec0cf9c3 100644 --- a/src/config_cli.ts +++ b/src/config_cli.ts @@ -65,13 +65,13 @@ export function setProjectRoot(dir: string): void { export const MOUNT_ALLOWLIST_PATH = path.join( HOME_DIR, '.config', - 'nanoclaw', + 'agentlite', 'mount-allowlist.json', ); export const SENDER_ALLOWLIST_PATH = path.join( HOME_DIR, '.config', - 'nanoclaw', + 'agentlite', 'sender-allowlist.json', ); export let STORE_DIR = path.resolve(PROJECT_ROOT, 'store'); diff --git a/src/container-runner.test.ts b/src/container-runner.test.ts index 5dcbf53809..4cf3a87ab3 100644 --- a/src/container-runner.test.ts +++ b/src/container-runner.test.ts @@ -1,20 +1,20 @@ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'; // Sentinel markers must match container-runner.ts -const OUTPUT_START_MARKER = '---NANOCLAW_OUTPUT_START---'; -const OUTPUT_END_MARKER = '---NANOCLAW_OUTPUT_END---'; +const OUTPUT_START_MARKER = '---AGENTLITE_OUTPUT_START---'; +const OUTPUT_END_MARKER = '---AGENTLITE_OUTPUT_END---'; // Mock config vi.mock('./config.js', () => ({ - PACKAGE_ROOT: '/tmp/nanoclaw-test-package', + PACKAGE_ROOT: '/tmp/agentlite-test-package', BOX_IMAGE: 'agentlite-agent:latest', BOX_ROOTFS_PATH: '', BOX_MEMORY_MIB: 2048, BOX_CPUS: 2, CONTAINER_MAX_OUTPUT_SIZE: 10485760, CONTAINER_TIMEOUT: 1800000, // 30min - DATA_DIR: '/tmp/nanoclaw-test-data', - GROUPS_DIR: '/tmp/nanoclaw-test-groups', + DATA_DIR: '/tmp/agentlite-test-data', + GROUPS_DIR: '/tmp/agentlite-test-groups', IDLE_TIMEOUT: 1800000, // 30min ONECLI_URL: 'http://localhost:10254', TIMEZONE: 'America/Los_Angeles', diff --git a/src/container-runner.ts b/src/container-runner.ts index 114d15f79a..92bcef3487 100644 --- a/src/container-runner.ts +++ b/src/container-runner.ts @@ -1,5 +1,5 @@ /** - * Container Runner for NanoClaw + * Container Runner for AgentLite * Spawns agent execution in BoxLite VMs and handles IPC */ import fs from 'fs'; @@ -53,8 +53,8 @@ export function setModelOptions(opts: { } // Sentinel markers for robust output parsing (must match agent-runner) -const OUTPUT_START_MARKER = '---NANOCLAW_OUTPUT_START---'; -const OUTPUT_END_MARKER = '---NANOCLAW_OUTPUT_END---'; +const OUTPUT_START_MARKER = '---AGENTLITE_OUTPUT_START---'; +const OUTPUT_END_MARKER = '---AGENTLITE_OUTPUT_END---'; export interface ContainerInput { prompt: string; @@ -295,7 +295,7 @@ export async function runContainerAgent( const mounts = buildVolumeMounts(group, input.isMain); const safeName = group.folder.replace(/[^a-zA-Z0-9-]/g, '-'); - const containerName = `nanoclaw-${safeName}-${Date.now()}`; + const containerName = `agentlite-${safeName}-${Date.now()}`; const agentIdentifier = input.isMain ? undefined : group.folder.toLowerCase().replace(/_/g, '-'); diff --git a/src/group-folder.test.ts b/src/group-folder.test.ts index 75a672ac54..23236226bc 100644 --- a/src/group-folder.test.ts +++ b/src/group-folder.test.ts @@ -3,8 +3,8 @@ import path from 'path'; import { describe, expect, it, vi } from 'vitest'; vi.mock('./config.js', () => ({ - GROUPS_DIR: '/tmp/nanoclaw-test/groups', - DATA_DIR: '/tmp/nanoclaw-test/data', + GROUPS_DIR: '/tmp/agentlite-test/groups', + DATA_DIR: '/tmp/agentlite-test/data', })); import { diff --git a/src/group-queue.test.ts b/src/group-queue.test.ts index df789fd381..3f7152e693 100644 --- a/src/group-queue.test.ts +++ b/src/group-queue.test.ts @@ -4,7 +4,7 @@ import { GroupQueue } from './group-queue.js'; // Mock config to control concurrency limit vi.mock('./config.js', () => ({ - DATA_DIR: '/tmp/nanoclaw-test-data', + DATA_DIR: '/tmp/agentlite-test-data', MAX_CONCURRENT_CONTAINERS: 2, })); diff --git a/src/mount-security.ts b/src/mount-security.ts index 2a0b25927a..524bad70ad 100644 --- a/src/mount-security.ts +++ b/src/mount-security.ts @@ -1,10 +1,10 @@ /** - * Mount Security Module for NanoClaw + * Mount Security Module for AgentLite * * Validates additional mounts against an allowlist stored OUTSIDE the project root. * This prevents container agents from modifying security configuration. * - * Allowlist location: ~/.config/nanoclaw/mount-allowlist.json + * Allowlist location: ~/.config/agentlite/mount-allowlist.json */ import fs from 'fs'; import os from 'os'; diff --git a/src/orchestrator.ts b/src/orchestrator.ts index 59c7ed48b6..2c4e45626e 100644 --- a/src/orchestrator.ts +++ b/src/orchestrator.ts @@ -567,7 +567,7 @@ async function startMessageLoop(): Promise { } messageLoopRunning = true; - logger.info(`NanoClaw running (trigger: @${ASSISTANT_NAME})`); + logger.info(`AgentLite running (trigger: @${ASSISTANT_NAME})`); while (true) { try { diff --git a/src/remote-control.test.ts b/src/remote-control.test.ts index 7dbf69ced3..57d7284199 100644 --- a/src/remote-control.test.ts +++ b/src/remote-control.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; // Mock config before importing the module under test vi.mock('./config.js', () => ({ - DATA_DIR: '/tmp/nanoclaw-rc-test', + DATA_DIR: '/tmp/agentlite-rc-test', })); // Mock child_process @@ -97,7 +97,7 @@ describe('remote-control', () => { }); expect(spawnMock).toHaveBeenCalledWith( 'claude', - ['remote-control', '--name', 'NanoClaw Remote'], + ['remote-control', '--name', 'AgentLite Remote'], expect.objectContaining({ cwd: '/project', detached: true }), ); expect(proc.unref).toHaveBeenCalled(); diff --git a/src/remote-control.ts b/src/remote-control.ts index f89ff39908..8c14e215aa 100644 --- a/src/remote-control.ts +++ b/src/remote-control.ts @@ -103,14 +103,14 @@ export async function startRemoteControl( } // Redirect stdout/stderr to files so the process has no pipes to the parent. - // This prevents SIGPIPE when NanoClaw restarts. + // This prevents SIGPIPE when AgentLite restarts. fs.mkdirSync(DATA_DIR, { recursive: true }); const stdoutFd = fs.openSync(stdoutFile(), 'w'); const stderrFd = fs.openSync(stderrFile(), 'w'); let proc; try { - proc = spawn('claude', ['remote-control', '--name', 'NanoClaw Remote'], { + proc = spawn('claude', ['remote-control', '--name', 'AgentLite Remote'], { cwd, stdio: ['pipe', stdoutFd, stderrFd], detached: true, diff --git a/src/types.ts b/src/types.ts index acbb08aacb..c11a4cd342 100644 --- a/src/types.ts +++ b/src/types.ts @@ -6,7 +6,7 @@ export interface AdditionalMount { /** * Mount Allowlist - Security configuration for additional mounts - * This file should be stored at ~/.config/nanoclaw/mount-allowlist.json + * This file should be stored at ~/.config/agentlite/mount-allowlist.json * and is NOT mounted into any container, making it tamper-proof from agents. */ export interface MountAllowlist {