@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +9 -5
- package/dist/resource-loader.js +116 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +54 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
- package/dist/resources/extensions/gsd/auto.js +45 -21
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +57 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +1 -1
- 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.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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +11 -11
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- 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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- 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/tool-execution.d.ts +5 -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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.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 +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-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 +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +145 -59
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.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/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +74 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
- package/src/resources/extensions/gsd/auto.ts +64 -25
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -31
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +24 -2
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { gsdRoot } from "./paths.js";
|
|
1
|
+
import { workflowEventArchivePath, workflowEventLogPath } from "./workflow-event-ledger.js";
|
|
3
2
|
import { readEvents } from "./workflow-events.js";
|
|
4
3
|
export function latestExplicitReopenAt(basePath, milestoneId) {
|
|
5
|
-
const root = gsdRoot(basePath);
|
|
6
4
|
const candidates = [
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
workflowEventLogPath(basePath),
|
|
6
|
+
workflowEventArchivePath(basePath, milestoneId),
|
|
9
7
|
];
|
|
10
8
|
let latest = null;
|
|
11
9
|
for (const file of candidates) {
|
|
@@ -13,6 +13,7 @@ export const BUNDLED_COST_TABLE = [
|
|
|
13
13
|
{ id: "claude-opus-4-6", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-04-16" },
|
|
14
14
|
{ id: "claude-opus-4-7", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-04-16" },
|
|
15
15
|
{ id: "claude-opus-4-8", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-05-28" },
|
|
16
|
+
{ id: "claude-fable-5", inputPer1k: 0.010, outputPer1k: 0.050, updatedAt: "2026-06-09" },
|
|
16
17
|
{ id: "claude-sonnet-4-6", inputPer1k: 0.003, outputPer1k: 0.015, updatedAt: "2025-03-15" },
|
|
17
18
|
{ id: "claude-haiku-4-5", inputPer1k: 0.0008, outputPer1k: 0.004, updatedAt: "2025-03-15" },
|
|
18
19
|
{ id: "claude-sonnet-4-5-20250514", inputPer1k: 0.003, outputPer1k: 0.015, updatedAt: "2025-03-15" },
|
|
@@ -35,6 +35,7 @@ export const MODEL_CAPABILITY_TIER = {
|
|
|
35
35
|
"claude-opus-4-6": "heavy",
|
|
36
36
|
"claude-opus-4-7": "heavy",
|
|
37
37
|
"claude-opus-4-8": "heavy",
|
|
38
|
+
"claude-fable-5": "heavy",
|
|
38
39
|
"claude-3-opus-latest": "heavy",
|
|
39
40
|
"gpt-4-turbo": "heavy",
|
|
40
41
|
"gpt-5": "heavy",
|
|
@@ -61,6 +62,7 @@ const MODEL_COST_PER_1K_INPUT = {
|
|
|
61
62
|
"claude-opus-4-6": 0.005,
|
|
62
63
|
"claude-opus-4-7": 0.005,
|
|
63
64
|
"claude-opus-4-8": 0.005,
|
|
65
|
+
"claude-fable-5": 0.010,
|
|
64
66
|
"gpt-4o-mini": 0.00015,
|
|
65
67
|
"gpt-4o": 0.0025,
|
|
66
68
|
"gpt-4.1": 0.002,
|
|
@@ -94,6 +96,7 @@ export const MODEL_CAPABILITY_PROFILES = {
|
|
|
94
96
|
"claude-opus-4-6": { coding: 95, debugging: 90, research: 85, reasoning: 95, speed: 30, longContext: 80, instruction: 90 },
|
|
95
97
|
"claude-opus-4-7": { coding: 95, debugging: 90, research: 85, reasoning: 95, speed: 30, longContext: 80, instruction: 90 },
|
|
96
98
|
"claude-opus-4-8": { coding: 97, debugging: 92, research: 87, reasoning: 97, speed: 30, longContext: 85, instruction: 92 },
|
|
99
|
+
"claude-fable-5": { coding: 97, debugging: 92, research: 87, reasoning: 97, speed: 30, longContext: 85, instruction: 92 },
|
|
97
100
|
"claude-sonnet-4-6": { coding: 85, debugging: 80, research: 75, reasoning: 80, speed: 60, longContext: 75, instruction: 85 },
|
|
98
101
|
"claude-sonnet-4-5-20250514": { coding: 85, debugging: 80, research: 75, reasoning: 80, speed: 60, longContext: 75, instruction: 85 },
|
|
99
102
|
"claude-3-5-sonnet-latest": { coding: 82, debugging: 78, research: 72, reasoning: 78, speed: 62, longContext: 70, instruction: 82 },
|
|
@@ -34,13 +34,16 @@ export function initNotificationStore(basePath) {
|
|
|
34
34
|
* Append a notification entry to the store. Synchronous — safe to call
|
|
35
35
|
* from the notify() shim which is declared void (not async).
|
|
36
36
|
*/
|
|
37
|
-
export function appendNotification(message, severity, source = "notify") {
|
|
37
|
+
export function appendNotification(message, severity, source = "notify", meta) {
|
|
38
38
|
if (!_basePath)
|
|
39
39
|
return;
|
|
40
40
|
if (_suppressCount > 0)
|
|
41
41
|
return;
|
|
42
42
|
const persistedMessage = message.length > 500 ? message.slice(0, 500) + "…" : message;
|
|
43
|
-
|
|
43
|
+
// Structured identity (kind + scope) keys dedup when present, so a rephrased
|
|
44
|
+
// message of the same event still dedups; otherwise fall back to the prose.
|
|
45
|
+
const identity = meta?.kind ? `${meta.kind}:${meta.scope ?? ""}` : persistedMessage;
|
|
46
|
+
const dedupKey = `${_basePath}:${severity}:${source}:${identity}`;
|
|
44
47
|
const now = Date.now();
|
|
45
48
|
const lastSeen = _recentMessageTimestamps.get(dedupKey);
|
|
46
49
|
if (lastSeen !== undefined && now - lastSeen < DEDUP_WINDOW_MS)
|
|
@@ -59,6 +62,8 @@ export function appendNotification(message, severity, source = "notify") {
|
|
|
59
62
|
message: persistedMessage,
|
|
60
63
|
source,
|
|
61
64
|
read: false,
|
|
65
|
+
...(meta?.kind ? { kind: meta.kind } : {}),
|
|
66
|
+
...(meta?.scope ? { scope: meta.scope } : {}),
|
|
62
67
|
};
|
|
63
68
|
try {
|
|
64
69
|
const dir = join(_basePath, ".gsd");
|
|
@@ -77,12 +82,14 @@ export function appendNotification(message, severity, source = "notify") {
|
|
|
77
82
|
}
|
|
78
83
|
/**
|
|
79
84
|
* Read all notification entries from disk. Returns newest-first.
|
|
85
|
+
* An optional filter narrows by structured identity (kind and/or scope).
|
|
80
86
|
*/
|
|
81
|
-
export function readNotifications(basePath) {
|
|
87
|
+
export function readNotifications(basePath, filter) {
|
|
82
88
|
const bp = basePath ?? _basePath;
|
|
83
89
|
if (!bp)
|
|
84
90
|
return [];
|
|
85
|
-
|
|
91
|
+
const entries = _readEntriesFromDisk(bp).filter((e) => (!filter?.kind || e.kind === filter.kind) && (!filter?.scope || e.scope === filter.scope));
|
|
92
|
+
return entries.reverse();
|
|
86
93
|
}
|
|
87
94
|
/**
|
|
88
95
|
* Mark all notifications as read. Atomic rewrite via temp-file + rename.
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* with safety checks for parallel execution context.
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
8
|
import { spawnSync } from "node:child_process";
|
|
10
9
|
import { resolveGsdPathContract } from "./paths.js";
|
|
10
|
+
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
11
11
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
12
12
|
import { buildWorktreeLifecycleDeps } from "./auto.js";
|
|
13
13
|
import { mergeMilestoneStandalone, } from "./worktree-lifecycle.js";
|
|
@@ -22,7 +22,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
22
22
|
* Returns true when milestones.status = 'complete' in project gsd.db.
|
|
23
23
|
*/
|
|
24
24
|
export function isMilestoneCompleteInProjectDb(basePath, mid) {
|
|
25
|
-
const workRoot =
|
|
25
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
26
26
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
27
27
|
if (!existsSync(dbPath))
|
|
28
28
|
return false;
|
|
@@ -41,16 +41,19 @@ export function isMilestoneCompleteInProjectDb(basePath, mid) {
|
|
|
41
41
|
*/
|
|
42
42
|
function discoverDbCompletedMilestones(basePath) {
|
|
43
43
|
const completed = new Set();
|
|
44
|
-
const worktreeDir
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
for (const worktreeDir of worktreesDirs(basePath)) {
|
|
45
|
+
if (!existsSync(worktreeDir))
|
|
46
|
+
continue;
|
|
47
|
+
try {
|
|
48
|
+
for (const entry of readdirSync(worktreeDir)) {
|
|
49
|
+
if (entry.startsWith("M") && isMilestoneCompleteInProjectDb(basePath, entry)) {
|
|
50
|
+
completed.add(entry);
|
|
51
|
+
}
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
catch (e) {
|
|
55
|
+
logWarning("parallel", `readdirSync for completed set failed: ${e.message}`);
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
return completed;
|
|
56
59
|
}
|
|
@@ -88,7 +91,7 @@ export function determineMergeOrder(workers, order = "sequential", basePath) {
|
|
|
88
91
|
title: mid,
|
|
89
92
|
pid: 0,
|
|
90
93
|
process: null,
|
|
91
|
-
worktreePath: basePath ?
|
|
94
|
+
worktreePath: basePath ? worktreePathFor(basePath, mid) : "",
|
|
92
95
|
startedAt: 0,
|
|
93
96
|
state: "stopped",
|
|
94
97
|
cost: 0,
|
|
@@ -7,6 +7,7 @@ import { matchesKey, Key } from "@gsd/pi-tui";
|
|
|
7
7
|
import { formatDuration } from "../shared/mod.js";
|
|
8
8
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
9
9
|
import { resolveGsdPathContract } from "./paths.js";
|
|
10
|
+
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
10
11
|
import { renderBar, renderDialogFrame, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
|
|
11
12
|
// ─── Data Helpers ─────────────────────────────────────────────────────────
|
|
12
13
|
function readJsonSafe(filePath) {
|
|
@@ -42,7 +43,6 @@ function tailRead(filePath, maxBytes) {
|
|
|
42
43
|
}
|
|
43
44
|
function discoverWorkers(basePath) {
|
|
44
45
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
45
|
-
const worktreeDir = join(basePath, ".gsd", "worktrees");
|
|
46
46
|
const mids = new Set();
|
|
47
47
|
if (existsSync(parallelDir)) {
|
|
48
48
|
try {
|
|
@@ -56,7 +56,9 @@ function discoverWorkers(basePath) {
|
|
|
56
56
|
}
|
|
57
57
|
catch { /* skip */ }
|
|
58
58
|
}
|
|
59
|
-
|
|
59
|
+
for (const worktreeDir of worktreesDirs(basePath)) {
|
|
60
|
+
if (!existsSync(worktreeDir))
|
|
61
|
+
continue;
|
|
60
62
|
try {
|
|
61
63
|
for (const d of readdirSync(worktreeDir)) {
|
|
62
64
|
if (d.startsWith("M") && existsSync(join(worktreeDir, d, ".gsd", "auto.lock"))) {
|
|
@@ -68,8 +70,7 @@ function discoverWorkers(basePath) {
|
|
|
68
70
|
}
|
|
69
71
|
return [...mids].sort();
|
|
70
72
|
}
|
|
71
|
-
function querySliceProgress(basePath, mid) {
|
|
72
|
-
const workRoot = join(basePath, ".gsd", "worktrees", mid);
|
|
73
|
+
function querySliceProgress(basePath, mid, workRoot = worktreePathFor(basePath, mid)) {
|
|
73
74
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
74
75
|
if (!existsSync(dbPath))
|
|
75
76
|
return [];
|
|
@@ -115,7 +116,7 @@ function extractCostFromNdjson(basePath, mid) {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
function queryRecentCompletions(basePath, mid) {
|
|
118
|
-
const workRoot =
|
|
119
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
119
120
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
120
121
|
if (!existsSync(dbPath))
|
|
121
122
|
return [];
|
|
@@ -139,9 +140,12 @@ function collectWorkerData(basePath) {
|
|
|
139
140
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
140
141
|
const workers = [];
|
|
141
142
|
for (const mid of mids) {
|
|
143
|
+
// Resolve the worktree path once per worker per tick — this runs on a
|
|
144
|
+
// 5-second refresh interval and worktreePathFor probes the filesystem.
|
|
145
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
142
146
|
const status = readJsonSafe(join(parallelDir, `${mid}.status.json`));
|
|
143
|
-
const lock = readJsonSafe(join(
|
|
144
|
-
const slices = querySliceProgress(basePath, mid);
|
|
147
|
+
const lock = readJsonSafe(join(workRoot, ".gsd", "auto.lock"));
|
|
148
|
+
const slices = querySliceProgress(basePath, mid, workRoot);
|
|
145
149
|
const pid = lock?.pid || status?.pid || 0;
|
|
146
150
|
const alive = pid ? isPidAlive(pid) : false;
|
|
147
151
|
// Heartbeat: prefer status.json if PID matches, else use file mtime
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
// GSD Extension - Legacy Parsers
|
|
2
2
|
// parseRoadmap() and parsePlan() extracted from files.ts.
|
|
3
|
-
// Used only by: md-importer.ts (migration), state.ts (pre-migration fallback),
|
|
4
|
-
// markdown-renderer.ts (detectStaleRenders disk-vs-DB comparison),
|
|
5
|
-
// commands-maintenance.ts (cold-path branch cleanup), and tests.
|
|
6
3
|
//
|
|
7
|
-
//
|
|
4
|
+
// ADR-017: the DB is the single source of truth; `.gsd/*.md` files are
|
|
5
|
+
// projections. These parsers may be imported ONLY for:
|
|
6
|
+
// - migration/import (md-importer, workflow-migration, migration-auto-check)
|
|
7
|
+
// - drift detection that compares both sources by design
|
|
8
|
+
// (state-reconciliation/drift, markdown-renderer stale-render detection)
|
|
9
|
+
// - explicit pre-migration / DB-unavailable fallbacks (state.ts,
|
|
10
|
+
// reactive-graph.ts, auto-recovery.ts)
|
|
11
|
+
// - diagnostics and display/telemetry-only surfaces (doctor,
|
|
12
|
+
// doctor-git-checks, workspace-index, visualizer-data, auto-prompts
|
|
13
|
+
// context text, commands-maintenance, milestone-closeout, github-sync)
|
|
14
|
+
// - tests
|
|
15
|
+
//
|
|
16
|
+
// Dispatch/gate/completion DECISION paths must NOT import this module — they
|
|
17
|
+
// read the DB via gsd-db queries (e.g. getMilestoneSliceSummaries). Enforced
|
|
18
|
+
// by tests/parsers-legacy-importers.test.ts; new importers must be added to
|
|
19
|
+
// its allowlist with a one-line justification.
|
|
8
20
|
import { extractSection, parseBullets, extractBoldField, extractAllSections, registerCacheClearCallback } from './files.js';
|
|
9
21
|
import { splitFrontmatter } from '../shared/frontmatter.js';
|
|
10
22
|
import { nativeParseRoadmap, nativeParsePlanFile } from './native-parser-bridge.js';
|
|
@@ -16,7 +16,7 @@ import { spawnSync } from "node:child_process";
|
|
|
16
16
|
import { nativeScanGsdTree } from "./native-parser-bridge.js";
|
|
17
17
|
import { DIR_CACHE_MAX } from "./constants.js";
|
|
18
18
|
import { gsdHome } from "./gsd-home.js";
|
|
19
|
-
import { isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
19
|
+
import { findWorktreeSegment, isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
20
20
|
// ─── Directory Listing Cache ──────────────────────────────────────────────────
|
|
21
21
|
const dirEntryCache = new Map();
|
|
22
22
|
const dirListCache = new Map();
|
|
@@ -139,6 +139,33 @@ export function clearPathCache() {
|
|
|
139
139
|
nativeTreeBase = null;
|
|
140
140
|
}
|
|
141
141
|
// ─── Name Builders ─────────────────────────────────────────────────────────
|
|
142
|
+
/** Directories owned by the GSD framework — metadata, never project source. */
|
|
143
|
+
export const FRAMEWORK_METADATA_DIRS = [".gsd", ".planning", ".audits"];
|
|
144
|
+
/**
|
|
145
|
+
* Every artifact suffix used with the name builders below — the single source
|
|
146
|
+
* for the `<ID>-<SUFFIX>.md` naming vocabulary. Extend this list when a new
|
|
147
|
+
* artifact type is introduced; consumers (md-importer walking, pre-execution
|
|
148
|
+
* artifact detection) pick it up from here.
|
|
149
|
+
*/
|
|
150
|
+
export const PLANNING_ARTIFACT_SUFFIXES = [
|
|
151
|
+
"CONTEXT",
|
|
152
|
+
"CONTEXT-DRAFT",
|
|
153
|
+
"ROADMAP",
|
|
154
|
+
"PLAN",
|
|
155
|
+
"REPLAN",
|
|
156
|
+
"SUMMARY",
|
|
157
|
+
"RESEARCH",
|
|
158
|
+
"VALIDATION",
|
|
159
|
+
"ASSESSMENT",
|
|
160
|
+
"UAT",
|
|
161
|
+
"DISCUSSION",
|
|
162
|
+
"EVAL-REVIEW",
|
|
163
|
+
"PARKED",
|
|
164
|
+
"VERIFICATION-FAILED",
|
|
165
|
+
"CONTINUE",
|
|
166
|
+
];
|
|
167
|
+
/** Matches a bare planning-artifact file name, e.g. "M001-CONTEXT.md", "S01-PLAN.md". */
|
|
168
|
+
export const PLANNING_ARTIFACT_NAME_RE = new RegExp(`^[MST]\\d+-(${PLANNING_ARTIFACT_SUFFIXES.join("|")})\\.md$`, "i");
|
|
142
169
|
/**
|
|
143
170
|
* Build a milestone-level file name.
|
|
144
171
|
* ("M001", "CONTEXT") → "M001-CONTEXT.md"
|
|
@@ -422,31 +449,17 @@ function assertNotGlobalGsdHome(basePath, result) {
|
|
|
422
449
|
* When gsdRoot() is called with such a path, we must NOT walk up to the
|
|
423
450
|
* project root's .gsd — each worktree manages its own .gsd state (#2594).
|
|
424
451
|
*
|
|
425
|
-
*
|
|
426
|
-
*
|
|
452
|
+
* Layout matching is owned by worktree-root's findWorktreeSegment; this
|
|
453
|
+
* only adds the requirement that a non-empty worktree name follows the
|
|
454
|
+
* marker (the worktrees container dir itself is not a worktree).
|
|
427
455
|
*/
|
|
428
456
|
function isInsideGsdWorktree(p) {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
`${sepNative}.gsd${sepNative}worktrees${sepNative}`,
|
|
436
|
-
];
|
|
437
|
-
for (const marker of markers) {
|
|
438
|
-
const idx = p.indexOf(marker);
|
|
439
|
-
if (idx === -1)
|
|
440
|
-
continue;
|
|
441
|
-
// Verify there's a non-empty worktree name after the marker
|
|
442
|
-
const afterMarker = p.slice(idx + marker.length);
|
|
443
|
-
// The name is everything up to the next separator (or end of string)
|
|
444
|
-
const nameEnd = afterMarker.search(/[/\\]/);
|
|
445
|
-
const name = nameEnd === -1 ? afterMarker : afterMarker.slice(0, nameEnd);
|
|
446
|
-
if (name.length > 0)
|
|
447
|
-
return true;
|
|
448
|
-
}
|
|
449
|
-
return false;
|
|
457
|
+
const normalized = p.replaceAll("\\", "/");
|
|
458
|
+
const segment = findWorktreeSegment(normalized);
|
|
459
|
+
if (!segment)
|
|
460
|
+
return false;
|
|
461
|
+
const name = normalized.slice(segment.afterWorktrees).split("/")[0];
|
|
462
|
+
return name.length > 0;
|
|
450
463
|
}
|
|
451
464
|
function probeGsdRoot(rawBasePath) {
|
|
452
465
|
const contract = resolveGsdPathContract(rawBasePath);
|
|
@@ -20,6 +20,7 @@ import { spawn } from "node:child_process";
|
|
|
20
20
|
import { homedir } from "node:os";
|
|
21
21
|
import { isAbsolute, relative, resolve } from "node:path";
|
|
22
22
|
import { validateVerificationCommand } from "./verification-gate.js";
|
|
23
|
+
import { FRAMEWORK_METADATA_DIRS, PLANNING_ARTIFACT_NAME_RE } from "./paths.js";
|
|
23
24
|
const NPM_COMMAND = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
24
25
|
function inputExistsOnDisk(normalizedFile, basePath, context) {
|
|
25
26
|
if (existsSync(resolve(basePath, normalizedFile)))
|
|
@@ -510,6 +511,10 @@ export function checkFilePathConsistency(tasks, basePath, context) {
|
|
|
510
511
|
continue;
|
|
511
512
|
if (!shouldValidateInputAsPath(file))
|
|
512
513
|
continue;
|
|
514
|
+
// Planning-artifact references are owned by checkPlanningArtifactReferences,
|
|
515
|
+
// which reports a precise removal message instead of "doesn't exist".
|
|
516
|
+
if (isPlanningArtifactReference(file, basePath, context))
|
|
517
|
+
continue;
|
|
513
518
|
// Normalize path for consistent comparison
|
|
514
519
|
const normalizedFile = toComparisonPath(file, basePath);
|
|
515
520
|
if (containsGlobPattern(normalizedFile))
|
|
@@ -546,6 +551,71 @@ export function checkFilePathConsistency(tasks, basePath, context) {
|
|
|
546
551
|
}
|
|
547
552
|
return results;
|
|
548
553
|
}
|
|
554
|
+
// ─── Planning Artifact Reference Check ───────────────────────────────────────
|
|
555
|
+
function isFrameworkMetadataPath(normalizedFile) {
|
|
556
|
+
return normalizedFile.split("/").some((segment) => FRAMEWORK_METADATA_DIRS.includes(segment.toLowerCase()));
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* True when a task IO entry references a GSD planning artifact.
|
|
560
|
+
*
|
|
561
|
+
* Task inputs are source files only — planning artifacts are projections of DB
|
|
562
|
+
* state that the framework preloads as composed context (see CONTEXT.md "Task
|
|
563
|
+
* Input"). Two triggers, deliberately different in strictness:
|
|
564
|
+
*
|
|
565
|
+
* - Any path entering framework-owned metadata (.gsd/, .planning/, .audits/)
|
|
566
|
+
* is always a violation, even when the file exists.
|
|
567
|
+
* - A bare artifact-style basename (M001-CONTEXT.md, S01-PLAN.md, …) is a
|
|
568
|
+
* violation only when it does NOT resolve to a real file. When such a file
|
|
569
|
+
* genuinely exists in the source tree (e.g. a fixture), it is a source file
|
|
570
|
+
* and stays legal; a path with directory components is likewise left to the
|
|
571
|
+
* ordinary existence checks.
|
|
572
|
+
*/
|
|
573
|
+
function isPlanningArtifactReference(rawEntry, basePath, context) {
|
|
574
|
+
if (!shouldValidateInputAsPath(rawEntry))
|
|
575
|
+
return false;
|
|
576
|
+
const normalized = toComparisonPath(rawEntry, basePath);
|
|
577
|
+
if (isFrameworkMetadataPath(normalized))
|
|
578
|
+
return true;
|
|
579
|
+
return (!normalized.includes("/") &&
|
|
580
|
+
PLANNING_ARTIFACT_NAME_RE.test(normalized) &&
|
|
581
|
+
!inputExistsOnDisk(normalized, basePath, context));
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Block GSD planning artifacts in task IO fields (inputs, files, expectedOutput).
|
|
585
|
+
*
|
|
586
|
+
* For inputs/files the violation smuggles a projection into the executor's
|
|
587
|
+
* preloaded source context; for expectedOutput it promises a write the runtime
|
|
588
|
+
* write-gate would reject mid-execution. Both get a precise message so the
|
|
589
|
+
* planning retry steers toward *removing* the reference, not creating the file.
|
|
590
|
+
* checkFilePathConsistency and checkTaskOrdering skip entries this check owns.
|
|
591
|
+
*/
|
|
592
|
+
export function checkPlanningArtifactReferences(tasks, basePath, context) {
|
|
593
|
+
const results = [];
|
|
594
|
+
for (const task of tasks) {
|
|
595
|
+
const fields = [
|
|
596
|
+
{ label: "inputs", entries: task.inputs },
|
|
597
|
+
{ label: "files", entries: task.files },
|
|
598
|
+
{ label: "expectedOutput", entries: task.expected_output },
|
|
599
|
+
];
|
|
600
|
+
for (const { label, entries } of fields) {
|
|
601
|
+
for (const file of entries) {
|
|
602
|
+
if (!isPlanningArtifactReference(file, basePath, context))
|
|
603
|
+
continue;
|
|
604
|
+
const message = label === "expectedOutput"
|
|
605
|
+
? `Task ${task.id} lists '${file}' in expectedOutput — GSD planning artifacts are written by workflow tools (e.g. gsd_summary_save), never by tasks; remove it`
|
|
606
|
+
: `Task ${task.id} lists '${file}' in ${label} — GSD planning artifacts are projections preloaded as context, never task ${label}; remove it`;
|
|
607
|
+
results.push({
|
|
608
|
+
category: "file",
|
|
609
|
+
target: file,
|
|
610
|
+
passed: false,
|
|
611
|
+
message,
|
|
612
|
+
blocking: true,
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return results;
|
|
618
|
+
}
|
|
549
619
|
// ─── Task Ordering Check ─────────────────────────────────────────────────────
|
|
550
620
|
/**
|
|
551
621
|
* Detect impossible task ordering: task N reads a file that task N+M creates.
|
|
@@ -583,6 +653,10 @@ export function checkTaskOrdering(tasks, basePath, context) {
|
|
|
583
653
|
continue;
|
|
584
654
|
if (!shouldValidateInputAsPath(file))
|
|
585
655
|
continue;
|
|
656
|
+
// Owned by checkPlanningArtifactReferences — avoid a duplicate sequence
|
|
657
|
+
// finding on top of the removal message.
|
|
658
|
+
if (isPlanningArtifactReference(file, basePath, context))
|
|
659
|
+
continue;
|
|
586
660
|
const normalizedFile = toComparisonPath(file, basePath);
|
|
587
661
|
if (containsGlobPattern(normalizedFile))
|
|
588
662
|
continue;
|
|
@@ -611,6 +685,21 @@ export function checkTaskOrdering(tasks, basePath, context) {
|
|
|
611
685
|
}
|
|
612
686
|
return results;
|
|
613
687
|
}
|
|
688
|
+
// ─── Shared Path-Check Composition ───────────────────────────────────────────
|
|
689
|
+
/**
|
|
690
|
+
* The synchronous path-shaped checks, in order. One list shared by the
|
|
691
|
+
* plan-persist gate (gsd_plan_slice) and the dispatch gate
|
|
692
|
+
* (runPreExecutionChecks) so the two cannot drift — the checks coordinate
|
|
693
|
+
* ownership of planning-artifact entries via isPlanningArtifactReference
|
|
694
|
+
* skips, which only works when they run as a set.
|
|
695
|
+
*/
|
|
696
|
+
export function runTaskPathChecks(tasks, basePath, context) {
|
|
697
|
+
return [
|
|
698
|
+
...checkPlanningArtifactReferences(tasks, basePath, context),
|
|
699
|
+
...checkFilePathConsistency(tasks, basePath, context),
|
|
700
|
+
...checkTaskOrdering(tasks, basePath, context),
|
|
701
|
+
];
|
|
702
|
+
}
|
|
614
703
|
/**
|
|
615
704
|
* Extract function signatures from code blocks in task description.
|
|
616
705
|
* Uses heuristic regex — not an AST parser.
|
|
@@ -741,11 +830,10 @@ export async function runPreExecutionChecks(tasks, basePath, context) {
|
|
|
741
830
|
const startTime = Date.now();
|
|
742
831
|
const allChecks = [];
|
|
743
832
|
// Run sync checks first
|
|
744
|
-
const
|
|
745
|
-
const orderingChecks = checkTaskOrdering(tasks, basePath, context);
|
|
833
|
+
const pathChecks = runTaskPathChecks(tasks, basePath, context);
|
|
746
834
|
const contractChecks = checkInterfaceContracts(tasks, basePath);
|
|
747
835
|
const verificationChecks = checkVerificationCommands(tasks);
|
|
748
|
-
allChecks.push(...
|
|
836
|
+
allChecks.push(...pathChecks, ...contractChecks, ...verificationChecks);
|
|
749
837
|
// Run async package checks
|
|
750
838
|
const packageChecks = await checkPackageExistence(tasks, basePath);
|
|
751
839
|
allChecks.push(...packageChecks);
|
|
@@ -11,6 +11,7 @@ import { join } from "node:path";
|
|
|
11
11
|
import { gsdHome } from "./gsd-home.js";
|
|
12
12
|
import { canonicalModelForTier, defaultRoutingConfig, resolveModelForTier } from "./model-router.js";
|
|
13
13
|
import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath } from "./preferences.js";
|
|
14
|
+
import { getUnitPhaseChain } from "./unit-registry.js";
|
|
14
15
|
/**
|
|
15
16
|
* Resolve which model ID to use for a given auto-mode unit type.
|
|
16
17
|
* Returns undefined if no model preference is set for this unit type.
|
|
@@ -29,53 +30,18 @@ export function resolveModelForUnit(unitType) {
|
|
|
29
30
|
* (`resolveThinkingLevelForUnit`) so the two never drift (ADR-026).
|
|
30
31
|
*/
|
|
31
32
|
export function phaseChainForUnit(unitType) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
case "replan-slice":
|
|
43
|
-
return ["planning"];
|
|
44
|
-
// Deep-mode project-level discussion units route to the same model bucket
|
|
45
|
-
// as milestone-level discussion (interactive interview style). Workflow
|
|
46
|
-
// preferences and research-decision are tiny ask_user_questions style units
|
|
47
|
-
// that share the discuss bucket because they are conversational. All fall
|
|
48
|
-
// back to planning when no `discuss` bucket is set.
|
|
49
|
-
case "discuss-milestone":
|
|
50
|
-
case "discuss-slice":
|
|
51
|
-
case "discuss-project":
|
|
52
|
-
case "discuss-requirements":
|
|
53
|
-
case "workflow-preferences":
|
|
54
|
-
case "research-decision":
|
|
55
|
-
return ["discuss", "planning"];
|
|
56
|
-
case "execute-task":
|
|
57
|
-
case "reactive-execute":
|
|
58
|
-
return ["execution"];
|
|
59
|
-
case "execute-task-simple":
|
|
60
|
-
return ["execution_simple", "execution"];
|
|
61
|
-
case "complete-slice":
|
|
62
|
-
case "complete-milestone":
|
|
63
|
-
case "worktree-merge":
|
|
64
|
-
return ["completion"];
|
|
65
|
-
case "run-uat":
|
|
66
|
-
return ["uat", "completion"];
|
|
67
|
-
case "reassess-roadmap":
|
|
68
|
-
case "rewrite-docs":
|
|
69
|
-
case "gate-evaluate":
|
|
70
|
-
case "validate-milestone":
|
|
71
|
-
return ["validation", "planning"];
|
|
72
|
-
default:
|
|
73
|
-
// Subagent unit types (e.g., "subagent", "subagent/scout")
|
|
74
|
-
if (unitType === "subagent" || unitType.startsWith("subagent/")) {
|
|
75
|
-
return ["subagent"];
|
|
76
|
-
}
|
|
77
|
-
return undefined;
|
|
33
|
+
// Unit types declare their chain on their Unit Descriptor (ADR-033).
|
|
34
|
+
const declared = getUnitPhaseChain(unitType);
|
|
35
|
+
if (declared)
|
|
36
|
+
return [...declared];
|
|
37
|
+
// Dispatch types without a Unit Descriptor.
|
|
38
|
+
if (unitType === "worktree-merge")
|
|
39
|
+
return ["completion"];
|
|
40
|
+
// Subagent unit types (e.g., "subagent", "subagent/scout")
|
|
41
|
+
if (unitType === "subagent" || unitType.startsWith("subagent/")) {
|
|
42
|
+
return ["subagent"];
|
|
78
43
|
}
|
|
44
|
+
return undefined;
|
|
79
45
|
}
|
|
80
46
|
/**
|
|
81
47
|
* Find the phase bucket whose `models` entry wins the chain for a unit, plus
|
|
@@ -196,8 +162,8 @@ export function resolveThinkingLevelForUnit(unitType) {
|
|
|
196
162
|
* Returns `{ provider, id }` or `undefined` if no model preference is
|
|
197
163
|
* configured.
|
|
198
164
|
*/
|
|
199
|
-
export function resolveDefaultSessionModel(sessionProvider) {
|
|
200
|
-
const prefs = loadEffectiveGSDPreferences(
|
|
165
|
+
export function resolveDefaultSessionModel(sessionProvider, basePath) {
|
|
166
|
+
const prefs = loadEffectiveGSDPreferences(basePath, { availableModelIds: [] });
|
|
201
167
|
const models = prefs?.preferences?.models;
|
|
202
168
|
if (!models)
|
|
203
169
|
return undefined;
|
|
@@ -699,6 +699,20 @@ export function getIsolationMode(basePath) {
|
|
|
699
699
|
return "branch";
|
|
700
700
|
return "none"; // default — no isolation, work on current branch
|
|
701
701
|
}
|
|
702
|
+
/**
|
|
703
|
+
* Resolve the isolation mode a unit actually runs under. A session whose
|
|
704
|
+
* worktree isolation has degraded (worktree creation failed) falls back to
|
|
705
|
+
* the milestone branch in the project root, so configured "worktree" becomes
|
|
706
|
+
* effective "branch". A stranded-work recovery session likewise runs under
|
|
707
|
+
* the adopted mode (`strandedRecoveryIsolationMode`) rather than the
|
|
708
|
+
* configured one until the recovered milestone merges — adopting the
|
|
709
|
+
* milestone branch in the project root is intentional, not degraded.
|
|
710
|
+
*/
|
|
711
|
+
export function resolveEffectiveUnitIsolationMode(configuredMode, isolationDegraded, strandedRecoveryIsolationMode = null) {
|
|
712
|
+
if (configuredMode === "worktree" && isolationDegraded)
|
|
713
|
+
return "branch";
|
|
714
|
+
return strandedRecoveryIsolationMode ?? configuredMode;
|
|
715
|
+
}
|
|
702
716
|
export function resolveParallelConfig(prefs) {
|
|
703
717
|
return {
|
|
704
718
|
enabled: prefs?.parallel?.enabled ?? false,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Single workflow projection flush seam for mutation exits.
|
|
3
|
+
import { renderAllProjections } from "./workflow-projections.js";
|
|
4
|
+
export async function flushWorkflowProjections(basePath, scope) {
|
|
5
|
+
await renderAllProjections(basePath, scope.milestoneId);
|
|
6
|
+
return { milestoneId: scope.milestoneId };
|
|
7
|
+
}
|
|
@@ -24,7 +24,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
24
24
|
|
|
25
25
|
1. Use the inlined Slice Summary and UAT templates.
|
|
26
26
|
2. {{skillActivation}}
|
|
27
|
-
3. Run all slice-level verification through `gsd_exec` / Context Mode evidence; refresh current state if needed. Do not use direct `bash` for verification commands.
|
|
27
|
+
3. Run all slice-level verification through `gsd_exec` / Context Mode evidence; refresh current state if needed. Do not use direct `bash` for verification commands. See the prepended **Tool Surface** block for unavailable tools.
|
|
28
28
|
4. Complete only when every required check passes. If verification fails or source changes are needed, do **not** edit source files in this unit and do **not** call `gsd_slice_complete`.
|
|
29
29
|
5. If verification fails:
|
|
30
30
|
- Task-specific regressions: if the failure is in files the task touched and pre-task verification evidence shows it was absent before that task ran, call `gsd_task_reopen` with that task and reason.
|
|
@@ -36,7 +36,7 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
36
36
|
8. Address every Gate to Close. Q8 = **Operational Readiness**: health signal, failure signal, recovery, monitoring gaps. Omit empty sections.
|
|
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
|
-
11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type.
|
|
39
|
+
11. Draft concrete UAT with preconditions, steps, expected outcomes, edge cases, and UAT Type. Declare the type as a bullet under a `## UAT Type` heading, exactly like `- UAT mode: browser-executable`.
|
|
40
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.
|
|
41
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.
|
|
42
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.
|
|
@@ -49,4 +49,4 @@ Use `subagent` only when useful: reviewer, security, or tester. Apply findings b
|
|
|
49
49
|
|
|
50
50
|
**You MUST call `gsd_slice_complete` with summary and UAT content only after verification passes.**
|
|
51
51
|
|
|
52
|
-
When done, say: "Slice {{sliceId}} complete."
|
|
52
|
+
When done, say: "Slice {{sliceId}} complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
|
|
@@ -76,4 +76,4 @@ Keep about **{{verificationBudget}}** for verification and summary. If context i
|
|
|
76
76
|
|
|
77
77
|
**You MUST call `gsd_task_complete` before finishing, including when the stale-path safety rule stops execution.**
|
|
78
78
|
|
|
79
|
-
When done, say: "Task {{taskId}} complete."
|
|
79
|
+
When done, say: "Task {{taskId}} complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
|
|
@@ -118,4 +118,4 @@ If external API keys or secrets are required, use the inlined **Secrets Manifest
|
|
|
118
118
|
|
|
119
119
|
If no external API keys or secrets are required, skip this step; do not create an empty manifest.
|
|
120
120
|
|
|
121
|
-
When done, say: "Milestone {{milestoneId}} planned."
|
|
121
|
+
When done, say: "Milestone {{milestoneId}} planned." Say this exactly once — if you already said it in a prior message, do not repeat it.
|
|
@@ -45,7 +45,7 @@ If slice research is inlined, trust its architectural findings, but verify every
|
|
|
45
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.
|
|
46
46
|
7. Right-size tasks. Simple slices can be one task; split only when context, ownership, or verification boundaries justify it.
|
|
47
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.
|
|
48
|
-
9. Each task needs the exact `gsd_plan_slice.tasks[]` shape: `taskId`, `title`, `description`, `estimate`, `files`, `verify`, `inputs`, `expectedOutput`, and optional `observabilityImpact`. `description` should contain the Why / Do / Done-when narrative. `files`, `inputs`, and `expectedOutput` must be JSON arrays of strings, even when there is only one path (for example, `"inputs": ["src/index.ts"]`, never `"inputs": "src/index.ts"`). Use paths relative to `{{workingDirectory}}`; do not put absolute paths to the original checkout or any directory outside `{{workingDirectory}}` in `files`, `inputs`, `expectedOutput`, or verification commands. **`expectedOutput` must only list files the task actually creates or overwrites on disk.** Do NOT include files the task merely reads, verifies, tests, or describes — those belong in `inputs`, `verify`, `description`, or slice success criteria. If a task is a pure verification or test task that produces no new files, `expectedOutput` must be `[]`; if it writes a test-result log or assertion output file, list only that concrete file path. A file that does not yet exist on disk and is needed as an `input` must be produced by an earlier task's `expectedOutput` — if no prior task creates it, add a task before this one that does.
|
|
48
|
+
9. Each task needs the exact `gsd_plan_slice.tasks[]` shape: `taskId`, `title`, `description`, `estimate`, `files`, `verify`, `inputs`, `expectedOutput`, and optional `observabilityImpact`. `description` should contain the Why / Do / Done-when narrative. `files`, `inputs`, and `expectedOutput` must be JSON arrays of strings, even when there is only one path (for example, `"inputs": ["src/index.ts"]`, never `"inputs": "src/index.ts"`). Use paths relative to `{{workingDirectory}}`; do not put absolute paths to the original checkout or any directory outside `{{workingDirectory}}` in `files`, `inputs`, `expectedOutput`, or verification commands. **`expectedOutput` must only list files the task actually creates or overwrites on disk.** Do NOT include files the task merely reads, verifies, tests, or describes — those belong in `inputs`, `verify`, `description`, or slice success criteria. If a task is a pure verification or test task that produces no new files, `expectedOutput` must be `[]`; if it writes a test-result log or assertion output file, list only that concrete file path. A file that does not yet exist on disk and is needed as an `input` must be produced by an earlier task's `expectedOutput` — if no prior task creates it, add a task before this one that does. Never list GSD planning artifacts — anything under `.gsd/`, `.planning/`, or `.audits/`, or artifact names like `M001-CONTEXT.md` / `S01-PLAN.md` — in `inputs`, `files`, or `expectedOutput`: their content is preloaded as context, and they are written by workflow tools, not by tasks.
|
|
49
49
|
10. Persist with `gsd_plan_slice` using `milestoneId`, `sliceId`, `goal`, optional `successCriteria`/`proofLevel`/`integrationClosure`/`observabilityImpact`, and `tasks`. `gsd_plan_slice` handles task persistence transactionally and renders `{{outputPath}}` plus task plans; do not call `gsd_plan_task`. The DB-backed tool is the canonical write path. Do **not** rely on direct `PLAN.md` writes as the source of truth.
|
|
50
50
|
11. Self-audit before finishing: goal/demo closure, requirement coverage, deliverable coverage audit (cross-check every file listed in CONTEXT.md `## Scope` / `### In Scope` against task `files` or `expectedOutput`), locked decisions, concrete paths, dependency order, wiring, scope size, proof truthfulness, feature completeness, and quality gates. Quality gates: non-trivial slices/tasks include specific Q3-Q7 coverage where applicable.
|
|
51
51
|
12. If planning creates structural decisions, call `gsd_decision_save` for each; the tool persists the decision and regenerates `.gsd/DECISIONS.md`.
|
|
@@ -57,4 +57,4 @@ The slice directory already exists. Do not mkdir.
|
|
|
57
57
|
|
|
58
58
|
**You MUST call `gsd_plan_slice` to persist planning state before finishing, unless the stale-path safety rule above stops the unit before safe planning can occur.**
|
|
59
59
|
|
|
60
|
-
When done, say: "Slice {{sliceId}} planned."
|
|
60
|
+
When done, say: "Slice {{sliceId}} planned." Say this exactly once — if you already said it in a prior message, do not repeat it.
|