返回 CodeWhale
features.toml
根目录 / docs / features.toml
1 # Codewhale feature registry: the one hand-edited list of user features.
2 #
3 # A new command, `[features]` flag, provider or user-visible feature lands
4 # with its row here in the same change. `crates/tui/tests/feature_registry.rs`
5 # checks this file against the code and fails on drift:
6 #
7 # cargo test -p codewhale-tui --test feature_registry
8 #
9 # Fields
10 # id stable kebab-case id; never reused
11 # name display name
12 # summary one line, at most 120 characters
13 # status stable | experimental | flagged | planned
14 # stable shipped and on by default, no experimental label
15 # experimental shipped, labelled experimental or preview
16 # flagged shipped but off until the user turns it on
17 # planned not built; no `since` or `flag`
18 # surfaces per-surface status: tui (the terminal binary and its CLI), web
19 # (the local browser client), api (Runtime API `/v1/*`); values
20 # are stable | preview | partial | none | planned. A missing key
21 # means "not recorded yet", not "absent".
22 # since first release that shipped it ("unreleased" before a release).
23 # Optional until backfilled; when set it must be a CHANGELOG
24 # heading.
25 # flag a `[features]` key from `crates/tui/src/features.rs`. Each key
26 # is owned by exactly one row, and the row's status follows the
27 # flag: off by default -> flagged; on and Stable -> stable; on and
28 # Experimental/Beta -> experimental.
29 # docs user doc path (optional `#anchor`); must exist. Missing means
30 # the feature has no user doc yet, which is itself a gap to close.
31 # owner code path that owns the behavior; must exist.
32 #
33 # Desktop (GPUI app) rows and surfaces are not recorded here yet: that
34 # repository is private, so its unreleased features stay out of this public
35 # file until that is decided.
36
37 # --- Flag-backed tools (crates/tui/src/features.rs) ---
38
39 [[feature]]
40 id = "shell-tool"
41 name = "Shell tool"
42 summary = "Runs shell commands for the agent through the approval gate and sandbox."
43 status = "stable"
44 surfaces = { tui = "stable" }
45 since = "0.1.0"
46 flag = "shell_tool"
47 docs = "docs/TOOL_SURFACE.md"
48 owner = "crates/tui/src/tools/shell.rs"
49
50 [[feature]]
51 id = "local-code-execution"
52 name = "Local code execution"
53 summary = "Runs Python and Node with the shared execution policy and explicitly approved per-call elevation."
54 status = "stable"
55 surfaces = { tui = "stable" }
56 docs = "docs/TOOL_SURFACE.md#local-code-execution"
57 owner = "crates/tui/src/core/engine/tool_catalog.rs"
58
59 [[feature]]
60 id = "subagents"
61 name = "Sub-agents"
62 summary = "Delegates bounded work to background child agents with their own budgets."
63 status = "stable"
64 surfaces = { tui = "stable", api = "stable" }
65 since = "0.1.0"
66 flag = "subagents"
67 docs = "docs/SUBAGENTS.md"
68 owner = "crates/tui/src/tools/subagent"
69
70 [[feature]]
71 id = "web-search"
72 name = "Web search"
73 summary = "Searches and fetches the web for the agent (web.run, with the web_search alias)."
74 status = "stable"
75 surfaces = { tui = "stable" }
76 since = "0.1.0"
77 flag = "web_search"
78 docs = "docs/TOOL_SURFACE.md"
79 owner = "crates/tui/src/tools/web_search.rs"
80
81 [[feature]]
82 id = "apply-patch"
83 name = "apply_patch"
84 summary = "Edits files with structured patches the user can review and undo."
85 status = "stable"
86 surfaces = { tui = "stable" }
87 since = "0.1.0"
88 flag = "apply_patch"
89 docs = "docs/TOOL_SURFACE.md"
90 owner = "crates/tui/src/tools/apply_patch.rs"
91
92 [[feature]]
93 id = "mcp-client"
94 name = "MCP client"
95 summary = "Connects local stdio and remote HTTP MCP servers and exposes their tools."
96 status = "stable"
97 surfaces = { tui = "stable", api = "stable" }
98 since = "0.1.0"
99 flag = "mcp"
100 docs = "docs/MCP.md"
101 owner = "crates/mcp"
102
103 [[feature]]
104 id = "exec-policy"
105 name = "Execution policy"
106 summary = "Decides allow, ask or deny for each tool call from layered permission rules."
107 status = "stable"
108 surfaces = { tui = "stable" }
109 since = "0.1.0"
110 flag = "exec_policy"
111 docs = "docs/AUTHORIZATION_ORDER.md"
112 owner = "crates/execpolicy"
113
114 [[feature]]
115 id = "vision-model"
116 name = "Vision model"
117 summary = "Routes image analysis to a separate vision-capable model configured in [vision_model]."
118 status = "flagged"
119 surfaces = { tui = "stable" }
120 since = "0.8.32"
121 flag = "vision_model"
122 docs = "docs/CONFIGURATION.md"
123 owner = "crates/tui/src/vision"
124
125 [[feature]]
126 id = "verify-tool"
127 name = "verify tool"
128 summary = "Lets the agent ask for an adversarial self-critique of its own work."
129 status = "stable"
130 surfaces = { tui = "stable" }
131 since = "0.9.2"
132 flag = "verify_tool"
133 docs = "docs/CONFIGURATION.md#feature-flags"
134 owner = "crates/tui/src/tools/verify.rs"
135
136 [[feature]]
137 id = "code-mode"
138 name = "Code mode"
139 summary = "execute_tools programs compose MCP, plugin and native tool calls under the normal gate."
140 status = "experimental"
141 surfaces = { tui = "stable" }
142 since = "0.10.0"
143 flag = "code_mode"
144 docs = "docs/TOOL_SURFACE.md#code-mode-execute_tools"
145 owner = "crates/tui/src/tools/codemode.rs"
146
147 [[feature]]
148 id = "extension-host"
149 name = "Extension host"
150 summary = "Runs reviewed plugins' native TypeScript/JavaScript tool and slash-command code in a Bun or Node sidecar."
151 status = "flagged"
152 surfaces = { tui = "preview", web = "none", api = "none" }
153 since = "0.10.1"
154 flag = "extension_host"
155 docs = "docs/EXTENSIONS.md"
156 owner = "crates/tui/src/extension_host"
157
158 [[feature]]
159 id = "finance-host"
160 name = "Finance host"
161 summary = "Routes opted-in finance tools through the bundled Native host under the existing permission and sandbox gates."
162 status = "flagged"
163 surfaces = { tui = "preview", api = "preview" }
164 since = "0.10.1"
165 flag = "finance_host"
166 docs = "docs/TOOL_SURFACE.md"
167 owner = "crates/tui/src/tools/finance.rs"
168
169 [[feature]]
170 id = "data-host"
171 name = "Data host"
172 summary = "Routes opted-in data validation through the bundled Native host with owned input and output bounds."
173 status = "flagged"
174 surfaces = { tui = "preview", api = "preview" }
175 since = "0.10.1"
176 flag = "data_host"
177 docs = "docs/TOOL_SURFACE.md"
178 owner = "crates/tui/src/tools/validate_data.rs"
179
180 [[feature]]
181 id = "speech-host"
182 name = "Speech host"
183 summary = "Routes opted-in speech tools through the bundled Native host while Rust retains credentials and permissions."
184 status = "flagged"
185 surfaces = { tui = "preview", api = "preview" }
186 since = "0.10.1"
187 flag = "speech_host"
188 docs = "docs/TOOL_SURFACE.md"
189 owner = "crates/tui/src/tools/speech.rs"
190
191 [[feature]]
192 id = "pdf-host"
193 name = "PDF host"
194 summary = "Routes opted-in PDF extraction through the bundled Native host with the same Rust path and size guards."
195 status = "flagged"
196 surfaces = { tui = "preview", api = "preview" }
197 since = "0.10.1"
198 flag = "pdf_host"
199 docs = "docs/TOOL_SURFACE.md"
200 owner = "crates/tui/src/tools/pdf.rs"
201
202 [[feature]]
203 id = "ocr-host"
204 name = "OCR host"
205 summary = "Routes opted-in image OCR through the bundled Native host under existing media and permission guards."
206 status = "flagged"
207 surfaces = { tui = "preview", api = "preview" }
208 since = "0.10.1"
209 flag = "ocr_host"
210 docs = "docs/TOOL_SURFACE.md"
211 owner = "crates/tui/src/tools/image_ocr.rs"
212
213 [[feature]]
214 id = "github-host"
215 name = "GitHub host"
216 summary = "Routes opted-in GitHub operations through the bundled Native host while Rust retains credentials and approvals."
217 status = "flagged"
218 surfaces = { tui = "preview", api = "preview" }
219 since = "0.10.1"
220 flag = "github_host"
221 docs = "docs/TOOL_SURFACE.md"
222 owner = "crates/tui/src/tools/github"
223
224 [[feature]]
225 id = "web-search-host"
226 name = "Web search host"
227 summary = "Routes opted-in web search through the bundled Native host with the existing Rust credential and network gates."
228 status = "flagged"
229 surfaces = { tui = "preview", api = "preview" }
230 since = "0.10.1"
231 flag = "web_search_host"
232 docs = "docs/TOOL_SURFACE.md"
233 owner = "crates/tui/src/tools/web/adapter.rs"
234
235 [[feature]]
236 id = "web-extract-host"
237 name = "Web extract host"
238 summary = "Routes opted-in web extraction through the bundled Native host with owned URL and response bounds."
239 status = "flagged"
240 surfaces = { tui = "preview", api = "preview" }
241 since = "0.10.1"
242 flag = "web_extract_host"
243 docs = "docs/TOOL_SURFACE.md"
244 owner = "crates/tui/src/tools/web/extract.rs"
245
246 [[feature]]
247 id = "review-host"
248 name = "Review host"
249 summary = "Routes opted-in review tools through the bundled Native host while Rust retains route and permission authority."
250 status = "flagged"
251 surfaces = { tui = "preview", api = "preview" }
252 since = "0.10.1"
253 flag = "review_host"
254 docs = "docs/TOOL_SURFACE.md"
255 owner = "crates/tui/src/tools/review_host.rs"
256
257 # --- Working with the agent ---
258
259 [[feature]]
260 id = "modes"
261 name = "Modes"
262 summary = "Plan, Work and Operate modes set what the agent may do in a session."
263 status = "stable"
264 surfaces = { tui = "stable", api = "stable" }
265 docs = "docs/MODES.md"
266 owner = "crates/config/src/app_mode.rs"
267
268 [[feature]]
269 id = "permission-postures"
270 name = "Permission postures"
271 summary = "Ask, Auto-Review and Full Access postures decide when a tool call needs approval."
272 status = "stable"
273 surfaces = { tui = "stable", api = "stable" }
274 docs = "docs/MODES.md#permission-posture"
275 owner = "crates/execpolicy/src/approval_mode.rs"
276
277 [[feature]]
278 id = "sandbox"
279 name = "Command sandbox"
280 summary = "Wraps commands in Seatbelt on macOS; bubblewrap on Linux is opt-in."
281 status = "stable"
282 surfaces = { tui = "stable" }
283 docs = "docs/SANDBOX.md"
284 owner = "crates/tui/src/sandbox"
285
286 [[feature]]
287 id = "providers"
288 name = "Providers"
289 summary = "First-class provider routes plus bundled OpenAI-compatible host descriptors."
290 status = "stable"
291 surfaces = { tui = "stable", api = "stable" }
292 docs = "docs/PROVIDERS.md"
293 owner = "crates/config/assets/provider_descriptors.json"
294
295 [[feature]]
296 id = "model-routing"
297 name = "Auto model routing"
298 summary = "Picks a model per turn under Auto; /router sets up the router."
299 status = "stable"
300 surfaces = { tui = "stable" }
301 docs = "docs/CONFIGURATION.md#auto-model-routing-auto-autorouter"
302 owner = "crates/tui/src/model_routing.rs"
303
304 [[feature]]
305 id = "fleet"
306 name = "Fleet"
307 summary = "Runs and supervises groups of worker agents with receipts and a pre-spend check."
308 status = "stable"
309 surfaces = { tui = "stable", api = "stable" }
310 docs = "docs/FLEET.md"
311 owner = "crates/tui/src/fleet"
312
313 [[feature]]
314 id = "workflows"
315 name = "Workflows"
316 summary = "Checked-in .workflow.js scripts coordinate agents step by step."
317 status = "stable"
318 surfaces = { tui = "stable" }
319 docs = "docs/WORKFLOW_AUTHORING.md"
320 owner = "crates/workflow"
321
322 [[feature]]
323 id = "automatic-workflows"
324 name = "Automatic workflows"
325 summary = "Turns a broad request into a compact Workflow plan without writing a script."
326 status = "stable"
327 surfaces = { tui = "stable" }
328 docs = "docs/AUTOMATIC_WORKFLOWS.md"
329 owner = "crates/tui/src/tools/workflow"
330
331 [[feature]]
332 id = "goals"
333 name = "Goals"
334 summary = "/goal keeps the agent working toward one objective across turns."
335 status = "stable"
336 surfaces = { tui = "stable", api = "stable" }
337 docs = "docs/CONFIGURATION.md#goal-loop-goal"
338 owner = "crates/tui/src/tools/goal.rs"
339
340 [[feature]]
341 id = "todos"
342 name = "Todo list"
343 summary = "The agent keeps a visible todo list for multi-step work."
344 status = "stable"
345 surfaces = { tui = "stable", api = "stable" }
346 docs = "docs/TOOL_SURFACE.md"
347 owner = "crates/tui/src/tools/todo.rs"
348
349 [[feature]]
350 id = "composer-queue-steer"
351 name = "Queue and steer"
352 summary = "Queue messages while a turn runs, or steer the running turn."
353 status = "stable"
354 surfaces = { tui = "stable", api = "stable" }
355 docs = "docs/KEYBINDINGS.md"
356 owner = "crates/tui/src/commands/groups/core/queue.rs"
357
358 [[feature]]
359 id = "receipts"
360 name = "Receipts"
361 summary = "/receipts lists what a session did: files, commands, calls, approvals and failures."
362 status = "stable"
363 surfaces = { tui = "stable", api = "stable" }
364 since = "0.10.1"
365 docs = "docs/RECEIPTS.md"
366 owner = "crates/tui/src/receipts.rs"
367
368 [[feature]]
369 id = "preview-request"
370 name = "Request preview"
371 summary = "/preview-request shows the redacted outbound request without sending it."
372 status = "stable"
373 surfaces = { tui = "stable" }
374 docs = "docs/PREVIEW_REQUEST.md"
375 owner = "crates/tui/src/request_manifest.rs"
376
377 [[feature]]
378 id = "read-media"
379 name = "read_media"
380 summary = "Reads and preprocesses images for vision-capable models with size and privacy guards."
381 status = "stable"
382 surfaces = { tui = "stable" }
383 docs = "docs/READ_MEDIA.md"
384 owner = "crates/tui/src/tools/read_media.rs"
385
386 [[feature]]
387 id = "memory"
388 name = "User memory"
389 summary = "Opt-in local store of preferences and conventions that persists across sessions."
390 status = "flagged"
391 surfaces = { tui = "stable", api = "stable" }
392 docs = "docs/MEMORY.md"
393 owner = "crates/memory"
394
395 [[feature]]
396 id = "cloud-dispatch"
397 name = "Cloud dispatch"
398 summary = "/dispatch sends a cloud agent to raise a branch and open a PR, after confirmation."
399 status = "stable"
400 surfaces = { tui = "stable" }
401 docs = "docs/DAYTONA_CLOUD_DISPATCH.md"
402 owner = "crates/tui/src/cloud_dispatch.rs"
403
404 # --- Extending Codewhale ---
405
406 [[feature]]
407 id = "skills"
408 name = "Skills"
409 summary = "Installs and loads trusted instruction packages with owned-root precedence and separate user/model invocation controls."
410 status = "stable"
411 surfaces = { tui = "stable", api = "stable" }
412 docs = "docs/SKILLS.md"
413 owner = "crates/tui/src/skills"
414
415 [[feature]]
416 id = "plugins"
417 name = "Plugins"
418 summary = "Installs, reviews and trusts plugin bundles, including the first-party marketplace."
419 status = "stable"
420 surfaces = { tui = "stable", api = "stable" }
421 docs = "docs/PLUGINS.md"
422 owner = "crates/tui/src/plugins"
423
424 [[feature]]
425 id = "script-tools"
426 name = "Script tools"
427 summary = "Scripts in ~/.codewhale/tools become approval-gated tools; [tools.overrides] disables built-ins, never replaces them."
428 status = "stable"
429 surfaces = { tui = "stable" }
430 docs = "docs/CONFIGURATION.md#script-tools-and-overrides"
431 owner = "crates/tui/src/tools/plugin.rs"
432
433 [[feature]]
434 id = "claude-plugin-compat"
435 name = "Claude plugin compatibility"
436 summary = "Loads Claude Code plugin bundles and skill folders where their features are supported."
437 status = "stable"
438 surfaces = { tui = "stable" }
439 docs = "docs/CLAUDE_PLUGIN_COMPAT.md"
440 owner = "crates/tui/src/plugins/agent_plugin.rs"
441
442 [[feature]]
443 id = "claude-settings-import"
444 name = "Claude settings import"
445 summary = "/import-claude plans a reviewable import of Claude Code settings and servers."
446 status = "stable"
447 surfaces = { tui = "stable" }
448 owner = "crates/tui/src/import_claude.rs"
449
450 [[feature]]
451 id = "hooks"
452 name = "Hooks"
453 summary = "Runs user commands on session and tool events, with an execution receipt after shell tools."
454 status = "stable"
455 surfaces = { tui = "stable", api = "stable" }
456 docs = "docs/HOOKS.md"
457 owner = "crates/hooks"
458
459 [[feature]]
460 id = "lsp"
461 name = "LSP diagnostics"
462 summary = "Feeds language-server diagnostics to the agent; custom servers can be added."
463 status = "stable"
464 surfaces = { tui = "stable", api = "stable" }
465 docs = "docs/LSP_PHP_CUSTOM.md"
466 owner = "crates/tui/src/lsp"
467
468 [[feature]]
469 id = "runtime-api"
470 name = "Runtime API"
471 summary = "Local HTTP API for threads, events, approvals and the rest of the session."
472 status = "stable"
473 surfaces = { api = "stable" }
474 docs = "docs/RUNTIME_API.md"
475 owner = "crates/tui/src/runtime_api.rs"
476
477 [[feature]]
478 id = "headless-exec"
479 name = "Headless exec"
480 summary = "codewhale exec runs one headless turn from a script and streams JSON."
481 status = "stable"
482 surfaces = { tui = "stable" }
483 docs = "docs/RUNTIME_API.md"
484 owner = "crates/tui/src/exec_agent.rs"
485
486 [[feature]]
487 id = "github-review"
488 name = "GitHub PR review"
489 summary = "codewhale review --pr N writes an advisory review; posting to GitHub is opt-in."
490 status = "stable"
491 surfaces = { tui = "stable" }
492 docs = "docs/GITHUB_APP.md"
493 owner = "crates/tui/src/tools/github"
494
495 # --- Interface ---
496
497 [[feature]]
498 id = "web-client"
499 name = "Local browser client"
500 summary = "codewhale web opens the embedded browser client on 127.0.0.1 over the Runtime API."
501 status = "stable"
502 surfaces = { web = "stable" }
503 docs = "docs/WEB.md"
504 owner = "crates/tui/src/runtime_web"
505
506 [[feature]]
507 id = "keybindings"
508 name = "Keybindings"
509 summary = "Terminal key bindings, documented from the keybinding catalog."
510 status = "stable"
511 surfaces = { tui = "stable" }
512 docs = "docs/KEYBINDINGS.md"
513 owner = "crates/tui/src/tui/keybindings.rs"
514
515 [[feature]]
516 id = "settings"
517 name = "Settings"
518 summary = "/config and codewhale config edit settings declared once in the settings schema."
519 status = "stable"
520 surfaces = { tui = "stable", api = "stable" }
521 docs = "docs/CONFIGURATION.md"
522 owner = "crates/config/src/settings_schema.rs"
523
524 [[feature]]
525 id = "themes"
526 name = "Themes"
527 summary = "/theme picks a built-in theme; user themes follow a JSON schema."
528 status = "stable"
529 surfaces = { tui = "stable" }
530 docs = "docs/schemas/user-theme.schema.json"
531 owner = "crates/palette"
532
533 [[feature]]
534 id = "localization"
535 name = "Localization"
536 summary = "Interface text in 15 locales."
537 status = "stable"
538 surfaces = { tui = "stable" }
539 docs = "docs/LOCALIZATION.md"
540 owner = "crates/localization"
541
542 [[feature]]
543 id = "voice"
544 name = "Voice input"
545 summary = "/voice, /voicecontrol and /voicesend use the selected ASR backend without switching providers."
546 status = "stable"
547 surfaces = { tui = "stable", api = "stable" }
548 owner = "crates/tui/src/voice.rs"
549
550 [[feature]]
551 id = "pet"
552 name = "Pet"
553 summary = "/pet turns the screen over to the Codewhale pet while it works."
554 status = "stable"
555 surfaces = { tui = "stable" }
556 owner = "crates/tui/src/tui/pet_watch"
557
558 [[feature]]
559 id = "overview"
560 name = "Home dashboard"
561 summary = "/overview shows the home dashboard."
562 status = "stable"
563 surfaces = { tui = "stable" }
564 docs = "docs/PROVIDERS.md"
565 owner = "crates/tui/src/commands/groups/core/home.rs"
566
567 [[feature]]
568 id = "account-login"
569 name = "Account login"
570 summary = "/login signs in to Codewhale or stores provider keys."
571 status = "stable"
572 surfaces = { tui = "stable" }
573 owner = "crates/tui/src/commands/groups/config/config.rs"
574
575 [[feature]]
576 id = "context-anchors"
577 name = "Context anchors"
578 summary = "/anchor pins a fact that survives compaction."
579 status = "stable"
580 surfaces = { tui = "stable" }
581 owner = "crates/tui/src/commands/groups/core/anchor.rs"
582
583 [[feature]]
584 id = "window-pin"
585 name = "Pin window"
586 summary = "/pin keeps the terminal window on top."
587 status = "stable"
588 surfaces = { tui = "stable" }
589 owner = "crates/tui/src/commands/groups/core/pin.rs"
590
591 [[feature]]
592 id = "structured-copy"
593 name = "Structured copy"
594 summary = "/structcopy copies one session object as redacted JSON."
595 status = "stable"
596 surfaces = { tui = "stable" }
597 owner = "crates/tui/src/commands/groups/session/structcopy.rs"
598
599 [[feature]]
600 id = "live-thinking"
601 name = "Live thinking"
602 summary = "/verbose toggles live model thinking in the transcript."
603 status = "stable"
604 surfaces = { tui = "stable" }
605 owner = "crates/tui/src/commands/groups/config/mod.rs"
606
607 [[feature]]
608 id = "workbar"
609 name = "Workbar"
610 summary = "/workbar places the tasks, agents and context bar on any edge or hides it."
611 status = "stable"
612 surfaces = { tui = "stable" }
613 owner = "crates/tui/src/tui/sidebar.rs"
614
615 # --- Operations and platforms ---
616
617 [[feature]]
618 id = "telemetry"
619 name = "Telemetry"
620 summary = "Anonymous aggregate usage counts, disclosed at first launch, with a saved off switch."
621 status = "stable"
622 surfaces = { tui = "stable" }
623 docs = "docs/TELEMETRY.md"
624 owner = "crates/telemetry"
625
626 [[feature]]
627 id = "docker"
628 name = "Docker image"
629 summary = "Runs Codewhale in a container, with an opt-in toolbox image."
630 status = "stable"
631 surfaces = { tui = "stable" }
632 docs = "docs/DOCKER.md"
633 owner = "Dockerfile"
634
635 [[feature]]
636 id = "termux"
637 name = "Android (Termux)"
638 summary = "arm64 release archive for Termux on Android."
639 status = "experimental"
640 surfaces = { tui = "preview" }
641 docs = "docs/TERMUX.md"
642 owner = ".github/workflows/release-artifacts.yml"
643
644 [[feature]]
645 id = "chatgpt-plan-sign-in"
646 name = "Sign in with ChatGPT"
647 summary = "Uses official OAuth and the selected account catalog for eligible ChatGPT plan requests in the local OSS app."
648 status = "experimental"
649 surfaces = { tui = "preview", api = "partial", web = "none" }
650 since = "unreleased"
651 docs = "docs/PROVIDERS.md#sign-in-with-chatgpt"
652 owner = "crates/tui/src/oauth.rs"
653
654 # Community marketing website, separate from the Runtime's local web client.
655 [[feature]]
656 id = "merch-interest"
657 name = "Merch interest list"
658 summary = "The community website collects private merch opt-ins, material preferences and optional item-price feedback."
659 status = "experimental"
660 surfaces = { tui = "none", web = "none", api = "none" }
661 since = "unreleased"
662 docs = "web/lib/merch/README.md"
663 owner = "web/components/merch-interest.tsx"
664
664 lines TOML