one-code-extension 0.4.0 → 0.5.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 (419) hide show
  1. package/README.md +219 -219
  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 +32 -23
  7. package/docs/guide/doctor.md +20 -13
  8. package/docs/guide/hooks.md +18 -3
  9. package/docs/guide/installation.md +27 -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 +66 -34
  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 +123 -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 +515 -0
  56. package/extensions/background/index.ts +514 -236
  57. package/extensions/background/loop-fire.ts +136 -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 +52 -0
  63. package/extensions/background/wakeup.ts +159 -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 +88 -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 +229 -71
  77. package/extensions/btw/panel.ts +228 -100
  78. package/extensions/btw/prompt.ts +41 -4
  79. package/extensions/claude-compat/index.ts +7 -11
  80. package/extensions/claude-context/index.ts +446 -58
  81. package/extensions/compaction/cut.ts +157 -0
  82. package/extensions/compaction/index.ts +216 -75
  83. package/extensions/compaction/kept-thinking.ts +62 -0
  84. package/extensions/compaction/prompt.ts +15 -12
  85. package/extensions/context-budget/index.ts +24 -5
  86. package/extensions/context-management/index.ts +25 -0
  87. package/extensions/doctor/build.ts +59 -8
  88. package/extensions/doctor/builtins.ts +84 -0
  89. package/extensions/doctor/cli.ts +7 -1
  90. package/extensions/doctor/compat.ts +88 -23
  91. package/extensions/doctor/dependencies.ts +41 -5
  92. package/extensions/doctor/fix-prompt.ts +9 -2
  93. package/extensions/doctor/index.ts +102 -58
  94. package/extensions/doctor/models.ts +102 -63
  95. package/extensions/doctor/presets.ts +42 -27
  96. package/extensions/doctor/report.ts +19 -2
  97. package/extensions/doctor/viewer.ts +49 -27
  98. package/extensions/effort/index.ts +72 -19
  99. package/extensions/effort/settings.ts +21 -0
  100. package/extensions/effort/slider.ts +24 -20
  101. package/extensions/exit/index.ts +32 -1
  102. package/extensions/file-tracker/index.ts +337 -26
  103. package/extensions/file-tracker/replay.ts +96 -10
  104. package/extensions/file-tracker/restore.ts +63 -0
  105. package/extensions/file-tracker/results.ts +66 -0
  106. package/extensions/file-tracker/shell-reads.ts +211 -0
  107. package/extensions/file-tracker/tracker.ts +32 -15
  108. package/extensions/footer/footer-line.ts +45 -24
  109. package/extensions/footer/index.ts +47 -2
  110. package/extensions/footer/pr.ts +34 -5
  111. package/extensions/hooks/compaction.ts +7 -0
  112. package/extensions/hooks/executor.ts +32 -30
  113. package/extensions/hooks/index.ts +198 -31
  114. package/extensions/hooks/matcher.ts +3 -0
  115. package/extensions/hooks/protocol.ts +41 -3
  116. package/extensions/hooks/settings.ts +50 -19
  117. package/extensions/hooks/subagent-bridge.ts +2 -0
  118. package/extensions/hooks/trust.ts +13 -5
  119. package/extensions/idle-compact/index.ts +119 -0
  120. package/extensions/idle-compact/policy.ts +143 -0
  121. package/extensions/init/index.ts +11 -10
  122. package/extensions/init/prompt.ts +25 -32
  123. package/extensions/interrupted/index.ts +13 -1
  124. package/extensions/kept-thinking/index.ts +27 -0
  125. package/extensions/lib/agent-cron.ts +130 -0
  126. package/extensions/lib/agent-loader.ts +15 -1
  127. package/extensions/lib/agent-view.ts +85 -0
  128. package/extensions/lib/anthropic-payload.ts +82 -1
  129. package/extensions/lib/anthropic-server-call.ts +230 -0
  130. package/extensions/lib/anthropic-server-tools.ts +485 -0
  131. package/extensions/lib/app-launch.mjs +94 -0
  132. package/extensions/lib/argument-hints.ts +190 -0
  133. package/extensions/lib/atomic-write.ts +6 -2
  134. package/extensions/lib/auto-memory.ts +75 -0
  135. package/extensions/lib/bash-parser.ts +84 -0
  136. package/extensions/lib/btw-fork.ts +93 -0
  137. package/extensions/lib/child-extensions.ts +42 -0
  138. package/extensions/lib/child-writes.ts +45 -0
  139. package/extensions/lib/claude-context.ts +515 -100
  140. package/extensions/lib/claude-external-includes.ts +68 -0
  141. package/extensions/lib/claude-id.ts +22 -0
  142. package/extensions/lib/claude-rules.ts +323 -0
  143. package/extensions/lib/claude-settings.ts +76 -4
  144. package/extensions/lib/compaction-boundary.ts +36 -0
  145. package/extensions/lib/compaction-keep.mjs +83 -0
  146. package/extensions/lib/config-mode.ts +112 -0
  147. package/extensions/lib/consent-dialogs.ts +63 -0
  148. package/extensions/lib/consent-preview.ts +5 -1
  149. package/extensions/lib/consent-stores.ts +48 -0
  150. package/extensions/lib/context-facts.ts +78 -0
  151. package/extensions/lib/context-stack.ts +81 -0
  152. package/extensions/lib/deferred.ts +219 -25
  153. package/extensions/lib/dock-rows.ts +60 -0
  154. package/extensions/lib/empty-tool-result.ts +27 -0
  155. package/extensions/lib/environment-block.ts +76 -0
  156. package/extensions/lib/fetch-timeout.ts +24 -6
  157. package/extensions/{system-prompt → lib}/git-status.ts +51 -13
  158. package/extensions/lib/git.ts +75 -13
  159. package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
  160. package/extensions/lib/grammars/README.md +2 -0
  161. package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
  162. package/extensions/lib/guide-docs.ts +45 -0
  163. package/extensions/lib/headless-output.ts +46 -0
  164. package/extensions/lib/hook-gate.ts +7 -7
  165. package/extensions/lib/interrupt.ts +20 -4
  166. package/extensions/lib/key-input.ts +455 -0
  167. package/extensions/lib/keys.ts +14 -1
  168. package/extensions/lib/local-command.ts +47 -13
  169. package/extensions/lib/mcp-overrides.ts +1 -1
  170. package/extensions/lib/mcp-share.ts +46 -0
  171. package/extensions/lib/memory-content.ts +146 -0
  172. package/extensions/lib/memory-index.ts +18 -0
  173. package/extensions/lib/memory.ts +134 -123
  174. package/extensions/lib/model-catalog/huggingface.json +174 -0
  175. package/extensions/lib/model-catalog/models-dev.json +18297 -0
  176. package/extensions/lib/model-catalog/openrouter.json +5252 -0
  177. package/extensions/lib/model-catalog-data.ts +513 -0
  178. package/extensions/lib/model-catalog.ts +462 -0
  179. package/extensions/lib/model-choice-warnings.ts +137 -0
  180. package/extensions/lib/model-pairings.ts +152 -0
  181. package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
  182. package/extensions/lib/model-policy.ts +112 -15
  183. package/extensions/lib/model-tier.ts +283 -355
  184. package/extensions/lib/model-unusable.ts +1 -1
  185. package/extensions/lib/newer-model.ts +100 -0
  186. package/extensions/lib/notices.ts +87 -0
  187. package/extensions/lib/notifications.ts +308 -64
  188. package/extensions/lib/one-code-settings.ts +74 -8
  189. package/extensions/lib/open-browser.ts +63 -0
  190. package/extensions/lib/openrouter-generation.ts +94 -0
  191. package/extensions/lib/operation-deadline.ts +30 -0
  192. package/extensions/lib/original-command.ts +4 -4
  193. package/extensions/lib/package-version.ts +1 -1
  194. package/extensions/lib/panel-focus.ts +134 -0
  195. package/extensions/lib/paths.ts +17 -2
  196. package/extensions/lib/permission-gate.ts +72 -6
  197. package/extensions/lib/persisted-output.ts +60 -8
  198. package/extensions/lib/pi-ai-estimate.ts +19 -3
  199. package/extensions/lib/pi-version.ts +21 -2
  200. package/extensions/lib/plan-mode-channels.ts +20 -5
  201. package/extensions/lib/plugins.ts +26 -17
  202. package/extensions/lib/powershell-parse-script.ts +208 -0
  203. package/extensions/lib/powershell-parser.ts +344 -0
  204. package/extensions/lib/process-tree.ts +131 -8
  205. package/extensions/lib/prompt-options.ts +82 -0
  206. package/extensions/lib/queued-delivery.ts +44 -0
  207. package/extensions/lib/reminders.ts +364 -58
  208. package/extensions/lib/replaced-builtins.mjs +199 -0
  209. package/extensions/lib/replay-call.ts +70 -0
  210. package/extensions/lib/request-replay.ts +439 -0
  211. package/extensions/lib/scratchpad.ts +81 -14
  212. package/extensions/lib/send-now-channel.ts +7 -0
  213. package/extensions/lib/session-model-tier.ts +51 -0
  214. package/extensions/lib/session-work.ts +64 -0
  215. package/extensions/lib/settings-channels.ts +4 -4
  216. package/extensions/lib/shell-exit-semantics.ts +170 -0
  217. package/extensions/lib/shell-quote.ts +11 -0
  218. package/extensions/lib/shell-result.ts +70 -0
  219. package/extensions/lib/shell-spawn.ts +70 -6
  220. package/extensions/lib/shell-tool.ts +75 -25
  221. package/extensions/lib/side-call-cache.ts +124 -0
  222. package/extensions/lib/side-call-run.ts +96 -0
  223. package/extensions/lib/side-call-usage.ts +38 -0
  224. package/extensions/lib/side-call.ts +13 -1
  225. package/extensions/lib/single-flight.ts +18 -0
  226. package/extensions/lib/skill-body.ts +42 -0
  227. package/extensions/lib/skill-scan.ts +63 -24
  228. package/extensions/lib/spill-file.ts +140 -0
  229. package/extensions/lib/subagent-handback.ts +113 -0
  230. package/extensions/lib/system-role.ts +156 -0
  231. package/extensions/lib/terminal-text.ts +114 -0
  232. package/extensions/lib/text-width.ts +47 -16
  233. package/extensions/lib/timer-ops.ts +20 -0
  234. package/extensions/lib/tool-additions.ts +149 -0
  235. package/extensions/lib/tool-call-corruption.ts +134 -0
  236. package/extensions/lib/tool-path.ts +66 -0
  237. package/extensions/lib/tool-variants.ts +69 -0
  238. package/extensions/lib/tui-render.ts +255 -27
  239. package/extensions/lib/turn-budget-layout.ts +143 -0
  240. package/extensions/lib/update-check.mjs +15 -2
  241. package/extensions/lib/usage-bus.ts +1 -1
  242. package/extensions/lib/user-denial.ts +38 -0
  243. package/extensions/lib/workspace-channel.ts +16 -0
  244. package/extensions/lib/worktree-channel.ts +31 -3
  245. package/extensions/lib/worktree-isolation.ts +40 -10
  246. package/extensions/lsp/client.ts +8 -9
  247. package/extensions/lsp/index.ts +70 -4
  248. package/extensions/lsp/keep-alive.ts +1 -1
  249. package/extensions/lsp/trust.ts +119 -0
  250. package/extensions/lsp/watcher.ts +1 -1
  251. package/extensions/mcp/announce.ts +87 -5
  252. package/extensions/mcp/client.ts +161 -48
  253. package/extensions/mcp/config.ts +132 -8
  254. package/extensions/mcp/discovery.ts +19 -0
  255. package/extensions/mcp/index.ts +209 -71
  256. package/extensions/mcp/oauth/browser.ts +38 -17
  257. package/extensions/mcp/oauth/flow.ts +25 -17
  258. package/extensions/mcp/oauth/provider.ts +14 -8
  259. package/extensions/mcp/oauth/store.ts +34 -16
  260. package/extensions/mcp/panel/keys.ts +12 -11
  261. package/extensions/mcp/panel/render.ts +9 -6
  262. package/extensions/mcp/schema.ts +104 -5
  263. package/extensions/mcp/trust.ts +151 -67
  264. package/extensions/memory/entries.ts +23 -14
  265. package/extensions/memory/index.ts +134 -28
  266. package/extensions/memory/open-external.ts +33 -18
  267. package/extensions/memory/panel.ts +135 -26
  268. package/extensions/newer-model/index.ts +31 -0
  269. package/extensions/notebook/description.ts +18 -0
  270. package/extensions/notebook/index.ts +6 -5
  271. package/extensions/notebook/notebook.ts +1 -1
  272. package/extensions/permissions/index.ts +1300 -381
  273. package/extensions/permissions/matcher.ts +425 -74
  274. package/extensions/permissions/modes.ts +6 -4
  275. package/extensions/permissions/panel/host.ts +130 -0
  276. package/extensions/permissions/panel/keys.ts +48 -0
  277. package/extensions/permissions/panel/render.ts +450 -0
  278. package/extensions/permissions/panel/state.ts +550 -0
  279. package/extensions/permissions/powershell-cmdlets.ts +198 -0
  280. package/extensions/permissions/powershell-paths.ts +197 -0
  281. package/extensions/permissions/powershell-rules.ts +207 -280
  282. package/extensions/permissions/powershell-tree.ts +557 -0
  283. package/extensions/permissions/project-trust.ts +27 -11
  284. package/extensions/permissions/protected-paths.ts +14 -2
  285. package/extensions/permissions/session-grant.ts +6 -0
  286. package/extensions/permissions/settings.ts +166 -31
  287. package/extensions/permissions/subagent-gate.ts +25 -0
  288. package/extensions/permissions/workspace.ts +78 -0
  289. package/extensions/plan-mode/index.ts +156 -69
  290. package/extensions/plan-mode/reminder.ts +89 -21
  291. package/extensions/plan-mode/texts.ts +177 -0
  292. package/extensions/plan-mode/viewer.ts +92 -27
  293. package/extensions/plugins/counts.ts +3 -3
  294. package/extensions/plugins/index.ts +61 -46
  295. package/extensions/plugins/install/install.ts +16 -0
  296. package/extensions/plugins/marketplace/sync.ts +9 -3
  297. package/extensions/plugins/marketplace/types.ts +3 -1
  298. package/extensions/plugins/panel/keys.ts +21 -24
  299. package/extensions/plugins/panel/render.ts +12 -6
  300. package/extensions/plugins/shell-expand.ts +107 -0
  301. package/extensions/plugins/template.ts +32 -15
  302. package/extensions/powershell/child.ts +7 -0
  303. package/extensions/powershell/description.ts +38 -6
  304. package/extensions/powershell/guards.ts +1 -1
  305. package/extensions/powershell/index.ts +12 -7
  306. package/extensions/recap/index.ts +65 -60
  307. package/extensions/recap/prompt.ts +2 -2
  308. package/extensions/recap/scheduler.ts +3 -5
  309. package/extensions/search-tools/grep-merge.ts +39 -0
  310. package/extensions/search-tools/index.ts +0 -0
  311. package/extensions/send-now/chord.ts +62 -0
  312. package/extensions/send-now/index.ts +133 -0
  313. package/extensions/session-title/index.ts +3 -0
  314. package/extensions/session-title/title.ts +4 -1
  315. package/extensions/skill/code-review.ts +97 -0
  316. package/extensions/skill/index.ts +421 -101
  317. package/extensions/skill/invoke.ts +128 -18
  318. package/extensions/skill/listing.ts +133 -9
  319. package/extensions/skill/panel/keys.ts +15 -16
  320. package/extensions/skill/panel/render.ts +5 -2
  321. package/extensions/skill/panel/state.ts +12 -1
  322. package/extensions/subagents/agent-args.ts +39 -0
  323. package/extensions/subagents/agent-description.ts +132 -0
  324. package/extensions/subagents/agents.ts +116 -23
  325. package/extensions/subagents/announce.ts +69 -0
  326. package/extensions/subagents/default-model.ts +2 -3
  327. package/extensions/subagents/delegation-steer.ts +4 -4
  328. package/extensions/subagents/fork-cache.ts +76 -0
  329. package/extensions/subagents/guide-agent.ts +189 -0
  330. package/extensions/subagents/hand-back-review.ts +3 -0
  331. package/extensions/subagents/index.ts +1493 -824
  332. package/extensions/subagents/live-runs.ts +26 -6
  333. package/extensions/subagents/model-select.ts +38 -25
  334. package/extensions/subagents/outcome.ts +2 -2
  335. package/extensions/subagents/panel-keys.ts +73 -31
  336. package/extensions/subagents/panel-render.ts +120 -96
  337. package/extensions/subagents/panel-widget.ts +60 -89
  338. package/extensions/subagents/runner.ts +108 -80
  339. package/extensions/subagents/runs.ts +39 -5
  340. package/extensions/subagents/send-to-main-tool.ts +1 -1
  341. package/extensions/subagents/session-turns.ts +32 -8
  342. package/extensions/subagents/shell-panel.ts +36 -178
  343. package/extensions/subagents/tasks-dialog.ts +170 -0
  344. package/extensions/subagents/viewport-mirror.ts +95 -0
  345. package/extensions/subagents/worktree.ts +57 -13
  346. package/extensions/system-prompt/environment.ts +19 -19
  347. package/extensions/system-prompt/idle-turn.ts +65 -0
  348. package/extensions/system-prompt/index.ts +131 -47
  349. package/extensions/system-prompt/template.ts +24 -50
  350. package/extensions/system-prompt/tiers/common.ts +23 -64
  351. package/extensions/system-prompt/tiers/frontier.ts +32 -11
  352. package/extensions/system-prompt/tiers/low.ts +67 -45
  353. package/extensions/system-prompt/tiers/mid.ts +96 -38
  354. package/extensions/system-reminder/index.ts +175 -13
  355. package/extensions/tasks/descriptions.ts +190 -0
  356. package/extensions/tasks/index.ts +120 -41
  357. package/extensions/tasks/store.ts +83 -16
  358. package/extensions/tool-call-corruption/child.ts +7 -0
  359. package/extensions/tool-call-corruption/index.ts +237 -0
  360. package/extensions/tool-search/announce.ts +16 -0
  361. package/extensions/tool-search/index.ts +189 -41
  362. package/extensions/tool-style/index.ts +68 -10
  363. package/extensions/tool-style/write-description.ts +40 -0
  364. package/extensions/tool-style/write-render.ts +237 -0
  365. package/extensions/turn-duration/index.ts +7 -3
  366. package/extensions/turn-duration/line.ts +47 -4
  367. package/extensions/web/backends.ts +6 -9
  368. package/extensions/web/description.ts +50 -0
  369. package/extensions/web/index.ts +118 -53
  370. package/extensions/web/native-call.ts +15 -0
  371. package/extensions/web/native-results.ts +41 -0
  372. package/extensions/web-fetch/description.ts +42 -0
  373. package/extensions/web-fetch/extract.ts +53 -6
  374. package/extensions/web-fetch/index.ts +125 -76
  375. package/extensions/web-fetch/page-content.ts +19 -0
  376. package/extensions/web-fetch/response.ts +49 -0
  377. package/extensions/web-fetch/summarize.ts +9 -10
  378. package/extensions/workflow/agent-session.ts +105 -18
  379. package/extensions/workflow/args.ts +24 -0
  380. package/extensions/workflow/description.ts +67 -0
  381. package/extensions/workflow/globals.ts +17 -3
  382. package/extensions/workflow/index.ts +145 -162
  383. package/extensions/workflow/records.ts +1 -0
  384. package/extensions/workflow/run-manager.ts +29 -6
  385. package/extensions/workflow/saved-workflows.ts +3 -2
  386. package/extensions/workflow/types.ts +22 -1
  387. package/extensions/workflow/viewer.ts +54 -24
  388. package/extensions/workflow/widget.ts +20 -0
  389. package/extensions/worktree/descriptions.ts +91 -0
  390. package/extensions/worktree/guards.ts +316 -54
  391. package/extensions/worktree/index.ts +121 -39
  392. package/extensions/worktree/powershell-guards.ts +167 -0
  393. package/extensions/worktree/rewrite.ts +14 -16
  394. package/package.json +19 -7
  395. package/skills/artifact-design/SKILL.md +85 -0
  396. package/skills/code-review/SKILL.md +20 -20
  397. package/skills/code-review/cells/arguments-and-flags.md +19 -0
  398. package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
  399. package/skills/code-review/cells/high-8-inline.md +122 -0
  400. package/skills/code-review/cells/low-1-pass-max4.md +27 -0
  401. package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
  402. package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
  403. package/skills/code-review/cells/medium-3x5-verify.md +132 -0
  404. package/skills/code-review/cells/minimal-prompt.md +32 -0
  405. package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
  406. package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
  407. package/skills/fewer-permission-prompts/SKILL.md +1 -1
  408. package/skills/loop/SKILL.md +11 -0
  409. package/skills/security-review/SKILL.md +2 -5
  410. package/skills/simplify/SKILL.md +7 -5
  411. package/skills/workflow-authoring/SKILL.md +143 -0
  412. package/themes/onecode-light.json +1 -1
  413. package/themes/onecode.json +1 -1
  414. package/types/app.d.ts +58 -0
  415. package/types/community-packages.d.ts +26 -1
  416. package/extensions/auto-mode/recoverability.ts +0 -229
  417. package/extensions/lib/capability-index.ts +0 -466
  418. package/extensions/lib/model-facts.generated.json +0 -2675
  419. package/extensions/lib/model-facts.ts +0 -162
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * effort extension — Claude Code's `/effort`, including the `ultracode` stop.
3
3
  *
4
+ * Interactive low/medium/high/xhigh choices persist per model in pi's own
5
+ * settings (`modelThinkingLevels`); max and ultracode stay session-only. pi
6
+ * restores the saved level natively, so launch overrides and resume still win.
7
+ *
4
8
  * Reasoning effort is pi's thinking level under another name, and shift+tab
5
9
  * already cycles it. pi reserves that key (`app.thinking.cycle` is on its
6
10
  * RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS list, so `registerShortcut` on
@@ -17,9 +21,11 @@
17
21
  * same shape the permissions extension uses for plan mode.
18
22
  */
19
23
 
24
+ import { join } from "node:path";
20
25
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
21
26
  import { getSupportedThinkingLevels } from "@earendil-works/pi-ai/compat";
22
- import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
27
+ import { getAgentDir, SettingsManager, type ExtensionAPI, type ExtensionContext } from "@earendil-works/pi-coding-agent";
28
+ import { effortSetMessage, isPersistedEffort, type PersistedEffort } from "./settings.ts";
23
29
  import { REMINDER_CHANNEL } from "../lib/reminders.ts";
24
30
  import { dimRightAlignedWidget, safeThemePaint, truncateLine } from "../lib/tui-render.ts";
25
31
  import {
@@ -43,6 +49,8 @@ import {
43
49
  ULTRACODE_STATUS_KEY,
44
50
  } from "./slider.ts";
45
51
  import { registerLocalCommand } from "../lib/local-command.ts";
52
+ import { panelUi } from "../lib/panel-focus.ts";
53
+ import { extendingCompletions } from "../lib/argument-hints.ts";
46
54
 
47
55
  /** The levels pi says the active model can reach; the full ladder when unknown. */
48
56
  function supportedLevels(ctx: ExtensionContext): ThinkingLevel[] {
@@ -126,8 +134,28 @@ export default function effortExtension(pi: ExtensionAPI) {
126
134
  }
127
135
  };
128
136
 
137
+ const canPersist = (ctx: ExtensionContext) => ctx.hasUI && (ctx.mode === "tui" || ctx.mode === "rpc") && !!ctx.model;
138
+ /** Through pi's own settings writer: its key format, file lock and merge of changed fields. */
139
+ const persist = async (ctx: ExtensionContext, level: PersistedEffort | undefined): Promise<string | undefined> => {
140
+ const settings = SettingsManager.create(ctx.cwd, getAgentDir());
141
+ const loadError = settings.drainErrors().find((entry) => entry.scope === "global");
142
+ // An unreadable file would be rewritten from empty settings; leave it for the user.
143
+ if (loadError) return `Failed to set effort level: ${loadError.error.message}`;
144
+ if (level === undefined) settings.removeModelThinkingLevel(ctx.model!.provider, ctx.model!.id);
145
+ else settings.setModelThinkingLevel(ctx.model!.provider, ctx.model!.id, level);
146
+ await settings.flush();
147
+ const writeError = settings.drainErrors()[0];
148
+ if (writeError) return `Failed to set effort level: ${writeError.error.message}`;
149
+ };
150
+ const report = (ctx: ExtensionContext, message: string, error = false) => {
151
+ ctx.ui.notify(message, error ? "error" : "info");
152
+ return message;
153
+ };
154
+
129
155
  /** Apply a chosen stop and report what actually took effect. */
130
- const applyChoice = (choice: EffortChoice, ctx: ExtensionContext) => {
156
+ const applyChoice = async (choice: EffortChoice, ctx: ExtensionContext, asDefault = true): Promise<string> => {
157
+ const wasUltracode = ultracodeActive;
158
+ const previous = pi.getThinkingLevel();
131
159
  const wanted = thinkingLevelFor(choice);
132
160
  pi.setThinkingLevel(wanted);
133
161
  const actual = pi.getThinkingLevel();
@@ -144,13 +172,25 @@ export default function effortExtension(pi: ExtensionAPI) {
144
172
  const cappedDown = ar >= 0 && wr >= 0 && ar < wr;
145
173
  const note = cappedDown ? ` (${modelLabel(ctx)} tops out at ${actual})` : "";
146
174
  if (choice === ULTRACODE) {
147
- ctx.ui.notify(`Effort: ultracode — ${actual} reasoning, workflows armed every turn${note}`, "info");
148
- } else {
149
- ctx.ui.notify(`Effort: ${actual}${note}`, "info");
175
+ return report(ctx, `Effort: ultracode — ${actual} reasoning, workflows armed every turn${note}`);
150
176
  }
177
+ const saved = asDefault && canPersist(ctx) && isPersistedEffort(choice) && actual === wanted;
178
+ if (saved) {
179
+ const error = await persist(ctx, choice);
180
+ if (error) {
181
+ // Claude Code changes nothing when the save fails.
182
+ pi.setThinkingLevel(previous);
183
+ setUltracode(wasUltracode, previous);
184
+ applyStatus(ctx);
185
+ showEffortNote(ctx, previous);
186
+ return report(ctx, error, true);
187
+ }
188
+ }
189
+ if (isPersistedEffort(actual) || actual === "max") return report(ctx, `${effortSetMessage(actual, saved)}${wasUltracode ? " · Ultracode off" : ""}`);
190
+ return report(ctx, `Effort: ${actual}${note}`);
151
191
  };
152
192
 
153
- const showSlider = async (ctx: ExtensionContext): Promise<void> => {
193
+ const showSlider = async (ctx: ExtensionContext): Promise<string | void> => {
154
194
  const supported = supportedLevels(ctx);
155
195
  if (!supported.some((level) => level !== "off")) {
156
196
  ctx.ui.notify(`${modelLabel(ctx)} doesn't support reasoning effort.`, "info");
@@ -165,7 +205,7 @@ export default function effortExtension(pi: ExtensionAPI) {
165
205
  index = nearestEnabled(index, enabled);
166
206
 
167
207
  const label = modelLabel(ctx);
168
- const chosen = await ctx.ui.custom<EffortChoice | null>((tui, theme, _keybindings, done) => {
208
+ const chosen = await panelUi(pi.events, ctx.ui).custom<{ choice: EffortChoice; asDefault: boolean } | null>((tui, theme, _keybindings, done) => {
169
209
  const paint = safeThemePaint(theme);
170
210
  return {
171
211
  // The slider's own layout is column-safe for its ASCII labels, but this
@@ -180,8 +220,8 @@ export default function effortExtension(pi: ExtensionAPI) {
180
220
  done(null);
181
221
  return;
182
222
  }
183
- if (key === "confirm") {
184
- done(EFFORT_CHOICES[index]);
223
+ if (key === "confirm" || key === "session") {
224
+ done({ choice: EFFORT_CHOICES[index], asDefault: key === "confirm" });
185
225
  return;
186
226
  }
187
227
  index = moveIndex(index, key, enabled);
@@ -191,18 +231,32 @@ export default function effortExtension(pi: ExtensionAPI) {
191
231
  };
192
232
  });
193
233
 
194
- if (chosen) applyChoice(chosen, ctx);
234
+ if (!chosen) return "Cancelled";
235
+ return applyChoice(chosen.choice, ctx, chosen.asDefault);
195
236
  };
196
237
 
197
238
  registerLocalCommand(pi, "effort", {
198
- description: `Set reasoning effort (shift+tab cycles the plain levels): /effort [${EFFORT_CHOICES.join("|")}] — ultracode is ${ULTRACODE_LEVEL} + workflows`,
199
- getArgumentCompletions: (prefix) => {
200
- const matches = acceptedEffortArgs().filter((value) => value.startsWith(prefix.trim().toLowerCase()));
201
- return matches.length ? matches.map((value) => ({ value, label: value })) : null;
202
- },
239
+ description: `Set reasoning effort (shift+tab cycles the plain levels): /effort [${EFFORT_CHOICES.join("|")}|auto] — ultracode is ${ULTRACODE_LEVEL} + workflows`,
240
+ argumentHint: `[${EFFORT_CHOICES.join("|")}|auto]`,
241
+ reportsResult: true,
242
+ getArgumentCompletions: (prefix) => extendingCompletions(prefix, [...acceptedEffortArgs(), "auto", "unset"].map((value) => ({ value, label: value }))),
203
243
  handler: async (args, ctx) => {
204
244
  const typed = args.trim();
205
245
  if (typed) {
246
+ if (typed.toLowerCase() === "auto" || typed.toLowerCase() === "unset") {
247
+ // Clear the saved level first: a failed save changes nothing.
248
+ const saved = canPersist(ctx);
249
+ if (saved) {
250
+ const error = await persist(ctx, undefined);
251
+ if (error) return report(ctx, error, true);
252
+ }
253
+ // getSettings arrived in pi 1.0.1; the package still admits older pi.
254
+ pi.setThinkingLevel(pi.getSettings?.().defaultThinkingLevel ?? "medium");
255
+ setUltracode(false);
256
+ applyStatus(ctx);
257
+ showEffortNote(ctx, pi.getThinkingLevel());
258
+ return report(ctx, `Effort level set to auto${saved ? "" : " (this session only)"}`);
259
+ }
206
260
  const parsed = parseEffortArg(typed);
207
261
  if (!parsed) {
208
262
  ctx.ui.notify(`Unknown effort "${typed}". Use one of: ${acceptedEffortArgs().join(", ")}`, "error");
@@ -220,20 +274,19 @@ export default function effortExtension(pi: ExtensionAPI) {
220
274
  return;
221
275
  }
222
276
  }
223
- applyChoice(parsed, ctx);
224
- return;
277
+ return applyChoice(parsed, ctx);
225
278
  }
226
279
 
227
280
  // The picker needs focus and a terminal; elsewhere say what to type.
228
281
  if (!ctx.hasUI || ctx.mode !== "tui") {
229
282
  ctx.ui.notify(
230
283
  `Current effort: ${ultracodeActive ? `ultracode (${pi.getThinkingLevel()} + workflows)` : pi.getThinkingLevel()}. ` +
231
- `Set one with /effort <${acceptedEffortArgs().join("|")}>.`,
284
+ `Set one with /effort <${acceptedEffortArgs().join("|")}|auto>.`,
232
285
  "info",
233
286
  );
234
287
  return;
235
288
  }
236
- await showSlider(ctx);
289
+ return await showSlider(ctx);
237
290
  },
238
291
  });
239
292
 
@@ -0,0 +1,21 @@
1
+ /** Which effort levels are saved, and the result text (pure, no pi imports). */
2
+
3
+ const PERSISTED_LEVELS = ["low", "medium", "high", "xhigh"] as const;
4
+ export type PersistedEffort = (typeof PERSISTED_LEVELS)[number];
5
+
6
+ export function isPersistedEffort(level: string): level is PersistedEffort {
7
+ return (PERSISTED_LEVELS as readonly string[]).includes(level);
8
+ }
9
+
10
+ const DESCRIPTIONS: Record<string, string> = {
11
+ low: "Quick, straightforward implementation with minimal overhead",
12
+ medium: "Balanced approach with standard implementation and testing",
13
+ high: "Comprehensive implementation with extensive testing and documentation",
14
+ xhigh: "Deeper reasoning than high, just below maximum (on supported models)",
15
+ max: "Maximum capability with deepest reasoning. May use excessive tokens resulting in long response times or overthinking. Use sparingly for the hardest tasks.",
16
+ };
17
+
18
+ /** The ordinary local response, without organization or environment overrides. */
19
+ export function effortSetMessage(level: PersistedEffort | "max", saved: boolean): string {
20
+ return `Set effort level to ${level} (${saved ? "saved as your default for new sessions" : "this session only"}): ${DESCRIPTIONS[level]}`;
21
+ }
@@ -18,6 +18,7 @@
18
18
  */
19
19
 
20
20
  import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
21
+ import { keyId, keyText } from "../lib/key-input.ts";
21
22
 
22
23
  /** The final stop on the track: top reasoning + workflows armed every turn. */
23
24
  export const ULTRACODE = "ultracode";
@@ -73,35 +74,38 @@ export function choiceForState(level: ThinkingLevel | undefined, ultracodeActive
73
74
  return "medium";
74
75
  }
75
76
 
76
- export type SliderKey = "left" | "right" | "first" | "last" | "confirm" | "cancel";
77
+ export type SliderKey = "left" | "right" | "first" | "last" | "confirm" | "session" | "cancel";
77
78
 
78
79
  /**
79
80
  * Decode a raw terminal chunk. `Component.handleInput` hands over bytes, not key
80
- * names, so the sequences are matched directly: CSI C/D for arrows (plus the
81
- * older SS3 form some terminals still send), CR/LF to confirm, ESC to cancel.
81
+ * names; `lib/key-input.ts` names them, so every terminal encoding of a key
82
+ * (legacy, kitty, modifyOtherKeys) decodes alike.
82
83
  */
83
84
  export function decodeKey(data: string): SliderKey | undefined {
84
- switch (data) {
85
- case "\x1b[C":
86
- case "\x1bOC":
87
- case "l":
85
+ switch (keyId(data)) {
86
+ case "right":
88
87
  return "right";
89
- case "\x1b[D":
90
- case "\x1bOD":
91
- case "h":
88
+ case "left":
92
89
  return "left";
93
- case "\x1b[H":
94
- case "\x1b[1~":
90
+ case "home":
95
91
  return "first";
96
- case "\x1b[F":
97
- case "\x1b[4~":
92
+ case "end":
98
93
  return "last";
99
- case "\r":
100
- case "\n":
94
+ case "enter":
101
95
  return "confirm";
102
- case "\x1b":
103
- case "\x03": // ctrl+c — same intent as escape while a picker is focused
96
+ case "escape":
97
+ case "ctrl+c": // same intent as escape while a picker is focused
104
98
  return "cancel";
99
+ default:
100
+ break;
101
+ }
102
+ switch (keyText(data)) {
103
+ case "s":
104
+ return "session";
105
+ case "l":
106
+ return "right";
107
+ case "h":
108
+ return "left";
105
109
  default:
106
110
  return undefined;
107
111
  }
@@ -178,10 +182,10 @@ export interface SliderView {
178
182
  }
179
183
 
180
184
  const TITLE = "Effort";
181
- const HINTS = "←/→ or h/l adjust · Enter confirm · Esc cancel · shift+tab cycles the plain levels";
185
+ const HINTS = "←/→ or h/l adjust · Enter confirm · s for this session only · Esc cancel · shift+tab cycles the plain levels";
182
186
  /** Anthropic's cache hierarchy: a thinking/effort change invalidates the message cache once (CACHE-REVIEW-2026-09-04 M4). */
183
187
  const CACHE_NOTE = "changing effort re-caches the conversation (one uncached request)";
184
- const SHORT_HINTS = "←/→ h/l · Enter · Esc";
188
+ const SHORT_HINTS = "←/→ h/l · Enter · s · Esc";
185
189
  const ULTRACODE_SUBTITLE = `${ULTRACODE_LEVEL} + workflows`;
186
190
 
187
191
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * exit extension — Claude Code's `/exit`.
2
+ * exit extension — Claude Code's `/exit` and one-shot failure status.
3
3
  *
4
4
  * pi's built-in quit command is `/quit`; Claude Code's is `/exit` (with `quit`
5
5
  * shown as an alias). A user coming from Claude Code types `/exit` out of habit
@@ -17,8 +17,39 @@
17
17
  */
18
18
 
19
19
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
20
+ import { ONE_SHOT_COMMAND_FAILED_CHANNEL, type RunOutcome, RunOutcomeLatch, TURN_FAILED_CHANNEL } from "../lib/interrupt.ts";
20
21
 
21
22
  export default function exitExtension(pi: ExtensionAPI) {
23
+ const outcome = new RunOutcomeLatch();
24
+ let settled: RunOutcome | undefined;
25
+ // The harness stopped the turn in progress: its run ends "aborted", which
26
+ // must not read as a user cancel when the turn settles.
27
+ let turnFailed = false;
28
+ pi.on("agent_end", (event, ctx) => {
29
+ outcome.record(event.messages, ctx.signal?.aborted);
30
+ });
31
+ pi.on("agent_settled", () => {
32
+ const run = outcome.take();
33
+ settled = turnFailed ? "error" : run ?? settled;
34
+ turnFailed = false;
35
+ });
36
+ pi.events.on(ONE_SHOT_COMMAND_FAILED_CHANNEL, () => {
37
+ settled = "error";
38
+ });
39
+ pi.events.on(TURN_FAILED_CHANNEL, () => {
40
+ turnFailed = true;
41
+ });
42
+ pi.on("session_shutdown", (event, ctx) => {
43
+ if (ctx.mode !== "print" && ctx.mode !== "json") return;
44
+ if (event.reason !== "quit" || (settled !== "error" && !turnFailed)) return;
45
+ // pi 1.0.1 checks provider errors for text output, but not JSON. A print
46
+ // run may submit several prompts or replace the session (/clear), so a
47
+ // settled turn is not yet the process's final outcome. Commit only at
48
+ // final disposal, after retries/compaction and every prompt. main preserves
49
+ // this code when runPrintMode returns zero; never clear another failure.
50
+ if (process.exitCode === undefined || Number(process.exitCode) === 0) process.exitCode = 1;
51
+ });
52
+
22
53
  pi.registerCommand("exit", {
23
54
  description: "Quit One Code (same as /quit)",
24
55
  handler: async (_args, ctx) => {