{"name":{"finding":"Continue CLI (cn). Checked 2026-10-27; source findings concern main, not an execution test of the npm package.","quote":"Continue CLI (`cn`) is a terminal-based coding agent.","url":"https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/quickstart.mdx","third_party":false},"repo":{"finding":"https://github.com/continuedev/continue; default branch main.","quote":"main","url":"https://api.github.com/repos/continuedev/continue","third_party":false},"docs":{"finding":"Overview redirects to https://docs.continue.dev/docs/cli/quickstart. Used official repository docs and source where documentation is stale.","quote":"/docs/cli/quickstart","url":"https://docs.continue.dev/cli/overview","third_party":false},"headless":{"finding":"Yes: cn -p \"Fix type errors\" --config /absolute/path/config.yaml --allow Write --allow Edit --allow MultiEdit --exclude AskQuestion. Runs one task and exits, leaving file changes. Prepare model credentials/config first. Set subprocess cwd externally; no directory flag found.","quote":"The agent runs to completion and prints its response to stdout.","url":"https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/headless-mode.mdx","third_party":false,"evidence":[{"finding":"-p/--print is a boolean headless flag; prompt is positional. Stdin alone works: cn -p < prompt.md. With a positional prompt, stdin is prepended inside <stdin>. Missing prompt exits 1; non-TUI SIGINT exits 130; SIGTERM handler requests 0.","quote":"Print response and exit (useful for pipes)","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/index.ts","third_party":false},{"finding":"Repeatable --prompt <prompt> accepts a local file or inline text. --config selects config, not cwd. Help retains legacy Hub slugs.","quote":"Add to the initial user message (can be a file path, hub slug, or string content). Can be specified multiple times.","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/shared-options.ts","third_party":false},{"finding":"Early validation omits options.prompt: --prompt-file-only may fail. Use stdin or add a positional prompt.","quote":"if (options.print && !prompt && !options.agent && !options.resume)","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/index.ts","third_party":false},{"finding":"Headless completion exits 0; fatal errors exit 1 with JSON status:error/message on stderr. Completion does not prove task correctness.","quote":"await gracefulExit(0);","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/commands/chat.ts","third_party":false},{"finding":"Unhandled errors turn requested success into exit 1.","quote":"const finalCode = code === 0 && hadUnhandledError() ? 1 : code;","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/util/exit.ts","third_party":false},{"finding":"Ask tools are excluded headless, not answered yes. Explicit allow executes automatically; --auto allows all.","quote":"(result.permission === \"ask\" && !isHeadless)","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/handleToolCalls.ts","third_party":false},{"finding":"Docs/source conflict: source allows Bash and unmatched tools/MCP headless; docs say Bash is ask/excluded. Write/Edit/MultiEdit remain ask.","quote":"policies.push({ tool: \"Bash\", permission: \"allow\" });","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/defaultPolicies.ts","third_party":false},{"finding":"AskQuestion awaits an answer promise; no headless auto-answer/timeout found. Exclude it and impose an external deadline.","quote":"return new Promise<string>((resolve) => {","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/QuizService.ts","third_party":false}]},"confinement":{"finding":"Application tool permissions: allow executes; ask prompts in TUI; exclude hides tools. Repeatable --allow/--ask/--exclude and ~/.continue/permissions.yaml configure them. --auto/--readonly override flags. No integrated OS sandbox/global network-off switch found; confine externally.","quote":"Plan and auto modes are absolute overrides.","url":"https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/tool-permissions.mdx","third_party":false,"evidence":[{"finding":"Normal precedence: CLI > personal YAML > defaults. CLI exclude > ask > allow; --exclude \"*\" plus selected --allow is not an allowlist.","quote":"policies.push({ tool: normalizedName, permission: \"exclude\" });","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/precedenceResolver.ts","third_party":false},{"finding":"First match wins. Bash(command-pattern) supports exact and */? matches. Docs advertise Write(**/*.ts), but source only parses Bash arguments; other wildcards match names. Do not trust Write globs as path confinement. Dynamic disabled wins; otherwise user policy wins.","quote":"const bashCommandMatch = pattern.match(/^Bash\\((.+)\\)$/);","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/permissionChecker.ts","third_party":false},{"finding":"Shell analysis tokenizes commands, evaluates substitutions and disables critical mkfs/destructive-rm patterns; it is not OS isolation.","quote":"if (baseCommand.startsWith(\"mkfs\"))","url":"https://api.github.com/repos/continuedev/continue/contents/packages/terminal-security/src/evaluateTerminalCommandSecurity.ts","third_party":false},{"finding":"Bash spawns a host shell with inherited cwd/access; it can bypass Write/Fetch restrictions through shell programs.","quote":"const child = spawn(shell, args);","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/runTerminalCommand.ts","third_party":false},{"finding":"Write directly uses supplied filepath, creating directories, without a workspace-root check here.","quote":"fs.writeFileSync(args.filepath, args.content, \"utf-8\");","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/writeFile.ts","third_party":false},{"finding":"Fetch accepts a URL without a domain allowlist here. Excluding it does not disable model, shell or MCP networking.","quote":"const contextItems = await fetchUrlContentImpl({ url }, { fetch });","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/fetch.ts","third_party":false},{"finding":"--readonly excludes Write/Edit/MultiEdit but allows Bash, Fetch and unmatched tools. It does not guarantee no writes or no network.","quote":"{ tool: \"Bash\", permission: \"allow\" },","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/defaultPolicies.ts","third_party":false},{"finding":"Agent-file policies take precedence at initialization, before normal CLI merging; do not assume CLI excludes govern this path.","quote":"// Agent file policies take full precedence on init","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/ToolPermissionService.ts","third_party":false},{"finding":"Beta subagent execution temporarily replaces permission policies with wildcard allow, then restores parent state. Parent restrictions should not be assumed to confine subagents.","quote":"policies: [{ tool: \"*\", permission: \"allow\" }],","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/subagent/executor.ts","third_party":false}]},"token_reporting":{"finding":"Yes: session JSON aggregates usage.totalCost, usage.promptTokens, usage.completionTokens, usage.promptTokensDetails.cachedTokens and usage.promptTokensDetails.cacheWriteTokens. Usage accumulates across requests/resumed sessions and is immediately persisted; start fresh or take a baseline for per-run metering. No normalized reasoning-token total was found.","quote":"session.usage = { ...this.sessionUsage };","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/session.ts","third_party":false,"evidence":[{"finding":"Default session files are ~/.continue/sessions/<sessionId>.json. CONTINUE_GLOBAL_DIR relocates global state.","quote":"return path.join(getSessionsFolderPath(), `${sessionId}.json`);","url":"https://raw.githubusercontent.com/continuedev/continue/main/core/util/paths.ts","third_party":false},{"finding":"Sessions are serialized as ordinary JSON files.","quote":"JSON.stringify(orderedSession, undefined, 2)","url":"https://raw.githubusercontent.com/continuedev/continue/main/core/util/history.ts","third_party":false},{"finding":"Provider chunk.usage captures prompt_tokens/completion_tokens and raw details; model and cost_cents are added before history persistence. Debug completion logs include inputTokens/outputTokens/cacheReadTokens/cacheWriteTokens/cost. Counts depend on usage returned by the provider.","quote":"fullUsage.cost_cents = Math.round(cost * 100);","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/streamChatResponse.ts","third_party":false},{"finding":"Aggregate cache fields map prompt_tokens_details.cache_read_tokens/cache_write_tokens. Cost uses known pricing or fallback $1/million input and $2/million output; estimates, not billing.","quote":"return (inputTokens * 1 + outputTokens * 2) / 1_000_000;","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/streamChatResponse.helpers.ts","third_party":false},{"finding":"--verbose logs Session Usage Summary: cost, input/output, optional cache-read/write and total tokens. Skipped at zero cost; missing provider usage can mean zero totals.","quote":"if (usage.totalCost === 0)","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/util/exit.ts","third_party":false},{"finding":"logger.info writes to <continueHome>/logs/cn.log via Winston file transport with timestamp/process session ID. Collect verbose usage from logs.","quote":"info: (message: string, meta?: any) => winstonLogger.info(message, meta),","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/util/logger.ts","third_party":false},{"finding":"--format json validates model text or wraps response/status/note, without usage fields. Compaction can add JSON status lines with contextUsage estimates.","quote":"Response was not valid JSON, so it was wrapped in a JSON object","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/commands/chat.ts","third_party":false}]},"parallelism":{"finding":"Beta subagents are enabled by --beta-subagent-tool. Approved tool calls run concurrently and can include Subagent calls. No dedicated subagent concurrency limit or safe shared-state multi-session guarantee was found. Separate cn processes can be scheduled externally.","quote":"Enable beta Subagent tool for invoking subagents","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/index.ts","third_party":false,"evidence":[{"finding":"Configure named model entries with roles containing subagent and a nonempty chatOptions.baseSystemMessage; these define the specialized agents.","quote":".filter((model) => model.roles?.includes(\"subagent\"))","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/ModelService.ts","third_party":false},{"finding":"Approved calls start without awaiting prior execution, then the batch awaits Promise.all. Concurrent subagents are possible through this path, not a documented isolated worker pool.","quote":"await Promise.all(execPromises);","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/streamChatResponse.helpers.ts","third_party":false},{"finding":"Subagents mutate shared permissions/system-message/history readiness, rather than isolated subprocess state; concurrent calls can interact.","quote":"services.systemMessage.getSystemMessage = async () => systemMessage;","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/subagent/executor.ts","third_party":false},{"finding":"Specialized cn review uses worktrees and runs reviews concurrently by default. --review-agents selects reviews; --fail-fast uses a sequential loop. This is distinct from general -p execution.","quote":"const settled = await Promise.allSettled(","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/commands/review.ts","third_party":false},{"finding":"Wrapper recommendation: distinct cwd and CONTINUE_GLOBAL_DIR per process. Shared sessions.json uses read/modify/write (history.ts); no locking guarantee found.","quote":"const configPath = process.env.CONTINUE_GLOBAL_DIR;","url":"https://raw.githubusercontent.com/continuedev/continue/main/core/util/paths.ts","third_party":false}]},"providers":{"finding":"CLI factory implements openai, azure, bedrock, cohere, cometapi, askSage, anthropic, gemini, jina, deepseek, moonshot, relace, inception, watsonx, vertexai, llamastack, xAI, zAI, voyage, mistral, deepinfra, vllm, groq, minimax, sambanova, text-gen-webui, cerebras, kindo, msty, nvidia, ovhcloud, scaleway, fireworks, together, ncompass, novita, nebius, function-network, tensorix, openrouter, clawrouter, llama.cpp, llamafile, lmstudio, ollama, ai-sdk, and mock for testing. Adapter availability does not guarantee every model supports agent tools.","quote":"export function constructLlmApi(config: LLMConfig): BaseLlmApi | undefined {","url":"https://raw.githubusercontent.com/continuedev/continue/main/packages/openai-adapters/src/index.ts","third_party":false,"evidence":[{"finding":"Local backends include Ollama localhost:11434/v1, LM Studio localhost:1234, llama.cpp/llamafile localhost:8000, vLLM localhost:8000/v1, text-gen-webui 127.0.0.1:5000/v1, Msty localhost:10000 and LlamaStack. Hugging Face requires an OpenAI-compatible apiBase router here; native endpoints return undefined. General IDE provider docs are broader than CLI support.","quote":"return openAICompatible(\"http://localhost:11434/v1/\", config);","url":"https://raw.githubusercontent.com/continuedev/continue/main/packages/openai-adapters/src/index.ts","third_party":false}]},"subscription_login":{"finding":"Current main removed Continue Hub/WorkOS login. Supported consumer subscription OAuth/device-code login for ChatGPT, Claude, Gemini or GitHub Copilot was not found in the checked CLI/auth/provider sources. API-provider support does not establish subscription support. Use provider credentials or local backends.","quote":"Login is not available. Hub authentication has been removed.","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/AuthService.ts","third_party":false,"evidence":[{"finding":"Stale docs advertise cn login opening a browser for Continue, CONTINUE_API_KEY for headless CI and direct Anthropic API keys. This conflicts with current AuthService; do not treat it as a confirmed current subscription route.","quote":"This opens your browser to authenticate with [Continue](https://continue.dev).","url":"https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/quickstart.mdx","third_party":false},{"finding":"README confirms authentication was removed in the final release.","quote":"This included removing anonymous telemetry, pulling out authentication, squashing bugs, and more.","url":"https://raw.githubusercontent.com/continuedev/continue/main/README.md","third_party":false},{"finding":"Current loader rejects Hub packages; use local configuration rather than legacy platform model/agent slugs.","quote":"Hub package loading has been removed.","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/hubLoader.ts","third_party":false}]},"license":{"finding":"Apache-2.0. LICENSE names Apache License Version 2.0; GitHub metadata confirms SPDX identifier.","quote":"Apache License","url":"https://api.github.com/repos/continuedev/continue/contents/LICENSE","third_party":false,"evidence":[{"finding":"SPDX Apache-2.0.","quote":"Apache-2.0","url":"https://api.github.com/repos/continuedev/continue","third_party":false}]},"latest_stable":{"finding":"Newest repository stable by published_at: v2.0.0-vscode, 2026-06-19T00:24:01Z (2026-06-19), prerelease=false. VS Code, not cn. Latest CLI-specific stable in returned API releases: v1.5.45, 2026-03-04T23:42:34Z; npm is newer.","quote":"2026-06-19T00:24:01Z","url":"https://api.github.com/repos/continuedev/continue/releases?per_page=100","third_party":false,"evidence":[{"finding":"npm @continuedev/cli latest dist-tag: 1.5.47, published 2026-06-18T21:40:36.181Z; beta dist-tag: 1.5.43-beta.20260203. Registry metadata is primary package evidence, not third-party commentary.","quote":"1.5.47","url":"https://registry.npmjs.org/@continuedev%2fcli","third_party":false}]},"latest_prerelease":{"finding":"Newest repository prerelease: v2.1.0-vscode, 2026-06-19T00:24:00Z (2026-06-19), prerelease=true; VS Code, not cn. Latest CLI-specific prerelease in returned API releases: v1.5.43-beta.20260203, 2026-02-03T09:13:47Z (also npm beta).","quote":"2026-06-19T00:24:00Z","url":"https://api.github.com/repos/continuedev/continue/releases?per_page=100","third_party":false},"last_commit":{"finding":"Latest main commit: 5522c6f44ca0ac3528b37244818fbfa39b5af470; author and committer date 2026-07-21T04:00:09Z (ISO date 2026-07-21). This is commit date, not repository pushed_at.","quote":"2026-07-21T04:00:09Z","url":"https://api.github.com/repos/continuedev/continue/commits?sha=main&per_page=1","third_party":false},"fork_of":{"finding":"No GitHub fork relationship: fork=false. No claim of derivation from another coding agent was found in README. Fork metadata cannot rule out all reused code.","quote":"false","url":"https://api.github.com/repos/continuedev/continue","third_party":false},"maintenance":{"finding":"Explicitly no longer actively maintained/read-only per README, despite archived=false and disabled=false in GitHub API. Do not classify as actively maintained merely because it is not archived.","quote":"no longer actively maintained","url":"https://raw.githubusercontent.com/continuedev/continue/main/README.md","third_party":false,"evidence":[{"finding":"Repository archived=false, disabled=false.","quote":"false","url":"https://api.github.com/repos/continuedev/continue","third_party":false}]},"gaps":[{"finding":"not found","quote":"","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/shared-options.ts","third_party":false,"topic":"Working-directory flag; also checked root index.ts and CLI quickstart."},{"finding":"not found","quote":"","url":"https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/tool-permissions.mdx","third_party":false,"topic":"Integrated Docker/seatbelt/gVisor/bubblewrap sandbox or global network-off flag; also checked shared-options.ts, tools/runTerminalCommand.ts, tools/writeFile.ts, tools/fetch.ts. Bounded search, not proof of absence everywhere."},{"finding":"not found","quote":"","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/session.ts","third_party":false,"topic":"Normalized reasoning-token totals or stable stdout usage schema; also checked commands/chat.ts and stream/streamChatResponse.ts."},{"finding":"not found","quote":"","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/subagent/executor.ts","third_party":false,"topic":"Dedicated subagent concurrency setting or safe shared-state multi-session guarantee; also checked ModelService.ts, QuizService.ts, streamChatResponse.helpers.ts and core/util/history.ts."},{"finding":"not found","quote":"","url":"https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/AuthService.ts","third_party":false,"topic":"Current ChatGPT/Claude/Gemini/Copilot subscription OAuth/device-code login; also checked root index.ts, provider factory and quickstart."},{"finding":"not found","quote":"","url":"https://api.github.com/repos/continuedev/continue/releases?per_page=100","third_party":false,"topic":"GitHub CLI release matching npm 1.5.47 or README final 2.0.0 claim; also checked npm registry and README. Report registry and monorepo tags separately."}],"sources":["https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/quickstart.mdx","https://api.github.com/repos/continuedev/continue","https://docs.continue.dev/cli/overview","https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/headless-mode.mdx","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/index.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/shared-options.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/commands/chat.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/util/exit.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/handleToolCalls.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/defaultPolicies.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/QuizService.ts","https://raw.githubusercontent.com/continuedev/continue/main/docs/cli/tool-permissions.mdx","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/precedenceResolver.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/permissions/permissionChecker.ts","https://api.github.com/repos/continuedev/continue/contents/packages/terminal-security/src/evaluateTerminalCommandSecurity.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/runTerminalCommand.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/writeFile.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/tools/fetch.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/ToolPermissionService.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/subagent/executor.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/session.ts","https://raw.githubusercontent.com/continuedev/continue/main/core/util/paths.ts","https://raw.githubusercontent.com/continuedev/continue/main/core/util/history.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/streamChatResponse.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/stream/streamChatResponse.helpers.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/util/logger.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/ModelService.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/commands/review.ts","https://raw.githubusercontent.com/continuedev/continue/main/packages/openai-adapters/src/index.ts","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/services/AuthService.ts","https://raw.githubusercontent.com/continuedev/continue/main/README.md","https://raw.githubusercontent.com/continuedev/continue/main/extensions/cli/src/hubLoader.ts","https://api.github.com/repos/continuedev/continue/contents/LICENSE","https://api.github.com/repos/continuedev/continue/releases?per_page=100","https://registry.npmjs.org/@continuedev%2fcli","https://api.github.com/repos/continuedev/continue/commits?sha=main&per_page=1"]}
