one-code-extension 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/README.md +16 -5
  2. package/agents/general-purpose.md +2 -2
  3. package/docs/guide/README.md +2 -1
  4. package/docs/guide/bring-your-claude-code-setup.md +60 -9
  5. package/docs/guide/configuration.md +48 -14
  6. package/docs/guide/differences-from-claude-code.md +40 -28
  7. package/docs/guide/doctor.md +20 -13
  8. package/docs/guide/hooks.md +18 -3
  9. package/docs/guide/installation.md +26 -4
  10. package/docs/guide/permissions-modes-and-auto-mode.md +225 -49
  11. package/docs/guide/providers-and-models.md +137 -54
  12. package/docs/guide/reference.md +27 -15
  13. package/docs/guide/sessions-and-context.md +69 -16
  14. package/docs/guide/skills-plugins-and-mcp.md +57 -20
  15. package/docs/guide/subagents-and-workflows.md +95 -29
  16. package/docs/guide/tasks-and-background-work.md +101 -26
  17. package/docs/guide/terminal-interface.md +24 -12
  18. package/docs/guide/tools.md +46 -5
  19. package/docs/guide/troubleshooting.md +13 -9
  20. package/docs/guide/windows.md +58 -31
  21. package/extensions/artifacts/gallery.ts +227 -0
  22. package/extensions/artifacts/index.ts +288 -0
  23. package/extensions/artifacts/store.ts +570 -0
  24. package/extensions/artifacts/viewer.ts +199 -0
  25. package/extensions/ask-user/description.ts +67 -0
  26. package/extensions/ask-user/dialogs.ts +80 -0
  27. package/extensions/ask-user/index.ts +37 -33
  28. package/extensions/ask-user/questions.ts +32 -7
  29. package/extensions/ask-user/widget.ts +45 -25
  30. package/extensions/auto-mode/actions.ts +6 -0
  31. package/extensions/auto-mode/cache.ts +88 -0
  32. package/extensions/auto-mode/classifier-prompt.ts +5 -4
  33. package/extensions/auto-mode/classifier.ts +290 -65
  34. package/extensions/auto-mode/config.ts +72 -20
  35. package/extensions/auto-mode/decision-log.ts +2 -0
  36. package/extensions/auto-mode/defaults.ts +1 -1
  37. package/extensions/auto-mode/denials.ts +124 -0
  38. package/extensions/auto-mode/git-checkout-programs.ts +187 -0
  39. package/extensions/auto-mode/git-status-meta.ts +159 -0
  40. package/extensions/auto-mode/history.ts +189 -0
  41. package/extensions/auto-mode/instructions.ts +58 -52
  42. package/extensions/auto-mode/model-select.ts +159 -134
  43. package/extensions/auto-mode/paths.ts +57 -5
  44. package/extensions/auto-mode/pause.ts +57 -2
  45. package/extensions/auto-mode/prompt.ts +37 -21
  46. package/extensions/auto-mode/read-only-options.ts +724 -0
  47. package/extensions/auto-mode/resolved-paths-meta.ts +133 -0
  48. package/extensions/auto-mode/rules.ts +18 -1
  49. package/extensions/auto-mode/safety-floor.ts +361 -18
  50. package/extensions/auto-mode/setup-run.ts +20 -14
  51. package/extensions/auto-mode/shell-analysis.ts +764 -490
  52. package/extensions/auto-mode/shell-parse.ts +885 -0
  53. package/extensions/auto-mode/system-note.ts +33 -0
  54. package/extensions/auto-mode/transcript.ts +80 -51
  55. package/extensions/background/cron.ts +642 -0
  56. package/extensions/background/index.ts +614 -248
  57. package/extensions/background/loop-fire.ts +173 -0
  58. package/extensions/background/loop-preamble.ts +59 -0
  59. package/extensions/background/loop-skill.ts +163 -0
  60. package/extensions/background/monitor-batch.ts +53 -0
  61. package/extensions/background/noop-fold.ts +128 -0
  62. package/extensions/background/switch-guard.ts +56 -0
  63. package/extensions/background/wakeup.ts +178 -55
  64. package/extensions/bash/background.ts +53 -17
  65. package/extensions/bash/child.ts +7 -0
  66. package/extensions/bash/description.ts +188 -0
  67. package/extensions/bash/guards.ts +15 -67
  68. package/extensions/bash/index.ts +66 -35
  69. package/extensions/branding/compaction-keep.ts +63 -0
  70. package/extensions/branding/declined.ts +22 -0
  71. package/extensions/branding/index.ts +133 -9
  72. package/extensions/branding/prompt-editor.ts +53 -6
  73. package/extensions/branding/queued-edit.ts +31 -0
  74. package/extensions/branding/replaced-builtins.ts +68 -0
  75. package/extensions/branding/startup.ts +33 -71
  76. package/extensions/btw/index.ts +250 -78
  77. package/extensions/btw/panel.ts +228 -100
  78. package/extensions/btw/prompt.ts +41 -4
  79. package/extensions/cache-marks/index.ts +42 -0
  80. package/extensions/claude-compat/index.ts +7 -11
  81. package/extensions/claude-context/index.ts +436 -63
  82. package/extensions/compaction/cut.ts +157 -0
  83. package/extensions/compaction/index.ts +219 -75
  84. package/extensions/compaction/kept-thinking.ts +62 -0
  85. package/extensions/compaction/prompt.ts +15 -12
  86. package/extensions/context-budget/budget.ts +16 -2
  87. package/extensions/context-budget/index.ts +35 -15
  88. package/extensions/context-management/index.ts +36 -28
  89. package/extensions/doctor/build.ts +59 -8
  90. package/extensions/doctor/builtins.ts +84 -0
  91. package/extensions/doctor/cli.ts +7 -1
  92. package/extensions/doctor/compat.ts +88 -23
  93. package/extensions/doctor/dependencies.ts +41 -5
  94. package/extensions/doctor/fix-prompt.ts +9 -2
  95. package/extensions/doctor/index.ts +102 -58
  96. package/extensions/doctor/models.ts +102 -63
  97. package/extensions/doctor/presets.ts +42 -27
  98. package/extensions/doctor/report.ts +19 -2
  99. package/extensions/doctor/viewer.ts +49 -27
  100. package/extensions/effort/index.ts +141 -25
  101. package/extensions/effort/settings.ts +21 -0
  102. package/extensions/effort/slider.ts +24 -20
  103. package/extensions/exit/index.ts +32 -1
  104. package/extensions/file-tracker/index.ts +420 -42
  105. package/extensions/file-tracker/replay.ts +137 -24
  106. package/extensions/file-tracker/restore.ts +66 -0
  107. package/extensions/file-tracker/results.ts +66 -0
  108. package/extensions/file-tracker/shell-reads.ts +211 -0
  109. package/extensions/file-tracker/tracker.ts +45 -15
  110. package/extensions/footer/footer-line.ts +45 -24
  111. package/extensions/footer/index.ts +47 -2
  112. package/extensions/footer/pr.ts +34 -5
  113. package/extensions/hooks/compaction.ts +7 -0
  114. package/extensions/hooks/executor.ts +32 -30
  115. package/extensions/hooks/index.ts +209 -58
  116. package/extensions/hooks/matcher.ts +3 -0
  117. package/extensions/hooks/prompt-context.ts +59 -0
  118. package/extensions/hooks/protocol.ts +41 -3
  119. package/extensions/hooks/settings.ts +50 -19
  120. package/extensions/hooks/subagent-bridge.ts +2 -0
  121. package/extensions/hooks/trust.ts +26 -12
  122. package/extensions/idle-compact/index.ts +119 -0
  123. package/extensions/idle-compact/policy.ts +143 -0
  124. package/extensions/init/index.ts +11 -10
  125. package/extensions/init/prompt.ts +25 -32
  126. package/extensions/interrupted/index.ts +13 -1
  127. package/extensions/kept-thinking/index.ts +27 -0
  128. package/extensions/ledger/index.ts +46 -0
  129. package/extensions/ledger/wire.ts +154 -0
  130. package/extensions/lib/agent-cron.ts +146 -0
  131. package/extensions/lib/agent-loader.ts +18 -3
  132. package/extensions/lib/agent-view.ts +85 -0
  133. package/extensions/lib/anthropic-auth.ts +98 -0
  134. package/extensions/lib/anthropic-payload.ts +82 -1
  135. package/extensions/lib/anthropic-server-call.ts +230 -0
  136. package/extensions/lib/anthropic-server-tools.ts +485 -0
  137. package/extensions/lib/app-launch.mjs +94 -0
  138. package/extensions/lib/argument-hints.ts +190 -0
  139. package/extensions/lib/atomic-write.ts +6 -2
  140. package/extensions/lib/auto-memory.ts +75 -0
  141. package/extensions/lib/bash-parser.ts +84 -0
  142. package/extensions/lib/btw-fork.ts +93 -0
  143. package/extensions/lib/child-extensions.ts +52 -0
  144. package/extensions/lib/child-writes.ts +45 -0
  145. package/extensions/lib/claude-context.ts +515 -100
  146. package/extensions/lib/claude-external-includes.ts +68 -0
  147. package/extensions/lib/claude-id.ts +22 -0
  148. package/extensions/lib/claude-rules.ts +323 -0
  149. package/extensions/lib/claude-settings.ts +76 -4
  150. package/extensions/lib/compaction-boundary.ts +36 -0
  151. package/extensions/lib/compaction-keep.mjs +83 -0
  152. package/extensions/lib/config-mode.ts +112 -0
  153. package/extensions/lib/consent-dialogs.ts +63 -0
  154. package/extensions/lib/consent-preview.ts +5 -1
  155. package/extensions/lib/consent-stores.ts +48 -0
  156. package/extensions/lib/context-facts.ts +97 -0
  157. package/extensions/lib/covered-messages.ts +23 -0
  158. package/extensions/lib/deferred.ts +359 -25
  159. package/extensions/lib/dock-rows.ts +60 -0
  160. package/extensions/lib/empty-tool-result.ts +27 -0
  161. package/extensions/lib/environment-block.ts +76 -0
  162. package/extensions/lib/fetch-timeout.ts +24 -6
  163. package/extensions/{system-prompt → lib}/git-status.ts +51 -13
  164. package/extensions/lib/git.ts +75 -13
  165. package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
  166. package/extensions/lib/grammars/README.md +2 -0
  167. package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
  168. package/extensions/lib/guide-docs.ts +45 -0
  169. package/extensions/lib/headless-output.ts +46 -0
  170. package/extensions/lib/hook-gate.ts +7 -7
  171. package/extensions/lib/interrupt.ts +20 -4
  172. package/extensions/lib/key-input.ts +455 -0
  173. package/extensions/lib/keys.ts +14 -1
  174. package/extensions/lib/ledger/fold-memo.ts +49 -0
  175. package/extensions/lib/ledger/fold.ts +265 -0
  176. package/extensions/lib/ledger/layout.ts +72 -0
  177. package/extensions/lib/ledger/plan.ts +102 -0
  178. package/extensions/lib/ledger/records.ts +276 -0
  179. package/extensions/lib/ledger/state.ts +47 -0
  180. package/extensions/lib/ledger/validate.ts +141 -0
  181. package/extensions/lib/ledger/wire.ts +632 -0
  182. package/extensions/lib/local-command.ts +71 -19
  183. package/extensions/lib/mcp-overrides.ts +1 -1
  184. package/extensions/lib/mcp-share.ts +46 -0
  185. package/extensions/lib/memory-content.ts +146 -0
  186. package/extensions/lib/memory-index.ts +18 -0
  187. package/extensions/lib/memory.ts +134 -123
  188. package/extensions/lib/model-catalog/huggingface.json +178 -0
  189. package/extensions/lib/model-catalog/models-dev.json +18533 -0
  190. package/extensions/lib/model-catalog/openrouter.json +5050 -0
  191. package/extensions/lib/model-catalog-data.ts +513 -0
  192. package/extensions/lib/model-catalog.ts +462 -0
  193. package/extensions/lib/model-choice-warnings.ts +137 -0
  194. package/extensions/lib/model-pairings.ts +152 -0
  195. package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
  196. package/extensions/lib/model-policy.ts +112 -15
  197. package/extensions/lib/model-tier.ts +283 -355
  198. package/extensions/lib/model-unusable.ts +1 -1
  199. package/extensions/lib/newer-model.ts +100 -0
  200. package/extensions/lib/notices.ts +87 -0
  201. package/extensions/lib/notifications.ts +357 -73
  202. package/extensions/lib/one-code-settings.ts +74 -8
  203. package/extensions/lib/open-browser.ts +63 -0
  204. package/extensions/lib/openrouter-generation.ts +94 -0
  205. package/extensions/lib/operation-deadline.ts +30 -0
  206. package/extensions/lib/original-command.ts +4 -4
  207. package/extensions/lib/package-version.ts +1 -1
  208. package/extensions/lib/panel-focus.ts +134 -0
  209. package/extensions/lib/paths.ts +17 -2
  210. package/extensions/lib/permission-gate.ts +72 -6
  211. package/extensions/lib/persisted-output.ts +60 -8
  212. package/extensions/lib/pi-ai-estimate.ts +19 -3
  213. package/extensions/lib/pi-version.ts +38 -2
  214. package/extensions/lib/plan-mode-channels.ts +42 -5
  215. package/extensions/lib/plugins.ts +26 -17
  216. package/extensions/lib/powershell-parse-script.ts +208 -0
  217. package/extensions/lib/powershell-parser.ts +344 -0
  218. package/extensions/lib/previous-mark.ts +101 -0
  219. package/extensions/lib/process-state.ts +48 -0
  220. package/extensions/lib/process-tree.ts +132 -8
  221. package/extensions/lib/prompt-options.ts +82 -0
  222. package/extensions/lib/queued-delivery.ts +44 -0
  223. package/extensions/lib/reminders.ts +370 -358
  224. package/extensions/lib/replaced-builtins.mjs +199 -0
  225. package/extensions/lib/replay-call.ts +70 -0
  226. package/extensions/lib/request-replay.ts +547 -0
  227. package/extensions/lib/scratchpad.ts +81 -14
  228. package/extensions/lib/send-now-channel.ts +7 -0
  229. package/extensions/lib/session-model-tier.ts +51 -0
  230. package/extensions/lib/session-work.ts +64 -0
  231. package/extensions/lib/settings-channels.ts +4 -4
  232. package/extensions/lib/shell-exit-semantics.ts +170 -0
  233. package/extensions/lib/shell-quote.ts +11 -0
  234. package/extensions/lib/shell-result.ts +70 -0
  235. package/extensions/lib/shell-spawn.ts +70 -6
  236. package/extensions/lib/shell-tool.ts +75 -25
  237. package/extensions/lib/side-call-cache.ts +124 -0
  238. package/extensions/lib/side-call-run.ts +96 -0
  239. package/extensions/lib/side-call-usage.ts +38 -0
  240. package/extensions/lib/side-call.ts +24 -1
  241. package/extensions/lib/single-flight.ts +18 -0
  242. package/extensions/lib/skill-body.ts +42 -0
  243. package/extensions/lib/skill-scan.ts +63 -24
  244. package/extensions/lib/spill-file.ts +140 -0
  245. package/extensions/lib/subagent-handback.ts +112 -0
  246. package/extensions/lib/system-role.ts +156 -0
  247. package/extensions/lib/terminal-text.ts +114 -0
  248. package/extensions/lib/text-width.ts +47 -16
  249. package/extensions/lib/timer-ops.ts +20 -0
  250. package/extensions/lib/tool-additions.ts +129 -0
  251. package/extensions/lib/tool-call-corruption.ts +134 -0
  252. package/extensions/lib/tool-path.ts +66 -0
  253. package/extensions/lib/tool-variants.ts +69 -0
  254. package/extensions/lib/tui-render.ts +255 -27
  255. package/extensions/lib/turn-budget-layout.ts +159 -0
  256. package/extensions/lib/update-check.mjs +15 -2
  257. package/extensions/lib/usage-bus.ts +1 -1
  258. package/extensions/lib/user-denial.ts +38 -0
  259. package/extensions/lib/workspace-channel.ts +16 -0
  260. package/extensions/lib/worktree-channel.ts +31 -3
  261. package/extensions/lib/worktree-isolation.ts +40 -10
  262. package/extensions/lsp/client.ts +8 -9
  263. package/extensions/lsp/index.ts +76 -12
  264. package/extensions/lsp/keep-alive.ts +1 -1
  265. package/extensions/lsp/trust.ts +119 -0
  266. package/extensions/lsp/watcher.ts +1 -1
  267. package/extensions/mcp/announce.ts +90 -43
  268. package/extensions/mcp/client.ts +161 -48
  269. package/extensions/mcp/config.ts +132 -8
  270. package/extensions/mcp/discovery.ts +19 -0
  271. package/extensions/mcp/index.ts +220 -121
  272. package/extensions/mcp/oauth/browser.ts +38 -17
  273. package/extensions/mcp/oauth/flow.ts +25 -17
  274. package/extensions/mcp/oauth/provider.ts +14 -8
  275. package/extensions/mcp/oauth/store.ts +34 -16
  276. package/extensions/mcp/panel/keys.ts +12 -11
  277. package/extensions/mcp/panel/render.ts +9 -6
  278. package/extensions/mcp/schema.ts +104 -5
  279. package/extensions/mcp/trust.ts +164 -73
  280. package/extensions/memory/entries.ts +23 -14
  281. package/extensions/memory/index.ts +134 -28
  282. package/extensions/memory/open-external.ts +33 -18
  283. package/extensions/memory/panel.ts +135 -26
  284. package/extensions/model-default/index.ts +86 -19
  285. package/extensions/newer-model/index.ts +31 -0
  286. package/extensions/notebook/description.ts +18 -0
  287. package/extensions/notebook/index.ts +6 -5
  288. package/extensions/notebook/notebook.ts +1 -1
  289. package/extensions/permissions/index.ts +1426 -398
  290. package/extensions/permissions/matcher.ts +425 -74
  291. package/extensions/permissions/modes.ts +11 -4
  292. package/extensions/permissions/panel/host.ts +130 -0
  293. package/extensions/permissions/panel/keys.ts +48 -0
  294. package/extensions/permissions/panel/render.ts +450 -0
  295. package/extensions/permissions/panel/state.ts +550 -0
  296. package/extensions/permissions/powershell-cmdlets.ts +198 -0
  297. package/extensions/permissions/powershell-paths.ts +197 -0
  298. package/extensions/permissions/powershell-rules.ts +207 -280
  299. package/extensions/permissions/powershell-tree.ts +557 -0
  300. package/extensions/permissions/project-trust.ts +27 -11
  301. package/extensions/permissions/protected-paths.ts +14 -2
  302. package/extensions/permissions/session-grant.ts +6 -0
  303. package/extensions/permissions/settings.ts +166 -31
  304. package/extensions/permissions/subagent-gate.ts +25 -0
  305. package/extensions/permissions/workspace.ts +78 -0
  306. package/extensions/plan-mode/index.ts +276 -92
  307. package/extensions/plan-mode/reminder.ts +89 -21
  308. package/extensions/plan-mode/run-state.ts +26 -0
  309. package/extensions/plan-mode/texts.ts +177 -0
  310. package/extensions/plan-mode/viewer.ts +92 -27
  311. package/extensions/plugins/counts.ts +3 -3
  312. package/extensions/plugins/index.ts +64 -46
  313. package/extensions/plugins/install/install.ts +16 -0
  314. package/extensions/plugins/marketplace/sync.ts +9 -3
  315. package/extensions/plugins/marketplace/types.ts +3 -1
  316. package/extensions/plugins/panel/keys.ts +21 -24
  317. package/extensions/plugins/panel/render.ts +12 -6
  318. package/extensions/plugins/shell-expand.ts +107 -0
  319. package/extensions/plugins/template.ts +32 -15
  320. package/extensions/powershell/child.ts +7 -0
  321. package/extensions/powershell/description.ts +38 -6
  322. package/extensions/powershell/guards.ts +1 -1
  323. package/extensions/powershell/index.ts +14 -7
  324. package/extensions/recap/index.ts +73 -71
  325. package/extensions/recap/prompt.ts +2 -2
  326. package/extensions/recap/scheduler.ts +3 -5
  327. package/extensions/search-tools/grep-merge.ts +39 -0
  328. package/extensions/search-tools/index.ts +0 -0
  329. package/extensions/send-now/chord.ts +62 -0
  330. package/extensions/send-now/index.ts +133 -0
  331. package/extensions/session-title/index.ts +3 -0
  332. package/extensions/session-title/title.ts +4 -1
  333. package/extensions/skill/announce.ts +30 -0
  334. package/extensions/skill/code-review.ts +97 -0
  335. package/extensions/skill/index.ts +469 -132
  336. package/extensions/skill/invoke.ts +118 -75
  337. package/extensions/skill/listing.ts +133 -9
  338. package/extensions/skill/panel/keys.ts +15 -16
  339. package/extensions/skill/panel/render.ts +5 -2
  340. package/extensions/skill/panel/state.ts +12 -1
  341. package/extensions/subagents/agent-args.ts +39 -0
  342. package/extensions/subagents/agent-description.ts +132 -0
  343. package/extensions/subagents/agents.ts +146 -31
  344. package/extensions/subagents/default-model.ts +2 -3
  345. package/extensions/subagents/delegation-steer.ts +4 -4
  346. package/extensions/subagents/fork-cache.ts +82 -0
  347. package/extensions/subagents/guide-agent.ts +189 -0
  348. package/extensions/subagents/hand-back-review.ts +3 -0
  349. package/extensions/subagents/index.ts +1594 -852
  350. package/extensions/subagents/live-runs.ts +26 -6
  351. package/extensions/subagents/model-select.ts +38 -25
  352. package/extensions/subagents/outcome.ts +5 -2
  353. package/extensions/subagents/panel-keys.ts +73 -31
  354. package/extensions/subagents/panel-render.ts +120 -96
  355. package/extensions/subagents/panel-widget.ts +60 -89
  356. package/extensions/subagents/parent-mode.ts +50 -0
  357. package/extensions/subagents/pending-claim.ts +18 -1
  358. package/extensions/subagents/runner.ts +135 -80
  359. package/extensions/subagents/runs.ts +44 -5
  360. package/extensions/subagents/send-to-main-tool.ts +1 -1
  361. package/extensions/subagents/session-turns.ts +32 -8
  362. package/extensions/subagents/shell-panel.ts +36 -178
  363. package/extensions/subagents/tasks-dialog.ts +170 -0
  364. package/extensions/subagents/viewport-mirror.ts +95 -0
  365. package/extensions/subagents/worktree.ts +57 -13
  366. package/extensions/system-prompt/environment.ts +19 -19
  367. package/extensions/system-prompt/idle-turn.ts +65 -0
  368. package/extensions/system-prompt/index.ts +165 -47
  369. package/extensions/system-prompt/template.ts +34 -51
  370. package/extensions/system-prompt/tiers/common.ts +23 -64
  371. package/extensions/system-prompt/tiers/frontier.ts +32 -11
  372. package/extensions/system-prompt/tiers/low.ts +67 -45
  373. package/extensions/system-prompt/tiers/mid.ts +96 -38
  374. package/extensions/system-reminder/index.ts +204 -70
  375. package/extensions/tasks/descriptions.ts +190 -0
  376. package/extensions/tasks/index.ts +120 -41
  377. package/extensions/tasks/store.ts +83 -16
  378. package/extensions/tool-call-corruption/child.ts +7 -0
  379. package/extensions/tool-call-corruption/index.ts +237 -0
  380. package/extensions/tool-search/index.ts +366 -144
  381. package/extensions/tool-style/index.ts +68 -10
  382. package/extensions/tool-style/write-description.ts +40 -0
  383. package/extensions/tool-style/write-render.ts +237 -0
  384. package/extensions/turn-duration/index.ts +7 -3
  385. package/extensions/turn-duration/line.ts +47 -4
  386. package/extensions/web/backends.ts +6 -9
  387. package/extensions/web/description.ts +50 -0
  388. package/extensions/web/index.ts +118 -53
  389. package/extensions/web/native-call.ts +15 -0
  390. package/extensions/web/native-results.ts +41 -0
  391. package/extensions/web-fetch/description.ts +42 -0
  392. package/extensions/web-fetch/extract.ts +53 -6
  393. package/extensions/web-fetch/index.ts +125 -76
  394. package/extensions/web-fetch/page-content.ts +19 -0
  395. package/extensions/web-fetch/response.ts +49 -0
  396. package/extensions/web-fetch/summarize.ts +9 -10
  397. package/extensions/workflow/agent-session.ts +108 -18
  398. package/extensions/workflow/args.ts +24 -0
  399. package/extensions/workflow/description.ts +67 -0
  400. package/extensions/workflow/globals.ts +17 -3
  401. package/extensions/workflow/index.ts +157 -162
  402. package/extensions/workflow/records.ts +1 -0
  403. package/extensions/workflow/run-manager.ts +33 -6
  404. package/extensions/workflow/saved-workflows.ts +3 -2
  405. package/extensions/workflow/types.ts +22 -1
  406. package/extensions/workflow/viewer.ts +54 -24
  407. package/extensions/workflow/widget.ts +20 -0
  408. package/extensions/worktree/descriptions.ts +91 -0
  409. package/extensions/worktree/guards.ts +316 -54
  410. package/extensions/worktree/index.ts +162 -44
  411. package/extensions/worktree/powershell-guards.ts +167 -0
  412. package/extensions/worktree/rewrite.ts +14 -16
  413. package/package.json +21 -7
  414. package/skills/artifact-design/SKILL.md +85 -0
  415. package/skills/code-review/SKILL.md +20 -20
  416. package/skills/code-review/cells/arguments-and-flags.md +19 -0
  417. package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
  418. package/skills/code-review/cells/high-8-inline.md +122 -0
  419. package/skills/code-review/cells/low-1-pass-max4.md +27 -0
  420. package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
  421. package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
  422. package/skills/code-review/cells/medium-3x5-verify.md +132 -0
  423. package/skills/code-review/cells/minimal-prompt.md +32 -0
  424. package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
  425. package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
  426. package/skills/fewer-permission-prompts/SKILL.md +1 -1
  427. package/skills/loop/SKILL.md +11 -0
  428. package/skills/security-review/SKILL.md +2 -5
  429. package/skills/simplify/SKILL.md +7 -5
  430. package/skills/workflow-authoring/SKILL.md +143 -0
  431. package/themes/onecode-light.json +1 -1
  432. package/themes/onecode.json +1 -1
  433. package/types/app.d.ts +58 -0
  434. package/types/community-packages.d.ts +26 -1
  435. package/extensions/auto-mode/recoverability.ts +0 -229
  436. package/extensions/lib/capability-index.ts +0 -466
  437. package/extensions/lib/model-facts.generated.json +0 -2675
  438. package/extensions/lib/model-facts.ts +0 -162
  439. package/extensions/tool-search/announce.ts +0 -42
@@ -1,90 +1,224 @@
1
1
  /**
2
- * system-reminder extension — injects queued <system-reminder> blocks into the
3
- * outgoing LLM request (pi `context` event), and writes one-shots into the tool
4
- * result they follow (pi `tool_result` event) so they persist in the session
5
- * the way Claude Code's mid-turn reminders do. Standing and context reminders
6
- * stay transient: the session file never contains them. This extension owns
7
- * the one queue instance; every other extension reaches it over
8
- * `one-code:system-reminder` (lib/reminders.ts has the placement contract).
2
+ * system-reminder extension, the renderer of the record-once request path
3
+ * (lib/reminders.ts has the placement contract, extensions/ledger the design).
4
+ * It owns the live reminder state every other extension feeds over
5
+ * `one-code:system-reminder`: the `first-prepend` stack and the open sticky
6
+ * states. A one-shot is persisted when emitted, as a `one-code:pending` entry,
7
+ * and delivered from the ledger's outbox.
8
+ *
9
+ * Its `context` hook runs right after the ledger's, which has cut the request
10
+ * to its tail and published the plan. It renders onto that tail only: the
11
+ * stack when the request opens an epoch, the sticky states, the pending
12
+ * one-shots, and the blocks capability owners add on RENDER_CHANNEL (live
13
+ * minus what the epoch told). It writes into the plan which pending items the
14
+ * request carries and what its new blocks tell, and the ledger records both
15
+ * with the request. Nothing is snapshotted or restored: everything above the
16
+ * tail is the record.
17
+ *
18
+ * On a model that takes a mid-conversation system message (lib/system-role.ts),
19
+ * its `before_provider_request` hook lifts the stack's session-fact blocks off
20
+ * the first user message into one system message after it (an epoch's request
21
+ * only), and shapes the tail's `<total_tokens>` lines (lib/turn-budget-layout.ts).
9
22
  */
10
23
 
24
+ import { randomUUID } from "node:crypto";
11
25
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
12
- import {
13
- appendReminderBlocks,
14
- injectReminders,
15
- openingUserAnchor,
16
- REMINDER_CHANNEL,
17
- ReminderQueue,
18
- type ReminderPayload,
19
- tailAnchor,
20
- } from "../lib/reminders.ts";
26
+ import { CLEAR_AT_BETA, MID_CONVERSATION_SYSTEM_BETA, reseatMessageMark, withBetas } from "../lib/anthropic-payload.ts";
27
+ import { emptyToolResultContent } from "../lib/empty-tool-result.ts";
28
+ import { foldBranch } from "../lib/ledger/fold.ts";
29
+ import { LEDGER_PLAN_CHANNEL, type RequestPlan } from "../lib/ledger/plan.ts";
30
+ import { type EntryLike, makeRecord, type PendingRecordData, RECORD, stateOnBranch } from "../lib/ledger/records.ts";
31
+ import { recordState } from "../lib/ledger/state.ts";
32
+ import { contentHash } from "../lib/ledger/wire.ts";
33
+ import { claudeFamily } from "../lib/model-tier.ts";
34
+ import { extensionVersion } from "../lib/package-version.ts";
35
+ import { LiveReminders, type OneShot, REMINDER_CHANNEL, RENDER_CHANNEL, type RenderRequest, renderReminders, type ReminderPayload, stickyFact } from "../lib/reminders.ts";
36
+ import { sessionAlive } from "../lib/session-lifecycle.ts";
37
+ import { instructionRole, messagesKey, type MovedBlock, systemRoleLayout, wireShape, withSystemRoleContext } from "../lib/system-role.ts";
38
+ import { resolveCountdowns, withTurnBudgetMessages } from "../lib/turn-budget-layout.ts";
21
39
 
22
- /**
23
- * Roles a reminder can be attached to (see injectReminders). `custom` is a
24
- * harness message (a task notification, a wakeup, hook context) that pi sends
25
- * to the model as a user message; a turn opened by one has no `user` message
26
- * of its own, so without it the model got no reminder stack at all
27
- * (STEERING-REVIEW-2026-09-05 H1).
28
- */
29
- const ANCHOR_ROLES = new Set(["user", "toolResult", "compactionSummary", "custom"]);
40
+ /** Whether requests carry the `<total_tokens>` budget lines (`CC_TOTAL_TOKENS=0` turns them off). */
41
+ const budgetMarkers = () => process.env.CC_TOTAL_TOKENS !== "0";
42
+
43
+ /** A pending entry as a one-shot to place. */
44
+ function oneShotOf(item: PendingRecordData): OneShot {
45
+ return {
46
+ id: item.id,
47
+ text: item.text,
48
+ placement: item.placement ?? "last-append",
49
+ ...(item.raw ? { raw: true } : {}),
50
+ ...(item.toolCallId ? { toolCallId: item.toolCallId } : {}),
51
+ ...(item.promptTimestamp !== undefined ? { promptTimestamp: item.promptTimestamp } : {}),
52
+ ...(item.once ? { once: true } : {}),
53
+ ...(item.orTail ? { orTail: true } : {}),
54
+ };
55
+ }
56
+
57
+ /** The `one-code:state` key prefix of a sticky state's recorded start. */
58
+ const STICKY_START_PREFIX = "sticky-start:";
30
59
 
31
60
  export default function systemReminderExtension(pi: ExtensionAPI) {
32
- const reminderQueue = new ReminderQueue();
61
+ const alive = sessionAlive(pi);
62
+ const by = extensionVersion();
63
+ const live = new LiveReminders();
64
+ /** The plan the ledger published for the request being rendered. */
65
+ let plan: RequestPlan | undefined;
66
+ /** One-shots emitted before the session started (an extension's load): persisted at session_start. */
67
+ let early: ReminderPayload[] | undefined = [];
68
+ /** Without the ledger (a test harness, a session that does not load it): the pending ids this instance delivered. */
69
+ const deliveredHere = new Set<string>();
70
+
71
+ const persist = (payload: ReminderPayload) => {
72
+ const data = makeRecord("pending", by, {
73
+ id: randomUUID(),
74
+ text: payload.text as string,
75
+ placement: payload.placement === "user-prepend" ? "user-prepend" : "last-append",
76
+ ...(payload.key ? { key: payload.key } : {}),
77
+ ...(payload.raw ? { raw: true } : {}),
78
+ ...(payload.toolCallId ? { toolCallId: payload.toolCallId } : {}),
79
+ ...(payload.promptTimestamp !== undefined ? { promptTimestamp: payload.promptTimestamp } : {}),
80
+ ...(payload.once ? { once: true } : {}),
81
+ ...(payload.orTail ? { orTail: true } : {}),
82
+ ...(payload.untilCompaction ? { untilCompaction: true } : {}),
83
+ ...(payload.observations?.length ? { observations: payload.observations } : {}),
84
+ ...(payload.notified?.length ? { notified: payload.notified } : {}),
85
+ });
86
+ pi.appendEntry(RECORD.pending, data);
87
+ };
88
+
89
+ /** The session's branch: the sticky states' starts it recorded. */
90
+ let branchOf: (() => EntryLike[]) | undefined;
91
+ /**
92
+ * When each sticky state started, as the branch recorded it. An owner that
93
+ * runs again (a resume, /reload, /tree) emits its state without a start, so
94
+ * the renderer takes the branch's start for the same key and text: an epoch
95
+ * that renders the conversation again (a model switch) then places the block
96
+ * where the original requests did, and its first delivery stays told. A
97
+ * removal records the run's end (null), so nothing carries past it.
98
+ */
99
+ const stickyStart = (key: string): { since: number; hash: string } | undefined => {
100
+ const stored = branchOf ? (stateOnBranch(branchOf(), `${STICKY_START_PREFIX}${key}`) as { since?: unknown; hash?: unknown } | undefined) : undefined;
101
+ return typeof stored?.since === "number" && typeof stored.hash === "string" ? { since: stored.since, hash: stored.hash } : undefined;
102
+ };
33
103
 
34
104
  pi.events.on(REMINDER_CHANNEL, (data) => {
35
- const payload = data as ReminderPayload;
105
+ let payload = data as ReminderPayload | undefined;
36
106
  if (!payload) return;
37
- if (payload.remove && payload.key) {
38
- reminderQueue.remove(payload.key);
39
- } else if (typeof payload.text === "string") {
40
- reminderQueue.enqueue(payload.text, {
41
- scope: payload.scope,
42
- key: payload.key,
43
- placement: payload.placement,
44
- order: payload.order,
45
- suffix: payload.suffix,
46
- raw: payload.raw,
47
- since: payload.since,
48
- once: payload.once,
49
- });
107
+ const sticky = payload.placement === "sticky-append" && !payload.remove && typeof payload.text === "string";
108
+ const key = payload.key ?? payload.text ?? "";
109
+ const recorded = sticky ? stickyStart(key) : undefined;
110
+ if (sticky && payload.since === undefined && recorded?.hash === contentHash(payload.text)) payload = { ...payload, since: recorded.since };
111
+ // A removal ends the state's run: switched on again, even with the same
112
+ // text, it is a new state that rides the switching call's result, not the
113
+ // old run's start, whose first delivery the branch already told.
114
+ if (payload.remove && payload.key && branchOf && alive() && stickyStart(payload.key)) recordState(pi, `${STICKY_START_PREFIX}${payload.key}`, null);
115
+ const applied = live.apply(payload);
116
+ if (sticky && applied === "live" && branchOf && alive()) {
117
+ const entry = live.stickyEntries().find((state) => state.key === key);
118
+ const hash = entry ? contentHash(entry.text) : undefined;
119
+ if (entry && entry.since > 0 && (recorded?.since !== entry.since || recorded?.hash !== hash)) recordState(pi, `${STICKY_START_PREFIX}${key}`, { since: entry.since, hash });
50
120
  }
121
+ if (applied !== "one-shot") return;
122
+ if (early) early.push(payload);
123
+ else if (alive()) persist(payload);
124
+ });
125
+ pi.on("session_start", (_event, ctx) => {
126
+ const sessionManager = ctx?.sessionManager;
127
+ branchOf = sessionManager ? () => sessionManager.getBranch() as EntryLike[] : undefined;
128
+ const queued = early ?? [];
129
+ early = undefined;
130
+ for (const payload of queued) persist(payload);
131
+ });
132
+ pi.events.on(LEDGER_PLAN_CHANNEL, (data) => {
133
+ plan = data as RequestPlan;
51
134
  });
52
135
 
53
- // A one-shot pending when a tool result is stored goes INTO that result: the
54
- // model reads it right there, the session file keeps it, and no later request
55
- // re-caches the message (a transient block would vanish on the next request
56
- // and cost the result and everything after it). Runs before the hooks
57
- // extension's PostToolUse in load order, so a hook that replaces the whole
58
- // result would drop these appended blocks — the hooks extension re-attaches
59
- // the trailing reminder run when it applies a replacement (review M3,
60
- // applyPostToolUseOutcome / isAppendedReminderText).
136
+ // A tool's empty result is normalized before anything else reads it. Read's
137
+ // raw bytes stay for file-tracker's empty-file warning.
61
138
  pi.on("tool_result", (event) => {
62
- if (!reminderQueue.hasPendingOneShots) return;
63
- const entries = reminderQueue.takeOneShots();
64
- return { content: appendReminderBlocks(event.content, entries) };
139
+ const replacement = emptyToolResultContent(event.content, event.toolName);
140
+ if (!replacement) return;
141
+ return { content: replacement, ...(event.structuredContent !== undefined ? { structuredContent: event.structuredContent } : {}) };
65
142
  });
66
143
 
67
- pi.on("context", (event) => {
68
- if (reminderQueue.size === 0) return;
69
- // injectReminders is a no-op when there is nothing to attach to. Only
70
- // consume the queue once there is somewhere to put the reminders, so they
71
- // survive to the next eligible request.
72
- if (!event.messages.some((m) => ANCHOR_ROLES.has(m.role))) return;
73
- // A one-shot that arrived after the last tool result was stored (a mode
74
- // change while idle, a deferred-tool miss whose call had no tool_result
75
- // hook) rides this request's tail — and stays pinned there afterwards.
76
- if (reminderQueue.hasPendingOneShots) {
77
- const anchor = tailAnchor(event.messages);
78
- if (anchor) reminderQueue.pin(anchor);
144
+ /** The stack blocks the last `context` pass placed for the system message; the payload hook moves them. */
145
+ let moved: MovedBlock[] = [];
146
+ /** Whether the last `context` pass rendered an epoch: only then does the first user message carry the stack. */
147
+ let epochRequest = true;
148
+ /** The tool results' countdowns the last `context` pass lifted, by call id (lib/turn-budget-layout.ts). */
149
+ let countdowns = new Map<string, number>();
150
+
151
+ pi.on("context", (event, ctx) => {
152
+ const current = plan;
153
+ plan = undefined;
154
+ const layout = systemRoleLayout(ctx.model);
155
+ const epoch = current?.epoch ?? true;
156
+ const fold = current?.fold ?? foldBranch(ctx.sessionManager.getBranch() as EntryLike[]);
157
+
158
+ // Owners add nothing on an epoch (the live stack is rendered), so the told maps need no reset here.
159
+ const request: RenderRequest = { epoch, told: fold.told, modes: fold.modes, toldBlocks: fold.blocks, model: ctx.model, blocks: [] };
160
+ pi.events.emit(RENDER_CHANNEL, request);
161
+ const oneShots: OneShot[] = [
162
+ ...fold.pending.filter((item) => !deliveredHere.has(item.id)).map(oneShotOf),
163
+ ...request.blocks.map((block) => ({ text: block.text, placement: "last-append" as const, ...(block.facts ? { facts: block.facts } : {}) })),
164
+ ];
165
+ const stack = live.stackEntries();
166
+ // A sticky state's first delivery is told, so a failed request's revokes and an epoch renders it again.
167
+ const toldBlocks = epoch ? new Map<string, string>() : fold.blocks;
168
+ const sticky = live.stickyEntries().map((entry) => {
169
+ const fact = stickyFact(entry);
170
+ return { ...entry, fact, delivered: toldBlocks.get(fact.key) === fact.hash };
171
+ });
172
+ const rendered = renderReminders(event.messages, { epoch, layout: layout !== undefined, stack, sticky, oneShots });
173
+ const stickyFacts = sticky.filter((entry) => !entry.delivered && rendered.stickyPlaced.includes(entry.key)).map((entry) => entry.fact);
174
+
175
+ const consumed = rendered.placed.flatMap((shot) => (shot.id ? [shot.id] : []));
176
+ // Each fact with the text that carries it: a repair that drops the text drops the fact.
177
+ const carried = [
178
+ ...(epoch && rendered.stackPlaced ? stack.filter((entry) => layout !== undefined || !entry.systemRoleOnly).map((entry) => ({ text: entry.text, facts: entry.facts ?? [] })) : []),
179
+ ...rendered.placed.map((shot) => ({ text: shot.text, facts: shot.facts ?? [] })),
180
+ ...sticky.filter((entry) => stickyFacts.includes(entry.fact)).map((entry) => ({ text: entry.text, facts: [entry.fact] })),
181
+ ].filter((block) => block.facts.length > 0);
182
+ if (current) {
183
+ current.consumed.push(...consumed);
184
+ current.carried.push(...carried);
185
+ } else {
186
+ for (const id of consumed) deliveredHere.add(id);
79
187
  }
80
- // A local-command breadcrumb rides the prompt that opens a request, before
81
- // the user's text (Claude Code's placement), and stays there. Mid-turn —
82
- // the request ends in a tool result — it waits for the next prompt.
83
- if (reminderQueue.hasPending("user-prepend")) {
84
- const anchor = openingUserAnchor(event.messages);
85
- if (anchor) reminderQueue.pin(anchor, "user-prepend");
188
+
189
+ moved = rendered.moved;
190
+ epochRequest = epoch;
191
+ // Each tool result's <total_tokens> countdown, lifted for a system message
192
+ // or framed, while the result's blocks are still separate (lib/turn-budget-layout.ts).
193
+ // With the budget off no result carries one, so a tool's own such line stays its output.
194
+ countdowns = new Map();
195
+ const resolved = budgetMarkers() && ctx.model && wireShape(ctx.model.api) ? resolveCountdowns(rendered.messages, layout !== undefined) : undefined;
196
+ if (resolved) countdowns = resolved.left;
197
+ const out = resolved?.messages ?? rendered.messages;
198
+ const changed = out.length !== event.messages.length || out.some((message, i) => message !== event.messages[i]);
199
+ return changed ? { messages: out } : undefined;
200
+ });
201
+
202
+ pi.on("before_provider_request", (event, ctx) => {
203
+ const model = ctx.model;
204
+ const shape = model ? wireShape(model.api) : undefined;
205
+ if (!model || !shape) return undefined;
206
+ const layout = systemRoleLayout(model);
207
+ const role = instructionRole(shape, model);
208
+ let payload = event.payload as Record<string, unknown>;
209
+ if (layout) payload = withSystemRoleContext(payload, layout, moved, role) ?? payload;
210
+ // Claude Code's per-turn <total_tokens> shapes; first-party Fable also
211
+ // gets its clear_at nudge after each tool result.
212
+ const firstParty = model.provider === "anthropic";
213
+ const nudge = layout === "anthropic" && firstParty && claudeFamily(model.id) === "fable";
214
+ payload = withTurnBudgetMessages(payload, { shape, systemRole: layout !== undefined, role, left: countdowns, nudge, markers: budgetMarkers(), stackCarrier: epochRequest }) ?? payload;
215
+ if (payload !== event.payload && shape === "anthropic") {
216
+ const key = messagesKey(shape);
217
+ payload = { ...payload, [key]: reseatMessageMark(payload[key] as Array<{ role?: unknown; content?: unknown }>) };
86
218
  }
87
- const reminders = reminderQueue.drain(event.messages);
88
- return { messages: injectReminders(event.messages, reminders) };
219
+ // The betas go on every request of a model that takes the layout: an
220
+ // earlier request's system messages are part of every later one.
221
+ if (layout === "anthropic" && firstParty) payload = withBetas(payload, nudge ? [MID_CONVERSATION_SYSTEM_BETA, CLEAR_AT_BETA] : [MID_CONVERSATION_SYSTEM_BETA]);
222
+ return payload === event.payload ? undefined : payload;
89
223
  });
90
224
  }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * The task tools' model-facing texts: Claude Code's TaskCreate, TaskUpdate,
3
+ * TaskGet and TaskList descriptions and parameter texts, with One Code's tool
4
+ * names (pure). The schemas are the same on both sides.
5
+ */
6
+
7
+ export const TASK_CREATE_DESCRIPTION = `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.
8
+ It also helps the user understand the progress of the task and overall progress of their requests.
9
+
10
+ ## When to Use This Tool
11
+
12
+ Use this tool proactively in these scenarios:
13
+
14
+ - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions
15
+ - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations
16
+ - Plan mode - When using plan mode, create a task list to track the work
17
+ - User explicitly requests todo list - When the user directly asks you to use the todo list
18
+ - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)
19
+ - After receiving new instructions - Immediately capture user requirements as tasks
20
+ - When you start working on a task - Mark it as in_progress BEFORE beginning work
21
+ - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation
22
+
23
+ ## When NOT to Use This Tool
24
+
25
+ Skip using this tool when:
26
+ - There is only a single, straightforward task
27
+ - The task is trivial and tracking it provides no organizational benefit
28
+ - The task can be completed in less than 3 trivial steps
29
+ - The task is purely conversational or informational
30
+
31
+ NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.
32
+
33
+ ## Task Fields
34
+
35
+ - **subject**: A brief, actionable title in imperative form (e.g., "Fix authentication bug in login flow")
36
+ - **description**: What needs to be done
37
+ - **activeForm** (optional): Present continuous form shown in the spinner when the task is in_progress (e.g., "Fixing authentication bug"). If omitted, the spinner shows the subject instead.
38
+
39
+ All tasks are created with status \`pending\`.
40
+
41
+ ## Tips
42
+
43
+ - Create tasks with clear, specific subjects that describe the outcome
44
+ - After creating tasks, use task_update to set up dependencies (blocks/blockedBy) if needed
45
+ - Check task_list first to avoid creating duplicate tasks
46
+ `;
47
+
48
+ export const TASK_UPDATE_DESCRIPTION = `Use this tool to update a task in the task list.
49
+
50
+ ## When to Use This Tool
51
+
52
+ **Mark tasks as resolved:**
53
+ - When you have completed the work described in a task
54
+ - When a task is no longer needed or has been superseded
55
+ - IMPORTANT: Always mark your assigned tasks as resolved when you finish them
56
+ - After resolving, call task_list to find your next task
57
+
58
+ - ONLY mark a task as completed when you have FULLY accomplished it
59
+ - If you encounter errors, blockers, or cannot finish, keep the task as in_progress
60
+ - When blocked, create a new task describing what needs to be resolved
61
+ - Never mark a task as completed if:
62
+ - Tests are failing
63
+ - Implementation is partial
64
+ - You encountered unresolved errors
65
+ - You couldn't find necessary files or dependencies
66
+
67
+ **Delete tasks:**
68
+ - When a task is no longer relevant or was created in error
69
+ - Setting status to \`deleted\` permanently removes the task
70
+
71
+ **Update task details:**
72
+ - When requirements change or become clearer
73
+ - When establishing dependencies between tasks
74
+
75
+ ## Fields You Can Update
76
+
77
+ - **status**: The task status (see Status Workflow below)
78
+ - **subject**: Change the task title (imperative form, e.g., "Run tests")
79
+ - **description**: Change the task description
80
+ - **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Running tests")
81
+ - **owner**: Change the task owner (agent name)
82
+ - **metadata**: Merge metadata keys into the task (set a key to null to delete it)
83
+ - **addBlocks**: Mark tasks that cannot start until this one completes
84
+ - **addBlockedBy**: Mark tasks that must complete before this one can start
85
+
86
+ ## Status Workflow
87
+
88
+ Status progresses: \`pending\` → \`in_progress\` → \`completed\`
89
+
90
+ Use \`deleted\` to permanently remove a task.
91
+
92
+ ## Staleness
93
+
94
+ Make sure to read a task's latest state using \`task_get\` before updating it.
95
+
96
+ ## Examples
97
+
98
+ Mark task as in progress when starting work:
99
+ \`\`\`json
100
+ {"taskId": "1", "status": "in_progress"}
101
+ \`\`\`
102
+
103
+ Mark task as completed after finishing work:
104
+ \`\`\`json
105
+ {"taskId": "1", "status": "completed"}
106
+ \`\`\`
107
+
108
+ Delete a task:
109
+ \`\`\`json
110
+ {"taskId": "1", "status": "deleted"}
111
+ \`\`\`
112
+
113
+ Claim a task by setting owner:
114
+ \`\`\`json
115
+ {"taskId": "1", "owner": "my-name"}
116
+ \`\`\`
117
+
118
+ Set up task dependencies:
119
+ \`\`\`json
120
+ {"taskId": "2", "addBlockedBy": ["1"]}
121
+ \`\`\`
122
+ `;
123
+
124
+ export const TASK_GET_DESCRIPTION = `Use this tool to retrieve a task by its ID from the task list.
125
+
126
+ ## When to Use This Tool
127
+
128
+ - When you need the full description and context before starting work on a task
129
+ - To understand task dependencies (what it blocks, what blocks it)
130
+ - After being assigned a task, to get complete requirements
131
+
132
+ ## Output
133
+
134
+ Returns full task details:
135
+ - **subject**: Task title
136
+ - **description**: Detailed requirements and context
137
+ - **status**: 'pending', 'in_progress', or 'completed'
138
+ - **blocks**: Tasks waiting on this one to complete
139
+ - **blockedBy**: Tasks that must complete before this one can start
140
+
141
+ ## Tips
142
+
143
+ - After fetching a task, verify its blockedBy list is empty before beginning work.
144
+ - Use task_list to see all tasks in summary form.
145
+ `;
146
+
147
+ export const TASK_LIST_DESCRIPTION = `Use this tool to list all tasks in the task list.
148
+
149
+ ## When to Use This Tool
150
+
151
+ - To see what tasks are available to work on (status: 'pending', no owner, not blocked)
152
+ - To check overall progress on the project
153
+ - To find tasks that are blocked and need dependencies resolved
154
+ - After completing a task, to check for newly unblocked work or claim the next available task
155
+ - **Prefer working on tasks in ID order** (lowest ID first) when multiple tasks are available, as earlier tasks often set up context for later ones
156
+
157
+ ## Output
158
+
159
+ Returns a summary of each task:
160
+ - **id**: Task identifier (use with task_get, task_update)
161
+ - **subject**: Brief description of the task
162
+ - **status**: 'pending', 'in_progress', or 'completed'
163
+ - **owner**: Agent ID if assigned, empty if available
164
+ - **blockedBy**: List of open task IDs that must be resolved first (tasks with blockedBy cannot be claimed until dependencies resolve)
165
+
166
+ Use task_get with a specific task ID to view full details including description and comments.
167
+ `;
168
+
169
+ export const TASK_CREATE_PARAMS = {
170
+ subject: `A brief title for the task`,
171
+ description: `What needs to be done`,
172
+ activeForm: `Present continuous form shown in spinner when in_progress (e.g., "Running tests")`,
173
+ metadata: `Arbitrary metadata to attach to the task`,
174
+ } as const;
175
+
176
+ export const TASK_UPDATE_PARAMS = {
177
+ taskId: `The ID of the task to update`,
178
+ subject: `New subject for the task`,
179
+ description: `New description for the task`,
180
+ activeForm: `Present continuous form shown in spinner when in_progress (e.g., "Running tests")`,
181
+ status: `New status for the task`,
182
+ addBlocks: `Task IDs that this task blocks`,
183
+ addBlockedBy: `Task IDs that block this task`,
184
+ owner: `New owner for the task`,
185
+ metadata: `Metadata keys to merge into the task. Set a key to null to delete it.`,
186
+ } as const;
187
+
188
+ export const TASK_GET_PARAMS = {
189
+ taskId: `The ID of the task to retrieve`,
190
+ } as const;