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
@@ -8,7 +8,7 @@
8
8
  * borrows) and the keys it leaves alone. "Leaves alone" is stated per file
9
9
  * because the answer differs by scope on purpose — a repository's own
10
10
  * `.claude/settings.json` may not grant itself `auto` mode or configure the
11
- * auto-mode classifier (docs/decisions/modes.md, auto-mode.md) — and a user
11
+ * auto-mode classifier (working-docs/decisions/modes.md, auto-mode.md) — and a user
12
12
  * reading "works unchanged" must see exactly where it does not.
13
13
  *
14
14
  * Findings are the things silent elsewhere: a settings file that fails to
@@ -19,19 +19,22 @@
19
19
 
20
20
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
21
21
  import { basename, join } from "node:path";
22
- import { managedSettingsPaths } from "../auto-mode/config.ts";
23
22
  import { loadPluginHooks } from "../hooks/plugin-hooks.ts";
24
23
  import { type HooksSource, loadHookSettings } from "../hooks/settings.ts";
25
- import { claudeJsonPath, claudeUserDir } from "../lib/paths.ts";
26
- import { claudeUserSettingsPath, settingsPaths } from "../lib/claude-settings.ts";
27
- import { discoverContextFilePaths } from "../lib/claude-context.ts";
28
- import { CLAUDE_MD_CHAR_LIMIT, claudeMdLimitWarning, indexLimitStatus, projectMemoryDir } from "../lib/memory.ts";
24
+ // Claude Code's auto-memory switch, read through the whole settings ladder.
25
+ import { AUTO_MEMORY_KEY as AUTO_MEMORY } from "../lib/auto-memory.ts";
26
+ import { CONFIG_MODE_KEY, claudeSourcesOn } from "../lib/config-mode.ts";
27
+ import { claudeJsonPath, claudeUserDir, oneCodeStateDir } from "../lib/paths.ts";
28
+ import { claudeUserSettingsPath, managedSettingsPaths, settingsPaths } from "../lib/claude-settings.ts";
29
+ import { discoverContextFilePaths, instructionRule } from "../lib/claude-context.ts";
30
+ import { CLAUDE_MD_CHAR_LIMIT, claudeMdLimitWarning, projectMemoryDir } from "../lib/memory.ts";
31
+ import { indexLimitStatus } from "../lib/memory-content.ts";
29
32
  import { readDisabledMcpServers } from "../lib/mcp-overrides.ts";
30
33
  import { oneCodeProjectSettingsPath, oneCodeSettingsPath } from "../lib/one-code-settings.ts";
31
34
  import { parseFrontmatterLoosely } from "../lib/frontmatter.ts";
32
35
  import { defaultDiscoverRoots, discoverPlugins, type DiscoveredPlugins } from "../lib/plugins.ts";
33
36
  import { BUNDLED_SKILLS_DIR, promptTemplateNames, scanSkills } from "../lib/skill-scan.ts";
34
- import { loadServers, type McpServer } from "../mcp/config.ts";
37
+ import { loadServers, type McpServer, piMcpConfigPaths, type RegisteredServer } from "../mcp/config.ts";
35
38
  import type { PermissionMode } from "../permissions/matcher.ts";
36
39
  import { MODES_NEVER_FROM_PROJECT } from "../permissions/settings.ts";
37
40
  import { agentDirs, parseAgentFile } from "../subagents/agents.ts";
@@ -84,14 +87,43 @@ export interface CompatReport {
84
87
  * (a checked-in env block must not route subagents).
85
88
  */
86
89
  const MCP_POLICY_KEYS = ["enableAllProjectMcpServers", "enabledMcpjsonServers", "disabledMcpjsonServers"];
87
- const CLAUDE_PROJECT_KEYS = new Set(["permissions", "hooks", "enabledPlugins", ...MCP_POLICY_KEYS]);
90
+ /** One Code's workflow keys, read from its user and project files (lib/one-code-settings.ts). */
91
+ const WORKFLOW_KEYS = ["enableWorkflows", "disableWorkflows", "workflowSizeGuideline"];
92
+ const CLAUDE_PROJECT_KEYS = new Set(["permissions", "hooks", "enabledPlugins", AUTO_MEMORY, ...MCP_POLICY_KEYS]);
88
93
  const SCOPE_KEYS: Record<SettingsScope, ReadonlySet<string>> = {
89
- "claude-user": new Set(["permissions", "hooks", "env", "enabledPlugins", "autoMode", ...MCP_POLICY_KEYS]),
94
+ "claude-user": new Set(["permissions", "hooks", "env", "enabledPlugins", "autoMode", AUTO_MEMORY, ...MCP_POLICY_KEYS]),
90
95
  "claude-project": CLAUDE_PROJECT_KEYS,
91
96
  "claude-local": CLAUDE_PROJECT_KEYS,
92
- managed: new Set(["permissions", "hooks", "env", "autoMode", "enabledPlugins"]),
93
- "onecode-user": new Set(["subagentModel", "subagentModelSetFor", "autoMode", "permissions", "webSearch", "disabledMcpServers"]),
94
- "onecode-project": new Set(["permissions", "disabledMcpServers"]),
97
+ managed: new Set(["permissions", "hooks", "env", "autoMode", "enabledPlugins", AUTO_MEMORY]),
98
+ "onecode-user": new Set([
99
+ "subagentModel",
100
+ "subagentModelSetFor",
101
+ "autoMode",
102
+ "permissions",
103
+ "webSearch",
104
+ "disabledMcpServers",
105
+ // The /memory panel's two rows (lib/config-mode.ts, lib/auto-memory.ts).
106
+ CONFIG_MODE_KEY,
107
+ AUTO_MEMORY,
108
+ "modelTiers",
109
+ "suggestNewerModels",
110
+ "refreshModelCatalog",
111
+ "artifacts",
112
+ ...WORKFLOW_KEYS,
113
+ // Remembered "No" answers to startup questions (branding/declined.ts).
114
+ "compactionKeepDeclined",
115
+ "piBuiltinsTurnOffDeclined",
116
+ ]),
117
+ "onecode-project": new Set([
118
+ "permissions",
119
+ "disabledMcpServers",
120
+ AUTO_MEMORY,
121
+ ...WORKFLOW_KEYS,
122
+ // The external CLAUDE.md includes answer, per repository (lib/claude-external-includes.ts).
123
+ "hasClaudeMdExternalIncludesApproved",
124
+ "hasClaudeMdExternalIncludesWarningShown",
125
+ "claudeMdExternalIncludesRoot",
126
+ ]),
95
127
  "claude-json": new Set(),
96
128
  };
97
129
  /** Never worth reporting as "ignored". */
@@ -146,7 +178,11 @@ function permissionsSummary(perms: unknown, scope: SettingsScope, findings: Find
146
178
  }
147
179
  }
148
180
  if (p.disableBypassPermissionsMode === "disable") parts.push("bypass mode disabled");
149
- if (p.additionalDirectories !== undefined) parts.push("additionalDirectories (not honoured)");
181
+ if (Array.isArray(p.additionalDirectories) && p.additionalDirectories.length > 0) {
182
+ const dirs = p.additionalDirectories.length;
183
+ const fromRepo = scope === "claude-project" || scope === "claude-local";
184
+ parts.push(`${dirs} workspace director${dirs === 1 ? "y" : "ies"}${fromRepo ? " (applied once you trust the repository's settings)" : ""}`);
185
+ }
150
186
  return { used: parts.length ? `permissions: ${parts.join("; ")}` : undefined, refused };
151
187
  }
152
188
 
@@ -208,12 +244,13 @@ function summarizeFile(scope: SettingsScope, label: string, path: string, home:
208
244
  const auto = file.autoMode as Json;
209
245
  const keys = Object.keys(auto);
210
246
  if (known.has("autoMode")) {
247
+ // `classifierModel` is One Code's own key, read from ~/.onecode only.
211
248
  if (scope === "claude-user" && ("classifierModel" in auto || "classifierModelSetFor" in auto)) {
212
249
  report.refused.push("autoMode.classifierModel — One Code's own key, read from ~/.onecode/settings.json only");
213
250
  findings.push({
214
251
  level: "warn",
215
- text: `${shortenHome(path, home)} carries autoMode.classifierModel, a One Code key that is now read only from ~/.onecode/settings.json; the value here is ignored.`,
216
- fix: "Move it with /auto-mode model (which writes the new location) and delete the stale key from ~/.claude/settings.json.",
252
+ text: `${shortenHome(path, home)} carries autoMode.classifierModel, a One Code key read only from ~/.onecode/settings.json; the value here is ignored.`,
253
+ fix: "Set it with /auto-mode model (which writes ~/.onecode/settings.json) and delete the stale key from ~/.claude/settings.json.",
217
254
  });
218
255
  }
219
256
  const consumed = keys.filter((k) => !(scope === "claude-user" && (k === "classifierModel" || k === "classifierModelSetFor")));
@@ -237,6 +274,7 @@ function summarizeFile(scope: SettingsScope, label: string, path: string, home:
237
274
  });
238
275
  }
239
276
  if (scope === "onecode-user") {
277
+ if (typeof file.configMode === "string") report.used.push(`configMode "${file.configMode}" (/memory config sources)`);
240
278
  if (typeof file.subagentModel === "string") report.used.push(`subagentModel "${file.subagentModel}"`);
241
279
  if (file.webSearch && typeof file.webSearch === "object") report.used.push("webSearch (keys/order for the search fallback)");
242
280
  }
@@ -244,6 +282,7 @@ function summarizeFile(scope: SettingsScope, label: string, path: string, home:
244
282
  if (key in file && known.has(key)) report.used.push(`${key}: ${Array.isArray(file[key]) ? count(file[key]) : String(file[key])}`);
245
283
  }
246
284
  if ("disabledMcpServers" in file && known.has("disabledMcpServers")) report.used.push(`disabledMcpServers: ${count(file.disabledMcpServers)} (via /mcp disable)`);
285
+ if (typeof file[AUTO_MEMORY] === "boolean" && known.has(AUTO_MEMORY)) report.used.push(`${AUTO_MEMORY}: ${file[AUTO_MEMORY]}`);
247
286
 
248
287
  for (const key of Object.keys(file)) {
249
288
  if (known.has(key) || SILENT_KEYS.has(key) || handled.has(key)) continue;
@@ -279,6 +318,10 @@ export interface CompatInput {
279
318
  env: NodeJS.ProcessEnv;
280
319
  /** `<package>/agents`, so bundled agents are counted. */
281
320
  bundledAgentsDir?: string;
321
+ /** pi's `CONFIG_DIR_NAME` (`.pi` when absent): where the project's pi `mcp.json` is. */
322
+ piConfigDirName?: string;
323
+ /** MCP servers other extensions registered, as the session loads them. */
324
+ registeredMcpServers?: readonly RegisteredServer[];
282
325
  }
283
326
 
284
327
  export function collectCompat(input: CompatInput): CompatReport {
@@ -287,22 +330,38 @@ export function collectCompat(input: CompatInput): CompatReport {
287
330
  const claudeDir = claudeUserDir(home, env);
288
331
  const claude = settingsPaths(cwd, home);
289
332
 
333
+ // Independent mode (lib/config-mode.ts) reads none of Claude Code's files, so
334
+ // none is opened here; an organisation's policy file it ignores is named.
335
+ const independent = !claudeSourcesOn();
290
336
  const files: SettingsFileReport[] = [
291
- summarizeFile("claude-user", "Claude Code user settings", claudeUserSettingsPath(home), home, findings),
292
- summarizeFile("claude-project", "project settings (checked in)", claude.project, home, findings),
293
- summarizeFile("claude-local", "project settings (local)", claude.local, home, findings),
294
- ...managedSettingsPaths().map((path) => summarizeFile("managed", "managed settings (organisation policy)", path, home, findings)),
295
- summarizeFile("claude-json", "Claude Code's .claude.json", claudeJsonPath(home, env), home, findings),
337
+ ...(independent
338
+ ? []
339
+ : [
340
+ summarizeFile("claude-user", "Claude Code user settings", claudeUserSettingsPath(home), home, findings),
341
+ summarizeFile("claude-project", "project settings (checked in)", claude.project, home, findings),
342
+ summarizeFile("claude-local", "project settings (local)", claude.local, home, findings),
343
+ ...managedSettingsPaths().map((path) => summarizeFile("managed", "managed settings (organisation policy)", path, home, findings)),
344
+ summarizeFile("claude-json", "Claude Code's .claude.json", claudeJsonPath(home, env), home, findings),
345
+ ]),
296
346
  summarizeFile("onecode-user", "One Code user settings", oneCodeSettingsPath(home, env), home, findings),
297
347
  summarizeFile("onecode-project", "One Code per-repository settings", oneCodeProjectSettingsPath(cwd, home, env), home, findings),
298
348
  ];
349
+ if (independent) {
350
+ for (const path of managedSettingsPaths().filter((managed) => existsSync(managed))) {
351
+ findings.push({
352
+ level: "warn",
353
+ text: `An organisation policy file exists at ${path}, and independent mode does not apply it.`,
354
+ fix: "Switch config sources to Claude-compatible in /memory if this machine's policy must hold.",
355
+ });
356
+ }
357
+ }
299
358
 
300
359
  // Context files, sized — the block every turn pays for.
301
360
  const contextFiles: ContextFileReport[] = discoverContextFilePaths({
302
361
  cwd,
303
362
  homeClaudeDir: claudeDir,
304
- homeOneCodeDir: join(home, ".onecode"),
305
- agentsFallback: true,
363
+ homeOneCodeDir: oneCodeStateDir(env, home),
364
+ rule: instructionRule(home),
306
365
  }).map(({ path, descriptor }) => {
307
366
  let chars = 0;
308
367
  try {
@@ -401,7 +460,8 @@ export function collectCompat(input: CompatInput): CompatReport {
401
460
  const hookDiagnostics: string[] = [];
402
461
  const hooksLoaded = loadHookSettings(claudeDir, cwd);
403
462
  hookDiagnostics.push(...hooksLoaded.diagnostics);
404
- const pluginHooks = discovered ? loadPluginHooks(defaultDiscoverRoots(agentDir, cwd, home), hookDiagnostics) : [];
463
+ // Runtime dispatch skips plugin hooks when settings disable hooks; report what runs.
464
+ const pluginHooks = discovered && !hooksLoaded.disabled ? loadPluginHooks(defaultDiscoverRoots(agentDir, cwd, home), hookDiagnostics) : [];
405
465
  const hookSources = [...hooksLoaded.sources, ...pluginHooks];
406
466
  const hookCommands = hookSources.reduce(
407
467
  (n, source) => n + Object.values(source.config).reduce((m, groups) => m + (groups ?? []).reduce((k, g) => k + g.hooks.length, 0), 0),
@@ -411,11 +471,16 @@ export function collectCompat(input: CompatInput): CompatReport {
411
471
 
412
472
  // MCP.
413
473
  const configErrors: string[] = [];
474
+ const configNotes: string[] = [];
414
475
  const servers = loadServers(cwd, home, env, discovered?.mcpConfigs ?? [], {
415
476
  pluginNames: discovered?.mcpConfigPlugins,
416
477
  onError: (path, message) => configErrors.push(`${shortenHome(path, home)}: ${message}`),
478
+ piConfigs: piMcpConfigPaths(agentDir, cwd, input.piConfigDirName),
479
+ onNote: (message) => configNotes.push(message),
480
+ registered: input.registeredMcpServers,
417
481
  });
418
482
  for (const error of configErrors) findings.push({ level: "error", text: `MCP config ${error} — its servers are not loaded.`, fix: "Fix the JSON and run /mcp reconnect." });
483
+ for (const note of configNotes) findings.push({ level: "warn", text: note });
419
484
  for (const server of servers) {
420
485
  if (server.missingEnv?.length) {
421
486
  findings.push({
@@ -11,13 +11,13 @@
11
11
  * providers it depends on a third-party key.
12
12
  */
13
13
 
14
- import { existsSync } from "node:fs";
14
+ import { type Dirent, existsSync, readdirSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { whichOnPath } from "../lib/which.ts";
17
17
  import type { Api, Model } from "@earendil-works/pi-ai";
18
18
  import { getProviderKind } from "pi-web-search/src/api.ts";
19
19
  import { installHint, serverInstallHint } from "../lsp/install-hints.ts";
20
- import { SERVERS } from "../lsp/servers.ts";
20
+ import { languageIdForPath, SERVERS } from "../lsp/servers.ts";
21
21
  import { typescriptPreflight } from "../lsp/servers.ts";
22
22
  import type { McpServer } from "../mcp/config.ts";
23
23
  import { BRAVE_KEY_ENV, resolveChain, TAVILY_KEY_ENV, type WebSearchSettings } from "../web/backends.ts";
@@ -44,13 +44,49 @@ export interface DependencyReport {
44
44
  findings: Finding[];
45
45
  }
46
46
 
47
- /** Languages the working directory plausibly contains, by the LSP table's own root markers. */
47
+ /** Folders the language scan never enters: dependencies, build output, virtual environments. */
48
+ const SCAN_SKIP = new Set(["node_modules", "vendor", "dist", "build", "out", "target", "venv", "env", "__pycache__", "coverage"]);
49
+ const SCAN_MAX_DEPTH = 4;
50
+ const SCAN_MAX_ENTRIES = 5000;
51
+
52
+ /**
53
+ * Languages the working directory contains: by the LSP table's own root
54
+ * markers, or by a source file the language server would open. The file scan
55
+ * is bounded (a few levels deep, a few thousand entries, no dot, dependency
56
+ * or build folders), so a project with `.py` files and no `pyproject.toml`,
57
+ * or TypeScript under `web/src`, still counts.
58
+ */
48
59
  export function projectLanguages(cwd: string): string[] {
49
60
  const seen = new Map<string, string>(); // command → languageId (one per server binary)
50
61
  for (const [languageId, config] of Object.entries(SERVERS)) {
51
62
  if (seen.has(config.command)) continue;
52
63
  if (config.rootMarkers.some((marker) => existsSync(join(cwd, marker)))) seen.set(config.command, languageId);
53
64
  }
65
+ // One entry per server binary: the walk stops once every one is accounted for.
66
+ const servers = new Set(Object.values(SERVERS).map((config) => config.command)).size;
67
+ if (seen.size < servers) {
68
+ let visited = 0;
69
+ const walk = (dir: string, depth: number): void => {
70
+ let entries: Dirent[];
71
+ try {
72
+ entries = readdirSync(dir, { withFileTypes: true });
73
+ } catch {
74
+ return;
75
+ }
76
+ for (const entry of entries) {
77
+ if (++visited > SCAN_MAX_ENTRIES || seen.size === servers) return;
78
+ if (entry.name.startsWith(".")) continue;
79
+ if (entry.isDirectory()) {
80
+ if (depth < SCAN_MAX_DEPTH && !SCAN_SKIP.has(entry.name)) walk(join(dir, entry.name), depth + 1);
81
+ continue;
82
+ }
83
+ const languageId = languageIdForPath(entry.name);
84
+ const config = languageId ? SERVERS[languageId] : undefined;
85
+ if (languageId && config && !seen.has(config.command)) seen.set(config.command, languageId);
86
+ }
87
+ };
88
+ walk(cwd, 0);
89
+ }
54
90
  return [...seen.values()];
55
91
  }
56
92
 
@@ -112,8 +148,8 @@ export function checkDependencies(input: DependencyInput): DependencyReport {
112
148
  const which = (command: string) => whichOnPath(command, env, platform);
113
149
 
114
150
  const git = which("git");
115
- checks.push({ name: "git", found: !!git, path: git, need: "required", reason: "repository detection, auto mode's recoverability check, worktree isolation", hint: "https://git-scm.com/downloads" });
116
- if (!git) findings.push({ level: "warn", text: "git is not on PATH: worktree isolation and auto mode's git-recoverability check are unavailable.", fix: "Install git and make sure it is on the PATH used to launch One Code." });
151
+ checks.push({ name: "git", found: !!git, path: git, need: "required", reason: "repository detection, auto mode's git status line for the classifier, worktree isolation", hint: "https://git-scm.com/downloads" });
152
+ if (!git) findings.push({ level: "warn", text: "git is not on PATH: worktree isolation and auto mode's git status line for the classifier are unavailable.", fix: "Install git and make sure it is on the PATH used to launch One Code." });
117
153
 
118
154
  // pi downloads ripgrep into <agentDir>/bin on first run when PATH has none
119
155
  // and puts that dir on the shell tools' PATH, so a copy there is "found".
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * - settings writes go to One Code's OWN files (`~/.onecode/settings.json`,
10
10
  * `~/.onecode/projects/<slug>/settings.json`), never to `~/.claude`, which
11
- * One Code treats as read-only (docs/decisions/memory-state.md);
11
+ * One Code treats as read-only (working-docs/decisions/memory-state.md);
12
12
  * - session transcripts are pi's JSONL under `<agentDir>/sessions/`, not
13
13
  * Claude Code's `~/.claude/projects/`, and there are no usage counters, so
14
14
  * transcripts are the only usage signal;
@@ -19,7 +19,7 @@
19
19
  * Claude Code's ground rules (propose → confirm → apply in at most two
20
20
  * questions; key-scoped reads; never inline harvested names into shell
21
21
  * commands; transcripts are untrusted data; write for a first-time user) are
22
- * kept in substance. Rationale: docs/decisions/doctor.md.
22
+ * kept in substance. Rationale: working-docs/decisions/doctor.md.
23
23
  */
24
24
 
25
25
  import { modeCycleKey } from "../lib/keys.ts";
@@ -38,8 +38,14 @@ export interface FixPromptInput {
38
38
  oneCodeProjectSettingsPath: string;
39
39
  /** True when auto mode is writing `auto-mode-decisions.jsonl` next to the session files. */
40
40
  decisionLogEnabled: boolean;
41
+ /** True in independent mode (lib/config-mode.ts), where none of Claude Code's files are read. */
42
+ independent?: boolean;
41
43
  }
42
44
 
45
+ /** The ground rule that maps the Claude Code paths the prompt names to independent mode's own. */
46
+ const INDEPENDENT_RULE =
47
+ "- **This session runs in independent mode.** One Code reads none of the Claude Code locations named below (`~/.claude`, `.claude/`, `CLAUDE.md`, `CLAUDE.local.md`, `~/.claude.json`, `.mcp.json`, managed settings). Read each as its One Code counterpart: instructions are `AGENTS.md` and `ONECODE.md`, skills come from `.agents/skills` and pi's skill folders, agents, commands and workflows from `.onecode/` and `~/.onecode/`, settings and hooks from One Code's two settings files, and MCP servers from pi's `mcp.json` files. Propose changes only to those.\n";
48
+
43
49
  export function doctorFixPrompt(input: FixPromptInput): string {
44
50
  const versionCommand =
45
51
  input.install === "app"
@@ -64,6 +70,7 @@ Treat every line of that report as measured fact. Your job on those sections is
64
70
 
65
71
  ## Ground rules
66
72
 
73
+ ${input.independent ? INDEPENDENT_RULE : ""}
67
74
  - **Propose, then confirm, then apply — and recommend, don't just offer.** Run every check read-only first and present the full report. Then confirm in at most TWO questions with the \`ask_user_question\` tool — never a question per check. (1) ONE consolidated cleanup question covering checks 0-4 and 7: options "Clean up everything (recommended)" first, "Let me pick" second, "No, keep everything" last; only if the user picks "Let me pick", ask one follow-up multi-select with an option per action group (at most 4 options per question — split if there are more groups). (2) A SEPARATE permission question for check 9, never folded into the cleanup bundle: it changes what runs without asking, so it names every allow rule string it would add, and is skipped when nothing was proposed. Put the recommended action FIRST with "(recommended)" in its label and the decline option last. Never edit any file before its group is confirmed.
68
75
  - **One Code never writes Claude Code's files.** \`~/.claude/settings.json\`, \`~/.claude.json\`, \`~/.claude/CLAUDE.md\` and the rest of \`~/.claude\` are a read-only compatibility surface here. Settings you change go to One Code's own files: \`${input.oneCodeSettingsPath}\` (user scope) and \`${input.oneCodeProjectSettingsPath}\` (this repository). Skills, plugins and MCP servers are toggled with One Code's commands (\`/skills\`, \`/plugins\`, \`/mcp\`), which persist under One Code's own state, not by editing Claude Code's settings. Only the CLAUDE.md checks (3 and 4) may propose edits to checked-in files, applied as ordinary working-tree edits the user reviews in \`git diff\` — never commit them yourself. \`CLAUDE.local.md\` and the project's own \`.claude/settings.local.json\` are local, uncommitted files and may be edited after confirmation.
69
76
  - Token figures are estimates: tokens ≈ characters / 4. Label them "est." everywhere.