@bastani/atomic 0.8.4 → 0.8.5-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 (245) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +24 -23
  3. package/dist/builtin/intercom/README.md +5 -5
  4. package/dist/builtin/intercom/index.ts +1 -1
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/intercom/ui/compose.ts +19 -1
  7. package/dist/builtin/intercom/ui/session-list.ts +19 -1
  8. package/dist/builtin/mcp/README.md +3 -3
  9. package/dist/builtin/mcp/commands.ts +1 -1
  10. package/dist/builtin/mcp/host-html-template.ts +1 -1
  11. package/dist/builtin/mcp/mcp-panel.ts +14 -14
  12. package/dist/builtin/mcp/mcp-setup-panel.ts +4 -4
  13. package/dist/builtin/mcp/package.json +1 -1
  14. package/dist/builtin/mcp/tool-result-renderer.ts +1 -1
  15. package/dist/builtin/subagents/README.md +3 -3
  16. package/dist/builtin/subagents/package.json +1 -1
  17. package/dist/builtin/subagents/src/tui/render.ts +1844 -1062
  18. package/dist/builtin/web-access/README.md +1 -1
  19. package/dist/builtin/web-access/curator-page.ts +2 -2
  20. package/dist/builtin/web-access/index.ts +1 -1
  21. package/dist/builtin/web-access/package.json +1 -1
  22. package/dist/builtin/workflows/README.md +34 -7
  23. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +23 -4
  24. package/dist/builtin/workflows/builtin/ralph.ts +1 -1
  25. package/dist/builtin/workflows/package.json +1 -1
  26. package/dist/builtin/workflows/skills/workflow/SKILL.md +75 -16
  27. package/dist/builtin/workflows/skills/workflow/references/running-workflows.md +34 -11
  28. package/dist/builtin/workflows/skills/workflow/references/sdk-authoring.md +111 -20
  29. package/dist/builtin/workflows/src/extension/discovery.ts +32 -4
  30. package/dist/builtin/workflows/src/extension/index.ts +347 -63
  31. package/dist/builtin/workflows/src/extension/render-call.ts +3 -1
  32. package/dist/builtin/workflows/src/extension/render-result.ts +7 -0
  33. package/dist/builtin/workflows/src/extension/runtime.ts +4 -2
  34. package/dist/builtin/workflows/src/extension/wiring.ts +32 -8
  35. package/dist/builtin/workflows/src/extension/workflow-schema.ts +36 -14
  36. package/dist/builtin/workflows/src/runs/background/runner.ts +2 -2
  37. package/dist/builtin/workflows/src/runs/background/status.ts +89 -0
  38. package/dist/builtin/workflows/src/runs/foreground/executor.ts +338 -78
  39. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +2 -0
  40. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +55 -7
  41. package/dist/builtin/workflows/src/runs/shared/workflow-runner.ts +146 -10
  42. package/dist/builtin/workflows/src/shared/store.ts +29 -0
  43. package/dist/builtin/workflows/src/shared/types.ts +25 -4
  44. package/dist/builtin/workflows/src/tui/graph-canvas.ts +69 -2
  45. package/dist/builtin/workflows/src/tui/graph-view.ts +97 -182
  46. package/dist/builtin/workflows/src/tui/header.ts +36 -20
  47. package/dist/builtin/workflows/src/tui/inline-form-card.ts +129 -46
  48. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +111 -36
  49. package/dist/builtin/workflows/src/tui/inputs-picker.ts +311 -91
  50. package/dist/builtin/workflows/src/tui/layout.ts +1 -1
  51. package/dist/builtin/workflows/src/tui/node-card.ts +66 -37
  52. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +20 -6
  53. package/dist/builtin/workflows/src/tui/prompt-card.ts +262 -85
  54. package/dist/builtin/workflows/src/tui/run-detail.ts +50 -31
  55. package/dist/builtin/workflows/src/tui/session-confirm.ts +21 -14
  56. package/dist/builtin/workflows/src/tui/session-picker.ts +35 -26
  57. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +531 -960
  58. package/dist/builtin/workflows/src/tui/status-helpers.ts +6 -0
  59. package/dist/builtin/workflows/src/tui/status-list.ts +8 -4
  60. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +7 -2
  61. package/dist/builtin/workflows/src/tui/switcher.ts +55 -25
  62. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +33 -1
  63. package/dist/builtin/workflows/src/tui/workflow-list.ts +10 -6
  64. package/dist/cli/args.d.ts.map +1 -1
  65. package/dist/cli/args.js +1 -1
  66. package/dist/cli/args.js.map +1 -1
  67. package/dist/config.d.ts.map +1 -1
  68. package/dist/config.js +20 -6
  69. package/dist/config.js.map +1 -1
  70. package/dist/core/agent-session-services.d.ts +3 -3
  71. package/dist/core/agent-session-services.d.ts.map +1 -1
  72. package/dist/core/agent-session-services.js.map +1 -1
  73. package/dist/core/agent-session.d.ts +7 -7
  74. package/dist/core/agent-session.d.ts.map +1 -1
  75. package/dist/core/agent-session.js.map +1 -1
  76. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  77. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  78. package/dist/core/compaction/branch-summarization.js.map +1 -1
  79. package/dist/core/compaction/compaction.d.ts +3 -3
  80. package/dist/core/compaction/compaction.d.ts.map +1 -1
  81. package/dist/core/compaction/compaction.js.map +1 -1
  82. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  83. package/dist/core/export-html/tool-renderer.js.map +1 -1
  84. package/dist/core/extensions/loader.d.ts +3 -2
  85. package/dist/core/extensions/loader.d.ts.map +1 -1
  86. package/dist/core/extensions/loader.js +24 -12
  87. package/dist/core/extensions/loader.js.map +1 -1
  88. package/dist/core/extensions/runner.d.ts.map +1 -1
  89. package/dist/core/extensions/runner.js +6 -0
  90. package/dist/core/extensions/runner.js.map +1 -1
  91. package/dist/core/extensions/types.d.ts +28 -17
  92. package/dist/core/extensions/types.d.ts.map +1 -1
  93. package/dist/core/extensions/types.js.map +1 -1
  94. package/dist/core/package-manager.d.ts +1 -0
  95. package/dist/core/package-manager.d.ts.map +1 -1
  96. package/dist/core/package-manager.js +65 -28
  97. package/dist/core/package-manager.js.map +1 -1
  98. package/dist/core/resource-loader.d.ts.map +1 -1
  99. package/dist/core/resource-loader.js +13 -5
  100. package/dist/core/resource-loader.js.map +1 -1
  101. package/dist/core/sdk.d.ts +3 -3
  102. package/dist/core/sdk.d.ts.map +1 -1
  103. package/dist/core/sdk.js.map +1 -1
  104. package/dist/core/session-manager.d.ts.map +1 -1
  105. package/dist/core/session-manager.js +1 -1
  106. package/dist/core/session-manager.js.map +1 -1
  107. package/dist/core/settings-manager.d.ts +2 -0
  108. package/dist/core/settings-manager.d.ts.map +1 -1
  109. package/dist/core/settings-manager.js.map +1 -1
  110. package/dist/core/slash-commands.d.ts.map +1 -1
  111. package/dist/core/slash-commands.js +1 -1
  112. package/dist/core/slash-commands.js.map +1 -1
  113. package/dist/core/system-prompt.d.ts.map +1 -1
  114. package/dist/core/system-prompt.js +5 -3
  115. package/dist/core/system-prompt.js.map +1 -1
  116. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +1 -1
  117. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -1
  118. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +1 -1
  119. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  120. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +8 -8
  121. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -1
  122. package/dist/core/tools/ask-user-question/view/dialog-builder.js +6 -6
  123. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  124. package/dist/core/tools/bash.d.ts.map +1 -1
  125. package/dist/core/tools/bash.js +1 -1
  126. package/dist/core/tools/bash.js.map +1 -1
  127. package/dist/core/tools/find.d.ts.map +1 -1
  128. package/dist/core/tools/find.js +1 -1
  129. package/dist/core/tools/find.js.map +1 -1
  130. package/dist/core/tools/grep.d.ts.map +1 -1
  131. package/dist/core/tools/grep.js +7 -4
  132. package/dist/core/tools/grep.js.map +1 -1
  133. package/dist/core/tools/index.d.ts +3 -2
  134. package/dist/core/tools/index.d.ts.map +1 -1
  135. package/dist/core/tools/index.js.map +1 -1
  136. package/dist/core/tools/ls.d.ts.map +1 -1
  137. package/dist/core/tools/ls.js +3 -2
  138. package/dist/core/tools/ls.js.map +1 -1
  139. package/dist/core/tools/read.d.ts.map +1 -1
  140. package/dist/core/tools/read.js +2 -2
  141. package/dist/core/tools/read.js.map +1 -1
  142. package/dist/core/tools/render-utils.d.ts +2 -1
  143. package/dist/core/tools/render-utils.d.ts.map +1 -1
  144. package/dist/core/tools/render-utils.js.map +1 -1
  145. package/dist/core/tools/todos.d.ts.map +1 -1
  146. package/dist/core/tools/todos.js +1 -1
  147. package/dist/core/tools/todos.js.map +1 -1
  148. package/dist/core/tools/tool-definition-wrapper.d.ts +4 -3
  149. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  150. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  151. package/dist/core/tools/write.d.ts.map +1 -1
  152. package/dist/core/tools/write.js +1 -1
  153. package/dist/core/tools/write.js.map +1 -1
  154. package/dist/index.d.ts +2 -1
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +2 -1
  157. package/dist/index.js.map +1 -1
  158. package/dist/main.d.ts.map +1 -1
  159. package/dist/main.js +2 -2
  160. package/dist/main.js.map +1 -1
  161. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  162. package/dist/modes/interactive/components/assistant-message.js +3 -3
  163. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  164. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/bash-execution.js +3 -3
  166. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  167. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  168. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  169. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  170. package/dist/modes/interactive/components/chat-message-renderer.d.ts +2 -1
  171. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  172. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  173. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  175. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  176. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/config-selector.js +1 -1
  178. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  179. package/dist/modes/interactive/components/custom-editor.d.ts +3 -0
  180. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/custom-editor.js +13 -3
  182. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  183. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/footer.js +1 -1
  185. package/dist/modes/interactive/components/footer.js.map +1 -1
  186. package/dist/modes/interactive/components/index.d.ts +2 -1
  187. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  188. package/dist/modes/interactive/components/index.js +2 -1
  189. package/dist/modes/interactive/components/index.js.map +1 -1
  190. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -0
  191. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  192. package/dist/modes/interactive/components/keybinding-hints.js +47 -5
  193. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  194. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/login-dialog.js +5 -5
  196. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  197. package/dist/modes/interactive/components/model-selector.d.ts +3 -3
  198. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  200. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  201. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  202. package/dist/modes/interactive/components/scoped-models-selector.js +7 -7
  203. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  204. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  205. package/dist/modes/interactive/components/session-selector.js +8 -8
  206. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  207. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  208. package/dist/modes/interactive/components/settings-selector.js +3 -3
  209. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  210. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  212. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  213. package/dist/modes/interactive/components/tool-execution.d.ts +10 -12
  214. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/tool-execution.js +3 -3
  216. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  217. package/dist/modes/interactive/components/working-status.d.ts +25 -0
  218. package/dist/modes/interactive/components/working-status.d.ts.map +1 -0
  219. package/dist/modes/interactive/components/working-status.js +28 -0
  220. package/dist/modes/interactive/components/working-status.js.map +1 -0
  221. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  222. package/dist/modes/interactive/interactive-mode.js +8 -7
  223. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  224. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  225. package/dist/modes/rpc/rpc-mode.js +8 -0
  226. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  227. package/dist/modes/rpc/rpc-types.d.ts +5 -5
  228. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  229. package/dist/modes/rpc/rpc-types.js.map +1 -1
  230. package/dist/utils/tools-manager.d.ts.map +1 -1
  231. package/dist/utils/tools-manager.js.map +1 -1
  232. package/docs/development.md +2 -2
  233. package/docs/extensions.md +7 -7
  234. package/docs/packages.md +11 -8
  235. package/docs/quickstart.md +2 -2
  236. package/docs/rpc.md +1 -1
  237. package/docs/sdk.md +14 -11
  238. package/docs/session-format.md +1 -1
  239. package/docs/sessions.md +10 -10
  240. package/docs/settings.md +1 -1
  241. package/docs/terminal-setup.md +9 -9
  242. package/docs/tmux.md +10 -10
  243. package/docs/tui.md +2 -2
  244. package/docs/usage.md +9 -9
  245. package/package.json +6 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.8.5-0] - 2026-05-18
6
+
7
+ ### Changed
8
+
9
+ - Prepared the 0.8.5-0 prerelease.
10
+
5
11
  ## [0.8.4] - 2026-05-17
6
12
 
7
13
  ### Added
package/README.md CHANGED
@@ -101,7 +101,7 @@ Then just talk to pi. By default, pi gives the model four tools: `read`, `write`
101
101
 
102
102
  ## Providers & Models
103
103
 
104
- For each built-in provider, pi maintains a list of tool-capable models, updated with every release. Authenticate via subscription (`/login`) or API key, then select any model from that provider via `/model` (or Ctrl+L).
104
+ For each built-in provider, pi maintains a list of tool-capable models, updated with every release. Authenticate via subscription (`/login`) or API key, then select any model from that provider via `/model` (or CTRL+L).
105
105
 
106
106
  **Subscriptions:**
107
107
  - Anthropic Claude Pro/Max
@@ -162,8 +162,8 @@ The editor can be temporarily replaced by other UI, like built-in `/settings` or
162
162
  |---------|-----|
163
163
  | File reference | Type `@` to fuzzy-search project files |
164
164
  | Path completion | Tab to complete paths |
165
- | Multi-line | Shift+Enter (or Ctrl+Enter on Windows Terminal) |
166
- | Images | Ctrl+V to paste (Alt+V on Windows), or drag onto terminal |
165
+ | Multi-line | SHIFT+Enter (or CTRL+Enter on Windows Terminal) |
166
+ | Images | CTRL+V to paste (ALT+V on Windows), or drag onto terminal |
167
167
  | Bash commands | `!command` runs and sends output to LLM, `!!command` runs without sending |
168
168
 
169
169
  Standard editing keybindings for delete word, undo, etc. See [docs/keybindings.md](docs/keybindings.md).
@@ -176,7 +176,7 @@ Type `/` in the editor to trigger commands. [Extensions](#extensions) can regist
176
176
  |---------|-------------|
177
177
  | `/login`, `/logout` | OAuth authentication |
178
178
  | `/model` | Switch models |
179
- | `/scoped-models` | Enable/disable models for Ctrl+P cycling |
179
+ | `/scoped-models` | Enable/disable models for CTRL+P cycling |
180
180
  | `/settings` | Thinking level, theme, message delivery, transport |
181
181
  | `/resume` | Pick from previous sessions |
182
182
  | `/new` | Start a new session |
@@ -202,26 +202,26 @@ See `/hotkeys` for the full list. Customize via `~/.pi/agent/keybindings.json`.
202
202
 
203
203
  | Key | Action |
204
204
  |-----|--------|
205
- | Ctrl+C | Clear editor |
206
- | Ctrl+C twice | Quit |
205
+ | CTRL+C | Clear editor |
206
+ | CTRL+C twice | Quit |
207
207
  | Escape | Cancel/abort |
208
208
  | Escape twice | Open `/tree` |
209
- | Ctrl+L | Open model selector |
210
- | Ctrl+P / Shift+Ctrl+P | Cycle scoped models forward/backward |
211
- | Shift+Tab | Cycle thinking level |
212
- | Ctrl+O | Collapse/expand tool output |
213
- | Ctrl+T | Collapse/expand thinking blocks |
209
+ | CTRL+L | Open model selector |
210
+ | CTRL+P / SHIFT+CTRL+P | Cycle scoped models forward/backward |
211
+ | SHIFT+Tab | Cycle thinking level |
212
+ | CTRL+O | Collapse/expand tool output |
213
+ | CTRL+T | Collapse/expand thinking blocks |
214
214
 
215
215
  ### Message Queue
216
216
 
217
217
  Submit messages while the agent is working:
218
218
 
219
219
  - **Enter** queues a *steering* message, delivered after the current assistant turn finishes executing its tool calls
220
- - **Alt+Enter** queues a *follow-up* message, delivered only after the agent finishes all work
220
+ - **ALT+Enter** queues a *follow-up* message, delivered only after the agent finishes all work
221
221
  - **Escape** aborts and restores queued messages to editor
222
- - **Alt+Up** retrieves queued messages back to editor
222
+ - **ALT+Up** retrieves queued messages back to editor
223
223
 
224
- On Windows Terminal, `Alt+Enter` is fullscreen by default. Remap it in [docs/terminal-setup.md](docs/terminal-setup.md) so pi can receive the follow-up shortcut.
224
+ On Windows Terminal, `ALT+Enter` is fullscreen by default. Remap it in [docs/terminal-setup.md](docs/terminal-setup.md) so pi can receive the follow-up shortcut.
225
225
 
226
226
  Configure delivery in [settings](docs/settings.md): `steeringMode` and `followUpMode` can be `"one-at-a-time"` (default, waits for response) or `"all"` (delivers all queued at once). `transport` selects provider transport preference (`"sse"`, `"websocket"`, or `"auto"`) for providers that support multiple transports.
227
227
 
@@ -251,9 +251,9 @@ Use `/session` in interactive mode to see the current session ID before reusing
251
251
 
252
252
  <p align="center"><img src="docs/images/tree-view.png" alt="Tree View" width="600"></p>
253
253
 
254
- - Search by typing, fold/unfold and jump between branches with Ctrl+←/Ctrl+→ or Alt+←/Alt+→, page with ←/→
255
- - Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all
256
- - Press Shift+L to label entries as bookmarks and Shift+T to toggle label timestamps
254
+ - Search by typing, fold/unfold and jump between branches with CTRL+←/CTRL+→ or ALT+←/ALT+→, page with ←/→
255
+ - Filter modes (CTRL+O): default → no-tools → user-only → labeled-only → all
256
+ - Press SHIFT+L to label entries as bookmarks and SHIFT+T to toggle label timestamps
257
257
 
258
258
  **`/fork`** - Create a new session file from a previous user message on the active branch. Opens a selector, copies the active path up to that point, and places the selected prompt in the editor for modification.
259
259
 
@@ -410,22 +410,23 @@ pi config # enable/disable extensions, skills, pro
410
410
 
411
411
  Packages install to `~/.pi/agent/git/` (git) or global npm. Use `-l` for project-local installs (`.pi/git/`, `.pi/npm/`). Git packages install dependencies with `npm install --omit=dev` by default, so runtime deps must be listed under `dependencies`; when `npmCommand` is configured, git packages use plain `install` for compatibility with wrappers. If you use a Node version manager and want package installs to reuse a stable npm context, set `npmCommand` in `settings.json`, for example `["mise", "exec", "node@20", "--", "npm"]`.
412
412
 
413
- Create a package by adding a `pi` key to `package.json`:
413
+ Create a package by adding an app-name manifest key to `package.json` (`atomic` for this package). The legacy `pi` key is still accepted as a backwards-compatible shim:
414
414
 
415
415
  ```json
416
416
  {
417
417
  "name": "my-pi-package",
418
418
  "keywords": ["pi-package"],
419
- "pi": {
419
+ "atomic": {
420
420
  "extensions": ["./extensions"],
421
421
  "skills": ["./skills"],
422
422
  "prompts": ["./prompts"],
423
- "themes": ["./themes"]
423
+ "themes": ["./themes"],
424
+ "workflows": ["./workflows"]
424
425
  }
425
426
  }
426
427
  ```
427
428
 
428
- Without a `pi` manifest, pi auto-discovers from conventional directories (`extensions/`, `skills/`, `prompts/`, `themes/`).
429
+ Without a manifest, Atomic auto-discovers from conventional directories (`extensions/`, `skills/`, `prompts/`, `themes/`, `workflows/`). Workflow packages may also use a singular `workflow/` directory.
429
430
 
430
431
  See [docs/packages.md](docs/packages.md).
431
432
 
@@ -532,7 +533,7 @@ cat README.md | pi -p "Summarize this text"
532
533
  | `--model <pattern>` | Model pattern or ID (supports `provider/id` and optional `:<thinking>`) |
533
534
  | `--api-key <key>` | API key (overrides env vars) |
534
535
  | `--thinking <level>` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
535
- | `--models <patterns>` | Comma-separated patterns for Ctrl+P cycling |
536
+ | `--models <patterns>` | Comma-separated patterns for CTRL+P cycling |
536
537
  | `--list-models [search]` | List available models |
537
538
 
538
539
  ### Session Options
@@ -634,7 +635,7 @@ pi --thinking high "Solve this complex problem"
634
635
  | `PI_SKIP_VERSION_CHECK` | Skip the Pi version update check at startup. This prevents the `pi.dev` latest-version request |
635
636
  | `PI_TELEMETRY` | Override install/update telemetry. Use `1`/`true`/`yes` to enable or `0`/`false`/`no` to disable. This does not disable update checks |
636
637
  | `PI_CACHE_RETENTION` | Set to `long` for extended prompt cache (Anthropic: 1h, OpenAI: 24h) |
637
- | `VISUAL`, `EDITOR` | External editor for Ctrl+G |
638
+ | `VISUAL`, `EDITOR` | External editor for CTRL+G |
638
639
 
639
640
  ---
640
641
 
@@ -7,7 +7,7 @@
7
7
  Direct 1:1 messaging between pi sessions on the same machine. Send context, findings, or requests from one session to another — whether you're driving the conversation or letting agents coordinate.
8
8
 
9
9
  ```text
10
- User flow: press Alt+M or run /intercom to pick a session and send a message
10
+ User flow: ALT+M or run /intercom to pick a session and send a message
11
11
  ```
12
12
 
13
13
  ## Why
@@ -24,7 +24,7 @@ Pi-intercom also integrates well with [pi-subagents](https://github.com/nicobail
24
24
 
25
25
  ## In One Minute
26
26
 
27
- Each pi session that has `pi-intercom` loaded and enabled connects to a tiny local broker over a local IPC transport. The broker keeps track of connected sessions and routes direct messages to the one you target by name or session ID. The extension gives you both a tool (`intercom`) and a small overlay UI (`/intercom` or `Alt+M`). Incoming messages are rendered inline inside the recipient session, can trigger a turn immediately, and are also stored in Pi session history as extension entries.
27
+ Each pi session that has `pi-intercom` loaded and enabled connects to a tiny local broker over a local IPC transport. The broker keeps track of connected sessions and routes direct messages to the one you target by name or session ID. The extension gives you both a tool (`intercom`) and a small overlay UI (`/intercom` or `ALT+M`). Incoming messages are rendered inline inside the recipient session, can trigger a turn immediately, and are also stored in Pi session history as extension entries.
28
28
 
29
29
  ## Install
30
30
 
@@ -62,11 +62,11 @@ If a session is unnamed, pi-intercom now exposes a runtime-only fallback alias l
62
62
 
63
63
  ### From the Keyboard
64
64
 
65
- Press **Alt+M** or type `/intercom` to open the session list overlay:
65
+ **ALT+M** Open or type `/intercom` to open the session list overlay:
66
66
 
67
67
  1. **Select a session** — Use arrow keys to pick a target session
68
68
  2. **Compose message** — Write your message in the compose overlay
69
- 3. **Send** — Press Enter to send, Escape to cancel
69
+ 3. **Send** — Enter Send · Escape Cancel
70
70
 
71
71
  ### From the Agent
72
72
 
@@ -352,7 +352,7 @@ Only registered in sessions where `pi-subagents` supplied the required child bri
352
352
 
353
353
  | Key | Action |
354
354
  |-----|--------|
355
- | Alt+M | Open session list overlay |
355
+ | ALT+M | Open session list overlay |
356
356
  | ↑/↓ | Navigate session list |
357
357
  | Enter | Select session / Send message |
358
358
  | Escape | Cancel / Close overlay |
@@ -1056,7 +1056,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
1056
1056
  id: Type.String(),
1057
1057
  type: Type.String({ description: "Question type: single, multi, text, image, or info" }),
1058
1058
  question: Type.String(),
1059
- options: Type.Optional(Type.Array(Type.Any())),
1059
+ options: Type.Optional(Type.Array(Type.Unknown())),
1060
1060
  context: Type.Optional(Type.String()),
1061
1061
  })),
1062
1062
  }, { description: "Structured interview request for reason='interview_request'" })),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.8.4",
3
+ "version": "0.8.5-0",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions.",
6
6
  "contributors": [
@@ -4,6 +4,24 @@ import type { KeybindingsManager, Theme } from "@bastani/atomic";
4
4
  import type { IntercomClient } from "../broker/client.js";
5
5
  import type { SessionInfo } from "../types.js";
6
6
 
7
+ function formatKeyLabel(key: string): string {
8
+ return key
9
+ .split("+")
10
+ .map((part) => {
11
+ const lower = part.toLowerCase();
12
+ if (["ctrl", "cmd", "alt", "shift"].includes(lower)) return lower.toUpperCase();
13
+ if (lower === "esc" || lower === "escape") return "Escape";
14
+ if (lower === "enter") return "Enter";
15
+ if (/^[a-z]$/.test(lower)) return lower.toUpperCase();
16
+ return part;
17
+ })
18
+ .join("+");
19
+ }
20
+
21
+ function formatKeys(keys: readonly string[]): string {
22
+ return keys.map(formatKeyLabel).join("/");
23
+ }
24
+
7
25
  export interface ComposeResult {
8
26
  sent: boolean;
9
27
  messageId?: string;
@@ -105,7 +123,7 @@ export class ComposeOverlay implements Component {
105
123
  render(width: number): string[] {
106
124
  const innerWidth = Math.max(24, Math.min(width - 2, 72));
107
125
  const contentWidth = Math.max(1, innerWidth - 2);
108
- const footer = `${this.keybindings.getKeys("tui.select.confirm").join("/")}: Send • ${this.keybindings.getKeys("tui.select.cancel").join("/")}: Close`;
126
+ const footer = `${formatKeys(this.keybindings.getKeys("tui.select.confirm"))}: Send • ${formatKeys(this.keybindings.getKeys("tui.select.cancel"))}: Close`;
109
127
  const border = (text: string) => this.theme.fg("accent", text);
110
128
  const row = (text = "") => {
111
129
  const clipped = truncateToWidth(text, contentWidth, "", true);
@@ -3,6 +3,24 @@ import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
3
3
  import type { KeybindingsManager, Theme } from "@bastani/atomic";
4
4
  import type { SessionInfo } from "../types.js";
5
5
 
6
+ function formatKeyLabel(key: string): string {
7
+ return key
8
+ .split("+")
9
+ .map((part) => {
10
+ const lower = part.toLowerCase();
11
+ if (["ctrl", "cmd", "alt", "shift"].includes(lower)) return lower.toUpperCase();
12
+ if (lower === "esc" || lower === "escape") return "Escape";
13
+ if (lower === "enter") return "Enter";
14
+ if (/^[a-z]$/.test(lower)) return lower.toUpperCase();
15
+ return part;
16
+ })
17
+ .join("+");
18
+ }
19
+
20
+ function formatKeys(keys: readonly string[]): string {
21
+ return keys.map(formatKeyLabel).join("/");
22
+ }
23
+
6
24
  function middleTruncate(text: string, maxWidth: number): string {
7
25
  if (visibleWidth(text) <= maxWidth) {
8
26
  return text;
@@ -103,7 +121,7 @@ export class SessionListOverlay implements Component {
103
121
  render(width: number): string[] {
104
122
  const innerWidth = Math.max(36, Math.min(width - 2, 88));
105
123
  const contentWidth = Math.max(1, innerWidth - 2);
106
- const footer = `${this.keybindings.getKeys("tui.select.confirm").join("/")}: Message • ${this.keybindings.getKeys("tui.select.cancel").join("/")}: Close`;
124
+ const footer = `${formatKeys(this.keybindings.getKeys("tui.select.confirm"))}: Message • ${formatKeys(this.keybindings.getKeys("tui.select.cancel"))}: Close`;
107
125
  const border = (text: string) => this.theme.fg("accent", text);
108
126
  const row = (text = "") => {
109
127
  const clipped = truncateToWidth(text, contentWidth, "", true);
@@ -279,7 +279,7 @@ Returns accumulated messages from UI sessions. Each message includes `type`, `se
279
279
 
280
280
  **Browser controls:**
281
281
 
282
- - **Cmd/Ctrl+Enter** — Complete and close
282
+ - **CMD/CTRL+Enter** — Complete and close
283
283
  - **Escape** — Cancel and close
284
284
  - **Done/Cancel buttons** — Same as keyboard shortcuts
285
285
 
@@ -332,7 +332,7 @@ Prefer `.mcp.json` for project-local shared MCP config. Use `.pi/mcp.json` only
332
332
  | Connect | `mcp({ connect: "server-name" })` |
333
333
  | UI messages | `mcp({ action: "ui-messages" })` |
334
334
 
335
- MCP proxy and direct-tool results render compactly by default: long text shows the first three lines plus a `Ctrl+O to expand` hint, while the full result remains available when expanded and is still returned unchanged to the model.
335
+ MCP proxy and direct-tool results render compactly by default: long text shows the first three lines plus a `CTRL+O Expand` hint, while the full result remains available when expanded and is still returned unchanged to the model.
336
336
 
337
337
  Search includes both MCP tools and Pi tools (from extensions). Pi tools appear first with `[pi tool]` prefix. Space-separated words are OR'd.
338
338
 
@@ -353,7 +353,7 @@ Tool names are fuzzy-matched on hyphens and underscores — `context7_resolve_li
353
353
 
354
354
  If `settings.autoAuth` is `true`, `mcp({ connect: ... })`, `mcp({ tool: ... })`, and direct tool calls automatically run OAuth when needed and retry once.
355
355
 
356
- In interactive sessions, you can also authenticate from `/mcp` with `ctrl+a` or Enter on a server that needs auth. In non-interactive sessions, browser-based OAuth still requires `/mcp-auth <server>`. `/mcp-auth` without a server only opens a picker in the interactive UI.
356
+ In interactive sessions, you can also authenticate from `/mcp` with `CTRL+A` or Enter on a server that needs auth. In non-interactive sessions, browser-based OAuth still requires `/mcp-auth <server>`. `/mcp-auth` without a server only opens a picker in the interactive UI.
357
357
 
358
358
  ## How It Works
359
359
 
@@ -409,7 +409,7 @@ export async function openMcpAuthPanel(
409
409
  resolve();
410
410
  }, {
411
411
  authOnly: true,
412
- noticeLines: ["Select an OAuth MCP server and press Enter or ctrl+a to authenticate."],
412
+ noticeLines: ["Select OAuth MCP Server. Enter/CTRL+A Authenticate."],
413
413
  });
414
414
  },
415
415
  { overlay: true, overlayOptions: { anchor: "center", width: 82 } },
@@ -96,7 +96,7 @@ export function buildHostHtmlTemplate(input: HostHtmlTemplateInput): string {
96
96
  </div>
97
97
  <div class="controls">
98
98
  <span class="status" id="status">Loading UI...</span>
99
- <button class="primary" id="done-btn" title="Cmd/Ctrl+Enter">Done</button>
99
+ <button class="primary" id="done-btn" title="CMD/CTRL+Enter">Done</button>
100
100
  <button class="danger" id="cancel-btn" title="Escape">Cancel</button>
101
101
  </div>
102
102
  </header>
@@ -699,22 +699,22 @@ class McpPanel {
699
699
  lines.push(emptyRow());
700
700
  const hints = this.authOnly
701
701
  ? [
702
- italic("↑↓") + " navigate",
703
- italic("⏎") + " auth",
704
- italic("ctrl+a") + " auth",
705
- italic("esc") + " clear/close",
706
- italic("ctrl+c") + " quit",
702
+ italic("↑↓") + " Navigate",
703
+ italic("⏎") + " Auth",
704
+ italic("CTRL+A") + " Auth",
705
+ italic("Escape") + " Clear/Close",
706
+ italic("CTRL+C") + " Quit",
707
707
  ]
708
708
  : [
709
- italic("↑↓") + " navigate",
710
- italic("space") + " toggle",
711
- italic("⏎") + " expand/auth",
712
- italic("ctrl+a") + " auth",
713
- italic("ctrl+r") + " reconnect",
714
- italic("?") + " desc search",
715
- italic("ctrl+s") + " save",
716
- italic("esc") + " clear/close",
717
- italic("ctrl+c") + " quit",
709
+ italic("↑↓") + " Navigate",
710
+ italic("Space") + " Toggle",
711
+ italic("⏎") + " Expand/Auth",
712
+ italic("CTRL+A") + " Auth",
713
+ italic("CTRL+R") + " Reconnect",
714
+ italic("?") + " Desc Search",
715
+ italic("CTRL+S") + " Save",
716
+ italic("Escape") + " Clear/Close",
717
+ italic("CTRL+C") + " Quit",
718
718
  ];
719
719
  const gap = " ";
720
720
  const gapW = 2;
@@ -299,7 +299,7 @@ export class McpSetupPanel {
299
299
  return;
300
300
  }
301
301
 
302
- this.notice = { text: "Review the details below. Press Enter on an action with a side effect to apply it.", tone: "muted" };
302
+ this.notice = { text: "Review Details Below. Enter Apply Action With Side Effect.", tone: "muted" };
303
303
  this.tui.requestRender();
304
304
  }
305
305
 
@@ -387,13 +387,13 @@ export class McpSetupPanel {
387
387
  lines.push(this.padLine(line, innerW));
388
388
  }
389
389
  lines.push(this.padLine("", innerW));
390
- lines.push(this.padLine(fg(this.t.muted, "Enter selects, Esc goes back, Ctrl+C closes."), innerW));
390
+ lines.push(this.padLine(fg(this.t.muted, "Enter Select · Escape Back · CTRL+C Close"), innerW));
391
391
  return lines;
392
392
  }
393
393
 
394
394
  private renderImports(innerW: number): string[] {
395
395
  const lines: string[] = [];
396
- lines.push(this.padLine("Select compatibility imports. Space toggles, Enter saves, Esc goes back.", innerW));
396
+ lines.push(this.padLine("Select Compatibility Imports. Space Toggle · Enter Save · Escape Back.", innerW));
397
397
  lines.push(this.padLine("", innerW));
398
398
  for (let index = 0; index < this.discovery.imports.length; index++) {
399
399
  const entry = this.discovery.imports[index];
@@ -412,7 +412,7 @@ export class McpSetupPanel {
412
412
 
413
413
  private renderPaths(innerW: number): string[] {
414
414
  const lines: string[] = [];
415
- lines.push(this.padLine("Select a detected config path to open. Enter opens it, Esc goes back.", innerW));
415
+ lines.push(this.padLine("Select Detected Config Path. Enter Open · Escape Back.", innerW));
416
416
  lines.push(this.padLine("", innerW));
417
417
  const paths = this.getDetectedPaths();
418
418
  for (let index = 0; index < paths.length; index++) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.8.4",
3
+ "version": "0.8.5-0",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent.",
6
6
  "contributors": [
@@ -58,7 +58,7 @@ export function renderMcpToolResult(
58
58
  .map((line) => line === "…" ? theme.fg("muted", line) : theme.fg("toolOutput", line))
59
59
  .join("\n");
60
60
  const hint = display.truncated && !options.expanded
61
- ? `\n${theme.fg("muted", "(Ctrl+O to expand)")}`
61
+ ? `\n${theme.fg("muted", "(CTRL+O Expand)")}`
62
62
  : "";
63
63
 
64
64
  return new Text(`${output}${hint}`, 0, 0);
@@ -337,7 +337,7 @@ Chains open a clarify UI by default so you can preview and edit the workflow bef
337
337
  Common clarify keys:
338
338
 
339
339
  - `Enter` runs in the foreground, or in the background if background is toggled on
340
- - `Esc` cancels or backs out
340
+ - `Escape` Cancel/Back
341
341
  - `↑↓` moves between steps or tasks
342
342
  - `e` edits the task/template
343
343
  - `m` selects a model
@@ -347,7 +347,7 @@ Common clarify keys:
347
347
  - `w` edits output/write behavior where supported
348
348
  - `r` edits reads where supported
349
349
  - `p` toggles progress tracking where supported
350
- Picker screens use `↑↓`, `Enter`, `Esc`, and type-to-filter. The full-screen editor supports word wrapping, paste, `Esc` to save, and `Ctrl+C` to discard.
350
+ Picker screens use `↑↓`, `Enter`, `Escape`, and type-to-filter. The full-screen editor supports word wrapping, paste, `Escape` Save, and `CTRL+C` Discard.
351
351
 
352
352
  ## Agents and chains
353
353
 
@@ -902,7 +902,7 @@ Async runs write:
902
902
 
903
903
  Foreground runs show compact live progress for single, chain, and parallel modes: current tool, recent output, token counts, duration, activity freshness, and current-tool duration.
904
904
 
905
- Press `Ctrl+O` to expand the full streaming view with complete output per step.
905
+ Press `CTRL+O` to expand the full streaming view with complete output per step.
906
906
 
907
907
  Sequential chains show a flow line like `done scout → running planner`. Chains with parallel steps show per-step cards instead.
908
908
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.8.4",
3
+ "version": "0.8.5-0",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with chains, parallel execution, and TUI clarification.",
6
6
  "contributors": [