@opengsd/gsd-pi 1.8.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/dist/cli.js +5 -1
- package/dist/headless-events.d.ts +2 -1
- package/dist/headless-events.js +11 -3
- package/dist/headless-milestone-readiness.d.ts +29 -0
- package/dist/headless-milestone-readiness.js +161 -0
- package/dist/headless.js +25 -2
- package/dist/print-mode-exit.d.ts +12 -0
- package/dist/print-mode-exit.js +14 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +16 -47
- package/dist/resources/extensions/browser-tools/capture.js +2 -77
- package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +35 -1
- package/dist/resources/extensions/gsd/auto.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +78 -4
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +84 -26
- package/dist/resources/extensions/gsd/command-feedback.js +16 -12
- package/dist/resources/extensions/gsd/compat/compat-marker.js +19 -2
- package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +51 -16
- package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
- package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
- package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +4 -4
- package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
- package/dist/resources/extensions/gsd/gsd-db.js +187 -45
- package/dist/resources/extensions/gsd/guided-flow.js +29 -10
- package/dist/resources/extensions/gsd/markdown-renderer.js +16 -2
- package/dist/resources/extensions/gsd/md-importer.js +102 -14
- package/dist/resources/extensions/gsd/migrate/command.js +19 -162
- package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
- package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
- package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
- package/dist/resources/extensions/gsd/paths.js +4 -1
- package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
- package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +27 -13
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
- package/dist/resources/extensions/gsd/stop-notice.js +15 -1
- package/dist/resources/extensions/gsd/sync-lock.js +13 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +82 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
- package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
- package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
- package/dist/resources/extensions/gsd/unit-registry.js +4 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
- package/dist/resources/extensions/gsd/worktree-state-projection.js +6 -0
- package/dist/resources/extensions/mac-tools/index.js +31 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/package.json +0 -1
- package/dist/web-mode.js +31 -3
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +12 -10
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -1
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +5 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/cloud-config.test.js +51 -1
- package/packages/daemon/dist/cloud-config.test.js.map +1 -1
- package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
- package/packages/daemon/dist/local-tool-executor.js +2 -0
- package/packages/daemon/dist/local-tool-executor.js.map +1 -1
- package/packages/daemon/package.json +6 -6
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/dist/cli.d.ts +5 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cli.js +160 -0
- package/packages/gsd-cloud/dist/cli.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.js +231 -0
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +35 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js +258 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.js +37 -0
- package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
- package/packages/gsd-cloud/dist/config.d.ts +17 -0
- package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/config.js +146 -0
- package/packages/gsd-cloud/dist/config.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.js +128 -0
- package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
- package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.js +11 -0
- package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.js +29 -0
- package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
- package/packages/gsd-cloud/dist/index.d.ts +7 -0
- package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/index.js +8 -0
- package/packages/gsd-cloud/dist/index.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
- package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
- package/packages/gsd-cloud/dist/logger.d.ts +25 -0
- package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/logger.js +72 -0
- package/packages/gsd-cloud/dist/logger.js.map +1 -0
- package/packages/gsd-cloud/dist/types.d.ts +51 -0
- package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/types.js +9 -0
- package/packages/gsd-cloud/dist/types.js.map +1 -0
- package/packages/gsd-cloud/package.json +3 -3
- package/packages/mcp-server/README.md +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +64 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +60 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +54 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +19 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- 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 +16 -47
- package/src/resources/extensions/browser-tools/capture.ts +2 -86
- package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +38 -1
- package/src/resources/extensions/gsd/auto.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +91 -4
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -24
- package/src/resources/extensions/gsd/command-feedback.ts +19 -12
- package/src/resources/extensions/gsd/compat/compat-marker.ts +21 -4
- package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +53 -17
- package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
- package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
- package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +4 -4
- package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
- package/src/resources/extensions/gsd/gsd-db.ts +255 -52
- package/src/resources/extensions/gsd/guided-flow.ts +39 -10
- package/src/resources/extensions/gsd/markdown-renderer.ts +23 -7
- package/src/resources/extensions/gsd/md-importer.ts +109 -11
- package/src/resources/extensions/gsd/migrate/command.ts +21 -227
- package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
- package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
- package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
- package/src/resources/extensions/gsd/paths.ts +4 -1
- package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +30 -13
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
- package/src/resources/extensions/gsd/stop-notice.ts +18 -1
- package/src/resources/extensions/gsd/sync-lock.ts +14 -6
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +286 -0
- package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +120 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
- package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
- package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
- package/src/resources/extensions/gsd/types.ts +11 -0
- package/src/resources/extensions/gsd/unit-registry.ts +4 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
- package/src/resources/extensions/gsd/worktree-state-projection.ts +12 -0
- package/src/resources/extensions/mac-tools/index.ts +52 -9
- package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
- package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → BE5XoklToI6lZjRzpXih8}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → BE5XoklToI6lZjRzpXih8}/_ssgManifest.js +0 -0
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
} from "./db-decision-requirement-rows.js";
|
|
42
42
|
import { rowToGate } from "./db-gate-rows.js";
|
|
43
43
|
import { rowToArtifact, rowToMilestone, type ArtifactRow, type MilestoneRow } from "./db-milestone-artifact-rows.js";
|
|
44
|
-
import { isClosedStatus } from "./status-guards.js";
|
|
44
|
+
import { isClosedStatus, toStatus } from "./status-guards.js";
|
|
45
45
|
import { rowToSlice, rowToTask, type SliceRow, type TaskRow } from "./db-task-slice-rows.js";
|
|
46
46
|
|
|
47
47
|
// Connection ownership, lifecycle, schema/migrations and transaction
|
|
@@ -464,6 +464,11 @@ export function insertTask(t: {
|
|
|
464
464
|
preserveCompletionMetadata?: boolean;
|
|
465
465
|
}): void {
|
|
466
466
|
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
467
|
+
// Stamp completed_at for every terminal-complete alias (complete/done/closed),
|
|
468
|
+
// not just two literals — a task imported as "closed" is completed and must
|
|
469
|
+
// carry a timestamp. NOT for "skipped": a skipped task was never completed
|
|
470
|
+
// (cascade writers set its completed_at = NULL).
|
|
471
|
+
const isCompleteAlias = t.status != null && toStatus(t.status) === "complete";
|
|
467
472
|
getDbOrNull()!.prepare(
|
|
468
473
|
`INSERT INTO tasks (
|
|
469
474
|
milestone_id, slice_id, id, title, status, one_liner, narrative,
|
|
@@ -515,7 +520,7 @@ export function insertTask(t: {
|
|
|
515
520
|
":narrative": t.narrative ?? "",
|
|
516
521
|
":verification_result": t.verificationResult ?? "",
|
|
517
522
|
":duration": t.duration ?? "",
|
|
518
|
-
":completed_at":
|
|
523
|
+
":completed_at": isCompleteAlias ? new Date().toISOString() : null,
|
|
519
524
|
":blocker_discovered": t.blockerDiscovered ? 1 : 0,
|
|
520
525
|
":deviations": t.deviations ?? "",
|
|
521
526
|
":known_issues": t.knownIssues ?? "",
|
|
@@ -531,7 +536,7 @@ export function insertTask(t: {
|
|
|
531
536
|
":observability_impact": t.planning?.observabilityImpact ?? "",
|
|
532
537
|
":full_plan_md": t.planning?.fullPlanMd ?? "",
|
|
533
538
|
":sequence": t.sequence ?? 0,
|
|
534
|
-
":preserve_completion": t.preserveCompletionMetadata &&
|
|
539
|
+
":preserve_completion": t.preserveCompletionMetadata && isCompleteAlias ? 1 : 0,
|
|
535
540
|
":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
|
|
536
541
|
":raw_target_repositories":
|
|
537
542
|
t.planning && "targetRepositories" in t.planning
|
|
@@ -656,8 +661,8 @@ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId:
|
|
|
656
661
|
}
|
|
657
662
|
|
|
658
663
|
|
|
659
|
-
export function updateSliceStatus(milestoneId: string, sliceId: string, status: string, completedAt?: string): void {
|
|
660
|
-
applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt });
|
|
664
|
+
export function updateSliceStatus(milestoneId: string, sliceId: string, status: string, completedAt?: string, preserveCompletion?: boolean): void {
|
|
665
|
+
applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt, preserveCompletion });
|
|
661
666
|
}
|
|
662
667
|
|
|
663
668
|
export function setTaskSummaryMd(milestoneId: string, sliceId: string, taskId: string, md: string): void {
|
|
@@ -820,8 +825,8 @@ function writeMilestoneStatus(milestoneId: string, status: string, completedAt?:
|
|
|
820
825
|
* advance planned milestones. They may not reopen a closed milestone; callers
|
|
821
826
|
* must use reopenMilestoneStatus(), which is reserved for gsd_milestone_reopen.
|
|
822
827
|
*/
|
|
823
|
-
export function updateMilestoneStatus(milestoneId: string, status: string, completedAt?: string | null): void {
|
|
824
|
-
applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt });
|
|
828
|
+
export function updateMilestoneStatus(milestoneId: string, status: string, completedAt?: string | null, preserveCompletion?: boolean): void {
|
|
829
|
+
applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt, preserveCompletion });
|
|
825
830
|
}
|
|
826
831
|
|
|
827
832
|
/**
|
|
@@ -893,6 +898,188 @@ export function insertReplanHistory(entry: {
|
|
|
893
898
|
});
|
|
894
899
|
}
|
|
895
900
|
|
|
901
|
+
|
|
902
|
+
export type ReworkFindingSeverity = "blocking" | "advisory";
|
|
903
|
+
export type ReworkFindingStatus = "pending" | "resolved" | "deferred-with-override";
|
|
904
|
+
|
|
905
|
+
export interface ReworkBriefFindingInput {
|
|
906
|
+
findingId: string;
|
|
907
|
+
severity: ReworkFindingSeverity;
|
|
908
|
+
description: string;
|
|
909
|
+
requiredFix: string;
|
|
910
|
+
verificationCommands: string[];
|
|
911
|
+
status?: ReworkFindingStatus;
|
|
912
|
+
evidence?: string;
|
|
913
|
+
decisionRef?: string;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
export interface ReworkBriefFindingRow {
|
|
917
|
+
brief_id: string;
|
|
918
|
+
finding_id: string;
|
|
919
|
+
severity: ReworkFindingSeverity;
|
|
920
|
+
description: string;
|
|
921
|
+
required_fix: string;
|
|
922
|
+
verification_commands: string[];
|
|
923
|
+
status: ReworkFindingStatus;
|
|
924
|
+
evidence: string;
|
|
925
|
+
decision_ref: string;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
function reworkBriefIdFromTask(milestoneId: string, sliceId: string, taskId: string): string {
|
|
929
|
+
return `RB-${milestoneId}-${sliceId}-${taskId}`;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
function normalizeReworkStatus(status: unknown): ReworkFindingStatus {
|
|
933
|
+
const normalized = String(status ?? "pending");
|
|
934
|
+
if (normalized === "resolved" || normalized === "deferred-with-override") {
|
|
935
|
+
return normalized;
|
|
936
|
+
}
|
|
937
|
+
return "pending";
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
function rowToReworkFinding(row: Record<string, unknown>): ReworkBriefFindingRow {
|
|
941
|
+
let verificationCommands: string[] = [];
|
|
942
|
+
try {
|
|
943
|
+
const parsed = JSON.parse(String(row["verification_commands"] ?? "[]"));
|
|
944
|
+
verificationCommands = Array.isArray(parsed) ? parsed.map(String) : [];
|
|
945
|
+
} catch {
|
|
946
|
+
verificationCommands = [];
|
|
947
|
+
}
|
|
948
|
+
return {
|
|
949
|
+
brief_id: String(row["brief_id"] ?? ""),
|
|
950
|
+
finding_id: String(row["finding_id"] ?? ""),
|
|
951
|
+
severity: String(row["severity"] ?? "blocking") === "advisory" ? "advisory" : "blocking",
|
|
952
|
+
description: String(row["description"] ?? ""),
|
|
953
|
+
required_fix: String(row["required_fix"] ?? ""),
|
|
954
|
+
verification_commands: verificationCommands,
|
|
955
|
+
status: normalizeReworkStatus(row["status"]),
|
|
956
|
+
evidence: String(row["evidence"] ?? ""),
|
|
957
|
+
decision_ref: String(row["decision_ref"] ?? ""),
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
export function saveReworkBrief(entry: {
|
|
962
|
+
briefId?: string;
|
|
963
|
+
milestoneId: string;
|
|
964
|
+
sliceId: string;
|
|
965
|
+
taskId: string;
|
|
966
|
+
findings: ReworkBriefFindingInput[];
|
|
967
|
+
}): { briefId: string } {
|
|
968
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
969
|
+
const briefId = entry.briefId?.trim() || reworkBriefIdFromTask(entry.milestoneId, entry.sliceId, entry.taskId);
|
|
970
|
+
const now = new Date().toISOString();
|
|
971
|
+
transaction(() => {
|
|
972
|
+
getDbOrNull()!.prepare(
|
|
973
|
+
`INSERT INTO rework_briefs (id, milestone_id, slice_id, task_id, created_at, updated_at)
|
|
974
|
+
VALUES (:id, :mid, :sid, :tid, :created_at, :updated_at)
|
|
975
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
976
|
+
milestone_id = :mid,
|
|
977
|
+
slice_id = :sid,
|
|
978
|
+
task_id = :tid,
|
|
979
|
+
updated_at = :updated_at`,
|
|
980
|
+
).run({
|
|
981
|
+
":id": briefId,
|
|
982
|
+
":mid": entry.milestoneId,
|
|
983
|
+
":sid": entry.sliceId,
|
|
984
|
+
":tid": entry.taskId,
|
|
985
|
+
":created_at": now,
|
|
986
|
+
":updated_at": now,
|
|
987
|
+
});
|
|
988
|
+
getDbOrNull()!.prepare("DELETE FROM rework_brief_findings WHERE brief_id = :id").run({ ":id": briefId });
|
|
989
|
+
const stmt = getDbOrNull()!.prepare(
|
|
990
|
+
`INSERT INTO rework_brief_findings (
|
|
991
|
+
brief_id, finding_id, severity, description, required_fix, verification_commands,
|
|
992
|
+
status, evidence, decision_ref, updated_at
|
|
993
|
+
) VALUES (
|
|
994
|
+
:brief_id, :finding_id, :severity, :description, :required_fix, :verification_commands,
|
|
995
|
+
:status, :evidence, :decision_ref, :updated_at
|
|
996
|
+
)`,
|
|
997
|
+
);
|
|
998
|
+
for (const finding of entry.findings) {
|
|
999
|
+
stmt.run({
|
|
1000
|
+
":brief_id": briefId,
|
|
1001
|
+
":finding_id": finding.findingId,
|
|
1002
|
+
":severity": finding.severity,
|
|
1003
|
+
":description": finding.description,
|
|
1004
|
+
":required_fix": finding.requiredFix,
|
|
1005
|
+
":verification_commands": JSON.stringify(finding.verificationCommands),
|
|
1006
|
+
":status": finding.status ?? "pending",
|
|
1007
|
+
":evidence": finding.evidence ?? "",
|
|
1008
|
+
":decision_ref": finding.decisionRef ?? "",
|
|
1009
|
+
":updated_at": now,
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
});
|
|
1013
|
+
return { briefId };
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
export function getBlockingReworkFindingsForTask(
|
|
1017
|
+
milestoneId: string,
|
|
1018
|
+
sliceId: string,
|
|
1019
|
+
taskId: string,
|
|
1020
|
+
): ReworkBriefFindingRow[] {
|
|
1021
|
+
if (!getDbOrNull()!) return [];
|
|
1022
|
+
const rows = getDbOrNull()!.prepare(
|
|
1023
|
+
`SELECT f.*
|
|
1024
|
+
FROM rework_brief_findings f
|
|
1025
|
+
JOIN rework_briefs b ON b.id = f.brief_id
|
|
1026
|
+
WHERE b.milestone_id = :mid
|
|
1027
|
+
AND b.slice_id = :sid
|
|
1028
|
+
AND b.task_id = :tid
|
|
1029
|
+
AND f.severity = 'blocking'
|
|
1030
|
+
ORDER BY b.created_at, f.finding_id`,
|
|
1031
|
+
).all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId }) as Array<Record<string, unknown>>;
|
|
1032
|
+
return rows.map(rowToReworkFinding);
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
export function getUnresolvedBlockingReworkFindingsForTask(
|
|
1036
|
+
milestoneId: string,
|
|
1037
|
+
sliceId: string,
|
|
1038
|
+
taskId: string,
|
|
1039
|
+
): ReworkBriefFindingRow[] {
|
|
1040
|
+
return getBlockingReworkFindingsForTask(milestoneId, sliceId, taskId)
|
|
1041
|
+
.filter((finding) => finding.status === "pending");
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
export function applyReworkResolutions(resolutions: Array<{
|
|
1045
|
+
milestoneId: string;
|
|
1046
|
+
sliceId: string;
|
|
1047
|
+
taskId: string;
|
|
1048
|
+
findingId: string;
|
|
1049
|
+
status: ReworkFindingStatus;
|
|
1050
|
+
evidence: string;
|
|
1051
|
+
decisionRef?: string;
|
|
1052
|
+
}>): void {
|
|
1053
|
+
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1054
|
+
const now = new Date().toISOString();
|
|
1055
|
+
const stmt = getDbOrNull()!.prepare(
|
|
1056
|
+
`UPDATE rework_brief_findings
|
|
1057
|
+
SET status = :status,
|
|
1058
|
+
evidence = :evidence,
|
|
1059
|
+
decision_ref = :decision_ref,
|
|
1060
|
+
updated_at = :updated_at
|
|
1061
|
+
WHERE finding_id = :finding_id
|
|
1062
|
+
AND brief_id IN (
|
|
1063
|
+
SELECT id FROM rework_briefs
|
|
1064
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid
|
|
1065
|
+
)`,
|
|
1066
|
+
);
|
|
1067
|
+
transaction(() => {
|
|
1068
|
+
for (const resolution of resolutions) {
|
|
1069
|
+
stmt.run({
|
|
1070
|
+
":status": resolution.status,
|
|
1071
|
+
":evidence": resolution.evidence,
|
|
1072
|
+
":decision_ref": resolution.decisionRef ?? "",
|
|
1073
|
+
":updated_at": now,
|
|
1074
|
+
":finding_id": resolution.findingId,
|
|
1075
|
+
":mid": resolution.milestoneId,
|
|
1076
|
+
":sid": resolution.sliceId,
|
|
1077
|
+
":tid": resolution.taskId,
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
|
|
896
1083
|
export function insertAssessment(entry: {
|
|
897
1084
|
path: string;
|
|
898
1085
|
milestoneId: string;
|
|
@@ -1084,52 +1271,59 @@ export function saveGateResult(g: {
|
|
|
1084
1271
|
}): void {
|
|
1085
1272
|
if (!getDbOrNull()!) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
1086
1273
|
const evaluatedAt = new Date().toISOString();
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
);
|
|
1109
|
-
|
|
1274
|
+
// Atomic: the gate verdict UPDATE and the gate_runs ledger INSERT must commit
|
|
1275
|
+
// together. As two autocommits, a crash between them records a completed gate
|
|
1276
|
+
// with no ledger row (the row Recovery Classification reads). transaction()
|
|
1277
|
+
// is re-entrant, so callers already inside a transaction are safe. The
|
|
1278
|
+
// throw-on-zero-changes stays inside so a missing gate row rolls back cleanly.
|
|
1279
|
+
transaction(() => {
|
|
1280
|
+
const result = getDbOrNull()!.prepare(
|
|
1281
|
+
`UPDATE quality_gates
|
|
1282
|
+
SET status = 'complete', verdict = :verdict, rationale = :rationale,
|
|
1283
|
+
findings = :findings, evaluated_at = :evaluated_at
|
|
1284
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND gate_id = :gid
|
|
1285
|
+
AND (task_id = :tid OR (:tid = '' AND task_id IS NULL))`,
|
|
1286
|
+
).run({
|
|
1287
|
+
":mid": g.milestoneId,
|
|
1288
|
+
":sid": g.sliceId,
|
|
1289
|
+
":gid": g.gateId,
|
|
1290
|
+
":tid": g.taskId ?? "",
|
|
1291
|
+
":verdict": g.verdict,
|
|
1292
|
+
":rationale": g.rationale,
|
|
1293
|
+
":findings": g.findings,
|
|
1294
|
+
":evaluated_at": evaluatedAt,
|
|
1295
|
+
}) as { changes?: number };
|
|
1296
|
+
|
|
1297
|
+
if ((result.changes ?? 0) === 0) {
|
|
1298
|
+
throw new GSDError(
|
|
1299
|
+
GSD_STALE_STATE,
|
|
1300
|
+
`quality gate row not found for ${g.milestoneId}/${g.sliceId}/${g.gateId}${g.taskId ? `/${g.taskId}` : ""}`,
|
|
1301
|
+
);
|
|
1302
|
+
}
|
|
1110
1303
|
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1304
|
+
const outcome =
|
|
1305
|
+
g.verdict === "pass"
|
|
1306
|
+
? "pass"
|
|
1307
|
+
: g.verdict === "omitted"
|
|
1308
|
+
? "manual-attention"
|
|
1309
|
+
: "fail";
|
|
1310
|
+
insertGateRun({
|
|
1311
|
+
traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
|
|
1312
|
+
turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
|
|
1313
|
+
gateId: g.gateId,
|
|
1314
|
+
gateType: "quality-gate",
|
|
1315
|
+
milestoneId: g.milestoneId,
|
|
1316
|
+
sliceId: g.sliceId,
|
|
1317
|
+
taskId: g.taskId ?? undefined,
|
|
1318
|
+
outcome,
|
|
1319
|
+
failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
|
|
1320
|
+
rationale: g.rationale,
|
|
1321
|
+
findings: g.findings,
|
|
1322
|
+
attempt: 1,
|
|
1323
|
+
maxAttempts: 1,
|
|
1324
|
+
retryable: false,
|
|
1325
|
+
evaluatedAt,
|
|
1326
|
+
});
|
|
1133
1327
|
});
|
|
1134
1328
|
}
|
|
1135
1329
|
|
|
@@ -1419,6 +1613,15 @@ export function deleteArtifactsByPathPrefix(prefix: string): number {
|
|
|
1419
1613
|
});
|
|
1420
1614
|
}
|
|
1421
1615
|
|
|
1616
|
+
/** List artifact rows whose paths share a DB-relative prefix. */
|
|
1617
|
+
export function getArtifactsByPathPrefix(prefix: string): ArtifactRow[] {
|
|
1618
|
+
if (!getDbOrNull()!) return [];
|
|
1619
|
+
const rows = getDbOrNull()!.prepare(
|
|
1620
|
+
"SELECT * FROM artifacts WHERE path LIKE :prefix ORDER BY path",
|
|
1621
|
+
).all({ ":prefix": `${prefix}%` });
|
|
1622
|
+
return rows.map(rowToArtifact);
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1422
1625
|
/**
|
|
1423
1626
|
* Drop hierarchy rows in dependency order inside a transaction. Used by
|
|
1424
1627
|
* `gsd recover --confirm` to rebuild engine state from markdown.
|
|
@@ -864,6 +864,13 @@ export function getDiscussableFutureMilestones<T extends { id: string; status: s
|
|
|
864
864
|
);
|
|
865
865
|
}
|
|
866
866
|
|
|
867
|
+
function findDiscussTargetMilestone(
|
|
868
|
+
registry: GSDState["registry"],
|
|
869
|
+
milestoneId: string,
|
|
870
|
+
): GSDState["registry"][number] | undefined {
|
|
871
|
+
return registry.find((m) => m.id === milestoneId || m.id.startsWith(`${milestoneId}-`));
|
|
872
|
+
}
|
|
873
|
+
|
|
867
874
|
function getStructuredQuestionsAvailability(
|
|
868
875
|
pi: ExtensionAPI,
|
|
869
876
|
ctx: ExtensionContext | undefined,
|
|
@@ -1333,12 +1340,23 @@ export async function showDiscuss(
|
|
|
1333
1340
|
if (slash > 0) {
|
|
1334
1341
|
const mid = target.slice(0, slash);
|
|
1335
1342
|
const sid = target.slice(slash + 1);
|
|
1336
|
-
const targetMilestone = state.registry
|
|
1337
|
-
if (!targetMilestone
|
|
1338
|
-
ctx.ui.notify(
|
|
1343
|
+
const targetMilestone = findDiscussTargetMilestone(state.registry, mid);
|
|
1344
|
+
if (!targetMilestone) {
|
|
1345
|
+
ctx.ui.notify(
|
|
1346
|
+
`Milestone ${mid} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`,
|
|
1347
|
+
"warning",
|
|
1348
|
+
);
|
|
1349
|
+
return;
|
|
1350
|
+
}
|
|
1351
|
+
if (targetMilestone.status === "complete") {
|
|
1352
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
|
|
1339
1353
|
return;
|
|
1340
1354
|
}
|
|
1341
|
-
|
|
1355
|
+
if (targetMilestone.status === "parked") {
|
|
1356
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
const slices = await loadDiscussNormSlices(basePath, targetMilestone.id);
|
|
1342
1360
|
const chosen = slices.find((s) => s.id.toUpperCase() === sid.toUpperCase());
|
|
1343
1361
|
if (!chosen) {
|
|
1344
1362
|
ctx.ui.notify(`Slice ${target} was not found in discussable slices.`, "warning");
|
|
@@ -1348,10 +1366,10 @@ export async function showDiscuss(
|
|
|
1348
1366
|
ctx.ui.notify(`Slice ${target} is already complete; nothing to discuss.`, "info");
|
|
1349
1367
|
return;
|
|
1350
1368
|
}
|
|
1351
|
-
const discussBasePath = resolveDiscussSliceBasePath(basePath,
|
|
1352
|
-
const contextFile = resolveSliceFile(discussBasePath,
|
|
1369
|
+
const discussBasePath = resolveDiscussSliceBasePath(basePath, targetMilestone.id);
|
|
1370
|
+
const contextFile = resolveSliceFile(discussBasePath, targetMilestone.id, sid, "CONTEXT");
|
|
1353
1371
|
const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
|
|
1354
|
-
const prompt = await buildDiscussSlicePrompt(
|
|
1372
|
+
const prompt = await buildDiscussSlicePrompt(targetMilestone.id, sid, chosen.title, discussBasePath, {
|
|
1355
1373
|
rediscuss: !!contextFile,
|
|
1356
1374
|
structuredQuestionsAvailable: sqAvail,
|
|
1357
1375
|
});
|
|
@@ -1359,9 +1377,20 @@ export async function showDiscuss(
|
|
|
1359
1377
|
return;
|
|
1360
1378
|
}
|
|
1361
1379
|
|
|
1362
|
-
const targetMilestone = state.registry
|
|
1363
|
-
if (!targetMilestone
|
|
1364
|
-
ctx.ui.notify(
|
|
1380
|
+
const targetMilestone = findDiscussTargetMilestone(state.registry, target);
|
|
1381
|
+
if (!targetMilestone) {
|
|
1382
|
+
ctx.ui.notify(
|
|
1383
|
+
`Milestone ${target} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`,
|
|
1384
|
+
"warning",
|
|
1385
|
+
);
|
|
1386
|
+
return;
|
|
1387
|
+
}
|
|
1388
|
+
if (targetMilestone.status === "complete") {
|
|
1389
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
|
|
1390
|
+
return;
|
|
1391
|
+
}
|
|
1392
|
+
if (targetMilestone.status === "parked") {
|
|
1393
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
|
|
1365
1394
|
return;
|
|
1366
1395
|
}
|
|
1367
1396
|
await dispatchDiscussForMilestone(ctx, pi, basePath, targetMilestone.id, targetMilestone.title, {});
|
|
@@ -1208,6 +1208,21 @@ export interface AssessmentData {
|
|
|
1208
1208
|
completedSliceId?: string;
|
|
1209
1209
|
}
|
|
1210
1210
|
|
|
1211
|
+
function existingLegacySliceAssessmentPath(
|
|
1212
|
+
basePath: string,
|
|
1213
|
+
milestoneId: string,
|
|
1214
|
+
sliceId: string,
|
|
1215
|
+
): string | null {
|
|
1216
|
+
if (!isLegacyMilestonesLayout(basePath)) return null;
|
|
1217
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
1218
|
+
const milestoneDirName = resolveDir(legacyBase, milestoneId);
|
|
1219
|
+
if (!milestoneDirName) return null;
|
|
1220
|
+
const slicesDir = join(legacyBase, milestoneDirName, "slices");
|
|
1221
|
+
const sliceDirName = resolveDir(slicesDir, sliceId);
|
|
1222
|
+
if (!sliceDirName) return null;
|
|
1223
|
+
return join(slicesDir, sliceDirName, `${sliceId}-ASSESSMENT.md`);
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1211
1226
|
export async function renderReplanFromDb(
|
|
1212
1227
|
basePath: string,
|
|
1213
1228
|
milestoneId: string,
|
|
@@ -1258,13 +1273,14 @@ export async function renderAssessmentFromDb(
|
|
|
1258
1273
|
sliceId: string,
|
|
1259
1274
|
assessmentData: AssessmentData,
|
|
1260
1275
|
): Promise<{ assessmentPath: string; content: string }> {
|
|
1261
|
-
const absPath =
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1276
|
+
const absPath = existingLegacySliceAssessmentPath(basePath, milestoneId, sliceId)
|
|
1277
|
+
?? targetSliceFile(
|
|
1278
|
+
basePath,
|
|
1279
|
+
milestoneId,
|
|
1280
|
+
sliceId,
|
|
1281
|
+
"ASSESSMENT",
|
|
1282
|
+
getMilestone(milestoneId)?.title,
|
|
1283
|
+
);
|
|
1268
1284
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
1269
1285
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
1270
1286
|
|