@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.5c1a3ff2
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 +18 -49
- 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/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
- 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 +125 -18
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -5
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
- 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/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- 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 +26 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +3 -6
- package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +187 -45
- package/dist/resources/extensions/gsd/guided-flow.js +38 -13
- package/dist/resources/extensions/gsd/markdown-renderer.js +17 -13
- package/dist/resources/extensions/gsd/md-importer.js +107 -20
- 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/model-cost-table.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +11 -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 +55 -11
- package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
- package/dist/resources/extensions/gsd/preferences-types.js +5 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
- package/dist/resources/extensions/gsd/preferences.js +17 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- 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/skill-activation.js +17 -3
- 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/templates/PREFERENCES.md +5 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
- 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/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- 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-context-composer.js +28 -5
- 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/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- 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 +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- 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/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +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/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- 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/standalone/server.js +1 -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/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- 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 +15 -2
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- 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/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +119 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +107 -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 +25 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +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 +18 -49
- 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/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
- 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 +142 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +39 -10
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
- 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/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- 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 +26 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +3 -5
- package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +255 -52
- package/src/resources/extensions/gsd/guided-flow.ts +48 -12
- package/src/resources/extensions/gsd/markdown-renderer.ts +25 -21
- package/src/resources/extensions/gsd/md-importer.ts +114 -16
- 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/model-cost-table.ts +2 -0
- package/src/resources/extensions/gsd/model-router.ts +12 -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 +62 -11
- package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
- package/src/resources/extensions/gsd/preferences.ts +25 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- 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/skill-activation.ts +17 -3
- 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/templates/PREFERENCES.md +5 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- 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 +362 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -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/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- 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/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- 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/parallel-skill-prompt-integration.test.ts +7 -5
- 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/preferences.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -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/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- 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/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -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/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
- 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/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- 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-context-composer.ts +34 -8
- 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/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- 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/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_ssgManifest.js +0 -0
|
@@ -19,7 +19,8 @@ import { createHash } from "node:crypto";
|
|
|
19
19
|
import { GSDError, GSD_STALE_STATE } from "./errors.js";
|
|
20
20
|
import { getGateIdsForTurn } from "./gate-registry.js";
|
|
21
21
|
import { logWarning } from "./workflow-logger.js";
|
|
22
|
-
import {
|
|
22
|
+
import { rowToArtifact } from "./db-milestone-artifact-rows.js";
|
|
23
|
+
import { isClosedStatus, toStatus } from "./status-guards.js";
|
|
23
24
|
// Connection ownership, lifecycle, schema/migrations and transaction
|
|
24
25
|
// primitives now live in the engine; re-export the full public surface so
|
|
25
26
|
// existing `from "./gsd-db.js"` imports keep working.
|
|
@@ -336,6 +337,11 @@ export function upsertSlicePlanning(milestoneId, sliceId, planning) {
|
|
|
336
337
|
export function insertTask(t) {
|
|
337
338
|
if (!getDbOrNull())
|
|
338
339
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
340
|
+
// Stamp completed_at for every terminal-complete alias (complete/done/closed),
|
|
341
|
+
// not just two literals — a task imported as "closed" is completed and must
|
|
342
|
+
// carry a timestamp. NOT for "skipped": a skipped task was never completed
|
|
343
|
+
// (cascade writers set its completed_at = NULL).
|
|
344
|
+
const isCompleteAlias = t.status != null && toStatus(t.status) === "complete";
|
|
339
345
|
getDbOrNull().prepare(`INSERT INTO tasks (
|
|
340
346
|
milestone_id, slice_id, id, title, status, one_liner, narrative,
|
|
341
347
|
verification_result, duration, completed_at, blocker_discovered,
|
|
@@ -385,7 +391,7 @@ export function insertTask(t) {
|
|
|
385
391
|
":narrative": t.narrative ?? "",
|
|
386
392
|
":verification_result": t.verificationResult ?? "",
|
|
387
393
|
":duration": t.duration ?? "",
|
|
388
|
-
":completed_at":
|
|
394
|
+
":completed_at": isCompleteAlias ? new Date().toISOString() : null,
|
|
389
395
|
":blocker_discovered": t.blockerDiscovered ? 1 : 0,
|
|
390
396
|
":deviations": t.deviations ?? "",
|
|
391
397
|
":known_issues": t.knownIssues ?? "",
|
|
@@ -401,7 +407,7 @@ export function insertTask(t) {
|
|
|
401
407
|
":observability_impact": t.planning?.observabilityImpact ?? "",
|
|
402
408
|
":full_plan_md": t.planning?.fullPlanMd ?? "",
|
|
403
409
|
":sequence": t.sequence ?? 0,
|
|
404
|
-
":preserve_completion": t.preserveCompletionMetadata &&
|
|
410
|
+
":preserve_completion": t.preserveCompletionMetadata && isCompleteAlias ? 1 : 0,
|
|
405
411
|
":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
|
|
406
412
|
":raw_target_repositories": t.planning && "targetRepositories" in t.planning
|
|
407
413
|
? JSON.stringify(t.planning.targetRepositories ?? [])
|
|
@@ -498,8 +504,8 @@ export function upsertTaskPlanning(milestoneId, sliceId, taskId, planning) {
|
|
|
498
504
|
":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
|
|
499
505
|
});
|
|
500
506
|
}
|
|
501
|
-
export function updateSliceStatus(milestoneId, sliceId, status, completedAt) {
|
|
502
|
-
applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt });
|
|
507
|
+
export function updateSliceStatus(milestoneId, sliceId, status, completedAt, preserveCompletion) {
|
|
508
|
+
applyStatusTransition({ entity: "slice", milestoneId, sliceId, status, completedAt, preserveCompletion });
|
|
503
509
|
}
|
|
504
510
|
export function setTaskSummaryMd(milestoneId, sliceId, taskId, md) {
|
|
505
511
|
if (!getDbOrNull())
|
|
@@ -611,8 +617,8 @@ function writeMilestoneStatus(milestoneId, status, completedAt) {
|
|
|
611
617
|
* advance planned milestones. They may not reopen a closed milestone; callers
|
|
612
618
|
* must use reopenMilestoneStatus(), which is reserved for gsd_milestone_reopen.
|
|
613
619
|
*/
|
|
614
|
-
export function updateMilestoneStatus(milestoneId, status, completedAt) {
|
|
615
|
-
applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt });
|
|
620
|
+
export function updateMilestoneStatus(milestoneId, status, completedAt, preserveCompletion) {
|
|
621
|
+
applyStatusTransition({ entity: "milestone", milestoneId, status, completedAt, preserveCompletion });
|
|
616
622
|
}
|
|
617
623
|
/**
|
|
618
624
|
* Explicit closed -> active transition for gsd_milestone_reopen only.
|
|
@@ -657,6 +663,128 @@ export function insertReplanHistory(entry) {
|
|
|
657
663
|
":created_at": new Date().toISOString(),
|
|
658
664
|
});
|
|
659
665
|
}
|
|
666
|
+
function reworkBriefIdFromTask(milestoneId, sliceId, taskId) {
|
|
667
|
+
return `RB-${milestoneId}-${sliceId}-${taskId}`;
|
|
668
|
+
}
|
|
669
|
+
function normalizeReworkStatus(status) {
|
|
670
|
+
const normalized = String(status ?? "pending");
|
|
671
|
+
if (normalized === "resolved" || normalized === "deferred-with-override") {
|
|
672
|
+
return normalized;
|
|
673
|
+
}
|
|
674
|
+
return "pending";
|
|
675
|
+
}
|
|
676
|
+
function rowToReworkFinding(row) {
|
|
677
|
+
let verificationCommands = [];
|
|
678
|
+
try {
|
|
679
|
+
const parsed = JSON.parse(String(row["verification_commands"] ?? "[]"));
|
|
680
|
+
verificationCommands = Array.isArray(parsed) ? parsed.map(String) : [];
|
|
681
|
+
}
|
|
682
|
+
catch {
|
|
683
|
+
verificationCommands = [];
|
|
684
|
+
}
|
|
685
|
+
return {
|
|
686
|
+
brief_id: String(row["brief_id"] ?? ""),
|
|
687
|
+
finding_id: String(row["finding_id"] ?? ""),
|
|
688
|
+
severity: String(row["severity"] ?? "blocking") === "advisory" ? "advisory" : "blocking",
|
|
689
|
+
description: String(row["description"] ?? ""),
|
|
690
|
+
required_fix: String(row["required_fix"] ?? ""),
|
|
691
|
+
verification_commands: verificationCommands,
|
|
692
|
+
status: normalizeReworkStatus(row["status"]),
|
|
693
|
+
evidence: String(row["evidence"] ?? ""),
|
|
694
|
+
decision_ref: String(row["decision_ref"] ?? ""),
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
export function saveReworkBrief(entry) {
|
|
698
|
+
if (!getDbOrNull())
|
|
699
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
700
|
+
const briefId = entry.briefId?.trim() || reworkBriefIdFromTask(entry.milestoneId, entry.sliceId, entry.taskId);
|
|
701
|
+
const now = new Date().toISOString();
|
|
702
|
+
transaction(() => {
|
|
703
|
+
getDbOrNull().prepare(`INSERT INTO rework_briefs (id, milestone_id, slice_id, task_id, created_at, updated_at)
|
|
704
|
+
VALUES (:id, :mid, :sid, :tid, :created_at, :updated_at)
|
|
705
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
706
|
+
milestone_id = :mid,
|
|
707
|
+
slice_id = :sid,
|
|
708
|
+
task_id = :tid,
|
|
709
|
+
updated_at = :updated_at`).run({
|
|
710
|
+
":id": briefId,
|
|
711
|
+
":mid": entry.milestoneId,
|
|
712
|
+
":sid": entry.sliceId,
|
|
713
|
+
":tid": entry.taskId,
|
|
714
|
+
":created_at": now,
|
|
715
|
+
":updated_at": now,
|
|
716
|
+
});
|
|
717
|
+
getDbOrNull().prepare("DELETE FROM rework_brief_findings WHERE brief_id = :id").run({ ":id": briefId });
|
|
718
|
+
const stmt = getDbOrNull().prepare(`INSERT INTO rework_brief_findings (
|
|
719
|
+
brief_id, finding_id, severity, description, required_fix, verification_commands,
|
|
720
|
+
status, evidence, decision_ref, updated_at
|
|
721
|
+
) VALUES (
|
|
722
|
+
:brief_id, :finding_id, :severity, :description, :required_fix, :verification_commands,
|
|
723
|
+
:status, :evidence, :decision_ref, :updated_at
|
|
724
|
+
)`);
|
|
725
|
+
for (const finding of entry.findings) {
|
|
726
|
+
stmt.run({
|
|
727
|
+
":brief_id": briefId,
|
|
728
|
+
":finding_id": finding.findingId,
|
|
729
|
+
":severity": finding.severity,
|
|
730
|
+
":description": finding.description,
|
|
731
|
+
":required_fix": finding.requiredFix,
|
|
732
|
+
":verification_commands": JSON.stringify(finding.verificationCommands),
|
|
733
|
+
":status": finding.status ?? "pending",
|
|
734
|
+
":evidence": finding.evidence ?? "",
|
|
735
|
+
":decision_ref": finding.decisionRef ?? "",
|
|
736
|
+
":updated_at": now,
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
});
|
|
740
|
+
return { briefId };
|
|
741
|
+
}
|
|
742
|
+
export function getBlockingReworkFindingsForTask(milestoneId, sliceId, taskId) {
|
|
743
|
+
if (!getDbOrNull())
|
|
744
|
+
return [];
|
|
745
|
+
const rows = getDbOrNull().prepare(`SELECT f.*
|
|
746
|
+
FROM rework_brief_findings f
|
|
747
|
+
JOIN rework_briefs b ON b.id = f.brief_id
|
|
748
|
+
WHERE b.milestone_id = :mid
|
|
749
|
+
AND b.slice_id = :sid
|
|
750
|
+
AND b.task_id = :tid
|
|
751
|
+
AND f.severity = 'blocking'
|
|
752
|
+
ORDER BY b.created_at, f.finding_id`).all({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
753
|
+
return rows.map(rowToReworkFinding);
|
|
754
|
+
}
|
|
755
|
+
export function getUnresolvedBlockingReworkFindingsForTask(milestoneId, sliceId, taskId) {
|
|
756
|
+
return getBlockingReworkFindingsForTask(milestoneId, sliceId, taskId)
|
|
757
|
+
.filter((finding) => finding.status === "pending");
|
|
758
|
+
}
|
|
759
|
+
export function applyReworkResolutions(resolutions) {
|
|
760
|
+
if (!getDbOrNull())
|
|
761
|
+
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
762
|
+
const now = new Date().toISOString();
|
|
763
|
+
const stmt = getDbOrNull().prepare(`UPDATE rework_brief_findings
|
|
764
|
+
SET status = :status,
|
|
765
|
+
evidence = :evidence,
|
|
766
|
+
decision_ref = :decision_ref,
|
|
767
|
+
updated_at = :updated_at
|
|
768
|
+
WHERE finding_id = :finding_id
|
|
769
|
+
AND brief_id IN (
|
|
770
|
+
SELECT id FROM rework_briefs
|
|
771
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid
|
|
772
|
+
)`);
|
|
773
|
+
transaction(() => {
|
|
774
|
+
for (const resolution of resolutions) {
|
|
775
|
+
stmt.run({
|
|
776
|
+
":status": resolution.status,
|
|
777
|
+
":evidence": resolution.evidence,
|
|
778
|
+
":decision_ref": resolution.decisionRef ?? "",
|
|
779
|
+
":updated_at": now,
|
|
780
|
+
":finding_id": resolution.findingId,
|
|
781
|
+
":mid": resolution.milestoneId,
|
|
782
|
+
":sid": resolution.sliceId,
|
|
783
|
+
":tid": resolution.taskId,
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
}
|
|
660
788
|
export function insertAssessment(entry) {
|
|
661
789
|
if (!getDbOrNull())
|
|
662
790
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
@@ -767,44 +895,51 @@ export function saveGateResult(g) {
|
|
|
767
895
|
if (!getDbOrNull())
|
|
768
896
|
throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
|
|
769
897
|
const evaluatedAt = new Date().toISOString();
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
: "
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
898
|
+
// Atomic: the gate verdict UPDATE and the gate_runs ledger INSERT must commit
|
|
899
|
+
// together. As two autocommits, a crash between them records a completed gate
|
|
900
|
+
// with no ledger row (the row Recovery Classification reads). transaction()
|
|
901
|
+
// is re-entrant, so callers already inside a transaction are safe. The
|
|
902
|
+
// throw-on-zero-changes stays inside so a missing gate row rolls back cleanly.
|
|
903
|
+
transaction(() => {
|
|
904
|
+
const result = getDbOrNull().prepare(`UPDATE quality_gates
|
|
905
|
+
SET status = 'complete', verdict = :verdict, rationale = :rationale,
|
|
906
|
+
findings = :findings, evaluated_at = :evaluated_at
|
|
907
|
+
WHERE milestone_id = :mid AND slice_id = :sid AND gate_id = :gid
|
|
908
|
+
AND (task_id = :tid OR (:tid = '' AND task_id IS NULL))`).run({
|
|
909
|
+
":mid": g.milestoneId,
|
|
910
|
+
":sid": g.sliceId,
|
|
911
|
+
":gid": g.gateId,
|
|
912
|
+
":tid": g.taskId ?? "",
|
|
913
|
+
":verdict": g.verdict,
|
|
914
|
+
":rationale": g.rationale,
|
|
915
|
+
":findings": g.findings,
|
|
916
|
+
":evaluated_at": evaluatedAt,
|
|
917
|
+
});
|
|
918
|
+
if ((result.changes ?? 0) === 0) {
|
|
919
|
+
throw new GSDError(GSD_STALE_STATE, `quality gate row not found for ${g.milestoneId}/${g.sliceId}/${g.gateId}${g.taskId ? `/${g.taskId}` : ""}`);
|
|
920
|
+
}
|
|
921
|
+
const outcome = g.verdict === "pass"
|
|
922
|
+
? "pass"
|
|
923
|
+
: g.verdict === "omitted"
|
|
924
|
+
? "manual-attention"
|
|
925
|
+
: "fail";
|
|
926
|
+
insertGateRun({
|
|
927
|
+
traceId: `quality-gate:${g.milestoneId}:${g.sliceId}`,
|
|
928
|
+
turnId: `gate:${g.gateId}:${g.taskId ?? "slice"}`,
|
|
929
|
+
gateId: g.gateId,
|
|
930
|
+
gateType: "quality-gate",
|
|
931
|
+
milestoneId: g.milestoneId,
|
|
932
|
+
sliceId: g.sliceId,
|
|
933
|
+
taskId: g.taskId ?? undefined,
|
|
934
|
+
outcome,
|
|
935
|
+
failureClass: outcome === "fail" ? "verification" : outcome === "manual-attention" ? "manual-attention" : "none",
|
|
936
|
+
rationale: g.rationale,
|
|
937
|
+
findings: g.findings,
|
|
938
|
+
attempt: 1,
|
|
939
|
+
maxAttempts: 1,
|
|
940
|
+
retryable: false,
|
|
941
|
+
evaluatedAt,
|
|
942
|
+
});
|
|
808
943
|
});
|
|
809
944
|
}
|
|
810
945
|
export function markAllGatesOmitted(milestoneId, sliceId) {
|
|
@@ -1012,6 +1147,13 @@ export function deleteArtifactsByPathPrefix(prefix) {
|
|
|
1012
1147
|
return Number(countRow?.["count"] ?? 0);
|
|
1013
1148
|
});
|
|
1014
1149
|
}
|
|
1150
|
+
/** List artifact rows whose paths share a DB-relative prefix. */
|
|
1151
|
+
export function getArtifactsByPathPrefix(prefix) {
|
|
1152
|
+
if (!getDbOrNull())
|
|
1153
|
+
return [];
|
|
1154
|
+
const rows = getDbOrNull().prepare("SELECT * FROM artifacts WHERE path LIKE :prefix ORDER BY path").all({ ":prefix": `${prefix}%` });
|
|
1155
|
+
return rows.map(rowToArtifact);
|
|
1156
|
+
}
|
|
1015
1157
|
/**
|
|
1016
1158
|
* Drop hierarchy rows in dependency order inside a transaction. Used by
|
|
1017
1159
|
* `gsd recover --confirm` to rebuild engine state from markdown.
|
|
@@ -11,7 +11,7 @@ import { loadFile, saveFile } from "./files.js";
|
|
|
11
11
|
import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
|
|
12
12
|
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
13
13
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
14
|
-
import { buildCompleteSlicePrompt, buildDiscussMilestonePrompt, buildExecuteTaskPrompt, buildPlanMilestonePrompt, buildPlanSlicePrompt, buildSkillActivationBlock, } from "./auto-prompts.js";
|
|
14
|
+
import { buildCompleteSlicePrompt, buildDiscussMilestonePrompt, buildExecuteTaskPrompt, buildPlanMilestonePrompt, buildPlanSlicePrompt, buildSkillActivationBlock, capPreamble, } from "./auto-prompts.js";
|
|
15
15
|
import { deriveState, isGhostMilestone } from "./state.js";
|
|
16
16
|
import { invalidateAllCaches } from "./cache.js";
|
|
17
17
|
import { startAutoDetached } from "./auto.js";
|
|
@@ -603,6 +603,9 @@ export const _dispatchWorkflowForTest = dispatchWorkflow;
|
|
|
603
603
|
export function getDiscussableFutureMilestones(registry, activeMilestoneId) {
|
|
604
604
|
return registry.filter((m) => m.id !== activeMilestoneId && m.status !== "complete" && m.status !== "parked");
|
|
605
605
|
}
|
|
606
|
+
function findDiscussTargetMilestone(registry, milestoneId) {
|
|
607
|
+
return registry.find((m) => m.id === milestoneId || m.id.startsWith(`${milestoneId}-`));
|
|
608
|
+
}
|
|
606
609
|
function getStructuredQuestionsAvailability(pi, ctx) {
|
|
607
610
|
if (!ctx)
|
|
608
611
|
return "false";
|
|
@@ -852,7 +855,9 @@ function resolveDiscussSliceBasePath(basePath, milestoneId) {
|
|
|
852
855
|
* slice summaries so the agent can ask grounded UX/behaviour questions
|
|
853
856
|
* without wasting a turn reading files.
|
|
854
857
|
*/
|
|
855
|
-
|
|
858
|
+
// Exported for tests (`prompt-budget-enforcement.test.ts`) — verifies the
|
|
859
|
+
// inlined-context cap. Not part of the public flow surface otherwise.
|
|
860
|
+
export async function buildDiscussSlicePrompt(mid, sid, sTitle, base, options) {
|
|
856
861
|
const inlined = [];
|
|
857
862
|
// Roadmap — always included so the agent sees surrounding slices
|
|
858
863
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
@@ -903,8 +908,12 @@ async function buildDiscussSlicePrompt(mid, sid, sTitle, base, options) {
|
|
|
903
908
|
}
|
|
904
909
|
}
|
|
905
910
|
}
|
|
911
|
+
// Cap the inlined block: it grows unbounded with each completed slice's full
|
|
912
|
+
// SUMMARY. `capPreamble` truncates at `### ` section boundaries — roadmap and
|
|
913
|
+
// milestone context come first (survive), completed-slice summaries come last
|
|
914
|
+
// (dropped first) when the executor's window can't hold everything.
|
|
906
915
|
const inlinedContext = inlined.length > 0
|
|
907
|
-
? `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`
|
|
916
|
+
? capPreamble(`## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`)
|
|
908
917
|
: `## Inlined Context\n\n_(no context files found yet — go in blind and ask broad questions)_`;
|
|
909
918
|
const sliceDirPath = `.gsd/milestones/${mid}/slices/${sid}`;
|
|
910
919
|
const sliceContextPath = `${sliceDirPath}/${sid}-CONTEXT.md`;
|
|
@@ -964,12 +973,20 @@ export async function showDiscuss(ctx, pi, basePath, options) {
|
|
|
964
973
|
if (slash > 0) {
|
|
965
974
|
const mid = target.slice(0, slash);
|
|
966
975
|
const sid = target.slice(slash + 1);
|
|
967
|
-
const targetMilestone = state.registry
|
|
968
|
-
if (!targetMilestone
|
|
969
|
-
ctx.ui.notify(`Milestone ${mid}
|
|
976
|
+
const targetMilestone = findDiscussTargetMilestone(state.registry, mid);
|
|
977
|
+
if (!targetMilestone) {
|
|
978
|
+
ctx.ui.notify(`Milestone ${mid} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`, "warning");
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
if (targetMilestone.status === "complete") {
|
|
982
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
if (targetMilestone.status === "parked") {
|
|
986
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
|
|
970
987
|
return;
|
|
971
988
|
}
|
|
972
|
-
const slices = await loadDiscussNormSlices(basePath,
|
|
989
|
+
const slices = await loadDiscussNormSlices(basePath, targetMilestone.id);
|
|
973
990
|
const chosen = slices.find((s) => s.id.toUpperCase() === sid.toUpperCase());
|
|
974
991
|
if (!chosen) {
|
|
975
992
|
ctx.ui.notify(`Slice ${target} was not found in discussable slices.`, "warning");
|
|
@@ -979,19 +996,27 @@ export async function showDiscuss(ctx, pi, basePath, options) {
|
|
|
979
996
|
ctx.ui.notify(`Slice ${target} is already complete; nothing to discuss.`, "info");
|
|
980
997
|
return;
|
|
981
998
|
}
|
|
982
|
-
const discussBasePath = resolveDiscussSliceBasePath(basePath,
|
|
983
|
-
const contextFile = resolveSliceFile(discussBasePath,
|
|
999
|
+
const discussBasePath = resolveDiscussSliceBasePath(basePath, targetMilestone.id);
|
|
1000
|
+
const contextFile = resolveSliceFile(discussBasePath, targetMilestone.id, sid, "CONTEXT");
|
|
984
1001
|
const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
|
|
985
|
-
const prompt = await buildDiscussSlicePrompt(
|
|
1002
|
+
const prompt = await buildDiscussSlicePrompt(targetMilestone.id, sid, chosen.title, discussBasePath, {
|
|
986
1003
|
rediscuss: !!contextFile,
|
|
987
1004
|
structuredQuestionsAvailable: sqAvail,
|
|
988
1005
|
});
|
|
989
1006
|
await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice", { basePath: discussBasePath });
|
|
990
1007
|
return;
|
|
991
1008
|
}
|
|
992
|
-
const targetMilestone = state.registry
|
|
993
|
-
if (!targetMilestone
|
|
994
|
-
ctx.ui.notify(`Milestone ${target}
|
|
1009
|
+
const targetMilestone = findDiscussTargetMilestone(state.registry, target);
|
|
1010
|
+
if (!targetMilestone) {
|
|
1011
|
+
ctx.ui.notify(`Milestone ${target} was not found in the roadmap. Use /gsd new-milestone to add it, or /gsd status to see available milestones.`, "warning");
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
if (targetMilestone.status === "complete") {
|
|
1015
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is already complete.`, "info");
|
|
1016
|
+
return;
|
|
1017
|
+
}
|
|
1018
|
+
if (targetMilestone.status === "parked") {
|
|
1019
|
+
ctx.ui.notify(`Milestone ${targetMilestone.id} is parked. Run /gsd unpark ${targetMilestone.id} to reactivate.`, "warning");
|
|
995
1020
|
return;
|
|
996
1021
|
}
|
|
997
1022
|
await dispatchDiscussForMilestone(ctx, pi, basePath, targetMilestone.id, targetMilestone.title, {});
|
|
@@ -13,7 +13,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
13
13
|
import { isClosedStatus } from "./status-guards.js";
|
|
14
14
|
import { dirname, join, relative } from "node:path";
|
|
15
15
|
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTasksBySliceIds, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
|
|
16
|
-
import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, targetMilestoneFile, targetSliceFile, gsdProjectionRoot, gsdRoot, buildTaskFileName, } from "./paths.js";
|
|
16
|
+
import { resolveDir, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, targetMilestoneFile, targetSliceFile, targetTaskFile, gsdProjectionRoot, gsdRoot, buildTaskFileName, } from "./paths.js";
|
|
17
17
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
18
18
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
19
19
|
import { invalidateStateCache } from "./state.js";
|
|
@@ -612,17 +612,7 @@ export async function renderTaskSummary(basePath, milestoneId, sliceId, taskId)
|
|
|
612
612
|
if (!task || !task.full_summary_md) {
|
|
613
613
|
return false; // No summary to render — skip silently
|
|
614
614
|
}
|
|
615
|
-
|
|
616
|
-
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
617
|
-
if (!slicePath) {
|
|
618
|
-
process.stderr.write(`markdown-renderer: cannot resolve slice path for ${milestoneId}/${sliceId}\n`);
|
|
619
|
-
return false;
|
|
620
|
-
}
|
|
621
|
-
// Use the tasks/ subdir when it exists (legacy layout), otherwise use the
|
|
622
|
-
// slice path directly (flat-phase: task summaries live alongside plan files).
|
|
623
|
-
const tasksDir = resolveTasksDir(basePath, milestoneId, sliceId) ?? slicePath;
|
|
624
|
-
const fileName = buildTaskFileName(taskId, "SUMMARY");
|
|
625
|
-
const absPath = join(tasksDir, fileName);
|
|
615
|
+
const absPath = targetTaskFile(basePath, milestoneId, sliceId, taskId, "SUMMARY", getMilestone(milestoneId)?.title);
|
|
626
616
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
627
617
|
await writeAndStore(absPath, artifactPath, task.full_summary_md, {
|
|
628
618
|
artifact_type: "SUMMARY",
|
|
@@ -975,6 +965,19 @@ function detectStaleRendersImpl(basePath) {
|
|
|
975
965
|
export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
|
|
976
966
|
return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
|
|
977
967
|
}
|
|
968
|
+
function existingLegacySliceAssessmentPath(basePath, milestoneId, sliceId) {
|
|
969
|
+
if (!isLegacyMilestonesLayout(basePath))
|
|
970
|
+
return null;
|
|
971
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
972
|
+
const milestoneDirName = resolveDir(legacyBase, milestoneId);
|
|
973
|
+
if (!milestoneDirName)
|
|
974
|
+
return null;
|
|
975
|
+
const slicesDir = join(legacyBase, milestoneDirName, "slices");
|
|
976
|
+
const sliceDirName = resolveDir(slicesDir, sliceId);
|
|
977
|
+
if (!sliceDirName)
|
|
978
|
+
return null;
|
|
979
|
+
return join(slicesDir, sliceDirName, `${sliceId}-ASSESSMENT.md`);
|
|
980
|
+
}
|
|
978
981
|
export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
|
|
979
982
|
const absPath = targetSliceFile(basePath, milestoneId, sliceId, "REPLAN", getMilestone(milestoneId)?.title);
|
|
980
983
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
@@ -1004,7 +1007,8 @@ export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanD
|
|
|
1004
1007
|
return { replanPath: absPath, content };
|
|
1005
1008
|
}
|
|
1006
1009
|
export async function renderAssessmentFromDb(basePath, milestoneId, sliceId, assessmentData) {
|
|
1007
|
-
const absPath =
|
|
1010
|
+
const absPath = existingLegacySliceAssessmentPath(basePath, milestoneId, sliceId)
|
|
1011
|
+
?? targetSliceFile(basePath, milestoneId, sliceId, "ASSESSMENT", getMilestone(milestoneId)?.title);
|
|
1008
1012
|
mkdirSync(dirname(absPath), { recursive: true });
|
|
1009
1013
|
const artifactPath = toArtifactPath(absPath, basePath);
|
|
1010
1014
|
const lines = [];
|