openpencil/apps/cli/CLAUDE.md
Kayshen-X a7d73ebb62 feat(ai): pencil-style agentic design tool-loop, multi-chat tabs, #27 panel restyle
Built-in design generation now runs as an agentic MCP tool-loop (reusing the
agent-rs BuiltInProvider), gated behind OPENPENCIL_DESIGN_AGENT_LOOP / the
Settings experimental toggle; the orchestrator stays the default.

- design-agent system prompt + in-process design toolset (parity-locked with
  the MCP surface) + flag-gated Intent::Design routing
- spawn_agents execution as sequential sub-loops + live creation-mode badges
  (per-agent glow + 'N/M designing...' header)
- new MCP tools: get_guidelines, ToolSearch, get_screenshot, get_editor_state,
  export_nodes, spawn_agents; style-guide local audit
- #27 AI panel restyle: rounded tool cards + green check-rings, gray user
  bubbles, model-pill bottom toolbar, header, empty-state pills, the
  PARALLEL AGENTS (agent_team_size) 1x-6x chip dropdown
- multi-chat tabs: ChatSessions model (Deref-to-active) + tab row UI
  (switch / close / + / Cmd+T) with each run bound to its tab

Large checkpoint commit spanning the working tree (Rust shell crates).
2026-07-02 21:21:06 +08:00

2.3 KiB

apps/cli/ — OpenPencil CLI

The op command-line tool controls the OpenPencil desktop app or web server from the terminal.

Structure

apps/cli/
├── src/
│   ├── index.ts          Entry point — arg parsing, command dispatch, help text
│   ├── connection.ts     WebSocket connection to running app instance
│   ├── launcher.ts       Auto-detect and launch desktop app or web dev server
│   ├── output.ts         JSON output formatting (--pretty support)
│   └── commands/
│       ├── app.ts        start, stop, status
│       ├── design.ts     design, design:skeleton, design:content, design:refine
│       ├── document.ts   open, save, get, selection
│       ├── codegen.ts    codegen:plan, codegen:submit, codegen:assemble, codegen:clean
│       ├── import.ts     import:svg, import:figma
│       ├── install.ts    install, uninstall (openpencil-skill for AI agents)
│       ├── layout.ts     layout, find-space
│       ├── nodes.ts      insert, update, delete, move, copy, replace
│       ├── pages.ts      page list/add/remove/rename/reorder/duplicate
│       └── variables.ts  vars, vars:set, themes, themes:set, theme:save/load/list
├── dist/                 Compiled output (openpencil-cli.cjs)
├── package.json          @zseven-w/openpencil, bin: { op }
└── README.md

Commands

  • Compile: bun run cli:compile (esbuild to dist/openpencil-cli.cjs)
  • Dev run: bun run cli:dev (run from source via Bun)

Key Patterns

  • Input methods: Commands accepting JSON/DSL support inline string, @filepath, or - (stdin)
  • Connection: WebSocket to running app instance (desktop or web server)
  • Launcher: Auto-detects installed desktop app paths per platform (macOS, Windows, Linux)
  • Skill bundle: bun run cli:bundle-skill pre-generates skill-bundle.json from ../openpencil-skill/, embedded into the binary by esbuild. Falls back to git clone at runtime if the bundle is empty.
  • esbuild: Compiles with --alias:@=src to resolve web app imports, --external:canvas --external:paper
  • Output: All commands output JSON; --pretty flag for human-readable formatting
  • Global flags: --file <path> (target .op file), --page <id> (target page)