@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- 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/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +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 +5 -5
- package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-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/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- 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/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- 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 +3 -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.js +1 -1
- 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 +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- 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 +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -98,37 +98,41 @@ export function normalizePreferencesShape(loaded) {
|
|
|
98
98
|
}
|
|
99
99
|
// ─── Loading ────────────────────────────────────────────────────────────────
|
|
100
100
|
export function loadGlobalGSDPreferences() {
|
|
101
|
-
return
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
return loadFirstUsablePreferencesFile([
|
|
102
|
+
globalPreferencesPath(),
|
|
103
|
+
legacyGlobalPreferencesPathLowercase(),
|
|
104
|
+
legacyGlobalPreferencesPath(),
|
|
105
|
+
], "global");
|
|
104
106
|
}
|
|
105
107
|
export function loadProjectGSDPreferences(basePath) {
|
|
106
|
-
return
|
|
107
|
-
|
|
108
|
+
return loadFirstUsablePreferencesFile([
|
|
109
|
+
projectPreferencesPath(basePath),
|
|
110
|
+
legacyProjectPreferencesPathLowercase(basePath),
|
|
111
|
+
], "project");
|
|
108
112
|
}
|
|
109
113
|
export function loadEffectiveGSDPreferences(basePath, opts) {
|
|
110
114
|
const globalPreferences = loadGlobalGSDPreferences();
|
|
111
115
|
const projectPreferences = loadProjectGSDPreferences(basePath);
|
|
112
|
-
const
|
|
113
|
-
|
|
116
|
+
const effectiveGlobalPreferences = globalPreferences?.ignored ? null : globalPreferences;
|
|
117
|
+
const effectiveProjectPreferences = projectPreferences?.ignored ? null : projectPreferences;
|
|
118
|
+
const projectHasPlanningDepth = effectiveProjectPreferences?.preferences.planning_depth !== undefined;
|
|
119
|
+
if (!effectiveGlobalPreferences && !effectiveProjectPreferences)
|
|
114
120
|
return null;
|
|
115
121
|
let result;
|
|
116
|
-
if (!
|
|
117
|
-
result =
|
|
122
|
+
if (!effectiveGlobalPreferences) {
|
|
123
|
+
result = effectiveProjectPreferences;
|
|
118
124
|
}
|
|
119
|
-
else if (!
|
|
120
|
-
result =
|
|
125
|
+
else if (!effectiveProjectPreferences) {
|
|
126
|
+
result = mergePreferenceMetadata(effectiveGlobalPreferences, projectPreferences);
|
|
121
127
|
}
|
|
122
128
|
else {
|
|
123
|
-
const
|
|
124
|
-
...(globalPreferences.warnings ?? []),
|
|
125
|
-
...(projectPreferences.warnings ?? []),
|
|
126
|
-
];
|
|
129
|
+
const metadata = mergePreferenceMetadata(effectiveGlobalPreferences, effectiveProjectPreferences);
|
|
127
130
|
result = {
|
|
128
|
-
path:
|
|
131
|
+
path: effectiveProjectPreferences.path,
|
|
129
132
|
scope: "project",
|
|
130
|
-
preferences: mergePreferences(
|
|
131
|
-
...(
|
|
133
|
+
preferences: mergePreferences(effectiveGlobalPreferences.preferences, effectiveProjectPreferences.preferences),
|
|
134
|
+
...(metadata.warnings ? { warnings: metadata.warnings } : {}),
|
|
135
|
+
...(metadata.diagnostics ? { diagnostics: metadata.diagnostics } : {}),
|
|
132
136
|
};
|
|
133
137
|
}
|
|
134
138
|
// Apply token-profile defaults as the lowest-priority layer so that
|
|
@@ -152,6 +156,35 @@ export function loadEffectiveGSDPreferences(basePath, opts) {
|
|
|
152
156
|
result = stripInheritedPlanningDepth(result, projectHasPlanningDepth);
|
|
153
157
|
return result;
|
|
154
158
|
}
|
|
159
|
+
function mergePreferenceMetadata(primary, secondary) {
|
|
160
|
+
const mergedWarnings = [
|
|
161
|
+
...(primary.warnings ?? []),
|
|
162
|
+
...(secondary?.warnings ?? []),
|
|
163
|
+
];
|
|
164
|
+
const mergedDiagnostics = [
|
|
165
|
+
...(primary.diagnostics ?? []),
|
|
166
|
+
...(secondary?.diagnostics ?? []),
|
|
167
|
+
];
|
|
168
|
+
return {
|
|
169
|
+
...primary,
|
|
170
|
+
...(mergedWarnings.length > 0 ? { warnings: mergedWarnings } : {}),
|
|
171
|
+
...(mergedDiagnostics.length > 0 ? { diagnostics: mergedDiagnostics } : {}),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function loadFirstUsablePreferencesFile(paths, scope) {
|
|
175
|
+
let ignoredPreferences = null;
|
|
176
|
+
for (const path of paths) {
|
|
177
|
+
const loaded = loadPreferencesFile(path, scope);
|
|
178
|
+
if (!loaded)
|
|
179
|
+
continue;
|
|
180
|
+
if (!loaded.ignored)
|
|
181
|
+
return mergePreferenceMetadata(loaded, ignoredPreferences);
|
|
182
|
+
ignoredPreferences = ignoredPreferences
|
|
183
|
+
? mergePreferenceMetadata(ignoredPreferences, loaded)
|
|
184
|
+
: loaded;
|
|
185
|
+
}
|
|
186
|
+
return ignoredPreferences;
|
|
187
|
+
}
|
|
155
188
|
function stripInheritedPlanningDepth(loaded, projectHasPlanningDepth) {
|
|
156
189
|
if (projectHasPlanningDepth || loaded.preferences.planning_depth === undefined) {
|
|
157
190
|
return loaded;
|
|
@@ -167,16 +200,39 @@ function loadPreferencesFile(path, scope) {
|
|
|
167
200
|
if (!existsSync(path))
|
|
168
201
|
return null;
|
|
169
202
|
const raw = readFileSync(path, "utf-8");
|
|
170
|
-
const
|
|
171
|
-
if (!preferences)
|
|
203
|
+
const parsed = parsePreferencesMarkdownWithDiagnostics(raw);
|
|
204
|
+
if (!parsed.preferences && parsed.diagnostics.length === 0)
|
|
172
205
|
return null;
|
|
206
|
+
const ignored = parsed.diagnostics.some((diagnostic) => diagnostic.ignored === true);
|
|
207
|
+
const preferences = parsed.preferences ?? {};
|
|
173
208
|
const validation = validatePreferences(preferences);
|
|
174
209
|
const allWarnings = [...validation.warnings, ...validation.errors];
|
|
210
|
+
const diagnostics = [
|
|
211
|
+
...parsed.diagnostics.map((diagnostic) => ({ ...diagnostic, path, scope })),
|
|
212
|
+
...validation.errors.map((message) => ({
|
|
213
|
+
path,
|
|
214
|
+
scope,
|
|
215
|
+
severity: "error",
|
|
216
|
+
kind: "validation",
|
|
217
|
+
message,
|
|
218
|
+
sanitized: true,
|
|
219
|
+
})),
|
|
220
|
+
...validation.warnings.map((message) => ({
|
|
221
|
+
path,
|
|
222
|
+
scope,
|
|
223
|
+
severity: "warning",
|
|
224
|
+
kind: "validation",
|
|
225
|
+
message,
|
|
226
|
+
sanitized: true,
|
|
227
|
+
})),
|
|
228
|
+
];
|
|
175
229
|
return {
|
|
176
230
|
path,
|
|
177
231
|
scope,
|
|
178
232
|
preferences: validation.preferences,
|
|
233
|
+
...(ignored ? { ignored: true } : {}),
|
|
179
234
|
...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),
|
|
235
|
+
...(diagnostics.length > 0 ? { diagnostics } : {}),
|
|
180
236
|
};
|
|
181
237
|
}
|
|
182
238
|
let _warnedUnrecognizedFormat = false;
|
|
@@ -189,20 +245,35 @@ export function _resetParseWarningFlag() {
|
|
|
189
245
|
}
|
|
190
246
|
/** @internal Exported for testing only */
|
|
191
247
|
export function parsePreferencesMarkdown(content) {
|
|
248
|
+
return parsePreferencesMarkdownWithDiagnostics(content).preferences;
|
|
249
|
+
}
|
|
250
|
+
function parsePreferencesMarkdownWithDiagnostics(content) {
|
|
192
251
|
// Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
|
|
193
252
|
const startMarker = content.startsWith('---\r\n') ? '---\r\n' : '---\n';
|
|
194
253
|
if (content.startsWith(startMarker)) {
|
|
195
254
|
const searchStart = startMarker.length;
|
|
196
255
|
const endIdx = content.indexOf('\n---', searchStart);
|
|
197
|
-
if (endIdx === -1)
|
|
198
|
-
return
|
|
256
|
+
if (endIdx === -1) {
|
|
257
|
+
return {
|
|
258
|
+
preferences: null,
|
|
259
|
+
diagnostics: [{
|
|
260
|
+
severity: "error",
|
|
261
|
+
kind: "parse",
|
|
262
|
+
message: "preferences frontmatter is missing a closing --- delimiter",
|
|
263
|
+
ignored: true,
|
|
264
|
+
}],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
199
267
|
const block = content.slice(searchStart, endIdx);
|
|
200
|
-
return
|
|
268
|
+
return parseFrontmatterBlockWithDiagnostics(block.replace(/\r/g, ''), 1);
|
|
201
269
|
}
|
|
202
270
|
// Fallback: heading+list format (e.g. "## Git\n- isolation: none") (#2036)
|
|
203
271
|
// GSD agents may write preferences files without frontmatter delimiters.
|
|
204
272
|
if (/^##\s+\w/m.test(content)) {
|
|
205
|
-
return
|
|
273
|
+
return {
|
|
274
|
+
preferences: parseHeadingListFormat(content),
|
|
275
|
+
diagnostics: [],
|
|
276
|
+
};
|
|
206
277
|
}
|
|
207
278
|
// Warn when a non-empty file exists but lacks frontmatter delimiters (#2036).
|
|
208
279
|
if (content.trim().length > 0 && !_warnedUnrecognizedFormat) {
|
|
@@ -210,16 +281,37 @@ export function parsePreferencesMarkdown(content) {
|
|
|
210
281
|
console.warn("[GSD] Warning: preferences file has unrecognized format — content does not use YAML frontmatter delimiters (---). " +
|
|
211
282
|
"Wrap your preferences in --- fences. See https://github.com/open-gsd/gsd-pi/issues/2036");
|
|
212
283
|
}
|
|
213
|
-
return
|
|
284
|
+
return {
|
|
285
|
+
preferences: null,
|
|
286
|
+
diagnostics: content.trim().length > 0
|
|
287
|
+
? [{
|
|
288
|
+
severity: "error",
|
|
289
|
+
kind: "parse",
|
|
290
|
+
message: "preferences file has unrecognized format; expected YAML frontmatter delimiters (---) or markdown preference sections",
|
|
291
|
+
ignored: true,
|
|
292
|
+
}]
|
|
293
|
+
: [],
|
|
294
|
+
};
|
|
214
295
|
}
|
|
215
296
|
let _warnedFrontmatterParse = false;
|
|
216
|
-
function
|
|
297
|
+
function parseFrontmatterBlockWithDiagnostics(frontmatter, lineOffset) {
|
|
217
298
|
try {
|
|
218
299
|
const parsed = parseYaml(frontmatter);
|
|
219
300
|
if (typeof parsed !== 'object' || parsed === null) {
|
|
220
|
-
return {
|
|
301
|
+
return {
|
|
302
|
+
preferences: {},
|
|
303
|
+
diagnostics: [{
|
|
304
|
+
severity: "error",
|
|
305
|
+
kind: "validation",
|
|
306
|
+
message: "preferences frontmatter must be a YAML object",
|
|
307
|
+
ignored: true,
|
|
308
|
+
}],
|
|
309
|
+
};
|
|
221
310
|
}
|
|
222
|
-
return
|
|
311
|
+
return {
|
|
312
|
+
preferences: normalizeParsedPreferences(parsed),
|
|
313
|
+
diagnostics: [],
|
|
314
|
+
};
|
|
223
315
|
}
|
|
224
316
|
catch (e) {
|
|
225
317
|
// Warn at most once per session to avoid flooding TUI (#3376)
|
|
@@ -227,9 +319,35 @@ function parseFrontmatterBlock(frontmatter) {
|
|
|
227
319
|
_warnedFrontmatterParse = true;
|
|
228
320
|
logWarning("guided", `YAML parse error in preferences frontmatter (suppressing further): ${e.message}`);
|
|
229
321
|
}
|
|
230
|
-
|
|
322
|
+
const location = extractYamlErrorLocation(e, lineOffset);
|
|
323
|
+
return {
|
|
324
|
+
preferences: {},
|
|
325
|
+
diagnostics: [{
|
|
326
|
+
severity: "error",
|
|
327
|
+
kind: "parse",
|
|
328
|
+
message: cleanYamlErrorMessage(e),
|
|
329
|
+
...(location.line !== undefined ? { line: location.line } : {}),
|
|
330
|
+
...(location.column !== undefined ? { column: location.column } : {}),
|
|
331
|
+
ignored: true,
|
|
332
|
+
}],
|
|
333
|
+
};
|
|
231
334
|
}
|
|
232
335
|
}
|
|
336
|
+
function cleanYamlErrorMessage(error) {
|
|
337
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
338
|
+
const firstLine = message.split("\n")[0]?.trim() ?? "unknown YAML parse error";
|
|
339
|
+
return firstLine.replace(/\s+at line \d+, column \d+:?$/, "");
|
|
340
|
+
}
|
|
341
|
+
function extractYamlErrorLocation(error, lineOffset) {
|
|
342
|
+
const linePos = error?.linePos;
|
|
343
|
+
const first = Array.isArray(linePos) ? linePos[0] : undefined;
|
|
344
|
+
const line = typeof first?.line === "number" ? first.line + lineOffset : undefined;
|
|
345
|
+
const column = typeof first?.col === "number" ? first.col : undefined;
|
|
346
|
+
return {
|
|
347
|
+
...(line !== undefined ? { line } : {}),
|
|
348
|
+
...(column !== undefined ? { column } : {}),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
233
351
|
function normalizeParsedPreferences(preferences) {
|
|
234
352
|
const remoteQuestions = preferences.remote_questions;
|
|
235
353
|
if (remoteQuestions && typeof remoteQuestions === "object" && typeof remoteQuestions.channel_id === "number") {
|
|
@@ -37,6 +37,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
37
37
|
9. If requirement status changed, call `gsd_requirement_update`; do not write `.gsd/REQUIREMENTS.md` directly.
|
|
38
38
|
10. Prepare `gsd_slice_complete` content with camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`.
|
|
39
39
|
11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type.
|
|
40
|
+
**Web apps:** when inlined Web App UAT guidance is present, declare `browser-executable` or `runtime-executable` (not `artifact-driven`) for localhost/browser/screenshot steps; include dev-server preconditions and name Playwright specs when they exist.
|
|
40
41
|
12. Review the inlined task-summary excerpts for DECISIONS.md/KNOWLEDGE.md-worthy decisions and gotchas. Read full `*-SUMMARY.md` only if needed. Capture with `capture_thought`; do not append knowledge files.
|
|
41
42
|
13. When verification passes, call `gsd_slice_complete`. The DB-backed tool is the canonical write path. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}`. Do not edit roadmap checkboxes.
|
|
42
43
|
14. Do not run git commands.
|
|
@@ -31,18 +31,17 @@ After reflection is confirmed, choose the approach from actual scope, not a labe
|
|
|
31
31
|
|
|
32
32
|
{{preparationContext}}
|
|
33
33
|
|
|
34
|
-
##
|
|
34
|
+
## Ground the First Question Round
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
1.
|
|
38
|
-
2.
|
|
39
|
-
3. Use web tools only for current external facts.
|
|
36
|
+
Ground your questions in the **Preparation Context above** (codebase snapshot, prior context) plus the user's reflected vision — that is authoritative. **Do not survey the codebase** with `ls`/`find`/`rg`/`scout` before asking; the snapshot already covers code reality. Read a specific file only when a question's answer genuinely hinges on it.
|
|
37
|
+
1. Check mentioned tech with `resolve_library` / `get_library_docs`.
|
|
38
|
+
2. Use web tools only for current external facts.
|
|
40
39
|
|
|
41
|
-
Budget searches across the discussion; prefer docs and one-shot `search_and_read`.
|
|
40
|
+
Budget searches across the discussion; prefer docs and one-shot `search_and_read`. Read on-demand only when an answer exposes a specific gap.
|
|
42
41
|
|
|
43
42
|
## Layered Question Rounds
|
|
44
43
|
|
|
45
|
-
Questions have four layers. At each layer, ask 1-3 open questions per round,
|
|
44
|
+
Questions have four layers. At each layer, ask 1-3 open questions per round, read a specific file on-demand if an answer needs it, and gate before advancing.
|
|
46
45
|
|
|
47
46
|
**Default to open questions.** Use `ask_user_questions` only for 2-3 distinct paths with clear tradeoffs. Use plain text for nuanced design questions.
|
|
48
47
|
|
|
@@ -32,6 +32,8 @@ You execute. The inlined task plan is authoritative. Verify referenced files and
|
|
|
32
32
|
- Prior task summaries:
|
|
33
33
|
{{priorTaskLines}}
|
|
34
34
|
|
|
35
|
+
{{onDemandContext}}
|
|
36
|
+
|
|
35
37
|
## Execution Rules
|
|
36
38
|
|
|
37
39
|
1. Tersely narrate transitions, decisions, and verification outcomes between tool-call clusters.
|
|
@@ -19,15 +19,13 @@ Discuss milestone {{milestoneId}} ("{{milestoneTitle}}"). Identify real gray are
|
|
|
19
19
|
Before asking, read `.gsd/PROJECT.md` and find `## Project Shape` -> `**Complexity:**`. Use `simple` or `complex`; default to `complex` if missing, stale, or unclear.
|
|
20
20
|
|
|
21
21
|
- `simple`: 1-2 plain-text rounds; skip parallel-research investigation; use `ask_user_questions` only for concrete alternatives.
|
|
22
|
-
- `complex`:
|
|
22
|
+
- `complex`: ground in the preloaded context first, use 3-4-option structured questions, and expect multiple rounds.
|
|
23
23
|
|
|
24
24
|
### Before your first question round
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
- Scout existing code with `rg`, `find`, or `scout`.
|
|
28
|
-
- Check roadmap context above for surrounding scope.
|
|
29
|
-
- Use `resolve_library` / `get_library_docs` for unfamiliar libraries; prefer them over web search.
|
|
26
|
+
Ground your questions in the **preloaded context above** (milestone roadmap/context/research, the decisions register, prior-milestone summaries) plus any Preparation Context snapshot — those are authoritative. **Do not survey the codebase** with `rg`/`find`/`scout` before asking; the preloaded files are marked do-not-re-read. Read a specific file only when a question's answer genuinely hinges on it.
|
|
30
27
|
- Identify the 3-5 behavioral or architectural unknowns that materially change what gets built.
|
|
28
|
+
- Use `resolve_library` / `get_library_docs` for unfamiliar libraries; prefer them over web search.
|
|
31
29
|
|
|
32
30
|
**Web search budget:** Limited per turn, typically 3-5. Prefer docs tools and `search_and_read`; use 2-3 searches in the first pass and save the rest.
|
|
33
31
|
|
|
@@ -43,13 +41,13 @@ Ask **1–3 questions per round**. Target one focus at a time:
|
|
|
43
41
|
|
|
44
42
|
**Never fabricate or simulate user input.** Never generate fake transcript markers like `[User]`, `[Human]`, or `User:`. Ask one question round, then wait for the user's actual response before continuing.
|
|
45
43
|
|
|
46
|
-
**Single user-facing message (NON-BYPASSABLE):** After
|
|
44
|
+
**Single user-facing message (NON-BYPASSABLE):** After grounding in the preloaded context, send **one** assistant message that contains your questions (and at most a short recap — 2-3 sentences, not a feature catalog). **End the turn there.** Do not send a second message that restates the same ask ("what do you want M00X to be?", "before I can write the context file…", etc.). If you already asked, stop — do not elaborate in a follow-up message in the same turn.
|
|
47
45
|
|
|
48
46
|
**If `{{structuredQuestionsAvailable}}` is `true`:** use `ask_user_questions` exactly once per turn with 1-3 question objects. Keep labels short (3-5 words). In `complex` mode, multi-choice questions MUST offer **3 or 4 concrete, researched options** plus **"Other — let me discuss"**; options must be grounded in the investigation, not placeholders. In `simple` mode, 2 options is fine for binary alternatives. Binary depth-check/wrap-up gates are exempt. If the user chooses "Other — let me discuss" or gives a long freeform answer, switch to plain-text follow-up before resuming structured questions.
|
|
49
47
|
|
|
50
48
|
**If `{{structuredQuestionsAvailable}}` is `false`:** ask questions in plain text. Keep each round to 1–3 focused questions. Wait for answers before asking the next round.
|
|
51
49
|
|
|
52
|
-
After each answer,
|
|
50
|
+
After each answer, resolve only the new unknowns from context (re-read a specific file only if one is needed), then ask the next round.
|
|
53
51
|
|
|
54
52
|
### Round cadence
|
|
55
53
|
|
|
@@ -36,11 +36,11 @@ After the opening answer, classify project shape as **`simple`** or **`complex`*
|
|
|
36
36
|
|
|
37
37
|
Persist the verdict through `gsd_summary_save` with `artifact_type: "PROJECT"` into `## Project Shape`; downstream `discuss-requirements`, `discuss-milestone`, and `discuss-slice` read the rendered projection.
|
|
38
38
|
|
|
39
|
+
When the project is browser-facing (web app, SPA, static site with UI, Next/React/Vue, etc.), also record **`Web stack:`** under `## Project Shape` (framework + whether Playwright or browser UAT is expected). Downstream planning uses this to choose `browser-executable` / `runtime-executable` UAT instead of deferring UI proof to humans.
|
|
40
|
+
|
|
39
41
|
### Before deeper rounds
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
- Scout code with `rg`, `find`, or `scout` for greenfield/brownfield and framework signals.
|
|
43
|
-
- Check prior `.planning/` or `.gsd/` artifacts.
|
|
43
|
+
Ground your questions in the **Preparation Context snapshot above** (stack, structure, greenfield/brownfield and framework signals) plus any prior `.planning/` or `.gsd/` artifacts — those are authoritative. **Do not survey the codebase** with `rg`/`find`/`scout` before asking; read a specific file only when a question's answer genuinely hinges on it.
|
|
44
44
|
- Use `resolve_library` / `get_library_docs` for unfamiliar mentioned libraries.
|
|
45
45
|
|
|
46
46
|
**Web search budget:** typically 3-5 per turn. Prefer docs tools; use 2-3 searches first and save the rest.
|
|
@@ -53,13 +53,13 @@ Ask **1–3 questions per round**, one focus at a time: what, who, core value, a
|
|
|
53
53
|
|
|
54
54
|
**Shape-dependent cadence:**
|
|
55
55
|
- **`simple`**: 1-2 plain-text rounds; use `ask_user_questions` only for concrete alternatives; reach the depth checklist quickly.
|
|
56
|
-
- **`complex`**:
|
|
56
|
+
- **`complex`**: ground in the snapshot and prior artifacts, multiple rounds, structured questions when meaningful alternatives exist.
|
|
57
57
|
|
|
58
58
|
**If `{{structuredQuestionsAvailable}}` is `true` and you use `ask_user_questions`:** ask 1-3 questions per call. Every question needs stable lowercase `id`. Keep labels short (3-5 words). In **`complex`** mode, multi-choice questions MUST offer **3 or 4 concrete, researched options** plus **"Other — let me discuss"**; options must be grounded in the investigation, not placeholders. In **`simple`** mode, 2 options is fine. Binary depth-check/wrap-up gates are exempt. Wait for each tool result before the next round.
|
|
59
59
|
|
|
60
60
|
**If `{{structuredQuestionsAvailable}}` is `false`:** ask questions in plain text. Keep each round to 1–3 focused questions.
|
|
61
61
|
|
|
62
|
-
After each round,
|
|
62
|
+
After each round, resolve only new unknowns from context (read a specific file only if one is needed), then ask the next round.
|
|
63
63
|
|
|
64
64
|
### Round cadence
|
|
65
65
|
|
|
@@ -105,7 +105,7 @@ Once the user confirms depth:
|
|
|
105
105
|
|
|
106
106
|
1. Use the **Project** output template (inlined above).
|
|
107
107
|
2. Call `gsd_summary_save` with `artifact_type: "PROJECT"` and full project markdown as `content`; omit `milestone_id`. The tool persists the DB-backed PROJECT artifact and renders `.gsd/PROJECT.md`. Preserve the user's terms and framing.
|
|
108
|
-
3. The `## Project Shape` section MUST contain `**Complexity:** simple` or `**Complexity:** complex` (matching the verdict you announced) plus a one-line `**Why:**` rationale. Downstream stages read
|
|
108
|
+
3. The `## Project Shape` section MUST contain `**Complexity:** simple` or `**Complexity:** complex` (matching the verdict you announced) plus a one-line `**Why:**` rationale. For browser-facing projects, also include `**Web stack:**` (framework and expected browser/Playwright UAT approach). Downstream stages read these lines.
|
|
109
109
|
4. The `## Capability Contract` section MUST reference `.gsd/REQUIREMENTS.md` — that file does not yet exist; the next stage (`discuss-requirements`) will produce it.
|
|
110
110
|
5. The `## Milestone Sequence` MUST list at least M001 with title and one-liner. Subsequent milestones may be listed as known intents; they will be elaborated in their own discuss-milestone stages.
|
|
111
111
|
6. Do NOT use `artifact_type: "CONTEXT"` and do NOT pass `milestone_id: "PROJECT"`; that creates a fake milestone named PROJECT.
|
|
@@ -34,8 +34,7 @@ Before your first action, print this banner verbatim in chat:
|
|
|
34
34
|
|
|
35
35
|
### Before your first question round
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
- Scout existing capabilities; already-built work is `Validated` or `Active`.
|
|
37
|
+
Ground your requirements in **PROJECT.md, any existing REQUIREMENTS.md, and the Preparation Context snapshot** — those are authoritative for what already exists (already-built work is `Validated` or `Active`). **Do not survey the codebase**; read a specific file only when a requirement's scope genuinely hinges on it.
|
|
39
38
|
- Cross-check milestone sequence; every milestone needs at least one owned Active requirement.
|
|
40
39
|
- Use `resolve_library` / `get_library_docs` for libraries that imply capabilities.
|
|
41
40
|
- Identify domain table-stakes only when PROJECT.md confidence is low.
|
|
@@ -13,12 +13,11 @@ Do **not** center the discussion on tech stack trivia, naming, or speculative ar
|
|
|
13
13
|
Before the first question round, read `.gsd/PROJECT.md` and look for `## Project Shape` → `**Complexity:**`. Verdicts are **`simple`** or **`complex`**; default to `complex` if missing or unclear.
|
|
14
14
|
|
|
15
15
|
- **`simple`** — use 1–2 plain-text rounds, then write context. Skip parallel-research investigation.
|
|
16
|
-
- **`complex`** —
|
|
16
|
+
- **`complex`** — ground in the preloaded context first, then ask structured 3–4-option questions.
|
|
17
17
|
|
|
18
|
-
###
|
|
18
|
+
### Grounding
|
|
19
19
|
|
|
20
|
-
Do
|
|
21
|
-
- Scout touched code with `rg`, `find`, or `scout` for broad unfamiliar areas.
|
|
20
|
+
Ground your questions in the **preloaded slice context above** plus any Preparation Context snapshot — those are authoritative. **Do not survey the codebase** with `rg`/`find`/`scout` before asking; read a specific file only when a question's answer genuinely hinges on it.
|
|
22
21
|
- Check roadmap context for predecessor and dependent work.
|
|
23
22
|
- For unfamiliar libraries, prefer `resolve_library` / `get_library_docs` over `search-the-web`.
|
|
24
23
|
- Identify the 3–5 biggest behavioural unknowns where the user's answer materially changes the build.
|
|
@@ -31,7 +30,7 @@ Do **not** go deep; stop when you can ask grounded questions.
|
|
|
31
30
|
|
|
32
31
|
**Never fabricate or simulate user input.** Never generate fake transcript markers like `[User]`, `[Human]`, or `User:`. Ask one question round, then wait for the user's actual response before continuing.
|
|
33
32
|
|
|
34
|
-
**If `{{structuredQuestionsAvailable}}` is `true`:** Ask **1–3 questions per round** using `ask_user_questions`. In **`complex`** mode, each multi-choice question MUST present **3 or 4 concrete, researched options** plus final **"Other — let me discuss"** option; options must be grounded in the
|
|
33
|
+
**If `{{structuredQuestionsAvailable}}` is `true`:** Ask **1–3 questions per round** using `ask_user_questions`. In **`complex`** mode, each multi-choice question MUST present **3 or 4 concrete, researched options** plus final **"Other — let me discuss"** option; options must be grounded in the preloaded context above (slice context, codebase snapshot, library docs, prior `.gsd/` artifacts), not placeholders. In **`simple`** mode, 2 options is fine. Binary wrap-up gates are exempt. **Call `ask_user_questions` exactly once per turn — never make multiple calls with the same or overlapping questions. Wait for the user's response before asking the next round.**
|
|
35
34
|
**If `{{structuredQuestionsAvailable}}` is `false`:** Ask **1–3 numbered plain-text questions per round**, then wait.
|
|
36
35
|
Focus questions on:
|
|
37
36
|
- **UX and user-facing behaviour** — what users see, click, trigger, or experience.
|
|
@@ -39,7 +38,7 @@ Focus questions on:
|
|
|
39
38
|
- **Scope boundaries** — what is in, out, or deferred.
|
|
40
39
|
- **Feel and experience** — tone, responsiveness, feedback, transitions, and what "done" feels like.
|
|
41
40
|
|
|
42
|
-
After answers,
|
|
41
|
+
After answers, resolve new unknowns from context (read a specific file only if needed), then ask the next round.
|
|
43
42
|
|
|
44
43
|
### Round cadence
|
|
45
44
|
|
|
@@ -47,6 +47,8 @@ If milestone research is inlined, trust it and skip redundant exploration. If fi
|
|
|
47
47
|
|
|
48
48
|
Narrate decomposition reasoning in complete sentences: grouping, risk order, verification strategy.
|
|
49
49
|
|
|
50
|
+
**Web apps:** when inlined Web App UAT guidance is present, set milestone `Verification Classes` → UAT to browser-observable acceptance (Playwright spec or `browser_*` checks). Order an early slice to add Playwright smoke scaffolding when the dependency is missing.
|
|
51
|
+
|
|
50
52
|
Then:
|
|
51
53
|
1. Use the **Roadmap** output template from the inlined context above
|
|
52
54
|
2. {{skillActivation}}
|
|
@@ -38,9 +38,10 @@ If slice research is inlined, trust its architectural findings, but verify every
|
|
|
38
38
|
|
|
39
39
|
1. If requirements are preloaded, identify owned and supporting Active requirements.
|
|
40
40
|
2. Call `memory_query` with keywords from the slice title and source files.
|
|
41
|
-
3.
|
|
41
|
+
3. Use the inlined Output Template sections already present in this prompt. Do not read template files from disk.
|
|
42
42
|
4. {{skillActivation}} Record expected executor skills in each task plan's `skills_used` frontmatter.
|
|
43
43
|
5. Define slice verification before tasks. Non-trivial slices need real tests or executable assertions; boundary contracts need contract-exercising checks. Tests must not read .gitignore/gitignored paths such as `.gsd/`, `.planning/`, or `.audits/`.
|
|
44
|
+
**Web apps:** when inlined Web App UAT guidance is present, follow it — add Playwright smoke scaffolding on the first UI slice if missing, name localhost preconditions, and plan verification commands that match browser-capable UAT modes at slice closeout.
|
|
44
45
|
6. Include Threat Surface (Q3), Requirement Impact (Q4), proof level, observability, integration closure, Failure Modes (Q5), Load Profile (Q6), and Negative Tests (Q7) only where applicable.
|
|
45
46
|
7. Right-size tasks. Simple slices can be one task; split only when context, ownership, or verification boundaries justify it.
|
|
46
47
|
8. Task `verify` commands must be safe, simple commands. Do not use shell pipes, redirects, semicolons, backticks, command substitution, output trimming, or grep regex alternation with `|`. If multiple checks are needed, create a small test file and run it with `node --test` or a package test script, or use separate simple commands joined only with `&&`. For absence checks, verify a pattern does not exist with `! grep -q 'pattern' file` or `! rg -q 'pattern' file`; do not use `grep -c` or `rg -c` to assert zero matches because count commands exit 1 when they find zero matches, and the verification gate treats that as failure.
|
|
@@ -63,6 +63,7 @@ Then:
|
|
|
63
63
|
- `{{taskPlanTemplatePath}}`
|
|
64
64
|
2. {{skillActivation}} Record the installed skills you expect executors to use in each task plan's `skills_used` frontmatter.
|
|
65
65
|
3. Define slice-level verification: the objective stopping condition. Plan real test files with real assertions; for simple slices, executable commands are fine.
|
|
66
|
+
**Web apps:** when inlined Web App UAT guidance is present, follow it for Playwright scaffolding and browser-capable verification commands.
|
|
66
67
|
4. For non-trivial slices, plan observability / proof level / integration closure, threat surface, and requirement impact. Omit entirely for simple slices.
|
|
67
68
|
5. Decompose the slice into tasks that fit one context window each. Every task passed to `gsd_plan_slice` must use the exact keys `taskId`, `title`, `description`, `estimate`, `files`, `verify`, `inputs`, `expectedOutput`, and optional `observabilityImpact`. Put Why / Do / Done-when detail in `description`. `files`, `inputs`, and `expectedOutput` must be JSON arrays of strings, even for one path (for example, `"expectedOutput": ["src/index.ts"]`, never `"expectedOutput": "src/index.ts"`). `expectedOutput` is path-only: list only files the task creates or overwrites, and use `[]` for pure verification tasks.
|
|
68
69
|
6. **Persist planning state through `gsd_plan_slice`.** Call it with the full payload. The tool writes to the DB and renders `{{outputPath}}` and `{{slicePath}}/tasks/T##-PLAN.md` automatically. Do NOT rely on direct `PLAN.md` writes.
|
|
@@ -25,12 +25,12 @@ A milestone adding a small feature to an established codebase needs targeted res
|
|
|
25
25
|
Then research the codebase and relevant technologies. Narrate key findings and surprises as you go — what exists, what's missing, what constrains the approach.
|
|
26
26
|
1. {{skillActivation}}
|
|
27
27
|
2. **Skill Discovery ({{skillDiscoveryMode}}):**{{skillDiscoveryInstructions}}
|
|
28
|
-
3.
|
|
28
|
+
3. **Ground in the preloaded context, do not re-survey.** The Codebase Snapshot and Project Classification above describe current code reality and project size — treat them as authoritative. Do NOT open-endedly survey the tree (`rg`/`find`/`scout`) to rediscover what they already cover. Read a specific file with a targeted `read` only when a research question's answer hinges on that file's exact contents. Match research depth to the classified project size: a tiny project needs a short, targeted research note, not a broad survey.
|
|
29
29
|
4. Use `resolve_library` / `get_library_docs` for unfamiliar libraries — skip this for libraries already used in the codebase
|
|
30
30
|
5. **Web search budget:** You have a limited budget of web searches (max ~15 per session). Use them strategically — prefer `resolve_library` / `get_library_docs` for library documentation. Do NOT repeat the same or similar queries. If a search didn't find what you need, rephrase once or move on. Target 3-5 total web searches for a typical research unit.
|
|
31
31
|
6. Use the **Research** output template from the inlined context above — include only sections that have real content
|
|
32
32
|
7. If `.gsd/REQUIREMENTS.md` exists, research against it. Identify which Active requirements are table stakes, likely omissions, overbuilt risks, or domain-standard behaviors the user may or may not want.
|
|
33
|
-
8. Call `gsd_summary_save` with `milestone_id: {{milestoneId}}`, `artifact_type: "RESEARCH"`, and the full research markdown as `content` — the tool computes the file path and persists to both DB and disk.
|
|
33
|
+
8. Call `gsd_summary_save` with `milestone_id: {{milestoneId}}`, `artifact_type: "RESEARCH"`, and the full research markdown as `content` — the tool computes the file path and persists to both DB and disk. Save **incrementally**: once you have substantive findings, save them, then enrich and re-save as you learn more. This makes your research durable — if this unit is interrupted, a re-dispatch resumes from your last saved draft instead of restarting. If a "Resume — Prior Partial Research" block is present above, extend that draft rather than starting over.
|
|
34
34
|
|
|
35
35
|
## Strategic Questions to Answer
|
|
36
36
|
|
|
@@ -158,7 +158,7 @@ Fix root causes, not symptoms. If applying temporary mitigation, label it and pr
|
|
|
158
158
|
- State uncertainty plainly: "Not sure this handles X - testing it." No performed confidence, no hedging paragraphs.
|
|
159
159
|
- All user-visible narration must be grammatical English. Do not emit compressed planner notes like "Need inspect X". If it fits a commit comment or standup note, it is acceptable.
|
|
160
160
|
- When debugging, stay curious. Problems are puzzles. Say what's interesting about the failure before reaching for fixes.
|
|
161
|
-
- After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats.
|
|
161
|
+
- After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats, or when the active workflow prompt already ends with its own explicit "Next steps:" handoff block — in that case follow the workflow's handoff and do not add a second list.
|
|
162
162
|
|
|
163
163
|
If any next step is destructive/outward-facing, present it via `ask_user_questions` and wait for the user's answer before execution. Do not execute a next-step item from a prior plain-text numbered list without fresh confirmation.
|
|
164
164
|
|
|
@@ -24,16 +24,18 @@ Roadmap, slice summaries, assessments, requirements, decisions, and project cont
|
|
|
24
24
|
|
|
25
25
|
### Step 1 - Dispatch Parallel Reviewers
|
|
26
26
|
|
|
27
|
+
The Inlined Context above already preloads the evidence reviewers need — the roadmap, per-slice SUMMARY/ASSESSMENT excerpts, requirements, and verification classes. **Embed the relevant preloaded evidence directly into each reviewer's task prompt** so reviewers work from it instead of re-reading the same artifacts from disk. Each reviewer should read a full file only when its excerpt is missing, truncated, or internally inconsistent — never as a routine first step. This avoids three reviewers independently re-surveying artifacts the orchestrator already holds.
|
|
28
|
+
|
|
27
29
|
Call `subagent` with `tasks: [...]` containing ALL THREE reviewers simultaneously:
|
|
28
30
|
|
|
29
31
|
**Reviewer A - Requirements Coverage**
|
|
30
|
-
Prompt: "Review milestone {{milestoneId}} requirements coverage. Working directory: {{workingDirectory}}.
|
|
32
|
+
Prompt: "Review milestone {{milestoneId}} requirements coverage. Working directory: {{workingDirectory}}. Use the preloaded requirements and slice SUMMARY evidence embedded in this task — do not re-read them from disk. For each requirement, mark COVERED, PARTIAL, or MISSING against that evidence. Read a full SUMMARY under `.gsd/milestones/{{milestoneId}}/slices/` only if its preloaded excerpt is missing, truncated, or inconsistent. Output table: Requirement | Status | Evidence. End with one-line verdict: PASS if all covered, NEEDS-ATTENTION if partials exist, FAIL if any missing."
|
|
31
33
|
|
|
32
34
|
**Reviewer B - Cross-Slice Integration**
|
|
33
|
-
Prompt: "Review milestone {{milestoneId}} cross-slice integration. Working directory: {{workingDirectory}}.
|
|
35
|
+
Prompt: "Review milestone {{milestoneId}} cross-slice integration. Working directory: {{workingDirectory}}. Use the preloaded roadmap and slice SUMMARY evidence embedded in this task — do not re-read them from disk. Find the boundary map (produces/consumes contracts) in the roadmap. For each boundary, confirm producer SUMMARY produced the artifact and consumer SUMMARY consumed it. Read `{{roadmapPath}}` or a full SUMMARY only if the preloaded evidence is missing, truncated, or inconsistent. Output table: Boundary | Producer Summary | Consumer Summary | Status. End with one-line verdict: PASS if all boundaries honored, NEEDS-ATTENTION if any gaps."
|
|
34
36
|
|
|
35
37
|
**Reviewer C - Assessment & Acceptance Criteria**
|
|
36
|
-
Prompt: "Review milestone {{milestoneId}} assessment evidence and acceptance criteria. Working directory: {{workingDirectory}}. Read `.gsd/milestones/{{milestoneId}}/{{milestoneId}}-CONTEXT.md
|
|
38
|
+
Prompt: "Review milestone {{milestoneId}} assessment evidence and acceptance criteria. Working directory: {{workingDirectory}}. Use the preloaded milestone context, slice SUMMARY, and ASSESSMENT evidence embedded in this task — do not re-read them from disk. Read `.gsd/milestones/{{milestoneId}}/{{milestoneId}}-CONTEXT.md`, a full SUMMARY, or a full ASSESSMENT only if the preloaded excerpt is missing, truncated, or inconsistent. UAT files are specs, not evidence. Verify each criterion maps to passing evidence. Then review the inlined `Verification Classes (from planning)` table. For every planned row in that table, output a `Verification Classes` table with columns `Class | Planned Check | Evidence | Verdict`. Preserve every planned non-empty class row; do not summarize, rename, combine, or omit planned classes. The first cell of each row must be exactly `Contract`, `Integration`, `Operational`, or `UAT` when that class is present in planning. If a planned class lacks evidence, still include its canonical row and mark the verdict NEEDS-ATTENTION or FAIL. If a planned browser/UAT class has no ASSESSMENT with browser/runtime actions and assertions, return NEEDS-ATTENTION. If no verification classes were planned, say that explicitly. Output sections `Acceptance Criteria` with checklist `[ ] Criterion | Evidence`, and `Verification Classes` with the table. End with one-line verdict: PASS if all criteria and classes are covered by evidence, NEEDS-ATTENTION if gaps exist."
|
|
37
39
|
|
|
38
40
|
### Step 2 - Synthesize Findings
|
|
39
41
|
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Payload Policy - ordered shaping of provider request payloads.
|
|
3
|
+
*
|
|
4
|
+
* The order is intentional:
|
|
5
|
+
* 1. observation budgeting masks old tool results in auto-mode,
|
|
6
|
+
* 2. display truncation caps tool-result text for every mode,
|
|
7
|
+
* 3. the protected Source Context Block is appended after truncation,
|
|
8
|
+
* 4. supported models receive the configured service tier.
|
|
9
|
+
*/
|
|
10
|
+
import { createObservationMask, createResponsesInputObservationMask, truncateContextResultMessages, truncateResponsesInputResultItems, } from "./context-masker.js";
|
|
11
|
+
import { getSourceObservationStore, isAutoActive } from "./auto-runtime-state.js";
|
|
12
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
13
|
+
import { getEffectiveServiceTier, supportsServiceTier } from "./service-tier.js";
|
|
14
|
+
import { injectSourceContextBlockIntoPayload } from "./source-observations.js";
|
|
15
|
+
const DEFAULT_OBSERVATION_MASK_TURNS = 8;
|
|
16
|
+
const DEFAULT_TOOL_RESULT_MAX_CHARS = 800;
|
|
17
|
+
export const DEFAULT_PROVIDER_PAYLOAD_POLICY_DEPS = {
|
|
18
|
+
isAutoActive,
|
|
19
|
+
loadContextManagementConfig: () => loadEffectiveGSDPreferences()?.preferences.context_management,
|
|
20
|
+
renderSourceContextBlock: () => getSourceObservationStore().renderActiveBlock(),
|
|
21
|
+
getEffectiveServiceTier,
|
|
22
|
+
supportsServiceTier,
|
|
23
|
+
};
|
|
24
|
+
export function applyProviderPayloadPolicy({ payload, modelId, deps: overrides, }) {
|
|
25
|
+
const deps = { ...DEFAULT_PROVIDER_PAYLOAD_POLICY_DEPS, ...overrides };
|
|
26
|
+
try {
|
|
27
|
+
applyContextManagement(payload, deps);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Provider payload shaping should not block a request when optional
|
|
31
|
+
// context management preferences or adapters fail.
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
applySourceContextBlock(payload, deps);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Source observations are opportunistic; execution can continue without
|
|
38
|
+
// an injected block.
|
|
39
|
+
}
|
|
40
|
+
applyServiceTier(payload, modelId, deps);
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
function applyContextManagement(payload, deps) {
|
|
44
|
+
const config = deps.loadContextManagementConfig();
|
|
45
|
+
applyObservationBudget(payload, config, deps.isAutoActive());
|
|
46
|
+
applyDisplayTruncation(payload, config);
|
|
47
|
+
}
|
|
48
|
+
function applyObservationBudget(payload, config, autoActive) {
|
|
49
|
+
if (!autoActive || config?.observation_masking === false)
|
|
50
|
+
return;
|
|
51
|
+
const keepTurns = config?.observation_mask_turns ?? DEFAULT_OBSERVATION_MASK_TURNS;
|
|
52
|
+
if (Array.isArray(payload.messages)) {
|
|
53
|
+
payload.messages = createObservationMask(keepTurns)(payload.messages);
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(payload.input)) {
|
|
56
|
+
payload.input = createResponsesInputObservationMask(keepTurns)(payload.input);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function applyDisplayTruncation(payload, config) {
|
|
60
|
+
const maxChars = config?.tool_result_max_chars ?? DEFAULT_TOOL_RESULT_MAX_CHARS;
|
|
61
|
+
if (Array.isArray(payload.messages)) {
|
|
62
|
+
payload.messages = truncateContextResultMessages(payload.messages, maxChars);
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(payload.input)) {
|
|
65
|
+
payload.input = truncateResponsesInputResultItems(payload.input, maxChars);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function applySourceContextBlock(payload, deps) {
|
|
69
|
+
if (!deps.isAutoActive())
|
|
70
|
+
return;
|
|
71
|
+
const sourceContextBlock = deps.renderSourceContextBlock();
|
|
72
|
+
if (!sourceContextBlock)
|
|
73
|
+
return;
|
|
74
|
+
Object.assign(payload, injectSourceContextBlockIntoPayload(payload, sourceContextBlock));
|
|
75
|
+
}
|
|
76
|
+
function applyServiceTier(payload, modelId, deps) {
|
|
77
|
+
if (!modelId)
|
|
78
|
+
return;
|
|
79
|
+
const tier = deps.getEffectiveServiceTier();
|
|
80
|
+
if (!tier || !deps.supportsServiceTier(modelId))
|
|
81
|
+
return;
|
|
82
|
+
payload.service_tier = tier;
|
|
83
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Process-level pull request policy for GSD-generated PRs.
|
|
3
|
+
import { createDraftPR } from "./git-service.js";
|
|
4
|
+
import { buildPrEvidence, } from "./pr-evidence.js";
|
|
5
|
+
export function buildPullRequestEvidence(input) {
|
|
6
|
+
return buildPrEvidence({
|
|
7
|
+
...input,
|
|
8
|
+
aiAssisted: false,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function createDraftPullRequestFromEvidence(basePath, milestoneId, evidence, options, deps = { createDraftPR }) {
|
|
12
|
+
return deps.createDraftPR(basePath, milestoneId, evidence.title, evidence.body, options);
|
|
13
|
+
}
|