gsd-pi 2.74.0-dev.2b524c3 → 2.74.0-dev.703eabc
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.js +85 -0
- package/dist/headless-query.js +4 -1
- package/dist/help-text.js +23 -0
- 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 +158 -4
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +51 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +220 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +12 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +18 -0
- package/dist/resources/extensions/gsd/auto-verification.js +100 -2
- package/dist/resources/extensions/gsd/auto.js +36 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +30 -8
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +45 -4
- 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-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 +14 -1
- 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/parallel-orchestrator.js +33 -1
- package/dist/resources/extensions/gsd/preferences-models.js +20 -3
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +108 -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 +5 -1
- 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/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.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/resize/route.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/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- 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/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/package.json +3 -2
- 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 +1 -9
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -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/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +74 -40
- package/packages/pi-ai/src/index.ts +1 -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/tsconfig.json +1 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -2
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +472 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- 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/__tests__/tool-execution.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- 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 +23 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +51 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +22 -22
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- 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 +232 -18
- 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 +53 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +12 -6
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +612 -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/__tests__/tool-execution.test.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +25 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +66 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +23 -26
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +298 -41
- 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 +73 -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/package.json +1 -1
- 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/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 +191 -4
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -6
- package/src/resources/extensions/gsd/auto-model-selection.ts +66 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +238 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +25 -1
- package/src/resources/extensions/gsd/auto-verification.ts +129 -2
- package/src/resources/extensions/gsd/auto.ts +41 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +38 -8
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +56 -3
- 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-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 +14 -1
- 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/parallel-orchestrator.ts +40 -1
- package/src/resources/extensions/gsd/preferences-models.ts +20 -3
- package/src/resources/extensions/gsd/preferences-types.ts +32 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +107 -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 +9 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +18 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +7 -3
- 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-slice.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- 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/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/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/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/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/token-profile.test.ts +8 -5
- 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-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/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/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{YzIEI9sxJy4t5xgClF08g → 3U-oZ5FT59BM7sm2GInic}/_ssgManifest.js +0 -0
|
@@ -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);
|
|
@@ -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] &&
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { gsdRoot } from "../paths.js";
|
|
5
|
+
import { isDbAvailable, insertAuditEvent } from "../gsd-db.js";
|
|
6
|
+
function auditLogPath(basePath) {
|
|
7
|
+
return join(gsdRoot(basePath), "audit", "events.jsonl");
|
|
8
|
+
}
|
|
9
|
+
function ensureAuditDir(basePath) {
|
|
10
|
+
mkdirSync(join(gsdRoot(basePath), "audit"), { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
export function buildAuditEnvelope(args) {
|
|
13
|
+
return {
|
|
14
|
+
eventId: randomUUID(),
|
|
15
|
+
traceId: args.traceId,
|
|
16
|
+
turnId: args.turnId,
|
|
17
|
+
causedBy: args.causedBy,
|
|
18
|
+
category: args.category,
|
|
19
|
+
type: args.type,
|
|
20
|
+
ts: new Date().toISOString(),
|
|
21
|
+
payload: args.payload ?? {},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function emitUokAuditEvent(basePath, event) {
|
|
25
|
+
try {
|
|
26
|
+
ensureAuditDir(basePath);
|
|
27
|
+
appendFileSync(auditLogPath(basePath), `${JSON.stringify(event)}\n`, "utf-8");
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Best-effort: audit writes must never break orchestration.
|
|
31
|
+
}
|
|
32
|
+
if (!isDbAvailable())
|
|
33
|
+
return;
|
|
34
|
+
try {
|
|
35
|
+
insertAuditEvent(event);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Projection failures are non-fatal while legacy readers are still active.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
export function selectConflictFreeBatch({ orderedIds, maxParallel, hasConflict, }) {
|
|
2
|
+
if (maxParallel <= 0 || orderedIds.length === 0)
|
|
3
|
+
return [];
|
|
4
|
+
const selected = [];
|
|
5
|
+
for (const candidate of orderedIds) {
|
|
6
|
+
if (selected.length >= maxParallel)
|
|
7
|
+
break;
|
|
8
|
+
const conflictsExisting = selected.some((existing) => hasConflict(candidate, existing));
|
|
9
|
+
if (conflictsExisting)
|
|
10
|
+
continue;
|
|
11
|
+
selected.push(candidate);
|
|
12
|
+
}
|
|
13
|
+
return selected;
|
|
14
|
+
}
|
|
15
|
+
function buildReactiveNodes(graph) {
|
|
16
|
+
return graph.map((node) => ({
|
|
17
|
+
id: node.id,
|
|
18
|
+
kind: "unit",
|
|
19
|
+
dependsOn: [...node.dependsOn],
|
|
20
|
+
writes: [...node.outputFiles],
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
export function selectReactiveDispatchBatch(input) {
|
|
24
|
+
const nodeMap = new Map(buildReactiveNodes(input.graph).map((n) => [n.id, n]));
|
|
25
|
+
const readyNodes = input.readyIds
|
|
26
|
+
.map((id) => nodeMap.get(id))
|
|
27
|
+
.filter((node) => !!node);
|
|
28
|
+
const conflicts = detectFileConflicts(readyNodes);
|
|
29
|
+
if (readyNodes.length === 0 || input.maxParallel <= 0) {
|
|
30
|
+
return { selected: [], conflicts };
|
|
31
|
+
}
|
|
32
|
+
const claimed = new Set(input.inFlightOutputs ?? []);
|
|
33
|
+
const selected = [];
|
|
34
|
+
const selectedSet = new Set();
|
|
35
|
+
const readySet = new Set(input.readyIds);
|
|
36
|
+
for (const id of input.readyIds) {
|
|
37
|
+
if (selected.length >= input.maxParallel)
|
|
38
|
+
break;
|
|
39
|
+
const node = nodeMap.get(id);
|
|
40
|
+
if (!node)
|
|
41
|
+
continue;
|
|
42
|
+
const hasUnmetReadyDependency = node.dependsOn.some((dep) => readySet.has(dep) && !selectedSet.has(dep));
|
|
43
|
+
if (hasUnmetReadyDependency)
|
|
44
|
+
continue;
|
|
45
|
+
const writes = node.writes ?? [];
|
|
46
|
+
const conflictsWithClaimed = writes.some((file) => claimed.has(file));
|
|
47
|
+
if (conflictsWithClaimed)
|
|
48
|
+
continue;
|
|
49
|
+
selected.push(node.id);
|
|
50
|
+
selectedSet.add(node.id);
|
|
51
|
+
for (const file of writes)
|
|
52
|
+
claimed.add(file);
|
|
53
|
+
}
|
|
54
|
+
return { selected, conflicts };
|
|
55
|
+
}
|
|
56
|
+
function sidecarToNodeKind(kind) {
|
|
57
|
+
if (kind === "hook")
|
|
58
|
+
return "hook";
|
|
59
|
+
if (kind === "triage")
|
|
60
|
+
return "verification";
|
|
61
|
+
return "team-worker";
|
|
62
|
+
}
|
|
63
|
+
export function buildSidecarQueueNodes(queue) {
|
|
64
|
+
return queue.map((item, index) => ({
|
|
65
|
+
id: `sidecar-${String(index).padStart(4, "0")}:${item.kind}:${item.unitType}:${item.unitId}`,
|
|
66
|
+
kind: sidecarToNodeKind(item.kind),
|
|
67
|
+
dependsOn: index > 0 ? [`sidecar-${String(index - 1).padStart(4, "0")}:${queue[index - 1].kind}:${queue[index - 1].unitType}:${queue[index - 1].unitId}`] : [],
|
|
68
|
+
metadata: { index },
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
export async function scheduleSidecarQueue(queue) {
|
|
72
|
+
if (queue.length <= 1)
|
|
73
|
+
return [...queue];
|
|
74
|
+
const nodes = buildSidecarQueueNodes(queue);
|
|
75
|
+
const scheduler = new ExecutionGraphScheduler();
|
|
76
|
+
const orderedIndexes = [];
|
|
77
|
+
const seenKinds = new Set(nodes.map((n) => n.kind));
|
|
78
|
+
for (const kind of seenKinds) {
|
|
79
|
+
scheduler.registerHandler(kind, async (node) => {
|
|
80
|
+
const idx = Number(node.metadata?.index);
|
|
81
|
+
if (Number.isInteger(idx) && idx >= 0)
|
|
82
|
+
orderedIndexes.push(idx);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
await scheduler.run(nodes, { parallel: false });
|
|
86
|
+
return orderedIndexes.map((idx) => queue[idx]).filter((item) => !!item);
|
|
87
|
+
}
|
|
88
|
+
export class ExecutionGraphScheduler {
|
|
89
|
+
handlers = new Map();
|
|
90
|
+
registerHandler(kind, handler) {
|
|
91
|
+
this.handlers.set(kind, handler);
|
|
92
|
+
}
|
|
93
|
+
async run(nodes, options) {
|
|
94
|
+
const sorted = topologicalSort(nodes);
|
|
95
|
+
const conflicts = detectFileConflicts(nodes);
|
|
96
|
+
// Default deterministic serial execution remains the reference path.
|
|
97
|
+
if (!options?.parallel) {
|
|
98
|
+
for (const node of sorted) {
|
|
99
|
+
const handler = this.handlers.get(node.kind);
|
|
100
|
+
if (handler)
|
|
101
|
+
await handler(node);
|
|
102
|
+
}
|
|
103
|
+
return { order: sorted.map((n) => n.id), conflicts };
|
|
104
|
+
}
|
|
105
|
+
// Parallel mode only for nodes whose dependencies are already satisfied.
|
|
106
|
+
const maxWorkers = Math.max(1, Math.min(8, options.maxWorkers ?? 2));
|
|
107
|
+
const remaining = new Map(nodes.map((n) => [n.id, n]));
|
|
108
|
+
const done = new Set();
|
|
109
|
+
const order = [];
|
|
110
|
+
while (remaining.size > 0) {
|
|
111
|
+
const ready = Array.from(remaining.values()).filter((node) => node.dependsOn.every((dep) => done.has(dep)));
|
|
112
|
+
ready.sort((a, b) => a.id.localeCompare(b.id));
|
|
113
|
+
if (ready.length === 0) {
|
|
114
|
+
throw new Error("Execution graph deadlock detected: no ready nodes and graph not complete");
|
|
115
|
+
}
|
|
116
|
+
const batch = ready.slice(0, maxWorkers);
|
|
117
|
+
await Promise.all(batch.map(async (node) => {
|
|
118
|
+
const handler = this.handlers.get(node.kind);
|
|
119
|
+
if (handler)
|
|
120
|
+
await handler(node);
|
|
121
|
+
done.add(node.id);
|
|
122
|
+
order.push(node.id);
|
|
123
|
+
remaining.delete(node.id);
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
return { order, conflicts };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function topologicalSort(nodes) {
|
|
130
|
+
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
131
|
+
const inDegree = new Map(nodes.map((n) => [n.id, 0]));
|
|
132
|
+
for (const node of nodes) {
|
|
133
|
+
for (const dep of node.dependsOn) {
|
|
134
|
+
if (nodeMap.has(dep)) {
|
|
135
|
+
inDegree.set(node.id, (inDegree.get(node.id) ?? 0) + 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const queue = nodes
|
|
140
|
+
.filter((n) => (inDegree.get(n.id) ?? 0) === 0)
|
|
141
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
142
|
+
const ordered = [];
|
|
143
|
+
while (queue.length > 0) {
|
|
144
|
+
const current = queue.shift();
|
|
145
|
+
ordered.push(current);
|
|
146
|
+
for (const next of nodes) {
|
|
147
|
+
if (!next.dependsOn.includes(current.id))
|
|
148
|
+
continue;
|
|
149
|
+
const deg = (inDegree.get(next.id) ?? 0) - 1;
|
|
150
|
+
inDegree.set(next.id, deg);
|
|
151
|
+
if (deg === 0) {
|
|
152
|
+
queue.push(next);
|
|
153
|
+
queue.sort((a, b) => a.id.localeCompare(b.id));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (ordered.length !== nodes.length) {
|
|
158
|
+
throw new Error("Execution graph has cyclic dependencies");
|
|
159
|
+
}
|
|
160
|
+
return ordered;
|
|
161
|
+
}
|
|
162
|
+
function detectFileConflicts(nodes) {
|
|
163
|
+
const conflicts = [];
|
|
164
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
165
|
+
const a = nodes[i];
|
|
166
|
+
const writesA = new Set(a.writes ?? []);
|
|
167
|
+
if (writesA.size === 0)
|
|
168
|
+
continue;
|
|
169
|
+
for (let j = i + 1; j < nodes.length; j++) {
|
|
170
|
+
const b = nodes[j];
|
|
171
|
+
for (const file of b.writes ?? []) {
|
|
172
|
+
if (writesA.has(file)) {
|
|
173
|
+
conflicts.push({ nodeA: a.id, nodeB: b.id, file });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return conflicts;
|
|
179
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
2
|
+
function envForcesLegacyFallback() {
|
|
3
|
+
const raw = process.env.GSD_UOK_FORCE_LEGACY ?? process.env.GSD_UOK_LEGACY_FALLBACK;
|
|
4
|
+
if (!raw)
|
|
5
|
+
return false;
|
|
6
|
+
const normalized = raw.trim().toLowerCase();
|
|
7
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
|
|
8
|
+
}
|
|
9
|
+
export function resolveUokFlags(prefs) {
|
|
10
|
+
const uok = prefs?.uok;
|
|
11
|
+
const legacyFallback = uok?.legacy_fallback?.enabled === true || envForcesLegacyFallback();
|
|
12
|
+
const enabledByPreference = uok?.enabled ?? true;
|
|
13
|
+
return {
|
|
14
|
+
enabled: enabledByPreference && !legacyFallback,
|
|
15
|
+
legacyFallback,
|
|
16
|
+
gates: uok?.gates?.enabled === true,
|
|
17
|
+
modelPolicy: uok?.model_policy?.enabled === true,
|
|
18
|
+
executionGraph: uok?.execution_graph?.enabled === true,
|
|
19
|
+
gitops: uok?.gitops?.enabled === true,
|
|
20
|
+
gitopsTurnAction: uok?.gitops?.turn_action ?? "status-only",
|
|
21
|
+
gitopsTurnPush: uok?.gitops?.turn_push === true,
|
|
22
|
+
auditUnified: uok?.audit_unified?.enabled === true,
|
|
23
|
+
planV2: uok?.plan_v2?.enabled === true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function loadUokFlags() {
|
|
27
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences;
|
|
28
|
+
return resolveUokFlags(prefs);
|
|
29
|
+
}
|