@bastani/atomic 0.8.13-0 → 0.8.14-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 (355) hide show
  1. package/CHANGELOG.md +24 -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
@@ -27,7 +27,7 @@ import { minimatch } from "minimatch";
27
27
  import { APP_NAME, CONFIG_DIR_NAME, ENV_OFFLINE, getAgentDir, getAgentDirs, getEnvValue, getProjectConfigDirs } from "../config.js";
28
28
  import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
29
29
  import { parseGitUrl } from "../utils/git.js";
30
- import { canonicalizePath, isLocalPath } from "../utils/paths.js";
30
+ import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
31
31
  import { isStdoutTakenOver } from "./output-guard.js";
32
32
  const NETWORK_TIMEOUT_MS = 10000;
33
33
  const UPDATE_CHECK_CONCURRENCY = 4;
@@ -596,8 +596,8 @@ function applyPatterns(allPaths, patterns, baseDir) {
596
596
  }
597
597
  export class DefaultPackageManager {
598
598
  constructor(options) {
599
- this.cwd = options.cwd;
600
- this.agentDir = options.agentDir;
599
+ this.cwd = resolvePath(options.cwd);
600
+ this.agentDir = resolvePath(options.agentDir);
601
601
  this.settingsManager = options.settingsManager;
602
602
  }
603
603
  setProgressCallback(callback) {
@@ -608,9 +608,22 @@ export class DefaultPackageManager {
608
608
  const currentSettings = scope === "project" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();
609
609
  const currentPackages = currentSettings.packages ?? [];
610
610
  const normalizedSource = this.normalizePackageSourceForSettings(source, scope);
611
- const exists = currentPackages.some((existing) => this.packageSourcesMatch(existing, source, scope));
612
- if (exists) {
613
- return false;
611
+ const matchIndex = currentPackages.findIndex((existing) => this.packageSourcesMatch(existing, source, scope));
612
+ if (matchIndex !== -1) {
613
+ const existing = currentPackages[matchIndex];
614
+ if (this.getPackageSourceString(existing) === normalizedSource) {
615
+ return false;
616
+ }
617
+ const nextPackages = [...currentPackages];
618
+ nextPackages[matchIndex] =
619
+ typeof existing === "string" ? normalizedSource : { ...existing, source: normalizedSource };
620
+ if (scope === "project") {
621
+ this.settingsManager.setProjectPackages(nextPackages);
622
+ }
623
+ else {
624
+ this.settingsManager.setPackages(nextPackages);
625
+ }
626
+ return true;
614
627
  }
615
628
  const nextPackages = [...currentPackages, normalizedSource];
616
629
  if (scope === "project") {
@@ -859,14 +872,16 @@ export class DefaultPackageManager {
859
872
  const gitCandidates = [];
860
873
  for (const entry of sources) {
861
874
  const parsed = this.parseSource(entry.source);
862
- if (parsed.type === "local" || parsed.pinned) {
863
- continue;
864
- }
875
+ // Pinned npm versions are fixed. Pinned git refs are configured checkout targets,
876
+ // so include them to reconcile an existing clone when the configured ref changes.
865
877
  if (parsed.type === "npm") {
866
- npmCandidates.push({ ...entry, parsed });
867
- continue;
878
+ if (!parsed.pinned) {
879
+ npmCandidates.push({ ...entry, parsed });
880
+ }
881
+ }
882
+ else if (parsed.type === "git") {
883
+ gitCandidates.push({ ...entry, parsed });
868
884
  }
869
- gitCandidates.push({ ...entry, parsed });
870
885
  }
871
886
  const npmCheckTasks = npmCandidates.map((entry) => async () => ({
872
887
  entry,
@@ -902,8 +917,8 @@ export class DefaultPackageManager {
902
917
  await Promise.all(tasks);
903
918
  }
904
919
  async shouldUpdateNpmSource(source, scope) {
905
- const installedPath = this.getExistingNpmInstallPath(source, scope);
906
- const installedVersion = installedPath ? this.getInstalledNpmVersion(installedPath) : undefined;
920
+ const installedPath = this.getManagedNpmInstallPath(source, scope);
921
+ const installedVersion = existsSync(installedPath) ? this.getInstalledNpmVersion(installedPath) : undefined;
907
922
  if (!installedVersion) {
908
923
  return true;
909
924
  }
@@ -928,13 +943,9 @@ export class DefaultPackageManager {
928
943
  });
929
944
  }
930
945
  async installNpmBatch(specs, scope) {
931
- if (scope === "user") {
932
- await this.runNpmCommand(["install", "-g", ...specs]);
933
- return;
934
- }
935
946
  const installRoot = this.getNpmInstallRoot(scope, false);
936
947
  this.ensureNpmProject(installRoot);
937
- await this.runNpmCommand(["install", ...specs, "--prefix", installRoot]);
948
+ await this.runNpmCommand(this.getNpmInstallArgs(specs, installRoot));
938
949
  }
939
950
  async checkForAvailableUpdates() {
940
951
  if (isOfflineModeEnabled()) {
@@ -959,8 +970,8 @@ export class DefaultPackageManager {
959
970
  return undefined;
960
971
  }
961
972
  if (parsed.type === "npm") {
962
- const installedPath = this.getExistingNpmInstallPath(parsed, entry.scope);
963
- if (!installedPath) {
973
+ const installedPath = this.getNpmInstallPath(parsed, entry.scope);
974
+ if (!existsSync(installedPath)) {
964
975
  return undefined;
965
976
  }
966
977
  const hasUpdate = await this.npmHasAvailableUpdate(parsed, installedPath);
@@ -1426,6 +1437,13 @@ export class DefaultPackageManager {
1426
1437
  }
1427
1438
  return { command, args };
1428
1439
  }
1440
+ getPackageManagerName() {
1441
+ const npmCommand = this.getNpmCommand();
1442
+ const commandParts = [npmCommand.command, ...npmCommand.args];
1443
+ const separatorIndex = commandParts.lastIndexOf("--");
1444
+ const packageManagerCommand = separatorIndex >= 0 ? commandParts[separatorIndex + 1] : npmCommand.command;
1445
+ return packageManagerCommand ? basename(packageManagerCommand).replace(/\.(cmd|exe)$/i, "") : "";
1446
+ }
1429
1447
  async runNpmCommand(args, options) {
1430
1448
  const npmCommand = this.getNpmCommand();
1431
1449
  await this.runCommand(npmCommand.command, [...npmCommand.args, ...args], options);
@@ -1441,29 +1459,74 @@ export class DefaultPackageManager {
1441
1459
  const npmCommand = this.getNpmCommand();
1442
1460
  return this.runCommandSync(npmCommand.command, [...npmCommand.args, ...args]);
1443
1461
  }
1462
+ getNpmInstallArgs(specs, installRoot) {
1463
+ const packageManagerName = this.getPackageManagerName();
1464
+ // Extension packages run inside Atomic and resolve pi APIs through loader aliases/virtual modules.
1465
+ // Disable peer dependency resolution for managed installs (npm's --legacy-peer-deps, and
1466
+ // equivalent bun/pnpm settings) so package managers do not install or solve host-provided
1467
+ // @earendil-works/pi-* peers. Stale auto-installed pi peers can otherwise block updates.
1468
+ if (packageManagerName === "bun") {
1469
+ return ["install", ...specs, "--cwd", installRoot, "--omit=peer"];
1470
+ }
1471
+ if (packageManagerName === "pnpm") {
1472
+ return [
1473
+ "install",
1474
+ ...specs,
1475
+ "--prefix",
1476
+ installRoot,
1477
+ "--config.auto-install-peers=false",
1478
+ "--config.strict-peer-dependencies=false",
1479
+ "--config.strict-dep-builds=false",
1480
+ ];
1481
+ }
1482
+ return ["install", ...specs, "--prefix", installRoot, "--legacy-peer-deps"];
1483
+ }
1444
1484
  async installNpm(source, scope, temporary) {
1445
- if (scope === "user" && !temporary) {
1446
- await this.runNpmCommand(["install", "-g", source.spec]);
1447
- return;
1448
- }
1449
1485
  const installRoot = this.getNpmInstallRoot(scope, temporary);
1450
1486
  this.ensureNpmProject(installRoot);
1451
- await this.runNpmCommand(["install", source.spec, "--prefix", installRoot]);
1487
+ await this.runNpmCommand(this.getNpmInstallArgs([source.spec], installRoot));
1452
1488
  }
1453
1489
  async uninstallNpm(source, scope) {
1454
- if (scope === "user") {
1455
- await this.runNpmCommand(["uninstall", "-g", source.name]);
1456
- return;
1457
- }
1458
1490
  const installRoot = this.getNpmInstallRoot(scope, false);
1459
1491
  if (!existsSync(installRoot)) {
1460
1492
  return;
1461
1493
  }
1494
+ if (this.getPackageManagerName() === "bun") {
1495
+ await this.runNpmCommand(["uninstall", source.name, "--cwd", installRoot]);
1496
+ return;
1497
+ }
1462
1498
  await this.runNpmCommand(["uninstall", source.name, "--prefix", installRoot]);
1463
1499
  }
1500
+ getSafeGitRef(ref) {
1501
+ if (!this.isSafeGitRef(ref)) {
1502
+ throw new Error(`Invalid git ref: ${JSON.stringify(ref)}`);
1503
+ }
1504
+ return ref;
1505
+ }
1506
+ isSafeGitRef(ref) {
1507
+ if (!ref || ref === "@" || ref.startsWith("-") || ref.endsWith(".") || ref.endsWith("/")) {
1508
+ return false;
1509
+ }
1510
+ if (/[\x00-\x1f\x7f\s~^:?*\[\]\\]/u.test(ref)) {
1511
+ return false;
1512
+ }
1513
+ if (ref.includes("..") || ref.includes("@{") || ref.includes("//")) {
1514
+ return false;
1515
+ }
1516
+ return ref
1517
+ .split("/")
1518
+ .every((part) => part && part !== "." && part !== ".." && !part.startsWith(".") && !part.endsWith(".lock"));
1519
+ }
1464
1520
  async installGit(source, scope) {
1521
+ const safeRef = source.ref ? this.getSafeGitRef(source.ref) : undefined;
1465
1522
  const targetDir = this.getGitInstallPath(source, scope);
1466
1523
  if (existsSync(targetDir)) {
1524
+ if (safeRef) {
1525
+ await this.ensureGitRef(targetDir, ["fetch", "origin", "--", safeRef], "FETCH_HEAD");
1526
+ return;
1527
+ }
1528
+ const target = await this.getLocalGitUpdateTarget(targetDir);
1529
+ await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
1467
1530
  return;
1468
1531
  }
1469
1532
  const gitRoot = this.getGitInstallRoot(scope);
@@ -1472,8 +1535,8 @@ export class DefaultPackageManager {
1472
1535
  }
1473
1536
  mkdirSync(dirname(targetDir), { recursive: true });
1474
1537
  await this.runCommand("git", ["clone", "--", source.repo, targetDir]);
1475
- if (source.ref) {
1476
- await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
1538
+ if (safeRef) {
1539
+ await this.runCommand("git", ["checkout", safeRef], { cwd: targetDir });
1477
1540
  }
1478
1541
  const packageJsonPath = join(targetDir, "package.json");
1479
1542
  if (existsSync(packageJsonPath)) {
@@ -1481,26 +1544,35 @@ export class DefaultPackageManager {
1481
1544
  }
1482
1545
  }
1483
1546
  async updateGit(source, scope) {
1547
+ const safeRef = source.ref ? this.getSafeGitRef(source.ref) : undefined;
1484
1548
  const targetDir = this.getExistingGitInstallPath(source, scope) ?? this.getGitInstallPath(source, scope);
1485
1549
  if (!existsSync(targetDir)) {
1486
1550
  await this.installGit(source, scope);
1487
1551
  return;
1488
1552
  }
1553
+ if (safeRef) {
1554
+ await this.ensureGitRef(targetDir, ["fetch", "origin", "--", safeRef], "FETCH_HEAD");
1555
+ return;
1556
+ }
1489
1557
  const target = await this.getLocalGitUpdateTarget(targetDir);
1558
+ await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
1559
+ }
1560
+ async ensureGitRef(targetDir, fetchArgs, ref) {
1490
1561
  // Fetch only the ref we will reset to, avoiding unrelated branch/tag noise.
1491
- await this.runCommand("git", target.fetchArgs, { cwd: targetDir });
1562
+ await this.runCommand("git", fetchArgs, { cwd: targetDir });
1492
1563
  const localHead = await this.runCommandCapture("git", ["rev-parse", "HEAD"], {
1493
1564
  cwd: targetDir,
1494
1565
  timeoutMs: NETWORK_TIMEOUT_MS,
1495
1566
  });
1496
- const refreshedTargetHead = await this.runCommandCapture("git", ["rev-parse", target.ref], {
1567
+ const commitRef = `${ref}^{commit}`;
1568
+ const targetHead = await this.runCommandCapture("git", ["rev-parse", commitRef], {
1497
1569
  cwd: targetDir,
1498
1570
  timeoutMs: NETWORK_TIMEOUT_MS,
1499
1571
  });
1500
- if (localHead.trim() === refreshedTargetHead.trim()) {
1572
+ if (localHead.trim() === targetHead.trim()) {
1501
1573
  return;
1502
1574
  }
1503
- await this.runCommand("git", ["reset", "--hard", target.ref], { cwd: targetDir });
1575
+ await this.runCommand("git", ["reset", "--hard", commitRef], { cwd: targetDir });
1504
1576
  // Clean untracked files (extensions should be pristine)
1505
1577
  await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
1506
1578
  const packageJsonPath = join(targetDir, "package.json");
@@ -1555,6 +1627,7 @@ export class DefaultPackageManager {
1555
1627
  if (!existsSync(installRoot)) {
1556
1628
  mkdirSync(installRoot, { recursive: true });
1557
1629
  }
1630
+ markPathIgnoredByCloudSync(installRoot);
1558
1631
  this.ensureGitIgnore(installRoot);
1559
1632
  const packageJsonPath = join(installRoot, "package.json");
1560
1633
  if (!existsSync(packageJsonPath)) {
@@ -1578,7 +1651,7 @@ export class DefaultPackageManager {
1578
1651
  if (scope === "project") {
1579
1652
  return join(this.cwd, CONFIG_DIR_NAME, "npm");
1580
1653
  }
1581
- return join(this.getGlobalNpmRoot(), "..");
1654
+ return join(this.agentDir, "npm");
1582
1655
  }
1583
1656
  getGlobalNpmRoot() {
1584
1657
  const npmCommand = this.getNpmCommand();
@@ -1586,8 +1659,7 @@ export class DefaultPackageManager {
1586
1659
  if (this.globalNpmRoot && this.globalNpmRootCommandKey === commandKey) {
1587
1660
  return this.globalNpmRoot;
1588
1661
  }
1589
- const isBunPackageManager = npmCommand.command === "bun";
1590
- if (isBunPackageManager) {
1662
+ if (this.getPackageManagerName() === "bun") {
1591
1663
  const binDir = this.runNpmCommandSync(["pm", "bin", "-g"]).trim();
1592
1664
  this.globalNpmRoot = join(dirname(binDir), "install", "global", "node_modules");
1593
1665
  }
@@ -1597,14 +1669,43 @@ export class DefaultPackageManager {
1597
1669
  this.globalNpmRootCommandKey = commandKey;
1598
1670
  return this.globalNpmRoot;
1599
1671
  }
1600
- getNpmInstallPath(source, scope) {
1672
+ getPnpmGlobalPackagePath(packageName) {
1673
+ if (this.getPackageManagerName() !== "pnpm") {
1674
+ return undefined;
1675
+ }
1676
+ const output = this.runNpmCommandSync(["list", "-g", "--depth", "0", "--json"]);
1677
+ const entries = JSON.parse(output);
1678
+ for (const entry of entries) {
1679
+ const path = entry.dependencies?.[packageName]?.path;
1680
+ if (path)
1681
+ return path;
1682
+ }
1683
+ return undefined;
1684
+ }
1685
+ getManagedNpmInstallPath(source, scope) {
1601
1686
  if (scope === "temporary") {
1602
1687
  return join(this.getTemporaryDir("npm"), "node_modules", source.name);
1603
1688
  }
1604
1689
  if (scope === "project") {
1605
1690
  return join(this.cwd, CONFIG_DIR_NAME, "npm", "node_modules", source.name);
1606
1691
  }
1607
- return join(this.getGlobalNpmRoot(), source.name);
1692
+ return join(this.agentDir, "npm", "node_modules", source.name);
1693
+ }
1694
+ getLegacyGlobalNpmInstallPath(source) {
1695
+ try {
1696
+ return this.getPnpmGlobalPackagePath(source.name) ?? join(this.getGlobalNpmRoot(), source.name);
1697
+ }
1698
+ catch {
1699
+ return undefined;
1700
+ }
1701
+ }
1702
+ getNpmInstallPath(source, scope) {
1703
+ const managedPath = this.getManagedNpmInstallPath(source, scope);
1704
+ if (scope !== "user" || existsSync(managedPath)) {
1705
+ return managedPath;
1706
+ }
1707
+ const legacyPath = this.getLegacyGlobalNpmInstallPath(source);
1708
+ return legacyPath && existsSync(legacyPath) ? legacyPath : managedPath;
1608
1709
  }
1609
1710
  getGitInstallPath(source, scope) {
1610
1711
  if (scope === "temporary") {
@@ -1629,7 +1730,7 @@ export class DefaultPackageManager {
1629
1730
  .update(`${prefix}-${suffix ?? ""}`)
1630
1731
  .digest("hex")
1631
1732
  .slice(0, 8);
1632
- return join(tmpdir(), "pi-extensions", prefix, hash, suffix ?? "");
1733
+ return join(tmpdir(), `${APP_NAME}-extensions`, prefix, hash, suffix ?? "");
1633
1734
  }
1634
1735
  getBaseDirForScope(scope) {
1635
1736
  return this.getBaseDirsForScope(scope)[0];
@@ -1644,24 +1745,10 @@ export class DefaultPackageManager {
1644
1745
  return [this.cwd];
1645
1746
  }
1646
1747
  resolvePath(input) {
1647
- const trimmed = input.trim();
1648
- if (trimmed === "~")
1649
- return getHomeDir();
1650
- if (trimmed.startsWith("~/"))
1651
- return join(getHomeDir(), trimmed.slice(2));
1652
- if (trimmed.startsWith("~"))
1653
- return join(getHomeDir(), trimmed.slice(1));
1654
- return resolve(this.cwd, trimmed);
1748
+ return resolvePath(input, this.cwd, { homeDir: getHomeDir(), trim: true });
1655
1749
  }
1656
1750
  resolvePathFromBase(input, baseDir) {
1657
- const trimmed = input.trim();
1658
- if (trimmed === "~")
1659
- return getHomeDir();
1660
- if (trimmed.startsWith("~/"))
1661
- return join(getHomeDir(), trimmed.slice(2));
1662
- if (trimmed.startsWith("~"))
1663
- return join(getHomeDir(), trimmed.slice(1));
1664
- return resolve(baseDir, trimmed);
1751
+ return resolvePath(input, baseDir, { homeDir: getHomeDir(), trim: true });
1665
1752
  }
1666
1753
  collectPackageResources(packageRoot, accumulator, filter, metadata) {
1667
1754
  if (filter) {