gsd-pi 2.73.1 → 2.74.0-dev.0306a2e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-web-branch.d.ts +4 -3
- package/dist/cli-web-branch.js +10 -7
- package/dist/cli.js +184 -206
- package/dist/headless-query.js +4 -1
- package/dist/help-text.js +23 -0
- package/dist/logo.d.ts +1 -1
- package/dist/logo.js +1 -1
- package/dist/onboarding.js +59 -53
- package/dist/resource-loader.js +2 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
- package/dist/resources/extensions/gsd/activity-log.js +16 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +11 -4
- package/dist/resources/extensions/gsd/auto/loop.js +147 -10
- package/dist/resources/extensions/gsd/auto/phases.js +173 -13
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +22 -4
- package/dist/resources/extensions/gsd/auto-model-selection.js +105 -16
- package/dist/resources/extensions/gsd/auto-post-unit.js +254 -15
- package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
- package/dist/resources/extensions/gsd/auto-start.js +23 -6
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +186 -3
- package/dist/resources/extensions/gsd/auto.js +65 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +41 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +26 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +25 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +68 -9
- package/dist/resources/extensions/gsd/commands-add-tests.js +111 -0
- package/dist/resources/extensions/gsd/commands-backlog.js +140 -0
- package/dist/resources/extensions/gsd/commands-do.js +79 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +225 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
- package/dist/resources/extensions/gsd/commands-maintenance.js +6 -6
- package/dist/resources/extensions/gsd/commands-pr-branch.js +180 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- package/dist/resources/extensions/gsd/commands-session-report.js +82 -0
- package/dist/resources/extensions/gsd/commands-ship.js +187 -0
- package/dist/resources/extensions/gsd/db-writer.js +3 -5
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +15 -2
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +144 -0
- package/dist/resources/extensions/gsd/ecosystem/loader.js +145 -0
- package/dist/resources/extensions/gsd/git-service.js +49 -1
- package/dist/resources/extensions/gsd/graph-context.js +157 -0
- package/dist/resources/extensions/gsd/gsd-db.js +581 -2
- package/dist/resources/extensions/gsd/guided-flow.js +23 -0
- package/dist/resources/extensions/gsd/index.js +15 -2
- package/dist/resources/extensions/gsd/init-wizard.js +1 -0
- package/dist/resources/extensions/gsd/journal.js +27 -0
- package/dist/resources/extensions/gsd/md-importer.js +3 -4
- package/dist/resources/extensions/gsd/memory-store.js +19 -51
- package/dist/resources/extensions/gsd/metrics.js +19 -0
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +13 -12
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -4
- package/dist/resources/extensions/gsd/notification-widget.js +2 -2
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +63 -3
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +130 -2
- package/dist/resources/extensions/gsd/preferences.js +26 -0
- package/dist/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +12 -2
- package/dist/resources/extensions/gsd/state.js +66 -15
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +20 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +39 -4
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +2 -5
- package/dist/resources/extensions/gsd/unit-ownership.js +1 -1
- package/dist/resources/extensions/gsd/uok/audit-toggle.js +7 -0
- package/dist/resources/extensions/gsd/uok/audit.js +40 -0
- package/dist/resources/extensions/gsd/uok/contracts.js +1 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +179 -0
- package/dist/resources/extensions/gsd/uok/flags.js +29 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +109 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +53 -0
- package/dist/resources/extensions/gsd/uok/kernel.js +80 -0
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +133 -0
- package/dist/resources/extensions/gsd/uok/model-policy.js +66 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +132 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +22 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -69
- package/dist/resources/extensions/gsd/workflow-migration.js +21 -22
- package/dist/resources/extensions/gsd/workflow-projections.js +4 -1
- package/dist/resources/extensions/gsd/workflow-reconcile.js +14 -11
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-check.d.ts +1 -0
- package/dist/update-check.js +13 -5
- package/dist/update-cmd.js +4 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +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/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 +2 -2
- 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 +2 -2
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +10 -10
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- 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/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +3 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/index.d.ts +3 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/index.js +3 -0
- package/packages/mcp-server/dist/index.js.map +1 -1
- package/packages/mcp-server/dist/readers/graph.d.ts +87 -0
- package/packages/mcp-server/dist/readers/graph.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/graph.js +655 -0
- package/packages/mcp-server/dist/readers/graph.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +2 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -1
- package/packages/mcp-server/dist/readers/index.js +1 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +65 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/index.ts +15 -0
- package/packages/mcp-server/src/readers/graph.test.ts +604 -0
- package/packages/mcp-server/src/readers/graph.ts +855 -0
- package/packages/mcp-server/src/readers/index.ts +12 -0
- package/packages/mcp-server/src/server.ts +83 -0
- package/packages/mcp-server/tsconfig.json +1 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -0
- package/packages/native/package.json +2 -2
- package/packages/native/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.json +1 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-ai/dist/index.d.ts +2 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -9
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts +19 -0
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/capability-patches.js +36 -0
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -0
- package/packages/pi-ai/dist/{models.custom.d.ts → models/custom.d.ts} +1 -1
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/{models.custom.js → models/custom.js} +4 -4
- package/packages/pi-ai/dist/models/custom.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +1482 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +1484 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +377 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js +379 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js +702 -0
- package/packages/pi-ai/dist/models/generated/azure-openai-responses.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts +71 -0
- package/packages/pi-ai/dist/models/generated/cerebras.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js +73 -0
- package/packages/pi-ai/dist/models/generated/cerebras.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts +590 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js +444 -0
- package/packages/pi-ai/dist/models/generated/github-copilot.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +156 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +158 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js +107 -0
- package/packages/pi-ai/dist/models/generated/google-gemini-cli.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts +207 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js +209 -0
- package/packages/pi-ai/dist/models/generated/google-vertex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts +462 -0
- package/packages/pi-ai/dist/models/generated/google.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/google.js +464 -0
- package/packages/pi-ai/dist/models/generated/google.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts +309 -0
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/groq.js +311 -0
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts +383 -0
- package/packages/pi-ai/dist/models/generated/huggingface.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js +347 -0
- package/packages/pi-ai/dist/models/generated/huggingface.js.map +1 -0
- package/packages/pi-ai/dist/{models.generated.d.ts → models/generated/index.d.ts} +1 -1
- package/packages/pi-ai/dist/{models.generated.d.ts.map → models/generated/index.d.ts.map} +1 -1
- package/packages/pi-ai/dist/models/generated/index.js +51 -0
- package/packages/pi-ai/dist/models/generated/index.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts +37 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js +39 -0
- package/packages/pi-ai/dist/models/generated/kimi-coding.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax-cn.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts +105 -0
- package/packages/pi-ai/dist/models/generated/minimax.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/minimax.js +107 -0
- package/packages/pi-ai/dist/models/generated/minimax.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts +445 -0
- package/packages/pi-ai/dist/models/generated/mistral.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/mistral.js +447 -0
- package/packages/pi-ai/dist/models/generated/mistral.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +139 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js +141 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts +700 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openai.js +702 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts +122 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js +124 -0
- package/packages/pi-ai/dist/models/generated/opencode-go.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts +530 -0
- package/packages/pi-ai/dist/models/generated/opencode.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/opencode.js +532 -0
- package/packages/pi-ai/dist/models/generated/opencode.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +4270 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js +4272 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts +2604 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js +2606 -0
- package/packages/pi-ai/dist/models/generated/vercel-ai-gateway.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts +411 -0
- package/packages/pi-ai/dist/models/generated/xai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/xai.js +413 -0
- package/packages/pi-ai/dist/models/generated/xai.js.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts +276 -0
- package/packages/pi-ai/dist/models/generated/zai.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/generated/zai.js +239 -0
- package/packages/pi-ai/dist/models/generated/zai.js.map +1 -0
- package/packages/pi-ai/dist/models/index.d.ts +27 -0
- package/packages/pi-ai/dist/models/index.d.ts.map +1 -0
- package/packages/pi-ai/dist/models/index.js +80 -0
- package/packages/pi-ai/dist/models/index.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts +1 -36
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +1 -2
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.js +3 -112
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +6 -5
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/overflow.js +12 -0
- package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +74 -40
- package/packages/pi-ai/src/index.ts +5 -9
- package/packages/pi-ai/src/models/capability-patches.ts +40 -0
- package/packages/pi-ai/src/{models.custom.ts → models/custom.ts} +4 -4
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1486 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +381 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +160 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +313 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +143 -0
- package/packages/pi-ai/src/models/generated/openai.ts +704 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4274 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +106 -0
- package/packages/pi-ai/src/models.generated.test.ts +1 -2
- package/packages/pi-ai/src/models.test.ts +6 -5
- package/packages/pi-ai/src/models.ts +3 -153
- package/packages/pi-ai/src/utils/overflow.ts +14 -1
- package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
- package/packages/pi-ai/tsconfig.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +721 -8
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js +52 -0
- package/packages/pi-coding-agent/dist/core/model-registry-env-fallback.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +65 -28
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +305 -20
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +38 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +884 -8
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +78 -32
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +381 -39
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +44 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +79 -6
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/tsconfig.json +3 -2
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +32 -3
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
- package/packages/pi-tui/src/tui.ts +31 -3
- package/packages/pi-tui/tsconfig.json +1 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.json +1 -0
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
- package/src/resources/extensions/gsd/activity-log.ts +21 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +12 -4
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop.ts +159 -10
- package/src/resources/extensions/gsd/auto/phases.ts +213 -13
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +26 -10
- package/src/resources/extensions/gsd/auto-model-selection.ts +151 -16
- package/src/resources/extensions/gsd/auto-post-unit.ts +278 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
- package/src/resources/extensions/gsd/auto-start.ts +30 -6
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +225 -3
- package/src/resources/extensions/gsd/auto.ts +72 -16
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +52 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +26 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +25 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +74 -9
- package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
- package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
- package/src/resources/extensions/gsd/commands-do.ts +109 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +304 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
- package/src/resources/extensions/gsd/commands-maintenance.ts +6 -6
- package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
- package/src/resources/extensions/gsd/commands-ship.ts +219 -0
- package/src/resources/extensions/gsd/db-writer.ts +3 -5
- package/src/resources/extensions/gsd/docs/preferences-reference.md +15 -2
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +228 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/git-service.ts +68 -0
- package/src/resources/extensions/gsd/graph-context.ts +212 -0
- package/src/resources/extensions/gsd/gsd-db.ts +788 -3
- package/src/resources/extensions/gsd/guided-flow.ts +32 -0
- package/src/resources/extensions/gsd/index.ts +18 -2
- package/src/resources/extensions/gsd/init-wizard.ts +3 -2
- package/src/resources/extensions/gsd/journal.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -5
- package/src/resources/extensions/gsd/memory-store.ts +31 -62
- package/src/resources/extensions/gsd/metrics.ts +26 -0
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +13 -14
- package/src/resources/extensions/gsd/native-git-bridge.ts +11 -12
- package/src/resources/extensions/gsd/notification-widget.ts +2 -2
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +61 -3
- package/src/resources/extensions/gsd/preferences-types.ts +44 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +130 -2
- package/src/resources/extensions/gsd/preferences.ts +28 -0
- package/src/resources/extensions/gsd/prompts/add-tests.md +35 -0
- package/src/resources/extensions/gsd/session-lock.ts +14 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +20 -1
- package/src/resources/extensions/gsd/state.ts +80 -17
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +9 -5
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +10 -7
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
- package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +223 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +26 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +48 -3
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +3 -11
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -7
- package/src/resources/extensions/gsd/types.ts +14 -1
- package/src/resources/extensions/gsd/unit-ownership.ts +2 -2
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +51 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +135 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +241 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +146 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +75 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +105 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +162 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +156 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +27 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +9 -104
- package/src/resources/extensions/gsd/workflow-migration.ts +21 -29
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -1
- package/src/resources/extensions/gsd/workflow-reconcile.ts +15 -15
- package/src/resources/extensions/ttsr/ttsr-manager.ts +10 -5
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/packages/pi-ai/dist/models.custom.d.ts.map +0 -1
- package/packages/pi-ai/dist/models.custom.js.map +0 -1
- package/packages/pi-ai/dist/models.generated.js +0 -14343
- package/packages/pi-ai/dist/models.generated.js.map +0 -1
- package/packages/pi-ai/src/models.generated.ts +0 -14345
- /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → tqdo0yKKYz6fJXQnIgbdx}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
import { VALID_BRANCH_NAME } from "./git-service.js";
|
|
9
9
|
import { normalizeStringArray } from "../shared/format-utils.js";
|
|
10
10
|
import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_TYPES, SKILL_ACTIONS, } from "./preferences-types.js";
|
|
11
|
-
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality"]);
|
|
11
|
+
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
|
|
12
|
+
const VALID_UOK_TURN_ACTIONS = new Set([
|
|
13
|
+
"commit",
|
|
14
|
+
"snapshot",
|
|
15
|
+
"status-only",
|
|
16
|
+
]);
|
|
12
17
|
export function validatePreferences(preferences) {
|
|
13
18
|
const errors = [];
|
|
14
19
|
const warnings = [];
|
|
@@ -136,13 +141,114 @@ export function validatePreferences(preferences) {
|
|
|
136
141
|
errors.push(`budget_enforcement must be one of: warn, pause, halt`);
|
|
137
142
|
}
|
|
138
143
|
}
|
|
144
|
+
// ─── UOK Flags ──────────────────────────────────────────────────────
|
|
145
|
+
if (preferences.uok !== undefined) {
|
|
146
|
+
if (typeof preferences.uok === "object" && preferences.uok !== null) {
|
|
147
|
+
const raw = preferences.uok;
|
|
148
|
+
const valid = {};
|
|
149
|
+
if (raw.enabled !== undefined) {
|
|
150
|
+
if (typeof raw.enabled === "boolean")
|
|
151
|
+
valid.enabled = raw.enabled;
|
|
152
|
+
else
|
|
153
|
+
errors.push("uok.enabled must be a boolean");
|
|
154
|
+
}
|
|
155
|
+
const parseEnabledBlock = (key) => {
|
|
156
|
+
const value = raw[key];
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return;
|
|
159
|
+
if (typeof value !== "object" || value === null) {
|
|
160
|
+
errors.push(`uok.${key} must be an object`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const block = value;
|
|
164
|
+
const parsed = {};
|
|
165
|
+
if (block.enabled !== undefined) {
|
|
166
|
+
if (typeof block.enabled === "boolean")
|
|
167
|
+
parsed.enabled = block.enabled;
|
|
168
|
+
else
|
|
169
|
+
errors.push(`uok.${key}.enabled must be a boolean`);
|
|
170
|
+
}
|
|
171
|
+
const unknown = Object.keys(block).filter((k) => k !== "enabled");
|
|
172
|
+
for (const unk of unknown) {
|
|
173
|
+
warnings.push(`unknown uok.${key} key "${unk}" — ignored`);
|
|
174
|
+
}
|
|
175
|
+
if (Object.keys(parsed).length > 0) {
|
|
176
|
+
valid[key] = parsed;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
parseEnabledBlock("legacy_fallback");
|
|
180
|
+
parseEnabledBlock("gates");
|
|
181
|
+
parseEnabledBlock("model_policy");
|
|
182
|
+
parseEnabledBlock("execution_graph");
|
|
183
|
+
parseEnabledBlock("audit_unified");
|
|
184
|
+
parseEnabledBlock("plan_v2");
|
|
185
|
+
if (raw.gitops !== undefined) {
|
|
186
|
+
if (typeof raw.gitops !== "object" || raw.gitops === null) {
|
|
187
|
+
errors.push("uok.gitops must be an object");
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const gitops = raw.gitops;
|
|
191
|
+
const parsed = {};
|
|
192
|
+
if (gitops.enabled !== undefined) {
|
|
193
|
+
if (typeof gitops.enabled === "boolean")
|
|
194
|
+
parsed.enabled = gitops.enabled;
|
|
195
|
+
else
|
|
196
|
+
errors.push("uok.gitops.enabled must be a boolean");
|
|
197
|
+
}
|
|
198
|
+
if (gitops.turn_action !== undefined) {
|
|
199
|
+
if (typeof gitops.turn_action === "string" &&
|
|
200
|
+
VALID_UOK_TURN_ACTIONS.has(gitops.turn_action)) {
|
|
201
|
+
parsed.turn_action = gitops.turn_action;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
errors.push("uok.gitops.turn_action must be one of: commit, snapshot, status-only");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (gitops.turn_push !== undefined) {
|
|
208
|
+
if (typeof gitops.turn_push === "boolean")
|
|
209
|
+
parsed.turn_push = gitops.turn_push;
|
|
210
|
+
else
|
|
211
|
+
errors.push("uok.gitops.turn_push must be a boolean");
|
|
212
|
+
}
|
|
213
|
+
const unknown = Object.keys(gitops).filter((k) => !["enabled", "turn_action", "turn_push"].includes(k));
|
|
214
|
+
for (const unk of unknown) {
|
|
215
|
+
warnings.push(`unknown uok.gitops key "${unk}" — ignored`);
|
|
216
|
+
}
|
|
217
|
+
if (Object.keys(parsed).length > 0) {
|
|
218
|
+
valid.gitops = parsed;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const knownUokKeys = new Set([
|
|
223
|
+
"enabled",
|
|
224
|
+
"legacy_fallback",
|
|
225
|
+
"gates",
|
|
226
|
+
"model_policy",
|
|
227
|
+
"execution_graph",
|
|
228
|
+
"gitops",
|
|
229
|
+
"audit_unified",
|
|
230
|
+
"plan_v2",
|
|
231
|
+
]);
|
|
232
|
+
for (const key of Object.keys(raw)) {
|
|
233
|
+
if (!knownUokKeys.has(key)) {
|
|
234
|
+
warnings.push(`unknown uok key "${key}" — ignored`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (Object.keys(valid).length > 0) {
|
|
238
|
+
validated.uok = valid;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
errors.push("uok must be an object");
|
|
243
|
+
}
|
|
244
|
+
}
|
|
139
245
|
// ─── Token Profile ─────────────────────────────────────────────────
|
|
140
246
|
if (preferences.token_profile !== undefined) {
|
|
141
247
|
if (typeof preferences.token_profile === "string" && VALID_TOKEN_PROFILES.has(preferences.token_profile)) {
|
|
142
248
|
validated.token_profile = preferences.token_profile;
|
|
143
249
|
}
|
|
144
250
|
else {
|
|
145
|
-
errors.push(`token_profile must be one of: budget, balanced, quality`);
|
|
251
|
+
errors.push(`token_profile must be one of: budget, balanced, quality, burn-max`);
|
|
146
252
|
}
|
|
147
253
|
}
|
|
148
254
|
// ─── Search Provider ─────────────────────────────────────────────
|
|
@@ -155,6 +261,28 @@ export function validatePreferences(preferences) {
|
|
|
155
261
|
errors.push(`search_provider must be one of: brave, tavily, ollama, native, auto`);
|
|
156
262
|
}
|
|
157
263
|
}
|
|
264
|
+
// ─── Flat-rate Providers ────────────────────────────────────────────
|
|
265
|
+
// User-declared flat-rate providers for dynamic routing suppression.
|
|
266
|
+
// Built-in providers (github-copilot, copilot, claude-code) and any
|
|
267
|
+
// externalCli provider are already auto-detected; this list layers on
|
|
268
|
+
// top for private subscription proxies and custom CLI wrappers.
|
|
269
|
+
if (preferences.flat_rate_providers !== undefined) {
|
|
270
|
+
if (Array.isArray(preferences.flat_rate_providers)) {
|
|
271
|
+
const allStrings = preferences.flat_rate_providers.every((item) => typeof item === "string");
|
|
272
|
+
if (allStrings) {
|
|
273
|
+
// Strip empty/whitespace-only entries to avoid false matches.
|
|
274
|
+
validated.flat_rate_providers = preferences.flat_rate_providers
|
|
275
|
+
.map((s) => s.trim())
|
|
276
|
+
.filter((s) => s.length > 0);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
errors.push("flat_rate_providers must be an array of strings");
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
errors.push("flat_rate_providers must be an array of strings");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
158
286
|
// ─── Phase Skip Preferences ─────────────────────────────────────────
|
|
159
287
|
if (preferences.phases !== undefined) {
|
|
160
288
|
if (typeof preferences.phases === "object" && preferences.phases !== null) {
|
|
@@ -293,6 +293,32 @@ function mergePreferences(base, override) {
|
|
|
293
293
|
dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
|
|
294
294
|
? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) }
|
|
295
295
|
: undefined,
|
|
296
|
+
uok: (base.uok || override.uok)
|
|
297
|
+
? {
|
|
298
|
+
enabled: override.uok?.enabled ?? base.uok?.enabled,
|
|
299
|
+
legacy_fallback: (base.uok?.legacy_fallback || override.uok?.legacy_fallback)
|
|
300
|
+
? { ...(base.uok?.legacy_fallback ?? {}), ...(override.uok?.legacy_fallback ?? {}) }
|
|
301
|
+
: undefined,
|
|
302
|
+
gates: (base.uok?.gates || override.uok?.gates)
|
|
303
|
+
? { ...(base.uok?.gates ?? {}), ...(override.uok?.gates ?? {}) }
|
|
304
|
+
: undefined,
|
|
305
|
+
model_policy: (base.uok?.model_policy || override.uok?.model_policy)
|
|
306
|
+
? { ...(base.uok?.model_policy ?? {}), ...(override.uok?.model_policy ?? {}) }
|
|
307
|
+
: undefined,
|
|
308
|
+
execution_graph: (base.uok?.execution_graph || override.uok?.execution_graph)
|
|
309
|
+
? { ...(base.uok?.execution_graph ?? {}), ...(override.uok?.execution_graph ?? {}) }
|
|
310
|
+
: undefined,
|
|
311
|
+
gitops: (base.uok?.gitops || override.uok?.gitops)
|
|
312
|
+
? { ...(base.uok?.gitops ?? {}), ...(override.uok?.gitops ?? {}) }
|
|
313
|
+
: undefined,
|
|
314
|
+
audit_unified: (base.uok?.audit_unified || override.uok?.audit_unified)
|
|
315
|
+
? { ...(base.uok?.audit_unified ?? {}), ...(override.uok?.audit_unified ?? {}) }
|
|
316
|
+
: undefined,
|
|
317
|
+
plan_v2: (base.uok?.plan_v2 || override.uok?.plan_v2)
|
|
318
|
+
? { ...(base.uok?.plan_v2 ?? {}), ...(override.uok?.plan_v2 ?? {}) }
|
|
319
|
+
: undefined,
|
|
320
|
+
}
|
|
321
|
+
: undefined,
|
|
296
322
|
token_profile: override.token_profile ?? base.token_profile,
|
|
297
323
|
phases: (base.phases || override.phases)
|
|
298
324
|
? { ...(base.phases ?? {}), ...(override.phases ?? {}) }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
You are generating tests for recently completed GSD work.
|
|
2
|
+
|
|
3
|
+
## Slice: {{sliceId}} — {{sliceTitle}}
|
|
4
|
+
|
|
5
|
+
### Summary
|
|
6
|
+
|
|
7
|
+
{{sliceSummary}}
|
|
8
|
+
|
|
9
|
+
### Existing Test Patterns
|
|
10
|
+
|
|
11
|
+
{{existingTestPatterns}}
|
|
12
|
+
|
|
13
|
+
## Working Directory
|
|
14
|
+
|
|
15
|
+
`{{workingDirectory}}`
|
|
16
|
+
|
|
17
|
+
## Instructions
|
|
18
|
+
|
|
19
|
+
1. Read the slice summary above to understand what was built
|
|
20
|
+
2. Identify the source files that were created or modified for this slice
|
|
21
|
+
3. Read the implementation code to understand behavior, edge cases, and error paths
|
|
22
|
+
4. Write comprehensive tests following the project's existing test patterns and framework
|
|
23
|
+
5. Run the tests to verify they pass
|
|
24
|
+
6. Fix any failures
|
|
25
|
+
|
|
26
|
+
### Rules
|
|
27
|
+
|
|
28
|
+
- Follow the project's existing test patterns (framework, assertions, file structure)
|
|
29
|
+
- Test behavior, not implementation details
|
|
30
|
+
- Cover: happy path, edge cases, error conditions, boundary values
|
|
31
|
+
- Do NOT modify implementation files — only create or update test files
|
|
32
|
+
- Name test files consistently with the project's conventions
|
|
33
|
+
- Keep tests focused and readable
|
|
34
|
+
|
|
35
|
+
{{skillActivation}}
|
|
@@ -21,6 +21,7 @@ import { createWorktree, worktreePath, removeWorktree } from "./worktree-manager
|
|
|
21
21
|
import { writeSessionStatus, } from "./session-status-io.js";
|
|
22
22
|
import { hasFileConflict } from "./slice-parallel-conflict.js";
|
|
23
23
|
import { getErrorMessage } from "./error-utils.js";
|
|
24
|
+
import { selectConflictFreeBatch } from "./uok/execution-graph.js";
|
|
24
25
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
25
26
|
let sliceState = null;
|
|
26
27
|
// ─── Public API ────────────────────────────────────────────────────────────
|
|
@@ -62,7 +63,7 @@ export async function startSliceParallel(basePath, milestoneId, eligibleSlices,
|
|
|
62
63
|
const started = [];
|
|
63
64
|
const errors = [];
|
|
64
65
|
// Filter out conflicting slices (conservative: check all pairs)
|
|
65
|
-
const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices);
|
|
66
|
+
const safeSlices = filterConflictingSlices(basePath, milestoneId, eligibleSlices, opts.useExecutionGraph === true);
|
|
66
67
|
// Limit to maxWorkers
|
|
67
68
|
const toSpawn = safeSlices.slice(0, maxWorkers);
|
|
68
69
|
for (const slice of toSpawn) {
|
|
@@ -176,7 +177,16 @@ export function resetSliceOrchestrator() {
|
|
|
176
177
|
* Greedy: add slices to the safe set in order; skip any that conflict
|
|
177
178
|
* with an already-included slice.
|
|
178
179
|
*/
|
|
179
|
-
function filterConflictingSlices(basePath, milestoneId, slices) {
|
|
180
|
+
function filterConflictingSlices(basePath, milestoneId, slices, useExecutionGraph) {
|
|
181
|
+
if (useExecutionGraph) {
|
|
182
|
+
const selectedIds = selectConflictFreeBatch({
|
|
183
|
+
orderedIds: slices.map((slice) => slice.id),
|
|
184
|
+
maxParallel: slices.length,
|
|
185
|
+
hasConflict: (candidate, existing) => hasFileConflict(basePath, milestoneId, candidate, existing),
|
|
186
|
+
});
|
|
187
|
+
const selected = new Set(selectedIds);
|
|
188
|
+
return slices.filter((slice) => selected.has(slice.id));
|
|
189
|
+
}
|
|
180
190
|
const safe = [];
|
|
181
191
|
for (const candidate of slices) {
|
|
182
192
|
let conflictsWithSafe = false;
|
|
@@ -271,7 +271,11 @@ function reconcileDiskToDb(basePath) {
|
|
|
271
271
|
try {
|
|
272
272
|
roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
273
273
|
}
|
|
274
|
-
catch {
|
|
274
|
+
catch (err) {
|
|
275
|
+
logWarning("state", "reconcileDiskToDb: roadmap read failed, skipping milestone", {
|
|
276
|
+
mid,
|
|
277
|
+
error: err.message,
|
|
278
|
+
});
|
|
275
279
|
continue;
|
|
276
280
|
}
|
|
277
281
|
const parsed = parseRoadmap(roadmapContent);
|
|
@@ -312,6 +316,10 @@ function reconcileDiskToDb(basePath) {
|
|
|
312
316
|
function buildCompletenessSet(basePath, milestones) {
|
|
313
317
|
const completeMilestoneIds = new Set();
|
|
314
318
|
const parkedMilestoneIds = new Set();
|
|
319
|
+
// DB-authoritative: a milestone is only "complete" when its DB row says so.
|
|
320
|
+
// SUMMARY-file presence is NOT a completion signal here — an orphan SUMMARY
|
|
321
|
+
// (crashed complete-milestone turn, partial merge, manual edit) must not
|
|
322
|
+
// flip derived state to complete and cascade into a false auto-merge (#4179).
|
|
315
323
|
for (const m of milestones) {
|
|
316
324
|
const parkedFile = resolveMilestoneFile(basePath, m.id, "PARKED");
|
|
317
325
|
if (parkedFile || m.status === 'parked') {
|
|
@@ -322,11 +330,6 @@ function buildCompletenessSet(basePath, milestones) {
|
|
|
322
330
|
completeMilestoneIds.add(m.id);
|
|
323
331
|
continue;
|
|
324
332
|
}
|
|
325
|
-
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
326
|
-
if (summaryFile) {
|
|
327
|
-
completeMilestoneIds.add(m.id);
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
333
|
}
|
|
331
334
|
return { completeMilestoneIds, parkedMilestoneIds };
|
|
332
335
|
}
|
|
@@ -347,17 +350,22 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
347
350
|
if (isGhostMilestone(basePath, m.id))
|
|
348
351
|
continue;
|
|
349
352
|
}
|
|
350
|
-
|
|
351
|
-
|
|
353
|
+
// DB-authoritative completeness (#4179): only trust completeMilestoneIds,
|
|
354
|
+
// which is itself derived from DB status. SUMMARY-file presence alone must
|
|
355
|
+
// not imply completion. The summary file may still be consulted below as a
|
|
356
|
+
// title source for legitimately-complete milestones whose DB row has no title.
|
|
357
|
+
if (completeMilestoneIds.has(m.id)) {
|
|
352
358
|
let title = stripMilestonePrefix(m.title) || m.id;
|
|
353
|
-
if (
|
|
354
|
-
const
|
|
355
|
-
if (
|
|
356
|
-
|
|
359
|
+
if (!m.title) {
|
|
360
|
+
const summaryFile = resolveMilestoneFile(basePath, m.id, "SUMMARY");
|
|
361
|
+
if (summaryFile) {
|
|
362
|
+
const summaryContent = await loadFile(summaryFile);
|
|
363
|
+
if (summaryContent) {
|
|
364
|
+
title = parseSummary(summaryContent).title || m.id;
|
|
365
|
+
}
|
|
357
366
|
}
|
|
358
367
|
}
|
|
359
368
|
registry.push({ id: m.id, title, status: 'complete' });
|
|
360
|
-
completeMilestoneIds.add(m.id);
|
|
361
369
|
continue;
|
|
362
370
|
}
|
|
363
371
|
const allSlicesDone = slices.length > 0 && slices.every(s => isStatusDone(s.status));
|
|
@@ -391,7 +399,14 @@ async function buildRegistryAndFindActive(basePath, milestones, completeMileston
|
|
|
391
399
|
const validationFile = resolveMilestoneFile(basePath, m.id, "VALIDATION");
|
|
392
400
|
const validationContent = validationFile ? await loadFile(validationFile) : null;
|
|
393
401
|
const validationTerminal = validationContent ? isValidationTerminal(validationContent) : false;
|
|
394
|
-
|
|
402
|
+
// DB-authoritative (#4179): completeness is already decided by
|
|
403
|
+
// completeMilestoneIds above. If we reached this branch, the DB says
|
|
404
|
+
// the milestone is NOT complete — so any SUMMARY file on disk is an
|
|
405
|
+
// orphan (crashed complete-milestone, partial merge, manual edit) and
|
|
406
|
+
// must not short-circuit this path. When validation is terminal, fall
|
|
407
|
+
// through to the default active-push below so `complete-milestone` can
|
|
408
|
+
// re-run idempotently.
|
|
409
|
+
if (!validationTerminal) {
|
|
395
410
|
activeMilestone = { id: m.id, title };
|
|
396
411
|
activeMilestoneSlices = slices;
|
|
397
412
|
activeMilestoneFound = true;
|
|
@@ -516,6 +531,9 @@ function resolveSliceDependencies(activeMilestoneSlices) {
|
|
|
516
531
|
return { activeSlice: null, activeSliceRow: null };
|
|
517
532
|
}
|
|
518
533
|
}
|
|
534
|
+
// First pass: find a slice with ALL dependencies satisfied (strict)
|
|
535
|
+
let bestFallback = null;
|
|
536
|
+
let bestFallbackSatisfied = -1;
|
|
519
537
|
for (const s of activeMilestoneSlices) {
|
|
520
538
|
if (isStatusDone(s.status))
|
|
521
539
|
continue;
|
|
@@ -524,6 +542,23 @@ function resolveSliceDependencies(activeMilestoneSlices) {
|
|
|
524
542
|
if (s.depends.every(dep => doneSliceIds.has(dep))) {
|
|
525
543
|
return { activeSlice: { id: s.id, title: s.title }, activeSliceRow: s };
|
|
526
544
|
}
|
|
545
|
+
// Track the slice with the most satisfied dependencies as fallback
|
|
546
|
+
const satisfied = s.depends.filter(dep => doneSliceIds.has(dep)).length;
|
|
547
|
+
if (satisfied > bestFallbackSatisfied || (satisfied === bestFallbackSatisfied && !bestFallback)) {
|
|
548
|
+
bestFallback = s;
|
|
549
|
+
bestFallbackSatisfied = satisfied;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
// Fallback: if no slice has all deps met but there ARE incomplete non-deferred
|
|
553
|
+
// slices, pick the one with the most deps satisfied. This prevents hard-blocking
|
|
554
|
+
// when dependency metadata is stale (e.g. after reassessment added/removed slices)
|
|
555
|
+
// or when deps reference slices from previous milestones.
|
|
556
|
+
if (bestFallback) {
|
|
557
|
+
const unmet = bestFallback.depends.filter(dep => !doneSliceIds.has(dep));
|
|
558
|
+
logWarning("state", `No slice has all deps satisfied — falling back to ${bestFallback.id} ` +
|
|
559
|
+
`(${bestFallbackSatisfied}/${bestFallback.depends.length} deps met, ` +
|
|
560
|
+
`unmet: ${unmet.join(", ")})`, { mid: activeMilestoneSlices[0]?.milestone_id, sid: bestFallback.id });
|
|
561
|
+
return { activeSlice: { id: bestFallback.id, title: bestFallback.title }, activeSliceRow: bestFallback };
|
|
527
562
|
}
|
|
528
563
|
return { activeSlice: null, activeSliceRow: null };
|
|
529
564
|
}
|
|
@@ -567,7 +602,7 @@ async function reconcileSliceTasks(basePath, milestoneId, sliceId, planFile) {
|
|
|
567
602
|
const summaryPath = resolveTaskFile(basePath, milestoneId, sliceId, t.id, "SUMMARY");
|
|
568
603
|
if (summaryPath && existsSync(summaryPath)) {
|
|
569
604
|
try {
|
|
570
|
-
updateTaskStatus(milestoneId, sliceId, t.id, "complete");
|
|
605
|
+
updateTaskStatus(milestoneId, sliceId, t.id, "complete", new Date().toISOString());
|
|
571
606
|
logWarning("reconcile", `task ${milestoneId}/${sliceId}/${t.id} status reconciled from "${t.status}" to "complete" (#2514)`, { mid: milestoneId, sid: sliceId, tid: t.id });
|
|
572
607
|
reconciled = true;
|
|
573
608
|
}
|
|
@@ -1269,6 +1304,8 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1269
1304
|
}
|
|
1270
1305
|
}
|
|
1271
1306
|
else {
|
|
1307
|
+
let bestFallbackLegacy = null;
|
|
1308
|
+
let bestFallbackLegacySatisfied = -1;
|
|
1272
1309
|
for (const s of activeRoadmap.slices) {
|
|
1273
1310
|
if (s.done)
|
|
1274
1311
|
continue;
|
|
@@ -1276,6 +1313,20 @@ export async function _deriveStateImpl(basePath) {
|
|
|
1276
1313
|
activeSlice = { id: s.id, title: s.title };
|
|
1277
1314
|
break;
|
|
1278
1315
|
}
|
|
1316
|
+
// Track best fallback
|
|
1317
|
+
const satisfied = s.depends.filter(dep => doneSliceIds.has(dep)).length;
|
|
1318
|
+
if (satisfied > bestFallbackLegacySatisfied) {
|
|
1319
|
+
bestFallbackLegacy = s;
|
|
1320
|
+
bestFallbackLegacySatisfied = satisfied;
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
// Fallback: if no slice has all deps met, pick the one with the most deps satisfied
|
|
1324
|
+
if (!activeSlice && bestFallbackLegacy) {
|
|
1325
|
+
const unmet = bestFallbackLegacy.depends.filter(dep => !doneSliceIds.has(dep));
|
|
1326
|
+
logWarning("state", `No slice has all deps satisfied — falling back to ${bestFallbackLegacy.id} ` +
|
|
1327
|
+
`(${bestFallbackLegacySatisfied}/${bestFallbackLegacy.depends.length} deps met, ` +
|
|
1328
|
+
`unmet: ${unmet.join(", ")})`);
|
|
1329
|
+
activeSlice = { id: bestFallbackLegacy.id, title: bestFallbackLegacy.title };
|
|
1279
1330
|
}
|
|
1280
1331
|
}
|
|
1281
1332
|
if (!activeSlice) {
|
|
@@ -39,6 +39,24 @@ dynamic_routing:
|
|
|
39
39
|
budget_pressure:
|
|
40
40
|
cross_provider:
|
|
41
41
|
hooks:
|
|
42
|
+
uok:
|
|
43
|
+
enabled: true
|
|
44
|
+
legacy_fallback:
|
|
45
|
+
enabled: false
|
|
46
|
+
gates:
|
|
47
|
+
enabled: false
|
|
48
|
+
model_policy:
|
|
49
|
+
enabled: false
|
|
50
|
+
execution_graph:
|
|
51
|
+
enabled: false
|
|
52
|
+
gitops:
|
|
53
|
+
enabled: false
|
|
54
|
+
turn_action: status-only
|
|
55
|
+
turn_push: false
|
|
56
|
+
audit_unified:
|
|
57
|
+
enabled: false
|
|
58
|
+
plan_v2:
|
|
59
|
+
enabled: false
|
|
42
60
|
auto_visualize:
|
|
43
61
|
auto_report:
|
|
44
62
|
parallel:
|
|
@@ -354,6 +354,26 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
354
354
|
catch (eventErr) {
|
|
355
355
|
logError("tool", `complete-slice event log FAILED — completion invisible to reconciliation`, { error: eventErr.message });
|
|
356
356
|
}
|
|
357
|
+
// Fire-and-forget graph rebuild — must NOT await, must NOT crash slice completion.
|
|
358
|
+
// Dynamic import of the package name (not a relative path) so it resolves
|
|
359
|
+
// correctly via package.json#exports in both development and production.
|
|
360
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
361
|
+
(async () => {
|
|
362
|
+
try {
|
|
363
|
+
const graphMod = await import("@gsd-build/mcp-server");
|
|
364
|
+
if (typeof graphMod.buildGraph !== "function"
|
|
365
|
+
|| typeof graphMod.writeGraph !== "function"
|
|
366
|
+
|| typeof graphMod.resolveGsdRoot !== "function") {
|
|
367
|
+
throw new Error("graph helpers unavailable from @gsd-build/mcp-server");
|
|
368
|
+
}
|
|
369
|
+
const g = await graphMod.buildGraph(basePath);
|
|
370
|
+
await graphMod.writeGraph(graphMod.resolveGsdRoot(basePath), g);
|
|
371
|
+
}
|
|
372
|
+
catch (graphErr) {
|
|
373
|
+
// Graph rebuild is best-effort — log at warning level but never propagate
|
|
374
|
+
logWarning("tool", `complete-slice graph rebuild failed (non-fatal): ${graphErr.message ?? String(graphErr)}`);
|
|
375
|
+
}
|
|
376
|
+
})();
|
|
357
377
|
return {
|
|
358
378
|
sliceId: params.sliceId,
|
|
359
379
|
milestoneId: params.milestoneId,
|
|
@@ -16,6 +16,9 @@ import { invalidateStateCache } from "../state.js";
|
|
|
16
16
|
import { VALIDATION_VERDICTS, isValidMilestoneVerdict } from "../verdict-parser.js";
|
|
17
17
|
import { insertMilestoneValidationGates } from "../milestone-validation-gates.js";
|
|
18
18
|
import { logWarning } from "../workflow-logger.js";
|
|
19
|
+
import { UokGateRunner } from "../uok/gate-runner.js";
|
|
20
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
21
|
+
import { resolveUokFlags } from "../uok/flags.js";
|
|
19
22
|
function renderValidationMarkdown(params) {
|
|
20
23
|
let md = `---
|
|
21
24
|
verdict: ${params.verdict}
|
|
@@ -48,7 +51,7 @@ ${params.verdictRationale}
|
|
|
48
51
|
}
|
|
49
52
|
return md;
|
|
50
53
|
}
|
|
51
|
-
export async function handleValidateMilestone(params, basePath) {
|
|
54
|
+
export async function handleValidateMilestone(params, basePath, opts) {
|
|
52
55
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
53
56
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
54
57
|
}
|
|
@@ -73,6 +76,8 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
73
76
|
// rendering can regenerate. The inverse (file exists, no DB row) is
|
|
74
77
|
// harder to detect and recover from (#2725).
|
|
75
78
|
const validatedAt = new Date().toISOString();
|
|
79
|
+
const slices = getMilestoneSlices(params.milestoneId);
|
|
80
|
+
const gateSliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
76
81
|
transaction(() => {
|
|
77
82
|
insertAssessment({
|
|
78
83
|
path: validationPath,
|
|
@@ -86,9 +91,7 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
86
91
|
// #2945 Bug 4: persist quality_gates records alongside the assessment.
|
|
87
92
|
// Previously only the assessment was written, leaving M002+ milestones
|
|
88
93
|
// with zero quality_gate records despite passing validation.
|
|
89
|
-
|
|
90
|
-
const sliceId = slices.length > 0 ? slices[0].id : "_milestone";
|
|
91
|
-
insertMilestoneValidationGates(params.milestoneId, sliceId, params.verdict, validatedAt);
|
|
94
|
+
insertMilestoneValidationGates(params.milestoneId, gateSliceId, params.verdict, validatedAt);
|
|
92
95
|
});
|
|
93
96
|
// ── Filesystem render (outside transaction) ────────────────────────────
|
|
94
97
|
// If disk render fails, roll back the DB row so state stays consistent.
|
|
@@ -103,6 +106,38 @@ export async function handleValidateMilestone(params, basePath) {
|
|
|
103
106
|
invalidateStateCache();
|
|
104
107
|
clearPathCache();
|
|
105
108
|
clearParseCache();
|
|
109
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
110
|
+
const gatesEnabled = opts?.uokGatesEnabled ?? resolveUokFlags(prefs).gates;
|
|
111
|
+
if (gatesEnabled) {
|
|
112
|
+
try {
|
|
113
|
+
const gateRunner = new UokGateRunner();
|
|
114
|
+
const nonPassVerdict = params.verdict !== "pass";
|
|
115
|
+
gateRunner.register({
|
|
116
|
+
id: "milestone-validation-gates",
|
|
117
|
+
type: "verification",
|
|
118
|
+
execute: async () => ({
|
|
119
|
+
outcome: nonPassVerdict ? "manual-attention" : "pass",
|
|
120
|
+
failureClass: nonPassVerdict ? "manual-attention" : "none",
|
|
121
|
+
rationale: `milestone validation verdict: ${params.verdict}`,
|
|
122
|
+
findings: nonPassVerdict
|
|
123
|
+
? [params.verdictRationale, params.remediationPlan ?? ""].filter(Boolean).join("\n")
|
|
124
|
+
: "",
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
await gateRunner.run("milestone-validation-gates", {
|
|
128
|
+
basePath,
|
|
129
|
+
traceId: opts?.traceId ?? `validate-milestone:${params.milestoneId}`,
|
|
130
|
+
turnId: opts?.turnId ?? `${params.milestoneId}:validate`,
|
|
131
|
+
milestoneId: params.milestoneId,
|
|
132
|
+
sliceId: gateSliceId,
|
|
133
|
+
unitType: "validate-milestone",
|
|
134
|
+
unitId: params.milestoneId,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
logWarning("tool", `validate_milestone — failed to persist UOK gate result: ${err.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
106
141
|
return {
|
|
107
142
|
milestoneId: params.milestoneId,
|
|
108
143
|
verdict: params.verdict,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
|
|
2
2
|
import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-milestone.js";
|
|
3
3
|
import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
|
|
4
|
-
import { getMilestone, getSliceStatusSummary, getSliceTaskCounts,
|
|
4
|
+
import { getMilestone, getSliceStatusSummary, getSliceTaskCounts, readTransaction, saveGateResult, } from "../gsd-db.js";
|
|
5
5
|
import { GATE_REGISTRY } from "../gate-registry.js";
|
|
6
6
|
import { saveArtifactToDb } from "../db-writer.js";
|
|
7
7
|
import { handleCompleteMilestone } from "./complete-milestone.js";
|
|
@@ -493,12 +493,9 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
|
|
|
493
493
|
isError: true,
|
|
494
494
|
};
|
|
495
495
|
}
|
|
496
|
-
|
|
497
|
-
adapter.exec("BEGIN");
|
|
498
|
-
try {
|
|
496
|
+
return readTransaction(() => {
|
|
499
497
|
const milestone = getMilestone(params.milestoneId);
|
|
500
498
|
if (!milestone) {
|
|
501
|
-
adapter.exec("COMMIT");
|
|
502
499
|
return {
|
|
503
500
|
content: [{ type: "text", text: `Milestone ${params.milestoneId} not found in database.` }],
|
|
504
501
|
details: { operation: "milestone_status", milestoneId: params.milestoneId, found: false },
|
|
@@ -510,7 +507,6 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
|
|
|
510
507
|
status: s.status,
|
|
511
508
|
taskCounts: getSliceTaskCounts(params.milestoneId, s.id),
|
|
512
509
|
}));
|
|
513
|
-
adapter.exec("COMMIT");
|
|
514
510
|
const result = {
|
|
515
511
|
milestoneId: milestone.id,
|
|
516
512
|
title: milestone.title,
|
|
@@ -524,14 +520,7 @@ export async function executeMilestoneStatus(params, basePath = process.cwd()) {
|
|
|
524
520
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
525
521
|
details: { operation: "milestone_status", milestoneId: milestone.id, sliceCount: slices.length },
|
|
526
522
|
};
|
|
527
|
-
}
|
|
528
|
-
catch (txErr) {
|
|
529
|
-
try {
|
|
530
|
-
adapter.exec("ROLLBACK");
|
|
531
|
-
}
|
|
532
|
-
catch { /* swallow */ }
|
|
533
|
-
throw txErr;
|
|
534
|
-
}
|
|
523
|
+
});
|
|
535
524
|
}
|
|
536
525
|
catch (err) {
|
|
537
526
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -83,12 +83,9 @@ export function executeReplan(basePath, mid, sid, capture) {
|
|
|
83
83
|
// Also write replan_triggered_at column for DB-backed detection
|
|
84
84
|
try {
|
|
85
85
|
const req = createRequire(import.meta.url);
|
|
86
|
-
const { isDbAvailable,
|
|
86
|
+
const { isDbAvailable, setSliceReplanTriggeredAt } = req("./gsd-db.js");
|
|
87
87
|
if (isDbAvailable()) {
|
|
88
|
-
|
|
89
|
-
if (adapter) {
|
|
90
|
-
adapter.prepare("UPDATE slices SET replan_triggered_at = :ts WHERE milestone_id = :mid AND id = :sid").run({ ":ts": ts, ":mid": mid, ":sid": sid });
|
|
91
|
-
}
|
|
88
|
+
setSliceReplanTriggeredAt(mid, sid, ts);
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
91
|
catch {
|
|
@@ -20,7 +20,7 @@ let providerModule = null;
|
|
|
20
20
|
let loadAttempted = false;
|
|
21
21
|
function suppressSqliteWarning() {
|
|
22
22
|
const origEmit = process.emit;
|
|
23
|
-
//
|
|
23
|
+
// Override via loose cast: Node's overloaded emit signature is not directly assignable.
|
|
24
24
|
process.emit = function (event, ...args) {
|
|
25
25
|
if (event === "warning" &&
|
|
26
26
|
args[0] &&
|