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