@opengsd/gsd-pi 1.9.0 → 1.10.0-dev.a5e42e99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -9
- package/dist/headless.js +2 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +102 -21
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +30 -10
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-verification.js +25 -12
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -26
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +80 -5
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/engine.js +5 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +40 -12
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +12 -0
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +75 -31
- package/dist/resources/extensions/gsd/guided-flow.js +11 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -21
- package/dist/resources/extensions/gsd/md-importer.js +5 -6
- package/dist/resources/extensions/gsd/model-cost-table.js +6 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -0
- package/dist/resources/extensions/gsd/paths.js +66 -15
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +33 -0
- package/dist/resources/extensions/gsd/preferences-models.js +50 -10
- package/dist/resources/extensions/gsd/preferences-types.js +6 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +86 -4
- package/dist/resources/extensions/gsd/preferences.js +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +98 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +4 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +9 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +12 -5
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +20 -18
- package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- package/dist/resources/extensions/subagent/index.js +1 -1
- package/dist/startup-model-validation.d.ts +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +8 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -1
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/rpc.test.js +1 -1
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
- package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +21 -5
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +325 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cli.js +146 -16
- package/packages/gsd-cloud/dist/cli.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.js +7 -1
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +7 -4
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.js +115 -31
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +32 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +640 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +543 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
- package/packages/gsd-cloud/package.json +2 -2
- package/packages/mcp-server/README.md +7 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +2 -2
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +187 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +145 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.js +18 -6
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +6 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/packages/pi-ai/dist/providers/google.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +9 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -4
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +54 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +1 -0
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -19
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +32 -9
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-verification.ts +46 -12
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +10 -31
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +99 -5
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/engine.ts +5 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +45 -11
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -0
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +85 -33
- package/src/resources/extensions/gsd/guided-flow.ts +11 -4
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -23
- package/src/resources/extensions/gsd/md-importer.ts +5 -5
- package/src/resources/extensions/gsd/model-cost-table.ts +14 -1
- package/src/resources/extensions/gsd/model-router.ts +17 -0
- package/src/resources/extensions/gsd/paths.ts +73 -15
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +45 -0
- package/src/resources/extensions/gsd/preferences-models.ts +54 -10
- package/src/resources/extensions/gsd/preferences-types.ts +26 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +108 -3
- package/src/resources/extensions/gsd/preferences.ts +38 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +132 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +4 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/stop-notice.ts +11 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +76 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +74 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -5
- package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +21 -24
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
- package/src/resources/extensions/subagent/index.ts +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_ssgManifest.js +0 -0
|
@@ -824,9 +824,9 @@ test('── markdown-renderer: renderTaskSummary round-trip ──', async () =
|
|
|
824
824
|
|
|
825
825
|
// Verify file exists on disk
|
|
826
826
|
const summaryPath = path.join(
|
|
827
|
-
tmpDir, '.gsd', 'phases', '01-test', 'T01-SUMMARY.md',
|
|
827
|
+
tmpDir, '.gsd', 'phases', '01-test', 'S01-T01-SUMMARY.md',
|
|
828
828
|
);
|
|
829
|
-
assert.ok(fs.existsSync(summaryPath), 'T01-SUMMARY.md written to disk');
|
|
829
|
+
assert.ok(fs.existsSync(summaryPath), 'S01-T01-SUMMARY.md written to disk');
|
|
830
830
|
|
|
831
831
|
// Parse and verify
|
|
832
832
|
const rendered = fs.readFileSync(summaryPath, 'utf-8');
|
|
@@ -1020,7 +1020,7 @@ test('── markdown-renderer: renderAllFromDb produces all files ──', asyn
|
|
|
1020
1020
|
|
|
1021
1021
|
// Verify task summary written
|
|
1022
1022
|
const taskSummaryPath = path.join(
|
|
1023
|
-
tmpDir, '.gsd', 'phases', '01-test', 'T01-SUMMARY.md',
|
|
1023
|
+
tmpDir, '.gsd', 'phases', '01-test', 'S01-T01-SUMMARY.md',
|
|
1024
1024
|
);
|
|
1025
1025
|
assert.ok(fs.existsSync(taskSummaryPath), 'T01 summary written by renderAll');
|
|
1026
1026
|
} finally {
|
|
@@ -1546,9 +1546,9 @@ test('── markdown-renderer: repairStaleRenders writes missing task summary
|
|
|
1546
1546
|
|
|
1547
1547
|
// Verify file written
|
|
1548
1548
|
const summaryPath = path.join(
|
|
1549
|
-
tmpDir, '.gsd', 'phases', '01-test', 'T01-SUMMARY.md',
|
|
1549
|
+
tmpDir, '.gsd', 'phases', '01-test', 'S01-T01-SUMMARY.md',
|
|
1550
1550
|
);
|
|
1551
|
-
assert.ok(fs.existsSync(summaryPath), 'T01-SUMMARY.md should exist after repair');
|
|
1551
|
+
assert.ok(fs.existsSync(summaryPath), 'S01-T01-SUMMARY.md should exist after repair');
|
|
1552
1552
|
|
|
1553
1553
|
// Second detect should be empty
|
|
1554
1554
|
clearAllCaches();
|
|
@@ -75,6 +75,7 @@ test("#2885: cost table includes openai-codex provider models", () => {
|
|
|
75
75
|
const codexModels = [
|
|
76
76
|
"gpt-5.1", "gpt-5.1-codex-max", "gpt-5.1-codex-mini",
|
|
77
77
|
"gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.4", "gpt-5.4-mini", "gpt-5.5",
|
|
78
|
+
"gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
|
|
78
79
|
];
|
|
79
80
|
for (const model of codexModels) {
|
|
80
81
|
assert.ok(ids.includes(model), `cost table should include openai-codex model "${model}"`);
|
|
@@ -109,3 +110,25 @@ test("gpt-5.5 uses official OpenAI list pricing", () => {
|
|
|
109
110
|
assert.equal(entry.outputPer1k, 0.03);
|
|
110
111
|
assert.equal(entry.updatedAt, "2026-04-23");
|
|
111
112
|
});
|
|
113
|
+
|
|
114
|
+
test("gpt-5.6 bare alias is not treated as a real cost-table model", () => {
|
|
115
|
+
assert.equal(lookupModelCost("gpt-5.6"), undefined);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("gpt-5.6 variants use published pricing", () => {
|
|
119
|
+
const sol = lookupModelCost("openai-codex/gpt-5.6-sol");
|
|
120
|
+
assert.ok(sol, "lookupModelCost should find gpt-5.6-sol");
|
|
121
|
+
assert.equal(sol.inputPer1k, 0.005);
|
|
122
|
+
assert.equal(sol.outputPer1k, 0.03);
|
|
123
|
+
assert.deepEqual(sol.tiers?.[0], { inputTokensAbove: 272000, inputPer1k: 0.01, outputPer1k: 0.045 });
|
|
124
|
+
|
|
125
|
+
const terra = lookupModelCost("gpt-5.6-terra");
|
|
126
|
+
assert.ok(terra, "lookupModelCost should find gpt-5.6-terra");
|
|
127
|
+
assert.equal(terra.inputPer1k, 0.0025);
|
|
128
|
+
assert.equal(terra.outputPer1k, 0.015);
|
|
129
|
+
|
|
130
|
+
const luna = lookupModelCost("gpt-5.6-luna");
|
|
131
|
+
assert.ok(luna, "lookupModelCost should find gpt-5.6-luna");
|
|
132
|
+
assert.equal(luna.inputPer1k, 0.001);
|
|
133
|
+
assert.equal(luna.outputPer1k, 0.006);
|
|
134
|
+
});
|
|
@@ -10,6 +10,7 @@ import assert from "node:assert/strict";
|
|
|
10
10
|
import { mkdirSync, writeFileSync, rmSync, existsSync, readFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
|
+
import { isCustomProvider } from "../preferences-models.ts";
|
|
13
14
|
|
|
14
15
|
// ─── Test helpers ─────────────────────────────────────────────────────────────
|
|
15
16
|
|
|
@@ -303,3 +304,57 @@ describe("custom provider session model overrides PREFERENCES.md (#4122)", () =>
|
|
|
303
304
|
});
|
|
304
305
|
});
|
|
305
306
|
|
|
307
|
+
describe("custom provider detection (#801)", () => {
|
|
308
|
+
let originalGsdHome: string | undefined;
|
|
309
|
+
let tmpGsdHome: string;
|
|
310
|
+
|
|
311
|
+
beforeEach(() => {
|
|
312
|
+
originalGsdHome = process.env.GSD_HOME;
|
|
313
|
+
tmpGsdHome = makeTmpDir("gsd-home");
|
|
314
|
+
process.env.GSD_HOME = tmpGsdHome;
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
afterEach(() => {
|
|
318
|
+
if (originalGsdHome === undefined) {
|
|
319
|
+
delete process.env.GSD_HOME;
|
|
320
|
+
} else {
|
|
321
|
+
process.env.GSD_HOME = originalGsdHome;
|
|
322
|
+
}
|
|
323
|
+
try { rmSync(tmpGsdHome, { recursive: true, force: true }); } catch {}
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it("detects extension-registered providers that are not declared in models.json", () => {
|
|
327
|
+
const registry = {
|
|
328
|
+
getAllWithDiscovered: () => [
|
|
329
|
+
{ provider: "pi-llama-cpp" },
|
|
330
|
+
],
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
assert.equal(isCustomProvider("pi-llama-cpp", registry), true,
|
|
334
|
+
"runtime providers outside the built-in catalog should count as custom");
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it("does not treat built-in providers as custom just because they are in the registry", () => {
|
|
338
|
+
const registry = {
|
|
339
|
+
getAll: () => [
|
|
340
|
+
{ provider: "claude-code" },
|
|
341
|
+
],
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
assert.equal(isCustomProvider("claude-code", registry), false,
|
|
345
|
+
"built-in providers must still defer to PREFERENCES.md");
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it("does not treat bundled external-CLI providers as custom", () => {
|
|
349
|
+
// claude-code/cursor-agent/google-gemini-cli/google-antigravity register at
|
|
350
|
+
// runtime (so they are absent from the generated @gsd/pi-ai catalog), but
|
|
351
|
+
// they are first-party built-ins that PREFERENCES.md can route to. They must
|
|
352
|
+
// never be classified as custom, otherwise auto-mode silently ignores
|
|
353
|
+
// PREFERENCES.md for the default provider.
|
|
354
|
+
for (const provider of ["cursor-agent", "google-gemini-cli", "google-antigravity"]) {
|
|
355
|
+
const registry = { getAll: () => [{ provider }] };
|
|
356
|
+
assert.equal(isCustomProvider(provider, registry), false,
|
|
357
|
+
`${provider} is a built-in CLI provider and must defer to PREFERENCES.md`);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
});
|
|
@@ -900,7 +900,7 @@ test("#2885: openai-codex standard-tier models are recognized", () => {
|
|
|
900
900
|
|
|
901
901
|
test("#2885: openai-codex heavy-tier models are recognized", () => {
|
|
902
902
|
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
903
|
-
const heavyModels = ["gpt-5", "gpt-5-pro", "gpt-5.1", "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.4", "gpt-5.5", "o4-mini", "o4-mini-deep-research"];
|
|
903
|
+
const heavyModels = ["gpt-5", "gpt-5-pro", "gpt-5.1", "gpt-5.2", "gpt-5.2-codex", "gpt-5.3-codex", "gpt-5.4", "gpt-5.5", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "o4-mini", "o4-mini-deep-research"];
|
|
904
904
|
for (const model of heavyModels) {
|
|
905
905
|
const result = resolveModelForComplexity(
|
|
906
906
|
makeClassification("heavy"),
|
|
@@ -29,12 +29,14 @@ import {
|
|
|
29
29
|
|
|
30
30
|
const SKILL_NAME = "testskill";
|
|
31
31
|
const COMPLETE_SLICE_SKILL_NAME = "complete-slice-policies";
|
|
32
|
-
const SKILL_ACTIVATION_SUBSTRING = `Read the installed '${SKILL_NAME}' skill file from <available_skills>`;
|
|
33
|
-
const COMPLETE_SLICE_SKILL_ACTIVATION_SUBSTRING = `Read the installed '${COMPLETE_SLICE_SKILL_NAME}' skill file from <available_skills>`;
|
|
34
32
|
|
|
35
33
|
const tmpDirs: string[] = [];
|
|
36
34
|
let savedCwd: string | undefined;
|
|
37
35
|
|
|
36
|
+
function expectedSkillRead(base: string, name: string): string {
|
|
37
|
+
return `Read the skill file at \`${join(base, ".agents", "skills", name, "SKILL.md")}\``;
|
|
38
|
+
}
|
|
39
|
+
|
|
38
40
|
function setupProjectWithSkill(options: {
|
|
39
41
|
skillName?: string;
|
|
40
42
|
preferencesLines?: string[];
|
|
@@ -139,7 +141,7 @@ test("worker prompt (buildResearchSlicePrompt) includes <skill_activation> from
|
|
|
139
141
|
"research-slice prompt should contain a <skill_activation> block",
|
|
140
142
|
);
|
|
141
143
|
assert.ok(
|
|
142
|
-
prompt.includes(
|
|
144
|
+
prompt.includes(expectedSkillRead(base, SKILL_NAME)),
|
|
143
145
|
`research-slice prompt should reference the always-used skill '${SKILL_NAME}'`,
|
|
144
146
|
);
|
|
145
147
|
});
|
|
@@ -164,7 +166,7 @@ test("complete-slice prompt includes <skill_activation> from unit-specific skill
|
|
|
164
166
|
"complete-slice prompt should contain a <skill_activation> block",
|
|
165
167
|
);
|
|
166
168
|
assert.ok(
|
|
167
|
-
prompt.includes(
|
|
169
|
+
prompt.includes(expectedSkillRead(base, COMPLETE_SLICE_SKILL_NAME)),
|
|
168
170
|
`complete-slice prompt should reference the skill-rule skill '${COMPLETE_SLICE_SKILL_NAME}'`,
|
|
169
171
|
);
|
|
170
172
|
});
|
|
@@ -192,7 +194,7 @@ test("subagent dispatch prompt (buildParallelResearchSlicesPrompt) carries <skil
|
|
|
192
194
|
`expected at least 2 <skill_activation> blocks (one per slice), got ${blockCount}`,
|
|
193
195
|
);
|
|
194
196
|
assert.ok(
|
|
195
|
-
prompt.includes(
|
|
197
|
+
prompt.includes(expectedSkillRead(base, SKILL_NAME)),
|
|
196
198
|
`parallel-research-slices prompt should reference the always-used skill '${SKILL_NAME}'`,
|
|
197
199
|
);
|
|
198
200
|
assert.ok(
|
|
@@ -104,6 +104,30 @@ test('handlePlanSlice writes slice/task planning state and renders plan artifact
|
|
|
104
104
|
}
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
+
test('handlePlanSlice re-dispatch preserves completed task checkboxes', async () => {
|
|
108
|
+
const base = makeTmpBase();
|
|
109
|
+
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
seedParentSlice();
|
|
113
|
+
|
|
114
|
+
const first = await handlePlanSlice(validParams(), base);
|
|
115
|
+
assert.ok(!('error' in first), `unexpected error: ${'error' in first ? first.error : ''}`);
|
|
116
|
+
|
|
117
|
+
updateTaskStatus('M001', 'S02', 'T01', 'complete', '2026-07-11T00:00:00.000Z');
|
|
118
|
+
|
|
119
|
+
const second = await handlePlanSlice(validParams(), base);
|
|
120
|
+
assert.ok(!('error' in second), `unexpected error: ${'error' in second ? second.error : ''}`);
|
|
121
|
+
|
|
122
|
+
const planPath = join(base, '.gsd', 'phases', '01-test', '01-02-PLAN.md');
|
|
123
|
+
const parsedPlan = parsePlan(readFileSync(planPath, 'utf-8'));
|
|
124
|
+
assert.equal(parsedPlan.tasks.find((task) => task.id === 'T01')?.done, true);
|
|
125
|
+
assert.equal(parsedPlan.tasks.find((task) => task.id === 'T02')?.done, false);
|
|
126
|
+
} finally {
|
|
127
|
+
cleanup(base);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
107
131
|
test('handlePlanSlice persists explicit slice/task target repositories', async () => {
|
|
108
132
|
const base = makeTmpBase();
|
|
109
133
|
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { describe, test, mock, beforeEach, afterEach } from "node:test";
|
|
12
12
|
import assert from "node:assert/strict";
|
|
13
13
|
import { tmpdir } from "node:os";
|
|
14
|
-
import { mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
|
|
15
15
|
import { join } from "node:path";
|
|
16
16
|
|
|
17
17
|
import { runPostUnitVerification, type VerificationContext } from "../auto-verification.ts";
|
|
@@ -113,6 +113,15 @@ ${yamlLines.join("\n")}
|
|
|
113
113
|
_clearGsdRootCache();
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
function useFlatPhaseLayout(): string {
|
|
117
|
+
rmSync(join(tempDir, ".gsd", "milestones"), { recursive: true, force: true });
|
|
118
|
+
const phaseDir = join(tempDir, ".gsd", "phases", "01-m001");
|
|
119
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
120
|
+
invalidateAllCaches();
|
|
121
|
+
_clearGsdRootCache();
|
|
122
|
+
return phaseDir;
|
|
123
|
+
}
|
|
124
|
+
|
|
116
125
|
/**
|
|
117
126
|
* Create a task in DB that will pass basic verification but allows us to test the flow.
|
|
118
127
|
*/
|
|
@@ -461,6 +470,34 @@ describe("Post-execution blocking failure retry bypass", () => {
|
|
|
461
470
|
);
|
|
462
471
|
});
|
|
463
472
|
|
|
473
|
+
test("flat-phase post-unit evidence writes slice-task VERIFY.json at phase level", async () => {
|
|
474
|
+
const phaseDir = useFlatPhaseLayout();
|
|
475
|
+
createPostExecFailureTask();
|
|
476
|
+
writePreferences({
|
|
477
|
+
enhanced_verification: true,
|
|
478
|
+
enhanced_verification_post: true,
|
|
479
|
+
verification_auto_fix: true,
|
|
480
|
+
verification_max_retries: 3,
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
const ctx = makeMockCtx();
|
|
484
|
+
const pi = makeMockPi();
|
|
485
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
486
|
+
const s = makeMockSession(tempDir, { type: "execute-task", id: "M001/S01/T01" });
|
|
487
|
+
|
|
488
|
+
const result = await runPostUnitVerification({ s, ctx, pi }, pauseAutoMock);
|
|
489
|
+
|
|
490
|
+
assert.equal(result, "pause");
|
|
491
|
+
const evidencePath = join(phaseDir, "S01-T01-VERIFY.json");
|
|
492
|
+
const legacyEvidencePath = join(phaseDir, "tasks", "T01-VERIFY.json");
|
|
493
|
+
assert.ok(existsSync(evidencePath), "flat-phase evidence should be written at phase level");
|
|
494
|
+
assert.equal(existsSync(legacyEvidencePath), false, "flat-phase evidence should not create legacy tasks/ path");
|
|
495
|
+
|
|
496
|
+
const evidence = JSON.parse(readFileSync(evidencePath, "utf-8"));
|
|
497
|
+
assert.equal(evidence.passed, false);
|
|
498
|
+
assert.ok(Array.isArray(evidence.postExecutionChecks), "post-execution checks should be included in rewritten evidence");
|
|
499
|
+
});
|
|
500
|
+
|
|
464
501
|
test("strict post-exec warning pause includes warning details", async () => {
|
|
465
502
|
createPostExecWarningTask();
|
|
466
503
|
writePreferences({
|
|
@@ -823,6 +823,157 @@ test("pre-dispatch hook action validation via validatePreferences", () => {
|
|
|
823
823
|
assert.ok(e3.some(e => e.includes("invalid action")));
|
|
824
824
|
});
|
|
825
825
|
|
|
826
|
+
test("planning_subagents validation accepts configured read-only planning specialists", () => {
|
|
827
|
+
const { preferences, errors } = validatePreferences({
|
|
828
|
+
planning_subagents: {
|
|
829
|
+
"plan-milestone": { allowed: ["security", "reviewer"] },
|
|
830
|
+
"plan-slice": { allowed: ["scout", "security", "security"] },
|
|
831
|
+
},
|
|
832
|
+
} as any);
|
|
833
|
+
|
|
834
|
+
assert.equal(errors.length, 0);
|
|
835
|
+
assert.deepEqual(preferences.planning_subagents?.["plan-milestone"]?.allowed, ["security", "reviewer"]);
|
|
836
|
+
assert.deepEqual(preferences.planning_subagents?.["plan-slice"]?.allowed, ["scout", "security"]);
|
|
837
|
+
});
|
|
838
|
+
|
|
839
|
+
test("planning_subagents validation accepts custom agents registered as read-only planning specialists", () => {
|
|
840
|
+
const { preferences, errors } = validatePreferences({
|
|
841
|
+
planning_subagent_registry: {
|
|
842
|
+
"my-custom-planner": { read_only_specialist: true },
|
|
843
|
+
},
|
|
844
|
+
planning_subagents: {
|
|
845
|
+
"plan-milestone": { allowed: ["planner", "my-custom-planner"] },
|
|
846
|
+
"plan-slice": { allowed: ["scout", "my-custom-planner"] },
|
|
847
|
+
},
|
|
848
|
+
} as any);
|
|
849
|
+
|
|
850
|
+
assert.equal(errors.length, 0);
|
|
851
|
+
assert.deepEqual(preferences.planning_subagent_registry?.["my-custom-planner"], {
|
|
852
|
+
read_only_specialist: true,
|
|
853
|
+
});
|
|
854
|
+
assert.deepEqual(preferences.planning_subagents?.["plan-milestone"]?.allowed, [
|
|
855
|
+
"planner",
|
|
856
|
+
"my-custom-planner",
|
|
857
|
+
]);
|
|
858
|
+
assert.deepEqual(preferences.planning_subagents?.["plan-slice"]?.allowed, [
|
|
859
|
+
"scout",
|
|
860
|
+
"my-custom-planner",
|
|
861
|
+
]);
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
test("planning_subagents validation rejects unsupported units and unsafe agents", () => {
|
|
865
|
+
const { preferences, errors } = validatePreferences({
|
|
866
|
+
planning_subagents: {
|
|
867
|
+
"execute-task": { allowed: ["security"] },
|
|
868
|
+
"plan-slice": { allowed: ["worker"] },
|
|
869
|
+
},
|
|
870
|
+
} as any);
|
|
871
|
+
|
|
872
|
+
assert.equal(preferences.planning_subagents, undefined);
|
|
873
|
+
assert.ok(errors.some(e => e.includes("unsupported unit \"execute-task\"")));
|
|
874
|
+
assert.ok(errors.some(e => e.includes("\"worker\"") && e.includes("read-only planning specialist")));
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
test("planning_subagents validation explains how to register custom planning agents", () => {
|
|
878
|
+
const { preferences, errors } = validatePreferences({
|
|
879
|
+
planning_subagents: {
|
|
880
|
+
"plan-slice": { allowed: ["my-custom-planner"] },
|
|
881
|
+
},
|
|
882
|
+
} as any);
|
|
883
|
+
|
|
884
|
+
assert.equal(preferences.planning_subagents, undefined);
|
|
885
|
+
assert.ok(errors.some(e =>
|
|
886
|
+
e.includes("my-custom-planner") &&
|
|
887
|
+
e.includes("planning_subagent_registry.my-custom-planner.read_only_specialist: true")
|
|
888
|
+
));
|
|
889
|
+
});
|
|
890
|
+
|
|
891
|
+
test("planning_subagent_registry validation requires explicit read_only_specialist true", () => {
|
|
892
|
+
const { preferences, errors } = validatePreferences({
|
|
893
|
+
planning_subagent_registry: {
|
|
894
|
+
"write-capable-agent": { read_only_specialist: false },
|
|
895
|
+
},
|
|
896
|
+
} as any);
|
|
897
|
+
|
|
898
|
+
assert.equal(preferences.planning_subagent_registry, undefined);
|
|
899
|
+
assert.ok(errors.some(e =>
|
|
900
|
+
e.includes("planning_subagent_registry.write-capable-agent.read_only_specialist must be true")
|
|
901
|
+
));
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
test("loadEffectiveGSDPreferences merges planning_subagents allowlists", (t) => {
|
|
905
|
+
const originalCwd = process.cwd();
|
|
906
|
+
const originalGsdHome = process.env.GSD_HOME;
|
|
907
|
+
const tempProject = mkdtempSync(join(tmpdir(), "gsd-planning-subagents-project-"));
|
|
908
|
+
const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-planning-subagents-home-"));
|
|
909
|
+
|
|
910
|
+
t.after(() => {
|
|
911
|
+
clearGSDPreferencesCache();
|
|
912
|
+
process.chdir(originalCwd);
|
|
913
|
+
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
914
|
+
else process.env.GSD_HOME = originalGsdHome;
|
|
915
|
+
rmSync(tempProject, { recursive: true, force: true });
|
|
916
|
+
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
mkdirSync(join(tempProject, ".gsd"), { recursive: true });
|
|
920
|
+
process.env.GSD_HOME = tempGsdHome;
|
|
921
|
+
process.chdir(tempProject);
|
|
922
|
+
clearGSDPreferencesCache();
|
|
923
|
+
|
|
924
|
+
writeFileSync(
|
|
925
|
+
getGlobalGSDPreferencesPath(),
|
|
926
|
+
[
|
|
927
|
+
"---",
|
|
928
|
+
"version: 1",
|
|
929
|
+
"planning_subagent_registry:",
|
|
930
|
+
" global-custom-planner:",
|
|
931
|
+
" read_only_specialist: true",
|
|
932
|
+
"planning_subagents:",
|
|
933
|
+
" plan-slice:",
|
|
934
|
+
" allowed: [scout, reviewer, global-custom-planner]",
|
|
935
|
+
"---",
|
|
936
|
+
"",
|
|
937
|
+
].join("\n"),
|
|
938
|
+
"utf-8",
|
|
939
|
+
);
|
|
940
|
+
writeFileSync(
|
|
941
|
+
getProjectGSDPreferencesPath(tempProject),
|
|
942
|
+
[
|
|
943
|
+
"---",
|
|
944
|
+
"version: 1",
|
|
945
|
+
"planning_subagent_registry:",
|
|
946
|
+
" project-custom-planner:",
|
|
947
|
+
" read_only_specialist: true",
|
|
948
|
+
"planning_subagents:",
|
|
949
|
+
" plan-slice:",
|
|
950
|
+
" allowed: [security, project-custom-planner]",
|
|
951
|
+
" plan-milestone:",
|
|
952
|
+
" allowed: [planner, project-custom-planner]",
|
|
953
|
+
"---",
|
|
954
|
+
"",
|
|
955
|
+
].join("\n"),
|
|
956
|
+
"utf-8",
|
|
957
|
+
);
|
|
958
|
+
|
|
959
|
+
const loaded = loadEffectiveGSDPreferences(tempProject);
|
|
960
|
+
assert.deepEqual(loaded?.preferences.planning_subagent_registry, {
|
|
961
|
+
"global-custom-planner": { read_only_specialist: true },
|
|
962
|
+
"project-custom-planner": { read_only_specialist: true },
|
|
963
|
+
});
|
|
964
|
+
assert.deepEqual(loaded?.preferences.planning_subagents?.["plan-slice"]?.allowed, [
|
|
965
|
+
"scout",
|
|
966
|
+
"reviewer",
|
|
967
|
+
"global-custom-planner",
|
|
968
|
+
"security",
|
|
969
|
+
"project-custom-planner",
|
|
970
|
+
]);
|
|
971
|
+
assert.deepEqual(loaded?.preferences.planning_subagents?.["plan-milestone"]?.allowed, [
|
|
972
|
+
"planner",
|
|
973
|
+
"project-custom-planner",
|
|
974
|
+
]);
|
|
975
|
+
});
|
|
976
|
+
|
|
826
977
|
// ── Model config parsing ─────────────────────────────────────────────────────
|
|
827
978
|
|
|
828
979
|
test("parses OpenRouter model config with org/model IDs and fallbacks", () => {
|
|
@@ -54,6 +54,13 @@ const PREF_SAMPLE_VALUES: Record<string, unknown> = {
|
|
|
54
54
|
},
|
|
55
55
|
post_unit_hooks: [{ command: "npm test" }],
|
|
56
56
|
pre_dispatch_hooks: [{ command: "npm run lint" }],
|
|
57
|
+
planning_subagent_registry: {
|
|
58
|
+
"custom-planner": { read_only_specialist: true },
|
|
59
|
+
},
|
|
60
|
+
planning_subagents: {
|
|
61
|
+
"plan-milestone": { allowed: ["scout", "planner"] },
|
|
62
|
+
"plan-slice": { allowed: ["scout"] },
|
|
63
|
+
},
|
|
57
64
|
dynamic_routing: { enabled: true },
|
|
58
65
|
disabled_model_providers: ["slow-provider"],
|
|
59
66
|
uok: { enabled: true },
|
|
@@ -13,6 +13,7 @@ import { tmpdir } from "node:os";
|
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
14
14
|
|
|
15
15
|
import { buildExecuteTaskPrompt, buildPlanSlicePrompt, buildReactiveExecutePrompt, buildResearchSlicePrompt, inlineDependencySummaries } from "../auto-prompts.js";
|
|
16
|
+
import { buildDiscussSlicePrompt } from "../guided-flow.js";
|
|
16
17
|
import { computeBudgets, truncateAtSectionBoundary } from "../context-budget.js";
|
|
17
18
|
|
|
18
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -735,3 +736,89 @@ describe("prompt-budget: modelRegistry + sessionContextWindow behavior", () => {
|
|
|
735
736
|
}
|
|
736
737
|
});
|
|
737
738
|
});
|
|
739
|
+
|
|
740
|
+
// ─── execute-task + discuss-slice inline caps (plan 039) ──────────────────────
|
|
741
|
+
|
|
742
|
+
describe("prompt-budget: execute-task inline cap (039)", () => {
|
|
743
|
+
it("keeps the authoritative task plan whole but drops trailing templates when the plan alone exceeds the inline budget", async () => {
|
|
744
|
+
const base = createFixtureBase();
|
|
745
|
+
try {
|
|
746
|
+
const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
|
|
747
|
+
const taskDir = join(sliceDir, "tasks");
|
|
748
|
+
mkdirSync(taskDir, { recursive: true });
|
|
749
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# Roadmap\n");
|
|
750
|
+
writeFileSync(join(sliceDir, "S01-PLAN.md"), "# Slice Plan\n");
|
|
751
|
+
// Oversized task plan (~60K) — well past the 20K inline ceiling.
|
|
752
|
+
const bigPlan = "# Task Plan\n\nMARKER_TASKPLAN_HEAD\n\n" + Array.from({ length: 30 }, (_, i) =>
|
|
753
|
+
`### Step ${i}\n\n${"Implementation detail. ".repeat(90)}`
|
|
754
|
+
).join("\n\n");
|
|
755
|
+
writeFileSync(join(taskDir, "T01-PLAN.md"), bigPlan);
|
|
756
|
+
|
|
757
|
+
const prompt = await buildExecuteTaskPrompt("M001", "S01", "Slice", "T01", "Task", base, {
|
|
758
|
+
level: "standard",
|
|
759
|
+
sessionContextWindow: 32_000,
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
// The task plan is the authoritative execution contract — never truncated;
|
|
763
|
+
// its content survives whole even when it alone exceeds the inline budget.
|
|
764
|
+
assert.match(prompt, /MARKER_TASKPLAN_HEAD/);
|
|
765
|
+
assert.match(prompt, /### Step 29/);
|
|
766
|
+
// Trailing lower-priority templates are dropped — the on-demand decisions
|
|
767
|
+
// template that "standard" normally inlines is gone because the task plan
|
|
768
|
+
// consumed the entire inline budget. (Baseline: the tiny-plan test above
|
|
769
|
+
// asserts this block IS present.)
|
|
770
|
+
assert.doesNotMatch(prompt, /### On-demand Decisions Template/);
|
|
771
|
+
} finally {
|
|
772
|
+
cleanup(base);
|
|
773
|
+
}
|
|
774
|
+
});
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
describe("prompt-budget: discuss-slice inline cap (039)", () => {
|
|
778
|
+
it("prepends the configured response language", async () => {
|
|
779
|
+
const base = createFixtureBase();
|
|
780
|
+
const gsdHome = mkdtempSync(join(tmpdir(), "gsd-discuss-slice-language-home-"));
|
|
781
|
+
const previousGsdHome = process.env.GSD_HOME;
|
|
782
|
+
process.env.GSD_HOME = gsdHome;
|
|
783
|
+
|
|
784
|
+
try {
|
|
785
|
+
writeFileSync(join(gsdHome, "PREFERENCES.md"), "---\nversion: 1\nlanguage: 中文\n---\n", "utf-8");
|
|
786
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
787
|
+
|
|
788
|
+
const prompt = await buildDiscussSlicePrompt("M001", "S01", "Current", base);
|
|
789
|
+
|
|
790
|
+
assert.match(prompt, /^## Response Language\n\nAlways respond in 中文/);
|
|
791
|
+
} finally {
|
|
792
|
+
if (previousGsdHome === undefined) delete process.env.GSD_HOME;
|
|
793
|
+
else process.env.GSD_HOME = previousGsdHome;
|
|
794
|
+
cleanup(base);
|
|
795
|
+
cleanup(gsdHome);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
it("caps the inlined block — roadmap survives first, the trailing decisions register truncates", async () => {
|
|
800
|
+
const base = createFixtureBase();
|
|
801
|
+
try {
|
|
802
|
+
const msDir = join(base, ".gsd", "milestones", "M001");
|
|
803
|
+
mkdirSync(join(msDir, "slices", "S01"), { recursive: true });
|
|
804
|
+
writeFileSync(join(msDir, "M001-ROADMAP.md"), "# Roadmap\n\nMARKER_ROADMAP\n\n- [ ] **S01: Current** `risk:low`\n");
|
|
805
|
+
writeFileSync(join(msDir, "M001-CONTEXT.md"), "# Context\n\nMARKER_CONTEXT\n");
|
|
806
|
+
// Huge decisions register (~60K) — the unbounded-growth surface the cap bounds.
|
|
807
|
+
const bigDecisions = "# Decisions\n\n" + Array.from({ length: 40 }, (_, i) =>
|
|
808
|
+
`### D${String(i).padStart(3, "0")}\n\n${"Decision rationale detail. ".repeat(60)}`
|
|
809
|
+
).join("\n\n");
|
|
810
|
+
writeFileSync(join(base, ".gsd", "DECISIONS.md"), bigDecisions);
|
|
811
|
+
|
|
812
|
+
const prompt = await buildDiscussSlicePrompt("M001", "S01", "Current", base);
|
|
813
|
+
|
|
814
|
+
// Roadmap is first in the inlined block → survives the cap.
|
|
815
|
+
assert.match(prompt, /MARKER_ROADMAP/);
|
|
816
|
+
// The cap fired (capPreamble ceiling is 20K; the block is ~60K).
|
|
817
|
+
assert.match(prompt, /\[\.\.\.truncated/);
|
|
818
|
+
// The last decision (trailing content) is dropped.
|
|
819
|
+
assert.doesNotMatch(prompt, /### D039/);
|
|
820
|
+
} finally {
|
|
821
|
+
cleanup(base);
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
});
|