@bastani/atomic 0.8.28-alpha.1 → 0.8.28-alpha.2

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 (349) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +120 -118
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/web-access/package.json +1 -1
  7. package/dist/builtin/workflows/CHANGELOG.md +8 -0
  8. package/dist/builtin/workflows/builtin/open-claude-design.ts +150 -13
  9. package/dist/builtin/workflows/package.json +1 -1
  10. package/dist/builtin/workflows/src/tui/chat-surface.ts +32 -33
  11. package/dist/builtin/workflows/src/tui/run-detail.ts +11 -4
  12. package/dist/builtin/workflows/src/tui/status-list.ts +32 -2
  13. package/dist/cli/args.d.ts +4 -0
  14. package/dist/cli/args.d.ts.map +1 -1
  15. package/dist/cli/args.js +35 -0
  16. package/dist/cli/args.js.map +1 -1
  17. package/dist/cli/project-trust.d.ts +10 -0
  18. package/dist/cli/project-trust.d.ts.map +1 -0
  19. package/dist/cli/project-trust.js +36 -0
  20. package/dist/cli/project-trust.js.map +1 -0
  21. package/dist/cli/startup-ui.d.ts +7 -0
  22. package/dist/cli/startup-ui.d.ts.map +1 -0
  23. package/dist/cli/startup-ui.js +57 -0
  24. package/dist/cli/startup-ui.js.map +1 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +24 -3
  27. package/dist/config.js.map +1 -1
  28. package/dist/core/agent-session-runtime.d.ts +3 -1
  29. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  30. package/dist/core/agent-session-runtime.js +1 -0
  31. package/dist/core/agent-session-runtime.js.map +1 -1
  32. package/dist/core/agent-session-services.d.ts +2 -1
  33. package/dist/core/agent-session-services.d.ts.map +1 -1
  34. package/dist/core/agent-session-services.js +2 -2
  35. package/dist/core/agent-session-services.js.map +1 -1
  36. package/dist/core/agent-session.d.ts +5 -1
  37. package/dist/core/agent-session.d.ts.map +1 -1
  38. package/dist/core/agent-session.js +58 -20
  39. package/dist/core/agent-session.js.map +1 -1
  40. package/dist/core/auth-storage.d.ts.map +1 -1
  41. package/dist/core/auth-storage.js +4 -3
  42. package/dist/core/auth-storage.js.map +1 -1
  43. package/dist/core/compaction/branch-summarization.d.ts +3 -1
  44. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  45. package/dist/core/compaction/branch-summarization.js +9 -3
  46. package/dist/core/compaction/branch-summarization.js.map +1 -1
  47. package/dist/core/compaction/compaction.d.ts.map +1 -1
  48. package/dist/core/compaction/compaction.js +18 -24
  49. package/dist/core/compaction/compaction.js.map +1 -1
  50. package/dist/core/compaction/utils.d.ts +1 -1
  51. package/dist/core/compaction/utils.d.ts.map +1 -1
  52. package/dist/core/compaction/utils.js +1 -1
  53. package/dist/core/compaction/utils.js.map +1 -1
  54. package/dist/core/experimental.d.ts +2 -0
  55. package/dist/core/experimental.d.ts.map +1 -0
  56. package/dist/core/experimental.js +5 -0
  57. package/dist/core/experimental.js.map +1 -0
  58. package/dist/core/export-html/template.js +19 -6
  59. package/dist/core/extensions/index.d.ts +1 -1
  60. package/dist/core/extensions/index.d.ts.map +1 -1
  61. package/dist/core/extensions/index.js.map +1 -1
  62. package/dist/core/extensions/loader.d.ts +1 -1
  63. package/dist/core/extensions/loader.d.ts.map +1 -1
  64. package/dist/core/extensions/loader.js +6 -4
  65. package/dist/core/extensions/loader.js.map +1 -1
  66. package/dist/core/extensions/runner.d.ts +11 -4
  67. package/dist/core/extensions/runner.d.ts.map +1 -1
  68. package/dist/core/extensions/runner.js +53 -3
  69. package/dist/core/extensions/runner.js.map +1 -1
  70. package/dist/core/extensions/types.d.ts +34 -4
  71. package/dist/core/extensions/types.d.ts.map +1 -1
  72. package/dist/core/extensions/types.js.map +1 -1
  73. package/dist/core/footer-data-provider.d.ts +2 -0
  74. package/dist/core/footer-data-provider.d.ts.map +1 -1
  75. package/dist/core/footer-data-provider.js +27 -1
  76. package/dist/core/footer-data-provider.js.map +1 -1
  77. package/dist/core/index.d.ts +1 -0
  78. package/dist/core/index.d.ts.map +1 -1
  79. package/dist/core/index.js +1 -0
  80. package/dist/core/index.js.map +1 -1
  81. package/dist/core/model-registry.d.ts.map +1 -1
  82. package/dist/core/model-registry.js +64 -7
  83. package/dist/core/model-registry.js.map +1 -1
  84. package/dist/core/model-resolver.d.ts.map +1 -1
  85. package/dist/core/model-resolver.js +1 -0
  86. package/dist/core/model-resolver.js.map +1 -1
  87. package/dist/core/output-guard.d.ts +1 -0
  88. package/dist/core/output-guard.d.ts.map +1 -1
  89. package/dist/core/output-guard.js +52 -22
  90. package/dist/core/output-guard.js.map +1 -1
  91. package/dist/core/package-manager.d.ts +1 -0
  92. package/dist/core/package-manager.d.ts.map +1 -1
  93. package/dist/core/package-manager.js +20 -8
  94. package/dist/core/package-manager.js.map +1 -1
  95. package/dist/core/project-trust.d.ts +15 -0
  96. package/dist/core/project-trust.d.ts.map +1 -0
  97. package/dist/core/project-trust.js +58 -0
  98. package/dist/core/project-trust.js.map +1 -0
  99. package/dist/core/prompt-templates.d.ts +5 -4
  100. package/dist/core/prompt-templates.d.ts.map +1 -1
  101. package/dist/core/prompt-templates.js +30 -29
  102. package/dist/core/prompt-templates.js.map +1 -1
  103. package/dist/core/provider-attribution.d.ts +4 -0
  104. package/dist/core/provider-attribution.d.ts.map +1 -0
  105. package/dist/core/provider-attribution.js +73 -0
  106. package/dist/core/provider-attribution.js.map +1 -0
  107. package/dist/core/provider-display-names.d.ts.map +1 -1
  108. package/dist/core/provider-display-names.js +3 -0
  109. package/dist/core/provider-display-names.js.map +1 -1
  110. package/dist/core/resolve-config-value.d.ts +9 -1
  111. package/dist/core/resolve-config-value.d.ts.map +1 -1
  112. package/dist/core/resolve-config-value.js +134 -11
  113. package/dist/core/resolve-config-value.js.map +1 -1
  114. package/dist/core/resource-loader.d.ts +12 -2
  115. package/dist/core/resource-loader.d.ts.map +1 -1
  116. package/dist/core/resource-loader.js +108 -18
  117. package/dist/core/resource-loader.js.map +1 -1
  118. package/dist/core/sdk.d.ts.map +1 -1
  119. package/dist/core/sdk.js +12 -42
  120. package/dist/core/sdk.js.map +1 -1
  121. package/dist/core/session-manager.d.ts +6 -7
  122. package/dist/core/session-manager.d.ts.map +1 -1
  123. package/dist/core/session-manager.js +99 -35
  124. package/dist/core/session-manager.js.map +1 -1
  125. package/dist/core/settings-manager.d.ts +15 -2
  126. package/dist/core/settings-manager.d.ts.map +1 -1
  127. package/dist/core/settings-manager.js +69 -10
  128. package/dist/core/settings-manager.js.map +1 -1
  129. package/dist/core/slash-commands.d.ts.map +1 -1
  130. package/dist/core/slash-commands.js +1 -0
  131. package/dist/core/slash-commands.js.map +1 -1
  132. package/dist/core/system-prompt.d.ts.map +1 -1
  133. package/dist/core/system-prompt.js +0 -3
  134. package/dist/core/system-prompt.js.map +1 -1
  135. package/dist/core/tools/bash.d.ts.map +1 -1
  136. package/dist/core/tools/bash.js +2 -1
  137. package/dist/core/tools/bash.js.map +1 -1
  138. package/dist/core/tools/edit.d.ts.map +1 -1
  139. package/dist/core/tools/edit.js +7 -10
  140. package/dist/core/tools/edit.js.map +1 -1
  141. package/dist/core/tools/find.d.ts.map +1 -1
  142. package/dist/core/tools/find.js +1 -1
  143. package/dist/core/tools/find.js.map +1 -1
  144. package/dist/core/tools/grep.d.ts.map +1 -1
  145. package/dist/core/tools/grep.js +1 -1
  146. package/dist/core/tools/grep.js.map +1 -1
  147. package/dist/core/tools/ls.d.ts.map +1 -1
  148. package/dist/core/tools/ls.js +1 -1
  149. package/dist/core/tools/ls.js.map +1 -1
  150. package/dist/core/tools/oversized-tool-result.d.ts +53 -0
  151. package/dist/core/tools/oversized-tool-result.d.ts.map +1 -0
  152. package/dist/core/tools/oversized-tool-result.js +206 -0
  153. package/dist/core/tools/oversized-tool-result.js.map +1 -0
  154. package/dist/core/tools/read.d.ts +12 -0
  155. package/dist/core/tools/read.d.ts.map +1 -1
  156. package/dist/core/tools/read.js +99 -34
  157. package/dist/core/tools/read.js.map +1 -1
  158. package/dist/core/tools/render-utils.d.ts +6 -0
  159. package/dist/core/tools/render-utils.d.ts.map +1 -1
  160. package/dist/core/tools/render-utils.js +17 -1
  161. package/dist/core/tools/render-utils.js.map +1 -1
  162. package/dist/core/tools/tool-definition-wrapper.d.ts +6 -0
  163. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  164. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  165. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  166. package/dist/core/tools/tool-limits.d.ts +25 -0
  167. package/dist/core/tools/tool-limits.d.ts.map +1 -0
  168. package/dist/core/tools/tool-limits.js +25 -0
  169. package/dist/core/tools/tool-limits.js.map +1 -0
  170. package/dist/core/tools/write.d.ts.map +1 -1
  171. package/dist/core/tools/write.js +1 -1
  172. package/dist/core/tools/write.js.map +1 -1
  173. package/dist/core/trust-manager.d.ts +31 -0
  174. package/dist/core/trust-manager.d.ts.map +1 -0
  175. package/dist/core/trust-manager.js +196 -0
  176. package/dist/core/trust-manager.js.map +1 -0
  177. package/dist/index.d.ts +9 -4
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +5 -1
  180. package/dist/index.js.map +1 -1
  181. package/dist/main.d.ts.map +1 -1
  182. package/dist/main.js +142 -30
  183. package/dist/main.js.map +1 -1
  184. package/dist/migrations.d.ts +3 -1
  185. package/dist/migrations.d.ts.map +1 -1
  186. package/dist/migrations.js +325 -7
  187. package/dist/migrations.js.map +1 -1
  188. package/dist/modes/index.d.ts +1 -1
  189. package/dist/modes/index.d.ts.map +1 -1
  190. package/dist/modes/index.js.map +1 -1
  191. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  192. package/dist/modes/interactive/components/bash-execution.js +2 -2
  193. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  194. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/footer.js +6 -0
  196. package/dist/modes/interactive/components/footer.js.map +1 -1
  197. package/dist/modes/interactive/components/index.d.ts +1 -0
  198. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/index.js +1 -0
  200. package/dist/modes/interactive/components/index.js.map +1 -1
  201. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  202. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/login-dialog.js +9 -16
  204. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  205. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  206. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/settings-selector.js +20 -0
  208. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  209. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  210. package/dist/modes/interactive/components/tool-execution.js +22 -0
  211. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  212. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  213. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  214. package/dist/modes/interactive/components/trust-selector.js +85 -0
  215. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  216. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/user-message.js +1 -1
  218. package/dist/modes/interactive/components/user-message.js.map +1 -1
  219. package/dist/modes/interactive/interactive-mode.d.ts +9 -0
  220. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  221. package/dist/modes/interactive/interactive-mode.js +130 -9
  222. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  223. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  224. package/dist/modes/interactive/theme/theme.js +10 -0
  225. package/dist/modes/interactive/theme/theme.js.map +1 -1
  226. package/dist/modes/print-mode.d.ts.map +1 -1
  227. package/dist/modes/print-mode.js +1 -0
  228. package/dist/modes/print-mode.js.map +1 -1
  229. package/dist/modes/rpc/rpc-client.d.ts +3 -0
  230. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  231. package/dist/modes/rpc/rpc-client.js +50 -6
  232. package/dist/modes/rpc/rpc-client.js.map +1 -1
  233. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  234. package/dist/modes/rpc/rpc-mode.js +23 -4
  235. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  236. package/dist/modes/rpc/rpc-types.d.ts +1 -0
  237. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  238. package/dist/modes/rpc/rpc-types.js.map +1 -1
  239. package/dist/package-manager-cli.d.ts +6 -2
  240. package/dist/package-manager-cli.d.ts.map +1 -1
  241. package/dist/package-manager-cli.js +104 -10
  242. package/dist/package-manager-cli.js.map +1 -1
  243. package/dist/utils/changelog.d.ts +1 -0
  244. package/dist/utils/changelog.d.ts.map +1 -1
  245. package/dist/utils/changelog.js +72 -0
  246. package/dist/utils/changelog.js.map +1 -1
  247. package/dist/utils/deprecation.d.ts +4 -0
  248. package/dist/utils/deprecation.d.ts.map +1 -0
  249. package/dist/utils/deprecation.js +13 -0
  250. package/dist/utils/deprecation.js.map +1 -0
  251. package/dist/utils/git.d.ts.map +1 -1
  252. package/dist/utils/git.js +54 -22
  253. package/dist/utils/git.js.map +1 -1
  254. package/dist/utils/json.d.ts +3 -0
  255. package/dist/utils/json.d.ts.map +1 -0
  256. package/dist/utils/json.js +7 -0
  257. package/dist/utils/json.js.map +1 -0
  258. package/dist/utils/open-browser.d.ts +9 -0
  259. package/dist/utils/open-browser.d.ts.map +1 -0
  260. package/dist/utils/open-browser.js +22 -0
  261. package/dist/utils/open-browser.js.map +1 -0
  262. package/docs/containerization.md +111 -0
  263. package/docs/custom-provider.md +9 -9
  264. package/docs/development.md +1 -1
  265. package/docs/docs.json +2 -0
  266. package/docs/extensions.md +40 -4
  267. package/docs/index.md +2 -0
  268. package/docs/models.md +10 -10
  269. package/docs/packages.md +1 -1
  270. package/docs/prompt-templates.md +9 -2
  271. package/docs/providers.md +18 -5
  272. package/docs/quickstart.md +1 -0
  273. package/docs/rpc.md +3 -2
  274. package/docs/sdk.md +5 -0
  275. package/docs/security.md +56 -0
  276. package/docs/session-format.md +2 -2
  277. package/docs/sessions.md +8 -0
  278. package/docs/settings.md +21 -4
  279. package/docs/skills.md +1 -1
  280. package/docs/terminal-setup.md +44 -2
  281. package/docs/themes.md +1 -1
  282. package/docs/tmux.md +4 -2
  283. package/docs/tui.md +14 -5
  284. package/docs/usage.md +17 -3
  285. package/examples/README.md +1 -1
  286. package/examples/extensions/README.md +8 -5
  287. package/examples/extensions/bash-spawn-hook.ts +1 -1
  288. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  289. package/examples/extensions/claude-rules.ts +1 -1
  290. package/examples/extensions/commands.ts +1 -1
  291. package/examples/extensions/custom-header.ts +1 -1
  292. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  293. package/examples/extensions/custom-provider-anthropic/package-lock.json +4 -4
  294. package/examples/extensions/custom-provider-anthropic/package.json +6 -6
  295. package/examples/extensions/custom-provider-gitlab-duo/index.ts +55 -4
  296. package/examples/extensions/custom-provider-gitlab-duo/package.json +3 -3
  297. package/examples/extensions/doom-overlay/README.md +1 -1
  298. package/examples/extensions/doom-overlay/index.ts +2 -2
  299. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  300. package/examples/extensions/gondolin/index.ts +523 -0
  301. package/examples/extensions/gondolin/package-lock.json +185 -0
  302. package/examples/extensions/gondolin/package.json +19 -0
  303. package/examples/extensions/handoff.ts +1 -1
  304. package/examples/extensions/hidden-thinking-label.ts +1 -1
  305. package/examples/extensions/inline-bash.ts +2 -2
  306. package/examples/extensions/input-transform-streaming.ts +39 -0
  307. package/examples/extensions/input-transform.ts +3 -3
  308. package/examples/extensions/interactive-shell.ts +2 -2
  309. package/examples/extensions/mac-system-theme.ts +2 -2
  310. package/examples/extensions/minimal-mode.ts +1 -1
  311. package/examples/extensions/modal-editor.ts +1 -1
  312. package/examples/extensions/model-status.ts +1 -1
  313. package/examples/extensions/overlay-qa-tests.ts +198 -179
  314. package/examples/extensions/overlay-test.ts +1 -1
  315. package/examples/extensions/pirate.ts +1 -1
  316. package/examples/extensions/preset.ts +14 -12
  317. package/examples/extensions/project-trust.ts +64 -0
  318. package/examples/extensions/prompt-customizer.ts +1 -1
  319. package/examples/extensions/qna.ts +1 -1
  320. package/examples/extensions/question.ts +1 -1
  321. package/examples/extensions/questionnaire.ts +1 -1
  322. package/examples/extensions/rainbow-editor.ts +1 -1
  323. package/examples/extensions/sandbox/index.ts +16 -14
  324. package/examples/extensions/sandbox/package-lock.json +90 -90
  325. package/examples/extensions/sandbox/package.json +17 -17
  326. package/examples/extensions/snake.ts +1 -1
  327. package/examples/extensions/space-invaders.ts +1 -1
  328. package/examples/extensions/ssh.ts +2 -2
  329. package/examples/extensions/subagent/README.md +13 -13
  330. package/examples/extensions/subagent/agents.ts +4 -2
  331. package/examples/extensions/subagent/index.ts +6 -6
  332. package/examples/extensions/summarize.ts +1 -1
  333. package/examples/extensions/tic-tac-toe.ts +1 -1
  334. package/examples/extensions/titlebar-spinner.ts +1 -1
  335. package/examples/extensions/todo.ts +1 -1
  336. package/examples/extensions/tool-override.ts +1 -1
  337. package/examples/extensions/tools.ts +6 -1
  338. package/examples/extensions/with-deps/package-lock.json +4 -4
  339. package/examples/extensions/with-deps/package.json +7 -7
  340. package/examples/extensions/working-indicator.ts +4 -4
  341. package/examples/extensions/working-message-test.ts +1 -1
  342. package/examples/sdk/01-minimal.ts +1 -1
  343. package/examples/sdk/03-custom-prompt.ts +1 -1
  344. package/examples/sdk/04-skills.ts +1 -1
  345. package/examples/sdk/06-extensions.ts +2 -2
  346. package/examples/sdk/08-prompt-templates.ts +1 -1
  347. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  348. package/examples/sdk/README.md +2 -2
  349. package/package.json +4 -4
@@ -6,8 +6,8 @@
6
6
  * and can be activated via CLI flag, /preset command, or Ctrl+Shift+U to cycle.
7
7
  *
8
8
  * Config files (merged, project takes precedence):
9
- * - ~/.pi/agent/presets.json (global)
10
- * - <cwd>/.pi/presets.json (project-local)
9
+ * - ~/.atomic/agent/presets.json (global)
10
+ * - <cwd>/.atomic/presets.json (project-local; legacy <cwd>/.pi/presets.json also works)
11
11
  *
12
12
  * Example presets.json:
13
13
  * ```json
@@ -30,7 +30,7 @@
30
30
  * ```
31
31
  *
32
32
  * Usage:
33
- * - `pi --preset plan` - start with plan preset
33
+ * - `atomic --preset plan` - start with plan preset
34
34
  * - `/preset` - show selector to switch presets mid-session
35
35
  * - `/preset implement` - switch to implement preset directly
36
36
  * - `Ctrl+Shift+U` - cycle through presets
@@ -67,9 +67,10 @@ interface PresetsConfig {
67
67
  * Load presets from config files.
68
68
  * Project-local presets override global presets with the same name.
69
69
  */
70
- function loadPresets(cwd: string): PresetsConfig {
70
+ function loadPresets(cwd: string, includeProjectPresets: boolean): PresetsConfig {
71
71
  const globalPath = join(getAgentDir(), "presets.json");
72
- const projectPath = join(cwd, ".pi", "presets.json");
72
+ const projectPath = join(cwd, ".atomic", "presets.json");
73
+ const legacyProjectPath = join(cwd, ".pi", "presets.json");
73
74
 
74
75
  let globalPresets: PresetsConfig = {};
75
76
  let projectPresets: PresetsConfig = {};
@@ -84,13 +85,14 @@ function loadPresets(cwd: string): PresetsConfig {
84
85
  }
85
86
  }
86
87
 
87
- // Load project presets
88
- if (existsSync(projectPath)) {
88
+ // Load project presets only after project trust (Atomic path first; legacy Pi path as fallback)
89
+ const resolvedProjectPath = existsSync(projectPath) ? projectPath : legacyProjectPath;
90
+ if (includeProjectPresets && existsSync(resolvedProjectPath)) {
89
91
  try {
90
- const content = readFileSync(projectPath, "utf-8");
92
+ const content = readFileSync(resolvedProjectPath, "utf-8");
91
93
  projectPresets = JSON.parse(content);
92
94
  } catch (err) {
93
- console.error(`Failed to load project presets from ${projectPath}: ${err}`);
95
+ console.error(`Failed to load project presets from ${resolvedProjectPath}: ${err}`);
94
96
  }
95
97
  }
96
98
 
@@ -200,7 +202,7 @@ export default function presetExtension(pi: ExtensionAPI) {
200
202
  const presetNames = Object.keys(presets);
201
203
 
202
204
  if (presetNames.length === 0) {
203
- ctx.ui.notify("No presets defined. Add presets to ~/.pi/agent/presets.json or .pi/presets.json", "warning");
205
+ ctx.ui.notify("No presets defined. Add presets to ~/.atomic/agent/presets.json or .atomic/presets.json (legacy .pi/presets.json also works)", "warning");
204
206
  return;
205
207
  }
206
208
 
@@ -308,7 +310,7 @@ export default function presetExtension(pi: ExtensionAPI) {
308
310
  async function cyclePreset(ctx: ExtensionContext): Promise<void> {
309
311
  const presetNames = getPresetOrder();
310
312
  if (presetNames.length === 0) {
311
- ctx.ui.notify("No presets defined. Add presets to ~/.pi/agent/presets.json or .pi/presets.json", "warning");
313
+ ctx.ui.notify("No presets defined. Add presets to ~/.atomic/agent/presets.json or .atomic/presets.json (legacy .pi/presets.json also works)", "warning");
312
314
  return;
313
315
  }
314
316
 
@@ -388,7 +390,7 @@ export default function presetExtension(pi: ExtensionAPI) {
388
390
  // Initialize on session start
389
391
  pi.on("session_start", async (_event, ctx) => {
390
392
  // Load presets from config files
391
- presets = loadPresets(ctx.cwd);
393
+ presets = loadPresets(ctx.cwd, ctx.isProjectTrusted());
392
394
 
393
395
  // Check for --preset flag
394
396
  const presetFlag = pi.getFlag("preset");
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Project Trust Extension
3
+ *
4
+ * Demonstrates the project_trust event. Install globally or pass via -e:
5
+ *
6
+ * mkdir -p ~/.atomic/agent/extensions
7
+ * cp packages/coding-agent/examples/extensions/project-trust.ts ~/.atomic/agent/extensions/
8
+ *
9
+ * Or:
10
+ *
11
+ * atomic -e packages/coding-agent/examples/extensions/project-trust.ts
12
+ *
13
+ * Try it in a project containing .atomic (or legacy .pi), AGENTS.md/CLAUDE.md, or .agents/skills.
14
+ */
15
+
16
+ import type { ExtensionAPI, ProjectTrustEventResult } from "@bastani/atomic";
17
+
18
+ export default function (pi: ExtensionAPI) {
19
+ let loadCount = 0;
20
+ loadCount++;
21
+
22
+ // Multiple handlers in one extension are allowed. The first handler that returns
23
+ // { trusted: "yes" } or { trusted: "no" } wins and suppresses the built-in
24
+ // trust prompt. Return { trusted: "undecided" } to let another handler or the
25
+ // built-in flow decide.
26
+ pi.on("project_trust", async (event, ctx): Promise<ProjectTrustEventResult> => {
27
+ ctx.ui.notify(`project_trust fired for ${event.cwd} (mode: ${ctx.mode}, load: ${loadCount})`, "info");
28
+
29
+ if (!ctx.hasUI) {
30
+ return { trusted: "undecided" };
31
+ }
32
+
33
+ const choice = await ctx.ui.select(`Project trust for:\n${event.cwd}`, [
34
+ "Trust and remember",
35
+ "Trust with note and remember",
36
+ "Trust this session",
37
+ "Do not trust this session",
38
+ "Let built-in prompt decide",
39
+ ]);
40
+
41
+ if (choice === "Trust with note and remember") {
42
+ const note = await ctx.ui.input("Project trust note", "Optional note for this demo");
43
+ ctx.ui.notify(note ? `Recorded demo note: ${note}` : "No demo note entered", "info");
44
+ return { trusted: "yes", remember: true };
45
+ }
46
+ if (choice === "Trust and remember") {
47
+ return { trusted: "yes", remember: true };
48
+ }
49
+ if (choice === "Trust this session") {
50
+ return { trusted: "yes" };
51
+ }
52
+ if (choice === "Do not trust this session") {
53
+ return { trusted: "no" };
54
+ }
55
+ if (choice === "Let built-in prompt decide") {
56
+ return { trusted: "undecided" };
57
+ }
58
+ return { trusted: "undecided" };
59
+ });
60
+
61
+ pi.on("session_start", (_event, ctx) => {
62
+ ctx.ui.notify(`project-trust example loaded after trust resolution in ${ctx.cwd}`, "info");
63
+ });
64
+ }
@@ -8,7 +8,7 @@
8
8
  * are currently active, respecting whatever the user has configured.
9
9
  *
10
10
  * Usage:
11
- * 1. Copy this file to ~/.pi/agent/extensions/ or your project's .pi/extensions/
11
+ * 1. Copy this file to ~/.atomic/agent/extensions/ or your project's .atomic/extensions/ (legacy .pi/extensions/ also works)
12
12
  * 2. Use the extension — it automatically adapts to your active tools and skills
13
13
  */
14
14
 
@@ -31,7 +31,7 @@ export default function (pi: ExtensionAPI) {
31
31
  pi.registerCommand("qna", {
32
32
  description: "Extract questions from last assistant message into editor",
33
33
  handler: async (_args, ctx) => {
34
- if (!ctx.hasUI) {
34
+ if (ctx.mode !== "tui") {
35
35
  ctx.ui.notify("qna requires interactive mode", "error");
36
36
  return;
37
37
  }
@@ -41,7 +41,7 @@ export default function question(pi: ExtensionAPI) {
41
41
  parameters: QuestionParams,
42
42
 
43
43
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
44
- if (!ctx.hasUI) {
44
+ if (ctx.mode !== "tui") {
45
45
  return {
46
46
  content: [{ type: "text", text: "Error: UI not available (running in non-interactive mode)" }],
47
47
  details: {
@@ -82,7 +82,7 @@ export default function questionnaire(pi: ExtensionAPI) {
82
82
  parameters: QuestionnaireParams,
83
83
 
84
84
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
85
- if (!ctx.hasUI) {
85
+ if (ctx.mode !== "tui") {
86
86
  return errorResult("Error: UI not available (running in non-interactive mode)");
87
87
  }
88
88
  if (params.questions.length === 0) {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Rainbow Editor - highlights "ultrathink" with animated shine effect
3
3
  *
4
- * Usage: pi --extension ./examples/extensions/rainbow-editor.ts
4
+ * Usage: atomic --extension ./examples/extensions/rainbow-editor.ts
5
5
  */
6
6
 
7
7
  import { CustomEditor, type ExtensionAPI } from "@bastani/atomic";
@@ -10,10 +10,10 @@
10
10
  * via `tool_call` input mutation without replacing the tool.
11
11
  *
12
12
  * Config files (merged, project takes precedence):
13
- * - ~/.pi/agent/extensions/sandbox.json (global)
14
- * - <cwd>/.pi/sandbox.json (project-local)
13
+ * - ~/.atomic/agent/extensions/sandbox.json (global)
14
+ * - <cwd>/.atomic/sandbox.json (project-local; legacy <cwd>/.pi/sandbox.json also works)
15
15
  *
16
- * Example .pi/sandbox.json:
16
+ * Example .atomic/sandbox.json:
17
17
  * ```json
18
18
  * {
19
19
  * "enabled": true,
@@ -30,13 +30,13 @@
30
30
  * ```
31
31
  *
32
32
  * Usage:
33
- * - `pi -e ./sandbox` - sandbox enabled with default/config settings
34
- * - `pi -e ./sandbox --no-sandbox` - disable sandboxing
33
+ * - `atomic -e ./sandbox` - sandbox enabled with default/config settings
34
+ * - `atomic -e ./sandbox --no-sandbox` - disable sandboxing
35
35
  * - `/sandbox` - show current sandbox configuration
36
36
  *
37
37
  * Setup:
38
- * 1. Copy sandbox/ directory to ~/.pi/agent/extensions/
39
- * 2. Run `npm install` in ~/.pi/agent/extensions/sandbox/
38
+ * 1. Copy sandbox/ directory to ~/.atomic/agent/extensions/
39
+ * 2. Run `npm install` in ~/.atomic/agent/extensions/sandbox/
40
40
  *
41
41
  * Linux also requires: bubblewrap, socat, ripgrep
42
42
  */
@@ -76,8 +76,9 @@ const DEFAULT_CONFIG: SandboxConfig = {
76
76
  },
77
77
  };
78
78
 
79
- function loadConfig(cwd: string): SandboxConfig {
80
- const projectConfigPath = join(cwd, ".pi", "sandbox.json");
79
+ function loadConfig(cwd: string, includeProjectConfig: boolean): SandboxConfig {
80
+ const projectConfigPath = join(cwd, ".atomic", "sandbox.json");
81
+ const legacyProjectConfigPath = join(cwd, ".pi", "sandbox.json");
81
82
  const globalConfigPath = join(getAgentDir(), "extensions", "sandbox.json");
82
83
 
83
84
  let globalConfig: Partial<SandboxConfig> = {};
@@ -91,11 +92,12 @@ function loadConfig(cwd: string): SandboxConfig {
91
92
  }
92
93
  }
93
94
 
94
- if (existsSync(projectConfigPath)) {
95
+ const resolvedProjectConfigPath = existsSync(projectConfigPath) ? projectConfigPath : legacyProjectConfigPath;
96
+ if (includeProjectConfig && existsSync(resolvedProjectConfigPath)) {
95
97
  try {
96
- projectConfig = JSON.parse(readFileSync(projectConfigPath, "utf-8"));
98
+ projectConfig = JSON.parse(readFileSync(resolvedProjectConfigPath, "utf-8"));
97
99
  } catch (e) {
98
- console.error(`Warning: Could not parse ${projectConfigPath}: ${e}`);
100
+ console.error(`Warning: Could not parse ${resolvedProjectConfigPath}: ${e}`);
99
101
  }
100
102
  }
101
103
 
@@ -240,7 +242,7 @@ export default function (pi: ExtensionAPI) {
240
242
  return;
241
243
  }
242
244
 
243
- const config = loadConfig(ctx.cwd);
245
+ const config = loadConfig(ctx.cwd, ctx.isProjectTrusted());
244
246
 
245
247
  if (!config.enabled) {
246
248
  sandboxEnabled = false;
@@ -302,7 +304,7 @@ export default function (pi: ExtensionAPI) {
302
304
  return;
303
305
  }
304
306
 
305
- const config = loadConfig(ctx.cwd);
307
+ const config = loadConfig(ctx.cwd, ctx.isProjectTrusted());
306
308
  const lines = [
307
309
  "Sandbox Configuration:",
308
310
  "",
@@ -1,92 +1,92 @@
1
1
  {
2
- "name": "pi-extension-sandbox",
3
- "version": "1.4.0",
4
- "lockfileVersion": 3,
5
- "requires": true,
6
- "packages": {
7
- "": {
8
- "name": "pi-extension-sandbox",
9
- "version": "1.4.0",
10
- "dependencies": {
11
- "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
- }
13
- },
14
- "node_modules/@anthropic-ai/sandbox-runtime": {
15
- "version": "0.0.26",
16
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sandbox-runtime/-/sandbox-runtime-0.0.26.tgz",
17
- "integrity": "sha512-DYV5LSsVMnzq0lbfaYMSpxZPUMAx4+hy343dRss+pVCLIfF62qOhxpYfZ5TmOk1GTDQm5f9wPprMNSStmnsV4w==",
18
- "license": "Apache-2.0",
19
- "dependencies": {
20
- "@pondwader/socks5-server": "^1.0.10",
21
- "@types/lodash-es": "^4.17.12",
22
- "commander": "^12.1.0",
23
- "lodash-es": "^4.17.21",
24
- "shell-quote": "^1.8.3",
25
- "zod": "^3.24.1"
26
- },
27
- "bin": {
28
- "srt": "dist/cli.js"
29
- },
30
- "engines": {
31
- "node": ">=18.0.0"
32
- }
33
- },
34
- "node_modules/@pondwader/socks5-server": {
35
- "version": "1.0.10",
36
- "resolved": "https://registry.npmjs.org/@pondwader/socks5-server/-/socks5-server-1.0.10.tgz",
37
- "integrity": "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg==",
38
- "license": "MIT"
39
- },
40
- "node_modules/@types/lodash": {
41
- "version": "4.17.23",
42
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz",
43
- "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==",
44
- "license": "MIT"
45
- },
46
- "node_modules/@types/lodash-es": {
47
- "version": "4.17.12",
48
- "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
49
- "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
50
- "license": "MIT",
51
- "dependencies": {
52
- "@types/lodash": "*"
53
- }
54
- },
55
- "node_modules/commander": {
56
- "version": "12.1.0",
57
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
58
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
59
- "license": "MIT",
60
- "engines": {
61
- "node": ">=18"
62
- }
63
- },
64
- "node_modules/lodash-es": {
65
- "version": "4.18.1",
66
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
67
- "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
68
- "license": "MIT"
69
- },
70
- "node_modules/shell-quote": {
71
- "version": "1.8.3",
72
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
73
- "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
74
- "license": "MIT",
75
- "engines": {
76
- "node": ">= 0.4"
77
- },
78
- "funding": {
79
- "url": "https://github.com/sponsors/ljharb"
80
- }
81
- },
82
- "node_modules/zod": {
83
- "version": "3.25.76",
84
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
85
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
86
- "license": "MIT",
87
- "funding": {
88
- "url": "https://github.com/sponsors/colinhacks"
89
- }
90
- }
91
- }
2
+ "name": "atomic-extension-sandbox",
3
+ "version": "1.9.1",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "atomic-extension-sandbox",
9
+ "version": "1.9.1",
10
+ "dependencies": {
11
+ "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
+ }
13
+ },
14
+ "node_modules/@anthropic-ai/sandbox-runtime": {
15
+ "version": "0.0.26",
16
+ "resolved": "https://registry.npmjs.org/@anthropic-ai/sandbox-runtime/-/sandbox-runtime-0.0.26.tgz",
17
+ "integrity": "sha512-DYV5LSsVMnzq0lbfaYMSpxZPUMAx4+hy343dRss+pVCLIfF62qOhxpYfZ5TmOk1GTDQm5f9wPprMNSStmnsV4w==",
18
+ "license": "Apache-2.0",
19
+ "dependencies": {
20
+ "@pondwader/socks5-server": "^1.0.10",
21
+ "@types/lodash-es": "^4.17.12",
22
+ "commander": "^12.1.0",
23
+ "lodash-es": "^4.17.21",
24
+ "shell-quote": "^1.8.3",
25
+ "zod": "^3.24.1"
26
+ },
27
+ "bin": {
28
+ "srt": "dist/cli.js"
29
+ },
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ }
33
+ },
34
+ "node_modules/@pondwader/socks5-server": {
35
+ "version": "1.0.10",
36
+ "resolved": "https://registry.npmjs.org/@pondwader/socks5-server/-/socks5-server-1.0.10.tgz",
37
+ "integrity": "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg==",
38
+ "license": "MIT"
39
+ },
40
+ "node_modules/@types/lodash": {
41
+ "version": "4.17.23",
42
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz",
43
+ "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==",
44
+ "license": "MIT"
45
+ },
46
+ "node_modules/@types/lodash-es": {
47
+ "version": "4.17.12",
48
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
49
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
50
+ "license": "MIT",
51
+ "dependencies": {
52
+ "@types/lodash": "*"
53
+ }
54
+ },
55
+ "node_modules/commander": {
56
+ "version": "12.1.0",
57
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
58
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
59
+ "license": "MIT",
60
+ "engines": {
61
+ "node": ">=18"
62
+ }
63
+ },
64
+ "node_modules/lodash-es": {
65
+ "version": "4.18.1",
66
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
67
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
68
+ "license": "MIT"
69
+ },
70
+ "node_modules/shell-quote": {
71
+ "version": "1.8.4",
72
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz",
73
+ "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==",
74
+ "license": "MIT",
75
+ "engines": {
76
+ "node": ">= 0.4"
77
+ },
78
+ "funding": {
79
+ "url": "https://github.com/sponsors/ljharb"
80
+ }
81
+ },
82
+ "node_modules/zod": {
83
+ "version": "3.25.76",
84
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
85
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
86
+ "license": "MIT",
87
+ "funding": {
88
+ "url": "https://github.com/sponsors/colinhacks"
89
+ }
90
+ }
91
+ }
92
92
  }
@@ -1,19 +1,19 @@
1
1
  {
2
- "name": "pi-extension-sandbox",
3
- "private": true,
4
- "version": "1.4.0",
5
- "type": "module",
6
- "scripts": {
7
- "clean": "echo 'nothing to clean'",
8
- "build": "echo 'nothing to build'",
9
- "check": "echo 'nothing to check'"
10
- },
11
- "pi": {
12
- "extensions": [
13
- "./index.ts"
14
- ]
15
- },
16
- "dependencies": {
17
- "@anthropic-ai/sandbox-runtime": "^0.0.26"
18
- }
2
+ "name": "atomic-extension-sandbox",
3
+ "private": true,
4
+ "version": "1.9.1",
5
+ "type": "module",
6
+ "scripts": {
7
+ "clean": "echo 'nothing to clean'",
8
+ "build": "echo 'nothing to build'",
9
+ "check": "echo 'nothing to check'"
10
+ },
11
+ "dependencies": {
12
+ "@anthropic-ai/sandbox-runtime": "^0.0.26"
13
+ },
14
+ "atomic": {
15
+ "extensions": [
16
+ "./index.ts"
17
+ ]
18
+ }
19
19
  }
@@ -311,7 +311,7 @@ export default function (pi: ExtensionAPI) {
311
311
  description: "Play Snake!",
312
312
 
313
313
  handler: async (_args, ctx) => {
314
- if (!ctx.hasUI) {
314
+ if (ctx.mode !== "tui") {
315
315
  ctx.ui.notify("Snake requires interactive mode", "error");
316
316
  return;
317
317
  }
@@ -529,7 +529,7 @@ export default function (pi: ExtensionAPI) {
529
529
  description: "Play Space Invaders!",
530
530
 
531
531
  handler: async (_args, ctx) => {
532
- if (!ctx.hasUI) {
532
+ if (ctx.mode !== "tui") {
533
533
  ctx.ui.notify("Space Invaders requires interactive mode", "error");
534
534
  return;
535
535
  }
@@ -5,8 +5,8 @@
5
5
  * When --ssh is provided, read/write/edit/bash run on the remote.
6
6
  *
7
7
  * Usage:
8
- * pi -e ./ssh.ts --ssh user@host
9
- * pi -e ./ssh.ts --ssh user@host:/remote/path
8
+ * atomic -e ./ssh.ts --ssh user@host
9
+ * atomic -e ./ssh.ts --ssh user@host:/remote/path
10
10
  *
11
11
  * Requirements:
12
12
  * - SSH key-based auth (no password prompts)
@@ -4,7 +4,7 @@ Delegate tasks to specialized subagents with isolated context windows.
4
4
 
5
5
  ## Features
6
6
 
7
- - **Isolated context**: Each subagent runs in a separate `pi` process
7
+ - **Isolated context**: Each subagent runs in a separate `atomic` process
8
8
  - **Streaming output**: See tool calls and progress as they happen
9
9
  - **Parallel streaming**: All parallel tasks stream updates simultaneously
10
10
  - **Markdown rendering**: Final output rendered with proper formatting (expanded view)
@@ -35,30 +35,30 @@ From the repository root, symlink the files:
35
35
 
36
36
  ```bash
37
37
  # Symlink the extension (must be in a subdirectory with index.ts)
38
- mkdir -p ~/.pi/agent/extensions/subagent
39
- ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/index.ts" ~/.pi/agent/extensions/subagent/index.ts
40
- ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/agents.ts" ~/.pi/agent/extensions/subagent/agents.ts
38
+ mkdir -p ~/.atomic/agent/extensions/subagent
39
+ ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/index.ts" ~/.atomic/agent/extensions/subagent/index.ts
40
+ ln -sf "$(pwd)/packages/coding-agent/examples/extensions/subagent/agents.ts" ~/.atomic/agent/extensions/subagent/agents.ts
41
41
 
42
42
  # Symlink agents
43
- mkdir -p ~/.pi/agent/agents
43
+ mkdir -p ~/.atomic/agent/agents
44
44
  for f in packages/coding-agent/examples/extensions/subagent/agents/*.md; do
45
- ln -sf "$(pwd)/$f" ~/.pi/agent/agents/$(basename "$f")
45
+ ln -sf "$(pwd)/$f" ~/.atomic/agent/agents/$(basename "$f")
46
46
  done
47
47
 
48
48
  # Symlink workflow prompts
49
- mkdir -p ~/.pi/agent/prompts
49
+ mkdir -p ~/.atomic/agent/prompts
50
50
  for f in packages/coding-agent/examples/extensions/subagent/prompts/*.md; do
51
- ln -sf "$(pwd)/$f" ~/.pi/agent/prompts/$(basename "$f")
51
+ ln -sf "$(pwd)/$f" ~/.atomic/agent/prompts/$(basename "$f")
52
52
  done
53
53
  ```
54
54
 
55
55
  ## Security Model
56
56
 
57
- This tool executes a separate `pi` subprocess with a delegated system prompt and tool/model configuration.
57
+ This tool executes a separate `atomic` subprocess with a delegated system prompt and tool/model configuration.
58
58
 
59
- **Project-local agents** (`.pi/agents/*.md`) are repo-controlled prompts that can instruct the model to read files, run bash commands, etc.
59
+ **Project-local agents** (`.atomic/agents/*.md`, with legacy `.pi/agents/*.md` fallback) are repo-controlled prompts that can instruct the model to read files, run bash commands, etc.
60
60
 
61
- **Default behavior:** Only loads **user-level agents** from `~/.pi/agent/agents`.
61
+ **Default behavior:** Only loads **user-level agents** from `~/.atomic/agent/agents`.
62
62
 
63
63
  To enable project-local agents, pass `agentScope: "both"` (or `"project"`). Only do this for repositories you trust.
64
64
 
@@ -136,8 +136,8 @@ System prompt for the agent goes here.
136
136
  ```
137
137
 
138
138
  **Locations:**
139
- - `~/.pi/agent/agents/*.md` - User-level (always loaded)
140
- - `.pi/agents/*.md` - Project-level (only with `agentScope: "project"` or `"both"`)
139
+ - `~/.atomic/agent/agents/*.md` - User-level (always loaded)
140
+ - `.atomic/agents/*.md` - Project-level (legacy `.pi/agents/*.md` also works) (only with `agentScope: "project"` or `"both"`)
141
141
 
142
142
  Project agents override user agents with the same name when `agentScope: "both"`.
143
143
 
@@ -85,8 +85,10 @@ function isDirectory(p: string): boolean {
85
85
  function findNearestProjectAgentsDir(cwd: string): string | null {
86
86
  let currentDir = cwd;
87
87
  while (true) {
88
- const candidate = path.join(currentDir, ".pi", "agents");
89
- if (isDirectory(candidate)) return candidate;
88
+ const atomicCandidate = path.join(currentDir, ".atomic", "agents");
89
+ if (isDirectory(atomicCandidate)) return atomicCandidate;
90
+ const legacyCandidate = path.join(currentDir, ".pi", "agents");
91
+ if (isDirectory(legacyCandidate)) return legacyCandidate;
90
92
 
91
93
  const parentDir = path.dirname(currentDir);
92
94
  if (parentDir === currentDir) return null;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Subagent Tool - Delegate tasks to specialized agents
3
3
  *
4
- * Spawns a separate `pi` process for each subagent invocation,
4
+ * Spawns a separate `atomic` process for each subagent invocation,
5
5
  * giving it an isolated context window.
6
6
  *
7
7
  * Supports three modes:
@@ -249,7 +249,7 @@ async function writePromptToTempFile(
249
249
  return { dir: tmpDir, filePath };
250
250
  }
251
251
 
252
- function getPiInvocation(args: string[]): { command: string; args: string[] } {
252
+ function getAtomicInvocation(args: string[]): { command: string; args: string[] } {
253
253
  const currentScript = process.argv[1];
254
254
  const isBunVirtualScript = currentScript?.startsWith("/$bunfs/root/");
255
255
  if (currentScript && !isBunVirtualScript && fs.existsSync(currentScript)) {
@@ -262,7 +262,7 @@ function getPiInvocation(args: string[]): { command: string; args: string[] } {
262
262
  return { command: process.execPath, args };
263
263
  }
264
264
 
265
- return { command: "pi", args };
265
+ return { command: APP_NAME, args };
266
266
  }
267
267
 
268
268
  type OnUpdateCallback = (partial: AgentToolResult<SubagentDetails>) => void;
@@ -356,7 +356,7 @@ async function runSingleAgent(
356
356
  let wasAborted = false;
357
357
 
358
358
  const exitCode = await new Promise<number>((resolve) => {
359
- const invocation = getPiInvocation(args);
359
+ const invocation = getAtomicInvocation(args);
360
360
  const proc = spawn(invocation.command, invocation.args, {
361
361
  cwd: cwd ?? defaultCwd,
362
362
  shell: false,
@@ -518,8 +518,8 @@ export default function (pi: ExtensionAPI) {
518
518
  description: [
519
519
  "Delegate tasks to specialized subagents with isolated context.",
520
520
  "Modes: single (agent + task), parallel (tasks array), chain (sequential with {previous} placeholder).",
521
- 'Default agent scope is "user" (from ~/.pi/agent/agents).',
522
- 'To enable project-local agents in .pi/agents, set agentScope: "both" (or "project").',
521
+ 'Default agent scope is "user" (from ~/.atomic/agent/agents).',
522
+ 'To enable project-local agents in .atomic/agents (legacy .pi/agents also works), set agentScope: "both" (or "project").',
523
523
  ].join(" "),
524
524
  parameters: SubagentParams,
525
525