one-code-extension 0.4.1 → 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 +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 +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 +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 +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 +18 -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
@@ -3,14 +3,19 @@
3
3
  *
4
4
  * pi's editor has no prompt marker and no option for one, but `CustomEditor` is
5
5
  * the sanctioned base for a replacement (it already wires every app keybinding
6
- * through handleInput, which we leave untouched). We only reserve a two-column
7
- * left gutter and paint the marker into it — see prompt-marker.ts for why that
8
- * is cursor-safe. Registered via `ctx.ui.setEditorComponent`; this file is thin
6
+ * through handleInput). We reserve a two-column left gutter and paint the
7
+ * marker into it — see prompt-marker.ts for why that is cursor-safe — draw a
8
+ * slash command's argument hint after the cursor (lib/argument-hints.ts), and
9
+ * let ↑ restore queued messages through pi's dequeue action (queued-edit.ts). Registered via `ctx.ui.setEditorComponent`; this file is thin
9
10
  * wiring over the pure `applyPromptMarker`.
10
11
  */
11
12
 
12
13
  import { CustomEditor } from "@earendil-works/pi-coding-agent";
14
+ import { applyBorderBadge, fitBadge } from "../lib/agent-view.ts";
15
+ import { applyArgumentHint } from "../lib/argument-hints.ts";
16
+ import { visibleWidth } from "../lib/text-width.ts";
13
17
  import { applyPromptMarker } from "./prompt-marker.ts";
18
+ import { upEditsQueue } from "./queued-edit.ts";
14
19
 
15
20
  /** Width of the left gutter, and therefore the visible width the marker must fill. */
16
21
  export const PROMPT_PADDING = 2;
@@ -20,10 +25,45 @@ type EditorArgs = ConstructorParameters<typeof CustomEditor>;
20
25
  export class PromptEditor extends CustomEditor {
21
26
  /** Re-read per render so the marker follows live theme changes. */
22
27
  #renderMarker: () => string;
28
+ /** The painted argument placeholder for the current input, if it is a hinted command. */
29
+ #renderHint: (text: string) => string | undefined;
30
+ /** The viewed agent's top-border label (plain text), or undefined on main (lib/agent-view.ts). */
31
+ #badge: () => string | undefined;
32
+ /** Paints the fitted badge label as a chip, one space of padding on each side. */
33
+ #paintBadge: (label: string) => string;
34
+ /** Whether a message waits in pi's queue mid-turn (queued-edit.ts). */
35
+ #queued: () => boolean;
36
+ #keys: EditorArgs[2];
37
+ /** The width pi wraps the text at, from the last render (pi's own formula). */
38
+ #layoutWidth = Number.POSITIVE_INFINITY;
23
39
 
24
- constructor(tui: EditorArgs[0], theme: EditorArgs[1], keybindings: EditorArgs[2], renderMarker: () => string) {
25
- super(tui, theme, keybindings, { paddingX: PROMPT_PADDING });
40
+ constructor(
41
+ tui: EditorArgs[0],
42
+ theme: EditorArgs[1],
43
+ keybindings: EditorArgs[2],
44
+ renderMarker: () => string,
45
+ renderHint: (text: string) => string | undefined = () => undefined,
46
+ badge: () => string | undefined = () => undefined,
47
+ paintBadge: (label: string) => string = (label) => label,
48
+ queued: () => boolean = () => false,
49
+ ) {
50
+ super(tui, theme, keybindings, { paddingX: PROMPT_PADDING, embedWorkingStatus: true });
26
51
  this.#renderMarker = renderMarker;
52
+ this.#renderHint = renderHint;
53
+ this.#badge = badge;
54
+ this.#paintBadge = paintBadge;
55
+ this.#queued = queued;
56
+ this.#keys = keybindings;
57
+ }
58
+
59
+ /** ↑ on the first line restores queued messages, as in Claude Code (queued-edit.ts). */
60
+ handleInput(data: string): void {
61
+ const dequeue = this.actionHandlers.get("app.message.dequeue");
62
+ if (dequeue && this.#keys.matches(data, "tui.editor.cursorUp") && upEditsQueue(this, this.#queued(), this.#layoutWidth)) {
63
+ dequeue();
64
+ return;
65
+ }
66
+ super.handleInput(data);
27
67
  }
28
68
 
29
69
  /**
@@ -37,6 +77,13 @@ export class PromptEditor extends CustomEditor {
37
77
  }
38
78
 
39
79
  render(width: number): string[] {
40
- return applyPromptMarker(super.render(width), PROMPT_PADDING, this.#renderMarker());
80
+ const paddingX = Math.min(PROMPT_PADDING, Math.max(0, Math.floor((width - 1) / 2)));
81
+ this.#layoutWidth = Math.max(1, width - paddingX * 2 - (paddingX ? 0 : 1));
82
+ let lines = applyPromptMarker(super.render(width), PROMPT_PADDING, this.#renderMarker());
83
+ const hint = this.#renderHint(this.getText());
84
+ if (hint) lines = applyArgumentHint(lines, hint);
85
+ const label = this.#badge();
86
+ const fitted = label ? fitBadge(label, width) : "";
87
+ return fitted ? applyBorderBadge(lines, this.#paintBadge(fitted), visibleWidth(fitted) + 2, this.borderColor("─")) : lines;
41
88
  }
42
89
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Claude Code's key for editing queued messages: plain ↑. With a message
3
+ * queued mid-turn, ↑ moves every queued message into the editor instead of
4
+ * walking history, but only with the cursor on the draft's first line (lower
5
+ * lines need ↑ to move the cursor) and no autocomplete list open (↑ moves in
6
+ * the list). pi binds the same restore only to alt+up, which not every
7
+ * terminal sends: macOS Terminal's terminfo (nsterm) maps option+left and
8
+ * option+right but no modified up arrow. Pure: `prompt-editor.ts` calls pi's
9
+ * own dequeue action, so the alt+up binding keeps working alongside.
10
+ */
11
+
12
+ import { visibleWidth } from "../lib/text-width.ts";
13
+
14
+ export interface QueueEditEditor {
15
+ getCursor(): { line: number; col: number };
16
+ getLines(): string[];
17
+ isShowingAutocomplete(): boolean;
18
+ }
19
+
20
+ /**
21
+ * Whether a plain ↑ restores the queued messages rather than reaching the
22
+ * editor. Only on a first line that fits one row of `layoutWidth`: pi's
23
+ * public API does not say which visual row the cursor is on, so on a wrapped
24
+ * first line ↑ is left to pi (it moves the cursor) and alt+up restores.
25
+ */
26
+ export function upEditsQueue(editor: QueueEditEditor, queued: boolean, layoutWidth: number): boolean {
27
+ if (!queued) return false;
28
+ if (editor.isShowingAutocomplete()) return false;
29
+ if (editor.getCursor().line !== 0) return false;
30
+ return visibleWidth(editor.getLines()[0] ?? "") <= layoutWidth;
31
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * pi 0.99's built-in tool search and MCP, at startup (lib/replaced-builtins.mjs
3
+ * has the rule; decisions/tools.md "pi's built-in tool search and MCP").
4
+ *
5
+ * On the user's own pi, while the user's settings leave a built-in on, One
6
+ * Code asks once whether to turn them off, explaining why. "Yes" writes the
7
+ * `-builtin:<name>` entries through pi's own SettingsManager (a locked write
8
+ * of the `extensions` field only, so pi's in-memory settings keep theirs).
9
+ * "No" is remembered in `~/.onecode/settings.json` and never asked again;
10
+ * Escape asks again next start. Without a yes, the one-line notice answers
11
+ * pi's warning instead. Under the bundled app, which turns them off itself,
12
+ * a built-in left on is the user's own `+` entry, so only the notice shows.
13
+ */
14
+
15
+ import os from "node:os";
16
+ import { type ExtensionContext, getAgentDir, SettingsManager, VERSION as PI_VERSION } from "@earendil-works/pi-coding-agent";
17
+ import { configCommand, installKind, replacedBuiltinsView } from "../doctor/builtins.ts";
18
+ import { tildify } from "../lib/paths.ts";
19
+ import { declined, recordDeclined } from "./declined.ts";
20
+ import { replacedBuiltinsNotice, TURN_OFF_NO, TURN_OFF_YES, turnOffPrompt, withBuiltinsTurnedOff } from "../lib/replaced-builtins.mjs";
21
+
22
+ /** `~/.onecode/settings.json` key: the user answered "No" to the question. */
23
+ export const DECLINED_KEY = "piBuiltinsTurnOffDeclined";
24
+
25
+ /** Ask, or show the notice, for the built-ins the settings leave on. Never throws. */
26
+ export async function handleReplacedBuiltins(ctx: ExtensionContext): Promise<void> {
27
+ try {
28
+ const cwd = ctx.cwd;
29
+ const agentDir = getAgentDir();
30
+ const settings = () => SettingsManager.create(cwd, agentDir);
31
+ const view = replacedBuiltinsView(PI_VERSION, settings, { agentDir, cwd });
32
+ if (!view || view.left.length === 0) return;
33
+ const install = installKind();
34
+ const command = configCommand(install);
35
+ const notice = () => {
36
+ const text = replacedBuiltinsNotice(view.left, command);
37
+ if (text) ctx.ui.notify(text, "info");
38
+ };
39
+ // Only the user's own file is ours to offer: a project's `+builtin` entry stays.
40
+ const userScoped = view.left.filter((builtin) => builtin.scope === "user");
41
+ if (install === "app" || !ctx.hasUI || userScoped.length === 0 || declined(DECLINED_KEY)) return notice();
42
+
43
+ const shown = tildify(view.paths.user, os.homedir());
44
+ const choice = await ctx.ui.select(turnOffPrompt(userScoped, shown, command), [TURN_OFF_YES, TURN_OFF_NO]);
45
+ if (choice === TURN_OFF_YES) {
46
+ const manager = settings();
47
+ manager.setExtensionPaths(withBuiltinsTurnedOff(manager.getGlobalSettings().extensions, userScoped.map((builtin) => builtin.name)) as string[]);
48
+ await manager.flush();
49
+ const turnedOff = `Turned off pi's built-in ${userScoped.map((builtin) => builtin.name).join(" and ")} in ${shown}.`;
50
+ // A project's `+builtin` entry still wins over the user's file, so its warning stays.
51
+ const projectScoped = view.left.filter((builtin) => builtin.scope === "project");
52
+ const rest =
53
+ projectScoped.length === 0
54
+ ? "pi's warnings stop from the next start."
55
+ : `This project's settings keep ${projectScoped.map((builtin) => builtin.name).join(" and ")} on, so pi still warns about ${projectScoped.length > 1 ? "them" : "it"}; run /doctor for that change.`;
56
+ ctx.ui.notify(`${turnedOff} ${rest}`, "info");
57
+ return;
58
+ }
59
+ if (choice === TURN_OFF_NO) recordDeclined(DECLINED_KEY);
60
+ notice();
61
+ } catch (error) {
62
+ try {
63
+ ctx.ui.notify(`Could not turn off pi's built-in tool search and MCP: ${(error as Error).message}. Run /doctor for the settings change.`, "warning");
64
+ } catch {
65
+ // The session ended while the dialog was open: nothing is left to tell.
66
+ }
67
+ }
68
+ }
@@ -2,8 +2,8 @@
2
2
  * Compact startup sections for the banner: Context, Skills, Themes.
3
3
  *
4
4
  * pi's own startup listing has no per-section switch — hiding the noisy
5
- * [Extensions] block (20 internal module names) means `quietStartup: true`,
6
- * which hides everything. So when quiet startup is on, the banner shows its
5
+ * [Extensions] block (20 internal module names) means `quietStartup`, which
6
+ * hides the whole listing. So when quiet startup is on, the banner shows its
7
7
  * own compact versions of the sections that ARE useful. pi's resourceLoader
8
8
  * is not exposed to extensions, so these are re-derived the same way our
9
9
  * other extensions derive them (claude-compat's skill dirs, pi's git-root
@@ -12,11 +12,14 @@
12
12
  * PI_CODING_AGENT_DIR isolation).
13
13
  */
14
14
 
15
- import { existsSync, readdirSync, readFileSync } from "node:fs";
16
- import { basename, dirname, join, relative } from "node:path";
17
- import { findGitRoot } from "../lib/git.ts";
15
+ import { existsSync, readdirSync } from "node:fs";
16
+ import { basename, join, relative } from "node:path";
17
+ import os from "node:os";
18
+ import { projectInstructionFiles } from "../lib/claude-context.ts";
19
+ import { projectConfigDir, userConfigDir } from "../lib/config-mode.ts";
20
+ import { BUNDLED_SKILLS_DIR, scanSkills } from "../lib/skill-scan.ts";
18
21
  import { defaultDiscoverRoots, discoverPlugins } from "../lib/plugins.ts";
19
- import { claudeUserDir } from "../lib/paths.ts";
22
+ import { oneCodeStateDir } from "../lib/paths.ts";
20
23
 
21
24
  export interface StartupSection {
22
25
  label: string;
@@ -25,69 +28,29 @@ export interface StartupSection {
25
28
 
26
29
  /**
27
30
  * The project context files One Code actually gathers, from cwd up to the git
28
- * root (or just cwd outside a repo), for the startup banner. Mirrors what the
29
- * blocks send: a directory's CLAUDE.md, or its AGENTS.md when it has no CLAUDE.md
30
- * (CLAUDE.md > AGENTS.md), plus CLAUDE.local.md and ONECODE.md when present — so
31
- * AGENTS.md is listed only when it's really in play, not whenever it exists.
31
+ * root (or just cwd outside a repo), nearest directory first, for the startup
32
+ * banner. The same discovery and rule the blocks use (lib/claude-context.ts),
33
+ * so an AGENTS.md is listed only when it is really in play.
32
34
  */
33
- export function contextFileNames(cwd: string): string[] {
34
- const stop = findGitRoot(cwd) ?? cwd;
35
- const found: string[] = [];
36
- let dir = cwd;
37
- while (true) {
38
- const rel = (name: string) => relative(cwd, join(dir, name)) || name;
39
- const present = (name: string) => existsSync(join(dir, name));
40
- // CLAUDE.md is primary; AGENTS.md stands in only when there is no CLAUDE.md.
41
- if (present("CLAUDE.md")) found.push(rel("CLAUDE.md"));
42
- else if (present("AGENTS.md")) found.push(rel("AGENTS.md"));
43
- if (present("CLAUDE.local.md")) found.push(rel("CLAUDE.local.md"));
44
- for (const name of ["ONECODE.md", "onecode.md", "One Code.md"]) {
45
- if (present(name)) {
46
- found.push(rel(name));
47
- break;
48
- }
49
- }
50
- if (dir === stop) break;
51
- const parent = dirname(dir);
52
- if (parent === dir) break;
53
- dir = parent;
54
- }
55
- return found;
35
+ export function contextFileNames(cwd: string, home: string = os.homedir()): string[] {
36
+ return projectInstructionFiles({ cwd, home, homeOneCodeDir: oneCodeStateDir(process.env, home) }).map((path) => relative(cwd, path) || basename(path));
56
37
  }
57
38
 
58
39
  /**
59
- * Skills across the same sources our extensions feed to pi: project/user
60
- * Claude Code dirs, pi's own user dir, and installed plugins. An entry counts
61
- * when <dir>/<name>/SKILL.md exists — existsSync follows symlinked skill
62
- * directories, which readdir's isDirectory() would miss.
40
+ * Skills across the same sources our extensions feed to pi (lib/skill-scan.ts
41
+ * scanSkills: pi's own user dir, the mode's skill folders, the bundled
42
+ * catalog, installed plugins), each name once: the set `/skills` lists and
43
+ * `/doctor` counts.
63
44
  */
64
- export function skillNames(cwd: string, home: string, agentDir: string): string[] {
65
- const dirs = [
66
- join(cwd, ".claude", "skills"),
67
- join(claudeUserDir(home), "skills"),
68
- join(agentDir, "skills"),
69
- ];
70
- const names = new Set<string>();
71
- for (const dir of dirs) {
72
- if (!existsSync(dir)) continue;
73
- try {
74
- for (const entry of readdirSync(dir)) {
75
- if (existsSync(join(dir, entry, "SKILL.md"))) names.add(entry);
76
- }
77
- } catch {
78
- // Unreadable dir: skip, same as pi would.
79
- }
80
- }
81
- for (const skill of discoverPlugins(defaultDiscoverRoots(agentDir, cwd, home)).skills) {
82
- names.add(skill.name);
83
- }
84
- return [...names].sort((a, b) => a.localeCompare(b));
45
+ export function skillNames(cwd: string, home: string, agentDir: string, bundledDir: string = BUNDLED_SKILLS_DIR): string[] {
46
+ const plugins = discoverPlugins(defaultDiscoverRoots(agentDir, cwd, home)).skills;
47
+ return [...new Set(scanSkills(cwd, home, agentDir, plugins, bundledDir).map((skill) => skill.name))].sort((a, b) => a.localeCompare(b));
85
48
  }
86
49
 
87
- /** Saved workflow names from the Claude Code layout dirs (project shadows user). */
50
+ /** Saved workflow names from the mode's workflow dirs (project shadows user). */
88
51
  export function workflowNames(cwd: string, home: string): string[] {
89
52
  const names = new Set<string>();
90
- for (const dir of [join(cwd, ".claude", "workflows"), join(claudeUserDir(home), "workflows")]) {
53
+ for (const dir of [join(projectConfigDir(cwd), "workflows"), join(userConfigDir(home), "workflows")]) {
91
54
  if (!existsSync(dir)) continue;
92
55
  try {
93
56
  for (const entry of readdirSync(dir)) {
@@ -146,20 +109,19 @@ export function shouldDefaultFlushOutputPad(settingsRaw: string | undefined): bo
146
109
  }
147
110
  }
148
111
 
149
- /** True when pi's own startup listing is silenced, so ours should render instead. */
150
- export function quietStartupEnabled(piSettingsPath: string): boolean {
151
- try {
152
- const settings = JSON.parse(readFileSync(piSettingsPath, "utf8"));
153
- return settings?.quietStartup === true;
154
- } catch {
155
- return false;
156
- }
112
+ /**
113
+ * True when pi's own startup listing is silenced, so ours should render instead:
114
+ * `quietStartup: true`, or pi 1.0's `"header"`, which keeps pi's header and
115
+ * still hides the listing. The caller supplies pi's effective, merged value.
116
+ */
117
+ export function quietStartupEnabled(value: unknown): boolean {
118
+ return value === true || value === "header";
157
119
  }
158
120
 
159
- export function collectStartupSections(cwd: string, home: string, packageThemesDir: string, agentDir: string): StartupSection[] {
121
+ export function collectStartupSections(cwd: string, home: string, packageThemesDir: string, agentDir: string, bundledSkillsDir: string = BUNDLED_SKILLS_DIR): StartupSection[] {
160
122
  const sections: StartupSection[] = [
161
- { label: "context", items: contextFileNames(cwd) },
162
- { label: "skills", items: skillNames(cwd, home, agentDir) },
123
+ { label: "context", items: contextFileNames(cwd, home) },
124
+ { label: "skills", items: skillNames(cwd, home, agentDir, bundledSkillsDir) },
163
125
  { label: "workflows", items: workflowNames(cwd, home) },
164
126
  { label: "themes", items: themeNames(packageThemesDir) },
165
127
  ];