@ikkin/pancode
v0.1.7
Published
pancode — a Node-first agentic CLI: streaming tool loop, sub-agents, permissions, MCP, plan mode, memory.
Readme
pancode
Node-first agentic CLI — streaming tool loop, sub-agents, permissions, MCP, plan mode, memory.
Install
npm i -g @ikkin/pancodeThen run pan in any directory:
pan # interactive REPL
pan "fix this bug" # single-shot task
echo "..." | pan -p # pipe modeConfiguration
Configuration is pancode-native and layered, highest priority first:
| Layer | Location | Notes |
|---|---|---|
| 1. Process env | system/terminal environment | never overridden |
| 2. Project .env | .env in the current directory | per-project overrides |
| 3. Global .env | ~/.pancode/.env (Windows: %USERPROFILE%\.pancode\.env) | fallback for any directory |
| 4. settings.json env | .pan → .pancode settings files | injected last, only fills unset vars |
pancode reads only its own config — .claude/Claude Code settings and
ANTHROPIC_* variables are never consulted, so the two tools can't fight
over models, endpoints, or keys.
settings.json layers
Settings (model, effort, permissions, hooks, env) load from two
files, lowest to highest priority — later files win per-key:
~/.pancode/settings.json— pancode user settings.pan/settings.json— pancode project settings
Model precedence overall: --model > settings model > PAN_MODEL env >
deepseek-chat (default).
Variables
| Variable | Purpose |
|---|---|
| PAN_API_KEY | API key |
| PAN_BASE_URL | API base URL (e.g. https://api.deepseek.com/anthropic) |
| PAN_MODEL | default model |
Renamed in 0.1.6:
ANTHROPIC_API_KEY/BASE_URL/MODEL(andANTHROPIC_AUTH_TOKEN) are gone — migrate to thePAN_*names above.
Example global config
# ~/.pancode/.env (create the file — loaded automatically on every `pan` run)
PAN_API_KEY=sk-xxx
PAN_BASE_URL=https://api.deepseek.com/anthropic
PAN_MODEL=deepseek-v4-flash// ~/.pancode/settings.json (optional; .pan/settings.json overrides per project)
{ "model": "deepseek-v4-flash", "effort": "high" }Plugins
A plugin is a directory dropped into .pan/plugins/<name>/ (project) or
~/.pancode/plugins/<name>/ (user; project wins on name collisions). It can
contribute any mix of:
| Path | Contributes |
|---|---|
| plugin.json | { name, version?, description?, disabled? } (optional) |
| commands/*.md | slash commands — frontmatter description / argument-hint + a prompt template ($ARGUMENTS, $1..$9) |
| agents/*.md | agent definitions (same format as .claude/agents) |
| skills/<n>/SKILL.md | skills (same format as .claude/skills) |
| hooks/hooks.json | hooks merged into the session's hook config |
| mcp.json | MCP servers (stdio or {"type":"http","url":…}) |
See .pan/plugins/demo-toolkit/ for a working
example. /plugin lists loaded plugins; /plugin reload re-scans without a
restart. Plugin commands can't shadow built-ins.
Key features
- Sub-agents: Explore / Plan / CodeReviewer / GeneralPurpose, plus custom
.claude/agents/*.md - Permission modes:
default/acceptEdits/plan/bypassPermissions—/mode, Shift+Tab,--permission-mode - Effort levels:
off|low|medium|high|max—/effort,--effort - Tools (24): Bash/Read/Edit/Write/Glob/Grep/NotebookEdit/WebFetch/WebSearch/TodoWrite/Task×3/Cron×3/Skill×2/Enter·ExitPlanMode/Enter·ExitWorktree/AskUserQuestion
- Slash commands (20):
/help /clear /model /mode /effort /agents /sessions /resume /compact /exit /remember /status /tokens /cost /diff /review /rename /init /config /doctor - Context: CLAUDE.md + AGENTS.md discovery, git status, MEMORY.md index, auto/reactive/micro compaction
- MCP: stdio transport via
.mcp.json
Compatibility
Reads Claude Code's .claude/ config layout (settings.json, agents/, skills/) so migrating
from Claude Code is zero-config.
Development
pnpm install
pnpm dev # interactive REPL (tsx)
pnpm build # bundle to dist/cli.js (workspace packages inlined)
pnpm check # typecheck + lint + test
pnpm pack # tarball for local global-install testing