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