@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- 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 +122 -234
- 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/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- 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 +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +24 -37
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -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-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- 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/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -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/db-workspace.js +103 -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-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- 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-db.js +183 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- 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/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-eligibility.js +3 -6
- 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/parallel-orchestrator.js +3 -2
- 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-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +12 -46
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- 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 +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- 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/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/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- 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/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +14 -25
- 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/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-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +17 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- 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 +49 -21
- 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-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -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-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- 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-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- 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 +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- 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 +6 -6
- 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.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 +6 -6
- 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 +1 -1
- 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/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- 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 +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- 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 +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- 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/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/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/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- 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 +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -22
- 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 +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/models.generated.d.ts +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- 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/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/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/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/extensions/ask-user-questions.ts +87 -24
- 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/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 +148 -285
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- 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 +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- 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 +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +29 -35
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -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-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- 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/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -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/db-workspace.ts +170 -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-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- 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-db.ts +185 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- 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/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-eligibility.ts +4 -5
- 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/parallel-orchestrator.ts +6 -2
- 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-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +10 -46
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- 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 +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- 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/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/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- 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/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +19 -26
- 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/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/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-loop.test.ts +444 -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 +133 -4
- 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-runtime-state.test.ts +34 -0
- 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/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/canonical-milestone-root.test.ts +20 -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/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 +46 -8
- 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 +89 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- 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/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/guidance.test.ts +125 -0
- 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/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- 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/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- 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 +46 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- 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/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -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 +342 -1
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -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 +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- 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/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- 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 +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- 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 +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -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-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +20 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- 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 +97 -21
- 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-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -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 +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- 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-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- 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 +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// gsd-pi — A fresh conversation (/clear, /new) must clear pending auto-start.
|
|
2
|
+
//
|
|
3
|
+
// The discuss→auto handoff entry lives in-memory and is consumed on agent_end
|
|
4
|
+
// of the live interview. Once the milestone CONTEXT artifact is saved, the
|
|
5
|
+
// guided-flow staleness heuristic (which requires the CONTEXT file to be
|
|
6
|
+
// absent) can never fire — so a discussion interrupted by /clear left an
|
|
7
|
+
// immortal entry and every subsequent /gsd dead-ended on "Discussion already
|
|
8
|
+
// in progress — answer the question above" with no question above.
|
|
9
|
+
//
|
|
10
|
+
// session_switch with reason "new" means the conversation that contained the
|
|
11
|
+
// interview is gone; the entry must go with it. Reason "resume" restores the
|
|
12
|
+
// interview transcript, so the entry must survive.
|
|
13
|
+
|
|
14
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
15
|
+
import assert from "node:assert/strict";
|
|
16
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { tmpdir } from "node:os";
|
|
19
|
+
|
|
20
|
+
import { registerHooks } from "../bootstrap/register-hooks.ts";
|
|
21
|
+
import {
|
|
22
|
+
setPendingAutoStart,
|
|
23
|
+
clearPendingAutoStart,
|
|
24
|
+
_getPendingAutoStart,
|
|
25
|
+
} from "../pending-auto-start.ts";
|
|
26
|
+
|
|
27
|
+
function makeProjectDir(): string {
|
|
28
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-session-switch-pas-"));
|
|
29
|
+
const milestoneDir = join(dir, ".gsd", "milestones", "M001");
|
|
30
|
+
mkdirSync(milestoneDir, { recursive: true });
|
|
31
|
+
// The post-CONTEXT state that made the entry immortal before the fix.
|
|
32
|
+
writeFileSync(join(milestoneDir, "M001-CONTEXT.md"), "# M001 Context\n");
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function fakeCtx(base: string): any {
|
|
37
|
+
return {
|
|
38
|
+
cwd: base,
|
|
39
|
+
ui: {
|
|
40
|
+
notify: () => undefined,
|
|
41
|
+
setWidget: () => undefined,
|
|
42
|
+
setStatus: () => undefined,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function armPendingAutoStart(base: string): void {
|
|
48
|
+
setPendingAutoStart(base, {
|
|
49
|
+
basePath: base,
|
|
50
|
+
milestoneId: "M001",
|
|
51
|
+
ctx: { ui: { notify: () => undefined } } as any,
|
|
52
|
+
pi: { sendMessage: () => undefined } as any,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe("session_switch clears pending auto-start on conversation reset", () => {
|
|
57
|
+
let base: string;
|
|
58
|
+
const handlers = new Map<string, Function>();
|
|
59
|
+
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
clearPendingAutoStart();
|
|
62
|
+
base = makeProjectDir();
|
|
63
|
+
handlers.clear();
|
|
64
|
+
registerHooks({ on(event: string, handler: Function) { handlers.set(event, handler); } } as any, []);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
clearPendingAutoStart();
|
|
69
|
+
rmSync(base, { recursive: true, force: true });
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
async function fireSessionSwitch(reason: "new" | "resume"): Promise<void> {
|
|
73
|
+
const handler = handlers.get("session_switch");
|
|
74
|
+
assert.ok(handler, "session_switch handler should be registered");
|
|
75
|
+
try {
|
|
76
|
+
await handler({ type: "session_switch", reason, previousSessionFile: undefined }, fakeCtx(base));
|
|
77
|
+
} catch {
|
|
78
|
+
// The handler also performs session plumbing (MCP prep, service tier
|
|
79
|
+
// sync) that may throw against the minimal fake ctx. Pending auto-start
|
|
80
|
+
// is cleared before that plumbing runs, so the assertions below remain
|
|
81
|
+
// valid either way.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
it('reason "new" (/clear, /new) drops the entry even after CONTEXT was saved', async () => {
|
|
86
|
+
armPendingAutoStart(base);
|
|
87
|
+
assert.ok(_getPendingAutoStart(base), "entry should be armed");
|
|
88
|
+
|
|
89
|
+
await fireSessionSwitch("new");
|
|
90
|
+
|
|
91
|
+
assert.equal(
|
|
92
|
+
_getPendingAutoStart(base),
|
|
93
|
+
null,
|
|
94
|
+
"a fresh conversation destroyed the interview — the handoff entry must not outlive it",
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('reason "resume" keeps the entry (the interview transcript is restored)', async () => {
|
|
99
|
+
armPendingAutoStart(base);
|
|
100
|
+
|
|
101
|
+
await fireSessionSwitch("resume");
|
|
102
|
+
|
|
103
|
+
assert.ok(
|
|
104
|
+
_getPendingAutoStart(base),
|
|
105
|
+
"resuming restores the interview — the in-flight handoff must survive",
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -24,10 +24,24 @@ import { join, relative } from "node:path";
|
|
|
24
24
|
|
|
25
25
|
const gsdDir = join(process.cwd(), "src/resources/extensions/gsd");
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
// The single-writer invariant is enforced on a directory layer, not a single
|
|
28
|
+
// filename. Write SQL may live only in:
|
|
29
|
+
// - db/engine.ts — connection lifecycle, schema/migrations (DDL), and the
|
|
30
|
+
// BEGIN/COMMIT transaction primitives. The shared handle every writer reads.
|
|
31
|
+
// - db/writers/**.ts — the Single Writer Layer: one cohesive write subsystem
|
|
32
|
+
// per file (hierarchy, memory, gates, escalation, reconcile, manifest,
|
|
33
|
+
// legacy-import, cascades).
|
|
34
|
+
// - gsd-db.ts — the barrel that re-exports the layer (still holds wrappers
|
|
35
|
+
// mid-migration).
|
|
36
|
+
// - unit-ownership.ts — a separate .gsd/unit-claims.db, intentionally outside.
|
|
37
|
+
// db/queries.ts is explicitly NOT allowed write SQL (asserted separately below).
|
|
38
|
+
function isSingleWriterFile(rel: string): boolean {
|
|
39
|
+
const norm = rel.split("\\").join("/");
|
|
40
|
+
if (norm === "gsd-db.ts" || norm === "unit-ownership.ts") return true;
|
|
41
|
+
if (norm === "db/engine.ts") return true;
|
|
42
|
+
if (norm.startsWith("db/writers/") && norm.endsWith(".ts")) return true;
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
31
45
|
|
|
32
46
|
/** Walk the gsd extension dir and return all .ts files outside tests/. */
|
|
33
47
|
function walkTsFiles(root: string): string[] {
|
|
@@ -74,6 +88,29 @@ const PREPARE_WRITE_RE = /\.prepare\s*\(\s*[`'"][^`'"]*\b(INSERT|UPDATE|DELETE|R
|
|
|
74
88
|
|
|
75
89
|
// Match .exec("... INSERT|UPDATE|DELETE|REPLACE ...") or raw BEGIN/COMMIT/ROLLBACK.
|
|
76
90
|
const EXEC_WRITE_RE = /\.exec\s*\(\s*[`'"][^`'"]*\b(INSERT|UPDATE|DELETE|REPLACE|BEGIN|COMMIT|ROLLBACK)\b/i;
|
|
91
|
+
const DB_WORKSPACE_MECHANICS = new Set([
|
|
92
|
+
"backupDatabaseSnapshot",
|
|
93
|
+
"checkpointDatabase",
|
|
94
|
+
"closeAllDatabases",
|
|
95
|
+
"closeDatabase",
|
|
96
|
+
"closeDatabaseByWorkspace",
|
|
97
|
+
"getDbPath",
|
|
98
|
+
"getDbProvider",
|
|
99
|
+
"getDbStatus",
|
|
100
|
+
"openDatabase",
|
|
101
|
+
"openDatabaseByScope",
|
|
102
|
+
"openDatabaseByWorkspace",
|
|
103
|
+
"refreshOpenDatabaseFromDisk",
|
|
104
|
+
"vacuumDatabase",
|
|
105
|
+
"wasDbOpenAttempted",
|
|
106
|
+
]);
|
|
107
|
+
|
|
108
|
+
function importNames(specifierBlock: string): string[] {
|
|
109
|
+
return specifierBlock
|
|
110
|
+
.split(",")
|
|
111
|
+
.map((name) => name.trim().replace(/^type\s+/, "").split(/\s+as\s+/)[0]?.trim() ?? "")
|
|
112
|
+
.filter(Boolean);
|
|
113
|
+
}
|
|
77
114
|
|
|
78
115
|
test("no module outside gsd-db.ts issues raw write SQL against the engine DB", () => {
|
|
79
116
|
const files = walkTsFiles(gsdDir);
|
|
@@ -83,8 +120,7 @@ test("no module outside gsd-db.ts issues raw write SQL against the engine DB", (
|
|
|
83
120
|
|
|
84
121
|
for (const abs of files) {
|
|
85
122
|
const rel = relative(gsdDir, abs);
|
|
86
|
-
|
|
87
|
-
if (ALLOWLIST.has(base)) continue;
|
|
123
|
+
if (isSingleWriterFile(rel)) continue;
|
|
88
124
|
|
|
89
125
|
let content: string;
|
|
90
126
|
try {
|
|
@@ -131,6 +167,30 @@ test("no module outside gsd-db.ts issues raw write SQL against the engine DB", (
|
|
|
131
167
|
}
|
|
132
168
|
});
|
|
133
169
|
|
|
170
|
+
test("db/queries.ts (the Query Module) is read-only — contains no write SQL", () => {
|
|
171
|
+
// The read seam is separate from the single-writer layer. queries.ts holds
|
|
172
|
+
// SELECT-only wrappers so read-only callers depend on a read seam, not the
|
|
173
|
+
// write surface. (test 1 above also forbids this, since queries.ts is not in
|
|
174
|
+
// db/writers/ — this is the explicit, positive statement of intent.)
|
|
175
|
+
const queriesPath = join(gsdDir, "db", "queries.ts");
|
|
176
|
+
const content = readFileSync(queriesPath, "utf-8");
|
|
177
|
+
const lines = content.split("\n");
|
|
178
|
+
const violations: Violation[] = [];
|
|
179
|
+
for (let i = 0; i < lines.length; i++) {
|
|
180
|
+
const line = lines[i];
|
|
181
|
+
const m = PREPARE_WRITE_RE.exec(line) ?? EXEC_WRITE_RE.exec(line);
|
|
182
|
+
if (m) {
|
|
183
|
+
violations.push({ file: "db/queries.ts", line: i + 1, snippet: line.trim(), kind: m[1].toUpperCase() });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
assert.equal(
|
|
187
|
+
violations.length,
|
|
188
|
+
0,
|
|
189
|
+
`db/queries.ts must contain no write SQL — move write wrappers to db/writers/:\n` +
|
|
190
|
+
violations.map((v) => ` db/queries.ts:${v.line} [${v.kind}] — ${v.snippet}`).join("\n"),
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
|
|
134
194
|
test("gsd-db.ts exports the expected single-writer wrappers", async () => {
|
|
135
195
|
// Positive assertion — fail loudly if the module layout changes so this
|
|
136
196
|
// structural test can't silently become a no-op.
|
|
@@ -166,6 +226,84 @@ test("gsd-db.ts exports the expected single-writer wrappers", async () => {
|
|
|
166
226
|
}
|
|
167
227
|
});
|
|
168
228
|
|
|
229
|
+
test("DB Workspace Interface owns database open-state and maintenance calls", async () => {
|
|
230
|
+
const workspaceDb = await import("../db-workspace.js");
|
|
231
|
+
|
|
232
|
+
const expected = [
|
|
233
|
+
"backupWorkflowDatabaseSnapshot",
|
|
234
|
+
"checkpointWorkflowDatabase",
|
|
235
|
+
"closeAllWorkflowDatabases",
|
|
236
|
+
"closeWorkflowDatabase",
|
|
237
|
+
"closeWorkflowDatabaseByWorkspace",
|
|
238
|
+
"getWorkflowDatabasePath",
|
|
239
|
+
"getWorkflowDatabaseProvider",
|
|
240
|
+
"getWorkflowDatabaseStatus",
|
|
241
|
+
"isWorkflowDatabaseOpen",
|
|
242
|
+
"openExistingWorkflowDatabase",
|
|
243
|
+
"openWorkflowDatabase",
|
|
244
|
+
"openWorkflowDatabaseByScope",
|
|
245
|
+
"openWorkflowDatabaseByWorkspace",
|
|
246
|
+
"openWorkflowDatabasePath",
|
|
247
|
+
"refreshWorkflowDatabaseFromDisk",
|
|
248
|
+
"resolveProjectRootDbPath",
|
|
249
|
+
"resolveWorkflowDatabaseLocation",
|
|
250
|
+
"vacuumWorkflowDatabase",
|
|
251
|
+
"wasWorkflowDatabaseOpenAttempted",
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
for (const name of expected) {
|
|
255
|
+
assert.ok(
|
|
256
|
+
typeof (workspaceDb as Record<string, unknown>)[name] === "function",
|
|
257
|
+
`db-workspace.ts must export ${name} as a function`,
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test("production modules do not import DB open-state mechanics from gsd-db.ts", () => {
|
|
263
|
+
const files = walkTsFiles(gsdDir);
|
|
264
|
+
const violations: Violation[] = [];
|
|
265
|
+
const staticImportRe = /import\s*\{([\s\S]*?)\}\s*from\s*["'][^"']*gsd-db\.(?:js|ts)["']/g;
|
|
266
|
+
const dynamicImportRe = /(?:const|let)\s*\{([\s\S]*?)\}\s*=\s*await\s+import\(["'][^"']*gsd-db\.(?:js|ts)["']\)/g;
|
|
267
|
+
|
|
268
|
+
for (const abs of files) {
|
|
269
|
+
const rel = relative(gsdDir, abs);
|
|
270
|
+
if (rel === "gsd-db.ts" || rel === "db-workspace.ts") continue;
|
|
271
|
+
|
|
272
|
+
let content: string;
|
|
273
|
+
try {
|
|
274
|
+
content = readFileSync(abs, "utf-8");
|
|
275
|
+
} catch {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
for (const re of [staticImportRe, dynamicImportRe]) {
|
|
280
|
+
re.lastIndex = 0;
|
|
281
|
+
let match: RegExpExecArray | null;
|
|
282
|
+
while ((match = re.exec(content)) !== null) {
|
|
283
|
+
const leaked = importNames(match[1] ?? "").filter((name) => DB_WORKSPACE_MECHANICS.has(name));
|
|
284
|
+
if (leaked.length === 0) continue;
|
|
285
|
+
violations.push({
|
|
286
|
+
file: rel,
|
|
287
|
+
line: content.slice(0, match.index).split("\n").length,
|
|
288
|
+
snippet: leaked.join(", "),
|
|
289
|
+
kind: "db-workspace-leak",
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (violations.length > 0) {
|
|
296
|
+
const lines = violations.map(
|
|
297
|
+
(v) => ` ${v.file}:${v.line} [${v.kind}] — ${v.snippet}`,
|
|
298
|
+
);
|
|
299
|
+
assert.fail(
|
|
300
|
+
`Found ${violations.length} DB open-state import(s) from gsd-db.ts:\n` +
|
|
301
|
+
lines.join("\n") +
|
|
302
|
+
"\n\nImport these through db-workspace.ts so gsd-db.ts stays the single-writer implementation, not the caller-facing DB Workspace Interface.",
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
|
|
169
307
|
test("the invariant test touches every .ts module under gsd/ (sanity check)", () => {
|
|
170
308
|
const files = walkTsFiles(gsdDir);
|
|
171
309
|
// Rough sanity: ensure we're not accidentally walking an empty tree
|
|
@@ -177,4 +315,3 @@ test("the invariant test touches every .ts module under gsd/ (sanity check)", ()
|
|
|
177
315
|
assert.ok(rels.includes("memory-store.ts"), "walker must include memory-store.ts");
|
|
178
316
|
assert.ok(rels.includes("workflow-manifest.ts"), "walker must include workflow-manifest.ts");
|
|
179
317
|
});
|
|
180
|
-
|
|
@@ -74,6 +74,33 @@ describe("stale queued milestone selection (#3470)", () => {
|
|
|
74
74
|
assert.equal(m070Entry!.status, "active", "M070 should be active in registry");
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
+
test("queued milestone with roadmap projection but no DB slices stays deferred", async () => {
|
|
78
|
+
base = createFixtureBase();
|
|
79
|
+
openDatabase(":memory:");
|
|
80
|
+
|
|
81
|
+
// M068: queued shell with a stale ROADMAP projection, but no CONTEXT and no DB slices.
|
|
82
|
+
insertMilestone({ id: "M068", title: "Queued Roadmap Projection", status: "queued" });
|
|
83
|
+
writeFile(base, "milestones/M068/M068-ROADMAP.md", "# M068\n\n## Slices\n\n- [ ] **S99: Stale Slice**");
|
|
84
|
+
|
|
85
|
+
// M070: real active milestone — context, roadmap, slices, tasks
|
|
86
|
+
insertMilestone({ id: "M070", title: "Real Active", status: "active" });
|
|
87
|
+
insertSlice({ id: "S01", milestoneId: "M070", title: "Slice One", status: "active", risk: "low", depends: [] });
|
|
88
|
+
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M070", title: "Task One", status: "pending" });
|
|
89
|
+
|
|
90
|
+
writeFile(base, "milestones/M070/M070-CONTEXT.md", "# M070: Real Active\n\nThis is the real milestone.");
|
|
91
|
+
writeFile(base, "milestones/M070/M070-ROADMAP.md", "# M070: Real Active\n\n## Slices\n\n- [ ] **S01: Slice One**");
|
|
92
|
+
writeFile(base, "milestones/M070/slices/S01/S01-PLAN.md", "# S01: Slice One\n\n## Tasks\n\n- [ ] **T01: Task One**");
|
|
93
|
+
|
|
94
|
+
invalidateStateCache();
|
|
95
|
+
const state = await deriveStateFromDb(base);
|
|
96
|
+
|
|
97
|
+
assert.equal(state.activeMilestone?.id, "M070", "ROADMAP-only queued milestone must not block active M070");
|
|
98
|
+
|
|
99
|
+
const m068Entry = state.registry.find((e: any) => e.id === "M068");
|
|
100
|
+
assert.ok(m068Entry, "M068 should still appear in registry");
|
|
101
|
+
assert.equal(m068Entry!.status, "pending", "M068 should stay pending without CONTEXT or DB slices");
|
|
102
|
+
});
|
|
103
|
+
|
|
77
104
|
test("queued milestone WITH context file can still be selected as active", async () => {
|
|
78
105
|
base = createFixtureBase();
|
|
79
106
|
openDatabase(":memory:");
|
|
@@ -364,6 +364,7 @@ test("effective unit isolation follows degraded branch fallback", () => {
|
|
|
364
364
|
|
|
365
365
|
test("discuss-to-auto handoff defaults to step mode unless explicitly disabled", () => {
|
|
366
366
|
const guidedFlowSrc = readGsdFile("guided-flow.ts");
|
|
367
|
+
const discussionHandoffSrc = readGsdFile("discussion-handoff.ts");
|
|
367
368
|
const workflowSrc = readGsdFile("commands/handlers/workflow.ts");
|
|
368
369
|
|
|
369
370
|
assert.ok(
|
|
@@ -371,7 +372,7 @@ test("discuss-to-auto handoff defaults to step mode unless explicitly disabled",
|
|
|
371
372
|
"guided-flow must not hardcode step: false on pending auto-start entries",
|
|
372
373
|
);
|
|
373
374
|
assert.match(
|
|
374
|
-
|
|
375
|
+
discussionHandoffSrc,
|
|
375
376
|
/scheduleAutoStartAfterIdle\(ctx, pi, basePath, false, \{ step: step \?\? true \}\)/,
|
|
376
377
|
"checkAutoStartAfterDiscuss should default missing step flags to step mode",
|
|
377
378
|
);
|
|
@@ -5,6 +5,8 @@ import {
|
|
|
5
5
|
STATE_TRANSITION_MATRIX,
|
|
6
6
|
findTransition,
|
|
7
7
|
validateTransitionMatrix,
|
|
8
|
+
isLegalEdge,
|
|
9
|
+
IllegalPhaseTransitionError,
|
|
8
10
|
} from "../state-transition-matrix.ts";
|
|
9
11
|
|
|
10
12
|
test("state transition matrix covers required swarm hardening events", () => {
|
|
@@ -42,3 +44,37 @@ test("state transition matrix entries all have guard and reason codes", () => {
|
|
|
42
44
|
assert.ok(entry.reasonCode.length > 0, `${entry.event} must include reason code`);
|
|
43
45
|
}
|
|
44
46
|
});
|
|
47
|
+
|
|
48
|
+
// ─── ADR-030: Phase Transition Invariant ───────────────────────────────────
|
|
49
|
+
|
|
50
|
+
test("isLegalEdge treats a self-edge as trivially legal", () => {
|
|
51
|
+
assert.equal(isLegalEdge("executing", "executing"), true);
|
|
52
|
+
assert.equal(isLegalEdge("planning", "planning"), true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("isLegalEdge accepts edges enumerated in the matrix", () => {
|
|
56
|
+
assert.equal(isLegalEdge("planning", "executing"), true);
|
|
57
|
+
assert.equal(isLegalEdge("executing", "summarizing"), true);
|
|
58
|
+
assert.equal(isLegalEdge("summarizing", "validating-milestone"), true);
|
|
59
|
+
assert.equal(isLegalEdge("completing-milestone", "complete"), true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("isLegalEdge honors the * wildcard rows (any -> blocked, any -> executing)", () => {
|
|
63
|
+
assert.equal(isLegalEdge("planning", "blocked"), true);
|
|
64
|
+
assert.equal(isLegalEdge("summarizing", "executing"), true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("isLegalEdge rejects an edge no matrix entry permits", () => {
|
|
68
|
+
// executing -> complete skips validation — exactly the illegal jump the
|
|
69
|
+
// invariant exists to catch.
|
|
70
|
+
assert.equal(isLegalEdge("executing", "complete"), false);
|
|
71
|
+
assert.equal(isLegalEdge("planning", "summarizing"), false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("IllegalPhaseTransitionError carries both endpoints and a descriptive message", () => {
|
|
75
|
+
const err = new IllegalPhaseTransitionError("executing", "complete");
|
|
76
|
+
assert.equal(err.from, "executing");
|
|
77
|
+
assert.equal(err.to, "complete");
|
|
78
|
+
assert.equal(err.name, "IllegalPhaseTransitionError");
|
|
79
|
+
assert.match(err.message, /executing -> complete/);
|
|
80
|
+
});
|
|
@@ -9,7 +9,10 @@ import {
|
|
|
9
9
|
isDeferredStatus,
|
|
10
10
|
isInactiveStatus,
|
|
11
11
|
isSkippedForDispatch,
|
|
12
|
+
toStatus,
|
|
13
|
+
RAW_CLOSED_STATUSES,
|
|
12
14
|
} from '../status-guards.ts';
|
|
15
|
+
import { TERMINAL_STATUS_SQL } from '../db/sql-constants.ts';
|
|
13
16
|
|
|
14
17
|
test('isClosedStatus: "complete" returns true', () => {
|
|
15
18
|
assert.equal(isClosedStatus('complete'), true);
|
|
@@ -95,3 +98,38 @@ test('isSkippedForDispatch does NOT skip pending/active/planned', () => {
|
|
|
95
98
|
assert.equal(isSkippedForDispatch(s), false, `${s} should block dispatch ordering`);
|
|
96
99
|
}
|
|
97
100
|
});
|
|
101
|
+
|
|
102
|
+
// ─── ADR-030: canonical Status vocabulary + normalization ──────────────────
|
|
103
|
+
|
|
104
|
+
test('toStatus passes canonical values through unchanged', () => {
|
|
105
|
+
for (const s of ['pending', 'queued', 'active', 'parked', 'in_progress', 'blocked', 'complete', 'skipped', 'deferred']) {
|
|
106
|
+
assert.equal(toStatus(s), s, `${s} is canonical and should be returned verbatim`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('toStatus maps known aliases to canonical', () => {
|
|
111
|
+
assert.equal(toStatus('done'), 'complete');
|
|
112
|
+
assert.equal(toStatus('closed'), 'complete');
|
|
113
|
+
assert.equal(toStatus('planned'), 'pending');
|
|
114
|
+
assert.equal(toStatus('in-progress'), 'in_progress');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('toStatus trims surrounding whitespace before matching', () => {
|
|
118
|
+
assert.equal(toStatus(' complete '), 'complete');
|
|
119
|
+
assert.equal(toStatus(' done '), 'complete');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('toStatus quarantines unknown values verbatim (tolerant read, no throw)', () => {
|
|
123
|
+
assert.equal(toStatus('weird-legacy-value'), 'weird-legacy-value');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('RAW_CLOSED_STATUSES is the single source: every member is closed', () => {
|
|
127
|
+
for (const s of RAW_CLOSED_STATUSES) {
|
|
128
|
+
assert.equal(isClosedStatus(s), true, `${s} is in RAW_CLOSED_STATUSES so must be closed`);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('TERMINAL_STATUS_SQL is derived from RAW_CLOSED_STATUSES and renders identically', () => {
|
|
133
|
+
assert.equal(TERMINAL_STATUS_SQL, "'complete', 'done', 'skipped', 'closed'");
|
|
134
|
+
assert.equal(TERMINAL_STATUS_SQL, RAW_CLOSED_STATUSES.map((s) => `'${s}'`).join(', '));
|
|
135
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// GSD Extension — Stop Notice module tests
|
|
2
|
+
// Locks the emitter↔detector round-trip: every notice the formatters produce
|
|
3
|
+
// must be recognized by the classifiers the headless host uses for exit codes.
|
|
4
|
+
|
|
5
|
+
import { describe, test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
formatStopNoticePrefix,
|
|
10
|
+
isBlockedStopReason,
|
|
11
|
+
stopNoticeDisplayReason,
|
|
12
|
+
stopNoticeKind,
|
|
13
|
+
isTerminalNotice,
|
|
14
|
+
isPauseNotice,
|
|
15
|
+
isBlockedNoticeMessage,
|
|
16
|
+
isManualResolutionNotice,
|
|
17
|
+
PAUSED_NOTICE_PREFIXES,
|
|
18
|
+
TERMINAL_NOTICE_PREFIXES,
|
|
19
|
+
} from "../stop-notice.js";
|
|
20
|
+
|
|
21
|
+
describe("stop notice formatting", () => {
|
|
22
|
+
test("plain stop has no reason suffix", () => {
|
|
23
|
+
assert.equal(formatStopNoticePrefix(), "Auto-mode stopped");
|
|
24
|
+
assert.equal(formatStopNoticePrefix(null), "Auto-mode stopped");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("reason is appended after an em-dash", () => {
|
|
28
|
+
assert.equal(formatStopNoticePrefix("user request"), "Auto-mode stopped — user request");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("Blocked: marker switches the prefix and is stripped from display", () => {
|
|
32
|
+
assert.equal(formatStopNoticePrefix("Blocked: validation gate"), "Auto-mode blocked — validation gate");
|
|
33
|
+
assert.equal(stopNoticeKind("Blocked: x"), "blocked");
|
|
34
|
+
assert.equal(stopNoticeKind("stop"), "stopped");
|
|
35
|
+
assert.ok(isBlockedStopReason("blocked: lowercase too"));
|
|
36
|
+
assert.equal(stopNoticeDisplayReason("Blocked: spaced "), "spaced");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("emitter↔detector round-trip", () => {
|
|
41
|
+
test("formatted stop notices classify as terminal", () => {
|
|
42
|
+
for (const reason of [undefined, "user request"]) {
|
|
43
|
+
const message = formatStopNoticePrefix(reason).toLowerCase();
|
|
44
|
+
assert.ok(isTerminalNotice(message), `not terminal: ${message}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("pause prefixes classify as pause and as blocked (operator intervention)", () => {
|
|
49
|
+
for (const prefix of PAUSED_NOTICE_PREFIXES) {
|
|
50
|
+
assert.ok(isPauseNotice(`${prefix}: provider error`));
|
|
51
|
+
assert.ok(isBlockedNoticeMessage(`${prefix}: provider error`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("idempotent-advance pauses are non-blocking", () => {
|
|
56
|
+
assert.equal(isBlockedNoticeMessage("auto-mode paused (idempotent advance: unit already active)"), false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("manual-resolution notices classify as blocked", () => {
|
|
60
|
+
const message = "merge conflict — resolve manually and re-run /gsd auto";
|
|
61
|
+
assert.ok(isManualResolutionNotice(message));
|
|
62
|
+
assert.ok(isBlockedNoticeMessage(message));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("terminal prefixes cover the known stop vocabulary", () => {
|
|
66
|
+
for (const message of ["auto-mode stopped.", "auto-mode complete", "auto-mode idle", "no active milestone"]) {
|
|
67
|
+
assert.ok(TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix)), message);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -10,6 +10,7 @@ import { DISCUSS_TOOLS_ALLOWLIST } from "../constants.ts";
|
|
|
10
10
|
import { buildMinimalAutoGsdToolSet, buildMinimalGsdToolSet, buildMinimalGsdWorkflowToolSet, buildRequestScopedGsdToolSet, MINIMAL_AUTO_BASE_TOOL_NAMES, MINIMAL_GSD_TOOL_NAMES, requestHasGsdCustomType, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "../bootstrap/register-hooks.ts";
|
|
11
11
|
import { filterToolsForProvider } from "../model-router.ts";
|
|
12
12
|
import { applyUnitSkillVisibility } from "../skill-scope.ts";
|
|
13
|
+
import { drainLogs } from "../workflow-logger.ts";
|
|
13
14
|
|
|
14
15
|
test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surface", () => {
|
|
15
16
|
const result = buildMinimalGsdToolSet([
|
|
@@ -103,6 +104,40 @@ test("buildMinimalAutoGsdToolSet keeps unit-specific completion tools without al
|
|
|
103
104
|
assert.ok(!result.includes("gsd_complete_slice"));
|
|
104
105
|
});
|
|
105
106
|
|
|
107
|
+
test("buildMinimalAutoGsdToolSet warns when plan-milestone required tools are unresolved", () => {
|
|
108
|
+
drainLogs();
|
|
109
|
+
const result = buildMinimalAutoGsdToolSet(
|
|
110
|
+
[
|
|
111
|
+
"ask_user_questions",
|
|
112
|
+
"bash",
|
|
113
|
+
"read",
|
|
114
|
+
"gsd_milestone_status",
|
|
115
|
+
"gsd_plan_milestone",
|
|
116
|
+
],
|
|
117
|
+
"plan-milestone",
|
|
118
|
+
[
|
|
119
|
+
"ask_user_questions",
|
|
120
|
+
"bash",
|
|
121
|
+
"read",
|
|
122
|
+
"gsd_milestone_status",
|
|
123
|
+
"gsd_plan_milestone",
|
|
124
|
+
],
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
assert.ok(result.includes("gsd_plan_milestone"));
|
|
128
|
+
assert.ok(!result.includes("gsd_plan_slice"));
|
|
129
|
+
|
|
130
|
+
const logs = drainLogs();
|
|
131
|
+
assert.ok(
|
|
132
|
+
logs.some((entry) =>
|
|
133
|
+
entry.component === "bootstrap" &&
|
|
134
|
+
entry.message.includes("buildMinimalAutoGsdToolSet(plan-milestone)") &&
|
|
135
|
+
entry.message.includes("gsd_plan_slice")
|
|
136
|
+
),
|
|
137
|
+
`expected missing gsd_plan_slice bootstrap warning, got ${JSON.stringify(logs)}`,
|
|
138
|
+
);
|
|
139
|
+
});
|
|
140
|
+
|
|
106
141
|
test("buildMinimalAutoGsdToolSet scopes run-uat to UAT-specific and read-only tools", () => {
|
|
107
142
|
const active = ["ask_user_questions", "bash", "read", "edit", "write", "gsd_summary_save"];
|
|
108
143
|
const registered = [
|
|
@@ -141,6 +141,41 @@ for (const customType of ["gsd-discuss", "gsd-run"] as const) {
|
|
|
141
141
|
});
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
for (const unitType of ["execute-task", "execute-task-simple", "reactive-execute"] as const) {
|
|
145
|
+
test(`${unitType}: resolves gsd_task_complete via alias gsd_complete_task when only alias is registered`, () => {
|
|
146
|
+
// Simulates the MCP transport registering gsd_complete_task (alias) instead of gsd_task_complete.
|
|
147
|
+
// adjust_tool_set strips aliases from providerCompatible, so gsd_complete_task is only present
|
|
148
|
+
// in registeredToolNames. resolveScopedToolNames must still surface it so the agent can complete tasks.
|
|
149
|
+
const base: string[] = [...FULL_REGISTERED_TOOLS];
|
|
150
|
+
const aliasOnlyRegistered = base
|
|
151
|
+
.filter((name) => name !== "gsd_task_complete")
|
|
152
|
+
.concat("gsd_complete_task");
|
|
153
|
+
const aliasStrippedActive = aliasOnlyRegistered.filter((name) => name !== "gsd_complete_task");
|
|
154
|
+
|
|
155
|
+
const result = buildMinimalAutoGsdToolSet(aliasStrippedActive, unitType, aliasOnlyRegistered);
|
|
156
|
+
|
|
157
|
+
assert.ok(
|
|
158
|
+
result.includes("gsd_task_complete") || result.includes("gsd_complete_task"),
|
|
159
|
+
`${unitType} missing gsd_task_complete / gsd_complete_task — agent cannot complete tasks`,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test(`${unitType}: alias does not duplicate canonical when both are in the active set`, () => {
|
|
164
|
+
// When both canonical and alias are registered/active, only the canonical should be surfaced.
|
|
165
|
+
const bothPresent: string[] = [...FULL_REGISTERED_TOOLS, "gsd_complete_task"];
|
|
166
|
+
|
|
167
|
+
const result = buildMinimalAutoGsdToolSet(bothPresent, unitType, bothPresent);
|
|
168
|
+
|
|
169
|
+
const hasCanonical = result.includes("gsd_task_complete");
|
|
170
|
+
const hasAlias = result.includes("gsd_complete_task");
|
|
171
|
+
assert.ok(hasCanonical || hasAlias, `${unitType} missing completion tool`);
|
|
172
|
+
assert.ok(
|
|
173
|
+
!(hasCanonical && hasAlias),
|
|
174
|
+
`${unitType} surfaces both gsd_task_complete and gsd_complete_task — alias should not duplicate canonical`,
|
|
175
|
+
);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
144
179
|
test("discuss-milestone two-stage scoping matches adjust_tool_set request scope", () => {
|
|
145
180
|
const activeTools = simulateDiscussAllowlistFilter(FULL_REGISTERED_TOOLS);
|
|
146
181
|
const dispatchScoped = buildMinimalAutoGsdToolSet(
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
isDeterministicPolicyError,
|
|
49
49
|
isPendingUserApprovalGateError,
|
|
50
50
|
isToolInvocationError,
|
|
51
|
+
isToolUnavailableError,
|
|
51
52
|
isQueuedUserMessageSkip,
|
|
52
53
|
} from "../auto-tool-tracking.ts";
|
|
53
54
|
import {
|
|
@@ -121,6 +122,13 @@ describe("#2883: isToolInvocationError classification", () => {
|
|
|
121
122
|
assert.equal(isToolInvocationError("No such tool available: mcp__gsd-workflow__memory_query"), true);
|
|
122
123
|
});
|
|
123
124
|
|
|
125
|
+
test("isToolUnavailableError singles out the startup-race error as transient", () => {
|
|
126
|
+
assert.equal(isToolUnavailableError("No such tool available: mcp__gsd-workflow__gsd_uat_exec"), true);
|
|
127
|
+
assert.equal(isToolUnavailableError("Validation failed for tool gsd_complete_slice"), false);
|
|
128
|
+
assert.equal(isToolUnavailableError("Unexpected end of JSON input"), false);
|
|
129
|
+
assert.equal(isToolUnavailableError(""), false);
|
|
130
|
+
});
|
|
131
|
+
|
|
124
132
|
test("detects ESM export-link errors", () => {
|
|
125
133
|
assert.equal(
|
|
126
134
|
isToolInvocationError("The requested module '../paths.js' does not provide an export named 'gsdProjectionRoot'"),
|