Common problems, error messages, and their fixes. If something here doesn't
resolve your issue, run azycode doctor for a diagnostic snapshot or open an
issue.
- Installation & startup
- Provider & model connection
- Permissions, guard, and sandbox
- MCP servers
- Missions & subagents
- TUI & rendering
- Testing & development
The global bin isn't on your PATH. Re-run the install and check the bin path:
npm install -g .
azycode doctor # reports PATH realpath and whether the bin resolvesIf doctor can't find it, ensure npm bin -g is on your PATH. With
nvm, run nvm use <node> then reinstall.
Azycode requires Node 20+. Upgrade with nvm install 20 && nvm use 20, or your
platform's Node manager.
You likely ran node --test from the repo root and it picked up a stray script.
Use the project script, which scopes discovery to test/:
npm test # runs: node --test "test/**/*.test.js"No provider is configured. Log in first:
azycode login openai # or: kimi, minimax, byokFor a self-hosted / OpenAI-compatible endpoint, use BYOK:
azycode login byok --base-url http://localhost:11434/v1 --model my-model --api-key sk-...The configured key is missing, wrong, or expired. Re-run
azycode login <provider> to refresh it, or check the relevant env var
(OPENAI_API_KEY, MOONSHOT_API_KEY, …). Keys are stored 0600 under
~/.azycode/config.json.
The provider is throttling you. Azycode retries with exponential backoff, but
if it persists: lower concurrency (config set maxParallelSubagents 2), reduce
agentMaxSteps, or wait for the quota window to reset. Subscription quota is
provider-specific — check the provider dashboard.
Set a longer timeout if your provider/model is slow:
export AZYCODE_REQUEST_TIMEOUT_MS=120000 # default 60000Streaming (config set streamResponses true) helps avoid full-turn timeouts on
slow first tokens.
activeModel can drift from the provider's model list after a migration.
status --json shows the resolved model. Run azycode model to pick a current
one, or azycode login <provider> to re-resolve.
The path guard protects secrets and supply-chain files by default. To proceed intentionally:
# Per-write, in always-approve the guard still applies — approve explicitly.
# Or allow a specific class:
azycode config set pathGuard.allowEnv true # .env writes
azycode config set pathGuard.allowLockfiles true # lockfile writes
azycode config set pathGuard.allowCiWorkflows trueSet pathGuard.disabled true only in a throwaway workspace.
Writes are blocked on the default branch to prevent accidental pushes. Create a feature branch first, or disable for trusted workspaces:
azycode config set gitGuard.enabled false # only when you understand the riskshell-risk classifies rm -rf, git reset --hard, etc. as destructive. In
full-auto you can opt in explicitly:
azycode config set permissionProfile full-auto
azycode config set shellPolicy.allowDestructive truebuildContainerArgs blocks bind-mounts of /proc, /sys, /dev, /etc,
/boot, and the docker/podman socket. Mount only workspace/cache paths:
Pick a profile that matches your trust level:
azycode config set profile trusted-workspace # auto-approve build/test
azycode config set profile full-auto # auto-approve network too
azycode config set toolPolicy.shell auto # per-tool overrideRun the probe to see stderr:
azycode mcp status --json
azycode mcp inspect <name>Common causes: wrong command, missing runtime, or the server crashes on
initialize. The inspect output includes the server's stderr tail.
validateMcpServerCommand rejects commands containing ; | & $ \ < > ( )` to
prevent injection. Provide the executable directly with args as an array:
{ "mcpServers": { "my": { "command": "npx", "args": ["-y", "@pkg/server"] } } }These keys (and DYLD_*, PYTHONPATH, …) are stripped from a server's env
because they enable code injection. Pass only safe config values.
close() sends SIGTERM then escalates to SIGKILL after 1.5s. If a process
still lingers, it's ignoring both signals (uncommon). Confirm with
azycode mcp status and restart the TUI if needed.
Subagent recursion is capped by maxSubagentDepth (default 2). Raise it if you
genuinely need deeper fan-out, but prefer flattening the mission:
azycode config set maxSubagentDepth 3Subagents now inherit the parent's permission profile instead of forcing
alwaysApprove: true. If a subagent that used to auto-write now asks for
approval, set the parent profile to trusted-workspace or full-auto.
The subagent isn't registered. List and add:
azycode subagent list
azycode subagent add implementer --description "writes code" --system "..."Best-effort cleanup can fail on locked files. Remove manually:
git worktree prune
rm -rf .azycode/worktrees/Azycode auto-detects color support. Override if needed:
export FORCE_COLOR=1 # force color (even when piped)
export NO_COLOR=1 # disable colorTERM=dumb disables color. The UI degrades to plain text automatically.
Resize the terminal, or press Ctrl+L to clear and redraw. Margins and pane
sizing adapt to stdout.columns. Non-TTY (piped) output skips the composer.
/clear only redraws the screen. Use /new to start a fresh conversation, or
/compact to trim context while keeping recent history.
A stray .js file at the repo root can be auto-discovered. Make sure you're
using npm test (scoped to test/**/*.test.js), not bare node --test.
Check for an unmocked network call or an unbounded setInterval in a fixture.
The agent/subagent tests spin up a local HTTP mock server; ensure the port is
freed in the finally block.
npm run check # node --check bin/azycode.js && node --check src/*.jsIt only parses — fix the reported file/line. Note it globs src/*.js (top
level); run node --check src/ui/*.js src/tui/*.js to also check sub-modules.
Azycode uses Node's built-in runner (node --test). There is no coverage
reporter wired in; use c8 node --test "test/**/*.test.js" if you need
coverage numbers.
azycode status --json # provider, model, guard, mode
azycode health --json # provider connectivity + model list
azycode doctor --json # local binaries, config paths, env
azycode audit # config + state summary
azycode report # recent sessions and tool activity
azycode guard status --json
azycode bench run --mock # internal benchmark without a providerFor the full public API surface, see API.md.
{ "sandbox": { "mounts": [{ "source": "/tmp/.cache", "target": "/root/.cache" }] } }