Make the 72 registry capabilities findable in the catalogue and docs search. Derive status, surface badges and documentation links through the existing facts pipeline. Add /features.json, 26 raw Markdown topic routes and /llms-full.txt; align navigation, sitemap and explicit crawler policy. Release JSON-LD uses only stable rows with a declared since version at or before the published install version.
Put the coding-agent category in home metadata and identity across the actual 18 routed locale packs. Correct session receipts, default Auto routing, ACP and read-only MCP server claims; mark Computer Use preview. Document request preview, LSP, execution policy, skills and the reviewed Claude Code import subset. Ratatui component indexing becomes English-only; its hub retains existing locale coverage.
Root gate on base9ebbb063da plus 137 frozen web paths and the separately frozen Q13/X2 native/doc inputs: 1,312 passed; 0 failed; 7 skipped (wrapper101, SDK19, extension host413, security7, Vitest772). Actual receipt lines:
"# pass 413"
"# fail 0"
"# skipped 7"
"Tests 772 passed (772)"
npm ci, facts/latest-release/docs/local GT catalogs, lint, tsc and production build passed. One existing lint warning. Final LLMS-only copy correction: "Tests 3 passed (3)"; fresh production build passed. The existing buildFacts comment was moved back to its owner without an executable change.
Local browser inspection: 36 pages at 375/768/1280 in en/zh/ja/ar, each captured full-page and viewport. All72 feature queries and26 raw Markdown routes passed; every raw topic appears in the full export; zero page errors and no horizontal overflow. The harness disables speculative link prefetch and answers local telemetry with204. This does not establish deployed-site, crawler indexing, WAF or Search Console acceptance. No new tests or code comments; obsolete existing assertions updated. No deployment.
Use <code className="inline">codewhale --model auto</code> or <code className="inline">/model auto</code> to let Codewhale decide how much model power each turn needs.
</p>
<p className="mb-2">
<strong>Fin</strong> is the fast non-thinking path (<code className="inline">deepseek-v4-flash</code> with thinking off) used for routing decisions, summaries, RLM children, context maintenance, and other coordination work. Before the real turn is sent, Fin makes a small routing call to pick the concrete model and thinking level.
</p>
<p>
Short/simple turns can stay on Flash with thinking off. Coding, debugging, release work, architecture, or security review can move up to Pro and/or higher thinking. Fin is local to Codewhale — the upstream API never receives <code className="inline">model: "auto"</code>.
{title:"OS command sandbox",note:"Seatbelt on macOS when available; opt-in bubblewrap on Linux when installed. Windows currently reports no OS sandbox."},
{title:"OpenRouter provider",note:"OpenRouter integration with 300+ models across dozens of providers"},
{title:"OpenAI-compatible & local runtimes",note:"Generic `openai` route for any OpenAI-compatible gateway, plus vLLM, SGLang, and Ollama against your own localhost endpoints — no key required"},
{title:"Multi-provider support",note:"Hot-swap between providers (DeepSeek, OpenAI, Anthropic, OpenRouter) per session"},
@@ -19,121 +19,6 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s
});
}
interfaceIntegration{
name: string;
icon: IconName;
experimental?: boolean;
desc:{en: string;zh: string};
href: string;
}
constINTEGRATIONS: Integration[]=[
{
name:"HTTP / SSE Runtime API",
icon:"terminal",
desc:{
en:"Full local HTTP + Server-Sent Events runtime API on 127.0.0.1:7878. Create threads, stream turns, manage background jobs, and control approval decisions — all from any HTTP client or the bundled mobile page.",
en:"Baseline JSON-RPC adapter over stdio for compatible editor clients such as Zed. It supports initialize, new session, prompt, and cancel with text responses; shell and file tools, checkpoint replay, and session loading remain on the full Runtime API.",
zh:"面向 Zed 等兼容编辑器客户端的基础 JSON-RPC stdio 适配器。它支持初始化、新建会话、提示和取消,并返回文本响应;shell 与文件工具、检查点回放和会话加载仍由完整 Runtime API 提供。",
},
href:`${REPO_BLOB_BASE}/docs/RUNTIME_API.md`,
},
{
name:"MCP (Model Context Protocol)",
icon:"plug",
desc:{
en:"Connect Codewhale to external tools and services through configured MCP servers over stdio or HTTP/SSE, or expose Codewhale's own tools to another MCP client.",
en:"Early companion for the local runtime. It can open Codewhale in a terminal, start and check the Runtime API, and show read-only thread summaries and restore points. It does not yet provide full chat, inline edits, or editor actions.",
en:"The community-maintained graphical frontend, in a separate repository: chat, threads, live file changes, and task tracking in a VS Code sidebar over this Runtime API. Install it from the VS Code Marketplace; the source is on GitHub.",
zh:"社区维护的图形前端,位于独立仓库:在 VS Code 侧边栏中基于此 Runtime API 进行对话、管理线程、查看实时文件变更与任务进度。可从 VS Code Marketplace 安装;源码见 GitHub。",
en:"First-party Telegram bot bridge. Start a headless Codewhale session, then chat with it from any Telegram client — approvals, tool results, and completions surface inline.",
en:"Experimental Weixin / WeChat bridge. Receive agent completions and approvals inside WeChat; early-stage and not recommended for production deployments.",
en:"The Runtime API binds 127.0.0.1 by default. The local runtime does not require a Codewhale account or hosted relay.",
zh:"Runtime API 默认仅监听 127.0.0.1。本地运行时不需要 Codewhale 账户或托管中继。",
},
},
{
title:{en:"Auth required",zh:"认证必需"},
body:{
en:"Runtime API routes (/v1/*) require a Bearer token. Pass --auth-token at startup or set CODEWHALE_RUNTIME_TOKEN. Only a loopback bind can turn this off, with --insecure-no-auth.",
zh:"Runtime API 路由(/v1/*)需要 Bearer Token。启动时传入 --auth-token,或设置 CODEWHALE_RUNTIME_TOKEN 环境变量。仅在回环地址上可用 --insecure-no-auth 关闭认证。",
en:"Remote clients submit requests and approval decisions through the authenticated Runtime API. Local mode, permission posture, and sandbox policy still apply.",
zh:"远程客户端通过经过认证的 Runtime API 提交请求与审批决定。本地模式、权限姿态和沙箱策略仍然生效。",
},
},
{
title:{en:"Open protocols",zh:"开放协议"},
body:{
en:"The HTTP/SSE Runtime API, MCP surface, and baseline ACP stdio adapter serve different integration needs; choose the interface your compatible client supports.",
"content":"# Installing Codewhale\n\n> 阅读简体中文版:[zh_hans/INSTALL.md](zh_hans/INSTALL.md)\n\nCodewhale is an open-source coding agent that runs in your terminal. You give\nit a task (\"fix the failing test\", \"add a CLI flag\"). It reads your repository,\nedits files and runs commands. In the default **Ask** posture it applies file\nedits inside the workspace immediately (and shows you the diff), but asks before\nrunning shell commands, so commit or stash anything you care about first. It\nworks with many model providers. **DeepSeek** is the default.\n\nThe command is `codewhale`. `codew` is a shorter alias for the same program.\n\nThe installation paths were first checked with **v0.10.0** (released 2026-09-22) on a\nfresh **Ubuntu 24.04 x86_64** machine. The dated\n[install receipts](https://github.com/codewhale-hq/Codewhale/blob/37ecdfcc49bc68a9b0d058b97c3946e62c34bd31/docs/install-report/v0.10.0-2026-09-23/RECEIPTS.md) record the commands and output checked at that time. Steps that\ncould not be run on that machine are marked **(untested on this VM: reason)**.\nmacOS, Windows and Android are out of scope, apart from a few notes. A second\npass re-ran the installer, manual-download, archive and npm paths, the no-key\nchecks and zsh completion on **macOS 26.1 (Apple silicon)**; see\n[macOS notes](#macos-notes). Steps that need a model call were not re-run\nthere.\n\nInstall commands that use `latest` resolve to the latest **published** GitHub\nRelease or package. Between releases, `main` may already describe the next\nversion (for example a v0.10.2 source candidate before its tag). A\nprebuilt candidate is available through the official installer only after its\ntag, checksums and release assets exist. Contributors can build `main` now.\n\n## One account for your provider keys\n\n[Register](https://app.codewhale.net/register) or [sign in](https://app.codewhale.net/login)\nto keep your model providers' API keys in one place. Add, replace or remove\nkeys in your account's [Providers settings](https://app.codewhale.net/providers),\nor use the terminal commands below. On another device, sign in and select the\nCodewhale model route to use the same account keys without pasting them again.\n\n```bash\ncodewhale login\ncodewhale account keys set deepseek # asks for the key without echoing it\ncodewhale account keys list # shows status, never the key itself\ncodewhale --provider codewhale # use your account's model route\n```\n\nThe account setup here describes the 0.10.1 source candidate. Signing in does\nnot upload existing local keys. To copy one deliberately, use\n`codewhale account keys set deepseek --from-local`. Account keys stay on the\nservice; they are used for account-routed requests, not downloaded into each\ndevice's local key store. You can keep using local keys or a local model\nwithout an account. See [account key settings](CONFIGURATION.md#account-provider-keys)\nfor updating keys and switching between these options.\n\n## Test and contribute to current source\n\n`latest` selects the latest published release. To test unreleased repairs,\nbuild canonical GitHub `main`, or CNB `main` after verifying its commit matches.\nThe source version number alone does not establish a published package.\n\n```bash\ngit clone --branch main https://github.com/codewhale-hq/CodeWhale.git\ncd CodeWhale\ncargo build --release --locked -p codewhale-cli\ntarget/release/codewhale --version\n```\n\nSee the Cargo section for build prerequisites; use the repository's stable Rust\nselection (declared minimum 1.89). Windows uses `target/release/codewhale.exe`\nand needs MSVC. A development build is separate from a signed release package.\nFor mainland-China downloads and source validation, see [CNB mirror](CNB_MIRROR.md).\nThe [Tencent Lighthouse bootstrap](../scripts/tencent-lighthouse/README.md) is\nbilingual. An npm registry mirror serves the wrapper; native binary downloads\nstill need an available release asset source.\n\n---\n\n## 60-second quickstart (Linux or macOS)\n\n```bash\n# 1. Install. Downloads two checksum-verified binaries into ~/.local/bin (no sudo).\ncurl -fsSL https://codewhale.net/install.sh | sh\n\n# 2. Make sure ~/.local/bin is on your PATH, now and in future terminals.\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.bashrc # zsh: use ~/.zshrc\nexport PATH=\"$HOME/.local/bin:$PATH\"\ncodewhale --version # -> codewhale 0.10.0 (1be1a703b975)\n\n# 3. Give it a DeepSeek API key (from https://platform.deepseek.com/api_keys).\ncodewhale auth set --provider deepseek # prompts for the key; nothing is echoed\ncodewhale auth status --provider deepseek # \"active source: secret store\"\n\n#4.Runyourfirsttaskinsideagitrepository.\ncd~/your-project\ncodewhale\n```\n\nIntheTUI,typesomethingconcrete:\n\n```text\ncreateaPythonfileprimes.pythatprintsthefirst10primes,runit,andshowmetheoutput\n```\n\nCodewhalewritesthefile,showsLine truncated
"content":"# Codewhale User Guide\n\nThis guide is for your first hour with Codewhale. It explains the main\nworkflow, the important safety controls, and where to go next when you need a\ncomplete reference.\n\nCodewhale has deeper reference documents for installation, configuration,\nproviders, modes, keybindings, tools, and operations. Use this page as a guided\nwalkthrough, then follow the \"Next\" links when you need every option.\n\n## 1. Welcome to Codewhale\n\nCodewhale is a terminal coding agent. You run it from a workspace, give it a\ntask, and it can use structured tools to inspect files, run commands, edit\ncode, and report back with evidence.\n\nThe important difference from a normal chat model is that Codewhale is built\naround a harness:\n\n- It keeps the active workspace and session visible.\n- It routes each turn through explicit modes and approval rules.\n- It shows tool calls in the transcript instead of hiding the work.\n- It can preserve sessions, fork conversations, and continue later.\n- It can run sub-agents for focused background work.\n\nYou can use Codewhale for small questions:\n\n```text\nExplain the authentication flow in this repository.\n```\n\nYou can also use it for multi-step work:\n\n```text\nFind the failing validation path, propose a fix, and wait for my approval\nbefore editing files.\n```\n\nFor a new repository, start conservatively. Ask Codewhale to explore and plan\nbefore asking it to change files. That gives you a reviewable path and makes it\neasier to catch wrong assumptions early.\n\nNext: [ARCHITECTURE.md](ARCHITECTURE.md) explains the internal harness and\nruntime model.\n\n## 2. First Launch\n\nFor a new macOS or Linux installation, use the official GitHub release.\nThe installer verifies the release checksums and provides the same runtime\nunder the `codewhale` and `codew` command names:\n\n```bash\ncurl -fsSL https://codewhale.net/install.sh | sh\n```\n\nWindows users should choose the matching installer or archive from\n[GitHub Releases](https://github.com/codewhale-hq/CodeWhale/releases/latest).\nFor an existing direct install, use `codewhale update --check`, then\n`codewhale update`. npm and Cargo remain secondary packaging routes; Cargo\nalso supports source builds where a compatible prebuilt is unavailable.\nFor occupied directories, package-managed installs, and PATH setup, follow\n[the installation and migration guide](INSTALL.md#recommended-official-github-releases).\nAndroid/Termux uses its own [preview archive or source-build path](INSTALL.md#android--termux-arm64).\n\nDocker is also available when you want an isolated runtime. The published\nimage is currently 0.10.0; to test current `main`, [build it from source](DOCKER.md#building-locally).\n\n```bash\ndocker volume create codewhale-home\ndocker run --rm -it \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v codewhale-home:/home/codewhale/.codewhale \\\n -v \"$PWD:/workspace\" \\\n -w /workspace \\\n ghcr.io/hmbown/codewhale:latest\n```\n\nOnce the install directory is on PATH, launch Codewhale from the repository or\ndirectory you want it to work in:\n\n```bash\ncodewhale\n```\n\nFor the default GitHub installer destination, you can use\n`\"$HOME/.local/bin/codewhale\"` until that directory is on PATH.\n\nOn first launch, Codewhale opens the composer, even with no key or route.\nWith no key or route, workspace trust is asked once a provider is connected;\notherwise only when the folder requires a decision. A provider is asked for\nwhen you send your first message: the message stays in the box while you sign\nin or use your own key, and a local model is offered only when a local Ollama\nserver answers. The provider step also has an explicit offline route.\n\nEverything optional stays available after that. Use `/setup` for the\nprogressive setup and repair guide, `/settings` for the full typed editor, and\n`/constitution` when you want your own constitution on top of the bundled one.\nThe localized telemetry choice appears only after the workspace is ready and\ndoes not block the composer.\n\nDeepSeek is the default provider. If you want to configure its key before or\nafter the first launch, the most direct setup path is:\n\n```bash\ncodewhale auth set --provider deepseek\n```\n\nYou can also provide a key through the environment:\n\n```bash\nexport DEEPSEEK_API_KEY=\"your-key\"\ncodewhale\n```\n\nNewCodewhaleconfigisstoredunder`~/.codewhale/config.toml`.Legacy\n`~/.deepseek/config.toml`filesarestillsupportedforusersmigratingfrom\ntheoldname.\n\nUse`/constitution`torevieworchangestandingguidance.Aftersetup,runa\ndoctorcheck:\n\n```bash\ncodewhaledoctor\n```\n\nUsetheJSONformwhenyouneedamachine-readablereportforanissue:\n\n```bash\ncodewhaledoctor--json\n```\n\nBothformsareofflinebydefault.Theyreportstructuralconfigurationand\nliteralunknown/not-probedcredentialstateswithoutloadingworkspace`.env`\ncredentials,openiLine truncated
"content":"# Keybindings\n\n> 阅读简体中文版:[zh_hans/KEYBINDINGS.md](zh_hans/KEYBINDINGS.md)\n\nThis is the source-of-truth catalog of every keyboard shortcut the TUI recognizes. Bindings are grouped by **context** — the focus or modal state they fire in. A binding listed under \"Composer\" only takes effect when the composer is focused; one under \"Transcript\" only when the transcript has focus; and so on.\n\nGlobal key chords are not yet user-configurable — tracked for a future release (#436, #437). Hotbar slot actions are configurable with `[[hotbar]]` and `/hotbar`; the Hotbar activation chord remains `Alt-1` through `Alt-8`.\n\n## Global (any context)\n\n| Chord | Action |\n|----------------------|---------------------------------------------------------------|\n| `/help`, `F1` or `Ctrl-/` | Toggle the help overlay. `/help` is what the chrome advertises: it is the one route every terminal delivers, where `F1` is eaten by tmux and some emulators and `Ctrl-/` encoding varies |\n| `F2` | Toggle the typed Settings editor |\n| `F3` | Open the provider/model picker (same as `/provider`) |\n| `Ctrl-K` | Open the command palette (slash-command finder) |\n| `Ctrl-C` | Cancel current turn / dismiss modal / arm-then-confirm quit |\n| `Ctrl-B` | Release the current shell wait so the turn can continue; foreground commands move into `/jobs`, and background tasks keep running. Use `/jobs` or `Bash` with `action: \"wait\"`toinspectoutput|\n|`Ctrl-D`|Quit(onlywhenthecomposerisempty)|\n|`Tab`|Whenthecomposerisempty,cycleTUImode:Plan→Work→Operate→Plan|\n|`Shift+Tab`|Cyclepermissionposture:Ask→Auto-Review→FullAccess.Liveregardlessofcomposercontentsorwhetheraturnisrunning(suppressedonlywhileamodalotherthanConfigisopen)|\n|`Ctrl-T`|Cyclereasoningeffortfortheactivemodel.Walksthesameladderas`/model`and`/effort`(catalogordocumentedroutedialect).Always-thinkingmodelsomit`off`;Grok4.6includes`xhigh`.|\n|`Ctrl-Shift-T`|Togglelivetranscriptoverlay(sticky-tailauto-scroll)|\n|`Ctrl-R`|Opentheresume-sessionpicker|\n|`Ctrl-L`|Compacttheconversationcontext(statuslineshowsprogress;no-opwhileacompactionisalreadyrunning)|\n|`Ctrl-O`|Openthereasoningdetailfortheselectedorcurrentturn,regardlessofcomposercontents|\n|`Ctrl-Alt-O`|Openthewhole-turnTurnInspector,regardlessofcomposercontents|\n|`Alt-V`/`Option-V`(macOS)|Openthedetailspagerfortheselectedtool/sub-agentcard;withnothingselected,theliveinspectorofthenewestrunningshell,elsethevisibleormostrecentcard;terminalsthatemitthelegacyOption-Vglypharealsohandled|\n|`Ctrl-Shift-E`/`Cmd-Shift-E`|Togglethefiletreeintheworkbar|\n|`Ctrl-]`or`Ctrl-Tab`|Cyclethepetviewwhilethepetmainviewisshowing;otherwisecycletheworkdock:TODO→Agents→Jobs→Background.`Ctrl-]`isportable;`Ctrl-Tab`requiresthekittykeyboardprotocol.Terminal.appusesittoswitchterminaltabs|\n|`Ctrl-Shift-Tab`|Cyclethepetvieworworkdockbackwardswheretheterminalsendsthekittykeyboardchord.Terminal.appusesittoswitchterminaltabs|\n|`Alt-G`/`Alt-Shift-G`|Scrolltranscripttotop/bottomwhenthecomposerisempty|\n|`Alt-1`-`Alt-8`|DispatchHotbarslots1-8whennomodalorinlinepickerisopen|\n|`Alt-!`/`Alt-@`/`Alt-#`/`Alt-$`|Selecttheworkbarpanel:Tasks/Agents/Context/Files|\n|`Ctrl-Alt-0`|Toggletheworkbaroff/backtothebottomplacement|\n|`Alt-L`|Openthepagerforthelastmessage(composerempty)|\n|`Alt-P`/`Alt-A`/`Alt-Y`|JumptoPlan/Work,orrequestFullAccess(`Alt-Y`isthelegacypermissionchannel—Work+FullAccess—notaseparatemode;ithonorsalockedapprovalpolicy)|\n|`Ctrl-X`(Activityworkbar)|Cancelallrunningbackgroundshelljobs|\n|`Esc`|Closetopmostmodal·cancelslashmenu·dismisstoast.Duringacompactthatisservinganin-flightturn,Escstopstheturn(thecompactiscollateral).|\n\n##Composer\n\nEditingthemessageyou'reabouttosend.\n\n|Chord|Action|\n|-----------------------------|---------------------------------------------------------|\n|`Enter`|Sendwhenidle;queuewhilebusy;withanemptycomposer,sendthenextqueuedfollow-upnow|\n|`Shift-ELine truncated
"content":"# Configuration\n\ncodewhale reads configuration from a TOML file plus environment variables.\nAt process startup it may also load literal built-in-provider credentials from\na workspace-local `.env` file. Use the tracked `.env.example` as the template;\ncopy it to `.env`, then add only credential values.\n\nA workspace is not configuration authority. Codewhale therefore ignores\nconfig/profile/home paths, provider/model/base-URL routing, MCP/plugin state,\napproval/sandbox/shell posture, executable paths, runtime settings, and every\nother non-credential `.env` entry. Variable expansion is rejected so a\nrepository cannot substitute an ambient secret into a credential value. Use\n`config.toml`, CLI flags, or values exported by the launching shell for those\nexplicit control-plane settings. `.env` is read from a stable regular-file\nhandle, is capped at 1 MiB, and symbolic links, reparse points, and multiply\nlinked files are rejected.\n\n## Reading and checking configuration from the CLI\n\n`codewhale config get <key>` reads scalar keys, whole tables such as `tools`,\nand nested paths such as `tools.user_input_timeout_seconds`. Displayed tables\nand nested values apply the same recursive credential redaction as `config dump`.\n\n`config set` supports its named scalar keys and the provider, route, and\nnotification commands. It refuses a key that nothing reads and suggests the\nnearest real key (`config set calm_mod on` names `calm_mode`). A settings.toml\nkey such as `calm_mode` or `tool_collapse` is validated and written to the\nuser-global settings.toml, not config.toml; `config get` reads it back from\nthere even when an old config.toml copy (which nothing reads) is still present,\nand names that copy so you can `config unset` it. Settings keys have no project\nscope, so `--project` refuses them. A config.toml key is checked against the\ntype its reader expects and stored as a TOML boolean or number where the\nreader needs one (`yolo = true`, `max_subagents = 4`); `reasoning_effort`\naccepts the same aliases as `/effort` (#6563). Other dotted writes fail before\nmodifying the file and name the TOML table to edit. For example, set a tools\ntimeout in the file as:\n\n```toml\n[tools]\nuser_input_timeout_seconds = 0\n```\n\n`codewhale config doctor` checks credential presence and endpoint shape, and\nwarns about each config.toml root key that nothing reads: a settings.toml key\nleft in config.toml is named as misplaced, and any other unread key gets a\ndid-you-mean. Keys read by any runtime reader are not reported. The warnings do\nnot fail the check, and a clean result does not validate every runtime setting's\nvalue (#6083, #6563).\n\n## Constitution, project instructions, and repo authority\n\nCodewhale has several instruction surfaces. They are deliberately separate so a\npersonal constitution, repo policy, project instructions, and runtime security\ncontrols do not blur together.\n\n- **Bundled global Constitution** — the compiled base law in the binary. It is\n the default floor for every session.\n- **User-global constitution** — the normal guided setup output. Manage it with\n `/constitution` or `/setup`; Codewhale stores structured data at\n `$CODEWHALE_HOME/constitution.json` (default `~/.codewhale/constitution.json`)\n and renders it into a separate `<codewhale_user_constitution>` prose block.\n This can express preferences and stop conditions, but it does not change\n runtime approval policy, sandbox, shell, network, trust, or MCP permissions.\n- **Repo-local constitution** — optional project policy in\n `.codewhale/constitution.json`, described below.\n- **`AGENTS.md`** — cross-agent **project instructions** (prose). This is the\n canonical file for \"how should an agent work in this repo.\"Run`/init`to\nscaffoldone.`CLAUDE.md`and`.claude/instructions.md`arereadas\ncompatibilityfallbacks.\n-**Memoryandhandoffs**—recalledstate.Useful,butlowerauthoritythan\nconstitutionsandprojectinstructions.\n\n###Managingtheuser-globalconstitution(`/setup`and`/constitution`)\n\nThebundled**workingagreement**isthesafedefaultandnolongeraddsa\nrequiredfirst-runscreen.Customizeitlaterthrough`/constitution`orthe\nprogressive`/setup`guide.Provider/modelreadiness,workspacetrust,and\nruntimeposturestayseparatefromthisguidance.\n\nOnthe**Workingagreement**(constitution)step:\n\n-**`1`–`6`**tunetheguideddraft.**`G`**previewsit,and**`G`**again\nratifiesandsavesafreshstructured`constitution.json`.\n-**`A`**(shownonlywhenaproviderisconfigured)asksyourfirstconfigured\nmodeltodrafttheconstitution.Draftingis**not**saving:thedraftis\nrenderedthroughthesamepreviewandyoustillpress**`G`**toratify\nbeforeanythingpersists.\n-**`K`**keepsyourexistingloadedconstitutionunchanged(shownonlywhena\nvalidfileisalreadypresent).\n-**`U`**(or`/coLine truncated
"content":"# Codewhale Agent — one identity, many surfaces\n\n\"Codewhale Agent\" is one product identity with many transport surfaces.\nThis page is the identity map: what each surface is, where each lives, and\nthe rules that keep them one product instead of several.\n\n## The one identity\n\n| Surface | Identity object | Where it lives | State |\n|---|---|---|---|\n| GitHub PR review | GitHub App bot `codewhale-agent[bot]` | GitHub org settings; repo variable `CODEWHALE_APP_ID` + secret `CODEWHALE_APP_PRIVATE_KEY` | `codewhale review --pr N --post` ships with the `codewhale-review.yml` workflow; it no-ops green until the App is configured (founder-gated), then posts as the App instead of the workflow token. Posting is always opt-in via `--post`. |\n| Commit co-author | `.github/AUTHOR_MAP` | repo | existing; harvested co-author credit lands in the contributor graph |\n| Chat channels | per-user bot registration bound to a Codewhale membership | control-plane `services/control-plane/src/integrations/chat/` BotGateway and adapters; contracts in `packages/contracts` | Source includes Telegram and Slack bot pairing and commands. Default read-only command allowlist; opt-in write verbs; approve/deny keyboards route as permission decisions. Availability depends on the deployed gateway and configured bot credentials. |\n\nSlack bot commands control Codewhale; they do not give an agent tools to search\nor read a Slack workspace. The Slack bot requires a user-managed Slack app,\ncredentials and webhook setup. Hosted Slack delivery and a real authenticated\nSlack task have not been qualified, so this source implementation is not a\nready-to-use Slack integration claim. External Slack tools require a separately\nconfigured and authenticated MCP server or API integration.\n\n## Rules that make it one identity\n\n- Every surface is I/O around the single `Engine::run_turn`\n (`crates/tui/src/core/engine/turn_loop.rs`). No surface gets its own\n engine or turn loop.\n- Every surface authenticates to the same Codewhale membership\n (`codewhale login` account session). Membership gates cloud agents;\n provider brands stay internal and invisible.\n- Approvals from any surface route back as permission decisions into the\n same engine. A bare message never executes a gated action.\n- Every command and approval is audited, on every channel.\n- All surfaces are FREE. Rate limits are anti-abuse only. There is no\n per-channel fee, message metering, team gating, or trial timer — and a\n billing hook on a channel feature is forbidden by the money model.\n\n## Naming\n\n- Product: Codewhale. Agent surface: \"Codewhale Agent\".\n- Bot handle wherever it can be chosen: `codewhale-agent`.\n- The agent speaks as \"Codewhale cloud agent\" — never as a provider brand.\n\n## Channel contract\n\nPer-channel command allowlists (default read-only: `status`, `jobs`,\n`receipts`, `help`; opt-in: `new task`, `approve`, `deny`), inline\napprove/deny keyboards routed as permission decisions, `assistant_changes`\nreply mode (message only when something changed), per-channel message\nformat adapters (including Telegram markdown and Slack blocks in source),\nquiet hours + digest, automation output routable\nto any paired channel, one pairing code bound inside the authenticated\napp, unbind revokes instantly.\n\nWeChat note: personal-WeChat automation is **not supported** —\nreverse-engineered protocols get users banned. Official 公众号/服务号 APIs\nare the only acceptable path and are still under assessment.\n\n## Pointer\n\nChannel contracts live in `packages/contracts` (CWC repo); the gateway and\nadapters live in `services/control-plane/src` (CWC repo). The GitHub\nsurface lives in `.github/workflows/codewhale-review.yml` here.\n"
"content":"# Provider Registry\n\n> 阅读简体中文版:[zh_hans/PROVIDERS.md](zh_hans/PROVIDERS.md)\n\nSpeech recognition, synthesis, translation and video have separate execution\npaths. See [media models](MEDIA_MODELS.md) for current support and reviewed\nupstream candidates; a chat catalogue row alone does not add a media backend.\n\nThis registry describes provider behavior that is wired into the current\nCodewhale codebase. It is intentionally conservative: shipped entries are\nlimited to provider IDs, config keys, auth paths, base URLs, model resolution,\nand capability metadata that the code already knows about.\n\nDeepSeek remains the default provider, but every entry in `ProviderKind::ALL`\nis a first-class selectable provider route. `ALL` is the catalog/picker\nsurface — one identity per vendor. Dual-wire dialect kinds (`*Anthropic`, e.g.\n`deepseek-anthropic`) and the Model Studio plan variants stay on the enum for\nserde and `provider_for_kind` but are deliberately **not** catalog rows:\na plan is `mode`/`base_url` and a dialect is `wire = openai|anthropic` on the\nprimary provider config (`crates/config/src/provider_kind.rs:221-226`). Hosted\nroutes, generic OpenAI-compatible endpoints, the OpenAI Codex/ChatGPT route,\nnative Anthropic, and local runtimes all run the same terminal harness against\nthe selected provider/model/base URL.\n\nA host reached over plain Chat Completions is an ordinary named provider,\nnot a `ProviderKind`: enum variants are reserved for distinct *wires*\n(Anthropic Messages, Codex Responses, Google thought signatures). Any such\nhost is a `[providers.<name>]` table with a base URL, a model, and a key env\n(`docs/CONFIGURATION.md`); `/provider` and `/setup` keep a \"paste a Base URL\nand a key\"pathforexactlythis.Offeringscomefromlive`GET/v1/models`\nplustheCodewhalecatalogratherthanacompiledroster(#5350,#6289).\n\nKnown-goodhosts.Theseshipasbundleddescriptorrowsin\n`crates/config/assets/provider_descriptors.json`(compiledinby\n`crates/config/src/descriptors.rs`):eachrowsayshowtoreachthehost—wire,\nbaseURL,keyenv,aliases—whilemodelidsstaylivefrom`GET/v1/models`\nandtheCodewhalecatalog;theexamplemodelisonlyabootstraphint.Verify\nagainstthevendor'sowndocsbeforetrustinganyvaluehere:\n\n|Host|BaseURL|Examplemodels|APIkeyenv|\n|---|---|---|---|\n|SenseNova|`https://token.sensenova.cn/v1`|`deepseek-v4-flash`|`SENSENOVA_API_KEY`|\n|Baseten|`https://inference.baseten.co/v1`|`deepseek-ai/DeepSeek-V4-Pro`|`BASETEN_API_KEY`|\n|Groq|`https://api.groq.com/openai/v1`|`llama-3.3-70b-versatile`|`GROQ_API_KEY`|\n|Cerebras|`https://api.cerebras.ai/v1`|`llama-3.3-70b`|`CEREBRAS_API_KEY`|\n|CommandCode|`https://api.commandcode.ai/provider/v1`|`deepseek/deepseek-v4-flash`|`COMMAND_CODE_API_KEY`|\n|AlibabaModelStudio(DashScope)|`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`|`qwen3.8-flash`|`DASHSCOPE_API_KEY`|\n|AICraft|`https://aicraftapi.com/v1`|`claude-4.6-sonnet`;DeepSeek/Claude/Gemini/Qwen/GLM/MiniMax/Doubaofamilies|`AICRAFT_API_KEY`|\n|Tsubasa|`https://api.tsubasa.sh/v1`|`tsubasa-pro`,`tsubasa-fast`(32,768-tokencontext)|`TSUBASA_API_KEY`|\n|CheaperInference|`https://api.cheaperinference.com/v1`|`gpt-5.4-mini`,`claude-sonnet-5`,`gemini-3.1-pro`|`CHEAPER_INFERENCE_API_KEY`|\n|Yolo-Auto|`https://yolo-auto.com/v1`|`qwen3.8-flash`;`yolo`/`yolo-small`|`YOLO_AUTO_API_KEY`|\n\nAICraft'srosterspansDeepSeek,AnthropicClaude,GoogleGemini,Qwen,GLM,\nMiniMaxandDoubaoidsonitsOpenAI-compatibleendpoint.Theauthorityis\n`GEThttps://aicraftapi.com/v1/models`withyourkey—pickamodelfromthat\nlist,notfromthistable.\nTsubasaimplementsonly`GET/v1/models`andChatCompletions.Itstwopublic\nmodelidssharea32,768-tokencontext,smallerthanthe128,000tokensCodewhaleassumes\nforanunknownmodel,sosetitontherouteaftersaving:\n`codewhaleconfigsetproviders.tsubasa.context_window32768`.\n\nCheaperInferenceisanOpenAI-compatiblegatewaywithonekeyformodelsfrom\nseverallabs.Modelidsarebare,suchas`gpt-5.4-mini`or`claude-sonnet-5`.\nPricingvariesbymodelandroute;consulttheprovider’scurrentcatalog.\nTheauthorityis`GEThttps://api.cheaperinference.com/v1/models`withyourkey.\nDocs:<https://cheaperinference.com/docs>.\n\nOpenCodeZenandOpenCodeGoarefirst-classproviderroutes,configuredlike\nanyotherproviderbelow;theyarenotpartofthistable.In`/provider`,\ntypetofilterthelist(lettersnotboundtoarowaction);`Ctrl+T`probesthe\nselectedrow's`/models`andrecordsreachabilityonly(a2xxisnot\nmodel-ready).\n\nSourcestokeepinsync:\n\n-`crates/config/assets/provider_descriptors.json`-built-inandcompatible-host\nlabels,defaults,aliases,key-envlists,config/secLine truncated
"content":"# Configuration\n\ncodewhale reads configuration from a TOML file plus environment variables.\nAt process startup it may also load literal built-in-provider credentials from\na workspace-local `.env` file. Use the tracked `.env.example` as the template;\ncopy it to `.env`, then add only credential values.\n\nA workspace is not configuration authority. Codewhale therefore ignores\nconfig/profile/home paths, provider/model/base-URL routing, MCP/plugin state,\napproval/sandbox/shell posture, executable paths, runtime settings, and every\nother non-credential `.env` entry. Variable expansion is rejected so a\nrepository cannot substitute an ambient secret into a credential value. Use\n`config.toml`, CLI flags, or values exported by the launching shell for those\nexplicit control-plane settings. `.env` is read from a stable regular-file\nhandle, is capped at 1 MiB, and symbolic links, reparse points, and multiply\nlinked files are rejected.\n\n## Reading and checking configuration from the CLI\n\n`codewhale config get <key>` reads scalar keys, whole tables such as `tools`,\nand nested paths such as `tools.user_input_timeout_seconds`. Displayed tables\nand nested values apply the same recursive credential redaction as `config dump`.\n\n`config set` supports its named scalar keys and the provider, route, and\nnotification commands. It refuses a key that nothing reads and suggests the\nnearest real key (`config set calm_mod on` names `calm_mode`). A settings.toml\nkey such as `calm_mode` or `tool_collapse` is validated and written to the\nuser-global settings.toml, not config.toml; `config get` reads it back from\nthere even when an old config.toml copy (which nothing reads) is still present,\nand names that copy so you can `config unset` it. Settings keys have no project\nscope, so `--project` refuses them. A config.toml key is checked against the\ntype its reader expects and stored as a TOML boolean or number where the\nreader needs one (`yolo = true`, `max_subagents = 4`); `reasoning_effort`\naccepts the same aliases as `/effort` (#6563). Other dotted writes fail before\nmodifying the file and name the TOML table to edit. For example, set a tools\ntimeout in the file as:\n\n```toml\n[tools]\nuser_input_timeout_seconds = 0\n```\n\n`codewhale config doctor` checks credential presence and endpoint shape, and\nwarns about each config.toml root key that nothing reads: a settings.toml key\nleft in config.toml is named as misplaced, and any other unread key gets a\ndid-you-mean. Keys read by any runtime reader are not reported. The warnings do\nnot fail the check, and a clean result does not validate every runtime setting's\nvalue (#6083, #6563).\n\n## Constitution, project instructions, and repo authority\n\nCodewhale has several instruction surfaces. They are deliberately separate so a\npersonal constitution, repo policy, project instructions, and runtime security\ncontrols do not blur together.\n\n- **Bundled global Constitution** — the compiled base law in the binary. It is\n the default floor for every session.\n- **User-global constitution** — the normal guided setup output. Manage it with\n `/constitution` or `/setup`; Codewhale stores structured data at\n `$CODEWHALE_HOME/constitution.json` (default `~/.codewhale/constitution.json`)\n and renders it into a separate `<codewhale_user_constitution>` prose block.\n This can express preferences and stop conditions, but it does not change\n runtime approval policy, sandbox, shell, network, trust, or MCP permissions.\n- **Repo-local constitution** — optional project policy in\n `.codewhale/constitution.json`, described below.\n- **`AGENTS.md`** — cross-agent **project instructions** (prose). This is the\n canonical file for \"how should an agent work in this repo.\"Run`/init`to\nscaffoldone.`CLAUDE.md`and`.claude/instructions.md`arereadas\ncompatibilityfallbacks.\n-**Memoryandhandoffs**—recalledstate.Useful,butlowerauthoritythan\nconstitutionsandprojectinstructions.\n\n###Managingtheuser-globalconstitution(`/setup`and`/constitution`)\n\nThebundled**workingagreement**isthesafedefaultandnolongeraddsa\nrequiredfirst-runscreen.Customizeitlaterthrough`/constitution`orthe\nprogressive`/setup`guide.Provider/modelreadiness,workspacetrust,and\nruntimeposturestayseparatefromthisguidance.\n\nOnthe**Workingagreement**(constitution)step:\n\n-**`1`–`6`**tunetheguideddraft.**`G`**previewsit,and**`G`**again\nratifiesandsavesafreshstructured`constitution.json`.\n-**`A`**(shownonlywhenaproviderisconfigured)asksyourfirstconfigured\nmodeltodrafttheconstitution.Draftingis**not**saving:thedraftis\nrenderedthroughthesamepreviewandyoustillpress**`G`**toratify\nbeforeanythingpersists.\n-**`K`**keepsyourexistingloadedconstitutionunchanged(shownonlywhena\nvalidfileisalreadypresent).\n-**`U`**(or`/coLine truncated
"content":"# Legacy `.deepseek/` compatibility paths — audit & migration status (#3068)\n\n> 阅读简体中文版:[zh_hans/LEGACY_PATHS.md](zh_hans/LEGACY_PATHS.md)。\n\n## v0.9.10 cleanse ledger\n\nThis is the release-window decision record for residue that can otherwise look\ninterchangeable in a text search. A compatibility entry must name the contract\nthat still requires it; new production code must use a current path.\n\n| Class | Surface | Decision / contract |\n|---|---|---|\n| DELETE | Retired underwater build-version test override | Removed in `1cc4d1d1b`; the owner test was already deleted and the production-only build version remains authoritative. |\n| MIGRATE | Cross-task Agent Mail | `bd998495a` and managed-app `4ff7bc50d` replace guessed event aliases and same-session mailbox conflation with one durable typed runtime protocol. |\n| MIGRATE | TUI `status_message` writes | Active residue; touched flows must move to the typed toast/current-state owner. No new writes are allowed. |\n| COMPATIBILITY | `.deepseek/` state and stored provider aliases | Read fallback for upgraded installations and stored provider identity; writes remain Codewhale-only. Details are below. |\n| COMPATIBILITY | `agent_message` transcript/protocol decoding | Persisted transcripts and tool wire values require decoding; it is not the cross-task Agent Mail transport. |\n| COMPATIBILITY | Managed runtime envelope schema 1 | Previously persisted/enrolled runner replay; current local Codewhale Agent Mail producer is schema 2 and both normalize to the managed envelope. |\n| CURRENT | DeepSeek provider support | A real selectable provider, not product branding; provider-scoped names and configuration remain. |\n| CURRENT | Same-session subagent mailbox | Start/status/peek/message/followup/interrupt/wait/cancel stays scoped to a parent runtime session. |\n| CURRENT | Web locale dictionaries | The application and documentation routes have no page-local `isZh` branches; new copy continues through dictionaries. |\n| CURRENT | Safety, authorization, protocol, persistence, migration, and data-integrity tests | These protect external or durable contracts and are not copy/layout cleanup candidates. |\n\nSnapshot on 2026-08-19: `10,954` Rust `#[test]` attributes under\n`crates/tui`, `523` TUI `status_message` source lines, and zero page-local\n`isZh` files under `apps/web/app` in the paired managed-app candidate. Counts\nare inventory signals, not deletion targets.\n\nCodewhale was renamed from DeepSeek-TUI. To avoid breaking existing installs, the runtime reads\nstate from the new `~/.codewhale/` location but **falls back** to the legacy `~/.deepseek/` location,\nand always **writes** to `~/.codewhale/`. This doc audits each legacy reference and records a\nkeep / deprecate / remove decision so the migration is auditable.\n\n## The canonical resolver (use this for new code)\n\nState-dir resolution is consolidated in `crates/config/src/lib.rs`:\n\n| Symbol | Line | Purpose |\n|---|---|---|\n| `CODEWHALE_APP_DIR` / `LEGACY_APP_DIR` | 5369 | re-exported from `crates/paths` (defined at `crates/paths/src/lib.rs` 13 / 16) |\n| `codewhale_home()` | 5375 | `~/.codewhale` |\n| `legacy_deepseek_home()` | 5392 | `~/.deepseek` (legacy) |\n| `resolve_state_dir(subdir)` | 5434 | **read** path: `~/.codewhale/<subdir>`, falling back to `~/.deepseek/<subdir>` when only the legacy dir exists |\n| `ensure_state_dir(subdir)` | 5458 | **write** path: always creates under `~/.codewhale/<subdir>` |\n\nMigration contract: read-with-fallback, write-to-new. This preserves the v0.8.44 migration for\nusers who still have `~/.deepseek/` while steering all new writes to `~/.codewhale/`.\n\n## Per-path decisions\n\n**Decision for all legacy references below: keep-as-fallback.** Removing the `.deepseek` fallback\nwould strand users who upgraded in place and never re-ran onboarding. Revisit only after a release\nthat actively migrates `~/.deepseek/` → `~/.codewhale/` on first run and a deprecation window.\n\n| Reference | Routed through `resolve_state_dir`? | Decision |\n|---|---|---|\n| `config::resolve_state_dir` / `ensure_state_dir` | n/a (the resolver itself) | keep — canonical |\n| `crates/tui/src/skills/mod.rs` (`~/.deepseek/skills`) | no — hardcoded | keep-as-fallback; route through resolver in a follow-up refactor |\n| `crates/tui/src/prompts.rs` (`LEGACY_HANDOFF_RELATIVE_PATH = \".deepseek/handoff.md\"`)|no—explicitlegacyconst|keep—explicitlegacyhandofffallback|\n|`crates/tui/src/workspace_trust.rs`|no—hardcoded|keep-as-fallback;follow-up|\n|`crates/tui/src/session_manager.rs`|no—hardcoded|keep-as-fallback;follow-up|\n|`crates/runtime/src/skill_state.rs`|no—hardcoded|keep-as-fallback;follow-up|\n|`crates/tui/src/tools/skill.rs`|no—hardcoded|keep-as-fallback;follow-up|\n|`crates/tui/src/snapshot/mod.rs`|no—hardcoded|keep-as-fallback;follow-up|\n|`crates/runtime/src/woLine truncated
"content":"# Modes and Permission Postures\n\n> 阅读简体中文版:[zh_hans/MODES.md](zh_hans/MODES.md)\n\nCodewhale has three related concepts:\n\n- **TUI mode**: what kind of visible interaction you're in (Plan/Work/Operate).\n- **Permission posture**: how aggressively the UI asks before executing tools.\n- **Workflow**: named steps that coordinate sub-agents, with dependencies and\n results, available in any TUI mode.\n\nModel selection is separate. `--model auto` and `/model auto` route each turn to\na concrete model and thinking level; they are not TUI modes and are not part of\nthe `Tab` cycle.\n\nWorkflow runs named steps through the same sub-agent runtime; Fleet manages\ntheir saved roles and model assignments. A workflow adds ordering, result\nhandoffs, gates and a progress view. The active mode and permission posture\nstill control what each step may execute.\n\nBefore assigning steps, query `agent(action=\"roster\")` for the saved Fleet\nmodels and roles. A plan child can select a listed model with `model`, or use\nthe saved `role`/`profile` assignment. An Exact Fleet fixes each member's route.\n\n## TUI Modes\n\nPress `Tab` to complete composer menus or cycle through the visible modes\nwhen the composer is empty: **Plan → Work → Operate → Plan**. `Tab` never sends\nor queues composer text; use `Enter` to send or queue it.\nPress `Shift+Tab` to cycle permission posture (Ask → Auto-Review → Full Access).\nEvery change of effective permission writes a `Permissions changed to …` line\nin the transcript.\nPress `Ctrl+T` to cycle reasoning effort.\nRun `/mode` to open the mode picker, or switch directly with `/mode work`,\n`/mode plan`, or `/mode operate`.\n\n- **Plan**: design-first prompting. The stable primitive names remain familiar, but the runtime centrally refuses file mutation and shell execution. Read-only inspection and policy-allowed research, including deferred Web search/fetch, remain available. When a Plan turn successfully finishes a nonempty response, including a prose-only plan, the TUI asks how to continue: Work (Ask), Work (Auto-Review), or keep planning. Work sends the exact approved response as a normal follow-up and preserves that turn's existing To-dos, or adds one pending plan item without replacing unrelated work.\n- **Work** (internally `agent`): ordinary multi-step execution. The first-turn toolbox includes `read`, `write`, `edit`, `bash`, `agent`, `workflow`, and `todo_write`, plus `create_goal`, `get_goal`, and `update_goal` so goal controls are available without discovery. The agent calls `create_goal` when a request is a durable objective; the host never infers a goal from wording, and the contract must not tell the model otherwise. Approval, sandbox, repository law, and managed policy decide what may execute.\n- **Operate**: Work at full strength, the \"ultra\"mode.SametoolsandauthorityasWork;thedifferenceishowtheyareused.Eachsubstantiverequestbecomesagoal(`create_goal`),theplanstaysvisible(`todo_write`),multi-partworkrunsthrough`workflow`andparallel`agent`workers,non-trivialchangesgetanindependentreviewerbeforetheyarecalleddone,longcommandskeeprunninginthebackground,andrecurringorwatch-typeworkisofferedasan`automation`(createdafterapproval).Itkeepsgoinguntilthegoalisverified,blockedonyou,orpaused.\n\n`Act`and`/modeact`remaincompatibilityaliasesforWork.Savedsettings\nstillnormalizetotheinternalvalue`agent`.\n\n###Toolavailabilitybymode\n\n|Toolfamily|Plan|Work|Operate|\n|:---|:---:|:---:|:---:|\n|`read`andpolicy-alloweddeferredresearchtools|yes|yes|yes|\n|`write`and`edit`|visiblenames;executiondenied|approval-andpolicy-gated|sameasWork|\n|`bash`|visiblename;executiondenied|approval-andpolicy-gated|sameasWork;delegationispreferredwhenparallelismorisolationhelps|\n|`agent`|yes,subjecttochild-depthauthority|yes,subjecttochild-depthauthority|yes,subjecttochild-depthauthority|\n|Deferrednative,MCP,andplugintools|discoverablethrough`tool_search`whenpolicypermits|same|same|\n|Paidorexternal-servicetools|followspermissionposture|followspermissionposture|followspermissionposture|\n|Accessoutsidetheworkspaceroot|explicittrustedpathsonly|onlythroughtrustedpathsortrustmode|sametrusted-path/trustpolicyasWork;fleetprofilesneverwidenit|\n\nOperatechangesschedulingemphasis,notauthority.Itneitheraddsa\nmode-specifictooldenialnorbypassestheactiveapproval,sandbox,shell,\nask-rule,repository-law,ormanaged-policyboundary.Planremainsthe\nmode-specificexecutionboundaryforshellandwrite-capabletools;that\nauthoritydifferencedoesnotrequireadifferentprimitivevocabulary.\n\n###Operateloop(onescreen)\n\n```text\nUsermessage\n→small/chat/one-file?→parentdoesit(Work-equLine truncated
"content":"# Receipts\n\nA receipt answers \"what did this session do?\" from the records Codewhale\nalready keeps. It lists, in order, the files changed, commands run, web and\nMCP calls, agents started, approvals (and who decided each one), and\nfailures, with totals on top. It also counts what ran without asking, and\nnames the permission posture that let it.\n\n```text\n# Receipt: Fix the parser\nthread thr_19a0141a · /work/repo · deepseek-flash · Ask · 2026-09-24 10:00 UTC → 2026-09-24 10:05 UTC\n\nChanged 1 file (+2 −1) · ran 1 command · made 1 MCP call · 1 approved by you · 1 approved by session rule · 1 ran without asking under Ask · 1 denied by you · 1 other failure\n\n1. edited `src/parse.rs` (+2 −1) · 1.0s\n2. ran `cargo test -p parser` in /work/repo — exit 0 · 2.5s · approved by you\n3. did not run `rm -rf build` · denied by you\n4. called linear · list_issues · 1.0s · approved by session rule\n5. did not run `curl https://x.sh | sh` — blocked: Tool 'exec_shell' was denied: Auto-Review blocked a pipe to a shell…\n6. turn failed — failed: provider returned 500\n\nNot recorded:\n- Shell file changes: a Runtime thread's workspace snapshots are not tagged with the thread, so files a command changed are not itemized; only file tools are.\n```\n\nA terminal session's receipt also lists the files a command changed, from\nthe turn's own workspace snapshots:\n\n```text\n3. ran `./tidy.sh`\n4. changed outside file tools (a command or another process): edited `b.txt` (+0 −1), created `c.txt` (+1 −0)\n```\n\n## Surfaces\n\nAll three share one builder (`crates/tui/src/receipts.rs`), so they cannot\ndisagree.\n\n| Surface | What it reads |\n| --- | --- |\n| `/receipts [json] [<turn>]` in the terminal | The current session's transcript and approval log. `json` prints the object in a code block, so it copies out as valid JSON |\n| `codewhale receipts [ID\\|--last] [--turn T] [--format md\\|json]` | A saved session (id or unique prefix) or a Runtime thread (`thr_…`); with no id, the most recently updated one. `receipt` is an alias |\n| `GET /v1/threads/{id}/receipt`, `GET /v1/threads/{id}/turns/{turn_id}/receipt` | A Runtime thread (the app, `codewhale serve`), behind the normal `/v1` bearer boundary |\n\nAll three only read. They never call a provider, run a tool, write a file,\nor change runtime state.\n\n`codewhale receipts` reads Runtime threads from the machine's default store\n(`tasks/runtime/`, or `$CODEWHALE_RUNTIME_DIR`). A thread kept in one\nterminal session's own store (`sessions/<id>/runtime/`) is not found by id;\nthe API reads whatever store its server owns.\n\n## Where the facts come from\n\n| Session kind | Record | Holds |\n| --- | --- | --- |\n| Terminal session | `sessions/<id>.json` | Every tool call and its result text, in order; each prompt's `<turn_meta>` names the posture the turn ran under |\n| Terminal session | `sessions/<id>/approval_receipts.jsonl` | Every approval ask and decision, with time and who decided |\n| Runtime thread | `tasks/runtime/turns`, `items` | Every tool call with its input, status, start and end time, and structured result (exit code, diff, agent status); each turn's `permission_posture` |\n| Runtime thread | `tasks/runtime/events/<thread>.jsonl` | `approval.required` / `approval.decided`, with the flags that say who decided |\n\n### Who decided an approval\n\n| Receipt says | Meaning | Recorded as |\n| --- | --- | --- |\n| approved by you / denied by you | A person answered: the terminal card, the app, the web mirror, or an API client acting for them | `decided_by: \"user\"`; Runtime event with no `auto` flag |\n| … by session rule | A remembered \"for this session\" rule answered | `decided_by: \"session_rule\"`; Runtime event with `auto` and a `grant_id` |\n| … by posture | The mode or permission posture answered without a prompt | `decided_by: \"posture\"`; Runtime event with `auto` or `posture` |\n| approval timed out | The card expired unanswered | outcome `timeout` |\n| turn stopped while waiting / nobody could be asked | Codewhale could not ask anyone: the turn had ended or stopped, or the request never reached a person. Counted as not answered, never as a denial, even where the record says `denied` | `decided_by: \"host\"` |\n| approved / denied, with no \"by\" | A record written before 0.10.1, or a sub-agent's request. The totals say \"(decider not recorded)\"|no`decided_by`|\n\nThetotalslinecountsapprovalsanddenialsseparately,bywhogavethem:\n`1approvedbyyou·1deniedbyyou`istwodecisions.\n\n###Ranwithoutasking\n\nMostcallsneverproduceanapproval.UnderFullAccessnothingasks;under\nAsk,readsandallowedtoolsrunwithoutaprompt,andarememberedrulecan\nskipone.Thosecallsleavenoapprovalrecord,sothereceiptcountsthem\ninstead:`ran_without_asking`iseveryfilechange,command,coderun,web\norMCPcall,andagentstartthatranwithnoapprovalonreLine truncated
"content":"# Configuration\n\ncodewhale reads configuration from a TOML file plus environment variables.\nAt process startup it may also load literal built-in-provider credentials from\na workspace-local `.env` file. Use the tracked `.env.example` as the template;\ncopy it to `.env`, then add only credential values.\n\nA workspace is not configuration authority. Codewhale therefore ignores\nconfig/profile/home paths, provider/model/base-URL routing, MCP/plugin state,\napproval/sandbox/shell posture, executable paths, runtime settings, and every\nother non-credential `.env` entry. Variable expansion is rejected so a\nrepository cannot substitute an ambient secret into a credential value. Use\n`config.toml`, CLI flags, or values exported by the launching shell for those\nexplicit control-plane settings. `.env` is read from a stable regular-file\nhandle, is capped at 1 MiB, and symbolic links, reparse points, and multiply\nlinked files are rejected.\n\n## Reading and checking configuration from the CLI\n\n`codewhale config get <key>` reads scalar keys, whole tables such as `tools`,\nand nested paths such as `tools.user_input_timeout_seconds`. Displayed tables\nand nested values apply the same recursive credential redaction as `config dump`.\n\n`config set` supports its named scalar keys and the provider, route, and\nnotification commands. It refuses a key that nothing reads and suggests the\nnearest real key (`config set calm_mod on` names `calm_mode`). A settings.toml\nkey such as `calm_mode` or `tool_collapse` is validated and written to the\nuser-global settings.toml, not config.toml; `config get` reads it back from\nthere even when an old config.toml copy (which nothing reads) is still present,\nand names that copy so you can `config unset` it. Settings keys have no project\nscope, so `--project` refuses them. A config.toml key is checked against the\ntype its reader expects and stored as a TOML boolean or number where the\nreader needs one (`yolo = true`, `max_subagents = 4`); `reasoning_effort`\naccepts the same aliases as `/effort` (#6563). Other dotted writes fail before\nmodifying the file and name the TOML table to edit. For example, set a tools\ntimeout in the file as:\n\n```toml\n[tools]\nuser_input_timeout_seconds = 0\n```\n\n`codewhale config doctor` checks credential presence and endpoint shape, and\nwarns about each config.toml root key that nothing reads: a settings.toml key\nleft in config.toml is named as misplaced, and any other unread key gets a\ndid-you-mean. Keys read by any runtime reader are not reported. The warnings do\nnot fail the check, and a clean result does not validate every runtime setting's\nvalue (#6083, #6563).\n\n## Constitution, project instructions, and repo authority\n\nCodewhale has several instruction surfaces. They are deliberately separate so a\npersonal constitution, repo policy, project instructions, and runtime security\ncontrols do not blur together.\n\n- **Bundled global Constitution** — the compiled base law in the binary. It is\n the default floor for every session.\n- **User-global constitution** — the normal guided setup output. Manage it with\n `/constitution` or `/setup`; Codewhale stores structured data at\n `$CODEWHALE_HOME/constitution.json` (default `~/.codewhale/constitution.json`)\n and renders it into a separate `<codewhale_user_constitution>` prose block.\n This can express preferences and stop conditions, but it does not change\n runtime approval policy, sandbox, shell, network, trust, or MCP permissions.\n- **Repo-local constitution** — optional project policy in\n `.codewhale/constitution.json`, described below.\n- **`AGENTS.md`** — cross-agent **project instructions** (prose). This is the\n canonical file for \"how should an agent work in this repo.\"Run`/init`to\nscaffoldone.`CLAUDE.md`and`.claude/instructions.md`arereadas\ncompatibilityfallbacks.\n-**Memoryandhandoffs**—recalledstate.Useful,butlowerauthoritythan\nconstitutionsandprojectinstructions.\n\n###Managingtheuser-globalconstitution(`/setup`and`/constitution`)\n\nThebundled**workingagreement**isthesafedefaultandnolongeraddsa\nrequiredfirst-runscreen.Customizeitlaterthrough`/constitution`orthe\nprogressive`/setup`guide.Provider/modelreadiness,workspacetrust,and\nruntimeposturestayseparatefromthisguidance.\n\nOnthe**Workingagreement**(constitution)step:\n\n-**`1`–`6`**tunetheguideddraft.**`G`**previewsit,and**`G`**again\nratifiesandsavesafreshstructured`constitution.json`.\n-**`A`**(shownonlywhenaproviderisconfigured)asksyourfirstconfigured\nmodeltodrafttheconstitution.Draftingis**not**saving:thedraftis\nrenderedthroughthesamepreviewandyoustillpress**`G`**toratify\nbeforeanythingpersists.\n-**`K`**keepsyourexistingloadedconstitutionunchanged(shownonlywhena\nvalidfileisalreadypresent).\n-**`U`**(or`/coLine truncated
"content":"# Historical Tool-Surface Lifecycle Policy (v0.8.53)\n\n> 阅读简体中文版:[zh_hans/TOOL_LIFECYCLE.md](zh_hans/TOOL_LIFECYCLE.md)\n\n**Status:** Historical design record, not current runtime documentation. The\nv0.9.1 canonical action surface and replay-only alias contract are documented in\n[`RUNTIME_SIMPLIFICATION_DESIGN.md`](RUNTIME_SIMPLIFICATION_DESIGN.md) and\n[`TOOL_SURFACE.md`](TOOL_SURFACE.md). No catalog code landed in this old cycle — the code\nwork is **deferred**. This document is the umbrella policy for GitHub **#2681**,\nwith **#2682** and **#2683** as concrete instances of the planned diet. It\ndescribes *what will be done* and the invariants any future diet PR must hold.\n\n**Scope of related open work (do not contradict):**\n- PR **#2684** — subagent role vocabulary, lifecycle signals, eval ergonomics.\n Legacy subagent-name cleanup + guardrail tests in this policy rebase on #2684.\n- PR **#2685** — git-history active + RLM/field errors.\n\n**What actually happened, so you can read the rest as history:** the \"hidden\ncompatibility\" plan below was *not* what shipped in full. `exec_wait` and\n`exec_interact` were removed rather than kept dispatchable. The work-progress\nsurface is different: `todo_write` is the sole model-visible name, while\n`work_update`, `TodoWrite`, `todo`, `checklist_write`, and `checklist_update`\nstay registered as hidden-compatibility aliases of `TodoWriteTool` so old\ntranscripts replay; `checklist_add`, `checklist_list`, `todo_add`,\n`todo_update`, and `todo_list` are not registered and are not callable.\n`tts`/`speech` remain dispatchable. See [`TOOL_SURFACE.md`](TOOL_SURFACE.md)\nfor the shipped contract. Read §4 and §8 as a rejected catalog-diet proposal,\nnot as a guarantee that every listed alias is gone.\n\n**All file:line citations here were correct at v0.8.52/0.8.53 and are now\nexpired.** They have not been rewritten, because renumbering a historical\nrecord makes it look current. Symbols this document cites that no longer exist\nat all include `ARCEE_FIRST_TURN_NATIVE_TOOLS` and `apply_provider_tool_policy`\n(both removed by `1bfcced43c`, \"fix(engine): remove Arcee tool catalog\nexception\"), and the planned `HIDDEN_COMPATIBILITY_TOOLS` / `DEPRECATED_ALIASES`\nsets, which were never written. Resolve any symbol here against the tree before\nacting on it.\n\n---\n\n## 1. Purpose and the weaker-model problem\n\nCodewhale ships a large native tool surface. The first-turn *active* partition\nof that surface is what every model sees before it has run a single\n`tool_search_*` call. Today that active set contains several **near-duplicate\ntools** that map to the *same* implementation under different names:\n\n- `exec_wait` and `exec_shell_wait` are both `ShellWaitTool`\n (`crates/tui/src/tools/registry.rs:526,529`).\n- `exec_interact` and `exec_shell_interact` are both `ShellInteractTool`\n (`registry.rs:527,530`).\n- `tts` and `speech` are both `SpeechTool`\n (`registry.rs:787-792`, both deferred).\n- `todo_write` is the single model-visible `TodoWriteTool` surface;\n `todo_write`, `TodoWrite`, `todo`, `checklist_write`, and\n `checklist_update` are hidden compat aliases of it.\n\nFor a strong model, redundant names are harmless noise. For **weaker / smaller\nmodels** (the Arcee Trinity lane, `deepseek-v4-flash` child executors, and any\nnon-thinking executor), every additional near-duplicate in the visible set is a\nreal cost:\n\n- It widens the choice space with options that do *nothing distinct*, increasing\n wrong-tool selection and oscillation between synonyms.\n- It spends scarce first-turn catalog budget (Section 5) on zero-information\n entries.\n- It dilutes the \"one name = one thing\"contractthatletsasmallmodelreason\naboutthesurfaceatall.\n\nThelifecyclepolicyexiststo**shrinkanddisciplinethemodel-visible\nsurface**withouteverbreakingtheabilitytoreplayanoldtranscriptthat\nreferencedanow-retiredname.\n\n###Canonicalwork-trackingsurfaceforv0.9.1\n\nThemodel-visibleprogresssurfaceisasingletool:`todo_write`(#4132).\nAgentsandFleetworkersuseitforconcreteTo-do/Workprogressunderthe\nactiveruntimethreadordurabletask.\n\n`task_*`andtheFleet/Workflowledgerremainthedurablelifecycleowners.\nChecklistmetadataisthemodel-visibleprojectionofprogress:\n`task_updates.checklist`carriesthecurrentitems,completionpercentage,and\nin-progressitem.\n\n**TheTo-doistheonlyWorksurface.**`update_plan`isconversational\nreasoning—strategy,context,androutenotesforcomplexinitiatives.Itis\nnotaprogresssurface,mustnotduplicateTo-doitems,andplan-onlystateis\nneverrenderedasaTo-dosnapshot.\n\n**Norequestre-statesthelist.**ThemodellearnswhatisontheTo-dotheway\nitlearnsanythingelse:fromitsown`todo_write`call,whoseinputisthe\nwholelist,andtheshortreceiptitreturned(countsandtheitLine truncated
"content":"# Fleet and sub-agents\n\n> 阅读简体中文版:[zh_hans/SUBAGENTS.md](zh_hans/SUBAGENTS.md)\n\nFleet manages saved models and role assignments for these same sub-agents.\nUse `agent` for an individual assignment and `workflow` for phases with\ndependencies and completion checks. See [Workflow authoring](WORKFLOW_AUTHORING.md)\nfor plans that use the Fleet model shortlist.\n\nFleet roles are the user-facing vocabulary for delegated work: a parent\nlaunches a focused `general`, `explore`, `planner`, `reviewer`, `implement`,\n`test`, or `advisor` through `agent` and gets back an `agent_id`, declared\ndeliverables, and effective limits while the worker runs. The default receipt is\ncompact; request addressed detail when you need the transcript handle or ledger.\nThe internal runtime type is `FleetRole` (formerly\n`SubAgentType`); the older role spellings (`worker`, `scout`, `plan`,\n`review`, `builder`, `verifier`, `consultant`, `oracle`, …) remain accepted only as a persisted/deserialize\ncompatibility adapter during v0.9.x. New prompts and config should use fleet\nnames.\n\nChild assignments run through the same `Engine::run_turn` planner, executor,\nSession and approval inbox as ordinary turns. The private captured ChildGrant\nnarrows tool actions, shell, workspace, network and descendant depth at the final\nexecution boundary. The existing SubAgentManager still owns launch slots,\ncoordination, worker checkpoints and terminal delivery; it does not run another\nmodel/tool loop. Work and the single bounded reporting turn share that configured\nchild Engine and its original deadline.\n\nTransient provider failures use Core's dispatch and retry boundaries. An exhausted\nbudget or interrupted request preserves the recorded checkpoint and a continuation\nhandle. Each actually dispatched attempt carries its original session, route and\nsource identity: provider usage is billed once, then projected to the worker\nledger. A successful response without usage and an unknown request outcome retain\ndistinct coverage gaps; neither is priced as zero. For work that must survive\nprocess restarts, sleep or remote execution, use Fleet or a Workflow-backed run.\n\nSub-agents inherit the parent's permitted tool registry, including `agent`\ncoordination. Spawning obeys one absolute depth ceiling: the root is depth 0,\nits child is depth 1, and a child at `max_spawn_depth` cannot spawn again.\nThe operator default is 3, with a hard ceiling of 8. A role, saved profile, or\ncompatibility request can only narrow that ceiling. Recovery and transcript\nforking retain the source's position and bounds; they do not buy another\ngeneration. The removed `agent_open`/`agent_eval`/`agent_close` lifecycle tools\nare absent from every registry.\n\nHealthy children continue after an ordinary parent response. Their completion\nreturns through the existing Engine inbox and can wake the parent for another\nnormal turn. Explicit interruption or cancellation remains authoritative.\n`detached: true` additionally opts a subtree out of parent-turn cancellation;\nit does not remove child budgets or the headless host's deadline.\n\nThis doc covers roles and individual worker controls. Use `workflow` to coordinate\nmultiple assignments through the same worker runtime; see the per-role prompts in\n`crates/tui/src/tools/subagent/mod.rs` (`*_AGENT_INTRO`) and the in-line\ntool description.\n\n## Role taxonomy\n\nThe `type` field on `agent` selects a fleet posture for the child\n(`agent_type` is accepted as a compatibility alias). Each role is a distinct\nstance toward the work — not just a different label.\n\n## Maintainer posture\n\nSub-agents help Codewhale move faster, but the parent agent still owns the\nmaintainer decision. Use children to gather evidence, review patches, and run\nverification while keeping the community posture in\n[`AGENT_ETHOS.md`](AGENT_ETHOS.md): issues are open intake, PR gates are\nreview-load controls, and harvested work needs clear contributor credit.\n\nWhen a child reviews community work, the parent should still inspect the PR\ndiff, linked issues, tests, and CI before merging, harvesting, closing, or\ndeferring it. A sub-agent's result is a working set, not a substitute for\nstewardship.\n\n| Role | Stance | Writes? | Network? | Shell posture | Typical use |\n|---------------|----------------------------------------|---------|----------|---------------|----------------------------------------------|\n| `general` | flexible; do whatever the parent says | yes | yes | yes | the default; multi-step tasks |\n| `explore` | read-only; map the relevant code fast | no | yes | bounded inspection | \"find every call site of `Foo`; check the PR with gh\" |\n| `planner` | analyse and produce a strategy | no | yes | read-only probes | \"designthemigration;dLine truncated
"content":"# Agent fleet\n\n> Baca terjemahan bahasa Indonesia: [id/FLEET.md](id/FLEET.md)\n\nAgent fleet is the local-first roster and member-selection layer for durable\nmulti-worker runs. It does not execute or authorize work. After fleet resolves\nwho should participate, the delegated coordinator launches a headless\n`codewhale exec` run and the Runtime tracks it durably. See\n[AGENT_RUNTIME.md](AGENT_RUNTIME.md) for how sub-agents, `exec`, and\nfleet-backed workers converge on one runtime. In product language, a user may\nstill \"open a sub-agent\"; in architecture language, durable nested work uses a\nfleet member identity with delegated runtime execution.\n\n## Naming and compatibility boundary\n\n**Fleet** is the public product noun. The durable ledger, saved rosters, config\ntables, and `--fleet` flag share that name:\n\n| Surface | Canonical |\n| --- | --- |\n| CLI | `codewhale fleet …` |\n| Slash command | `/fleet …` |\n\nThese shared names are load-bearing wherever changing them would break\nexisting workspaces, receipts, or scripts:\n\n- the durable ledger `.codewhale/fleet.jsonl` and the log directories\n `.codewhale/fleet/` and `.codewhale/fleet-host/`;\n- saved rosters `fleets/<name>.toml` and their `schema = \"fleet\"`header,under\n`$CODEWHALE_HOME/`ortheworkspace's`.codewhale/`(checked-inrostersatthe\nworkspaceroot's`fleets/`arestillread);\n-the`[fleet]`configtable(inline`[fleets.*]`tableswereremovedin0.9.14;namedfleetslivein`fleets/<name>.toml`files);\n-the`codewhaleworkflowrun--fleet<name>`flag;\n-wire,receipt,andcontrol-planeoperationidssuchas`fleet.status`.\n\nTherestofthisdocumentusesfleetasthepublicproductnounandretains\ntheseliteralpaths,keys,flags,andids.\n\nUseafleetrosterratherthananonymousshort-lived`agent`fanoutwhenevera\ndelegatedrunneedsstablememberidentitiesacrossretries,sleep/restart,\nremoteexecution,receipts,oraledgeredaudittrail.TheinitialCLIsurface\nis:\n\nForaguidedstart-to-monitorwalkthroughthatcombinesfleettaskspecswith\nWorkflowauthoring,see[fleet+WorkflowTutorial](FLEET_WORKFLOW_TUTORIAL.md).\n\n```sh\ncodewhalefleetinit\ncodewhalefleetruntasks.json--check#validateonly;nothingiscreatedorlaunched\ncodewhalefleetruntasks.json--max-workers4\ncodewhalefleetstatus\ncodewhalefleetinspect<worker-id>\ncodewhalefleetlogs<worker-id>\ncodewhalefleetartifacts<worker-id>\ncodewhalefleetinterrupt<worker-id>\ncodewhalefleetrestart<worker-id>\ncodewhalefleetresume<run-id>\ncodewhalefleetstop--all\n```\n\n`codewhalefleetresume<run-id>`istherestart-recoveryverb:itreplaysthe\nledger,reconcilesanyin-flightleasewhoseworkerstoppedheartbeating\n(retryingwithinthetask'sbudget,elsefailingandescalatingperthealert\npolicy),andprintsthepost-resumestatus.Itlaunchesnonewworkandis\nidempotent,soitissafetorunafteramanagerexit,laptopsleep,orruntime\nrestart.\n\nCoordinatorstateforfleet-backedrunsisstoredundertheworkspacein\n`.codewhale/fleet.jsonl`.Workerlogsandadapterlogsarestoredunder\n`.codewhale/fleet/`and`.codewhale/fleet-host/`.\n\n##Publiccontract:identity,membership,andselection\n\n**Fleet**=theuser'smodelinventory:whoisintherosterandwhichmemberisselected.\n\nApublicfleetidentityconsistsonlyof:\n\n-astablememberidandanoptionaluser-facingname;\n-asemanticrole,suchas`explore`,`implement`,or`reviewer`(thelegacy\nspellings`worker`,`scout`,`builder`,`verifier`,`consultant`,and`oracle`\narestillacceptedoninputandmapto`general`,`explore`,`implement`,\n`test`,and`advisor`);\n-anexactprovider/modelidentity,oranexplicitinheritedroute;\n-visiblerosterstateororigin.\n\nProjectorworkspacetrust,filesystemandnetworkreach,secretaccess,\napprovalmode,sandboxing,toolauthorization,andeveryotherformofruntime\nauthorityareseparatedelegated-coordinationandRuntimepolicyinputs.They\nareneverfleetidentityfields,andtheyneverselectorrerouteafleet\nmember.TheRuntimeappliesandclampsthosepoliciesonlyaftermember\nselection;iftheselectedmembercannotruninsidetheeffectiveenvelope,\nlaunchfailsclosedinsteadofchoosingsomebodyelse.\n\nNatural-languagememberselectionisdeterministic.Acallermayname:\n\n-anexactmemberid,optionallyas`member:<id>`or`id:<id>`;\n-auniqueuser-facingmembername,optionallyas`name:<name>`;\n-auniquesemanticrole,forexample`explore`or`role:explore`;\n-anexactpinnedmodelid,forexample`deepseek-v4-flash`,oritsoffline\ndisplayname,forexample`DeepSeekV4Flash`;or\n-anexact`route:<provider>/<model>`.\n\nAnunqualifiedexactmemberidwins.Everyothermatchsucceedsonlywhenit\nidentifiesonedistinctrostermember.Multiplematchesproduceanambiguity\nerrorLine truncated
"content":"# Workflow Authoring\n\n> 阅读简体中文版:[zh_hans/WORKFLOW_AUTHORING.md](zh_hans/WORKFLOW_AUTHORING.md)。\n\n> **Ordinary multi-agent work does not require this file.** In Operate, send\n> normal messages. Small work stays direct; multiple delegated steps use a\n> compact Workflow plan with dependencies, bounded scopes, and completion\n> evidence. Fleet manages the same sub-agents and roles. One bounded,\n> independent task can use a direct agent, with `followup` for continued work.\n> Act/Agent may also use optional soft-auto launch. See\n> [Automatic Workflows](AUTOMATIC_WORKFLOWS.md).\n\nWorkflow has one runtime boundary: authored source lowers to typed\nRust `WorkflowSpec`, Rust validates the IR, and the scheduler/headless worker\nruntime executes leaves. Authoring languages do not get hidden authority to own\nfiles, shell, network, providers, cancellation, or TUI state.\n\nCompatibility launch paths on the `workflow` tool:\n\n| Input | When to use |\n|-------|-------------|\n| `plan` | Structured goal / phases / children (preferred agent path) |\n| `script` | Short inline JS the model owns |\n| `source_path` | Checked-in `.workflow.js` / `.workflow.ts` in the workspace |\n\nUse `agent(action=\"roster\")` to inspect the saved Fleet models and roles before\nassigning children. Native plan children accept `model` for a saved shortlist\nselector, or `role`/`profile` for a saved assignment. Named Exact Fleets keep\ntheir member routes fixed and reject per-step model overrides. Plan children\nalso accept `cwd`, a repository-relative working directory — required in\nmulti-repository workspaces so the child (and worktree isolation) resolves the\nright repository, mirroring `task({cwd})`.\n\nFor a guided walkthrough from fleet task specs to Workflow authoring and\nmonitoring, see [fleet + Workflow Tutorial](FLEET_WORKFLOW_TUTORIAL.md).\n\n\n## Access model\n\nThe Workflow script is a **coordinator only**. It has no filesystem or shell of\nits own. Real work happens in sub-agents the script launches.\n\n| Layer | What it can access |\n|-------|--------------------|\n| Workflow script (JS VM) | Script variables, branching/loops, `task()` / `parallel()` / `pipeline()`, `phase` / `log`, `budget` / `args`. **No** direct FS, shell, network, env, imports, clock, or randomness. |\n| Workflow-spawned sub-agents | Normal tool surface (read/search/edit/write, shell, web, MCP) subject to role posture, allowlists, and parent policy. File edits for write-capable roles auto-accept under Workflow; shell / web / MCP still require parent auto-approve or fail closed. |\n| Parent session | Working directory, configured tools/MCP, permission mode, sandbox/network rules. |\n\n### Scale\n\n- Up to **16 concurrent** live agents in one run (additional spawns wait for a slot).\n- Up to **1_000 agents per run** (VM lifetime spawn cap).\n- Configured `max_children` and `max_concurrent` can narrow these limits.\n- Automatic launch is model-judged on scope; the host enforces only the hard `max_children` / `max_depth` ceilings.\n- Plan the population the work needs and let the host queue and clamp it.\n These ceilings are enforcement, not a reason to pre-shrink a valid plan.\n\nSee the Workflow JS sandbox tests for the fail-closed host surface inventory.\n\n## Language Choice\n\n| Surface | Strength | Tradeoff | Stance |\n|---|---|---|---|\n| YAML / JSON IR | Simple, reviewable, no runtime | Verbose for generated workflows | Keep as interchange/debug format |\n| JavaScript | Familiar object syntax and easy agent generation | Unsafe if executed as a general runtime | First-class authoring through declarative compile-only subset |\n| TypeScript | Best editor/types story for workflow SDK | Needs stripping/typechecking if full TS is supported | Same compile-only subset for now; richer SDK later |\n\nThe default high-capability path is TypeScript/JavaScript authoring, but only as\na compile step. The compiler accepts a JSON-compatible object inside\n`workflow({...})` from `.workflow.js` or `.workflow.ts`, lowers it to\n`WorkflowSpec`, and runs the Rust validation gate. (Starlark authoring was a\nbootstrap reference and has been removed; Workflow authoring is JS-only.)\n\n## Contract\n\nAccepted source shape:\n\n```js\nexport default workflow({\n \"id\": \"issue-audit-js\",\n \"goal\": \"Audit an issue fix with parallel agents\",\n \"nodes\": [\n {\n \"branch\": {\n \"id\": \"parallel-audit\",\n \"children\": [\n { \"agent\": { \"id\": \"code-audit\", \"prompt\": \"Review code\", \"agent_type\": \"review\" } },\n { \"agent\": { \"id\": \"test-audit\", \"prompt\": \"Review tests\", \"agent_type\": \"verifier\" } }\n ]\n }\n },\n { \"reduce\": { \"id\": \"summary\", \"inputs\": [\"code-audit\", \"test-audit\"], \"prompt\": \"Summarize\"}}\n]\n});\n```\n\nSupportednodewrappers:`agent`,`branch`,`sequence`,`reduce`,\n`teacher_review`,`loop_until`,Line truncated
"content":"# Codewhale product telemetry\n\n> 阅读简体中文版:[zh_hans/TELEMETRY.md](zh_hans/TELEMETRY.md)\n\n**Usage analytics are on by default in the current source.** The first\ninteractive launch gives a localized, nonblocking disclosure naming **Codewhale\nand PostHog**, with a direct route to turn counting off. Notice version `5`\ndescribes this policy; displaying it is not recorded as human acceptance.\nMissing an older acceptance record does not turn a fresh installation off.\nExisting explicit opt-outs remain off across upgrades, and unreadable privacy\nstate fails closed. Environment and CLI kill switches still take precedence.\n\nRead the disclosure with `codewhale config telemetry`. Turn usage off in\n`/settings` or run `codewhale config set telemetry false`. Turning it back on\nin Settings or with `codewhale config set telemetry true` updates the existing\ndurable preference and privacy records for new sessions. The compatibility\ncommand `codewhale config telemetry --accept-notice 5` remains available, but\nis not required for a fresh installation. Collection never includes work content or credentials.\n\nThe PostHog sink is optional and inert until the ingest operator explicitly\nconfigures a project token and approved regional host, and records staging\nproof that the actual egress path does not forward the original client IP.\nSource readiness does not establish a deployment, an activated processor,\nan egress receipt, or a retention setting.\n\nCodewhale does not collect conversations, code, prompts, files, file/repo/branch\nnames, model content, or credentials. It sends no per-turn or per-tool timeline.\nIt does send the closed, aggregate schema below: version and platform classes,\nsession duration/outcome, feature/error counters, and a random install id that\nrotates every 90 days.\n\n**There is now a real endpoint.** An enabled session sends its batches to the\nfirst-party ingest service at `https://telemetry.codewhale.net/v1/telemetry`,\nwhich is the shipped default for `telemetry_endpoint`. What that service is,\nwhat it stores, and what it structurally cannot store is spelled out in \"What\nthe endpoint does\" below.\n\n**To send nothing anywhere, turn telemetry off** (see \"Turning it off\"). To stay\nenabled but contact nobody, set `telemetry_endpoint = \"\"`:batchesarethen\nappendedto`$CODEWHALE_HOME/telemetry/dryrun.jsonl`onyourownmachine,byte\nforbytewhattheserverwouldhavereceived,andnoHTTPclientisever\nconstructed.Thatfileishowyouauditthisdocumentagainstreality.\n\nThisdocumentistheschema.Itisnotasummaryoftheschema:atestin\n`crates/telemetry`parsesthefieldnamesoutofthisfileandassertsset\nequalityagainstthestructstheserializeractuallyuses,soafieldthatis\nhereandnotinthecode—orinthecodeandnothere—failsthebuild.\n\nLocalsavedsessionsand`codewhalemetrics`remainavailablewithtelemetry\ndisabledandrequirenoaccountorhostedreportingservice.Disablingtelemetry\ndoesnotdisablelocalusagereceipts.\n\n##Turningitoff\n\nTherearetwooffswitchesandtheydodifferentthings.Bothstopcollection\ncompletely;onlyoneofthemerasesanything.\n\n```sh\ncodewhaleconfigsettelemetryfalse#optout:stopscollectionanderasesstate\nCODEWHALE_TELEMETRY=0codewhale#killswitch:stopscollection,erasesnothing\ncodewhale--telemetryfalse#thesamekillswitch,foronecommand\n```\n\n**`telemetry=false`intheconfigfileistheopt-out.**Itisafloor:\n`--telemetrytrue`and`CODEWHALE_TELEMETRY=1`bothlosetoit,becausea\nsettingyoucanundobyaccidentfromawrapperscriptisnotasetting.It\ndeletestherandominstallid,truncateseverybufferedeventandeverydry-run\nrecord,andwritesatombstone.Appends,identity/statewrites,anddeliveryall\nsharethewipe'sorderinglock,soonceopt-outreturnsnopre-opt-outwriteor\nPOSTremainsinflight.Ifanypartofthatwipefails,thetombstoneisstill\nthereandthebufferisundrainable—afailedwipefailsclosed.Everylater\nrunre-assertsthesametombstoneforaslongasthesettingstands,soit\nsurvives.Turningtelemetrybackonin`/settings`recordsthatexplicitpreference\ninbothexistingprivacyregisters;afreshlaunchcanthenclearthetombstone.Nothingbufferedbeforethatpointis\neversent.\n\n**Theenvironmentvariableandtheflagarekillswitches,notopt-outs.**\nTelemetryisofffortherun,nothingiswritten,nothingissent—and\nnothingondiskistouchedordeleted.Thatisdeliberate:aharnessoragent\nthatsets`CODEWHALE_TELEMETRY=0`foronecommandmustnotsilentlydiscardthe\ninstallidandthedry-runrecordsofthepersonwhoownsthemachine.Ifyou\nwanttheerasingkind,usetheconfigfile.\n\n`CODEWHALE_TELEMETRY`(andits`DEEPSEEK_TELEMETRY`alias)accepts\n`0`,`1`,`true`,`false`,`yes`,`no`,Line truncated
"content":"# `/preview-request` — see the outbound request without sending it\n\n`/preview-request` renders a **request manifest**: a typed, redacted\ndescription of the request the next **primary agent turn** would send. It never\nsends that request, never appends to the conversation, and never writes engine,\nsession, or Work state. `/dryrun` and `/preview_request` are compatibility\naliases.\n\nIt is a human command. There is deliberately no model-visible tool for it.\n\n```\n/preview-request # session facts; route/body reported unavailable\n/preview-request json # same manifest as JSON\n/preview-request --prompt <text> # the next turn for that prompt\n/preview-request json --prompt <text> # both\n/preview-request base-prompt # exact base layer only; no runtime additions\n```\n\n### Argument grammar\n\n```\nargs := flag* [ \"--prompt\" <whitespace> prompt ]\nflag := json | --json | manifest | --manifest | prompt | base-prompt | --base-prompt\nprompt := every remaining byte, verbatim\n```\n\n**Flags come before `--prompt`, which is terminal.** Everything after it is\nprompt text — including a trailing `json`. `/preview-request --prompt fix it\njson` previews the prompt *\"fix it json\"* as a human table; the JSON spelling\nis `/preview-request json --prompt fix it`. There is exactly one reading of any\ninput, and an unknown argument before `--prompt` is rejected rather than\nguessed at.\n\n**The prompt keeps your bytes.** Repeated whitespace and newlines inside it\nsurvive; exactly one whitespace codepoint separates `--prompt` from its text\nand is consumed as syntax. Any additional leading whitespace, plus all\ntrailing whitespace and newlines, remains prompt data. The prompt is hashed\ninto the previewed body, so normalizing it would describe a request that\ndiffers from the real one in the one field you typed.\n\n`prompt` remains a compatibility alias for the ordinary protected manifest.\n`base-prompt` / `--base-prompt` are an explicit, human-only disclosure mode:\nthey print exactly the effective base-prompt bytes and nothing else. They\ncannot be combined with JSON or `--prompt`. Effective system text is never\nprinted because it can contain project instructions, skills, and memory.\n\n## `--prompt` is necessary for an exact manifest, and not always sufficient\n\nThe next user message is **part of the request**. Without it there is no\nnext-turn body to describe, and under auto model routing there is not even a\nroute: the route is decided by the text you have not typed yet.\n\nSo the manifest is sectioned, and each section is either exact or typed-absent:\n\n| Section | Exact when |\n| --- | --- |\n| `session` | always — posture, gates, base-prompt provenance, requested model/reasoning |\n| `route` | `--prompt` was supplied, an active goal has not exhausted its token budget, a fixed route is selected, no `message_submit` hooks are configured, and the shared planner resolved that route |\n| `tools` | the route is exact **and** the MCP tool state can be snapshotted without connecting |\n| `body` | the tool surface and authoritative Work snapshot are exact **and** no runtime transform would rewrite the request first |\n\n### Why a section stops being exact\n\n| Typed reason | What a real turn would do that an inspection may not |\n| --- | --- |\n| `auto-route-unresolved-until-next-prompt` | decide the route from text you have not typed |\n| `auto-route-classification-not-executed` | call the provider-backed Auto classifier; preview is strictly offline, so production must resolve it |\n| `no-hypothetical-prompt-supplied` | send a message the manifest does not have |\n| `message-submit-hooks-not-executed` | run mutable hooks that can rewrite or block the text — and therefore the route, tool policy, and body derived from it |\n| `prompt-resolution-failed` | fail the same way on skill authority or file mentions |\n| `route-plan-failed` | fail route resolution or preflight |\n| `mcp-state-not-snapshottable` | connect MCP servers and discover tools this catalog does not contain |\n| `runtime-transforms-before-send` | auto-compact, run context-overflow recovery, inject a background-shell completion, allow a running or terminal-undelivered child to complete, or flush pending LSP diagnostics before the first request |\n| `work-state-not-snapshottable` | read the current graph-backed Work projection; preview never substitutes an asynchronously published, potentially stale To-do view |\n| `goal-token-budget-exhausted` | stop the active goal before dispatch because durable token usage has reached the configured budget |\n| `goal-state-not-snapshottable` | decide whether the active goal's terminal budget gate permits another request |\n| `request-preparation-failed` | build no body at all |\n\n**`mcp-state-not-snapshottable` takes the body with it.** A catalog missing its\nMCP contribution is not \"the same request with no MCP tools\"—areLine truncated
"content":"# RFC: Hook Lifecycle Data Flow\n\n**Issue:** #1364\n**Status:** Implemented (all three PRs landed)\n**Date:** 2026-05-28\n**Reference:** the shipped contract lives in [docs/HOOKS.md](../HOOKS.md);\nthis RFC is kept as the design record. Where the two disagree, `docs/HOOKS.md`\nis correct and this document is history.\n\n**Scope:** everything below landed as a **TUI runtime** feature. No hook in\nthis RFC fires from `codewhale exec`, the CLI subcommands, the app-server /\nACP surfaces, or the `workflow` tool. The RFC's use of \"Codewhale\" as the\nactor should be read as \"the Codewhale TUI\"throughout.\n\n##0.Implementationstatus\n\nVerifiedagainst`crates/tui/src/hooks/`anditscallsites:\n\n|Item|Status|Where|\n|---|---|---|\n|PR1—mutable`message_submit`|implemented|`HookExecutor::execute_message_submit_transform`,calledfrom`dispatch_user_message_with_recovery`|\n|PR2—`turn_end`|implemented|`HookEvent::TurnEnd`,`turn_end_payload`,firedby`execute_turn_end_observer_hook`|\n|PR3—subagentobservers|implemented|`HookEvent::SubagentSpawn`/`SubagentComplete`,firedby`execute_subagent_observer_hook`|\n\nTwodeliberatedeltasfromthetextbelow,bothshipped:\n\n-**`tool_call_before`alsobecamemutable**(#3026),whichthisRFClistedasa\nnon-goalforPR1.ItcarriesitsownstdoutJSONcontract\n(`decision`/`reason`/`updatedInput`/`additionalContext`)plusthelegacy\nexit-code-`2`harddeny.`message_submit`isthereforenolongertheonly\neventwithastdoutcontract;`shell_env`'s`KEY=VALUE`contractalsopredates\nboth.\n-**`turn_end`observersarenotgatedby`continue_on_error`.**Thestructured\nobserverpathrunseverymatchinghookregardless,becauseanobserverthat\nfailsmustnotsuppresstheobserversbehindit.\n\nStillunimplementedfromthetextbelow:nothinginscope.`stop_hook_active`is\nemittedas`false`andthere-entryprotectionitreservesroomforhasnotbeen\nbuilt.\n\nFourcontractpointshardenedafterthisRFC,alldocumentedin\n`docs/HOOKS.md`:\n\n-**Onesessionidentity.**ThehooksessionidismintedonceperTUIlaunch\nandsurvivesaworkspaceswitchoratrustdecisionthataddsprojecthooks.\n`tool_call_before`reportsthatidratherthantheengine'sownsessionid,\nand`mode_change`carriesitatall(itpreviouslycarriednosessionid).\n-**Timeoutsbindbackgroundhookstoo.**Abackgroundhookissupervisedon\nitsownthread;onexpiryitsprocessgroupiskilledandreaped.\n-**`background`describesscheduling,notcapability.**Abackgroundhook\nreceivesthesamestdinpayloadandenvironmentastheforegroundform;it\nissimplyneverawaited,soits`HookResult`isflaggedasasubmissionand\ncarriesnoexitcode.\n-**Conditionsthatcannevermatcharerejectedatload**ratherthanleft\nsilentlyinert—perentry,soabrokenhookdoesnottakeasame-namedor\nlikewise-unnamedsiblingwithit—anda`tool_call_before`gatethatreturns\nnoverdictdoesnotreadaspermissionwhen*thatgate*declared\n`continue_on_error=false`.Strictnessridesonthehookresult,soit\nappliesonlytothehookswhoseconditionsmatchedthecallinquestion.\n\n##1.Problem\n\nCodewhalealreadyhaslifecyclehooksandMCPsupport,butthecurrenthook\nsurfaceismostlyobserver-only.Thisblocksportableextensionsthatneedto\nparticipateintheagentdataflow:\n\n-memory/contextinjectionbeforeausermessagereachesthemodel\n-post-turnbackgroundanalysisthatpreparescontextforthenextturn\n-sub-agentlifecyclevisibilityfororchestrationandauditextensions\n\nThecurrent`message_submit`eventfiresbeforedispatch,butitsoutputis\nignored.`TurnComplete`,`AgentSpawned`,and`AgentComplete`existinternally,\nbuttheyarenotexposedasconfigurablehookevents.\n\n##2.PRsplit\n\nThisissueshouldbeimplementedasthreePRs.EachPRshouldbeindependently\nreviewableandshouldleavethehooksysteminausefulstate.\n\n###PR1:Mutable`message_submit`\n\nAddastructuredhookexecutionpathfor`message_submit`thatcantransformor\nblocktheuser'ssubmittedtextbeforeitissenttotheengine.\n\nScope:\n\n-keeptheexisting`[[hooks.hooks]]`configshape\n-passaJSONpayloadtothehookonstdin\n-interpretstdoutJSONcontaining`text`asthereplacementusertext\n-treatexitcode`2`asanintentionalblock\n-runmultiplesubmithooksseriallyinconfigorder\n-keepexistingenvvarsforcompatibility\n-keep`shell_env`stdoutparsingunchanged\n\nNon-goals:\n\n-notoolargumentmutation\n-noglobalstdoutJSONsemanticsforallhookevents\n-notranscriptormodelresponsemutation\n\n###PR2:`turn_end`\n\nExposetheexistingturncompletionlifecycleasahookevent.\n\nScope:\n\n-add`HookEvent::TurnEnd`witheventname`turn_end`\n-firefromtheUI's`EngineLine truncated
"content":"# Configuration\n\ncodewhale reads configuration from a TOML file plus environment variables.\nAt process startup it may also load literal built-in-provider credentials from\na workspace-local `.env` file. Use the tracked `.env.example` as the template;\ncopy it to `.env`, then add only credential values.\n\nA workspace is not configuration authority. Codewhale therefore ignores\nconfig/profile/home paths, provider/model/base-URL routing, MCP/plugin state,\napproval/sandbox/shell posture, executable paths, runtime settings, and every\nother non-credential `.env` entry. Variable expansion is rejected so a\nrepository cannot substitute an ambient secret into a credential value. Use\n`config.toml`, CLI flags, or values exported by the launching shell for those\nexplicit control-plane settings. `.env` is read from a stable regular-file\nhandle, is capped at 1 MiB, and symbolic links, reparse points, and multiply\nlinked files are rejected.\n\n## Reading and checking configuration from the CLI\n\n`codewhale config get <key>` reads scalar keys, whole tables such as `tools`,\nand nested paths such as `tools.user_input_timeout_seconds`. Displayed tables\nand nested values apply the same recursive credential redaction as `config dump`.\n\n`config set` supports its named scalar keys and the provider, route, and\nnotification commands. It refuses a key that nothing reads and suggests the\nnearest real key (`config set calm_mod on` names `calm_mode`). A settings.toml\nkey such as `calm_mode` or `tool_collapse` is validated and written to the\nuser-global settings.toml, not config.toml; `config get` reads it back from\nthere even when an old config.toml copy (which nothing reads) is still present,\nand names that copy so you can `config unset` it. Settings keys have no project\nscope, so `--project` refuses them. A config.toml key is checked against the\ntype its reader expects and stored as a TOML boolean or number where the\nreader needs one (`yolo = true`, `max_subagents = 4`); `reasoning_effort`\naccepts the same aliases as `/effort` (#6563). Other dotted writes fail before\nmodifying the file and name the TOML table to edit. For example, set a tools\ntimeout in the file as:\n\n```toml\n[tools]\nuser_input_timeout_seconds = 0\n```\n\n`codewhale config doctor` checks credential presence and endpoint shape, and\nwarns about each config.toml root key that nothing reads: a settings.toml key\nleft in config.toml is named as misplaced, and any other unread key gets a\ndid-you-mean. Keys read by any runtime reader are not reported. The warnings do\nnot fail the check, and a clean result does not validate every runtime setting's\nvalue (#6083, #6563).\n\n## Constitution, project instructions, and repo authority\n\nCodewhale has several instruction surfaces. They are deliberately separate so a\npersonal constitution, repo policy, project instructions, and runtime security\ncontrols do not blur together.\n\n- **Bundled global Constitution** — the compiled base law in the binary. It is\n the default floor for every session.\n- **User-global constitution** — the normal guided setup output. Manage it with\n `/constitution` or `/setup`; Codewhale stores structured data at\n `$CODEWHALE_HOME/constitution.json` (default `~/.codewhale/constitution.json`)\n and renders it into a separate `<codewhale_user_constitution>` prose block.\n This can express preferences and stop conditions, but it does not change\n runtime approval policy, sandbox, shell, network, trust, or MCP permissions.\n- **Repo-local constitution** — optional project policy in\n `.codewhale/constitution.json`, described below.\n- **`AGENTS.md`** — cross-agent **project instructions** (prose). This is the\n canonical file for \"how should an agent work in this repo.\"Run`/init`to\nscaffoldone.`CLAUDE.md`and`.claude/instructions.md`arereadas\ncompatibilityfallbacks.\n-**Memoryandhandoffs**—recalledstate.Useful,butlowerauthoritythan\nconstitutionsandprojectinstructions.\n\n###Managingtheuser-globalconstitution(`/setup`and`/constitution`)\n\nThebundled**workingagreement**isthesafedefaultandnolongeraddsa\nrequiredfirst-runscreen.Customizeitlaterthrough`/constitution`orthe\nprogressive`/setup`guide.Provider/modelreadiness,workspacetrust,and\nruntimeposturestayseparatefromthisguidance.\n\nOnthe**Workingagreement**(constitution)step:\n\n-**`1`–`6`**tunetheguideddraft.**`G`**previewsit,and**`G`**again\nratifiesandsavesafreshstructured`constitution.json`.\n-**`A`**(shownonlywhenaproviderisconfigured)asksyourfirstconfigured\nmodeltodrafttheconstitution.Draftingis**not**saving:thedraftis\nrenderedthroughthesamepreviewandyoustillpress**`G`**toratify\nbeforeanythingpersists.\n-**`K`**keepsyourexistingloadedconstitutionunchanged(shownonlywhena\nvalidfileisalreadypresent).\n-**`U`**(or`/coLine truncated
"content":"# Claude Plugin Compatibility\n\nCodewhale treats Claude Code skill folders as instruction bundles when they are\nplain `SKILL.md` directories. It does not run Claude Code plugin runtimes.\n\n## Supported\n\n- Workspace or global `.claude/skills/<name>/SKILL.md` directories discovered by\n the normal skill registry.\n- GitHub or tarball installs that contain one selected skill directory such as\n `skills/<name>/SKILL.md`, `.agents/skills/<name>/SKILL.md`,\n `.claude/skills/<name>/SKILL.md`, or a nested package layout ending in\n `skills/<name>/SKILL.md`.\n- Companion files inside the selected skill directory, such as `references/`,\n `examples/`, or scripts that are only used after the skill is explicitly\n loaded and trusted.\n\n## Compatible plugin bundles\n\nSince v0.9.13, `/plugin install` accepts the declarative subset described in\n[Installing plugins](PLUGINS.md): nested `.claude-plugin/plugin.json` metadata,\nroot skills, commands and agent profiles, plus inline MCP declarations or\n`.mcp.json`. Local sources in Claude marketplace catalogs resolve from the\nrepository root outside `.claude-plugin`.\n\nExact `${ENV_NAME}` MCP header references map to Codewhale's environment-backed\ncredentials, including `Authorization: Bearer ${ENV_NAME}`. Literal credential\nvalues and compound header templates are rejected; importing never reads the\nreferenced environment variables.\n\nThe importer uses Codewhale's existing adapters, review hashes and enablement.\nA Claude marketplace's labels or defaults grant no authority. Bundles are not\nscanned from another application's plugin roots or activated automatically.\n\n## Unsupported runtime features\n\nThe importer rejects hooks, LSP declarations, custom MCP file paths, and\n`${CLAUDE_PLUGIN_ROOT}` expansion. It does not run plugin build steps,\nTypeScript agents, dashboard servers, shared plugin state, or token-gated\nservice processes. Claude-specific frontmatter behavior such as `model: inherit`\nis not an additional runtime contract. Remote MCP authentication still follows\nCodewhale's existing plugin credential boundary; installation does not complete\nOAuth or borrow another application's credentials.\n\n`/skill install` remains a separate one-skill operation: it rejects multi-skill\nplugin archives rather than silently selecting one directory and dropping other\ncomponents. Use `/plugin install` for supported bundles, or migrate one explicit\nskill directory when the repository depends on unsupported runtime behavior.\n\nSee [PLUGIN_BUNDLES.md](PLUGIN_BUNDLES.md) for discovery, review and activation.\n"
"content":"# Claude Plugin Compatibility\n\nCodewhale treats Claude Code skill folders as instruction bundles when they are\nplain `SKILL.md` directories. It does not run Claude Code plugin runtimes.\n\n## Supported\n\n- Workspace or global `.claude/skills/<name>/SKILL.md` directories discovered by\n the normal skill registry.\n- GitHub or tarball installs that contain one selected skill directory such as\n `skills/<name>/SKILL.md`, `.agents/skills/<name>/SKILL.md`,\n `.claude/skills/<name>/SKILL.md`, or a nested package layout ending in\n `skills/<name>/SKILL.md`.\n- Companion files inside the selected skill directory, such as `references/`,\n `examples/`, or scripts that are only used after the skill is explicitly\n loaded and trusted.\n\n## Compatible plugin bundles\n\nSince v0.9.13, `/plugin install` accepts the declarative subset described in\n[Installing plugins](PLUGINS.md): nested `.claude-plugin/plugin.json` metadata,\nroot skills, commands and agent profiles, plus inline MCP declarations or\n`.mcp.json`. Local sources in Claude marketplace catalogs resolve from the\nrepository root outside `.claude-plugin`.\n\nExact `${ENV_NAME}` MCP header references map to Codewhale's environment-backed\ncredentials, including `Authorization: Bearer ${ENV_NAME}`. Literal credential\nvalues and compound header templates are rejected; importing never reads the\nreferenced environment variables.\n\nThe importer uses Codewhale's existing adapters, review hashes and enablement.\nA Claude marketplace's labels or defaults grant no authority. Bundles are not\nscanned from another application's plugin roots or activated automatically.\n\n## Unsupported runtime features\n\nThe importer rejects hooks, LSP declarations, custom MCP file paths, and\n`${CLAUDE_PLUGIN_ROOT}` expansion. It does not run plugin build steps,\nTypeScript agents, dashboard servers, shared plugin state, or token-gated\nservice processes. Claude-specific frontmatter behavior such as `model: inherit`\nis not an additional runtime contract. Remote MCP authentication still follows\nCodewhale's existing plugin credential boundary; installation does not complete\nOAuth or borrow another application's credentials.\n\n`/skill install` remains a separate one-skill operation: it rejects multi-skill\nplugin archives rather than silently selecting one directory and dropping other\ncomponents. Use `/plugin install` for supported bundles, or migrate one explicit\nskill directory when the repository depends on unsupported runtime behavior.\n\nSee [PLUGIN_BUNDLES.md](PLUGIN_BUNDLES.md) for discovery, review and activation.\n"
"content":"# Configuration\n\ncodewhale reads configuration from a TOML file plus environment variables.\nAt process startup it may also load literal built-in-provider credentials from\na workspace-local `.env` file. Use the tracked `.env.example` as the template;\ncopy it to `.env`, then add only credential values.\n\nA workspace is not configuration authority. Codewhale therefore ignores\nconfig/profile/home paths, provider/model/base-URL routing, MCP/plugin state,\napproval/sandbox/shell posture, executable paths, runtime settings, and every\nother non-credential `.env` entry. Variable expansion is rejected so a\nrepository cannot substitute an ambient secret into a credential value. Use\n`config.toml`, CLI flags, or values exported by the launching shell for those\nexplicit control-plane settings. `.env` is read from a stable regular-file\nhandle, is capped at 1 MiB, and symbolic links, reparse points, and multiply\nlinked files are rejected.\n\n## Reading and checking configuration from the CLI\n\n`codewhale config get <key>` reads scalar keys, whole tables such as `tools`,\nand nested paths such as `tools.user_input_timeout_seconds`. Displayed tables\nand nested values apply the same recursive credential redaction as `config dump`.\n\n`config set` supports its named scalar keys and the provider, route, and\nnotification commands. It refuses a key that nothing reads and suggests the\nnearest real key (`config set calm_mod on` names `calm_mode`). A settings.toml\nkey such as `calm_mode` or `tool_collapse` is validated and written to the\nuser-global settings.toml, not config.toml; `config get` reads it back from\nthere even when an old config.toml copy (which nothing reads) is still present,\nand names that copy so you can `config unset` it. Settings keys have no project\nscope, so `--project` refuses them. A config.toml key is checked against the\ntype its reader expects and stored as a TOML boolean or number where the\nreader needs one (`yolo = true`, `max_subagents = 4`); `reasoning_effort`\naccepts the same aliases as `/effort` (#6563). Other dotted writes fail before\nmodifying the file and name the TOML table to edit. For example, set a tools\ntimeout in the file as:\n\n```toml\n[tools]\nuser_input_timeout_seconds = 0\n```\n\n`codewhale config doctor` checks credential presence and endpoint shape, and\nwarns about each config.toml root key that nothing reads: a settings.toml key\nleft in config.toml is named as misplaced, and any other unread key gets a\ndid-you-mean. Keys read by any runtime reader are not reported. The warnings do\nnot fail the check, and a clean result does not validate every runtime setting's\nvalue (#6083, #6563).\n\n## Constitution, project instructions, and repo authority\n\nCodewhale has several instruction surfaces. They are deliberately separate so a\npersonal constitution, repo policy, project instructions, and runtime security\ncontrols do not blur together.\n\n- **Bundled global Constitution** — the compiled base law in the binary. It is\n the default floor for every session.\n- **User-global constitution** — the normal guided setup output. Manage it with\n `/constitution` or `/setup`; Codewhale stores structured data at\n `$CODEWHALE_HOME/constitution.json` (default `~/.codewhale/constitution.json`)\n and renders it into a separate `<codewhale_user_constitution>` prose block.\n This can express preferences and stop conditions, but it does not change\n runtime approval policy, sandbox, shell, network, trust, or MCP permissions.\n- **Repo-local constitution** — optional project policy in\n `.codewhale/constitution.json`, described below.\n- **`AGENTS.md`** — cross-agent **project instructions** (prose). This is the\n canonical file for \"how should an agent work in this repo.\"Run`/init`to\nscaffoldone.`CLAUDE.md`and`.claude/instructions.md`arereadas\ncompatibilityfallbacks.\n-**Memoryandhandoffs**—recalledstate.Useful,butlowerauthoritythan\nconstitutionsandprojectinstructions.\n\n###Managingtheuser-globalconstitution(`/setup`and`/constitution`)\n\nThebundled**workingagreement**isthesafedefaultandnolongeraddsa\nrequiredfirst-runscreen.Customizeitlaterthrough`/constitution`orthe\nprogressive`/setup`guide.Provider/modelreadiness,workspacetrust,and\nruntimeposturestayseparatefromthisguidance.\n\nOnthe**Workingagreement**(constitution)step:\n\n-**`1`–`6`**tunetheguideddraft.**`G`**previewsit,and**`G`**again\nratifiesandsavesafreshstructured`constitution.json`.\n-**`A`**(shownonlywhenaproviderisconfigured)asksyourfirstconfigured\nmodeltodrafttheconstitution.Draftingis**not**saving:thedraftis\nrenderedthroughthesamepreviewandyoustillpress**`G`**toratify\nbeforeanythingpersists.\n-**`K`**keepsyourexistingloadedconstitutionunchanged(shownonlywhena\nvalidfileisalreadypresent).\n-**`U`**(or`/coLine truncated
"content":"# Installing plugins\n\n> 阅读简体中文版:[zh_hans/PLUGINS.md](zh_hans/PLUGINS.md)。\n\nTo create a bundle, start with [Write your first Codewhale plugin](PLUGIN_AUTHORING.md)\nand its runnable Skills example.\n\nThis is the walkthrough for the `/plugin install` on-ramp (v0.9.4, #5182).\n[PLUGIN_BUNDLES.md](PLUGIN_BUNDLES.md) remains the contract for the bundle\nformat (`plugin.json`, compatible `kimi.plugin.json` or\n`.claude-plugin/plugin.json`, or legacy `plugin.toml`), discovery, validation, and\nthe trust/enable lifecycle — this document covers how bits get onto disk in\nthe first place.\n\n`/plugin suggest <task>` is a local, read-only companion: it ranks already\ninstalled bundles (name, keywords, description, bundled skill names, declared\nhosts) and any marketplace catalogs you have added with `/plugin marketplace add`.\nIt explains the match and gives the next review, enable, or catalog-install\nstep, but never installs, trusts, or enables a bundle on its own.\n\n## How Codewhale offers plugins\n\nCodewhale is helpful about plugins, not pushy. The rules:\n\n- **One proactive surface.** Sending a task can show one quiet toast when the\n prompt matches an installed-but-idle plugin or a catalog candidate you do\n not have yet, for example `/plugin trust supabase` or\n `/plugin marketplace install <catalog> supabase`. Nothing appears while you\n type, and nothing is appended to your message to advertise plugins.\n- **One switch.** With `contextual_tips` off, no plugin guidance appears\n anywhere. Required notices and your own `/plugin` commands still work.\n- **One budget.** Plugin offers share the per-session guidance budget with\n other tips. In the interactive TUI the model can call\n `request_plugin_install` once per session to ask you to review a plugin the\n task needs; a second call fails. Exec, ACP, and runtime-API sessions do not\n get the tool.\n- **Built-ins are never advertised.** Bundled plugins such as Computer Use\n appear only in `/plugin list` and Extensions.\n- **Specific terms only.** Generic words (accessibility, browser, chrome,\n docs, screenshot, web, wiki, …) never trigger an offer. The matcher and the\n marketplace's `check-marketplace.mjs` share one stoplist.\n- **Only what runs here.** Plugins whose `when.os` excludes this OS are not\n offered.\n- **Review before acting.** A model-requested row offers Review. Its button\n opens the existing Extensions inventory: Plugins for an installed bundle,\n Marketplace for a suggestion that is not installed. Nothing is installed,\n trusted, or enabled by that click. Choose the inventory's explicit action;\n trust still reviews the exact installed content before activation.\n- **Reversible dismissal.** Esc clears a non-empty draft first, then hides the\n row for this session only. \"Don't suggest again\"istheexplicit,\npersistedchoice.`/plugindismissals`listsbothkinds,and\n`/plugindismissalsreset[<name>]`letssuggestionsofferapluginagain.\n-**Discoveryispassive.**Findnewpluginsinthesedocs,\n`/pluginmarketplacelist`,Extensions,andthebrowserguidebelow.\n\nCodewhaledoesnotinventaremotepluginURL;missingpluginsaresuggested\nonlyfromcatalogsyouadded.On-diskbundlechangesstilltoast\n`/pluginreload`onsendandbetweenturns.\n\n##Browser:pickone\n\nSeveraloptionscandriveabrowser.Theydifferinwhosebrowseritisand\nwhatitcansee.\n\n|Option|Whosebrowser|Goodfor|\n|---|---|---|\n|`chrome-devtools`MCP(`/mcprecommendations`)|AChromeitdrives,whichcanincludesigned-inpages|DevTools-levelinspectionandperformancework|\n|PlaywrightMCP(`/mcprecommendations`)|Afresh,isolatedprofilewith`--isolated`|Scriptedflowsandtestingwithoutyouridentity|\n|ComputerUse`browser_*`tools(bundled,offuntilreviewed)|Oneitlaunches,inaprofileofitsown|Browserstepsinsideawiderdesktoptask|\n|Chromewhale(developerpreview,`codewhale-hq/codewhale-plugin-marketplace`)|Yours,alreadyopen,inyourownChromeprofile;loadunpacked|Readingoractingonthetabyouarelookingat,onegrantedsiteatatime|\n\nNoneoftheseisofferedtoyouproactively.Addtheonethatfitsthejob.\n\n##Sources\n\n`codewhaleinstall<spec>`and`/plugininstall<spec>`usethesameinstaller.\nTheshellentrydoesnotstartamodelorrequiremodelcredentials.Bothkeep\nbundlesdisabledanduntrusteduntilyouexplicitlyreviewandenablethem.\n\n```sh\ncodewhaleinstallgit:github.com/example/plugin@v1.0.0\ncodewhaleinstallnpm:@example/plugin@1.0.0\ncodewhaleinstall./local-plugin\n```\n\nGitshorthandsupportsGitHubarchivesonly;refsmustbeasinglesafesegment.\nUsetheexistingHTTPSarchiveURLplus`#path=...`foranestedbundle.\nNpmrequiresanexactversionandanativepluginmanifestinthetarball.\nNogithooks,npmlifecyclescripts,dependencyinstallationoLine truncated
"content":"# Plugin bundles\n\n> 阅读简体中文版:[zh_hans/PLUGIN_BUNDLES.md](zh_hans/PLUGIN_BUNDLES.md)。\n\nCodewhale supports a deliberately small plugin-bundle boundary. The boundary\nwas drawn in v0.9.1 and is extended deliberately in v0.9.10: a bundle may\ncontribute declarative Skills, MCP configuration, Commands, Agent profiles,\nand Hooks through Codewhale's existing engines. Unsupported declarations stay\ninventoried instead of disabling a mixed bundle. Discovery alone never\nexecutes, enables, trusts, downloads, updates, or installs anything.\n\nThis document owns the bundle formats, discovery,\nvalidation, and the trust/enable/runtime contract. [PLUGINS.md](PLUGINS.md)\nowns how bits get onto and off disk — the `/plugin install`, `update`,\n`uninstall`, and `suggest` on-ramp added in v0.9.4 (#5182). Compatible Claude Code bundles use the same native adapters; their supported subset is\n[CLAUDE_PLUGIN_COMPAT.md](CLAUDE_PLUGIN_COMPAT.md).\nFor a runnable native example and explicit OpenCode/DSH data conversion, see\n[Write your first plugin](PLUGIN_AUTHORING.md).\n\n## Discovery and precedence\n\nCodewhale scans only its own roots, looking in each `<name>/` directory for a\nmanifest named `plugin.json` (the native Agent Plugins v1.0.0 format, since\nv0.9.4), `kimi.plugin.json` (the compatible Kimi Skills/MCP subset, since\nv0.9.8), `plugin.toml` (the legacy Codewhale format, still fully readable), or\n`.claude-plugin/plugin.json` (the compatible Claude subset, since v0.9.13):\n\n- User: `~/.codewhale/plugins/<name>/`\n- Workspace: `<workspace>/.codewhale/plugins/<name>/`\n\nA bundle that publishes multiple formats is read through `plugin.json` first,\nthen `kimi.plugin.json`, then the legacy `plugin.toml`, then\n`.claude-plugin/plugin.json`.\nComputer Use ships as a built-in bundle; it still requires review and\nenablement before activation. The internal precedence order is\nbuilt-in, user, then workspace; the first bundle with a given name wins. This\nprevents a repository from shadowing an explicitly installed user bundle.\nSymbolic-link roots, manifests, component paths, and nested component files\nfail closed.\n\nThe embedded Computer Use files are materialized under\n`$CODEWHALE_HOME/builtin-plugins/snapshots/computer-use-<bundle-digest>/computer-use`.\nEach process captures only its own embedded digest's discovery root. Concurrent\nbuilds therefore keep separate, complete source trees; publishers never delete\nor replace an existing snapshot. Reuse checks every embedded byte, directory\nentry, file type, executable flag, and the stamp. A partial or altered snapshot\nis rejected without repair. Interrupted private staging directories are not\ndiscovered or reused.\n\nThe existing path-bound plugin identity and trust rules apply: identical embedded\nbytes at the same home reuse the same identity; changed bytes require a fresh\nreview and enablement. Moving from the older mutable\n`builtin-plugins/computer-use` layout also requires one fresh review. Legacy\nbundles and receipts remain intact for running older binaries; no trust is\nmigrated. Diagnostics do not create a missing Codewhale home.\nThe selected home may itself be a symlink: its resolved directory is pinned\nbefore creating any built-in paths. Links in the owned built-in cache paths\nstill fail closed.\n\nNew user and workspace bundles are always untrusted and disabled. Discovery is\nread-only and does not inspect any other application's extension or credential\ndirectories: ambient roots such as `.claude/plugins` or `.cursor/plugins` are\nnever scanned.\n\nPre-v0.9.1 `overrides.json` enablement was intentionally not imported as\ntrust; every bundle activates only through the content-hash and\n`codewhale-plugin-capabilities-v3` activation-policy review below.\n\n## Manifest\n\nAll supported encodings parse into the same internal manifest, so validation, hashing,\nreview, and runtime behavior are identical downstream. On-disk auto-migration\nbetween them is deliberately not performed; `/plugin export <name>\n<target-dir>` publishes a loaded bundle as a spec-valid Agent Plugins v1.0.0\ndirectory without modifying the installed one.\n\n### `plugin.json` (Agent Plugins v1.0.0)\n\nThe standard's manifest root is closed: `$schema`, `name`, and the optional\nwell-known fields (`version`, `description`, `author`, `homepage`,\n`repository`, `license`, `keywords`, `extensions`). An unknown root key is a\nparse error. Client-specific data lives under `extensions`, keyed by\nreverse-domain namespace: unknown vendor namespaces are ignored, never\nrejected — that is what lets a bundle authored for another client load here —\nwhile unknown keys inside Codewhale's own `extensions[\"net.codewhale\"]`\nnamespacearerejectedratherthansilentlydropped.\n\nNamesfollowthestandard'srule:1–64lowercaseASCIIletters,digits,or\ninternalsingle`-`/`.`,startingandendingalphanumeric,never`--`or`..`.\nA`skills/`dirLine truncated
"content":"# Writing an extension tool or command\n\nThe experimental TypeScript extension host runs reviewed plugin code in a\nshared Node process (or, as an opt-in, Bun). Rust still owns sessions, tool admission, approval and\nexecution. Extensions currently contribute tools and slash commands; they\ncannot provide an approval service, run a second agent loop or replace\nbuilt-in tools or commands.\n\n## Quick start\n\nStart with [hello-extension](examples/plugins/hello-extension/hello.mts) and its\n[plugin.json](examples/plugins/hello-extension/plugin.json). The example is\nexecuted unchanged by the host tests. It returns a greeting and does not read\nfiles or use the network.\n\n1. Explicitly enable `[features] extension_host = true` in your configuration,\n or start Codewhale with `codewhale --enable extension_host` (the flag goes\n before any subcommand).\n2. Install the example's directory using `/plugin install <local-directory>`.\n3. Run `/plugin validate hello-extension`, then `/plugin show hello-extension`.\n4. Run `/plugin enable hello-extension` to open its content/capability review.\n Read the review and personally run its exact `/plugin trust <token>` command,\n then enable the plugin. Trust alone does not execute the code.\n5. Ask Codewhale to use `hello_greet`. The tool follows the normal approval gate.\n6. Run `/hello-greet Codewhale`. The command runs when you type it, and shows\n its answer in the transcript with its origin, `extension:hello-extension`.\n\nAn authoring agent should stop after installation and validation and present\nthe review to the person. Do not trust or enable a bundle automatically.\n\n## Locations, installation and trust\n\nUser bundles live under `~/.codewhale/plugins/`; workspace bundles live under\n`<workspace>/.codewhale/plugins/`. New bundles use Agent Plugins v1.0.0\n`plugin.json`. Declare `extensions[\"net.codewhale\"].native.path` as one regular\n`.mjs`, `.js` or `.mts` file inside the bundle. Directories and other extensions\nfail validation when the host is enabled. With the flag off, native entries\nremain inventory-only.\n\nA plugin may split its code across several entries with `native.paths` (up to\n64, alone or beside `path`). They are activated in the order declared, as the\nfibers of one plugin: they share one owner, so one disable, review change or\ncrash tears all of them down together. Each entry is a separate module with its\nown `apply`, and tool and command names must be unique across them. If an entry\nfails to activate (throws, requires a service the host does not provide, or has\na registration refused), only that entry is withdrawn: entries that already\nactivated stay registered, later entries still activate, and the plugin fails\nonly when no entry activates. Listing the same file twice is one entry.\n\n## Runtime\n\n`[extension_host] runtime` selects what runs the host. Node is the default.\nBun is an opt-in: it is qualified on macOS only, and becomes the default only\nafter an explicit, recorded cutover.\n\n```toml\n[extension_host]\nruntime = \"node\" # default: Node only\n# runtime = \"bun\" # Bun only; fails rather than falling back to Node\n# runtime = \"auto\" # Bun >= 1.4.0 if one is found and starts, otherwise Node\n# bun = \"~/.bun/bin/bun\" # the only Bun tried when set\n# node = \"/opt/homebrew/bin/node\" # the only Node tried when set\n# mcp_backend = \"host\" # experimental SDK backend; default is \"rust\"\n```\n\n`mcp_backend = \"host\"` selects the pinned MCP SDK independently of\n`[features] extension_host`. That feature controls optional Native extensions;\nselecting Host MCP does not activate them. The SDK for existing stdio, HTTP and legacy SSE server connections in a separate\nbuiltin host process. Rust retains process/network authority, credential\nresolution, catalog admission, tool approval and cancellation. HTTP/SSE uses\nRust's guarded HTTP client; the SDK receives opaque session selectors and\nexact operation grants. Request IDs remain the Rust client's strings through\nan adapter bound to each grant. Explicit Host selection never falls back to\nRust or replays an uncertain operation. The default remains `\"rust\"`while\nrecordedtransportparityisqualified.TheHostpathusesthesameRust\nGETsessionpreflightandboundedreactiveOAuthrefreshasthedefault\nbackend.AnexplicitincompatibleHTTPresponsecannegotiatetherealSDK\nSSEtransportonlywithafreshexactRustoperationgrant;astale-session\nrefusalremainsatypedRustrecoverydecision.Credentials,configuredURLs,\nOAuthbrowser/loginoperationsandComputerUsedecisionkeysstayinRust.\nBothbackendsrunagainstthesamerecordedMCPgoldens.Passingthatsuite\nandtheactualbrokeracceptancetestsisrequiredbeforeanydefaultcutover.\nThedefaultalsorequirestheplatformisolationandmeasuredPhase3gates\ninOpsCURRENT_DECISIONS§26.ThenativeRustprotocoladaptersremainforone\nLine truncated
"content":"# Local browser client\n\n> 阅读简体中文版:[zh_hans/WEB.md](zh_hans/WEB.md)。\n\n`codewhale web` opens Codewhale's embedded browser client over the canonical\nRuntime API. It is a local surface: the server always binds to\n`127.0.0.1`, cannot be rebound to a LAN address, and cannot run with Runtime\nauthentication disabled.\n\n## Start it\n\nFrom the workspace Codewhale should operate in, run:\n\n```bash\ncodewhale web\n```\n\nThe default address is `http://127.0.0.1:7878`. To avoid a local port\ncollision, choose another loopback port:\n\n```bash\ncodewhale web --port 8788\n```\n\nCodewhale starts the Runtime API, serves the dependency-free client embedded\nin the installed binary, prints a single-use launch URL, and asks the operating\nsystem to open that URL in the default browser. If the browser does not open,\nuse the printed URL within ten minutes. Stop the process with `Ctrl+C`; the\nbrowser session ends with it.\n\n## What the browser can do\n\nThe embedded client provides a responsive thread and search rail, Runtime-owned\nsession facts, transcript and tool receipts, and a composer. It can create,\nselect, rename, and archive threads; start or steer turns; interrupt work;\nresolve approvals; and answer Runtime user-input requests.\n\nThe browser is another view of the same local Runtime. It does not create a\nsecond cloud account, copy provider credentials into browser storage, or\nweaken the configured approval and sandbox policies.\n\n## Authentication boundary\n\nThe browser-launch URL contains a random, short-lived, one-time bootstrap\ncapability. It never contains the Runtime bearer token. A loopback request\nexchanges the capability for an `HttpOnly`, `SameSite=Strict`, process-local\nsession cookie and immediately invalidates the capability.\n\nReused, expired, malformed, and non-loopback bootstrap attempts fail closed.\nThe Runtime token is not placed in rendered HTML, browser storage, URL\nqueries or fragments, or browser-launch arguments. The one-time bootstrap\nvalue is printed in the local terminal and briefly passes through the operating\nsystem's browser launcher. It is single-use and expires after ten minutes, but\na hostile process already running as the same OS user remains inside the local\ntrust boundary.\n\nCookie-authenticated state-changing requests must also present the exact\nlocal web origin. Cross-origin browser requests are rejected. Existing\nexplicit bearer and Runtime-token-header clients retain their normal Runtime\nAPI behavior.\n\n## Local means local\n\n`codewhale web` accepts only `--port`; there is no `--host` or insecure-auth\noption on this command. Do not treat it as a public website or expose its port\ndirectly through router forwarding, a public reverse proxy, or a tunnel.\n\nThe separate `codewhale app-server --mobile` and `--http` modes have different\ndeployment and authentication contracts. Read [RUNTIME_API.md](RUNTIME_API.md)\nbefore operating either one, especially before selecting a non-loopback bind.\n\n## Troubleshooting\n\n- If port `7878` is occupied, pass an unused `--port` value.\n- If the browser does not open, copy the printed single-use bootstrap URL into\n a browser on the same machine within ten minutes. Start `codewhale web` again\n if that URL has already been used or expired.\n- If the page loads but a provider is unavailable, inspect `codewhale doctor`\n and `/provider`; the web command does not configure or move provider\n credentials.\n- If a session expired, stop and restart `codewhale web` to mint a new\n process-local session. Reusing an old bootstrap URL is expected to fail.\n\nFor integration endpoints, headers, events, and the complete web-session\ncontract, see [RUNTIME_API.md](RUNTIME_API.md).\n"
"content":"# Codewhale User Guide\n\nThis guide is for your first hour with Codewhale. It explains the main\nworkflow, the important safety controls, and where to go next when you need a\ncomplete reference.\n\nCodewhale has deeper reference documents for installation, configuration,\nproviders, modes, keybindings, tools, and operations. Use this page as a guided\nwalkthrough, then follow the \"Next\" links when you need every option.\n\n## 1. Welcome to Codewhale\n\nCodewhale is a terminal coding agent. You run it from a workspace, give it a\ntask, and it can use structured tools to inspect files, run commands, edit\ncode, and report back with evidence.\n\nThe important difference from a normal chat model is that Codewhale is built\naround a harness:\n\n- It keeps the active workspace and session visible.\n- It routes each turn through explicit modes and approval rules.\n- It shows tool calls in the transcript instead of hiding the work.\n- It can preserve sessions, fork conversations, and continue later.\n- It can run sub-agents for focused background work.\n\nYou can use Codewhale for small questions:\n\n```text\nExplain the authentication flow in this repository.\n```\n\nYou can also use it for multi-step work:\n\n```text\nFind the failing validation path, propose a fix, and wait for my approval\nbefore editing files.\n```\n\nFor a new repository, start conservatively. Ask Codewhale to explore and plan\nbefore asking it to change files. That gives you a reviewable path and makes it\neasier to catch wrong assumptions early.\n\nNext: [ARCHITECTURE.md](ARCHITECTURE.md) explains the internal harness and\nruntime model.\n\n## 2. First Launch\n\nFor a new macOS or Linux installation, use the official GitHub release.\nThe installer verifies the release checksums and provides the same runtime\nunder the `codewhale` and `codew` command names:\n\n```bash\ncurl -fsSL https://codewhale.net/install.sh | sh\n```\n\nWindows users should choose the matching installer or archive from\n[GitHub Releases](https://github.com/codewhale-hq/CodeWhale/releases/latest).\nFor an existing direct install, use `codewhale update --check`, then\n`codewhale update`. npm and Cargo remain secondary packaging routes; Cargo\nalso supports source builds where a compatible prebuilt is unavailable.\nFor occupied directories, package-managed installs, and PATH setup, follow\n[the installation and migration guide](INSTALL.md#recommended-official-github-releases).\nAndroid/Termux uses its own [preview archive or source-build path](INSTALL.md#android--termux-arm64).\n\nDocker is also available when you want an isolated runtime. The published\nimage is currently 0.10.0; to test current `main`, [build it from source](DOCKER.md#building-locally).\n\n```bash\ndocker volume create codewhale-home\ndocker run --rm -it \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v codewhale-home:/home/codewhale/.codewhale \\\n -v \"$PWD:/workspace\" \\\n -w /workspace \\\n ghcr.io/hmbown/codewhale:latest\n```\n\nOnce the install directory is on PATH, launch Codewhale from the repository or\ndirectory you want it to work in:\n\n```bash\ncodewhale\n```\n\nFor the default GitHub installer destination, you can use\n`\"$HOME/.local/bin/codewhale\"` until that directory is on PATH.\n\nOn first launch, Codewhale opens the composer, even with no key or route.\nWith no key or route, workspace trust is asked once a provider is connected;\notherwise only when the folder requires a decision. A provider is asked for\nwhen you send your first message: the message stays in the box while you sign\nin or use your own key, and a local model is offered only when a local Ollama\nserver answers. The provider step also has an explicit offline route.\n\nEverything optional stays available after that. Use `/setup` for the\nprogressive setup and repair guide, `/settings` for the full typed editor, and\n`/constitution` when you want your own constitution on top of the bundled one.\nThe localized telemetry choice appears only after the workspace is ready and\ndoes not block the composer.\n\nDeepSeek is the default provider. If you want to configure its key before or\nafter the first launch, the most direct setup path is:\n\n```bash\ncodewhale auth set --provider deepseek\n```\n\nYou can also provide a key through the environment:\n\n```bash\nexport DEEPSEEK_API_KEY=\"your-key\"\ncodewhale\n```\n\nNewCodewhaleconfigisstoredunder`~/.codewhale/config.toml`.Legacy\n`~/.deepseek/config.toml`filesarestillsupportedforusersmigratingfrom\ntheoldname.\n\nUse`/constitution`torevieworchangestandingguidance.Aftersetup,runa\ndoctorcheck:\n\n```bash\ncodewhaledoctor\n```\n\nUsetheJSONformwhenyouneedamachine-readablereportforanissue:\n\n```bash\ncodewhaledoctor--json\n```\n\nBothformsareofflinebydefault.Theyreportstructuralconfigurationand\nliteralunknown/not-probedcredentialstateswithoutloadingworkspace`.env`\ncredentials,openiLine truncated
"content":"# Codewhale Agent — one identity, many surfaces\n\n\"Codewhale Agent\" is one product identity with many transport surfaces.\nThis page is the identity map: what each surface is, where each lives, and\nthe rules that keep them one product instead of several.\n\n## The one identity\n\n| Surface | Identity object | Where it lives | State |\n|---|---|---|---|\n| GitHub PR review | GitHub App bot `codewhale-agent[bot]` | GitHub org settings; repo variable `CODEWHALE_APP_ID` + secret `CODEWHALE_APP_PRIVATE_KEY` | `codewhale review --pr N --post` ships with the `codewhale-review.yml` workflow; it no-ops green until the App is configured (founder-gated), then posts as the App instead of the workflow token. Posting is always opt-in via `--post`. |\n| Commit co-author | `.github/AUTHOR_MAP` | repo | existing; harvested co-author credit lands in the contributor graph |\n| Chat channels | per-user bot registration bound to a Codewhale membership | control-plane `services/control-plane/src/integrations/chat/` BotGateway and adapters; contracts in `packages/contracts` | Source includes Telegram and Slack bot pairing and commands. Default read-only command allowlist; opt-in write verbs; approve/deny keyboards route as permission decisions. Availability depends on the deployed gateway and configured bot credentials. |\n\nSlack bot commands control Codewhale; they do not give an agent tools to search\nor read a Slack workspace. The Slack bot requires a user-managed Slack app,\ncredentials and webhook setup. Hosted Slack delivery and a real authenticated\nSlack task have not been qualified, so this source implementation is not a\nready-to-use Slack integration claim. External Slack tools require a separately\nconfigured and authenticated MCP server or API integration.\n\n## Rules that make it one identity\n\n- Every surface is I/O around the single `Engine::run_turn`\n (`crates/tui/src/core/engine/turn_loop.rs`). No surface gets its own\n engine or turn loop.\n- Every surface authenticates to the same Codewhale membership\n (`codewhale login` account session). Membership gates cloud agents;\n provider brands stay internal and invisible.\n- Approvals from any surface route back as permission decisions into the\n same engine. A bare message never executes a gated action.\n- Every command and approval is audited, on every channel.\n- All surfaces are FREE. Rate limits are anti-abuse only. There is no\n per-channel fee, message metering, team gating, or trial timer — and a\n billing hook on a channel feature is forbidden by the money model.\n\n## Naming\n\n- Product: Codewhale. Agent surface: \"Codewhale Agent\".\n- Bot handle wherever it can be chosen: `codewhale-agent`.\n- The agent speaks as \"Codewhale cloud agent\" — never as a provider brand.\n\n## Channel contract\n\nPer-channel command allowlists (default read-only: `status`, `jobs`,\n`receipts`, `help`; opt-in: `new task`, `approve`, `deny`), inline\napprove/deny keyboards routed as permission decisions, `assistant_changes`\nreply mode (message only when something changed), per-channel message\nformat adapters (including Telegram markdown and Slack blocks in source),\nquiet hours + digest, automation output routable\nto any paired channel, one pairing code bound inside the authenticated\napp, unbind revokes instantly.\n\nWeChat note: personal-WeChat automation is **not supported** —\nreverse-engineered protocols get users banned. Official 公众号/服务号 APIs\nare the only acceptable path and are still under assessment.\n\n## Pointer\n\nChannel contracts live in `packages/contracts` (CWC repo); the gateway and\nadapters live in `services/control-plane/src` (CWC repo). The GitHub\nsurface lives in `.github/workflows/codewhale-review.yml` here.\n"
"content":"# codewhale Operations Runbook\n\n> 阅读简体中文版:[zh_hans/OPERATIONS_RUNBOOK.md](zh_hans/OPERATIONS_RUNBOOK.md)。\n\nThis runbook covers practical debugging and incident response for the local CLI/TUI runtime.\n\n## Quick Triage\n\n1. Confirm binary + config:\n - `cargo run -- --version`\n - `cat ~/.codewhale/config.toml` (or inspect configured profile)\n2. Enable verbose logs:\n - `RUST_LOG=codewhale_tui=debug cargo run`\n - For HTTP retries/reconnects: `RUST_LOG=codewhale_tui::client=debug cargo run`\n3. Capture current state:\n - `ls ~/.codewhale/sessions`\n - `ls ~/.codewhale/sessions/checkpoints`\n - `ls ~/.codewhale/tasks`\n\n## Incident: Turn Hangs or Stream Stops\n\nSymptoms:\n- TUI remains in loading state\n- partial assistant output with no completion\n\nChecks:\n1. Inspect retry/health logs (`codewhale_tui::client`)\n2. Verify endpoint connectivity:\n - `curl -sS https://api.deepseek.com/beta/models -H \"Authorization: Bearer $DEEPSEEK_API_KEY\"`\n3. Confirm no local sandbox/permission deadlock in tool output\n\nActions:\n1. If a foreground shell command is running, press `Ctrl+B` to move it to the background (the turn keeps running and the command becomes a background job under `/jobs`); use `Ctrl+C` instead if you want to cancel the turn.\n2. If the command was started in the background, ask the assistant to use `Bash` with `action: \"cancel\"` and the returned process id.\n3. Use `Esc` or `Ctrl+C` to interrupt the current turn when you want to stop the request itself.\n4. Retry prompt; if still failing, restart TUI.\n5. On restart, verify the previous queued/in-flight runtime turn is shown as interrupted rather than left in a running state.\n\n## Incident: Network Outage / Offline Behavior\n\nExpected behavior:\n- New prompts are queued while offline mode is active\n- Queue state persists per session to\n `~/.codewhale/sessions/checkpoints/<session-id>.offline_queue.json`; a legacy\n global `offline_queue.json` is adopted once on upgrade\n\nChecks:\n1. Open queue in TUI: `/queue list`\n2. Confirm persisted queue file exists and updates timestamp\n\nActions:\n1. Restore connectivity\n2. Re-send queued entries (from `/queue edit <n>` + Enter, or normal input flow)\n3. Ensure queue file clears when queue is empty\n\n## Incident: Crash Recovery Needed\n\nExpected behavior:\n- Each session checkpoints to `~/.codewhale/sessions/checkpoints/<session-id>.json`;\n a legacy `latest.json` is still read for recovery but is no longer written\n- Startup begins a fresh session unless `--resume`/`--continue` is supplied\n\nActions:\n1. Resume prior work explicitly via `codewhale --resume <id>` (alias\n `codewhale resume <id>`; `codewhale --continue` recovers the newest\n interrupted checkpoint for the workspace) or `Ctrl+R` in TUI\n2. If checkpoint inspection is needed, inspect `checkpoints/<session-id>.json` (or a leftover legacy\n `latest.json`) for schema mismatch/details\n3. If schema is newer than binary supports, upgrade binary or remove stale checkpoint\n\n## Incident: Persistent State Schema Errors\n\nSymptoms:\n- Errors like `schema vX is newer than supported vY`\n\nAffected stores:\n- sessions (`~/.codewhale/sessions/*.json`)\n- runtime thread/turn/item records\n- tasks (`~/.codewhale/tasks/tasks/*.json`)\n\nActions:\n1. Confirm binary version and migration expectations\n2. Back up the state directory before editing\n3. Either:\n - run with a newer compatible binary, or\n - archive incompatible records and regenerate state\n\n## Incident: MCP/Tool Execution Failures\n\nChecks:\n1. Validate `~/.codewhale/mcp.json` schema and server command paths\n2. Confirm server process can start manually\n3. Check sandbox denials in TUI history / logs\n\nActions:\n1. Retry with required approvals (or YOLO only when appropriate)\n2. Temporarily disable failing MCP server and isolate issue\n3. Re-enable after verification with `/mcp` diagnostics\n\n## Post-Incident Checklist\n\n1. Preserve logs and relevant state files\n2. Record trigger, impact, and mitigation\n3. Add or update regression tests (retry/recovery/schema)\n4. Update this runbook and architecture docs if behavior changed\n"
"content":"# Docker\n\n> 阅读简体中文版:[zh_hans/DOCKER.md](zh_hans/DOCKER.md)。\n\nCodewhale publishes a multi-arch Linux image to GitHub Container Registry\nfor each release.\n\nThe latest published image is 0.10.0 at `ghcr.io/hmbown/codewhale`.\nTo test the current `main` source, use [Building locally](#building-locally)\nin a checkout of [`codewhale-hq/Codewhale`](https://github.com/codewhale-hq/Codewhale).\n\n```bash\ndocker pull ghcr.io/hmbown/codewhale:latest\n```\n\n## Quick start\n\nRun the published image with a Docker-managed data volume:\n\n```bash\ndocker volume create codewhale-home\n\ndocker run --rm -it \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v codewhale-home:/home/codewhale/.codewhale \\\n -v \"$PWD:/workspace\" \\\n -w /workspace \\\n ghcr.io/hmbown/codewhale:latest\n```\n\nUse a pinned release tag for reproducible installs:\n\n```bash\ndocker run --rm -it \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v codewhale-home:/home/codewhale/.codewhale \\\n -v \"$PWD:/workspace\" \\\n -w /workspace \\\n ghcr.io/hmbown/codewhale:v0.10.0\n```\n\nThe pinned example uses the [0.10.0 release](https://github.com/codewhale-hq/Codewhale/releases/tag/v0.10.0).\n\n## Default image contract\n\n`ghcr.io/hmbown/codewhale:latest` and the semver tags are conservative runtime\nimages:\n\n- the container runs as the non-root `codewhale` user with UID/GID `1000:1000`\n- the image does not grant passwordless `sudo`\n- the image is meant to run Codewhale against mounted workspaces, not to mutate\n the base operating system at runtime\n- user state belongs in a volume mounted at `/home/codewhale/.codewhale`\n\nThat default is intentional. Keep using it for the smallest trust boundary. If a\nproject needs `apt-get`, compiler toolchains, Node/Python package managers,\ncustom CA certificates, or other host-like setup inside Docker, build an\nexplicit toolbox image instead of changing the default image contract.\n\n## Opt-in toolbox/custom image\n\nThe repository includes an example\n[`docs/examples/Dockerfile.toolbox`](examples/Dockerfile.toolbox) that extends\nthe official image with passwordless `sudo` and common development packages.\nBuild it with a pinned Codewhale tag when you want repeatable project\nenvironments:\n\n```bash\ndocker build -f docs/examples/Dockerfile.toolbox \\\n --build-arg CODEWHALE_IMAGE=ghcr.io/hmbown/codewhale:v0.10.0 \\\n --build-arg TOOLBOX_PACKAGES=\"git openssh-client curl build-essential pkg-config python3 python3-pip nodejs npm\" \\\n -t codewhale-toolbox:my-project .\n```\n\nUse `latest` only for throwaway testing. For shared projects, keep the\n`CODEWHALE_IMAGE` value pinned and review package additions like any other\ndevelopment-environment change.\n\nRun the toolbox image with the same workspace and state mounts:\n\n```bash\ndocker volume create codewhale-my-project-home\n\ndocker run --rm -it \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v codewhale-my-project-home:/home/codewhale/.codewhale \\\n -v \"$PWD:/workspace\" \\\n -w /workspace \\\n codewhale-toolbox:my-project\n```\n\nInside this opt-in image, Codewhale can use commands such as\n`sudo apt-get update` and `sudo apt-get install -y <package>`. For repeatable\ncontainers, prefer baking those packages into the toolbox Dockerfile instead of\nletting a long-lived container drift.\n\nDo not bake API keys, SSH private keys, or other secrets into custom images.\nPass API keys at runtime and mount any SSH material deliberately, preferably\nread-only and only for projects that need it.\n\n### Compose toolbox template\n\nIf you prefer a repeatable `docker compose` entry point, use\n[`docs/examples/compose.toolbox.yml`](examples/compose.toolbox.yml). It builds\nthe toolbox image from [`docs/examples/Dockerfile.toolbox`](examples/Dockerfile.toolbox)\nand keeps the project state volume explicit:\n\n```bash\nCODEWHALE_IMAGE=ghcr.io/hmbown/codewhale:v0.10.0 \\\nCODEWHALE_TOOLBOX_IMAGE=codewhale-toolbox:my-project \\\nCODEWHALE_HOME_VOLUME=codewhale-my-project-home \\\nCODEWHALE_WORKSPACE=\"$PWD\" \\\ndocker compose -f docs/examples/compose.toolbox.yml run --rm codewhale\n```\n\nUse a different `CODEWHALE_TOOLBOX_IMAGE` and `CODEWHALE_HOME_VOLUME` for each\nproject that needs an independent toolchain or independent `.codewhale` state.\nThe Compose file also shows opt-in, read-only mounts for SSH material and local\nCA certificates; keep those commented out unless the project needs them.\n\n## Multiple independent projects\n\nUse one named state volume per project so sessions, config, skills, memory, and\nthe offline queue do not bleed across workspaces:\n\n```bash\nproject=\"$(basename \"$PWD\")\"\nimage=\"codewhale-toolbox:${project}\"\ndocker volume create \"codewhale-${project}-home\"\n\ndocker run --rm -it \\\n --name \"codewhale-${project}\" \\\n -e DEEPSEEK_API_KEY=\"$DEEPSEEK_API_KEY\" \\\n -v \"codewhale-${project}-home:/home/codewhale/.codewhale\" \\\n -v \"$PWDLine truncated
"content":"# Agent Ethos\n\n> 阅读简体中文版:[zh_hans/AGENT_ETHOS.md](zh_hans/AGENT_ETHOS.md)。\n\nCodewhale is maintained with agents, but it is not maintained by automation\nalone. Treat community reports and patches as real collaboration: people are\nbringing us machines, providers, regions, shells, packages, and edge cases we\ncould not cover by ourselves.\n\n## Stewardship\n\n- Verify live truth before acting. Check the current branch, release state,\n registry state, CI, and linked issues instead of trusting a handoff.\n- Issues are intake, not a privilege boundary. Do not auto-close good-faith\n issues because the reporter is not allowlisted. Ask for missing reproduction\n detail and leave room for maintainer triage.\n- PR gates exist for code review, CI load, and trust-boundary safety. They are\n not a quality judgment on the contributor. Keep dry-run mode unless a\n maintainer deliberately enables enforcement, and use warm copy when the gate\n comments.\n- Be generous with recurring contributors. When someone repeatedly brings\n useful reports or patches, use `/lgtmi` for issue access or `/lgtm` for PR\n access so the automation gets out of their way.\n- Preserve contributor credit. When harvesting work, inspect the PR and linked\n issues, keep author/co-author attribution where possible, add\n `Harvested from PR #N by @handle`, and credit the contributor in the\n changelog or release notes.\n- Make credit machine-readable. If a harvested commit cannot preserve the\n contributor as the author, add a `Co-authored-by` trailer with the GitHub\n numeric noreply address from `.github/AUTHOR_MAP` or\n `gh api users/<login> --jq '\"\\(.id)+\\(.login)@users.noreply.github.com\"'`.\n Do not use `.local`, placeholder, bot/tool, or raw third-party emails for\n human contributor credit.\n- Deferral is a maintainer action, not a dismissal. If a PR or issue is not\n ready, say what is blocked, what evidence would change the decision, and\n which part of the work remains valuable.\n\n## Agent Workflow\n\n- Use sub-agents for exploration, review, and verification, but keep a human\n maintainer posture in the parent session. Sub-agent output is evidence; the\n parent is responsible for the final decision.\n- Personally review community PRs before merging, harvesting, closing, or\n deferring them. Do not close work based only on title, labels, or an agent's\n summary.\n- Prefer narrow, reversible changes that match the existing codebase. Avoid\n drive-by refactors while harvesting community work.\n- Run the smallest meaningful validation first, then broaden tests when a\n change touches shared behavior, release plumbing, auth, sandboxing,\n providers, or UI workflows.\n- Do not tag, publish, push release artifacts, or create GitHub releases\n without explicit maintainer approval.\n\n## Product Tone\n\nCodewhale should feel like a capable coding harness with a public community,\nnot a closed queue. Automation should reduce maintainer load while making\ncontributors feel seen, credited, and able to keep helping.\n"
"content":"# Release Checklist\n\nFollow this sequence from the canonical `/Volumes/VIXinSSD/CW/codewhale`\ncheckout on `main`. Agent-owned preparation lands as verified slices on `main`;\nit requires no release branch, worktree, nested clone or preparation PR.\nContributor PRs still land as PRs. Treat any unchecked required gate as a release\nblocker.\n\nFor deeper context on the underlying tools (preflight scripts, npm smoke,\npublish-crates), see [`RELEASE_RUNBOOK.md`](RELEASE_RUNBOOK.md).\nFor larger milestone releases, add any version-specific acceptance matrix to\nthe existing release packet before tagging; use it for provider routes, feature\ngates, GUI/runtime smoke, remote-workbench decisions, and credit hygiene that the\ngeneric checklist does not enumerate. Record its candidate SHA, owners, local\ncheck results, hosted run URLs, artifact inventory, install/provider receipts,\nknown limitations and publication approval. These proofs are separate.\n\n## 0. Reconcile the canonical checkout\n\n- [ ] Inspect the branch, status, upstream and alternate checkouts before editing:\n ```bash\n git branch --show-current\n git status --short --branch\n git log -5 --oneline\n git worktree list\n git fetch origin main\n git log --left-right --oneline main...origin/main\n ```\n- [ ] The canonical checkout is on `main`. Recover stranded work only after\n preserving dirty/untracked files and comparing commits with current\n `origin/main`. Keep a recoverable backup and unresolved inventory; do not\n reset away work, stash it indefinitely or create another development lane.\n- [ ] Partition files among active writers. Check status before staging and\n stage only owned paths. Historical branches/checkouts are inventoried;\n deleting them requires explicit Hunter approval even if a helper calls\n their tips safe to delete.\n\n## 1. CHANGELOG entry exists for the version\n\n- [ ] `CHANGELOG.md` has a `## [X.Y.Z] - YYYY-MM-DD` heading at the top\n- [ ] The entry credits every external contributor, harvested PR author,\n linked issue reporter, reproduction/log provider, reviewer, and\n verification helper whose work materially shaped this version. Get the\n commit list with:\n ```\n git log vPREV..HEAD --no-merges --format=\"%h %an <%ae> %s\"\\\n|grep-v'<your-email@…>'\n```\nForeachcontributor,linkboththeirdisplaynameand(whenknown)\n`@github-handle`.TheninspectlinkedissuesandharvestedPRsso\nreporters/helpersarenotlostjustbecausetheydidnotauthorcommits.\nKeep`docs/CONTRIBUTORS.md`and`web/lib/release-credits.ts`consistent.\n-[]TheentryusestheKeepaChangelogheaders—`Added`,`Changed`,\n`Fixed`,`Security`,`Removed`,`Deprecated`.Add`Knownissues`only\nifthereissomethingmaterialtheusermustworkaround.\n-[]Theentrymentionsallreferencedissue/PRnumbersas`#NNNN`sothe\nauto-linkeronGitHubpicksthemup.\n-[]Run`scripts/sync-changelog.sh`toregenerate`crates/tui/CHANGELOG.md`\n(therecent-releasessliceembeddedinthebinaryfor`/change`).Do\nnoteditthatfilebyhand,anddonotcopythefullrootchangelog\nintoit—olderentrieslivein`docs/CHANGELOG_ARCHIVE.md`.\n-[]Run`scripts/release/check-feature-release-notes.shvPREVHEAD`.Every\nissue-linked`feat`commitmustleaveareceiptin`CHANGELOG.md`orthe\narchive;theVersiondriftCIgaterunsthesamecheckwithfullhistory.\n\n##2.Versionpinsareinsync\n\n-[]Use`./scripts/release/prepare-release.shX.Y.Z`whenversionpinsor\ngeneratedsourcesneedpreparation.Reuseavalidpreparationreceipt\nwhenthosesourcesarealreadycurrent.Thehelperbumpsthe\nworkspaceversion,everyper-cratedependencypin,thenpmwrapper\n(`version`+`codewhaleBinaryVersion`),RuntimeSDK,VSCodeextension\nandlock,remote-smokedefault,publicsource-candidatefacts,andREADME\ninstall-tagexamples;itrefreshestheCargo/npmlocks,regenerates\n`crates/tui/CHANGELOG.md`and`web/lib/facts.generated.ts`,andends\nbyrunningtheversionandOHOSgates.WritetheCHANGELOGentry\n**before**runningit.Thehelperissafetorerunattherequested\nworkspaceversion;itskipsreplacementsbutrefreshesbothgenerated\nfilesandrerunsthegates.\n-[]`npm/deepseek-tui/package.json`remainsprivate/compatibility-onlyand\nis**not**bumpedorpublished.\n-[]`./scripts/release/check-versions.sh`reports\n`VersionstateOK:workspace=X.Y.Z,npm=X.Y.Z,npm-binary=X.Y.Z,lockfileinsync.`\n-[]`./scripts/release/check-ohos-deps.sh`reportsthattheOpenHarmony\nWindowslinkerkeepsthetarget/sysrootflags,thetargetenablesthe\n`rquickjs-sys`bindgenedge,anditsgraphdoesnotpulltheunsupporLine truncated
"content":"# Agent fleet\n\n> Baca terjemahan bahasa Indonesia: [id/FLEET.md](id/FLEET.md)\n\nAgent fleet is the local-first roster and member-selection layer for durable\nmulti-worker runs. It does not execute or authorize work. After fleet resolves\nwho should participate, the delegated coordinator launches a headless\n`codewhale exec` run and the Runtime tracks it durably. See\n[AGENT_RUNTIME.md](AGENT_RUNTIME.md) for how sub-agents, `exec`, and\nfleet-backed workers converge on one runtime. In product language, a user may\nstill \"open a sub-agent\"; in architecture language, durable nested work uses a\nfleet member identity with delegated runtime execution.\n\n## Naming and compatibility boundary\n\n**Fleet** is the public product noun. The durable ledger, saved rosters, config\ntables, and `--fleet` flag share that name:\n\n| Surface | Canonical |\n| --- | --- |\n| CLI | `codewhale fleet …` |\n| Slash command | `/fleet …` |\n\nThese shared names are load-bearing wherever changing them would break\nexisting workspaces, receipts, or scripts:\n\n- the durable ledger `.codewhale/fleet.jsonl` and the log directories\n `.codewhale/fleet/` and `.codewhale/fleet-host/`;\n- saved rosters `fleets/<name>.toml` and their `schema = \"fleet\"`header,under\n`$CODEWHALE_HOME/`ortheworkspace's`.codewhale/`(checked-inrostersatthe\nworkspaceroot's`fleets/`arestillread);\n-the`[fleet]`configtable(inline`[fleets.*]`tableswereremovedin0.9.14;namedfleetslivein`fleets/<name>.toml`files);\n-the`codewhaleworkflowrun--fleet<name>`flag;\n-wire,receipt,andcontrol-planeoperationidssuchas`fleet.status`.\n\nTherestofthisdocumentusesfleetasthepublicproductnounandretains\ntheseliteralpaths,keys,flags,andids.\n\nUseafleetrosterratherthananonymousshort-lived`agent`fanoutwhenevera\ndelegatedrunneedsstablememberidentitiesacrossretries,sleep/restart,\nremoteexecution,receipts,oraledgeredaudittrail.TheinitialCLIsurface\nis:\n\nForaguidedstart-to-monitorwalkthroughthatcombinesfleettaskspecswith\nWorkflowauthoring,see[fleet+WorkflowTutorial](FLEET_WORKFLOW_TUTORIAL.md).\n\n```sh\ncodewhalefleetinit\ncodewhalefleetruntasks.json--check#validateonly;nothingiscreatedorlaunched\ncodewhalefleetruntasks.json--max-workers4\ncodewhalefleetstatus\ncodewhalefleetinspect<worker-id>\ncodewhalefleetlogs<worker-id>\ncodewhalefleetartifacts<worker-id>\ncodewhalefleetinterrupt<worker-id>\ncodewhalefleetrestart<worker-id>\ncodewhalefleetresume<run-id>\ncodewhalefleetstop--all\n```\n\n`codewhalefleetresume<run-id>`istherestart-recoveryverb:itreplaysthe\nledger,reconcilesanyin-flightleasewhoseworkerstoppedheartbeating\n(retryingwithinthetask'sbudget,elsefailingandescalatingperthealert\npolicy),andprintsthepost-resumestatus.Itlaunchesnonewworkandis\nidempotent,soitissafetorunafteramanagerexit,laptopsleep,orruntime\nrestart.\n\nCoordinatorstateforfleet-backedrunsisstoredundertheworkspacein\n`.codewhale/fleet.jsonl`.Workerlogsandadapterlogsarestoredunder\n`.codewhale/fleet/`and`.codewhale/fleet-host/`.\n\n##Publiccontract:identity,membership,andselection\n\n**Fleet**=theuser'smodelinventory:whoisintherosterandwhichmemberisselected.\n\nApublicfleetidentityconsistsonlyof:\n\n-astablememberidandanoptionaluser-facingname;\n-asemanticrole,suchas`explore`,`implement`,or`reviewer`(thelegacy\nspellings`worker`,`scout`,`builder`,`verifier`,`consultant`,and`oracle`\narestillacceptedoninputandmapto`general`,`explore`,`implement`,\n`test`,and`advisor`);\n-anexactprovider/modelidentity,oranexplicitinheritedroute;\n-visiblerosterstateororigin.\n\nProjectorworkspacetrust,filesystemandnetworkreach,secretaccess,\napprovalmode,sandboxing,toolauthorization,andeveryotherformofruntime\nauthorityareseparatedelegated-coordinationandRuntimepolicyinputs.They\nareneverfleetidentityfields,andtheyneverselectorrerouteafleet\nmember.TheRuntimeappliesandclampsthosepoliciesonlyaftermember\nselection;iftheselectedmembercannotruninsidetheeffectiveenvelope,\nlaunchfailsclosedinsteadofchoosingsomebodyelse.\n\nNatural-languagememberselectionisdeterministic.Acallermayname:\n\n-anexactmemberid,optionallyas`member:<id>`or`id:<id>`;\n-auniqueuser-facingmembername,optionallyas`name:<name>`;\n-auniquesemanticrole,forexample`explore`or`role:explore`;\n-anexactpinnedmodelid,forexample`deepseek-v4-flash`,oritsoffline\ndisplayname,forexample`DeepSeekV4Flash`;or\n-anexact`route:<provider>/<model>`.\n\nAnunqualifiedexactmemberidwins.Everyothermatchsucceedsonlywhenit\nidentifiesonedistinctrostermember.Multiplematchesproduceanambiguity\nerrorLine truncated
"content":"# Modes and Permission Postures\n\n> 阅读简体中文版:[zh_hans/MODES.md](zh_hans/MODES.md)\n\nCodewhale has three related concepts:\n\n- **TUI mode**: what kind of visible interaction you're in (Plan/Work/Operate).\n- **Permission posture**: how aggressively the UI asks before executing tools.\n- **Workflow**: named steps that coordinate sub-agents, with dependencies and\n results, available in any TUI mode.\n\nModel selection is separate. `--model auto` and `/model auto` route each turn to\na concrete model and thinking level; they are not TUI modes and are not part of\nthe `Tab` cycle.\n\nWorkflow runs named steps through the same sub-agent runtime; Fleet manages\ntheir saved roles and model assignments. A workflow adds ordering, result\nhandoffs, gates and a progress view. The active mode and permission posture\nstill control what each step may execute.\n\nBefore assigning steps, query `agent(action=\"roster\")` for the saved Fleet\nmodels and roles. A plan child can select a listed model with `model`, or use\nthe saved `role`/`profile` assignment. An Exact Fleet fixes each member's route.\n\n## TUI Modes\n\nPress `Tab` to complete composer menus or cycle through the visible modes\nwhen the composer is empty: **Plan → Work → Operate → Plan**. `Tab` never sends\nor queues composer text; use `Enter` to send or queue it.\nPress `Shift+Tab` to cycle permission posture (Ask → Auto-Review → Full Access).\nEvery change of effective permission writes a `Permissions changed to …` line\nin the transcript.\nPress `Ctrl+T` to cycle reasoning effort.\nRun `/mode` to open the mode picker, or switch directly with `/mode work`,\n`/mode plan`, or `/mode operate`.\n\n- **Plan**: design-first prompting. The stable primitive names remain familiar, but the runtime centrally refuses file mutation and shell execution. Read-only inspection and policy-allowed research, including deferred Web search/fetch, remain available. When a Plan turn successfully finishes a nonempty response, including a prose-only plan, the TUI asks how to continue: Work (Ask), Work (Auto-Review), or keep planning. Work sends the exact approved response as a normal follow-up and preserves that turn's existing To-dos, or adds one pending plan item without replacing unrelated work.\n- **Work** (internally `agent`): ordinary multi-step execution. The first-turn toolbox includes `read`, `write`, `edit`, `bash`, `agent`, `workflow`, and `todo_write`, plus `create_goal`, `get_goal`, and `update_goal` so goal controls are available without discovery. The agent calls `create_goal` when a request is a durable objective; the host never infers a goal from wording, and the contract must not tell the model otherwise. Approval, sandbox, repository law, and managed policy decide what may execute.\n- **Operate**: Work at full strength, the \"ultra\"mode.SametoolsandauthorityasWork;thedifferenceishowtheyareused.Eachsubstantiverequestbecomesagoal(`create_goal`),theplanstaysvisible(`todo_write`),multi-partworkrunsthrough`workflow`andparallel`agent`workers,non-trivialchangesgetanindependentreviewerbeforetheyarecalleddone,longcommandskeeprunninginthebackground,andrecurringorwatch-typeworkisofferedasan`automation`(createdafterapproval).Itkeepsgoinguntilthegoalisverified,blockedonyou,orpaused.\n\n`Act`and`/modeact`remaincompatibilityaliasesforWork.Savedsettings\nstillnormalizetotheinternalvalue`agent`.\n\n###Toolavailabilitybymode\n\n|Toolfamily|Plan|Work|Operate|\n|:---|:---:|:---:|:---:|\n|`read`andpolicy-alloweddeferredresearchtools|yes|yes|yes|\n|`write`and`edit`|visiblenames;executiondenied|approval-andpolicy-gated|sameasWork|\n|`bash`|visiblename;executiondenied|approval-andpolicy-gated|sameasWork;delegationispreferredwhenparallelismorisolationhelps|\n|`agent`|yes,subjecttochild-depthauthority|yes,subjecttochild-depthauthority|yes,subjecttochild-depthauthority|\n|Deferrednative,MCP,andplugintools|discoverablethrough`tool_search`whenpolicypermits|same|same|\n|Paidorexternal-servicetools|followspermissionposture|followspermissionposture|followspermissionposture|\n|Accessoutsidetheworkspaceroot|explicittrustedpathsonly|onlythroughtrustedpathsortrustmode|sametrusted-path/trustpolicyasWork;fleetprofilesneverwidenit|\n\nOperatechangesschedulingemphasis,notauthority.Itneitheraddsa\nmode-specifictooldenialnorbypassestheactiveapproval,sandbox,shell,\nask-rule,repository-law,ormanaged-policyboundary.Planremainsthe\nmode-specificexecutionboundaryforshellandwrite-capabletools;that\nauthoritydifferencedoesnotrequireadifferentprimitivevocabulary.\n\n###Operateloop(onescreen)\n\n```text\nUsermessage\n→small/chat/one-file?→parentdoesit(Work-equLine truncated
"content":"# Codewhale Architecture\n\n> 阅读简体中文版:[zh_hans/ARCHITECTURE.md](zh_hans/ARCHITECTURE.md)。\n\nCodewhale Engine is the existing Rust execution runtime. The\n[Runtime API](RUNTIME_API.md) is its client interface, and\n[TypeScript mods](EXTENSIONS.md) contribute reviewed extensions.\n\nCurrent boundary note (read the workspace version from `Cargo.toml`; this\nboundary has held since v0.9.1):\n- `crates/tui` is still the live end-user runtime for the TUI, runtime API, task manager, and tool execution loop.\n- Other workspace crates are being split out incrementally, but they are not yet the sole runtime source of truth.\n\n<img src=\"assets/architecture.webp\" alt=\"Codewhale architecture: clients reach the one turn loop, Engine::run_turn, through the CLI or the Runtime API; the engine uses crates/core to build requests, runs tools under approval and sandbox policy, routes to any provider through crates/config, and logs everything model-visible to the session store.\" width=\"1000\">\n\nThe diagram draws the Runtime API and the task manager as their own boxes; today\nboth are hosted inside `crates/tui`, as the note above says. The GPUI desktop\napp and the VS Code extension live outside this repository. The arrow from the\nengine to the session log follows the \"model-visible means logged\"contract\nratherthanatracedwritepath.\n-`crates/tui`isbeingsplitintocratessizedasagentworkpartitions:\ncontracts,utilities,services,providers,runtime,leaffeaturecrates,\nTUIviewsandhosts,intheorder`docs/design/TUI_DECONSTRUCTION.md`\nrecords.TheTUIstaystheonlycratethatwritestotheterminal.Untila\nmodulehasmoved,itspathunder`crates/tui/src`isstillwhereitlives.\n-TheLSPsubsystem(`crates/tui/src/lsp/`)isfullywiredintotheengine's\npost-tool-executionpath(`core/engine/lsp_hooks.rs`),providinginline\ndiagnosticsafter`File`write,edit,andpatchactions.\n-Theswarmagentsystemwasremovedinv0.8.5.Theactivesub-agentsurfaceis\nthesingle`agent`tool;persistentRLMsessionsareavailablethroughthe\ndeferred`rlm`actionfamily.\nNomodel-visibleswarmtoolremainsintheactivecodebase.\n\n##High-LevelOverview\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│UserInterface│\n│┌─────────────────┐┌─────────────────┐┌────────────────┐│\n││TUI(ratatui)││One-shotMode││Config/CLI││\n│└────────┬────────┘└────────┬────────┘└────────┬───────┘│\n└───────────┼─────────────────────┼────────────────────┼──────────┘\n│││\n▼▼▼\n┌─────────────────────────────────────────────────────────────────┐\n│CoreEngine│\n│┌─────────────────────────────────────────────────────────┐│\n││AgentLoop(core/engine.rs)││\n││┌─────────┐┌─────────────┐┌──────────────────────┐││\n│││Session││TurnMgmt││ToolOrchestration│││\n││└─────────┘└─────────────┘└──────────────────────┘││\n│└─────────────────────────────────────────────────────────┘│\n└─────────────────────────────────────────────────────────────────┘\n│││\n▼▼▼\n┌──────────────────────────────────────────────────────Line truncated
"content":"# Codewhale Runtime Simplification Design\n\n**Status:** Pre-implementation design record for the v0.9.1 cutover, kept for its\n\"Rejected alternatives\" provenance. It is **not** current runtime documentation\nand it shipped differently in two ways:\n\n- Goal 3 below (\"keeping every legacy tool name registered but hidden\")was\nreversed.Theper-actionfile/git/run/weband`exec_shell*`nameswere\n**removed**,nothidden—`crates/tui/src/tools/registry.rs`assertsthey\nmuststayunregistered.Only`apply_patch`andthe\n`task_*`/`github_*`/`automation_*`/`rlm_*`/`checklist_*`families\nsurviveashiddenaliases.\n-Thedefault-activepolicyisninenames,notten.`update_plan`and`Web`are\nnotin`DEFAULT_ACTIVE_NATIVE_TOOLS`\n(`crates/tui/src/core/engine/tool_catalog.rs:44-58`).\n\nForthecurrentcontractsee[`TOOL_SURFACE.md`](TOOL_SURFACE.md).\n\n##Goal\n\nMakethemodel-facingruntimesmaller,calmer,andeasierformodelstouseby:\n\n1.Collapsingthelongtailofsingle-purposefile,git,run,andwebtoolsinto\nafewcanonicalaction-basedtools.\n2.Shrinkingthesystemprompttodurablebehavioralinvariantsandper-turn\npermissiondeltas.\n3.Keepingeverylegacytoolnameregisteredbuthiddensooldtranscripts,\nsavedsessions,andrecordedautomationreplaywithoutmigration.\n\n##Targetmodel-facingsurface(defaultactive)\n\n|Tool|Actions/Niche|\n|---|---|\n|`Bash`|`run`,`wait`,`interact`,`cancel`(existing)|\n|`File`|`read`,`list`,`search_name`,`search_content`,`write`,`edit`,`patch`|\n|`Git`|`status`,`diff`,`log`,`show`,`blame`|\n|`Run`|`tests`,`verifiers`|\n|`Web`|`search`,`fetch`,`wait`(deferredunlessnetworkisenabled;hiddenaliasesforlegacynames)|\n|`tasks`|durabletaskfamily(existingaction-basedsurface)|\n|`github`|durableGitHubfamily(existing;deferredbydefault)|\n|`automation`|durableautomationfamily(existing;deferredbydefault)|\n|`rlm`|durableRLMfamily(existing;deferredbydefault)|\n|`agent`|sub-agentdispatch|\n|`remember`|opt-indurableuser-memorycapture;eagerwheneverregistered|\n|`todo_write`|progress/plan-of-workupdates|\n|`update_plan`|planartifactupdates|\n|`tool_search`|on-demanddiscoveryofdeferredtools|\n\nDefault-activepolicy:**10names**(vs.~18beforethesimplification),with\n`remember`registeredonlyforbuilt-in-memoryusersandthedurablefamilies\nand`Web`discoverablevia`tool_search`whenneeded.`tool_search`itselfisa\nsyntheticalways-activecatalogentry.\n\n##Rejectedalternatives\n\n-**Keepeverytoolbutdefertherareones.**Thisonlychangeswhatis\nadvertised,nothowmanydistinctschemasthemodelmustlearn.Italso\nleavesduplicatedguidanceintheprompt.\n-**Routesearchandgitthrough`Bash`.**`grep_files`,`file_search`,andthe\ngittoolsreturnstructured,workspace-awareoutputandrespectsandbox,\n`.gitignore`,andnetworkpolicy.Shellwouldforcethemodeltore-parse\nfree-formtextandlosethoseguarantees,sodedicatedtoolswin.\n-**Onemega`File`toolplusaseparate`Edit`tool.**Asingle`File`toolis\nonlyslightlylargerthanaread/editpairandkeepstheboundarythemodel\nalreadyunderstands(`read`ischeap,`edit`requirespriorread).Splitting\nwouldre-introduceatwo-toolaliasforthesameunderlyingoperations.\n-**Deletelegacytools.**Savedtranscriptsandreplaytestsrelyontheold\nnames.Removingthemwouldrequireaconfigmigrationandbreakreproducibility.\nHiddenaliasesavoidboth.\n\n##Compatibility\n\n-Legacynames(`read_file`,`write_file`,`edit_file`,`list_dir`,`file_search`,\n`grep_files`,`apply_patch`,`git_status`,`git_diff`,`git_log`,`git_show`,\n`git_blame`,`run_tests`,`run_verifiers`,`web_search`,`fetch_url`,\n`wait_for_dev_server`)stayregisteredwith`model_visible=false`.\n-Theengineresolvescallsbyname,sooldtranscriptsreplaywithoutchanges.\n-`DEFAULT_ACTIVE_NATIVE_TOOLS`isupdatedtolistthenewcanonicalnamesonly;\nhiddenlegacytoolsareignoredbycatalogconstruction.\n\n##Promptsimplification\n\n-Replacethetool-callingrecipesectionsin`AGENT_MODE`and\n`SUBAGENT_OUTPUT_FORMAT`withshortreferencestothecanonicaltools.\n-Reducemodedeltastopermissionstatements(Act=writerequiresapproval,\nPlan=nowritesorshell,FullAccess=auto-approved,Operate=coordinatefrom\nordinarymessages).\n-Keepthe`BASE_PROMPT`behavioralinvariants,`LANGUAGE_PROMPT`,and\n`OUTPUT_PROMPT`intact.\n-Movedetailedtemplates(`COMPACT_TEMPLATE`,sub-agentbriefformat,planning\nartifacttemplate)outofthestableprefixandintotoolschemasor\nconditionalblocks.\n\n##Validation\n\n-Provider-free:`scripts/measure-runtime-contract.py`reportsactivetoolcount\nandpromptbytesbeforeandaLine truncated
"content":"# LSP: PHP Support & Custom Language Server Extension\n\n> 阅读简体中文版:[zh_hans/LSP_PHP_CUSTOM.md](zh_hans/LSP_PHP_CUSTOM.md)\n>\n> v0.8.65+ | `codex/lsp-php-custom-servers`\n\n## Overview\n\nThis feature adds **PHP** to the built-in LSP language registry and introduces a\n`[lsp.custom]` config section so users can register arbitrary LSP servers by\nfile extension — covering languages absent from the built-in `Language` enum\n(Ruby, C#, Swift, Lua, etc.).\n\n## Changes\n\n### 1. PHP built-in support\n\n- `Language::Php` variant added to the enum in `crates/tui/src/lsp/registry.rs`\n- `.php` files are detected and routed to `intelephense --stdio` by default\n- User can override via `[lsp.servers].php`\n\n### 2. Custom LSP server extension\n\nNew struct `CustomLspDef` (defined in `crates/tui/src/lsp/mod.rs` and mirrored\nin `crates/config/src/lib.rs`):\n\n```rust\npub struct CustomLspDef {\n pub language_id: String, // LSP languageId for textDocument/didOpen\n pub command: String, // executable to spawn\n pub args: Vec<String>, // arguments (default empty)\n}\n```\n\nNew config field `LspConfig.custom: HashMap<String, CustomLspDef>` — keyed by\nfile extension (without dot), e.g. `\"rb\"`, `\"cs\"`, `\"swift\"`.\n\nIn `LspManager::diagnostics_for`, when the built-in registry returns\n`Language::Other`, the manager checks the user's custom table before giving up.\nCustom servers get their own lazy-spawn transport map and once-per-extension\nmissing-binary warnings (no log spam).\n\n### 3. Transport generalization\n\n`StdioLspTransport::spawn` now accepts `&str language_id` instead of\n`Language`, so both built-in and custom servers share the same transport\nimplementation. The old `Language` import is removed from `client.rs`.\n\n### 4. Polling pipeline extracted\n\n`poll_diagnostics` is a new private method that both built-in and custom\ndiagnostics paths share — eliminating duplicated call/wait/filter/sort/truncate\nlogic.\n\n## Configuration\n\n### Built-in PHP (enabled by default if `intelephense` is on PATH)\n\n```toml\n# No config needed — PHP .php files are detected automatically.\n# Override the server if desired:\n[lsp.servers]\nphp = [\"phpactor\", \"language-server\"]\n```\n\n### Custom language servers\n\n```toml\n[lsp.custom.rb]\ncommand = \"ruby-lsp\"\nargs = [\"--stdio\"]\nlanguage_id = \"ruby\"\n\n[lsp.custom.cs]\ncommand = \"csharp-ls\"\nlanguage_id = \"csharp\"\n\n[lsp.custom.swift]\ncommand = \"sourcekit-lsp\"\nlanguage_id = \"swift\"\n```\n\nKeys are file extensions (no leading dot). The `args` field defaults to empty.\n`language_id` must match what the LSP server expects in `textDocument/didOpen`.\n\n## Architecture\n\n```\nedit_file / write_file / apply_patch success\n │\n ▼\n LspManager.diagnostics_for(file)\n │\n ├── custom_for_extension(file) ── found? ──► transport_for_custom(ext, def)\n │ │\n ├── detect_language(file) ── Other? ──► return None (skip)\n │\n └── transport_for(lang)\n │\n ▼\n poll_diagnostics(file, text, transport)\n │\n ▼\n DiagnosticBlock → injected into session message stream\n```\n\n## Verification\n\n```\ncargo test -p codewhale-tui --lib lsp::\n# 32 tests passed (3 new: detects_php_extension, language_ids_for_php,\n# server_for_php_is_intelephense)\ncargo clippy -p codewhale-tui --lib\n# lsp module: zero new warnings\n```\n\n## Files touched\n\n| File | Change |\n|------|--------|\n| `crates/tui/src/lsp/registry.rs` | +Php variant, detection, server mapping, tests |\n| `crates/tui/src/lsp/mod.rs` | +CustomLspDef, LspConfig.custom, LspManager custom fallback |\n| `crates/tui/src/lsp/client.rs` | spawn accepts &str language_id |\n| `crates/tui/src/config.rs` | LspConfigToml.custom + into_runtime |\n| `crates/config/src/lib.rs` | LspConfigToml.custom + CustomLspDef |\n| `config.example.toml` | PHP docs + custom extension examples |\n"
"description":"Browse Codewhale commands, tools and Runtime capabilities with availability and documentation.",
"notice":"This catalogue covers {count} entries in source v{version}. Names and descriptions are in English; check your installed version.",
"stable":"Stable",
"flagged":"Requires a flag",
"experimental":"Experimental",
"partial":"Partial",
"preview":"Preview",
"none":"Unavailable",
"docs":"Read documentation",
"source":"Read source entry",
"exportJson":"Download feature JSON"
},
"docs-skills":{
"metaTitle":"Manage skills · Codewhale Docs",
"metaDescription":"Find, install and trust SKILL.md instruction packages. Control user and model invocation and import compatible Claude Code skills.",
"bodyClassName":"text-ink-soft leading-relaxed",
"title":"Manage reusable skills",
"lede":"Skills are SKILL.md instruction packages. Discover compatible folders, then review the source and trust before using a skill.",
"p":"The manager opens without network access and shows owned roots. Turn on compatible-root scanning to inspect external folders; importing targets a Codewhale-owned root."
"p":"Owned roots are .codewhale/skills in your project and ~/.codewhale/skills globally. Compatible .agents/skills and .claude/skills directories are read-only import sources."
},
{
"note":"Project skills load only after you trust that workspace. A configured external skills_dir stays read-only; choosing a folder does not grant authority to mutate it."
}
]
},
{
"id":"invocation",
"title":"Choose who can load a skill",
"blocks":[
{
"p":"Frontmatter disable-model-invocation: true removes a skill from model discovery. user-invocable: false hides it from user menus and refuses explicit activation; setting both disables both paths."
},
{
"p":"A skill body enters context when loaded. The compact catalogue contains bounded names, aliases and invocation metadata."
}
]
}
],
"next":[
{
"href":"/docs/claude-code",
"label":"Move from Claude Code",
"note":"Bring compatible skills and review a settings import."
},
{
"href":"/plugins",
"label":"Add plugins",
"note":"Install supported bundles through review and trust."
}
],
"sourceNote":"Source: docs/SKILLS.md and docs/CLAUDE_PLUGIN_COMPAT.md."
},
"docs-claude-code":{
"metaTitle":"Move from Claude Code · Codewhale Docs",
"metaDescription":"Use Codewhale as an open-source Claude Code alternative. Bring compatible instructions and skills, and review a settings and MCP import plan.",
"bodyClassName":"text-ink-soft leading-relaxed",
"title":"Move from Claude Code",
"lede":"Keep compatible project instructions and skill folders while choosing your own model connection. Review settings and plugin imports before applying them.",
"sections":[
{
"id":"instructions",
"title":"Keep your project instructions",
"blocks":[
{
"p":"AGENTS.md is the canonical project instruction file. CLAUDE.md and .claude/instructions.md are compatibility fallbacks; they do not override Codewhale security controls."
},
{
"p":"Plain .claude/skills/<name>/SKILL.md folders are discovered through the normal [skills registry](/docs/skills), with workspace trust and invocation controls."
}
]
},
{
"id":"settings",
"title":"Review a settings import",
"blocks":[
{
"code":"/import-claude",
"lang":"Codewhale"
},
{
"p":"The command reads Claude settings and writes a reviewable report and unapplied config bundle. MCP servers use the existing import consent flow; permissions and hooks need separate review."
},
{
"note":"Secret-shaped and unknown environment values are not imported or echoed. Running the plan does not enable servers or apply permissions."
}
]
},
{
"id":"plugins",
"title":"Install the supported plugin subset",
"blocks":[
{
"code":"/plugin install <spec>",
"lang":"Codewhale"
},
{
"p":"The declarative .claude-plugin/plugin.json subset supports skills, commands, agent profiles and MCP declarations. Codewhale review hashes and explicit trust and enablement still apply."
},
{
"note":"Codewhale does not run Claude Code plugin runtimes. Hooks, plugin LSP declarations, build steps and TypeScript agents are outside this importer."
},
{
"p":"[Read the compatibility limits](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/CLAUDE_PLUGIN_COMPAT.md). Choose credentials and endpoints in [model setup](/models)."
}
]
}
],
"next":[
{
"href":"/docs/skills",
"label":"Manage skills",
"note":"Inspect compatible directories before importing."
},
{
"href":"/docs/auth",
"label":"Connect a provider",
"note":"Use your chosen hosted or local model."
}
],
"sourceNote":"Source: docs/CONFIGURATION.md, docs/CLAUDE_PLUGIN_COMPAT.md and the claude-settings-import entry in docs/features.toml."
},
"chrome":{
"navDocs":"Docs",
"navStart":"Start",
@@ -6,6 +152,7 @@
"navFaq":"FAQ",
"navCommunity":"Community",
"navContribute":"Contribute",
"navFeatures":"Capabilities",
"navProduct":"Product",
"navModels":"Models",
"navPlugins":"Plugins",
@@ -46,10 +193,10 @@
"partialBadge":"(partial)"
},
"home":{
"metaTitle":"Codewhale: build with your models and tools",
"metaDescription":"Build apps, automate workflows, and work across connected tools with Codewhale. Open source, with your own model APIs or local and self-hosted inference.",
"metaTitle":"Codewhale: an open-source coding agent",
"metaDescription":"Codewhale is an open-source coding agent for your terminal. Read, edit and test projects with your own hosted or local models.",
"heroTitle":"Build apps and automate your work.",
"heroIntro":"{brand} is an open-source agent that writes code, runs commands and works with the tools you connect. Use your existing model APIs, or run models locally and on your own servers.",
"heroIntro":"{brand} is an open-source coding agent that reads files, writes code and runs commands in your terminal. Connect your existing model API or a local model, and choose which actions need approval.",
"getCodewhale":"Install Codewhale",
"heroInstallAria":"Install command",
"exploreProduct":"Explore Codewhale",
@@ -874,14 +1021,14 @@
"title":"Run Codewhale as an MCP server",
"blocks":[
{
"p":"Other MCP clients — including another Codewhale session — can use Codewhale's tools. Register it once:"
"p":"Other MCP clients can use Codewhale as a tool server. By default, it exposes only read-only `file_read` and `search` tools."
"p":"`add-self` writes an entry that runs `codewhale serve --mcp` over stdio. Each client starts its own process; no network port is opened. `codewhale serve --http` is a different thing — the [Runtime API](/docs/runtime-api) for apps."
"p":"`add-self` registers `codewhale serve --mcp` over stdio; `codewhale mcp-server` is the equivalent entry point. Write tools stay withheld unless the operator explicitly permits them in server configuration. [Runtime API](/docs/runtime-api) HTTP is a separate transport."
}
]
},
@@ -1190,6 +1337,25 @@
"title":"Limit what commands can touch",
"lede":"Approving a command decides whether it runs. A sandbox decides what it can reach once it does. Codewhale uses the operating system's sandbox where one is available and tells you plainly when there is none.",
"sections":[
{
"id":"execution-policy",
"title":"Inspect execution policy rules",
"blocks":[
{
"code":"/permissions",
"lang":"Codewhale"
},
{
"p":"Typed permissions select User, Agent and BuiltinDefault rules in that order. Within one source layer, deny wins over ask and allow; specificity breaks ties."
},
{
"p":"Hard denied command prefixes cannot be overridden by a typed allow. An allow never removes later safety checks, repository restrictions or sandbox limits."
},
{
"p":"[Read the authorization order and matching rules](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/AUTHORIZATION_ORDER.md)"
}
]
},
{
"id":"platforms",
"title":"Check what your platform provides",
@@ -1759,6 +1925,25 @@
"title":"See what leaves your machine",
"lede":"Codewhale runs on your computer and talks to the model provider you choose. This page lists what goes where, what the anonymous usage count contains, and how to switch it off — as built today.",
"sections":[
{
"id":"preview-request",
"title":"See the request before sending",
"blocks":[
{
"p":"/preview-request shows a redacted manifest of the next primary turn. This human command never sends a request or writes conversation or Work state."
},
{
"code":"/preview-request\n/preview-request json\n/preview-request json --prompt explain this project",
"lang":"Codewhale"
},
{
"note":"Without --prompt, route and body are unavailable. A configured classifier, hooks or pending runtime work can also prevent an exact preview; the manifest states why."
},
{
"p":"[Read the request preview contract](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/PREVIEW_REQUEST.md)"
}
]
},
{
"id":"boundaries",
"title":"Where your work goes",
@@ -1926,8 +2111,8 @@
"emptyBody":"The build did not find a parsable CHANGELOG.md. The GitHub release list is still the record."
},
"computer-use":{
"metaTitle":"Computer Use for Mac · Codewhale",
"metaDescription":"Download and set up Codewhale Computer Use for Mac. Background app control, permission setup, and human Pause and Stop controls.",
"metaTitle":"Computer Use · Preview · Codewhale",
"metaDescription":"Preview: download and set up Codewhale Computer Use for Mac. Background app control, permission setup, and human Pause and Stop controls.",
"title":"Computer Use",
"lead":"Let Codewhale work in your apps while you keep working. The Mac helper brings permissions, background app control, and a way to pause or stop input to your menu bar.",
question:{en:"How does automatic model routing work?",zh:"模型自动路由如何工作?"},
answer:{
en:"With /model auto, each turn uses your declared default model unless you configure [auto.router] or enable [auto] cost_saving. No default classifier runs, and holding a DeepSeek key does not select one. /router (also /model router) offers Jev, Fast, Off and Custom presets. A configured classifier needs its provider credentials; unavailable or failed routing falls back to the declared default or the enabled fast sibling. Check the route in the Turn Inspector with Ctrl+Alt+O or /turn inspect.",
en:"Each turn sends the context it needs, including project instructions and tool definitions. Cache behavior depends on the provider, model and stable prompt prefix. Choose a smaller model explicitly when suitable; automatic routing changes models only through the settings you choose. Check /turn inspect for the route, tokens and reported cost.",
windowsNote:{en:"Windows x64. Winget updates can lag behind GitHub releases; npm is another option.",zh:"适用于 Windows x64。Winget 更新可能晚于 GitHub 发布;也可以通过 npm 安装。"},
cargoNote:{en:"Builds from source. Requires current stable Rust and build tools. The Cargo package can lag behind GitHub releases.",zh:"从源码构建,需要当前稳定版 Rust 和构建工具。Cargo 包可能晚于 GitHub 发布。"},
metaDescription:{en:"Install Codewhale on macOS, Linux, or Windows, connect a model, and run your first task. Covers package managers and source builds.",zh:"在 macOS、Linux 或 Windows 上安装 Codewhale,连接模型并运行第一项任务。也介绍包管理器和源码构建。"},
metaTitle:{en:"Install Codewhale, the terminal coding agent",zh:"安装终端编程智能体 Codewhale"},
metaDescription:{en:"Install the open-source terminal coding agent on macOS, Linux or Windows. Connect your model and run a task.",zh:"在 macOS、Linux 或 Windows 上安装开源终端编程智能体。连接你选择的模型并运行任务。"},
source:{en:"Read the verified guide on GitHub",zh:"查看 GitHub 上已验证的指南"},
translationNotice:{en:"Installation receipts retain the version actually tested; latest resolves to the published release.",zh:"本页采用经审阅的简体中文指南。安装回执保留实际测试版本;latest 以已发布版本为准。"},
configuration:{en:"Settings and configuration",zh:"设置与配置"},
metaTitle:{en:"Models and providers · Codewhale",zh:"模型与提供商 · Codewhale"},
metaDescription:{en:"Connect a hosted provider, a gateway, or a local model server, and switch models per session.",zh:"连接托管提供商、网关或本地模型服务,并按会话切换模型。"},
metaTitle:{en:"DeepSeek, Ollama and local models · Codewhale",zh:"DeepSeek、Ollama 与本地模型 · Codewhale"},
metaDescription:{en:"Use Codewhale with DeepSeek, Ollama, other hosted providers or local models. Configure credentials and endpoints, then choose a model per session.",zh:"让 Codewhale 使用 DeepSeek、Ollama、其他托管提供商或本地模型。配置凭据与端点,再按会话选择模型。"},
kicker:{en:"Models and providers",zh:"模型与提供商"},
title:{en:"Pick the right model for each task.",zh:"为每项任务选择合适的模型。"},
lead:{en:"Use a hosted model, a local server, or a gateway. Switch the provider or model whenever the work changes.",zh:"使用托管模型、本地服务或网关。工作变化时,随时切换提供商或模型。"},
cuTitle:{en:"Control apps with Computer Use",zh:"使用 Computer Use 操作应用"},
cuLead:{
en:"The agent observes the apps you choose, reads their controls through the accessibility tree, types and clicks, and records each action in a receipt. macOS is the qualified beta platform; Windows, Linux and HarmonyOS backends remain experimental and source-only.",
en:"Computer Use is a preview. The agent reads app controls, types and clicks, and records actions; Windows, Linux and HarmonyOS backends remain experimental and source-only.",
zh:"Computer Use 是预览功能。智能体读取应用控件、输入与点击,并记录操作;Windows、Linux 与 HarmonyOS 后端仍为实验性、仅提供源码。",
en:"Codewhale is an open-source agent that writes code, runs commands and works with the tools you connect. Use your existing model APIs, or run models locally and on your own servers.",
en:"Codewhale is an open-source coding agent that reads files, writes code and runs commands in your terminal. Connect a hosted or local model and choose which actions need approval.",
en:"Full local HTTP + Server-Sent Events runtime API on 127.0.0.1:7878. Create threads, stream turns, manage background jobs, and control approval decisions — all from any HTTP client or the bundled mobile page.",
en:"ACP stdio connects compatible editors to the existing Engine. It supports durable session creation, listing, loading, prompts, cancellation and model selection. Its local profile admits file/search/git/patch and foreground shell only with editor support and operator permission; MCP, dynamic tools and background jobs are unavailable.",
en:"Connect Codewhale to external tools and services through configured MCP servers over stdio or HTTP/SSE, or expose read-only file_read and search to another MCP client by default.",
en:"Early companion for the local runtime. It can open Codewhale in a terminal, start and check the Runtime API, and show read-only thread summaries and restore points. It does not yet provide full chat, inline edits, or editor actions.",
en:"The community-maintained graphical frontend, in a separate repository: chat, threads, live file changes, and task tracking in a VS Code sidebar over this Runtime API. Install it from the VS Code Marketplace; the source is on GitHub.",
zh:"社区维护的图形前端,位于独立仓库:在 VS Code 侧边栏中基于此 Runtime API 进行对话、管理线程、查看实时文件变更与任务进度。可从 VS Code Marketplace 安装;源码见 GitHub。",
en:"First-party Telegram bot bridge. Start a headless Codewhale session, then chat with it from any Telegram client — approvals, tool results, and completions surface inline.",
en:"Experimental Weixin / WeChat bridge. Receive agent completions and approvals inside WeChat; early-stage and not recommended for production deployments.",
en:"The Runtime API binds 127.0.0.1 by default. The local runtime does not require a Codewhale account or hosted relay.",
zh:"Runtime API 默认仅监听 127.0.0.1。本地运行时不需要 Codewhale 账户或托管中继。",
},
},
{
title:{en:"Auth required",zh:"认证必需"},
body:{
en:"Runtime API routes (/v1/*) require a Bearer token. Pass --auth-token at startup or set CODEWHALE_RUNTIME_TOKEN. Only a loopback bind can turn this off, with --insecure-no-auth.",
zh:"Runtime API 路由(/v1/*)需要 Bearer Token。启动时传入 --auth-token,或设置 CODEWHALE_RUNTIME_TOKEN 环境变量。仅在回环地址上可用 --insecure-no-auth 关闭认证。",
en:"Remote clients submit requests and approval decisions through the authenticated Runtime API. Local mode, permission posture, and sandbox policy still apply.",
zh:"远程客户端通过经过认证的 Runtime API 提交请求与审批决定。本地模式、权限姿态和沙箱策略仍然生效。",
},
},
{
title:{en:"Open protocols",zh:"开放协议"},
body:{
en:"The HTTP/SSE Runtime API, MCP surface, and ACP stdio transport serve different integration needs; choose the interface your compatible client supports.",
lspBody:{en:"After file edits, LSP diagnostics can report errors to the agent. Add a custom server by file extension under [lsp.custom]; install the server executable separately.",zh:"文件修改后,LSP 诊断可向智能体报告错误。通过 [lsp.custom] 按扩展名添加自定义服务器;服务器可执行文件需要单独安装。"},
lspDocs:{en:"PHP and custom LSP server setup",zh:"PHP 与自定义 LSP 服务器设置"},
compatibility:{en:"Legacy names remain only for saved transcripts and protocol clients. Exact old calls retain their handlers but stay out of new catalogs and tool_search. Unknown names are never guessed or rewritten.",zh:"旧名称仅为已保存的记录与协议客户端保留。精确旧调用仍使用原处理器,但不会出现在新目录或 tool_search 中。未知名称不会被猜测或改写。"},
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* as the app shows them; the macOS names use the Arabic system UI labels.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use لنظام Mac · Codewhale",
metaTitle:"Computer Use · معاينة · Codewhale",
metaDescription:"نزّل Codewhale Computer Use لنظام Mac وجهّزه. تحكّم في التطبيقات في الخلفية، وإعداد الأذونات، وأزرار Pause وStop بيدك.",
title:"Computer Use",
lead:"دع Codewhale يعمل داخل تطبيقاتك بينما تواصل عملك. يجمع مساعد Mac في شريط القوائم الأذونات والتحكم في التطبيقات في الخلفية وإمكانية إيقاف الإدخال مؤقتًا أو إنهائه.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Arabic home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: ابنِ باستخدام نماذجك وأدواتك",
metaDescription:
"ابنِ تطبيقات وأتمت العمل واستخدم الأدوات المتصلة مع Codewhale. مفتوح المصدر، مع واجهات نماذجك أو الاستدلال المحلي والمستضاف على أجهزتك.",
metaTitle:"Codewhale: وكيل برمجة مفتوح المصدر",
metaDescription:"Codewhale وكيل برمجة مفتوح المصدر للطرفية. اقرأ المشاريع وعدّلها واختبرها باستخدام نماذجك المستضافة أو المحلية.",
heroTitle:"أنشئ تطبيقات وأتمت عملك.",
heroIntro:
"{brand} وكيل مفتوح المصدر يكتب التعليمات البرمجية وينفذ الأوامر ويعمل مع الأدوات التي تربطها. استخدم واجهات API للنماذج التي تستخدمها بالفعل، أو شغّل النماذج محليًا وعلى خوادمك الخاصة.",
heroIntro:"{brand} وكيل برمجة مفتوح المصدر يقرأ الملفات ويكتب الشيفرة وينفّذ الأوامر في الطرفية. اربط واجهة API لنموذجك أو نموذجاً محلياً واختر الإجراءات التي تتطلب موافقتك.",
@@ -8,7 +8,7 @@ import type { ComputerUseDict } from "../types";
* the names the Catalan system UI shows.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use per a Mac · Codewhale",
metaTitle:"Computer Use · Previsualització · Codewhale",
metaDescription:"Baixa i configura Codewhale Computer Use per a Mac. Control d’aplicacions en segon pla, configuració de permisos i controls humans de Pause i Stop.",
title:"Computer Use",
lead:"Deixa que Codewhale treballi a les teves aplicacions mentre tu continues treballant. L’ajudant per a Mac posa els permisos, el control d’aplicacions en segon pla i una manera de pausar o aturar l’entrada a la barra de menús.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Catalan home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: crea amb els teus models i eines",
metaDescription:
"Crea aplicacions, automatitza fluxos de treball i utilitza eines connectades amb Codewhale. Codi obert, amb les teves API de models o inferència local i autoallotjada.",
metaTitle:"Codewhale: agent de programació de codi obert",
metaDescription:"Codewhale és un agent de programació de codi obert per al terminal. Llegeix, edita i prova projectes amb els teus models allotjats o locals.",
heroTitle:"Crea aplicacions i automatitza la teva feina.",
heroIntro:
"{brand} és un agent de codi obert que escriu codi, executa ordres i treballa amb les eines que connectes. Fes servir les API de models que ja utilitzes o executa models localment i als teus propis servidors.",
heroIntro:"{brand} és un agent de programació de codi obert que llegeix fitxers, escriu codi i executa ordres al terminal. Connecta la teva API de models o un model local i tria quines accions necessiten aprovació.",
@@ -8,7 +8,7 @@ import type { ComputerUseDict } from "../types";
* the other German dictionaries: knapp, Anrede per Du.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use für den Mac · Codewhale",
metaTitle:"Computer Use · Vorschau · Codewhale",
metaDescription:"Codewhale Computer Use für den Mac herunterladen und einrichten. App-Steuerung im Hintergrund, Berechtigungen einrichten und Pause und Stop in deiner Hand.",
title:"Computer Use",
lead:"Lass Codewhale in deinen Apps arbeiten, während du weiterarbeitest. Der Mac-Helfer bringt Berechtigungen, App-Steuerung im Hintergrund und eine Möglichkeit, Eingaben zu pausieren oder zu stoppen, in deine Menüleiste.",
description:"Entdecke Befehle, Werkzeuge und Runtime-Funktionen von Codewhale mit Verfügbarkeit und Dokumentation.",
notice:"Der Katalog enthält {count} Einträge aus Quellversion v{version}. Namen und Beschreibungen sind auf Englisch; prüfe deine installierte Version.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** German home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: Bauen mit deinen Modellen und Werkzeugen",
metaDescription:
"Baue Apps, automatisiere Abläufe und arbeite mit verbundenen Werkzeugen. Codewhale ist Open Source und nutzt deine Modell-APIs oder lokale und selbst gehostete Inferenz.",
metaTitle:"Codewhale: ein Open-Source-Programmieragent",
metaDescription:"Codewhale ist ein Open-Source-Programmieragent für dein Terminal. Lies, bearbeite und teste Projekte mit deinen gehosteten oder lokalen Modellen.",
heroTitle:"Erstelle Apps und automatisiere deine Arbeit.",
heroIntro:
"{brand} ist ein Open-Source-Agent, der Code schreibt, Befehle ausführt und mit den Tools arbeitet, die du verbindest. Nutze deine vorhandenen Modell-APIs oder führe Modelle lokal und auf deinen eigenen Servern aus.",
heroIntro:"{brand} ist ein Open-Source-Programmieragent, der Dateien liest, Code schreibt und Befehle im Terminal ausführt. Verbinde deine Modell-API oder ein lokales Modell und wähle, welche Aktionen eine Zustimmung brauchen.",
@@ -7,8 +7,8 @@ import type { ComputerUseDict } from "../types";
* macOS setting names stay as the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use for Mac · Codewhale",
metaDescription:"Download and set up Codewhale Computer Use for Mac. Background app control, permission setup, and human Pause and Stop controls.",
metaTitle:"Computer Use · Preview · Codewhale",
metaDescription:"Preview: download and set up Codewhale Computer Use for Mac. Background app control, permission setup, and human Pause and Stop controls.",
title:"Computer Use",
lead:"Let Codewhale work in your apps while you keep working. The Mac helper brings permissions, background app control, and a way to pause or stop input to your menu bar.",
metaTitle:"Move from Claude Code · Codewhale Docs",
metaDescription:"Use Codewhale as an open-source Claude Code alternative. Bring compatible instructions and skills, and review a settings and MCP import plan.",
bodyClassName:"text-ink-soft leading-relaxed",
title:"Move from Claude Code",
lede:"Keep compatible project instructions and skill folders while choosing your own model connection. Review settings and plugin imports before applying them.",
sections:[
{
"id":"instructions",
"title":"Keep your project instructions",
"blocks":[
{
"p":"AGENTS.md is the canonical project instruction file. CLAUDE.md and .claude/instructions.md are compatibility fallbacks; they do not override Codewhale security controls."
},
{
"p":"Plain .claude/skills/<name>/SKILL.md folders are discovered through the normal [skills registry](/docs/skills), with workspace trust and invocation controls."
}
]
},
{
"id":"settings",
"title":"Review a settings import",
"blocks":[
{
"code":"/import-claude",
"lang":"Codewhale"
},
{
"p":"The command reads Claude settings and writes a reviewable report and unapplied config bundle. MCP servers use the existing import consent flow; permissions and hooks need separate review."
},
{
"note":"Secret-shaped and unknown environment values are not imported or echoed. Running the plan does not enable servers or apply permissions."
}
]
},
{
"id":"plugins",
"title":"Install the supported plugin subset",
"blocks":[
{
"code":"/plugin install <spec>",
"lang":"Codewhale"
},
{
"p":"The declarative .claude-plugin/plugin.json subset supports skills, commands, agent profiles and MCP declarations. Codewhale review hashes and explicit trust and enablement still apply."
},
{
"note":"Codewhale does not run Claude Code plugin runtimes. Hooks, plugin LSP declarations, build steps and TypeScript agents are outside this importer."
},
{
"p":"[Read the compatibility limits](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/CLAUDE_PLUGIN_COMPAT.md). Choose credentials and endpoints in [model setup](/models)."
}
]
}
],
next:[
{
"href":"/docs/skills",
"label":"Manage skills",
"note":"Inspect compatible directories before importing."
},
{
"href":"/docs/auth",
"label":"Connect a provider",
"note":"Use your chosen hosted or local model."
}
],
sourceNote:"Source: docs/CONFIGURATION.md, docs/CLAUDE_PLUGIN_COMPAT.md and the claude-settings-import entry in docs/features.toml."
p:"`add-self` writes an entry that runs `codewhale serve --mcp` over stdio. Each client starts its own process; no network port is opened. `codewhale serve --http` is a different thing — the [Runtime API](/docs/runtime-api) for apps.",
p:"`add-self` registers `codewhale serve --mcp` over stdio; `codewhale mcp-server` is the equivalent entry point. Write tools stay withheld unless the operator explicitly permits them in server configuration. [Runtime API](/docs/runtime-api) HTTP is a separate transport.",
"Codewhale shows you each edit as it happens and keeps a snapshot of your workspace before and after every turn. Use this page to check what changed, put files back, and get a second opinion before you push.",
sections:[
{
"id":"receipts",
"title":"See what a session did",
"blocks":[
{
"p":"Session receipts list recorded file changes, commands, tools, agents, approvals and failures. Review receipts below cover a separate code review."
"p":"These surfaces only read records. They never call a provider, run tools or change session state."
},
{
"note":"A Runtime receipt does not itemize files changed by shell commands. The terminal can report changes from its turn snapshots; older records may omit who decided an approval."
"`--receipt-path <file>` writes or reads a specific receipt instead of the latest one.",
],
},
{
note:"Receipts cover code reviews today. A receipt for an ordinary agent turn — every tool call, approval, and file change in one export — is designed but not built yet.",
"Approving a command decides whether it runs. A sandbox decides what it can reach once it does. Codewhale uses the operating system's sandbox where one is available and tells you plainly when there is none.",
sections:[
{
"id":"execution-policy",
"title":"Inspect execution policy rules",
"blocks":[
{
"code":"/permissions",
"lang":"Codewhale"
},
{
"p":"Typed permissions select User, Agent and BuiltinDefault rules in that order. Within one source layer, deny wins over ask and allow; specificity breaks ties."
},
{
"p":"Hard denied command prefixes cannot be overridden by a typed allow. An allow never removes later safety checks, repository restrictions or sandbox limits."
},
{
"p":"[Read the authorization order and matching rules](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/AUTHORIZATION_ORDER.md)"
"p":"The manager opens without network access and shows owned roots. Turn on compatible-root scanning to inspect external folders; importing targets a Codewhale-owned root."
"p":"Owned roots are .codewhale/skills in your project and ~/.codewhale/skills globally. Compatible .agents/skills and .claude/skills directories are read-only import sources."
},
{
"note":"Project skills load only after you trust that workspace. A configured external skills_dir stays read-only; choosing a folder does not grant authority to mutate it."
}
]
},
{
"id":"invocation",
"title":"Choose who can load a skill",
"blocks":[
{
"p":"Frontmatter disable-model-invocation: true removes a skill from model discovery. user-invocable: false hides it from user menus and refuses explicit activation; setting both disables both paths."
},
{
"p":"A skill body enters context when loaded. The compact catalogue contains bounded names, aliases and invocation metadata."
}
]
}
],
next:[
{
"href":"/docs/claude-code",
"label":"Move from Claude Code",
"note":"Bring compatible skills and review a settings import."
},
{
"href":"/plugins",
"label":"Add plugins",
"note":"Install supported bundles through review and trust."
}
],
sourceNote:"Source: docs/SKILLS.md and docs/CLAUDE_PLUGIN_COMPAT.md."
"Codewhale runs on your computer and talks to the model provider you choose. This page lists what goes where, what the anonymous usage count contains, and how to switch it off — as built today.",
sections:[
{
"id":"preview-request",
"title":"See the request before sending",
"blocks":[
{
"p":"/preview-request shows a redacted manifest of the next primary turn. This human command never sends a request or writes conversation or Work state."
},
{
"code":"/preview-request\n/preview-request json\n/preview-request json --prompt explain this project",
"lang":"Codewhale"
},
{
"note":"Without --prompt, route and body are unavailable. A configured classifier, hooks or pending runtime work can also prevent an exact preview; the manifest states why."
},
{
"p":"[Read the request preview contract](https://github.com/codewhale-hq/CodeWhale/blob/main/docs/PREVIEW_REQUEST.md)"
@@ -2,13 +2,11 @@ import type { HomeDict } from "../types";
/** English reference home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: build with your models and tools",
metaDescription:
"Build apps, automate workflows, and work across connected tools with Codewhale. Open source, with your own model APIs or local and self-hosted inference.",
metaTitle:"Codewhale: an open-source coding agent",
metaDescription:"Codewhale is an open-source coding agent for your terminal. Read, edit and test projects with your own hosted or local models.",
heroTitle:"Build apps and automate your work.",
heroIntro:
"{brand} is an open-source agent that writes code, runs commands and works with the tools you connect. Use your existing model APIs, or run models locally and on your own servers.",
heroIntro:"{brand} is an open-source coding agent that reads files, writes code and runs commands in your terminal. Connect your existing model API or a local model, and choose which actions need approval.",
@@ -8,7 +8,7 @@ import type { RuntimeDict } from "../types";
exportconstruntime: RuntimeDict={
metaTitle:"Runtime & Integrations · Codewhale",
metaDescription:
"Connect editors, scripts, and chat apps to Codewhale through the local Runtime API over HTTP/SSE, a baseline ACP stdio adapter, MCP servers, an early VS Code companion, and messaging bridges.",
"Connect editors, scripts, and chat apps to Codewhale through the local Runtime API over HTTP/SSE, an ACP stdio transport, MCP servers, an early VS Code companion, and messaging bridges.",
@@ -9,7 +9,7 @@ import type { ComputerUseDict } from "../types";
* the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use para Mac · Codewhale",
metaTitle:"Computer Use · Vista previa · Codewhale",
metaDescription:"Descarga y configura Codewhale Computer Use para Mac. Control de aplicaciones en segundo plano, configuración de permisos y controles Pause y Stop en tus manos.",
title:"Computer Use",
lead:"Deja que Codewhale trabaje en tus aplicaciones mientras tú sigues con lo tuyo. El asistente para Mac reúne en la barra de menús los permisos, el control de aplicaciones en segundo plano y una forma de pausar o detener la entrada.",
description:"Explora los comandos, herramientas y capacidades de Runtime de Codewhale, con disponibilidad y documentación.",
notice:"El catálogo contiene {count} entradas del código fuente v{version}. Los nombres y descripciones están en inglés; comprueba tu versión instalada.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Spanish home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: construye con tus modelos y herramientas",
metaDescription:
"Crea aplicaciones, automatiza flujos de trabajo y usa herramientas conectadas con Codewhale. Código abierto, con tus propias API de modelos o inferencia local y autoalojada.",
metaTitle:"Codewhale: agente de programación de código abierto",
metaDescription:"Codewhale es un agente de programación de código abierto para tu terminal. Lee, edita y prueba proyectos con tus modelos alojados o locales.",
heroTitle:"Crea aplicaciones y automatiza tu trabajo.",
heroIntro:
"{brand} es un agente de código abierto que escribe código, ejecuta comandos y trabaja con las herramientas que conectas. Usa las API de modelos que ya utilizas o ejecuta modelos de forma local y en tus propios servidores.",
heroIntro:"{brand} es un agente de programación de código abierto que lee archivos, escribe código y ejecuta comandos en tu terminal. Conecta tu API de modelos o un modelo local y elige qué acciones necesitan aprobación.",
@@ -8,7 +8,7 @@ import type { ComputerUseDict } from "../types";
* guillemets, in line with the other French dictionaries.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use pour Mac · Codewhale",
metaTitle:"Computer Use · Aperçu · Codewhale",
metaDescription:"Téléchargez et configurez Codewhale Computer Use pour Mac: contrôle des apps en arrière-plan, configuration des autorisations et commandes Pause et Stop à portée de main.",
title:"Computer Use",
lead:"Laissez Codewhale agir dans vos apps pendant que vous continuez à travailler. L’assistant Mac regroupe dans votre barre des menus les autorisations, le contrôle des apps en arrière-plan et de quoi mettre en pause ou arrêter la saisie.",
description:"Parcourez les commandes, outils et capacités du Runtime Codewhale, avec leur disponibilité et leur documentation.",
notice:"Le catalogue contient {count} entrées du code source v{version}. Les noms et descriptions sont en anglais ; vérifiez votre version installée.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** French home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale : créez avec vos modèles et vos outils",
metaDescription:
"Créez des applications, automatisez vos tâches et utilisez vos outils connectés avec Codewhale. Un logiciel libre, avec vos API de modèles ou votre inférence locale et auto-hébergée.",
metaTitle:"Codewhale : agent de programmation open source",
metaDescription:"Codewhale est un agent de programmation open source pour votre terminal. Lisez, modifiez et testez des projets avec vos modèles hébergés ou locaux.",
heroTitle:"Créez des applications et automatisez votre travail.",
heroIntro:
"{brand} est un agent open source qui écrit du code, exécute des commandes et utilise les outils que vous connectez. Utilisez vos API de modèles habituelles, ou exécutez des modèles en local et sur vos propres serveurs.",
heroIntro:"{brand} est un agent de programmation open source qui lit les fichiers, écrit du code et exécute des commandes dans votre terminal. Connectez votre API de modèles ou un modèle local et choisissez les actions à approuver.",
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Mac के लिए Computer Use · Codewhale",
metaTitle:"Computer Use · पूर्वावलोकन · Codewhale",
metaDescription:"Mac के लिए Codewhale Computer Use डाउनलोड और सेट अप करें। बैकग्राउंड में ऐप नियंत्रण, अनुमतियों का सेटअप और आपके हाथ में Pause व Stop नियंत्रण।",
title:"Computer Use",
lead:"आप अपना काम करते रहें और Codewhale आपके ऐप्स में काम करे। Mac हेल्पर अनुमतियाँ, बैकग्राउंड में ऐप नियंत्रण और इनपुट रोकने या बंद करने का तरीका आपके मेनू बार में ले आता है।",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Hindi home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: अपने मॉडल और टूल से बनाएं",
metaDescription:
"Codewhale से ऐप बनाएं, काम स्वचालित करें और जुड़े टूल इस्तेमाल करें। ओपन सोर्स, आपके मॉडल API या स्थानीय और खुद होस्ट किए गए इन्फरेंस के साथ।",
metaTitle:"Codewhale: ओपन-सोर्स कोडिंग एजेंट",
metaDescription:"Codewhale आपके टर्मिनल के लिए एक ओपन-सोर्स कोडिंग एजेंट है। अपने होस्ट किए गए या स्थानीय मॉडल से प्रोजेक्ट पढ़ें, बदलें और जाँचें।",
heroTitle:"ऐप बनाएं और अपना काम स्वचालित करें।",
heroIntro:
"{brand} एक ओपन-सोर्स एजेंट है जो कोड लिखता है, कमांड चलाता है और आपके जोड़े गए टूल के साथ काम करता है। अपने मौजूदा मॉडल API का उपयोग करें, या मॉडल को स्थानीय रूप से और अपने सर्वर पर चलाएं।",
heroIntro:"{brand} एक ओपन-सोर्स कोडिंग एजेंट है जो टर्मिनल में फ़ाइलें पढ़ता, कोड लिखता और आदेश चलाता है। अपने मॉडल API या स्थानीय मॉडल को जोड़ें और चुनें कि किन कार्रवाइयों को मंज़ूरी चाहिए।",
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* the app shows them; formal "Anda" address matches the rest of the site.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use untuk Mac · Codewhale",
metaTitle:"Computer Use · Pratinjau · Codewhale",
metaDescription:"Unduh dan siapkan Codewhale Computer Use untuk Mac. Kendali aplikasi di latar belakang, pengaturan izin, serta kontrol Pause dan Stop di tangan Anda.",
title:"Computer Use",
lead:"Biarkan Codewhale bekerja di aplikasi Anda sementara Anda tetap bekerja. Pembantu Mac ini menghadirkan pengaturan izin, kendali aplikasi di latar belakang, dan cara menjeda atau menghentikan input langsung dari bar menu.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Indonesian home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: berkarya dengan model dan alat pilihanmu",
metaDescription:
"Buat aplikasi, otomatisasikan alur kerja, dan gunakan alat terhubung dengan Codewhale. Sumber terbuka, dengan API model milikmu atau inferensi lokal dan mandiri.",
metaTitle:"Codewhale: agen pemrograman sumber terbuka",
metaDescription:"Codewhale adalah agen pemrograman sumber terbuka untuk terminal. Baca, edit dan uji proyek dengan model jarak jauh atau lokal pilihan Anda.",
heroTitle:"Buat aplikasi dan otomatisasikan pekerjaanmu.",
heroIntro:
"{brand} adalah agen sumber terbuka yang menulis kode, menjalankan perintah, dan bekerja dengan alat yang kamu hubungkan. Gunakan API model yang sudah kamu pakai, atau jalankan model secara lokal dan di servermu sendiri.",
heroIntro:"{brand} adalah agen pemrograman sumber terbuka yang membaca berkas, menulis kode dan menjalankan perintah di terminal. Hubungkan API model atau model lokal Anda dan pilih tindakan yang memerlukan persetujuan.",
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use per Mac · Codewhale",
metaTitle:"Computer Use · Anteprima · Codewhale",
metaDescription:"Scarica e configura Codewhale Computer Use per Mac. Controllo delle app in background, configurazione dei permessi e comandi Pause e Stop sotto il tuo controllo.",
title:"Computer Use",
lead:"Lascia che Codewhale lavori nelle tue app mentre tu continui a lavorare. L’helper per Mac porta nella barra dei menu i permessi, il controllo delle app in background e un modo per mettere in pausa o fermare l’input.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Italian home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: crea con i tuoi modelli e strumenti",
metaDescription:
"Crea app, automatizza flussi di lavoro e usa strumenti connessi con Codewhale. Open source, con le tue API di modelli o inferenza locale e autogestita.",
metaTitle:"Codewhale: agente di programmazione open source",
metaDescription:"Codewhale è un agente di programmazione open source per il terminale. Leggi, modifica e testa progetti con i tuoi modelli remoti o locali.",
heroTitle:"Crea app e automatizza il tuo lavoro.",
heroIntro:
"{brand} è un agente open source che scrive codice, esegue comandi e lavora con gli strumenti che colleghi. Usa le API di modelli che già utilizzi oppure esegui modelli in locale e sui tuoi server.",
heroIntro:"{brand} è un agente di programmazione open source che legge file, scrive codice ed esegue comandi nel terminale. Collega la tua API di modelli o un modello locale e scegli quali azioni richiedono approvazione.",
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use na Maca · Codewhale",
metaTitle:"Computer Use · Wersja poglądowa · Codewhale",
metaDescription:"Pobierz i skonfiguruj Codewhale Computer Use na Maca. Sterowanie aplikacjami w tle, konfiguracja uprawnień oraz przyciski Pause i Stop pod Twoją kontrolą.",
title:"Computer Use",
lead:"Pozwól Codewhale działać w Twoich aplikacjach, a sam pracuj dalej. Pomocnik na Maca zbiera w pasku menu uprawnienia, sterowanie aplikacjami w tle oraz możliwość wstrzymania lub zatrzymania wprowadzania danych.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Polish home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: twórz z własnymi modelami i narzędziami",
metaDescription:
"Twórz aplikacje, automatyzuj pracę i korzystaj z połączonych narzędzi w Codewhale. Otwarty kod, własne API modeli oraz lokalne lub samodzielnie hostowane wnioskowanie.",
metaDescription:"Codewhale to agent programistyczny z otwartym kodem dla terminala. Czytaj, edytuj i testuj projekty z wybranymi modelami zdalnymi lub lokalnymi.",
heroTitle:"Twórz aplikacje i automatyzuj swoją pracę.",
heroIntro:
"{brand} to agent open source, który pisze kod, uruchamia polecenia i pracuje z narzędziami, które podłączysz. Korzystaj z używanych już API modeli lub uruchamiaj modele lokalnie i na własnych serwerach.",
heroIntro:"{brand} to agent programistyczny z otwartym kodem, który czyta pliki, pisze kod i uruchamia polecenia w terminalu. Połącz API modelu lub model lokalny i wybierz działania wymagające zatwierdzenia.",
@@ -7,7 +7,7 @@ import type { ComputerUseDict } from "../types";
* as the app shows them.
*/
exportconstcomputerUse: ComputerUseDict={
metaTitle:"Computer Use para Mac · Codewhale",
metaTitle:"Computer Use · Prévia · Codewhale",
metaDescription:"Baixe e configure o Codewhale Computer Use para Mac. Controle de apps em segundo plano, configuração de permissões e controles humanos de Pause e Stop.",
title:"Computer Use",
lead:"Deixe o Codewhale trabalhar nos seus apps enquanto você continua trabalhando. O assistente para Mac reúne na barra de menus as permissões, o controle de apps em segundo plano e uma forma de pausar ou interromper a entrada.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Brazilian Portuguese home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: construa com seus modelos e ferramentas",
metaDescription:
"Crie aplicativos, automatize fluxos de trabalho e use ferramentas conectadas com Codewhale. Código aberto, com suas APIs de modelos ou inferência local e auto-hospedada.",
metaTitle:"Codewhale: agente de programação de código aberto",
metaDescription:"Codewhale é um agente de programação de código aberto para seu terminal. Leia, edite e teste projetos com seus modelos hospedados ou locais.",
heroTitle:"Crie aplicativos e automatize seu trabalho.",
heroIntro:
"{brand} é um agente de código aberto que escreve código, executa comandos e trabalha com as ferramentas que você conecta. Use as APIs de modelos que você já utiliza ou execute modelos localmente e nos seus próprios servidores.",
heroIntro:"{brand} é um agente de programação de código aberto que lê arquivos, escreve código e executa comandos no terminal. Conecte sua API de modelos ou um modelo local e escolha quais ações precisam de aprovação.",
metaTitle:"Computer Use · Предварительная версия · Codewhale",
metaDescription:"Скачайте и настройте Codewhale Computer Use для Mac: фоновое управление приложениями, настройка разрешений и кнопки Pause и Stop под вашим контролем.",
title:"Computer Use",
lead:"Позвольте Codewhale работать в ваших приложениях, пока вы заняты своими делами. Помощник для Mac собирает в строке меню разрешения, фоновое управление приложениями и возможность приостановить или остановить ввод.",
@@ -3,12 +3,10 @@ import type { HomeDict } from "../types";
/** Russian home copy: useful work with chosen models and connected tools. */
exportconsthome: HomeDict={
metaTitle:"Codewhale: создавайте со своими моделями и инструментами",
metaDescription:
"Создавайте приложения, автоматизируйте работу и используйте подключённые инструменты в Codewhale. Открытый код, ваши API моделей, локальный или собственный инференс.",
metaTitle:"Codewhale: агент для программирования с открытым кодом",
metaDescription:"Codewhale — агент для программирования с открытым кодом в терминале. Читайте, редактируйте и тестируйте проекты с выбранной облачной или локальной моделью.",
heroTitle:"Создавайте приложения и автоматизируйте свою работу.",
heroIntro:
"{brand} — агент с открытым исходным кодом, который пишет код, выполняет команды и работает с подключёнными вами инструментами. Используйте привычные API моделей или запускайте модели локально и на своих серверах.",
heroIntro:"{brand} — агент для программирования с открытым кодом, который читает файлы, пишет код и запускает команды в терминале. Подключите API модели или локальную модель и выберите действия, требующие одобрения.",
Loaded 100 of 137 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.