@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Custom `EditorComponent` swapped in via `ctx.ui.setEditorComponent` while
|
|
3
3
|
* an inline workflow form is active. Owns ALL keystrokes during fill-out:
|
|
4
4
|
*
|
|
5
|
-
* tab / shift+tab — move focus across form fields
|
|
5
|
+
* tab / shift+tab — move focus across form fields and the final Submit action
|
|
6
6
|
* ↑/↓ — move focus (or caret between logical lines in `text`)
|
|
7
7
|
* ←/→ — caret nav (text) | choice cycle (select) | flip (bool)
|
|
8
8
|
* alt/ctrl+←/→ — word movement in text/string/number fields
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
* space — boolean toggle
|
|
17
17
|
* enter — newline (text) | otherwise next field
|
|
18
18
|
* printable ASCII — insert at caret (text/string/number)
|
|
19
|
-
*
|
|
19
|
+
* submit action — ↑/↓ returns to questions; enter submits
|
|
20
20
|
* esc / ctrl+c — cancel form
|
|
21
21
|
*
|
|
22
22
|
* Editor-mode keys (cursor movement, word jumps, deletions) route through
|
|
23
23
|
* the Pi `KeybindingsManager` injected by the host at factory time, so any
|
|
24
24
|
* user-configured keybinding overrides surfaces here as well. Form-level
|
|
25
|
-
* keys (tab/shift+tab/
|
|
25
|
+
* keys (tab/shift+tab/esc/ctrl+c) stay as raw byte checks because
|
|
26
26
|
* they are workflow form contract, not Pi-configurable actions.
|
|
27
27
|
*
|
|
28
28
|
* On submit/cancel the editor calls back to the orchestrator which:
|
|
@@ -47,8 +47,10 @@ import type { GraphTheme } from "./graph-theme.js";
|
|
|
47
47
|
import type { WorkflowInputEntry } from "../extension/render-result.js";
|
|
48
48
|
import type { InlineFormState } from "./inline-form-store.js";
|
|
49
49
|
import { getForm, touch } from "./inline-form-store.js";
|
|
50
|
+
import { computeInvalid } from "./inputs-picker.js";
|
|
50
51
|
import {
|
|
51
52
|
type KeybindingsLike,
|
|
53
|
+
TUI_ACTION,
|
|
52
54
|
deleteRange,
|
|
53
55
|
isKeybindingsLike,
|
|
54
56
|
lineEnd,
|
|
@@ -57,14 +59,14 @@ import {
|
|
|
57
59
|
wordLeft,
|
|
58
60
|
wordRight,
|
|
59
61
|
} from "./keybindings-adapter.js";
|
|
60
|
-
import { decodePrintableKey, matchesKey, visibleWidth } from "./text-helpers.js";
|
|
62
|
+
import { decodePrintableKey, Key, matchesKey, visibleWidth } from "./text-helpers.js";
|
|
61
63
|
|
|
62
64
|
export type FormEditorOutcome = "submit" | "cancel";
|
|
63
65
|
|
|
64
66
|
export interface InlineFormEditorOpts {
|
|
65
67
|
formId: string;
|
|
66
68
|
theme: GraphTheme;
|
|
67
|
-
/** Called when
|
|
69
|
+
/** Called when the Submit row passes validation or cancel fires. */
|
|
68
70
|
onExit: (outcome: FormEditorOutcome) => void;
|
|
69
71
|
/**
|
|
70
72
|
* Pi's `KeybindingsManager` injected as the third arg of the editor
|
|
@@ -433,27 +435,23 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
433
435
|
// editor actions, so they stay as raw byte checks:
|
|
434
436
|
// esc (\x1b) — cancel form
|
|
435
437
|
// ctrl+c (\x03) — cancel form
|
|
436
|
-
//
|
|
437
|
-
// tab
|
|
438
|
-
|
|
439
|
-
if (matchesKey(data, "ctrl+c") || matchesKey(data, "escape")) {
|
|
438
|
+
// tab (\t) — focus next field / final Submit action
|
|
439
|
+
// shift+tab (\x1b[Z) — focus previous field / final Submit action
|
|
440
|
+
if (matchesKey(data, Key.ctrl("c")) || matchesKey(data, Key.escape)) {
|
|
440
441
|
this.opts.onExit("cancel");
|
|
441
442
|
return true;
|
|
442
443
|
}
|
|
443
|
-
if (matchesKey(data,
|
|
444
|
-
if (this.allValid(state)) this.opts.onExit("submit");
|
|
445
|
-
else this.focusFirstInvalid(state);
|
|
446
|
-
return true;
|
|
447
|
-
}
|
|
448
|
-
if (matchesKey(data, "tab")) {
|
|
444
|
+
if (matchesKey(data, Key.tab)) {
|
|
449
445
|
this.moveFocus(state, +1);
|
|
450
446
|
return true;
|
|
451
447
|
}
|
|
452
|
-
if (matchesKey(data, "
|
|
448
|
+
if (matchesKey(data, Key.shift("tab"))) {
|
|
453
449
|
this.moveFocus(state, -1);
|
|
454
450
|
return true;
|
|
455
451
|
}
|
|
456
452
|
|
|
453
|
+
if (state.focusedIdx === state.fields.length) return this.handleSubmit(data, state);
|
|
454
|
+
|
|
457
455
|
const field = state.fields[state.focusedIdx];
|
|
458
456
|
if (!field) return false;
|
|
459
457
|
|
|
@@ -462,6 +460,31 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
462
460
|
return this.handleText(data, field, state);
|
|
463
461
|
}
|
|
464
462
|
|
|
463
|
+
private handleSubmit(data: string, state: InlineFormState): boolean {
|
|
464
|
+
if (matchesAction(this.kb, data, TUI_ACTION.selectUp) || matchesAction(this.kb, data, TUI_ACTION.editorCursorUp)) {
|
|
465
|
+
this.moveFocus(state, -1);
|
|
466
|
+
return true;
|
|
467
|
+
}
|
|
468
|
+
if (matchesAction(this.kb, data, TUI_ACTION.selectDown) || matchesAction(this.kb, data, TUI_ACTION.editorCursorDown)) {
|
|
469
|
+
this.moveFocus(state, +1);
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
if (
|
|
473
|
+
matchesKey(data, Key.enter) ||
|
|
474
|
+
matchesAction(this.kb, data, TUI_ACTION.selectConfirm) ||
|
|
475
|
+
matchesAction(this.kb, data, TUI_ACTION.inputSubmit)
|
|
476
|
+
) {
|
|
477
|
+
return this.submitOrFocusInvalid(state);
|
|
478
|
+
}
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
private submitOrFocusInvalid(state: InlineFormState): boolean {
|
|
483
|
+
if (this.allValid(state)) this.opts.onExit("submit");
|
|
484
|
+
else this.focusFirstInvalid(state);
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
|
|
465
488
|
private handleSelect(
|
|
466
489
|
data: string,
|
|
467
490
|
field: WorkflowInputEntry,
|
|
@@ -471,22 +494,19 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
471
494
|
if (choices.length === 0) return false;
|
|
472
495
|
const cur = state.rawText[field.name] ?? choices[0]!;
|
|
473
496
|
const i = Math.max(0, choices.indexOf(cur));
|
|
474
|
-
if (matchesAction(this.kb, data,
|
|
497
|
+
if (matchesAction(this.kb, data, TUI_ACTION.selectUp) || matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft)) {
|
|
475
498
|
state.rawText[field.name] = choices[(i - 1 + choices.length) % choices.length]!;
|
|
476
499
|
return true;
|
|
477
500
|
}
|
|
478
|
-
if (
|
|
501
|
+
if (
|
|
502
|
+
matchesAction(this.kb, data, TUI_ACTION.selectDown) ||
|
|
503
|
+
matchesAction(this.kb, data, TUI_ACTION.editorCursorRight) ||
|
|
504
|
+
matchesKey(data, Key.space)
|
|
505
|
+
) {
|
|
479
506
|
state.rawText[field.name] = choices[(i + 1) % choices.length]!;
|
|
480
507
|
return true;
|
|
481
508
|
}
|
|
482
|
-
if (matchesAction(this.kb, data,
|
|
483
|
-
this.moveFocus(state, -1);
|
|
484
|
-
return true;
|
|
485
|
-
}
|
|
486
|
-
if (
|
|
487
|
-
matchesAction(this.kb, data, "tui.editor.cursorDown") ||
|
|
488
|
-
matchesAction(this.kb, data, "tui.input.submit")
|
|
489
|
-
) {
|
|
509
|
+
if (matchesAction(this.kb, data, TUI_ACTION.selectConfirm) || matchesAction(this.kb, data, TUI_ACTION.inputSubmit)) {
|
|
490
510
|
this.moveFocus(state, +1);
|
|
491
511
|
return true;
|
|
492
512
|
}
|
|
@@ -499,21 +519,16 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
499
519
|
state: InlineFormState,
|
|
500
520
|
): boolean {
|
|
501
521
|
if (
|
|
502
|
-
matchesKey(data,
|
|
503
|
-
matchesAction(this.kb, data,
|
|
504
|
-
matchesAction(this.kb, data,
|
|
522
|
+
matchesKey(data, Key.space) ||
|
|
523
|
+
matchesAction(this.kb, data, TUI_ACTION.selectUp) ||
|
|
524
|
+
matchesAction(this.kb, data, TUI_ACTION.selectDown) ||
|
|
525
|
+
matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft) ||
|
|
526
|
+
matchesAction(this.kb, data, TUI_ACTION.editorCursorRight)
|
|
505
527
|
) {
|
|
506
528
|
state.rawText[field.name] = state.rawText[field.name] === "true" ? "false" : "true";
|
|
507
529
|
return true;
|
|
508
530
|
}
|
|
509
|
-
if (matchesAction(this.kb, data,
|
|
510
|
-
this.moveFocus(state, -1);
|
|
511
|
-
return true;
|
|
512
|
-
}
|
|
513
|
-
if (
|
|
514
|
-
matchesAction(this.kb, data, "tui.editor.cursorDown") ||
|
|
515
|
-
matchesAction(this.kb, data, "tui.input.submit")
|
|
516
|
-
) {
|
|
531
|
+
if (matchesAction(this.kb, data, TUI_ACTION.selectConfirm) || matchesAction(this.kb, data, TUI_ACTION.inputSubmit)) {
|
|
517
532
|
this.moveFocus(state, +1);
|
|
518
533
|
return true;
|
|
519
534
|
}
|
|
@@ -531,7 +546,7 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
531
546
|
|
|
532
547
|
// Vertical navigation — text fields walk between logical lines first,
|
|
533
548
|
// single-line scalars advance focus immediately.
|
|
534
|
-
if (matchesAction(this.kb, data,
|
|
549
|
+
if (matchesAction(this.kb, data, TUI_ACTION.editorCursorUp)) {
|
|
535
550
|
if (field.type === "text") {
|
|
536
551
|
const newCaret = caretLineUp(cur, caret);
|
|
537
552
|
if (newCaret !== null) {
|
|
@@ -542,7 +557,7 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
542
557
|
this.moveFocus(state, -1);
|
|
543
558
|
return true;
|
|
544
559
|
}
|
|
545
|
-
if (matchesAction(this.kb, data,
|
|
560
|
+
if (matchesAction(this.kb, data, TUI_ACTION.editorCursorDown)) {
|
|
546
561
|
if (field.type === "text") {
|
|
547
562
|
const newCaret = caretLineDown(cur, caret);
|
|
548
563
|
if (newCaret !== null) {
|
|
@@ -579,11 +594,11 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
579
594
|
}
|
|
580
595
|
|
|
581
596
|
// Character cursor movement.
|
|
582
|
-
if (matchesAction(this.kb, data,
|
|
597
|
+
if (matchesAction(this.kb, data, TUI_ACTION.editorCursorLeft)) {
|
|
583
598
|
state.caret = previousGraphemeOffset(cur, caret);
|
|
584
599
|
return true;
|
|
585
600
|
}
|
|
586
|
-
if (matchesAction(this.kb, data,
|
|
601
|
+
if (matchesAction(this.kb, data, TUI_ACTION.editorCursorRight)) {
|
|
587
602
|
state.caret = nextGraphemeOffset(cur, caret);
|
|
588
603
|
return true;
|
|
589
604
|
}
|
|
@@ -642,7 +657,7 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
642
657
|
// explicitly equivalent to plain Enter in our form contract; both
|
|
643
658
|
// insert a newline in text fields and advance focus elsewhere.
|
|
644
659
|
if (
|
|
645
|
-
matchesAction(this.kb, data,
|
|
660
|
+
matchesAction(this.kb, data, TUI_ACTION.inputSubmit) ||
|
|
646
661
|
matchesAction(this.kb, data, "tui.input.newLine")
|
|
647
662
|
) {
|
|
648
663
|
if (field.type === "text") {
|
|
@@ -669,48 +684,28 @@ export class InlineFormEditor implements PiEditorComponent {
|
|
|
669
684
|
}
|
|
670
685
|
|
|
671
686
|
private moveFocus(state: InlineFormState, delta: number): void {
|
|
672
|
-
const n = state.fields.length;
|
|
673
|
-
if (n
|
|
687
|
+
const n = state.fields.length + 1;
|
|
688
|
+
if (n <= 1) return;
|
|
674
689
|
state.focusedIdx = (state.focusedIdx + delta + n) % n;
|
|
690
|
+
if (state.focusedIdx === state.fields.length) {
|
|
691
|
+
state.caret = 0;
|
|
692
|
+
state.submitChoiceIdx = 0;
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
675
695
|
const next = state.fields[state.focusedIdx]!;
|
|
676
696
|
state.caret = (state.rawText[next.name] ?? "").length;
|
|
677
697
|
}
|
|
678
698
|
|
|
679
699
|
private focusFirstInvalid(state: InlineFormState): void {
|
|
680
|
-
const idx = state.fields.
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
if ((f.type === "number" || f.type === "integer") && v !== "" && !Number.isFinite(Number(v))) {
|
|
684
|
-
return true;
|
|
685
|
-
}
|
|
686
|
-
return f.type === "select" && Boolean(f.choices) && v !== "" && !f.choices!.includes(v);
|
|
687
|
-
});
|
|
688
|
-
if (idx < 0) return;
|
|
700
|
+
const [idx] = computeInvalid(state.fields, state.rawText);
|
|
701
|
+
if (idx === undefined) return;
|
|
702
|
+
state.submitChoiceIdx = 0;
|
|
689
703
|
state.focusedIdx = idx;
|
|
690
704
|
state.caret = (state.rawText[state.fields[idx]!.name] ?? "").length;
|
|
691
705
|
}
|
|
692
706
|
|
|
693
707
|
private allValid(state: InlineFormState): boolean {
|
|
694
|
-
|
|
695
|
-
const v = state.rawText[f.name] ?? "";
|
|
696
|
-
if (f.required && v.trim() === "") return false;
|
|
697
|
-
if (
|
|
698
|
-
(f.type === "number" || f.type === "integer") &&
|
|
699
|
-
v !== "" &&
|
|
700
|
-
!Number.isFinite(Number(v))
|
|
701
|
-
) {
|
|
702
|
-
return false;
|
|
703
|
-
}
|
|
704
|
-
if (
|
|
705
|
-
f.type === "select" &&
|
|
706
|
-
f.choices &&
|
|
707
|
-
v !== "" &&
|
|
708
|
-
!f.choices.includes(v)
|
|
709
|
-
) {
|
|
710
|
-
return false;
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
return true;
|
|
708
|
+
return computeInvalid(state.fields, state.rawText).length === 0;
|
|
714
709
|
}
|
|
715
710
|
}
|
|
716
711
|
|
|
@@ -57,7 +57,6 @@ export type InlineFormResult =
|
|
|
57
57
|
|
|
58
58
|
export interface OpenInlineFormOpts {
|
|
59
59
|
workflowName: string;
|
|
60
|
-
description?: string;
|
|
61
60
|
fields: readonly WorkflowInputEntry[];
|
|
62
61
|
prefilled?: Record<string, unknown>;
|
|
63
62
|
theme: GraphTheme;
|
|
@@ -107,7 +106,7 @@ export function registerInlineFormRenderer(pi: ExtensionAPI, theme: GraphTheme):
|
|
|
107
106
|
const state = getForm(formId);
|
|
108
107
|
if (!state) {
|
|
109
108
|
// Process restart / map evicted — tombstone the entry.
|
|
110
|
-
return
|
|
109
|
+
return ` ${message.content ?? "workflow form"} · (snapshot lost)`;
|
|
111
110
|
}
|
|
112
111
|
return {
|
|
113
112
|
// The card is fully reactive: read fresh state on every render call,
|
|
@@ -199,10 +198,10 @@ export async function openInlineInputsForm(
|
|
|
199
198
|
const state = createForm({
|
|
200
199
|
formId,
|
|
201
200
|
workflowName: opts.workflowName,
|
|
202
|
-
description: opts.description,
|
|
203
201
|
fields: opts.fields,
|
|
204
202
|
rawText,
|
|
205
203
|
focusedIdx,
|
|
204
|
+
submitChoiceIdx: 0,
|
|
206
205
|
caret: (rawText[opts.fields[focusedIdx]!.name] ?? "").length,
|
|
207
206
|
status: "editing",
|
|
208
207
|
});
|
|
@@ -32,11 +32,12 @@ export type FormStatus = "editing" | "submitted" | "cancelled";
|
|
|
32
32
|
export interface InlineFormState {
|
|
33
33
|
formId: string;
|
|
34
34
|
workflowName: string;
|
|
35
|
-
description?: string;
|
|
36
35
|
fields: readonly WorkflowInputEntry[];
|
|
37
36
|
/** Raw string per field; mirrors `inputs-picker.ts` semantics. */
|
|
38
37
|
rawText: Record<string, string>;
|
|
39
38
|
focusedIdx: number;
|
|
39
|
+
/** Reserved for older form snapshots; Submit is now a single final action. */
|
|
40
|
+
submitChoiceIdx: number;
|
|
40
41
|
caret: number;
|
|
41
42
|
status: FormStatus;
|
|
42
43
|
/** Tick counter; bumped on every mutation so renderers can hash-dedupe. */
|
|
@@ -55,7 +55,6 @@ export type InputsPickerResult =
|
|
|
55
55
|
|
|
56
56
|
export interface OpenInputsPickerOpts {
|
|
57
57
|
workflowName: string;
|
|
58
|
-
description?: string;
|
|
59
58
|
fields: WorkflowInputEntry[];
|
|
60
59
|
/** Prefilled values (e.g. from `key=value` slash args). The form
|
|
61
60
|
* seeds these into the form so the user doesn't re-type what they typed. */
|
|
@@ -78,7 +77,7 @@ export function openInputsPicker(
|
|
|
78
77
|
opts: OpenInputsPickerOpts,
|
|
79
78
|
): Promise<InputsPickerResult> {
|
|
80
79
|
return new Promise<InputsPickerResult>((resolve) => {
|
|
81
|
-
const { workflowName,
|
|
80
|
+
const { workflowName, fields, prefilled, theme } = opts;
|
|
82
81
|
const custom = ui.custom;
|
|
83
82
|
if (typeof custom !== "function") {
|
|
84
83
|
resolve({ kind: "cancel" });
|
|
@@ -124,7 +123,6 @@ export function openInputsPicker(
|
|
|
124
123
|
width,
|
|
125
124
|
theme,
|
|
126
125
|
workflowName,
|
|
127
|
-
description,
|
|
128
126
|
fields,
|
|
129
127
|
state,
|
|
130
128
|
cursorOn,
|