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
|
@@ -22,7 +22,12 @@ import {
|
|
|
22
22
|
type GSDSkillRule,
|
|
23
23
|
} from "./preferences-types.js";
|
|
24
24
|
|
|
25
|
-
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality"]);
|
|
25
|
+
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
|
|
26
|
+
const VALID_UOK_TURN_ACTIONS = new Set<"commit" | "snapshot" | "status-only">([
|
|
27
|
+
"commit",
|
|
28
|
+
"snapshot",
|
|
29
|
+
"status-only",
|
|
30
|
+
]);
|
|
26
31
|
|
|
27
32
|
export function validatePreferences(preferences: GSDPreferences): {
|
|
28
33
|
preferences: GSDPreferences;
|
|
@@ -161,12 +166,112 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
168
|
|
|
169
|
+
// ─── UOK Flags ──────────────────────────────────────────────────────
|
|
170
|
+
if (preferences.uok !== undefined) {
|
|
171
|
+
if (typeof preferences.uok === "object" && preferences.uok !== null) {
|
|
172
|
+
const raw = preferences.uok as Record<string, unknown>;
|
|
173
|
+
const valid: NonNullable<GSDPreferences["uok"]> = {};
|
|
174
|
+
|
|
175
|
+
if (raw.enabled !== undefined) {
|
|
176
|
+
if (typeof raw.enabled === "boolean") valid.enabled = raw.enabled;
|
|
177
|
+
else errors.push("uok.enabled must be a boolean");
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const parseEnabledBlock = (
|
|
181
|
+
key: "legacy_fallback" | "gates" | "model_policy" | "execution_graph" | "audit_unified" | "plan_v2",
|
|
182
|
+
): void => {
|
|
183
|
+
const value = raw[key];
|
|
184
|
+
if (value === undefined) return;
|
|
185
|
+
if (typeof value !== "object" || value === null) {
|
|
186
|
+
errors.push(`uok.${key} must be an object`);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const block = value as Record<string, unknown>;
|
|
190
|
+
const parsed: { enabled?: boolean } = {};
|
|
191
|
+
if (block.enabled !== undefined) {
|
|
192
|
+
if (typeof block.enabled === "boolean") parsed.enabled = block.enabled;
|
|
193
|
+
else errors.push(`uok.${key}.enabled must be a boolean`);
|
|
194
|
+
}
|
|
195
|
+
const unknown = Object.keys(block).filter((k) => k !== "enabled");
|
|
196
|
+
for (const unk of unknown) {
|
|
197
|
+
warnings.push(`unknown uok.${key} key "${unk}" — ignored`);
|
|
198
|
+
}
|
|
199
|
+
if (Object.keys(parsed).length > 0) {
|
|
200
|
+
valid[key] = parsed;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
parseEnabledBlock("legacy_fallback");
|
|
205
|
+
parseEnabledBlock("gates");
|
|
206
|
+
parseEnabledBlock("model_policy");
|
|
207
|
+
parseEnabledBlock("execution_graph");
|
|
208
|
+
parseEnabledBlock("audit_unified");
|
|
209
|
+
parseEnabledBlock("plan_v2");
|
|
210
|
+
|
|
211
|
+
if (raw.gitops !== undefined) {
|
|
212
|
+
if (typeof raw.gitops !== "object" || raw.gitops === null) {
|
|
213
|
+
errors.push("uok.gitops must be an object");
|
|
214
|
+
} else {
|
|
215
|
+
const gitops = raw.gitops as Record<string, unknown>;
|
|
216
|
+
const parsed: NonNullable<NonNullable<GSDPreferences["uok"]>["gitops"]> = {};
|
|
217
|
+
if (gitops.enabled !== undefined) {
|
|
218
|
+
if (typeof gitops.enabled === "boolean") parsed.enabled = gitops.enabled;
|
|
219
|
+
else errors.push("uok.gitops.enabled must be a boolean");
|
|
220
|
+
}
|
|
221
|
+
if (gitops.turn_action !== undefined) {
|
|
222
|
+
if (
|
|
223
|
+
typeof gitops.turn_action === "string" &&
|
|
224
|
+
VALID_UOK_TURN_ACTIONS.has(gitops.turn_action as "commit" | "snapshot" | "status-only")
|
|
225
|
+
) {
|
|
226
|
+
parsed.turn_action = gitops.turn_action as "commit" | "snapshot" | "status-only";
|
|
227
|
+
} else {
|
|
228
|
+
errors.push("uok.gitops.turn_action must be one of: commit, snapshot, status-only");
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (gitops.turn_push !== undefined) {
|
|
232
|
+
if (typeof gitops.turn_push === "boolean") parsed.turn_push = gitops.turn_push;
|
|
233
|
+
else errors.push("uok.gitops.turn_push must be a boolean");
|
|
234
|
+
}
|
|
235
|
+
const unknown = Object.keys(gitops).filter((k) => !["enabled", "turn_action", "turn_push"].includes(k));
|
|
236
|
+
for (const unk of unknown) {
|
|
237
|
+
warnings.push(`unknown uok.gitops key "${unk}" — ignored`);
|
|
238
|
+
}
|
|
239
|
+
if (Object.keys(parsed).length > 0) {
|
|
240
|
+
valid.gitops = parsed;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const knownUokKeys = new Set([
|
|
246
|
+
"enabled",
|
|
247
|
+
"legacy_fallback",
|
|
248
|
+
"gates",
|
|
249
|
+
"model_policy",
|
|
250
|
+
"execution_graph",
|
|
251
|
+
"gitops",
|
|
252
|
+
"audit_unified",
|
|
253
|
+
"plan_v2",
|
|
254
|
+
]);
|
|
255
|
+
for (const key of Object.keys(raw)) {
|
|
256
|
+
if (!knownUokKeys.has(key)) {
|
|
257
|
+
warnings.push(`unknown uok key "${key}" — ignored`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (Object.keys(valid).length > 0) {
|
|
262
|
+
validated.uok = valid;
|
|
263
|
+
}
|
|
264
|
+
} else {
|
|
265
|
+
errors.push("uok must be an object");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
164
269
|
// ─── Token Profile ─────────────────────────────────────────────────
|
|
165
270
|
if (preferences.token_profile !== undefined) {
|
|
166
271
|
if (typeof preferences.token_profile === "string" && VALID_TOKEN_PROFILES.has(preferences.token_profile as TokenProfile)) {
|
|
167
272
|
validated.token_profile = preferences.token_profile as TokenProfile;
|
|
168
273
|
} else {
|
|
169
|
-
errors.push(`token_profile must be one of: budget, balanced, quality`);
|
|
274
|
+
errors.push(`token_profile must be one of: budget, balanced, quality, burn-max`);
|
|
170
275
|
}
|
|
171
276
|
}
|
|
172
277
|
|
|
@@ -50,6 +50,8 @@ export type {
|
|
|
50
50
|
AutoSupervisorConfig,
|
|
51
51
|
RemoteQuestionsConfig,
|
|
52
52
|
CmuxPreferences,
|
|
53
|
+
UokTurnActionMode,
|
|
54
|
+
UokPreferences,
|
|
53
55
|
CodebaseMapPreferences,
|
|
54
56
|
GSDPreferences,
|
|
55
57
|
LoadedGSDPreferences,
|
|
@@ -378,6 +380,32 @@ function mergePreferences(base: GSDPreferences, override: GSDPreferences): GSDPr
|
|
|
378
380
|
dynamic_routing: (base.dynamic_routing || override.dynamic_routing)
|
|
379
381
|
? { ...(base.dynamic_routing ?? {}), ...(override.dynamic_routing ?? {}) } as DynamicRoutingConfig
|
|
380
382
|
: undefined,
|
|
383
|
+
uok: (base.uok || override.uok)
|
|
384
|
+
? {
|
|
385
|
+
enabled: override.uok?.enabled ?? base.uok?.enabled,
|
|
386
|
+
legacy_fallback: (base.uok?.legacy_fallback || override.uok?.legacy_fallback)
|
|
387
|
+
? { ...(base.uok?.legacy_fallback ?? {}), ...(override.uok?.legacy_fallback ?? {}) }
|
|
388
|
+
: undefined,
|
|
389
|
+
gates: (base.uok?.gates || override.uok?.gates)
|
|
390
|
+
? { ...(base.uok?.gates ?? {}), ...(override.uok?.gates ?? {}) }
|
|
391
|
+
: undefined,
|
|
392
|
+
model_policy: (base.uok?.model_policy || override.uok?.model_policy)
|
|
393
|
+
? { ...(base.uok?.model_policy ?? {}), ...(override.uok?.model_policy ?? {}) }
|
|
394
|
+
: undefined,
|
|
395
|
+
execution_graph: (base.uok?.execution_graph || override.uok?.execution_graph)
|
|
396
|
+
? { ...(base.uok?.execution_graph ?? {}), ...(override.uok?.execution_graph ?? {}) }
|
|
397
|
+
: undefined,
|
|
398
|
+
gitops: (base.uok?.gitops || override.uok?.gitops)
|
|
399
|
+
? { ...(base.uok?.gitops ?? {}), ...(override.uok?.gitops ?? {}) }
|
|
400
|
+
: undefined,
|
|
401
|
+
audit_unified: (base.uok?.audit_unified || override.uok?.audit_unified)
|
|
402
|
+
? { ...(base.uok?.audit_unified ?? {}), ...(override.uok?.audit_unified ?? {}) }
|
|
403
|
+
: undefined,
|
|
404
|
+
plan_v2: (base.uok?.plan_v2 || override.uok?.plan_v2)
|
|
405
|
+
? { ...(base.uok?.plan_v2 ?? {}), ...(override.uok?.plan_v2 ?? {}) }
|
|
406
|
+
: undefined,
|
|
407
|
+
}
|
|
408
|
+
: undefined,
|
|
381
409
|
token_profile: override.token_profile ?? base.token_profile,
|
|
382
410
|
phases: (base.phases || override.phases)
|
|
383
411
|
? { ...(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}}
|
|
@@ -52,6 +52,18 @@ export interface SessionLockStatus {
|
|
|
52
52
|
recovered?: boolean;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
interface ProperLockfileApi {
|
|
56
|
+
lockSync(
|
|
57
|
+
path: string,
|
|
58
|
+
options?: {
|
|
59
|
+
realpath?: boolean;
|
|
60
|
+
stale?: number;
|
|
61
|
+
update?: number;
|
|
62
|
+
onCompromised?: () => void;
|
|
63
|
+
},
|
|
64
|
+
): () => void;
|
|
65
|
+
}
|
|
66
|
+
|
|
55
67
|
// ─── Module State ───────────────────────────────────────────────────────────
|
|
56
68
|
|
|
57
69
|
/** Release function from proper-lockfile — calling it releases the OS lock. */
|
|
@@ -277,9 +289,9 @@ export function acquireSessionLock(basePath: string): SessionLockResult {
|
|
|
277
289
|
unitStartedAt: new Date().toISOString(),
|
|
278
290
|
};
|
|
279
291
|
|
|
280
|
-
let lockfile:
|
|
292
|
+
let lockfile: ProperLockfileApi;
|
|
281
293
|
try {
|
|
282
|
-
lockfile = _require("proper-lockfile") as
|
|
294
|
+
lockfile = _require("proper-lockfile") as ProperLockfileApi;
|
|
283
295
|
} catch {
|
|
284
296
|
// proper-lockfile not available — fall back to PID-based check
|
|
285
297
|
return acquireFallbackLock(basePath, lp, lockData);
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
} from "./session-status-io.js";
|
|
33
33
|
import { hasFileConflict } from "./slice-parallel-conflict.js";
|
|
34
34
|
import { getErrorMessage } from "./error-utils.js";
|
|
35
|
+
import { selectConflictFreeBatch } from "./uok/execution-graph.js";
|
|
35
36
|
|
|
36
37
|
// ─── Types ─────────────────────────────────────────────────────────────────
|
|
37
38
|
|
|
@@ -61,6 +62,7 @@ export interface SliceOrchestratorState {
|
|
|
61
62
|
export interface StartSliceParallelOpts {
|
|
62
63
|
maxWorkers?: number;
|
|
63
64
|
budgetCeiling?: number;
|
|
65
|
+
useExecutionGraph?: boolean;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
// ─── Module State ──────────────────────────────────────────────────────────
|
|
@@ -118,7 +120,12 @@ export async function startSliceParallel(
|
|
|
118
120
|
const errors: Array<{ sid: string; error: string }> = [];
|
|
119
121
|
|
|
120
122
|
// Filter out conflicting slices (conservative: check all pairs)
|
|
121
|
-
const safeSlices = filterConflictingSlices(
|
|
123
|
+
const safeSlices = filterConflictingSlices(
|
|
124
|
+
basePath,
|
|
125
|
+
milestoneId,
|
|
126
|
+
eligibleSlices,
|
|
127
|
+
opts.useExecutionGraph === true,
|
|
128
|
+
);
|
|
122
129
|
|
|
123
130
|
// Limit to maxWorkers
|
|
124
131
|
const toSpawn = safeSlices.slice(0, maxWorkers);
|
|
@@ -245,7 +252,19 @@ function filterConflictingSlices(
|
|
|
245
252
|
basePath: string,
|
|
246
253
|
milestoneId: string,
|
|
247
254
|
slices: Array<{ id: string }>,
|
|
255
|
+
useExecutionGraph: boolean,
|
|
248
256
|
): Array<{ id: string }> {
|
|
257
|
+
if (useExecutionGraph) {
|
|
258
|
+
const selectedIds = selectConflictFreeBatch({
|
|
259
|
+
orderedIds: slices.map((slice) => slice.id),
|
|
260
|
+
maxParallel: slices.length,
|
|
261
|
+
hasConflict: (candidate, existing) =>
|
|
262
|
+
hasFileConflict(basePath, milestoneId, candidate, existing),
|
|
263
|
+
});
|
|
264
|
+
const selected = new Set(selectedIds);
|
|
265
|
+
return slices.filter((slice) => selected.has(slice.id));
|
|
266
|
+
}
|
|
267
|
+
|
|
249
268
|
const safe: Array<{ id: string }> = [];
|
|
250
269
|
|
|
251
270
|
for (const candidate of slices) {
|
|
@@ -345,8 +345,15 @@ function reconcileDiskToDb(basePath: string): MilestoneRow[] {
|
|
|
345
345
|
const dbSliceIds = new Set(dbSlices.map(s => s.id));
|
|
346
346
|
|
|
347
347
|
let roadmapContent: string;
|
|
348
|
-
try {
|
|
349
|
-
|
|
348
|
+
try {
|
|
349
|
+
roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
350
|
+
} catch (err) {
|
|
351
|
+
logWarning("state", "reconcileDiskToDb: roadmap read failed, skipping milestone", {
|
|
352
|
+
mid,
|
|
353
|
+
error: (err as Error).message,
|
|
354
|
+
});
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
350
357
|
|
|
351
358
|
const parsed = parseRoadmap(roadmapContent);
|
|
352
359
|
for (const s of parsed.slices) {
|
|
@@ -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:
|
|
@@ -1267,7 +1267,7 @@ test("auto-loop.ts barrel re-exports autoLoop, runUnit, and resolveAgentEnd", ()
|
|
|
1267
1267
|
);
|
|
1268
1268
|
});
|
|
1269
1269
|
|
|
1270
|
-
test("auto.ts startAuto
|
|
1270
|
+
test("auto.ts startAuto dispatches through the UOK kernel wrapper (legacy loop adapter)", () => {
|
|
1271
1271
|
const src = readFileSync(
|
|
1272
1272
|
resolve(import.meta.dirname, "..", "auto.ts"),
|
|
1273
1273
|
"utf-8",
|
|
@@ -1279,8 +1279,12 @@ test("auto.ts startAuto calls autoLoop (not dispatchNextUnit as first dispatch)"
|
|
|
1279
1279
|
const fnBlock =
|
|
1280
1280
|
fnEnd > -1 ? src.slice(fnIdx, fnEnd) : src.slice(fnIdx, fnIdx + 5000);
|
|
1281
1281
|
assert.ok(
|
|
1282
|
-
fnBlock.includes("
|
|
1283
|
-
"startAuto must
|
|
1282
|
+
fnBlock.includes("runAutoLoopWithUok("),
|
|
1283
|
+
"startAuto must dispatch through runAutoLoopWithUok()",
|
|
1284
|
+
);
|
|
1285
|
+
assert.ok(
|
|
1286
|
+
fnBlock.includes("runLegacyLoop: autoLoop"),
|
|
1287
|
+
"startAuto must preserve the legacy autoLoop adapter in kernel dispatch",
|
|
1284
1288
|
);
|
|
1285
1289
|
});
|
|
1286
1290
|
|
|
@@ -227,6 +227,26 @@ test("model change notify in selectAndApplyModel is gated behind verbose flag",
|
|
|
227
227
|
);
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
+
test("model policy resolves candidates from the policy-eligible pool", () => {
|
|
231
|
+
const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
|
|
232
|
+
assert.ok(
|
|
233
|
+
src.includes("const resolutionPool = uokFlags.modelPolicy ? routingEligibleModels : availableModels"),
|
|
234
|
+
"selectAndApplyModel should resolve model IDs against policy-eligible models when model policy is enabled",
|
|
235
|
+
);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test("model policy receives task metadata for requirement-vector decisions", () => {
|
|
239
|
+
const src = readFileSync(join(__dirname, "..", "auto-model-selection.ts"), "utf-8");
|
|
240
|
+
assert.ok(
|
|
241
|
+
src.includes("taskMetadata: taskMetadataForPolicy"),
|
|
242
|
+
"applyModelPolicyFilter should receive task metadata so requirement vectors are unit-aware",
|
|
243
|
+
);
|
|
244
|
+
assert.ok(
|
|
245
|
+
src.includes("extractTaskMetadata(unitId, basePath)"),
|
|
246
|
+
"execute-task dispatch should derive metadata before policy filtering",
|
|
247
|
+
);
|
|
248
|
+
});
|
|
249
|
+
|
|
230
250
|
test("resolveModelId: anthropic wins over claude-code when session provider is not claude-code", () => {
|
|
231
251
|
const availableModels = [
|
|
232
252
|
{ id: "claude-sonnet-4-6", provider: "claude-code" },
|
|
@@ -13,11 +13,15 @@ test("auto-mode captures GSD_PROJECT_ROOT before entering the dispatch loop", ()
|
|
|
13
13
|
const resumeCallIdx = source.indexOf("captureProjectRootEnv(s.originalBasePath || s.basePath);");
|
|
14
14
|
assert.ok(resumeCallIdx > -1, "auto.ts should capture GSD_PROJECT_ROOT before resume autoLoop");
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
|
|
16
|
+
const firstLoopIdxCandidates = [
|
|
17
|
+
source.indexOf("await runAutoLoopWithUok({"),
|
|
18
|
+
source.indexOf("await autoLoop(ctx, pi, s, buildLoopDeps());"),
|
|
19
|
+
].filter((idx) => idx > -1);
|
|
20
|
+
const firstAutoLoopIdx = firstLoopIdxCandidates.length > 0 ? Math.min(...firstLoopIdxCandidates) : -1;
|
|
21
|
+
assert.ok(firstAutoLoopIdx > -1, "auto.ts should invoke the auto dispatch loop");
|
|
18
22
|
assert.ok(
|
|
19
23
|
resumeCallIdx < firstAutoLoopIdx,
|
|
20
|
-
"auto.ts must set GSD_PROJECT_ROOT before the first
|
|
24
|
+
"auto.ts must set GSD_PROJECT_ROOT before the first loop call",
|
|
21
25
|
);
|
|
22
26
|
});
|
|
23
27
|
|
|
@@ -25,8 +25,12 @@ console.log("\n=== resume path refreshes resources and opens DB before rebuildSt
|
|
|
25
25
|
const resumeSectionStart = autoSrc.indexOf("if (s.paused) {", autoSrc.indexOf("// If resuming from paused state"));
|
|
26
26
|
assertTrue(resumeSectionStart > 0, "auto.ts has the paused-session resume block");
|
|
27
27
|
|
|
28
|
-
const
|
|
29
|
-
|
|
28
|
+
const resumeSectionEndCandidates = [
|
|
29
|
+
autoSrc.indexOf("await runAutoLoopWithUok(", resumeSectionStart),
|
|
30
|
+
autoSrc.indexOf("await autoLoop(", resumeSectionStart),
|
|
31
|
+
].filter((idx) => idx > resumeSectionStart);
|
|
32
|
+
const resumeSectionEnd = resumeSectionEndCandidates.length > 0 ? Math.min(...resumeSectionEndCandidates) : -1;
|
|
33
|
+
assertTrue(resumeSectionEnd > resumeSectionStart, "resume block reaches the dispatch loop");
|
|
30
34
|
|
|
31
35
|
const resumeSection = autoSrc.slice(resumeSectionStart, resumeSectionEnd);
|
|
32
36
|
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdirSync, writeFileSync, readFileSync, existsSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
|
|
8
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
function makeTmpBase(): string {
|
|
11
|
+
const base = join(tmpdir(), `gsd-backlog-test-${randomUUID()}`);
|
|
12
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
13
|
+
return base;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function cleanup(base: string): void {
|
|
17
|
+
try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function backlogPath(base: string): string {
|
|
21
|
+
return join(base, ".gsd", "BACKLOG.md");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function writeBacklog(base: string, content: string): void {
|
|
25
|
+
writeFileSync(backlogPath(base), content, "utf-8");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function readBacklog(base: string): string {
|
|
29
|
+
return readFileSync(backlogPath(base), "utf-8");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Test the parsing/writing logic inline since the handler requires runtime context
|
|
33
|
+
|
|
34
|
+
interface BacklogItem {
|
|
35
|
+
id: string;
|
|
36
|
+
title: string;
|
|
37
|
+
done: boolean;
|
|
38
|
+
note: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function parseBacklog(content: string): BacklogItem[] {
|
|
42
|
+
const items: BacklogItem[] = [];
|
|
43
|
+
for (const line of content.split("\n")) {
|
|
44
|
+
const match = line.match(/^- \[([ x])\] (999\.\d+) — (.+?)(?:\s*\((.+)\))?$/);
|
|
45
|
+
if (match) {
|
|
46
|
+
items.push({
|
|
47
|
+
id: match[2],
|
|
48
|
+
title: match[3].trim(),
|
|
49
|
+
done: match[1] === "x",
|
|
50
|
+
note: match[4] ?? "",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return items;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function formatBacklog(items: BacklogItem[]): string {
|
|
58
|
+
const lines = ["# Backlog\n"];
|
|
59
|
+
for (const item of items) {
|
|
60
|
+
const check = item.done ? "x" : " ";
|
|
61
|
+
const note = item.note ? ` (${item.note})` : "";
|
|
62
|
+
lines.push(`- [${check}] ${item.id} — ${item.title}${note}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push("");
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ─── Tests ──────────────────────────────────────────────────────────────
|
|
69
|
+
|
|
70
|
+
test("backlog: parse empty file returns empty array", () => {
|
|
71
|
+
const items = parseBacklog("");
|
|
72
|
+
assert.equal(items.length, 0);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("backlog: parse valid entries", () => {
|
|
76
|
+
const content = `# Backlog
|
|
77
|
+
|
|
78
|
+
- [ ] 999.1 — OAuth support (added 2026-03-23)
|
|
79
|
+
- [x] 999.2 — Rate limiting (promoted 2026-03-24)
|
|
80
|
+
- [ ] 999.3 — Dark mode`;
|
|
81
|
+
|
|
82
|
+
const items = parseBacklog(content);
|
|
83
|
+
assert.equal(items.length, 3);
|
|
84
|
+
assert.equal(items[0].id, "999.1");
|
|
85
|
+
assert.equal(items[0].title, "OAuth support");
|
|
86
|
+
assert.equal(items[0].done, false);
|
|
87
|
+
assert.equal(items[0].note, "added 2026-03-23");
|
|
88
|
+
|
|
89
|
+
assert.equal(items[1].id, "999.2");
|
|
90
|
+
assert.equal(items[1].done, true);
|
|
91
|
+
assert.equal(items[1].note, "promoted 2026-03-24");
|
|
92
|
+
|
|
93
|
+
assert.equal(items[2].id, "999.3");
|
|
94
|
+
assert.equal(items[2].title, "Dark mode");
|
|
95
|
+
assert.equal(items[2].note, "");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("backlog: format roundtrips correctly", () => {
|
|
99
|
+
const items: BacklogItem[] = [
|
|
100
|
+
{ id: "999.1", title: "OAuth support", done: false, note: "added 2026-03-23" },
|
|
101
|
+
{ id: "999.2", title: "Rate limiting", done: true, note: "promoted 2026-03-24" },
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const formatted = formatBacklog(items);
|
|
105
|
+
const parsed = parseBacklog(formatted);
|
|
106
|
+
|
|
107
|
+
assert.equal(parsed.length, 2);
|
|
108
|
+
assert.equal(parsed[0].id, "999.1");
|
|
109
|
+
assert.equal(parsed[0].title, "OAuth support");
|
|
110
|
+
assert.equal(parsed[1].done, true);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("backlog: write and read from disk", () => {
|
|
114
|
+
const base = makeTmpBase();
|
|
115
|
+
try {
|
|
116
|
+
const items: BacklogItem[] = [
|
|
117
|
+
{ id: "999.1", title: "Test item", done: false, note: "added 2026-03-23" },
|
|
118
|
+
];
|
|
119
|
+
writeBacklog(base, formatBacklog(items));
|
|
120
|
+
|
|
121
|
+
assert.ok(existsSync(backlogPath(base)));
|
|
122
|
+
const content = readBacklog(base);
|
|
123
|
+
assert.ok(content.includes("999.1"));
|
|
124
|
+
assert.ok(content.includes("Test item"));
|
|
125
|
+
} finally {
|
|
126
|
+
cleanup(base);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test("backlog: next ID increments correctly", () => {
|
|
131
|
+
const items: BacklogItem[] = [
|
|
132
|
+
{ id: "999.1", title: "First", done: false, note: "" },
|
|
133
|
+
{ id: "999.2", title: "Second", done: false, note: "" },
|
|
134
|
+
{ id: "999.5", title: "Fifth", done: false, note: "" },
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
let maxNum = 0;
|
|
138
|
+
for (const item of items) {
|
|
139
|
+
const match = item.id.match(/^999\.(\d+)$/);
|
|
140
|
+
if (match) {
|
|
141
|
+
const num = parseInt(match[1], 10);
|
|
142
|
+
if (num > maxNum) maxNum = num;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const nextId = `999.${maxNum + 1}`;
|
|
146
|
+
assert.equal(nextId, "999.6");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test("backlog: empty backlog returns no items", () => {
|
|
150
|
+
const base = makeTmpBase();
|
|
151
|
+
try {
|
|
152
|
+
// No BACKLOG.md exists
|
|
153
|
+
assert.ok(!existsSync(backlogPath(base)));
|
|
154
|
+
// Would return empty array
|
|
155
|
+
} finally {
|
|
156
|
+
cleanup(base);
|
|
157
|
+
}
|
|
158
|
+
});
|