@bastani/atomic 0.8.13 → 0.8.14

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 (355) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/host-html-template.ts +1 -1
  4. package/dist/builtin/mcp/init.ts +15 -2
  5. package/dist/builtin/mcp/mcp-callback-server.ts +10 -9
  6. package/dist/builtin/mcp/package.json +1 -1
  7. package/dist/builtin/mcp/ui-session.ts +9 -6
  8. package/dist/builtin/subagents/CHANGELOG.md +8 -1
  9. package/dist/builtin/subagents/README.md +39 -32
  10. package/dist/builtin/subagents/package.json +1 -1
  11. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  12. package/dist/builtin/subagents/src/agents/agent-management.ts +6 -1
  13. package/dist/builtin/subagents/src/agents/agent-serializer.ts +2 -0
  14. package/dist/builtin/subagents/src/agents/agents.ts +44 -19
  15. package/dist/builtin/subagents/src/extension/config.ts +16 -0
  16. package/dist/builtin/subagents/src/extension/fanout-child.ts +246 -0
  17. package/dist/builtin/subagents/src/extension/index.ts +466 -603
  18. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +6 -4
  19. package/dist/builtin/subagents/src/intercom/result-intercom.ts +109 -1
  20. package/dist/builtin/subagents/src/runs/background/async-execution.ts +124 -19
  21. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +41 -6
  22. package/dist/builtin/subagents/src/runs/background/async-resume.ts +28 -15
  23. package/dist/builtin/subagents/src/runs/background/async-status.ts +60 -30
  24. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +111 -54
  25. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +83 -0
  26. package/dist/builtin/subagents/src/runs/background/run-status.ts +79 -3
  27. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +46 -1
  28. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +66 -14
  29. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +10 -3
  30. package/dist/builtin/subagents/src/runs/foreground/execution.ts +14 -2
  31. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +320 -23
  32. package/dist/builtin/subagents/src/runs/shared/completion-guard.ts +23 -1
  33. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +369 -0
  34. package/dist/builtin/subagents/src/runs/shared/nested-events.ts +935 -0
  35. package/dist/builtin/subagents/src/runs/shared/nested-path.ts +52 -0
  36. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +115 -0
  37. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -0
  38. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +82 -9
  39. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +1 -1
  40. package/dist/builtin/subagents/src/runs/shared/single-output.ts +12 -2
  41. package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +32 -10
  42. package/dist/builtin/subagents/src/runs/shared/worktree.ts +3 -2
  43. package/dist/builtin/subagents/src/shared/artifacts.ts +0 -1
  44. package/dist/builtin/subagents/src/shared/types.ts +96 -1
  45. package/dist/builtin/subagents/src/shared/utils.ts +10 -2
  46. package/dist/builtin/subagents/src/slash/slash-commands.ts +468 -625
  47. package/dist/builtin/subagents/src/tui/render.ts +1227 -2093
  48. package/dist/builtin/web-access/package.json +1 -1
  49. package/dist/builtin/workflows/CHANGELOG.md +24 -0
  50. package/dist/builtin/workflows/README.md +28 -11
  51. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +323 -40
  52. package/dist/builtin/workflows/builtin/ralph.ts +362 -176
  53. package/dist/builtin/workflows/package.json +2 -5
  54. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
  55. package/dist/builtin/workflows/skills/skill-creator/LICENSE.txt +202 -0
  56. package/dist/builtin/workflows/skills/skill-creator/SKILL.md +489 -0
  57. package/dist/builtin/workflows/skills/skill-creator/agents/analyzer.md +274 -0
  58. package/dist/builtin/workflows/skills/skill-creator/agents/comparator.md +202 -0
  59. package/dist/builtin/workflows/skills/skill-creator/agents/grader.md +223 -0
  60. package/dist/builtin/workflows/skills/skill-creator/assets/eval_review.html +146 -0
  61. package/dist/builtin/workflows/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  62. package/dist/builtin/workflows/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  63. package/dist/builtin/workflows/skills/skill-creator/references/schemas.md +430 -0
  64. package/dist/builtin/workflows/skills/skill-creator/scripts/__init__.py +0 -0
  65. package/dist/builtin/workflows/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  66. package/dist/builtin/workflows/skills/skill-creator/scripts/generate_report.py +326 -0
  67. package/dist/builtin/workflows/skills/skill-creator/scripts/improve_description.py +247 -0
  68. package/dist/builtin/workflows/skills/skill-creator/scripts/package_skill.py +136 -0
  69. package/dist/builtin/workflows/skills/skill-creator/scripts/quick_validate.py +103 -0
  70. package/dist/builtin/workflows/skills/skill-creator/scripts/run_eval.py +310 -0
  71. package/dist/builtin/workflows/skills/skill-creator/scripts/run_loop.py +328 -0
  72. package/dist/builtin/workflows/skills/skill-creator/scripts/utils.py +47 -0
  73. package/dist/builtin/workflows/src/extension/index.ts +869 -93
  74. package/dist/builtin/workflows/src/extension/render-call.ts +34 -1
  75. package/dist/builtin/workflows/src/extension/render-result.ts +126 -21
  76. package/dist/builtin/workflows/src/extension/runtime.ts +91 -3
  77. package/dist/builtin/workflows/src/extension/wiring.ts +38 -12
  78. package/dist/builtin/workflows/src/extension/workflow-schema.ts +62 -5
  79. package/dist/builtin/workflows/src/runs/background/runner.ts +3 -3
  80. package/dist/builtin/workflows/src/runs/background/status.ts +42 -8
  81. package/dist/builtin/workflows/src/runs/foreground/executor.ts +410 -95
  82. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +5 -2
  83. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +8 -0
  84. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +6 -4
  85. package/dist/builtin/workflows/src/runs/shared/worktree.ts +3 -2
  86. package/dist/builtin/workflows/src/shared/persistence-restore.ts +138 -5
  87. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +30 -0
  88. package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +78 -120
  89. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +193 -0
  90. package/dist/builtin/workflows/src/shared/store-types.ts +26 -1
  91. package/dist/builtin/workflows/src/shared/store.ts +145 -17
  92. package/dist/builtin/workflows/src/shared/timing.ts +6 -2
  93. package/dist/builtin/workflows/src/shared/workflow-failures.ts +375 -0
  94. package/dist/builtin/workflows/src/tui/chat-surface.ts +68 -17
  95. package/dist/builtin/workflows/src/tui/connectors.ts +2 -2
  96. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +24 -26
  97. package/dist/builtin/workflows/src/tui/graph-canvas.ts +4 -8
  98. package/dist/builtin/workflows/src/tui/graph-view.ts +17 -14
  99. package/dist/builtin/workflows/src/tui/header.ts +38 -0
  100. package/dist/builtin/workflows/src/tui/inline-form-card.ts +161 -238
  101. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +68 -73
  102. package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +2 -3
  103. package/dist/builtin/workflows/src/tui/inline-form-store.ts +2 -1
  104. package/dist/builtin/workflows/src/tui/inputs-overlay.ts +1 -3
  105. package/dist/builtin/workflows/src/tui/inputs-picker.ts +286 -399
  106. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +11 -0
  107. package/dist/builtin/workflows/src/tui/node-card.ts +2 -1
  108. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +9 -1
  109. package/dist/builtin/workflows/src/tui/prompt-card.ts +46 -19
  110. package/dist/builtin/workflows/src/tui/run-detail.ts +63 -80
  111. package/dist/builtin/workflows/src/tui/session-confirm.ts +9 -3
  112. package/dist/builtin/workflows/src/tui/session-picker.ts +19 -16
  113. package/dist/builtin/workflows/src/tui/stage-chat-layout.ts +88 -0
  114. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +368 -879
  115. package/dist/builtin/workflows/src/tui/status-helpers.ts +4 -0
  116. package/dist/builtin/workflows/src/tui/status-list.ts +67 -75
  117. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +50 -12
  118. package/dist/builtin/workflows/src/tui/submit-pane.ts +164 -0
  119. package/dist/builtin/workflows/src/tui/switcher.ts +27 -4
  120. package/dist/builtin/workflows/src/tui/text-helpers.ts +98 -4
  121. package/dist/builtin/workflows/src/tui/widget.ts +90 -68
  122. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +23 -2
  123. package/dist/builtin/workflows/src/tui/workflow-list.ts +44 -68
  124. package/dist/cli/file-processor.d.ts.map +1 -1
  125. package/dist/cli/file-processor.js +2 -3
  126. package/dist/cli/file-processor.js.map +1 -1
  127. package/dist/config.d.ts.map +1 -1
  128. package/dist/config.js +3 -10
  129. package/dist/config.js.map +1 -1
  130. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  131. package/dist/core/agent-session-runtime.js +2 -1
  132. package/dist/core/agent-session-runtime.js.map +1 -1
  133. package/dist/core/agent-session-services.d.ts.map +1 -1
  134. package/dist/core/agent-session-services.js +3 -2
  135. package/dist/core/agent-session-services.js.map +1 -1
  136. package/dist/core/agent-session.d.ts +6 -0
  137. package/dist/core/agent-session.d.ts.map +1 -1
  138. package/dist/core/agent-session.js +16 -2
  139. package/dist/core/agent-session.js.map +1 -1
  140. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  141. package/dist/core/atomic-guide-command.js +8 -9
  142. package/dist/core/atomic-guide-command.js.map +1 -1
  143. package/dist/core/auth-storage.d.ts.map +1 -1
  144. package/dist/core/auth-storage.js +3 -2
  145. package/dist/core/auth-storage.js.map +1 -1
  146. package/dist/core/bash-executor.d.ts.map +1 -1
  147. package/dist/core/bash-executor.js +2 -1
  148. package/dist/core/bash-executor.js.map +1 -1
  149. package/dist/core/export-html/index.d.ts.map +1 -1
  150. package/dist/core/export-html/index.js +8 -6
  151. package/dist/core/export-html/index.js.map +1 -1
  152. package/dist/core/export-html/template.js +6 -3
  153. package/dist/core/extensions/loader.d.ts.map +1 -1
  154. package/dist/core/extensions/loader.js +12 -29
  155. package/dist/core/extensions/loader.js.map +1 -1
  156. package/dist/core/model-registry.d.ts.map +1 -1
  157. package/dist/core/model-registry.js +5 -1
  158. package/dist/core/model-registry.js.map +1 -1
  159. package/dist/core/package-manager.d.ts +8 -0
  160. package/dist/core/package-manager.d.ts.map +1 -1
  161. package/dist/core/package-manager.js +145 -58
  162. package/dist/core/package-manager.js.map +1 -1
  163. package/dist/core/prompt-templates.d.ts.map +1 -1
  164. package/dist/core/prompt-templates.js +6 -20
  165. package/dist/core/prompt-templates.js.map +1 -1
  166. package/dist/core/resource-loader.d.ts.map +1 -1
  167. package/dist/core/resource-loader.js +38 -31
  168. package/dist/core/resource-loader.js.map +1 -1
  169. package/dist/core/sdk.d.ts.map +1 -1
  170. package/dist/core/sdk.js +9 -4
  171. package/dist/core/sdk.js.map +1 -1
  172. package/dist/core/session-manager.d.ts.map +1 -1
  173. package/dist/core/session-manager.js +32 -24
  174. package/dist/core/session-manager.js.map +1 -1
  175. package/dist/core/settings-manager.d.ts.map +1 -1
  176. package/dist/core/settings-manager.js +8 -15
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/skills.d.ts.map +1 -1
  179. package/dist/core/skills.js +8 -22
  180. package/dist/core/skills.js.map +1 -1
  181. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +5 -4
  182. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
  183. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +34 -11
  184. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  185. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts +1 -0
  186. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts.map +1 -1
  187. package/dist/core/tools/ask-user-question/state/selectors/contract.js.map +1 -1
  188. package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts.map +1 -1
  189. package/dist/core/tools/ask-user-question/state/selectors/projections.js +1 -0
  190. package/dist/core/tools/ask-user-question/state/selectors/projections.js.map +1 -1
  191. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts +1 -2
  192. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -1
  193. package/dist/core/tools/ask-user-question/state/state-reducer.js +26 -9
  194. package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -1
  195. package/dist/core/tools/ask-user-question/state/state.d.ts +4 -0
  196. package/dist/core/tools/ask-user-question/state/state.d.ts.map +1 -1
  197. package/dist/core/tools/ask-user-question/state/state.js.map +1 -1
  198. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts +1 -0
  199. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts.map +1 -1
  200. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +1 -0
  201. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -1
  202. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts +9 -6
  203. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  204. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +28 -7
  205. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  206. package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -1
  207. package/dist/core/tools/ask-user-question/view/props-adapter.js +4 -1
  208. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  209. package/dist/core/tools/bash.d.ts.map +1 -1
  210. package/dist/core/tools/bash.js +56 -53
  211. package/dist/core/tools/bash.js.map +1 -1
  212. package/dist/core/tools/edit-diff.d.ts +3 -1
  213. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  214. package/dist/core/tools/edit-diff.js +8 -1
  215. package/dist/core/tools/edit-diff.js.map +1 -1
  216. package/dist/core/tools/edit.d.ts +3 -1
  217. package/dist/core/tools/edit.d.ts.map +1 -1
  218. package/dist/core/tools/edit.js +44 -81
  219. package/dist/core/tools/edit.js.map +1 -1
  220. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  221. package/dist/core/tools/file-mutation-queue.js +27 -12
  222. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  223. package/dist/core/tools/find.d.ts.map +1 -1
  224. package/dist/core/tools/find.js +2 -3
  225. package/dist/core/tools/find.js.map +1 -1
  226. package/dist/core/tools/grep.d.ts.map +1 -1
  227. package/dist/core/tools/grep.js +3 -3
  228. package/dist/core/tools/grep.js.map +1 -1
  229. package/dist/core/tools/ls.d.ts.map +1 -1
  230. package/dist/core/tools/ls.js +5 -5
  231. package/dist/core/tools/ls.js.map +1 -1
  232. package/dist/core/tools/output-accumulator.d.ts +2 -0
  233. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  234. package/dist/core/tools/output-accumulator.js +11 -4
  235. package/dist/core/tools/output-accumulator.js.map +1 -1
  236. package/dist/core/tools/path-utils.d.ts +2 -0
  237. package/dist/core/tools/path-utils.d.ts.map +1 -1
  238. package/dist/core/tools/path-utils.js +39 -21
  239. package/dist/core/tools/path-utils.js.map +1 -1
  240. package/dist/core/tools/read.d.ts.map +1 -1
  241. package/dist/core/tools/read.js +9 -8
  242. package/dist/core/tools/read.js.map +1 -1
  243. package/dist/core/tools/truncate.d.ts.map +1 -1
  244. package/dist/core/tools/truncate.js +12 -2
  245. package/dist/core/tools/truncate.js.map +1 -1
  246. package/dist/core/tools/write.d.ts.map +1 -1
  247. package/dist/core/tools/write.js +20 -35
  248. package/dist/core/tools/write.js.map +1 -1
  249. package/dist/index.d.ts +2 -1
  250. package/dist/index.d.ts.map +1 -1
  251. package/dist/index.js +4 -1
  252. package/dist/index.js.map +1 -1
  253. package/dist/main.d.ts.map +1 -1
  254. package/dist/main.js +5 -6
  255. package/dist/main.js.map +1 -1
  256. package/dist/modes/interactive/chat-input-actions.d.ts +24 -0
  257. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -0
  258. package/dist/modes/interactive/chat-input-actions.js +179 -0
  259. package/dist/modes/interactive/chat-input-actions.js.map +1 -0
  260. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  261. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/chat-message-renderer.js +14 -3
  263. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  264. package/dist/modes/interactive/components/chat-session-host.d.ts +157 -0
  265. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -0
  266. package/dist/modes/interactive/components/chat-session-host.js +1007 -0
  267. package/dist/modes/interactive/components/chat-session-host.js.map +1 -0
  268. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/config-selector.js +1 -1
  270. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  271. package/dist/modes/interactive/components/footer.d.ts +1 -0
  272. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/footer.js +14 -5
  274. package/dist/modes/interactive/components/footer.js.map +1 -1
  275. package/dist/modes/interactive/components/index.d.ts +1 -0
  276. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/index.js +1 -0
  278. package/dist/modes/interactive/components/index.js.map +1 -1
  279. package/dist/modes/interactive/components/login-dialog.d.ts +9 -1
  280. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/login-dialog.js +29 -4
  282. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  284. package/dist/modes/interactive/interactive-mode.js +18 -67
  285. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  286. package/dist/utils/child-process.d.ts +1 -0
  287. package/dist/utils/child-process.d.ts.map +1 -1
  288. package/dist/utils/child-process.js +8 -0
  289. package/dist/utils/child-process.js.map +1 -1
  290. package/dist/utils/clipboard-native.d.ts +3 -1
  291. package/dist/utils/clipboard-native.d.ts.map +1 -1
  292. package/dist/utils/clipboard-native.js +14 -8
  293. package/dist/utils/clipboard-native.js.map +1 -1
  294. package/dist/utils/image-resize-core.d.ts +30 -0
  295. package/dist/utils/image-resize-core.d.ts.map +1 -0
  296. package/dist/utils/image-resize-core.js +124 -0
  297. package/dist/utils/image-resize-core.js.map +1 -0
  298. package/dist/utils/image-resize-worker.d.ts +2 -0
  299. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  300. package/dist/utils/image-resize-worker.js +31 -0
  301. package/dist/utils/image-resize-worker.js.map +1 -0
  302. package/dist/utils/image-resize.d.ts +7 -27
  303. package/dist/utils/image-resize.d.ts.map +1 -1
  304. package/dist/utils/image-resize.js +75 -115
  305. package/dist/utils/image-resize.js.map +1 -1
  306. package/dist/utils/paths.d.ts +16 -1
  307. package/dist/utils/paths.d.ts.map +1 -1
  308. package/dist/utils/paths.js +49 -7
  309. package/dist/utils/paths.js.map +1 -1
  310. package/docs/changelog.mdx +29 -0
  311. package/docs/compaction.md +1 -1
  312. package/docs/custom-provider.md +2 -2
  313. package/docs/development.md +1 -1
  314. package/docs/docs.json +98 -143
  315. package/docs/extensions.md +29 -16
  316. package/docs/favicon.svg +29 -0
  317. package/docs/images/interactive-mode.png +0 -0
  318. package/docs/images/tree-view.png +0 -0
  319. package/docs/images/workflow-command.png +0 -0
  320. package/docs/images/workflow-graph.png +0 -0
  321. package/docs/images/workflow-input-picker.png +0 -0
  322. package/docs/images/workflow-list.png +0 -0
  323. package/docs/index.md +10 -1
  324. package/docs/logo.svg +59 -0
  325. package/docs/packages.md +3 -3
  326. package/docs/providers.md +1 -1
  327. package/docs/quickstart.md +98 -2
  328. package/docs/rpc.md +8 -8
  329. package/docs/sdk.md +23 -12
  330. package/docs/sessions.md +1 -1
  331. package/docs/skills.md +15 -1
  332. package/docs/termux.md +11 -1
  333. package/docs/themes.md +6 -6
  334. package/docs/tui.md +18 -18
  335. package/docs/usage.md +1 -1
  336. package/docs/workflows.md +172 -2
  337. package/examples/extensions/subagent/index.ts +2 -1
  338. package/package.json +6 -6
  339. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/SKILL.md +0 -0
  340. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/element-attributes.md +0 -0
  341. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/playwright-tests.md +0 -0
  342. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/request-mocking.md +0 -0
  343. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/running-code.md +0 -0
  344. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/session-management.md +0 -0
  345. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/spec-driven-testing.md +0 -0
  346. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/storage-state.md +0 -0
  347. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/test-generation.md +0 -0
  348. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/tracing.md +0 -0
  349. /package/dist/builtin/{workflows → subagents}/skills/playwright-cli/references/video-recording.md +0 -0
  350. /package/dist/builtin/{workflows → subagents}/skills/tdd/SKILL.md +0 -0
  351. /package/dist/builtin/{workflows → subagents}/skills/tdd/deep-modules.md +0 -0
  352. /package/dist/builtin/{workflows → subagents}/skills/tdd/interface-design.md +0 -0
  353. /package/dist/builtin/{workflows → subagents}/skills/tdd/mocking.md +0 -0
  354. /package/dist/builtin/{workflows → subagents}/skills/tdd/refactoring.md +0 -0
  355. /package/dist/builtin/{workflows → subagents}/skills/tdd/tests.md +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.8.14] - 2026-05-25
6
+
7
+ ### Changed
8
+
9
+ - Promoted the 0.8.14 prerelease changes to a stable release.
10
+ - Synced Atomic's coding-agent fork with upstream Pi patches since v0.75.4 and updated bundled Pi libraries to 0.75.5.
11
+
12
+ ### Fixed
13
+
14
+ - Carried forward upstream fixes for managed extension installs, git package ref reconciliation, async file tools, export HTML escaping, OpenCode session headers, OAuth device-code login, footer path abbreviation, clipboard native loading, and collapsed read output rendering.
15
+ - Refreshed the built-in header model label whenever the active model changes, matching the footer below the chat box.
16
+
17
+ ## [0.8.14-0] - 2026-05-25
18
+
19
+ ### Changed
20
+
21
+ - Synced Atomic's coding-agent fork with upstream Pi patches since v0.75.4 and updated bundled Pi libraries to 0.75.5.
22
+
23
+ ### Fixed
24
+
25
+ - Carried forward upstream fixes for managed extension installs, git package ref reconciliation, async file tools, export HTML escaping, OpenCode session headers, OAuth device-code login, footer path abbreviation, clipboard native loading, and collapsed read output rendering.
26
+ - Refreshed the built-in header model label whenever the active model changes, matching the footer below the chat box.
27
+
5
28
  ## [0.8.13] - 2026-05-21
6
29
 
7
30
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.8.13",
3
+ "version": "0.8.14",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -418,7 +418,7 @@ function escapeHtml(value: string): string {
418
418
  .replace(/'/g, "'");
419
419
  }
420
420
 
421
- function escapeHtmlAttribute(value: string): string {
421
+ export function escapeHtmlAttribute(value: string): string {
422
422
  return value
423
423
  .replace(/&/g, "&")
424
424
  .replace(/"/g, """)
@@ -274,8 +274,21 @@ export function updateStatusBar(state: McpExtensionState): void {
274
274
  ui.setStatus("mcp", undefined);
275
275
  return;
276
276
  }
277
- const connectedCount = state.manager.getAllConnections().size;
278
- ui.setStatus("mcp", ui.theme.fg("accent", `MCP: ${connectedCount}/${total} servers`));
277
+ const connectedCount = [...state.manager.getAllConnections().values()].filter(
278
+ (connection) => connection.status === "connected",
279
+ ).length;
280
+ const text = `MCP: ${connectedCount}/${total} servers`;
281
+ ui.setStatus("mcp", colorizeStatusText(ui, text));
282
+ }
283
+
284
+ function colorizeStatusText(ui: NonNullable<McpExtensionState["ui"]>, text: string): string {
285
+ const theme = (ui as { theme?: { fg?: (color: string, text: string) => string } }).theme;
286
+ if (typeof theme?.fg !== "function") return text;
287
+ try {
288
+ return theme.fg("accent", text);
289
+ } catch {
290
+ return text;
291
+ }
279
292
  }
280
293
 
281
294
  export function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {
@@ -12,6 +12,7 @@ import {
12
12
  getOAuthCallbackPort,
13
13
  setOAuthCallbackPort,
14
14
  } from "./mcp-oauth-provider.ts"
15
+ import { logger } from "./logger.ts"
15
16
 
16
17
  // HTML templates for callback responses
17
18
  const HTML_SUCCESS = `<!DOCTYPE html>
@@ -34,7 +35,7 @@ const HTML_SUCCESS = `<!DOCTYPE html>
34
35
  </body>
35
36
  </html>`
36
37
 
37
- const HTML_ERROR = () => `<!DOCTYPE html>
38
+ export const renderCallbackErrorHtml = () => `<!DOCTYPE html>
38
39
  <html>
39
40
  <head>
40
41
  <title>Pi - Authorization Failed</title>
@@ -50,7 +51,7 @@ const HTML_ERROR = () => `<!DOCTYPE html>
50
51
  <div class="container">
51
52
  <h1>Authorization Failed</h1>
52
53
  <p>An error occurred during authorization.</p>
53
- <div class="error">Authorization request failed.</div>
54
+ <div class="error">Return to Atomic and try again.</div>
54
55
  </div>
55
56
  </body>
56
57
  </html>`
@@ -78,7 +79,7 @@ interface EnsureCallbackServerOptions {
78
79
  /**
79
80
  * Handle incoming HTTP requests to the callback server.
80
81
  */
81
- function handleRequest(req: IncomingMessage, res: ServerResponse): void {
82
+ export function handleRequest(req: IncomingMessage, res: ServerResponse): void {
82
83
  const url = new URL(req.url || "/", `http://${req.headers.host}`)
83
84
 
84
85
  // Only handle the callback path
@@ -95,9 +96,9 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
95
96
 
96
97
  // Enforce state parameter presence for CSRF protection
97
98
  if (!state) {
98
- const errorMsg = "Missing required state parameter - potential CSRF attack"
99
+ logger.debug("OAuth callback rejected: missing state parameter")
99
100
  res.writeHead(400, { "Content-Type": "text/html" })
100
- res.end(HTML_ERROR(errorMsg))
101
+ res.end(renderCallbackErrorHtml())
101
102
  return
102
103
  }
103
104
 
@@ -106,7 +107,7 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
106
107
  const errorMsg = errorDescription || error
107
108
  // Send HTTP response first before rejecting promise
108
109
  res.writeHead(200, { "Content-Type": "text/html" })
109
- res.end(HTML_ERROR(errorMsg))
110
+ res.end(renderCallbackErrorHtml())
110
111
  // Reject promise after response is sent (defer to allow test to attach handler)
111
112
  if (pendingAuths.has(state)) {
112
113
  const pending = pendingAuths.get(state)!
@@ -120,15 +121,15 @@ function handleRequest(req: IncomingMessage, res: ServerResponse): void {
120
121
  // Require authorization code
121
122
  if (!code) {
122
123
  res.writeHead(400, { "Content-Type": "text/html" })
123
- res.end(HTML_ERROR("No authorization code provided"))
124
+ res.end(renderCallbackErrorHtml())
124
125
  return
125
126
  }
126
127
 
127
128
  // Validate state parameter
128
129
  if (!pendingAuths.has(state)) {
129
- const errorMsg = "Invalid or expired state parameter - potential CSRF attack"
130
+ logger.debug("OAuth callback rejected: invalid or expired state parameter")
130
131
  res.writeHead(400, { "Content-Type": "text/html" })
131
- res.end(HTML_ERROR(errorMsg))
132
+ res.end(renderCallbackErrorHtml())
132
133
  return
133
134
  }
134
135
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.8.13",
3
+ "version": "0.8.14",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -14,6 +14,7 @@ import {
14
14
  import { logger } from "./logger.ts";
15
15
  import { startUiServer, type UiServerHandle } from "./ui-server.ts";
16
16
  import { isGlimpseAvailable, openGlimpseWindow } from "./glimpse-ui.ts";
17
+ import { escapeHtmlAttribute } from "./host-html-template.ts";
17
18
 
18
19
  let activeGlimpseWindow: { close(): void } | null = null;
19
20
 
@@ -264,9 +265,10 @@ export async function maybeStartUiSession(
264
265
  active = false;
265
266
  cleanupStreamListener();
266
267
 
267
- if (state.uiServer === handle) {
268
- const messages = handle.getSessionMessages();
269
- const stream = handle.getStreamSummary();
268
+ if (state.uiServer === handle && handle !== null) {
269
+ const completedHandle = handle;
270
+ const messages = completedHandle.getSessionMessages();
271
+ const stream = completedHandle.getStreamSummary();
270
272
  const hasContent =
271
273
  messages.prompts.length > 0 ||
272
274
  messages.intents.length > 0 ||
@@ -275,8 +277,8 @@ export async function maybeStartUiSession(
275
277
 
276
278
  if (hasContent) {
277
279
  state.completedUiSessions.push({
278
- serverName: handle.serverName,
279
- toolName: handle.toolName,
280
+ serverName: completedHandle.serverName,
281
+ toolName: completedHandle.toolName,
280
282
  completedAt: new Date(),
281
283
  reason,
282
284
  messages,
@@ -323,7 +325,8 @@ export async function maybeStartUiSession(
323
325
 
324
326
  if (useGlimpse) {
325
327
  try {
326
- const glimpseHtml = `<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{margin:0;padding:0;width:100vw;height:100vh;overflow:hidden}iframe{width:100%;height:100%;border:none}</style></head><body><iframe src="${handle.url}"></iframe></body></html>`;
328
+ const iframeUrl = escapeHtmlAttribute(handle.url);
329
+ const glimpseHtml = `<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{margin:0;padding:0;width:100vw;height:100vh;overflow:hidden}iframe{width:100%;height:100%;border:none}</style></head><body><iframe src="${iframeUrl}"></iframe></body></html>`;
327
330
  activeGlimpseWindow = await openGlimpseWindow(glimpseHtml, {
328
331
  title: `MCP · ${request.serverName} · ${request.toolName}`,
329
332
  width: 1000,
@@ -12,9 +12,16 @@
12
12
  ## [Unreleased]
13
13
 
14
14
  ### Added
15
+ - Synced upstream nested subagent fanout support, including child-safe nested `subagent` registration for explicitly authorized agents, nested status/control metadata, and parent-visible nested summaries.
15
16
 
16
17
  ### Fixed
17
- - Smooth live subagent widget animation by requesting redraws on spinner ticks without remounting the widget, preserving 250ms async status polling while reducing flicker.
18
+ - Include selected direct MCP tool names in explicit child tool allowlists when metadata cache/config resolution is available.
19
+ - Bound nested fanout control inbox retry/dedupe state and clean stale nested event/run directories during extension startup.
20
+ - Serialize nested registry projection and expand the processed-event replay guard to avoid concurrent sidecar write races and active-session replay churn.
21
+ - Write async runner config files with owner-only permissions so nested route capability tokens are not exposed through permissive umasks.
22
+ - Treat provider-coerced single-run `output: "false"` the same as boolean `false`, preventing literal `false` output files.
23
+ - Respect read-only completion guard overrides and document `completionGuard: false` as a user-authored frontmatter escape hatch.
24
+ - Suppress flashing console windows when spawning child processes on Windows (`windowsHide: true`).
18
25
  - Append the current user-selected model as the final subagent fallback candidate, so retryable provider/model failures still get one last attempt after configured `fallbackModels` are exhausted.
19
26
  - Keep subagent running glyphs stable between live animation ticks by deriving their base frame from progress state.
20
27
  - Treat intermediate child provider/tool errors as recovered when a later clean assistant response succeeds, for both foreground and async subagent runs.
@@ -1,24 +1,28 @@
1
1
  <p>
2
- <img src="https://raw.githubusercontent.com/nicobailon/pi-subagents/main/banner.png" alt="pi-subagents" width="1100">
2
+ <img src="https://raw.githubusercontent.com/nicobailon/pi-subagents/main/banner.png" alt="Atomic subagents" width="1100">
3
3
  </p>
4
4
 
5
- # pi-subagents
5
+ # @bastani/subagents
6
6
 
7
- `pi-subagents` lets Pi delegate work to focused child agents. Use it for code review, scouting, implementation, parallel audits, saved workflows, background jobs, and anything else that benefits from a second or third set of model eyes.
7
+ `@bastani/subagents` lets Atomic delegate work to focused child agents. It is Atomic's bundled adaptation of upstream `pi-subagents`; use it for code review, scouting, implementation, parallel audits, saved workflows, background jobs, and anything else that benefits from a second or third set of model eyes.
8
8
 
9
9
  https://github.com/user-attachments/assets/702554ec-faaf-4635-80aa-fb5d6e292fd1
10
10
 
11
11
  ## Installation
12
12
 
13
+ Atomic bundles this extension through `@bastani/atomic`; no separate install is required for Atomic users.
14
+
15
+ For upstream Pi installs, use:
16
+
13
17
  ```bash
14
18
  pi install npm:pi-subagents
15
19
  ```
16
20
 
17
- That is the only required step. You can add optional pieces later.
21
+ You can add optional pieces later.
18
22
 
19
23
  ## Try this first
20
24
 
21
- You do not need to create agents, write config, or learn slash commands. After installing, ask Pi for delegation in plain language:
25
+ You do not need to create agents, write config, or learn slash commands. Ask Atomic for delegation in plain language:
22
26
 
23
27
  ```text
24
28
  Use reviewer to review this diff.
@@ -141,7 +145,7 @@ For a persistent override, edit settings. This example pins the reviewer everywh
141
145
  }
142
146
  ```
143
147
 
144
- Use `~/.pi/agent/settings.json` for a user override or `.pi/settings.json` for a project override. The same `agentOverrides` block can change `tools`, `skills`, inherited context, prompt text, or disable a builtin. If you want a totally different agent, create a user or project agent with the same name; for normal tweaks, prefer overrides.
148
+ Use `~/.atomic/agent/settings.json` for a user override or `.atomic/settings.json` for a project override; legacy `~/.pi/agent/settings.json` and `.pi/settings.json` paths are also checked for compatibility. The same `agentOverrides` block can change `tools`, `skills`, inherited context, prompt text, or disable a builtin. If you want a totally different agent, create a user or project agent with the same name; for normal tweaks, prefer overrides.
145
149
 
146
150
  ## Where running subagents show up
147
151
 
@@ -181,7 +185,7 @@ Use the optional prompt shortcuts below when you want the pattern to be repeatab
181
185
 
182
186
  Packaged `planner`, `worker`, and `oracle` default to forked context when a launch omits `context`; pass `context: "fresh"` when you intentionally want a fresh child run.
183
187
 
184
- Child-safety boundaries are enforced at runtime. Spawned child sessions do not register the `subagent` tool, do not receive the bundled `pi-subagents` skill, and receive explicit boundary instructions that they are not the parent orchestrator and must not propose or run subagents. Forked child context filtering also removes parent-only subagent artifacts (including old hidden orchestration-instruction messages, slash/status/control messages, and prior parent `subagent` tool-call/tool-result history) while preserving ordinary prose and unrelated tool calls/results.
188
+ Child-safety boundaries are enforced at runtime. Spawned child sessions do not register the `subagent` tool or receive the bundled `pi-subagents` skill unless the parent intentionally selected an explicit fanout agent whose resolved builtin `tools` includes `subagent`. Non-fanout children receive boundary instructions that they are not the parent orchestrator and must not propose or run subagents; authorized fanout children get a narrower boundary that limits nested delegation to the assigned fanout. Forked child context filtering also removes parent-only subagent artifacts (including old hidden orchestration-instruction messages, slash/status/control messages, and prior parent `subagent` tool-call/tool-result history) while preserving ordinary prose and unrelated tool calls/results.
185
189
 
186
190
  ## Optional shortcuts
187
191
 
@@ -199,15 +203,15 @@ The package includes reusable prompt templates for common workflows. You do not
199
203
 
200
204
  Add `autofix` to `/parallel-review` or `/parallel-cleanup` to apply only the synthesized fixes worth doing now after reviewers return.
201
205
 
202
- ## Optional pi-intercom companion
206
+ ## Optional intercom companion
203
207
 
204
- `pi-subagents` works without `pi-intercom`. Install `pi-intercom` only if you want child agents to talk back to the parent Pi session while they are running.
208
+ Atomic subagents work without intercom. Atomic bundles `@bastani/intercom`; upstream Pi users can install `pi-intercom` if they want child agents to talk back to the parent session while they are running.
205
209
 
206
210
  ```bash
207
211
  pi install npm:pi-intercom
208
212
  ```
209
213
 
210
- Most users do not call `intercom` directly. After `pi-intercom` is installed, `pi-subagents` can automatically give child agents a private coordination channel back to the parent session. The bridge recognizes the normal `pi install npm:pi-intercom` package install as well as legacy local extension checkouts.
214
+ Most users do not call `intercom` directly. When the intercom companion is available, subagents can automatically give child agents a private coordination channel back to the parent session. The bridge recognizes Atomic's bundled intercom package, the normal upstream `pi install npm:pi-intercom` package install, and legacy local extension checkouts.
211
215
 
212
216
  Use it for work where the child might need a decision instead of guessing:
213
217
 
@@ -351,19 +355,19 @@ Picker screens use `↑↓`, `Enter`, `Escape`, and type-to-filter. The full-scr
351
355
 
352
356
  ## Agents and chains
353
357
 
354
- Agents are markdown files with YAML frontmatter and a system prompt body. They define the specialist that will run in the child Pi process.
358
+ Agents are markdown files with YAML frontmatter and a system prompt body. They define the specialist that will run in the child Atomic process.
355
359
 
356
360
  Agent locations, lowest to highest priority:
357
361
 
358
362
  | Scope | Path |
359
363
  |-------|------|
360
- | Builtin | `~/.pi/agent/extensions/subagent/agents/` |
361
- | User | `~/.pi/agent/agents/**/*.md` |
362
- | Project | `.pi/agents/**/*.md` |
364
+ | Builtin | bundled with `@bastani/atomic` / `~/.atomic/agent/extensions/subagent/agents/` |
365
+ | User | `~/.atomic/agent/agents/**/*.md` |
366
+ | Project | `.atomic/agents/**/*.md` |
363
367
 
364
- Project discovery also reads legacy `.agents/**/*.md` files. Nested subdirectories are discovered recursively. `.chain.md` files do not define agents. If both `.agents/` and `.pi/agents/` define the same parsed runtime agent name, `.pi/agents/` wins. Use `agentScope: "user" | "project" | "both"` to control discovery; `both` is the default and project definitions win runtime-name collisions.
368
+ Project discovery also reads legacy `.agents/**/*.md` and `.pi/agents/**/*.md` files. Nested subdirectories are discovered recursively. `.chain.md` files do not define agents. If primary Atomic and legacy paths define the same parsed runtime agent name, the primary `.atomic/agents/` definition wins. Use `agentScope: "user" | "project" | "both"` to control discovery; `both` is the default and project definitions win runtime-name collisions.
365
369
 
366
- Builtin agents load at the lowest priority, so a user or project agent with the same name overrides them. They do not pin a provider model; they inherit your current Pi default model unless you set `subagents.agentOverrides.<name>.model`. `oracle` is an advisory reviewer that critiques direction and proposes an execution prompt without editing files. `worker` is the implementation agent for normal tasks and approved oracle handoffs.
370
+ Builtin agents load at the lowest priority, so a user or project agent with the same name overrides them. They do not pin a provider model; they inherit your current Atomic default model unless you set `subagents.agentOverrides.<name>.model`. `oracle` is an advisory reviewer that critiques direction and proposes an execution prompt without editing files. `worker` is the implementation agent for normal tasks and approved oracle handoffs.
367
371
 
368
372
  The `researcher` builtin uses `web_search`, `fetch_content`, and `get_search_content`; those require [pi-web-access](https://github.com/nicobailon/pi-web-access):
369
373
 
@@ -375,8 +379,8 @@ pi install npm:pi-web-access
375
379
 
376
380
  You can override selected builtin fields without copying the whole agent. Overrides live in settings:
377
381
 
378
- - User: `~/.pi/agent/settings.json`
379
- - Project: `.pi/settings.json`
382
+ - User: `~/.atomic/agent/settings.json` (legacy: `~/.pi/agent/settings.json`)
383
+ - Project: `.atomic/settings.json` (legacy: `.pi/settings.json`)
380
384
 
381
385
  Example:
382
386
 
@@ -459,6 +463,7 @@ Important fields:
459
463
  | `defaultReads` | Files to read before running in chain/parallel behavior. |
460
464
  | `defaultProgress` | Maintain `progress.md`. |
461
465
  | `interactive` | Parsed for compatibility but not enforced in v1. |
466
+ | `completionGuard` | Set to `false` to intentionally opt this agent out of automatic completion-guard reminders. Use sparingly for user-authored read-only/review agents whose prompt already prevents premature completion. |
462
467
  | `maxSubagentDepth` | Tightens nested delegation for this agent’s children. |
463
468
 
464
469
  ### Tool and extension selection
@@ -493,8 +498,8 @@ Chains are reusable `.chain.md` workflows stored separately from agent files.
493
498
 
494
499
  | Scope | Path |
495
500
  |-------|------|
496
- | User | `~/.pi/agent/chains/**/*.chain.md` |
497
- | Project | `.pi/chains/**/*.chain.md` |
501
+ | User | `~/.atomic/agent/chains/**/*.chain.md` |
502
+ | Project | `.atomic/chains/**/*.chain.md` |
498
503
 
499
504
  Nested subdirectories are discovered recursively. If user and project scopes define the same parsed runtime chain name, the project chain wins. Chains support the same optional `package` frontmatter as agents; `name: review-flow` plus `package: code-analysis` runs as `code-analysis.review-flow`.
500
505
 
@@ -555,13 +560,15 @@ Skills are `SKILL.md` files injected into an agent’s system prompt.
555
560
 
556
561
  Discovery uses project-first precedence:
557
562
 
558
- 1. `.pi/skills/{name}/SKILL.md`
563
+ 1. `.atomic/skills/{name}/SKILL.md`
559
564
  2. Project packages and project settings packages via `package.json -> pi.skills`
560
565
  3. Current task cwd package via `package.json -> pi.skills`
561
- 4. `.pi/settings.json -> skills`
562
- 5. `~/.pi/agent/skills/{name}/SKILL.md`
566
+ 4. `.atomic/settings.json -> skills`
567
+ 5. `~/.atomic/agent/skills/{name}/SKILL.md`
563
568
  6. User packages and user settings packages via `package.json -> pi.skills`
564
- 7. `~/.pi/agent/settings.json -> skills`
569
+ 7. `~/.atomic/agent/settings.json -> skills`
570
+
571
+ Legacy `.pi` and `~/.pi/agent` skill/settings paths are also checked for compatibility.
565
572
 
566
573
  Use agent defaults, override them at runtime, or disable them:
567
574
 
@@ -585,7 +592,7 @@ Missing skills do not fail execution. The result summary shows a warning.
585
592
 
586
593
  ### Bundled skill
587
594
 
588
- The package bundles a `pi-subagents` skill that is automatically available to the parent agent when the extension is installed. It is for the orchestrating parent only: child subagents never receive it, and their context is explicitly filtered to strip parent-only orchestration instructions.
595
+ The package bundles a `subagent` skill that is automatically available to the parent agent when the extension is installed. It is for the orchestrating parent only: child subagents never receive it unless explicitly authorized for fanout, and their context is filtered to strip parent-only orchestration instructions.
589
596
 
590
597
  What the bundled skill covers:
591
598
  - **Delegation patterns**: when to launch which agent, whether to use single, parallel, chain, or async mode, and whether to use fresh or forked context
@@ -775,7 +782,7 @@ After a worktree parallel step completes, per-agent diff stats are appended to t
775
782
 
776
783
  ## Configuration
777
784
 
778
- `pi-subagents` reads optional JSON config from `~/.pi/agent/extensions/subagent/config.json`.
785
+ Atomic subagents read optional JSON config from `~/.atomic/agent/extensions/subagent/config.json` and still check the legacy `~/.pi/agent/extensions/subagent/config.json` path for compatibility.
779
786
 
780
787
  ### `asyncByDefault`
781
788
 
@@ -809,7 +816,7 @@ Forces depth-0 single, parallel, and chain runs into background mode and bypasse
809
816
  ### `defaultSessionDir`
810
817
 
811
818
  ```json
812
- { "defaultSessionDir": "~/.pi/agent/sessions/subagent/" }
819
+ { "defaultSessionDir": "~/.atomic/agent/sessions/subagent/" }
813
820
  ```
814
821
 
815
822
  Session directory precedence is: `params.sessionDir`, then `config.defaultSessionDir`, then a directory derived from the parent session. Sessions are always enabled.
@@ -838,9 +845,9 @@ Controls whether subagents receive runtime intercom coordination instructions an
838
845
  Fields:
839
846
 
840
847
  - `mode`: default `always`; use `fork-only` to inject only for forked runs, or `off` to disable the bridge.
841
- - `instructionFile`: optional Markdown template replacing the default bridge instructions. `{orchestratorTarget}` is interpolated. Relative paths resolve from `~/.pi/agent/extensions/subagent/`.
848
+ - `instructionFile`: optional Markdown template replacing the default bridge instructions. `{orchestratorTarget}` is interpolated. Relative paths resolve from `~/.atomic/agent/extensions/subagent/` (or the legacy `~/.pi/agent/extensions/subagent/` path when used).
842
849
 
843
- Bridge activation also requires `pi-intercom` to be installed and enabled through `pi install npm:pi-intercom` or a legacy local extension checkout, a targetable current session name or fallback alias, and `pi-intercom` in any explicit agent `extensions` allowlist.
850
+ Bridge activation also requires the Atomic intercom companion (or upstream `pi-intercom` installed through `pi install npm:pi-intercom` / a legacy local extension checkout), a targetable current session name or fallback alias, and the intercom extension in any explicit agent `extensions` allowlist.
844
851
 
845
852
  The default injected guidance tells children to use `contact_supervisor` with `reason: "need_decision"` when blocked or needing a decision, `reason: "progress_update"` only for meaningful blocked/progress updates, generic `intercom` as fallback plumbing, and avoid routine completion handoffs.
846
853
 
@@ -868,7 +875,7 @@ stdin is a JSON object with `repoRoot`, `worktreePath`, `agentCwd`, `branch`, `i
868
875
  Each chain run creates a user-scoped temp directory like:
869
876
 
870
877
  ```text
871
- <tmpdir>/pi-subagents-<scope>/chain-runs/{runId}/
878
+ <tmpdir>/atomic-subagents-<scope>/chain-runs/{runId}/
872
879
  ```
873
880
 
874
881
  It may contain files such as `context.md`, `plan.md`, `progress.md`, and `parallel-{stepIndex}/.../output.md`. Directories older than 24 hours are cleaned up on extension startup.
@@ -889,7 +896,7 @@ Async completions notify only the originating session. The result watcher emits
889
896
  Async runs write:
890
897
 
891
898
  ```text
892
- <tmpdir>/pi-subagents-<scope>/async-subagent-runs/<id>/
899
+ <tmpdir>/atomic-subagents-<scope>/async-subagent-runs/<id>/
893
900
  status.json
894
901
  events.jsonl
895
902
  output-<n>.log
@@ -924,7 +931,7 @@ By default, nesting is limited to two levels: main session → subagent → sub-
924
931
 
925
932
  Configure the limit with:
926
933
 
927
- 1. `PI_SUBAGENT_MAX_DEPTH` before starting Pi
934
+ 1. `ATOMIC_SUBAGENT_MAX_DEPTH` (or legacy `PI_SUBAGENT_MAX_DEPTH`) before starting Atomic
928
935
  2. `config.maxSubagentDepth`
929
936
  3. `maxSubagentDepth` in agent frontmatter, which can only tighten the inherited limit
930
937
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.8.13",
3
+ "version": "0.8.14",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with chains, parallel execution, and TUI clarification. Fork of: https://github.com/nicobailon/pi-subagents",
6
6
  "contributors": [
@@ -159,8 +159,8 @@ For implementation handoffs to `debugger` or `code-simplifier`, name the approve
159
159
 
160
160
  Settings locations:
161
161
 
162
- - User scope: `~/.pi/agent/settings.json`
163
- - Project scope: `.pi/settings.json`
162
+ - User scope: `~/.atomic/agent/settings.json` (legacy: `~/.pi/agent/settings.json`)
163
+ - Project scope: `.atomic/settings.json` (legacy: `.pi/settings.json`)
164
164
 
165
165
  Direct settings example:
166
166
 
@@ -184,14 +184,14 @@ Useful override fields: `model`, `fallbackModels`, `thinking`, `systemPromptMode
184
184
 
185
185
  Agent files can live in:
186
186
 
187
- - `~/.pi/agent/agents/**/*.md` — user scope
188
- - `.pi/agents/**/*.md` — canonical project scope
189
- - legacy `.agents/**/*.md` — still read for compatibility, but `.pi/agents/` wins on conflicts
187
+ - `~/.atomic/agent/agents/**/*.md` — user scope
188
+ - `.atomic/agents/**/*.md` — canonical project scope
189
+ - legacy `.agents/**/*.md` and `.pi/agents/**/*.md` — still read for compatibility, but `.atomic/agents/` wins on conflicts
190
190
 
191
191
  Chains live in:
192
192
 
193
- - `~/.pi/agent/chains/**/*.chain.md` — user scope
194
- - `.pi/chains/**/*.chain.md` — project scope
193
+ - `~/.atomic/agent/chains/**/*.chain.md` — user scope
194
+ - `.atomic/chains/**/*.chain.md` — project scope
195
195
 
196
196
  Discovery is recursive. `.chain.md` files do not define agents. Agents and chains can set optional frontmatter `package: code-analysis`; `name: codebase-analyzer` plus `package: code-analysis` registers as runtime name `code-analysis.codebase-analyzer` while serialization keeps `name` and `package` separate.
197
197
 
@@ -390,7 +390,7 @@ subagent({
390
390
 
391
391
  ## Subagent + Intercom Coordination
392
392
 
393
- `pi-subagents` works without `pi-intercom`. When `pi-intercom` is installed and enabled, the intercom bridge can automatically give child agents a private coordination channel back to the parent session.
393
+ Atomic subagents work without intercom. When Atomic's bundled intercom companion or upstream `pi-intercom` is installed and enabled, the intercom bridge can automatically give child agents a private coordination channel back to the parent session.
394
394
 
395
395
  The builtin specialists in this skill do not declare the `intercom` tool, so they finish their pass and return without coordinating. They cannot pause to ask the parent for a decision mid-run; if you need that, write a custom agent that lists `intercom` (or that the runtime bridge can inject `contact_supervisor` into).
396
396
 
@@ -419,7 +419,7 @@ Message conventions:
419
419
 
420
420
  - `reason: "need_decision"` waits for the parent reply and returns it to the child.
421
421
  - `reason: "progress_update"` is non-blocking and should stay concise.
422
- - Child-side routine completion handoffs are not expected. With the intercom bridge active, parent-side `pi-subagents` sends grouped completion results through `pi-intercom`: one grouped message per foreground parent run and one per completed async result file. Acknowledged foreground delivery returns a compact receipt with artifact/session paths; if unacknowledged, the normal full output is preserved.
422
+ - Child-side routine completion handoffs are not expected. With the intercom bridge active, parent-side subagents send grouped completion results through the intercom companion: one grouped message per foreground parent run and one per completed async result file. Acknowledged foreground delivery returns a compact receipt with artifact/session paths; if unacknowledged, the normal full output is preserved.
423
423
 
424
424
  Most agents should not call generic `intercom` directly unless bridge instructions provide a target and `contact_supervisor` is unavailable. Do not invent a target.
425
425
 
@@ -510,7 +510,7 @@ For many customizations, builtin overrides in settings are lower-friction than c
510
510
 
511
511
  The package includes prompt shortcuts for common workflows: `/parallel-review`, `/review-loop`, `/parallel-research`, `/parallel-context-build`, `/parallel-handoff-plan`, `/gather-context-and-clarify`, and `/parallel-cleanup`. Use them when the user wants repeatable review, review/fix loops, research, context handoff, implementation handoff, clarification, or cleanup-review patterns. `/parallel-review autofix` launches a `debugger` or `code-simplifier` writer (depending on feedback shape) to apply the synthesized fixes worth doing now. `/parallel-cleanup autofix` launches one `code-simplifier` writer to apply the synthesized cleanup fixes. Parent agents can also apply the same recipes directly with `subagent(...)` when the user describes the workflow in natural language instead of invoking a slash command.
512
512
 
513
- If `pi-prompt-template-model` is installed, additional user prompt templates can delegate into `pi-subagents`. This is useful when a slash command should always run through a particular agent or with forked context.
513
+ If a prompt-template extension is installed, additional user prompt templates can delegate into subagents. This is useful when a slash command should always run through a particular agent or with forked context.
514
514
 
515
515
  ## Important Constraints
516
516
 
@@ -607,7 +607,7 @@ For complex work, risky changes, broad refactors, or many changed lines, increas
607
607
 
608
608
  For very large work, split into serial milestones instead of launching a swarm of writers. Each milestone gets one writer, a validation contract, fresh-context review, a fix pass, and parent acceptance before the next milestone starts. Use parallel subagents inside a milestone for read-only context, research, and review only.
609
609
 
610
- Keep orchestration authority in the parent session. Child subagents should not launch more subagents, read this skill, or run their own orchestration loops. Spawned subagents do not receive the `subagent` skill, parent-only status/control/slash messages, prior parent `subagent` tool-call/tool-result artifacts, or the `subagent` extension tool. Child context filtering also strips old hidden orchestration-instruction messages when they appear in inherited history. Every child also receives a boundary instruction that says the parent owns orchestration, the child must not propose or run subagents, and writer children must call real edit/write tools instead of printing pseudo tool calls. Pass children concrete role-specific work instead.
610
+ Keep orchestration authority in the parent session. Child subagents should not launch more subagents, read this skill, or run their own orchestration loops unless the parent intentionally selected an explicit fanout agent whose resolved builtin `tools` includes `subagent` for that assigned fanout. Spawned non-fanout subagents do not receive the `subagent` skill, parent-only status/control/slash messages, prior parent `subagent` tool-call/tool-result artifacts, or the `subagent` extension tool. Child context filtering also strips old hidden orchestration-instruction messages when they appear in inherited history. Every child also receives a boundary instruction that says the parent owns orchestration, the child must not propose or run subagents unless explicitly authorized for fanout, and writer children must call real edit/write tools instead of printing pseudo tool calls. Pass children concrete role-specific work instead.
611
611
 
612
612
  1. Clarify first. Gather code context with `codebase-locator`, `codebase-analyzer`, `codebase-pattern-finder`, and prior research specialists; add `codebase-online-researcher` only when external evidence matters; then ask the user clarifying questions with `interview` until scope, acceptance criteria, constraints, and non-goals are clear.
613
613
  2. Define the validation contract. State what done means before implementation: expected behavior, checks to run, user flows to exercise, and evidence required in the writer handoff. For UI, CLI, integration, or workflow changes, include at least one validator angle that uses the product the way a user would rather than only reading code.
@@ -1,7 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
4
3
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
4
+ import { CONFIG_DIR_NAME } from "@bastani/atomic";
5
5
  import type { ExtensionContext } from "@bastani/atomic";
6
6
  import {
7
7
  type AgentConfig,
@@ -298,6 +298,10 @@ function applyAgentConfig(target: AgentConfig, cfg: Record<string, unknown>): st
298
298
  target.maxSubagentDepth = cfg.maxSubagentDepth;
299
299
  } else return "config.maxSubagentDepth must be an integer >= 0 or false when provided.";
300
300
  }
301
+ if (hasKey(cfg, "completionGuard")) {
302
+ if (typeof cfg.completionGuard !== "boolean") return "config.completionGuard must be a boolean when provided.";
303
+ target.completionGuard = cfg.completionGuard;
304
+ }
301
305
  return undefined;
302
306
  }
303
307
 
@@ -367,6 +371,7 @@ function formatAgentDetail(agent: AgentConfig): string {
367
371
  if (agent.defaultReads?.length) lines.push(`Reads: ${agent.defaultReads.join(", ")}`);
368
372
  if (agent.defaultProgress) lines.push("Progress: true");
369
373
  if (agent.maxSubagentDepth !== undefined) lines.push(`Max subagent depth: ${agent.maxSubagentDepth}`);
374
+ if (agent.completionGuard === false) lines.push("Completion guard: false");
370
375
  if (agent.systemPrompt.trim()) lines.push("", "System Prompt:", agent.systemPrompt);
371
376
  return lines.join("\n");
372
377
  }
@@ -21,6 +21,7 @@ export const KNOWN_FIELDS = new Set([
21
21
  "defaultProgress",
22
22
  "interactive",
23
23
  "maxSubagentDepth",
24
+ "completionGuard",
24
25
  ]);
25
26
 
26
27
  function joinComma(values: string[] | undefined): string | undefined {
@@ -70,6 +71,7 @@ export function serializeAgent(config: AgentConfig): string {
70
71
  if (typeof maxSubagentDepth === "number" && Number.isInteger(maxSubagentDepth) && maxSubagentDepth >= 0) {
71
72
  lines.push(`maxSubagentDepth: ${maxSubagentDepth}`);
72
73
  }
74
+ if (config.completionGuard === false) lines.push("completionGuard: false");
73
75
 
74
76
  if (config.extraFields) {
75
77
  for (const [key, value] of Object.entries(config.extraFields)) {