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
@@ -2,17 +2,36 @@
2
2
  * MCP server configuration in Claude Code's format (pure).
3
3
  *
4
4
  * Sources, lowest to highest precedence:
5
+ * plugins' .mcp.json (bare server maps)
6
+ * pi.registerMcpServer() (servers other pi extensions register, pi 0.99+)
7
+ * <agentDir>/mcp.json (pi's own user file, ~/.pi/agent/mcp.json)
8
+ * <cwd>/.pi/mcp.json (pi's own project file)
5
9
  * ~/.claude.json (user, global)
6
10
  * <cwd>/.mcp.json (project, checked in — walked up to the repo root)
7
11
  * <cwd>/.claude/settings.local.json (project, personal)
8
12
  *
13
+ * Independent mode (lib/config-mode.ts) reads none of the three Claude Code
14
+ * files: plugins, registered servers and pi's two files only.
15
+ *
9
16
  * Every file holds an `mcpServers` object. A stdio server has `command` (plus
10
17
  * optional `args`, `env`); a remote one has `url` and optional `type`/`headers`.
18
+ *
19
+ * pi's two files are read because One Code's `/mcp` replaces pi 0.99's
20
+ * built-in MCP, which would otherwise have read them (decisions/mcp.md). Their
21
+ * format is pi's: `enabled: false` turns a server off, a stdio server may set
22
+ * `cwd` (relative to the session directory), and a leading `~/` in `command`,
23
+ * an argument or `cwd` names the home directory. A server with a `!command`
24
+ * value in `env` or `headers` is skipped with a note: running a shell command
25
+ * from a config file to build a credential is not supported. pi's
26
+ * `oauth`/`auth` settings, `exposure`, `timeout` and `description` are
27
+ * ignored. A Claude Code file's server of the same name wins, with a note.
11
28
  */
12
29
 
13
30
  import { existsSync, readFileSync } from "node:fs";
14
- import { dirname, join } from "node:path";
15
- import { claudeJsonPath } from "../lib/paths.ts";
31
+ import { dirname, join, resolve } from "node:path";
32
+ import { claudeSourcesOn } from "../lib/config-mode.ts";
33
+ import { claudeJsonPath, expandTilde } from "../lib/paths.ts";
34
+ import { hashServerConfig } from "./trust.ts";
16
35
 
17
36
  export interface StdioServer {
18
37
  kind: "stdio";
@@ -20,7 +39,11 @@ export interface StdioServer {
20
39
  command: string;
21
40
  args: string[];
22
41
  env?: Record<string, string>;
42
+ /** Working directory (pi's `mcp.json` only); the session's directory when absent. */
43
+ cwd?: string;
23
44
  source: string;
45
+ /** Set for a server read in pi's format: which of pi's sources defined it. */
46
+ piOrigin?: PiOrigin;
24
47
  /** Config referenced these environment variables and they are not set. */
25
48
  missingEnv?: string[];
26
49
  /** Every env var the config references (set or not), for the consent dialog — values are expanded away by parse time. */
@@ -29,10 +52,13 @@ export interface StdioServer {
29
52
 
30
53
  export interface HttpServer {
31
54
  kind: "http";
55
+ /** Legacy HTTP+SSE when explicitly configured; otherwise Streamable HTTP. */
56
+ transport?: "sse";
32
57
  name: string;
33
58
  url: string;
34
59
  headers?: Record<string, string>;
35
60
  source: string;
61
+ piOrigin?: PiOrigin;
36
62
  /** Config referenced these environment variables and they are not set. */
37
63
  missingEnv?: string[];
38
64
  /** Every env var the config references (set or not), for the consent dialog — values are expanded away by parse time. */
@@ -41,6 +67,9 @@ export interface HttpServer {
41
67
 
42
68
  export type McpServer = StdioServer | HttpServer;
43
69
 
70
+ /** pi's user `mcp.json`, its project `mcp.json`, or an extension's `pi.registerMcpServer()`. */
71
+ export type PiOrigin = "user" | "project" | "extension";
72
+
44
73
  interface RawServer {
45
74
  command?: unknown;
46
75
  args?: unknown;
@@ -49,6 +78,26 @@ interface RawServer {
49
78
  type?: unknown;
50
79
  headers?: unknown;
51
80
  disabled?: unknown;
81
+ /** pi's `mcp.json`: `false` keeps the entry without connecting. */
82
+ enabled?: unknown;
83
+ /** pi's `mcp.json`: a stdio server's working directory. */
84
+ cwd?: unknown;
85
+ }
86
+
87
+ /** How to read a server from one of pi's own `mcp.json` files. */
88
+ export interface PiFormat {
89
+ home: string;
90
+ /** The session directory a relative `cwd` resolves against. */
91
+ cwd: string;
92
+ }
93
+
94
+ /**
95
+ * Why a pi-format server cannot be loaded, or undefined: a `!command` value
96
+ * in `env` or `headers` (pi runs it in a shell to build the value).
97
+ */
98
+ export function piFormatProblem(raw: RawServer): string | undefined {
99
+ const values = [...Object.values(asStringRecord(raw.env) ?? {}), ...Object.values(asStringRecord(raw.headers) ?? {})];
100
+ return values.some((value) => value.startsWith("!")) ? "a `!command` value in env or headers is not supported" : undefined;
52
101
  }
53
102
 
54
103
  function asStringRecord(value: unknown): Record<string, string> | undefined {
@@ -100,8 +149,11 @@ export function parseServer(
100
149
  raw: RawServer,
101
150
  source: string,
102
151
  env: Record<string, string | undefined>,
152
+ pi?: PiFormat,
103
153
  ): McpServer | undefined {
104
154
  if (raw.disabled === true) return undefined;
155
+ if (pi && raw.enabled === false) return undefined;
156
+ const home = (value: string) => (pi ? expandTilde(value, pi.home) : value);
105
157
 
106
158
  if (typeof raw.url === "string" && raw.url.trim()) {
107
159
  const headers = asStringRecord(raw.headers);
@@ -112,6 +164,7 @@ export function parseServer(
112
164
  const referenced = referencedEnvVars(raw.url, ...Object.values(headers ?? {}));
113
165
  return {
114
166
  kind: "http",
167
+ ...(raw.type === "sse" ? { transport: "sse" as const } : {}),
115
168
  name,
116
169
  url: expandEnv(raw.url, env),
117
170
  headers: headers
@@ -125,11 +178,14 @@ export function parseServer(
125
178
 
126
179
  if (typeof raw.command === "string" && raw.command.trim()) {
127
180
  const args = Array.isArray(raw.args)
128
- ? raw.args.filter((a): a is string => typeof a === "string").map((a) => expandEnv(a, env))
181
+ ? raw.args.filter((a): a is string => typeof a === "string").map((a) => home(expandEnv(a, env)))
129
182
  : [];
183
+ const rawCwd = pi && typeof raw.cwd === "string" && raw.cwd.trim() ? raw.cwd : undefined;
184
+ const cwd = rawCwd && pi ? resolve(pi.cwd, home(expandEnv(rawCwd, env))) : undefined;
130
185
  const rawEnv = asStringRecord(raw.env);
131
186
  const missing = [
132
187
  ...missingEnvVars(raw.command, env),
188
+ ...missingEnvVars(rawCwd ?? "", env),
133
189
  ...(Array.isArray(raw.args) ? raw.args : [])
134
190
  .filter((a): a is string => typeof a === "string")
135
191
  .flatMap((a) => missingEnvVars(a, env)),
@@ -137,15 +193,17 @@ export function parseServer(
137
193
  ];
138
194
  const referenced = referencedEnvVars(
139
195
  raw.command,
196
+ rawCwd ?? "",
140
197
  ...(Array.isArray(raw.args) ? raw.args.filter((a): a is string => typeof a === "string") : []),
141
198
  ...Object.values(rawEnv ?? {}),
142
199
  );
143
200
  return {
144
201
  kind: "stdio",
145
202
  name,
146
- command: expandEnv(raw.command, env),
203
+ command: home(expandEnv(raw.command, env)),
147
204
  args,
148
205
  env: rawEnv ? Object.fromEntries(Object.entries(rawEnv).map(([k, v]) => [k, expandEnv(v, env)])) : undefined,
206
+ ...(cwd ? { cwd } : {}),
149
207
  source,
150
208
  missingEnv: missing.length > 0 ? [...new Set(missing)] : undefined,
151
209
  referencedEnv: referenced.length > 0 ? referenced : undefined,
@@ -171,7 +229,29 @@ export function findProjectConfigs(cwd: string): string[] {
171
229
  return found.reverse();
172
230
  }
173
231
 
232
+ /**
233
+ * `/mcp` with no servers: where to look when that is unexpected (`/doctor`
234
+ * lists config files that failed validation) and where servers go, by mode.
235
+ * Claude Code names its own CLI and docs here; One Code names its own.
236
+ */
237
+ export const MCP_GUIDE_URL = "https://github.com/IsuruMaduranga/one-code/blob/master/docs/guide/skills-plugins-and-mcp.md#mcp-servers";
238
+ export function noMcpServersMessage(claudeSources: boolean): string {
239
+ const where = claudeSources ? ".mcp.json in the project, ~/.claude.json, .pi/mcp.json or the agent dir's mcp.json" : ".pi/mcp.json or the agent dir's mcp.json";
240
+ return `No MCP servers configured. Run /doctor if this is unexpected — it lists MCP config files that failed validation. Otherwise, add servers to ${where}; see ${MCP_GUIDE_URL} to learn more.`;
241
+ }
242
+
243
+ /**
244
+ * pi's own `mcp.json` files: the agent dir's and the project's. `configDirName`
245
+ * is pi's `CONFIG_DIR_NAME` (`.pi` unless pi itself is rebranded); callers
246
+ * that import pi pass it.
247
+ */
248
+ export function piMcpConfigPaths(agentDir: string, cwd: string, configDirName = ".pi"): { user: string; project: string } {
249
+ return { user: join(agentDir, "mcp.json"), project: join(cwd, configDirName, "mcp.json") };
250
+ }
251
+
252
+ /** Claude Code's MCP files; none in independent mode (lib/config-mode.ts), where pi's two `mcp.json` files remain. */
174
253
  export function configPaths(cwd: string, home: string): string[] {
254
+ if (!claudeSourcesOn()) return [];
175
255
  return [claudeJsonPath(home), ...findProjectConfigs(cwd), join(cwd, ".claude", "settings.local.json")];
176
256
  }
177
257
 
@@ -196,6 +276,25 @@ export interface LoadServersOptions {
196
276
  pluginNames?: ReadonlyMap<string, string>;
197
277
  /** Called for a config file that exists but is not valid JSON (review M11: a silent drop read as "no servers configured"). */
198
278
  onError?: (path: string, message: string) => void;
279
+ /** pi's own `mcp.json` files (user, then project): read in pi's format, below every Claude Code file. */
280
+ piConfigs?: { user: string; project: string };
281
+ /** Called for a pi-format server that is skipped, or overridden by a Claude Code file's server of the same name. */
282
+ onNote?: (message: string) => void;
283
+ /** Servers other pi extensions registered (`pi.getMcpServers()`): pi's format, below every file; `source` is the extension's path. */
284
+ registered?: readonly RegisteredServer[];
285
+ }
286
+
287
+ /** One `pi.getMcpServers()` entry, structurally (pi 0.99's `RegisteredMcpServer`). */
288
+ export interface RegisteredServer {
289
+ name: string;
290
+ config: unknown;
291
+ extensionPath: string;
292
+ }
293
+
294
+ /** The servers other extensions registered (`pi.getMcpServers()`, pi 0.99+); none on an older pi. */
295
+ export function registeredMcpServers(pi: object): RegisteredServer[] {
296
+ const host = pi as { getMcpServers?: () => RegisteredServer[] };
297
+ return typeof host.getMcpServers === "function" ? host.getMcpServers() : [];
199
298
  }
200
299
 
201
300
  export function loadServers(
@@ -206,8 +305,21 @@ export function loadServers(
206
305
  options: LoadServersOptions = {},
207
306
  ): McpServer[] {
208
307
  const byName = new Map<string, McpServer>();
209
- // Plugin configs come first so project and user files can override them.
210
- for (const path of [...extraPaths, ...configPaths(cwd, home)]) {
308
+ const piPaths = options.piConfigs ? [options.piConfigs.user, options.piConfigs.project] : [];
309
+ const piFormat: PiFormat = { home, cwd };
310
+ for (const { name, config, extensionPath } of options.registered ?? []) {
311
+ const raw = (config && typeof config === "object" ? config : {}) as RawServer;
312
+ const problem = piFormatProblem(raw);
313
+ if (problem) {
314
+ options.onNote?.(`MCP server "${name}" registered by ${extensionPath} is skipped: ${problem}.`);
315
+ continue;
316
+ }
317
+ const server = parseServer(name, raw, extensionPath, env, piFormat);
318
+ if (server) byName.set(name, { ...server, piOrigin: "extension" });
319
+ }
320
+ // Plugin configs come first so project and user files can override them,
321
+ // then pi's own files, then Claude Code's.
322
+ for (const path of [...extraPaths, ...piPaths, ...configPaths(cwd, home)]) {
211
323
  if (!existsSync(path)) continue;
212
324
  let file: Record<string, unknown> | undefined;
213
325
  try {
@@ -219,10 +331,22 @@ export function loadServers(
219
331
  const servers = serverMapOf(file);
220
332
  if (!servers) continue;
221
333
  const plugin = options.pluginNames?.get(path);
334
+ const piOrigin: PiOrigin | undefined =
335
+ path === options.piConfigs?.user ? "user" : path === options.piConfigs?.project ? "project" : undefined;
222
336
  for (const [rawName, raw] of Object.entries(servers)) {
223
337
  const name = plugin ? `plugin:${plugin}:${rawName}` : rawName;
224
- const server = parseServer(name, raw ?? {}, path, env);
225
- if (server) byName.set(name, server);
338
+ const problem = piOrigin ? piFormatProblem(raw ?? {}) : undefined;
339
+ if (problem) {
340
+ options.onNote?.(`MCP server "${name}" in ${path} is skipped: ${problem}.`);
341
+ continue;
342
+ }
343
+ const server = parseServer(name, raw ?? {}, path, env, piOrigin ? piFormat : undefined);
344
+ const inherited = byName.get(name);
345
+ // The same server kept in both (common while moving between the two) is not worth a warning.
346
+ if (!piOrigin && server && inherited?.piOrigin && hashServerConfig(server) !== hashServerConfig(inherited)) {
347
+ options.onNote?.(`MCP server "${name}" in ${inherited.source} is overridden by the one in ${path}.`);
348
+ }
349
+ if (server) byName.set(name, piOrigin ? { ...server, piOrigin } : server);
226
350
  else byName.delete(name); // an explicit `disabled` entry removes an inherited one
227
351
  }
228
352
  }
@@ -0,0 +1,19 @@
1
+ /** Collect an MCP list response's cursor pages without silently dropping later entries. */
2
+ export async function collectPages<T>(
3
+ fetchPage: (cursor?: string) => Promise<{ items: T[]; nextCursor?: string }>,
4
+ signal?: AbortSignal,
5
+ ): Promise<T[]> {
6
+ const items: T[] = [];
7
+ const seen = new Set<string>();
8
+ let cursor: string | undefined;
9
+ while (true) {
10
+ signal?.throwIfAborted();
11
+ const page = await fetchPage(cursor);
12
+ signal?.throwIfAborted();
13
+ for (const item of page.items) items.push(item);
14
+ if (page.nextCursor === undefined) return items;
15
+ if (seen.has(page.nextCursor)) throw new Error("MCP server repeated a pagination cursor; check the server's list implementation.");
16
+ seen.add(page.nextCursor);
17
+ cursor = page.nextCursor;
18
+ }
19
+ }