@opengsd/gsd-pi 1.1.1-dev.a5a2de8 → 1.1.1-dev.b2556262
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/dist/headless-recover.js +56 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +18 -2
- package/dist/resources/extensions/browser-tools/engine/selection.js +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/index.js +68 -24
- package/dist/resources/extensions/browser-tools/state.js +12 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +3 -2
- package/dist/resources/extensions/browser-tools/utils.js +3 -3
- package/dist/resources/extensions/browser-tools/web-app-detect.js +52 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +87 -12
- package/dist/resources/extensions/gsd/auto/session.js +22 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +81 -13
- package/dist/resources/extensions/gsd/auto-model-selection.js +154 -9
- package/dist/resources/extensions/gsd/auto-post-unit.js +19 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +26 -21
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -2
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-timers.js +24 -10
- package/dist/resources/extensions/gsd/auto.js +40 -15
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +192 -77
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/closeout-wizard.js +32 -9
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -9
- package/dist/resources/extensions/gsd/commands-maintenance.js +93 -15
- package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +2 -2
- package/dist/resources/extensions/gsd/config-overlay.js +1 -0
- package/dist/resources/extensions/gsd/context-masker.js +129 -5
- package/dist/resources/extensions/gsd/db-writer.js +35 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/dist/resources/extensions/gsd/gsd-db.js +480 -172
- package/dist/resources/extensions/gsd/guided-flow.js +4 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +37 -53
- package/dist/resources/extensions/gsd/md-importer.js +38 -3
- package/dist/resources/extensions/gsd/migration-auto-check.js +126 -31
- package/dist/resources/extensions/gsd/parsers-legacy.js +23 -0
- package/dist/resources/extensions/gsd/planner-handoff.js +98 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +22 -4
- package/dist/resources/extensions/gsd/pre-execution-checks.js +10 -2
- package/dist/resources/extensions/gsd/preferences-models.js +111 -43
- package/dist/resources/extensions/gsd/preferences-types.js +13 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +68 -3
- package/dist/resources/extensions/gsd/preferences.js +4 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +5 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +6 -4
- package/dist/resources/extensions/gsd/skill-manifest.js +12 -0
- package/dist/resources/extensions/gsd/source-observations.js +306 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +15 -8
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +33 -5
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +34 -13
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +39 -14
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +4 -4
- package/dist/resources/extensions/gsd/state.js +7 -3
- package/dist/resources/extensions/gsd/tool-contract.js +15 -1
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +24 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +28 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +42 -11
- package/dist/resources/extensions/gsd/tools/plan-task.js +7 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +62 -406
- package/dist/resources/extensions/gsd/uat-policy.js +130 -0
- package/dist/resources/extensions/gsd/uat-run.js +414 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +3 -4
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +38 -14
- package/dist/resources/extensions/gsd/verdict-parser.js +3 -8
- package/dist/resources/extensions/gsd/workflow-manifest.js +132 -5
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +8 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +26 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +96 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +18 -17
- package/dist/resources/extensions/shared/gsd-browser-cli.js +6 -0
- package/dist/resources/extensions/subagent/agents.js +1 -0
- package/dist/resources/extensions/subagent/index.js +27 -12
- package/dist/resources/extensions/subagent/launch.js +7 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/dist/native.js +22 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +21 -23
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +66 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +18 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +16 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/dist/native.js +22 -0
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +174 -29
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +178 -54
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +8 -1
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/utils.d.ts +11 -0
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +119 -6
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/themes.js +1 -1
- package/pkg/dist/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install/handoff.js +16 -3
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +21 -2
- package/src/resources/extensions/browser-tools/engine/selection.ts +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/index.ts +75 -27
- package/src/resources/extensions/browser-tools/state.ts +13 -0
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +2 -2
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +57 -0
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +37 -0
- package/src/resources/extensions/browser-tools/tests/web-app-detect.test.mjs +68 -0
- package/src/resources/extensions/browser-tools/tools/session.ts +4 -2
- package/src/resources/extensions/browser-tools/utils.ts +3 -3
- package/src/resources/extensions/browser-tools/web-app-detect.ts +63 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +89 -15
- package/src/resources/extensions/gsd/auto/session.ts +24 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +117 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +190 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +20 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +25 -22
- package/src/resources/extensions/gsd/auto-recovery.ts +22 -3
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-timers.ts +25 -9
- package/src/resources/extensions/gsd/auto.ts +41 -14
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +250 -78
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +47 -13
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -17
- package/src/resources/extensions/gsd/commands-maintenance.ts +124 -13
- package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +2 -2
- package/src/resources/extensions/gsd/config-overlay.ts +1 -0
- package/src/resources/extensions/gsd/context-masker.ts +152 -5
- package/src/resources/extensions/gsd/db-writer.ts +38 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/src/resources/extensions/gsd/gsd-db.ts +564 -186
- package/src/resources/extensions/gsd/guided-flow.ts +4 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +44 -66
- package/src/resources/extensions/gsd/md-importer.ts +49 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +154 -34
- package/src/resources/extensions/gsd/parsers-legacy.ts +20 -0
- package/src/resources/extensions/gsd/planner-handoff.ts +149 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +22 -4
- package/src/resources/extensions/gsd/pre-execution-checks.ts +9 -2
- package/src/resources/extensions/gsd/preferences-models.ts +113 -43
- package/src/resources/extensions/gsd/preferences-types.ts +47 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +76 -2
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +6 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +8 -5
- package/src/resources/extensions/gsd/skill-manifest.ts +12 -0
- package/src/resources/extensions/gsd/source-observations.ts +402 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +20 -8
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +44 -5
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +39 -11
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +45 -15
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +4 -4
- package/src/resources/extensions/gsd/state.ts +7 -4
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +66 -4
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +299 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -0
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/closeout-wizard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/content-validator.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +56 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +1 -11
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +99 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planner-handoff.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +162 -18
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/source-observations.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +76 -21
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +306 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +77 -10
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +260 -5
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +511 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +44 -0
- package/src/resources/extensions/gsd/tool-contract.ts +29 -1
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +41 -6
- package/src/resources/extensions/gsd/tools/complete-slice.ts +29 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +54 -12
- package/src/resources/extensions/gsd/tools/plan-task.ts +8 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +71 -489
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/uat-policy.ts +191 -0
- package/src/resources/extensions/gsd/uat-run.ts +550 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +3 -4
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +38 -14
- package/src/resources/extensions/gsd/verdict-parser.ts +3 -10
- package/src/resources/extensions/gsd/workflow-manifest.ts +193 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -3
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +32 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +103 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +22 -22
- package/src/resources/extensions/shared/gsd-browser-cli.ts +6 -0
- package/src/resources/extensions/shared/tests/format-utils.test.ts +8 -3
- package/src/resources/extensions/subagent/agents.ts +4 -0
- package/src/resources/extensions/subagent/index.ts +28 -3
- package/src/resources/extensions/subagent/launch.ts +8 -0
- package/src/resources/extensions/subagent/tests/model-override.test.ts +31 -0
- /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_ssgManifest.js +0 -0
|
@@ -9,6 +9,10 @@ import {
|
|
|
9
9
|
} from "./unit-context-manifest.js";
|
|
10
10
|
import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
|
|
11
11
|
import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
|
|
12
|
+
import {
|
|
13
|
+
WHOLE_FILE_OBSERVATION_MAX_BYTES,
|
|
14
|
+
WHOLE_FILE_OBSERVATION_MAX_LINES,
|
|
15
|
+
} from "./source-observations.js";
|
|
12
16
|
|
|
13
17
|
export interface UnitToolContract {
|
|
14
18
|
unitType: string;
|
|
@@ -19,6 +23,7 @@ export interface UnitToolContract {
|
|
|
19
23
|
promptObligations: readonly string[];
|
|
20
24
|
validationRules: readonly string[];
|
|
21
25
|
closeoutTools: readonly string[];
|
|
26
|
+
sourceObservations: UnitSourceObservationContract;
|
|
22
27
|
artifacts: {
|
|
23
28
|
inline: readonly ArtifactKey[];
|
|
24
29
|
excerpt: readonly ArtifactKey[];
|
|
@@ -26,6 +31,16 @@ export interface UnitToolContract {
|
|
|
26
31
|
};
|
|
27
32
|
}
|
|
28
33
|
|
|
34
|
+
export type UnitSourceObservationContract =
|
|
35
|
+
| { mode: "none" }
|
|
36
|
+
| {
|
|
37
|
+
mode: "whole-file-active-unit";
|
|
38
|
+
seedFields: readonly ["task.files", "task.inputs"];
|
|
39
|
+
excludedFields: readonly ["expectedOutput"];
|
|
40
|
+
maxBytes: number;
|
|
41
|
+
maxLines: number;
|
|
42
|
+
};
|
|
43
|
+
|
|
29
44
|
export type ToolContractResult =
|
|
30
45
|
| { ok: true; contract: UnitToolContract }
|
|
31
46
|
| { ok: false; reason: "unknown-unit-type" | "missing-closeout-tool"; detail: string };
|
|
@@ -45,7 +60,7 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
45
60
|
const forbiddenWorkflowTools = Object.entries(surfaceContract?.forbiddenGsdTools ?? {})
|
|
46
61
|
.map(([name, reason]) => ({ name, reason }));
|
|
47
62
|
const closeoutTools = requiredWorkflowTools.filter((tool) =>
|
|
48
|
-
/^gsd_(?:task|slice|milestone|complete|validate|save|summary)/.test(tool),
|
|
63
|
+
/^gsd_(?:task|slice|milestone|complete|validate|save|summary|uat)/.test(tool),
|
|
49
64
|
);
|
|
50
65
|
|
|
51
66
|
if (requiresCloseoutTool(unitType) && closeoutTools.length === 0) {
|
|
@@ -72,8 +87,10 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
72
87
|
"unit-manifest-present",
|
|
73
88
|
"workflow-tool-surface-present",
|
|
74
89
|
...(requiresCloseoutTool(unitType) ? ["closeout-tool-present"] : []),
|
|
90
|
+
...(unitType === "execute-task" ? ["source-observation-contract-present"] : []),
|
|
75
91
|
],
|
|
76
92
|
closeoutTools,
|
|
93
|
+
sourceObservations: sourceObservationContractForUnit(unitType),
|
|
77
94
|
artifacts: {
|
|
78
95
|
inline: manifest.artifacts.inline,
|
|
79
96
|
excerpt: manifest.artifacts.excerpt,
|
|
@@ -83,6 +100,17 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
|
|
|
83
100
|
};
|
|
84
101
|
}
|
|
85
102
|
|
|
103
|
+
function sourceObservationContractForUnit(unitType: string): UnitSourceObservationContract {
|
|
104
|
+
if (unitType !== "execute-task") return { mode: "none" };
|
|
105
|
+
return {
|
|
106
|
+
mode: "whole-file-active-unit",
|
|
107
|
+
seedFields: ["task.files", "task.inputs"],
|
|
108
|
+
excludedFields: ["expectedOutput"],
|
|
109
|
+
maxBytes: WHOLE_FILE_OBSERVATION_MAX_BYTES,
|
|
110
|
+
maxLines: WHOLE_FILE_OBSERVATION_MAX_LINES,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
86
114
|
function requiresCloseoutTool(unitType: string): boolean {
|
|
87
115
|
return /^(execute-task|reactive-execute|complete-slice|validate-milestone|complete-milestone|run-uat|gate-evaluate)$/.test(unitType);
|
|
88
116
|
}
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
// File Purpose: Resolve phase-aware tool surfaces for GSD model presentations.
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
+
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
5
6
|
RUN_UAT_READ_ONLY_TOOL_NAMES,
|
|
6
7
|
RUN_UAT_TOOL_PRESENTATION_PLAN_ID,
|
|
7
8
|
RUN_UAT_WORKFLOW_TOOL_NAMES,
|
|
8
9
|
} from "./unit-tool-contracts.js";
|
|
10
|
+
import { uatTypeIncludesBrowser } from "./uat-policy.js";
|
|
9
11
|
|
|
10
12
|
export {
|
|
13
|
+
RUN_UAT_BROWSER_TOOL_NAMES,
|
|
11
14
|
RUN_UAT_READ_ONLY_TOOL_NAMES,
|
|
12
15
|
RUN_UAT_TOOL_PRESENTATION_PLAN_ID,
|
|
13
16
|
RUN_UAT_WORKFLOW_TOOL_NAMES,
|
|
@@ -32,6 +35,13 @@ export interface ToolPresentationPlan {
|
|
|
32
35
|
diagnostics: string[];
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
export interface RunUatResultPresentation {
|
|
39
|
+
surface: ToolPresentationSurface;
|
|
40
|
+
presentedTools: string[];
|
|
41
|
+
blockedTools: Array<{ name: string; reason: string }>;
|
|
42
|
+
toolPresentationPlanId: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
35
45
|
export const RUN_UAT_FORBIDDEN_TOOL_NAMES = [
|
|
36
46
|
"edit",
|
|
37
47
|
"write",
|
|
@@ -114,16 +124,41 @@ export function buildRunUatCanonicalToolNames(options: { includeBrowserTools?: r
|
|
|
114
124
|
]);
|
|
115
125
|
}
|
|
116
126
|
|
|
127
|
+
// UAT modes whose run-uat instructions direct the runner to exercise the live
|
|
128
|
+
// app in a browser. These modes receive the browser tool surface so the runner
|
|
129
|
+
// can actually drive the page instead of silently deferring browser checks to a
|
|
130
|
+
// human. See run-uat.md automation rules: `browser-executable`, `live-runtime`,
|
|
131
|
+
// and `mixed` are all told to drive a browser/runtime path, and
|
|
132
|
+
// `human-experience` is told to capture screenshots. Without this, a webpage
|
|
133
|
+
// UAT classified as anything but `browser-executable` had no browser tools and
|
|
134
|
+
// downgraded its live checks to NEEDS-HUMAN (M001/S03 regression).
|
|
135
|
+
export function runUatBrowserToolsForType(uatType: string | undefined): readonly string[] {
|
|
136
|
+
return uatTypeIncludesBrowser(uatType) ? RUN_UAT_BROWSER_TOOL_NAMES : [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function runUatPresentationSurfaceForType(uatType: string | undefined): ToolPresentationSurface {
|
|
140
|
+
return uatTypeIncludesBrowser(uatType) ? "hybrid" : "mcp";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function buildRunUatPresentationForType(
|
|
144
|
+
uatType: string | undefined,
|
|
145
|
+
options: {
|
|
146
|
+
surface?: ToolPresentationSurface;
|
|
147
|
+
presentedTools?: readonly string[];
|
|
148
|
+
} = {},
|
|
149
|
+
): RunUatResultPresentation {
|
|
150
|
+
return buildRunUatResultPresentation({
|
|
151
|
+
...options,
|
|
152
|
+
surface: options.surface ?? runUatPresentationSurfaceForType(uatType),
|
|
153
|
+
includeBrowserTools: runUatBrowserToolsForType(uatType),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
117
157
|
export function buildRunUatResultPresentation(options: {
|
|
118
158
|
surface?: ToolPresentationSurface;
|
|
119
159
|
includeBrowserTools?: readonly string[];
|
|
120
160
|
presentedTools?: readonly string[];
|
|
121
|
-
} = {}): {
|
|
122
|
-
surface: ToolPresentationSurface;
|
|
123
|
-
presentedTools: string[];
|
|
124
|
-
blockedTools: Array<{ name: string; reason: string }>;
|
|
125
|
-
toolPresentationPlanId: string;
|
|
126
|
-
} {
|
|
161
|
+
} = {}): RunUatResultPresentation {
|
|
127
162
|
const presentedTools = options.presentedTools
|
|
128
163
|
? dedupe(options.presentedTools)
|
|
129
164
|
: buildRunUatCanonicalToolNames({ includeBrowserTools: options.includeBrowserTools });
|
|
@@ -35,6 +35,7 @@ import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../path
|
|
|
35
35
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
36
36
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
37
37
|
import { saveFile, clearParseCache } from "../files.js";
|
|
38
|
+
import { getDeclaredUatType, shouldEscalateArtifactUatToBrowser } from "../uat-policy.js";
|
|
38
39
|
import { invalidateStateCache } from "../state.js";
|
|
39
40
|
import { renderRoadmapFromDb } from "../markdown-renderer.js";
|
|
40
41
|
import { parseRoadmap } from "../parsers-legacy.js";
|
|
@@ -342,6 +343,34 @@ export async function handleCompleteSlice(
|
|
|
342
343
|
return { error: `slice verification indicates blocked/failed state — do not complete a slice that has not passed verification. Address the blockers and re-verify first.` };
|
|
343
344
|
}
|
|
344
345
|
|
|
346
|
+
// ── Browser/web UAT classification gate ────────────────────────────────
|
|
347
|
+
// A UAT that drives a running web UI (opening a page in a browser,
|
|
348
|
+
// navigating to a page/localhost) must declare a browser-capable mode so the
|
|
349
|
+
// run-uat runner surfaces browser tools and actually launches a browser.
|
|
350
|
+
// Otherwise the browser checks get silently deferred to a human and the slice
|
|
351
|
+
// passes on static checks alone (M001/S03 regression). `browser-executable`,
|
|
352
|
+
// `live-runtime`, and `mixed` all receive browser tools (see
|
|
353
|
+
// UAT_MODE_POLICIES); only the non-browser modes are rejected here.
|
|
354
|
+
//
|
|
355
|
+
// Reuse the canonical hasBrowserRequiredText detector (also used by dispatch
|
|
356
|
+
// and milestone validation): it skips Not-Proven/Out-of-Scope disclaimer
|
|
357
|
+
// sections and only treats verbs like navigate/open as web when they sit next
|
|
358
|
+
// to browser/page/localhost — avoiding false positives on CLI/file/API steps.
|
|
359
|
+
//
|
|
360
|
+
// Only `artifact-driven` is gated. It is the one mode that performs no
|
|
361
|
+
// execution at all (static/file checks), so a browser-requiring UAT under it
|
|
362
|
+
// genuinely defers verification to a human. Every other mode has a real
|
|
363
|
+
// verification path: `runtime-executable` runs browser test commands like
|
|
364
|
+
// `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
|
|
365
|
+
// browser-executable receive browser tools (UAT_MODE_POLICIES).
|
|
366
|
+
const uatContent = params.uatContent || "";
|
|
367
|
+
const declaredUatMode = getDeclaredUatType(uatContent);
|
|
368
|
+
if (shouldEscalateArtifactUatToBrowser(uatContent)) {
|
|
369
|
+
return {
|
|
370
|
+
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but declares "UAT mode: artifact-driven", which only runs static/file checks and would defer the browser work to a human. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
345
374
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
346
375
|
const completedAt = new Date().toISOString();
|
|
347
376
|
let guardError: string | null = null;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, rmSync } from "node:fs";
|
|
2
|
-
import { join, relative } from "node:path";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
3
|
import { clearParseCache } from "../files.js";
|
|
4
4
|
import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
|
|
5
5
|
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
6
|
+
import { getGateIdsForTurn } from "../gate-registry.js";
|
|
6
7
|
import {
|
|
7
8
|
transaction,
|
|
8
9
|
getMilestone,
|
|
@@ -17,14 +18,14 @@ import {
|
|
|
17
18
|
deleteTask,
|
|
18
19
|
deleteArtifactByPath,
|
|
19
20
|
} from "../gsd-db.js";
|
|
20
|
-
import type { GateId } from "../types.js";
|
|
21
|
+
import type { GateEvaluationConfig, GateId } from "../types.js";
|
|
21
22
|
import { invalidateStateCache } from "../state.js";
|
|
22
23
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
23
24
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
24
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
25
26
|
import { appendEvent } from "../workflow-events.js";
|
|
26
27
|
import { logWarning } from "../workflow-logger.js";
|
|
27
|
-
import { validatePlanningPathScope } from "../planning-path-scope.js";
|
|
28
|
+
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
28
29
|
import { checkFilePathConsistency, checkTaskOrdering } from "../pre-execution-checks.js";
|
|
29
30
|
import type { TaskRow } from "../db-task-slice-rows.js";
|
|
30
31
|
import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
|
|
@@ -163,9 +164,27 @@ function validateParams(params: PlanSliceParams): PlanSliceParams {
|
|
|
163
164
|
};
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
function
|
|
167
|
+
function loadPlanningContext(basePath: string): {
|
|
168
|
+
repositoryRegistry: RepositoryRegistry;
|
|
169
|
+
gateEvaluation?: GateEvaluationConfig;
|
|
170
|
+
} {
|
|
167
171
|
const loaded = loadEffectiveGSDPreferences(basePath);
|
|
168
|
-
return
|
|
172
|
+
return {
|
|
173
|
+
repositoryRegistry: createRepositoryRegistryFromPreferences(basePath, loaded?.preferences),
|
|
174
|
+
gateEvaluation: loaded?.preferences?.gate_evaluation,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function resolveGateEvaluateSliceGates(config: GateEvaluationConfig | undefined): GateId[] {
|
|
179
|
+
const ownedGateIds = [...getGateIdsForTurn("gate-evaluate")];
|
|
180
|
+
if (!config?.slice_gates?.length) return ownedGateIds;
|
|
181
|
+
const owned = new Set<string>(ownedGateIds);
|
|
182
|
+
return config.slice_gates.filter((gateId): gateId is GateId => owned.has(gateId));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function resolveTaskGates(config: GateEvaluationConfig | undefined): GateId[] {
|
|
186
|
+
if (config?.task_gates === false) return [];
|
|
187
|
+
return [...getGateIdsForTurn("execute-task")];
|
|
169
188
|
}
|
|
170
189
|
|
|
171
190
|
function validateReferencedRepositories(
|
|
@@ -238,11 +257,21 @@ function toTaskRows(params: PlanSliceParams, defaultTargets: string[]): TaskRow[
|
|
|
238
257
|
}));
|
|
239
258
|
}
|
|
240
259
|
|
|
241
|
-
function validateTaskPathsBeforePersist(
|
|
260
|
+
function validateTaskPathsBeforePersist(
|
|
261
|
+
params: PlanSliceParams,
|
|
262
|
+
basePath: string,
|
|
263
|
+
defaultTargets: string[],
|
|
264
|
+
allowedRoots: string[],
|
|
265
|
+
): string | null {
|
|
242
266
|
const taskRows = toTaskRows(params, defaultTargets);
|
|
267
|
+
const baseRoot = resolve(basePath);
|
|
268
|
+
const additionalRoots = allowedRoots
|
|
269
|
+
.map((root) => resolve(root))
|
|
270
|
+
.filter((root) => root !== baseRoot);
|
|
271
|
+
const context = additionalRoots.length > 0 ? { additionalRoots } : undefined;
|
|
243
272
|
const checks = [
|
|
244
|
-
...checkFilePathConsistency(taskRows, basePath),
|
|
245
|
-
...checkTaskOrdering(taskRows, basePath),
|
|
273
|
+
...checkFilePathConsistency(taskRows, basePath, context),
|
|
274
|
+
...checkTaskOrdering(taskRows, basePath, context),
|
|
246
275
|
];
|
|
247
276
|
const blocking = checks.filter((check) => !check.passed && check.blocking);
|
|
248
277
|
|
|
@@ -265,8 +294,11 @@ export async function handlePlanSlice(
|
|
|
265
294
|
}
|
|
266
295
|
|
|
267
296
|
let repositoryRegistry: RepositoryRegistry;
|
|
297
|
+
let gateEvaluation: GateEvaluationConfig | undefined;
|
|
268
298
|
try {
|
|
269
|
-
|
|
299
|
+
const context = loadPlanningContext(basePath);
|
|
300
|
+
repositoryRegistry = context.repositoryRegistry;
|
|
301
|
+
gateEvaluation = context.gateEvaluation;
|
|
270
302
|
} catch (err) {
|
|
271
303
|
const message = err instanceof Error ? err.message : String(err);
|
|
272
304
|
return { error: `validation failed: ${message}` };
|
|
@@ -279,6 +311,16 @@ export async function handlePlanSlice(
|
|
|
279
311
|
|
|
280
312
|
const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
|
|
281
313
|
|
|
314
|
+
const pathOnlyError = validatePathOnlyPlanningFields(
|
|
315
|
+
params.tasks.map((task, index) => ({
|
|
316
|
+
field: `tasks[${index}].expectedOutput`,
|
|
317
|
+
values: task.expectedOutput,
|
|
318
|
+
})),
|
|
319
|
+
);
|
|
320
|
+
if (pathOnlyError) {
|
|
321
|
+
return { error: `validation failed: ${pathOnlyError}` };
|
|
322
|
+
}
|
|
323
|
+
|
|
282
324
|
const pathScopeError = validatePlanningPathScope(
|
|
283
325
|
basePath,
|
|
284
326
|
params.tasks.flatMap((task, index) => [
|
|
@@ -292,7 +334,7 @@ export async function handlePlanSlice(
|
|
|
292
334
|
return { error: `validation failed: ${pathScopeError}` };
|
|
293
335
|
}
|
|
294
336
|
|
|
295
|
-
const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets);
|
|
337
|
+
const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets, allowedAbsoluteRoots);
|
|
296
338
|
if (pathError) {
|
|
297
339
|
return { error: `pre-execution validation failed:\n${pathError}` };
|
|
298
340
|
}
|
|
@@ -384,11 +426,11 @@ export async function handlePlanSlice(
|
|
|
384
426
|
|
|
385
427
|
// Seed quality gate rows inside the transaction — all-or-nothing with
|
|
386
428
|
// the plan data so a crash can't leave orphaned gates without tasks.
|
|
387
|
-
const sliceGates
|
|
429
|
+
const sliceGates = resolveGateEvaluateSliceGates(gateEvaluation);
|
|
388
430
|
for (const gid of sliceGates) {
|
|
389
431
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
|
|
390
432
|
}
|
|
391
|
-
const taskGates
|
|
433
|
+
const taskGates = resolveTaskGates(gateEvaluation);
|
|
392
434
|
for (const task of params.tasks) {
|
|
393
435
|
for (const gid of taskGates) {
|
|
394
436
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
|
|
@@ -8,7 +8,7 @@ import { renderAllProjections } from "../workflow-projections.js";
|
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
11
|
-
import { validatePlanningPathScope } from "../planning-path-scope.js";
|
|
11
|
+
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
12
12
|
|
|
13
13
|
export interface PlanTaskParams {
|
|
14
14
|
milestoneId: string;
|
|
@@ -67,6 +67,13 @@ export async function handlePlanTask(
|
|
|
67
67
|
return { error: `validation failed: ${(err as Error).message}` };
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
const pathOnlyError = validatePathOnlyPlanningFields([
|
|
71
|
+
{ field: "expectedOutput", values: params.expectedOutput },
|
|
72
|
+
]);
|
|
73
|
+
if (pathOnlyError) {
|
|
74
|
+
return { error: `validation failed: ${pathOnlyError}` };
|
|
75
|
+
}
|
|
76
|
+
|
|
70
77
|
const pathScopeError = validatePlanningPathScope(basePath, [
|
|
71
78
|
{ field: "files", values: params.files },
|
|
72
79
|
{ field: "inputs", values: params.inputs },
|