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