nanobot/CLAUDE.md
chengyongru 6eef3d0f15 docs: add CLAUDE.md and .agent/ guides for AI contributors
Add CLAUDE.md at the repository root to orient future Claude Code
instances, and split detailed constraints into .agent/:

- .agent/design.md    — architectural constraints (core small, duplication
  over abstraction, minimal changes, explicit over magical)
- .agent/security.md  — workspace/SSRF/shell sandbox boundaries
- .agent/gotchas.md   — config ${VAR}, Windows compat, templates,
  heartbeat virtual tool call, atomic writes, ruff format warning,
  skills extension point

Also updates .gitignore to not ignore .agent/.
2026-05-09 14:00:32 +08:00

4.1 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

nanobot is a lightweight, open-source AI agent framework written in Python with a React/TypeScript WebUI. It centers around a small agent loop that receives messages from chat channels, invokes an LLM provider, executes tools, and manages session memory.

Development Commands

# Python: run single test / lint
pytest tests/test_openai_api.py::test_function -v
ruff check nanobot/

# WebUI: dev server (proxies API/WS to gateway :8765), build, test
# Build outputs to ../nanobot/web/dist (bundled into the Python wheel)
cd webui && bun run dev      # or NANOBOT_API_URL=... bun run dev
cd webui && bun run build
cd webui && bun run test

# Gateway
nanobot gateway

High-Level Architecture

Core Data Flow

Messages flow through an async MessageBus (nanobot/bus/queue.py) that decouples chat channels from the agent core:

  1. Channels (nanobot/channels/) receive messages from external platforms and publish InboundMessage events to the bus.
  2. AgentLoop (nanobot/agent/loop.py) consumes inbound messages, builds context, and coordinates the turn.
  3. AgentRunner (nanobot/agent/runner.py) handles the actual LLM conversation loop: send messages to the provider, receive tool calls, execute tools, and stream responses.
  4. Responses are published as OutboundMessage events back to the appropriate channel.

Key Subsystems

  • Agent Loop (nanobot/agent/loop.py, runner.py): The core processing engine. AgentLoop manages session keys, hooks, and context building. AgentRunner executes the multi-turn LLM conversation with tool execution.
  • LLM Providers (nanobot/providers/): Provider implementations (Anthropic, OpenAI-compatible, Azure, GitHub Copilot, etc.) built on a common base (base.py). factory.py and registry.py handle instantiation and model discovery.
  • Channels (nanobot/channels/): Platform integrations (Telegram, Discord, Slack, Feishu, Matrix, WhatsApp, QQ, WeChat, WebSocket, etc.). manager.py discovers and coordinates them. Channels are auto-discovered via pkgutil scan + entry-point plugins.
  • Tools (nanobot/agent/tools/): Agent capabilities exposed to the LLM: filesystem (read/write/edit/list), shell execution, web search/fetch, MCP servers, cron, notebook editing, subagent spawning, and MyTool for self-modification.
  • Memory (nanobot/agent/memory.py): Session history persistence with Dream two-phase memory consolidation. Uses atomic writes with fsync for durability.
  • Session Management (nanobot/session/manager.py): Per-session history, context compaction, and TTL-based auto-compaction.
  • Config (nanobot/config/schema.py, loader.py): Pydantic-based configuration loaded from ~/.nanobot/config.json. Supports camelCase aliases for JSON compatibility.
  • Bridge (bridge/): TypeScript services (e.g. WhatsApp bridge) bundled into the wheel via pyproject.toml force-include.
  • WebUI (webui/): Vite-based React SPA that talks to the gateway over a WebSocket multiplex protocol. The dev server proxies /api, /webui, /auth, and WebSocket traffic to the gateway.

Entry Points

  • CLI: nanobot/cli/commands.py
  • Python SDK: nanobot/nanobot.py

Project-Specific Notes

Branching Strategy

See CONTRIBUTING.md for the full two-branch model (main vs nightly) and PR guidelines.

Code Style

  • Python 3.11+, asyncio throughout.
  • Line length: 100.
  • Linting: ruff with rules E, F, I, N, W (E501 ignored).
  • pytest with asyncio_mode = "auto".

Common File Locations

  • Config schema: nanobot/config/schema.py
  • Provider base / new provider template: nanobot/providers/base.py
  • Channel base / new channel template: nanobot/channels/base.py
  • Tool registry: nanobot/agent/tools/registry.py
  • WebUI dev proxy config: webui/vite.config.ts
  • Tests mirror the nanobot/ package structure.