gsd-pi 2.76.0-dev.fe143342a → 2.77.0-dev.1d17f366c
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 +17 -35
- package/dist/claude-cli-check.js +32 -3
- package/dist/cli-web-branch.d.ts +1 -0
- package/dist/cli-web-branch.js +3 -0
- package/dist/cli.js +38 -2
- package/dist/extension-discovery.d.ts +6 -0
- package/dist/extension-discovery.js +37 -0
- package/dist/extension-registry.d.ts +3 -0
- package/dist/extension-sort.d.ts +18 -0
- package/dist/extension-sort.js +114 -0
- package/dist/extension-validator.d.ts +47 -0
- package/dist/extension-validator.js +127 -0
- package/dist/loader.js +35 -7
- package/dist/onboarding.js +45 -0
- package/dist/provider-migrations.d.ts +18 -0
- package/dist/provider-migrations.js +14 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +4 -3
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +78 -59
- package/dist/resources/extensions/cmux/index.js +20 -0
- package/dist/resources/extensions/github-sync/templates.js +103 -0
- package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
- package/dist/resources/extensions/google-search/index.js +3 -375
- package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
- package/dist/resources/extensions/gsd/auto/loop.js +90 -2
- package/dist/resources/extensions/gsd/auto/phases.js +95 -21
- package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
- package/dist/resources/extensions/gsd/auto/session.js +18 -1
- package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +115 -17
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +1 -1
- package/dist/resources/extensions/gsd/auto-post-unit.js +90 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +14 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +46 -1
- package/dist/resources/extensions/gsd/auto-start.js +45 -39
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +109 -61
- package/dist/resources/extensions/gsd/auto.js +97 -31
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +27 -1
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +11 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -6
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +34 -2
- package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
- package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
- package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
- package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
- package/dist/resources/extensions/gsd/file-lock.js +49 -9
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +90 -30
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
- package/dist/resources/extensions/gsd/guided-flow.js +212 -9
- package/dist/resources/extensions/gsd/health-widget.js +4 -1
- package/dist/resources/extensions/gsd/journal.js +17 -2
- package/dist/resources/extensions/gsd/key-manager.js +22 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
- package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
- package/dist/resources/extensions/gsd/model-router.js +36 -3
- package/dist/resources/extensions/gsd/notifications.js +30 -16
- package/dist/resources/extensions/gsd/pre-execution-checks.js +31 -6
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/reports.js +5 -4
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +12 -4
- package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
- package/dist/resources/extensions/gsd/state.js +25 -25
- package/dist/resources/extensions/gsd/token-counter.js +22 -5
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
- package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
- package/dist/resources/extensions/gsd/uok/audit.js +18 -2
- package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
- package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
- package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
- package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
- package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
- package/dist/resources/extensions/gsd/uok/writer.js +82 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +50 -10
- package/dist/resources/extensions/mcp-client/auth.js +10 -1
- package/dist/resources/extensions/mcp-client/index.js +118 -9
- package/dist/resources/extensions/shared/cmux-events.js +12 -0
- package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
- package/dist/resources/skills/create-skill/SKILL.md +2 -2
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/dist/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/dist/resources/skills/write-docs/SKILL.md +2 -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/react-loadable-manifest.json +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.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/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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 +9 -9
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
- package/dist/welcome-screen.js +6 -1
- package/dist/wizard.js +2 -0
- package/package.json +16 -14
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +3 -3
- package/packages/mcp-server/dist/env-writer.d.ts +1 -0
- package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
- package/packages/mcp-server/dist/env-writer.js +74 -6
- package/packages/mcp-server/dist/env-writer.js.map +1 -1
- package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
- package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
- package/packages/mcp-server/dist/remote-questions.js +732 -0
- package/packages/mcp-server/dist/remote-questions.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +7 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +95 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts +14 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +49 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +15 -6
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +9 -3
- package/packages/mcp-server/src/env-writer.test.ts +79 -1
- package/packages/mcp-server/src/env-writer.ts +76 -6
- package/packages/mcp-server/src/mcp-server.test.ts +67 -0
- package/packages/mcp-server/src/readers/readers.test.ts +5 -1
- package/packages/mcp-server/src/remote-questions.test.ts +294 -0
- package/packages/mcp-server/src/remote-questions.ts +916 -0
- package/packages/mcp-server/src/server.ts +118 -16
- package/packages/mcp-server/src/session-manager.ts +43 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +44 -0
- package/packages/mcp-server/src/workflow-tools.ts +19 -6
- package/packages/mcp-server/tsconfig.test.json +19 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +6 -1
- package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +6 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +220 -15
- package/packages/pi-ai/dist/models/custom.d.ts +38 -0
- package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/custom.js +41 -0
- package/packages/pi-ai/dist/models/custom.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +16 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/package.json +6 -1
- package/packages/pi-ai/src/models/custom.ts +42 -0
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
- package/packages/pi-ai/src/providers/anthropic.ts +9 -3
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
- package/packages/pi-ai/src/providers/simple-options.ts +17 -1
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +3 -2
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -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 +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -2
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +24 -8
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +11 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
- package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.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 +14 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +21 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +3 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- 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 +13 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +6 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +3 -2
- package/packages/pi-coding-agent/src/core/agent-session.ts +11 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
- package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +24 -11
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +15 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +13 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -2
- package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
- package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +30 -1
- package/packages/pi-coding-agent/src/core/session-manager.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +3 -3
- package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +12 -5
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +21 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +20 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +6 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -5
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +27 -0
- package/packages/pi-tui/src/stdin-buffer.ts +26 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +6 -1
- package/pkg/package.json +1 -1
- package/scripts/install.js +512 -0
- package/scripts/lib/workspace-manifest.cjs +86 -0
- package/scripts/link-workspace-packages.cjs +5 -17
- package/scripts/postinstall.js +9 -178
- package/src/resources/extensions/claude-code-cli/readiness.ts +4 -3
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +91 -63
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +114 -12
- package/src/resources/extensions/cmux/index.ts +35 -10
- package/src/resources/extensions/github-sync/templates.ts +151 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +59 -0
- package/src/resources/extensions/google-search/extension-manifest.json +5 -4
- package/src/resources/extensions/google-search/index.ts +9 -470
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +14 -1
- package/src/resources/extensions/gsd/auto/loop.ts +104 -2
- package/src/resources/extensions/gsd/auto/phases.ts +123 -21
- package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
- package/src/resources/extensions/gsd/auto/session.ts +28 -1
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto/types.ts +1 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +117 -16
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +1 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +92 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +28 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +40 -1
- package/src/resources/extensions/gsd/auto-start.ts +48 -52
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +122 -68
- package/src/resources/extensions/gsd/auto.ts +105 -35
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -1
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +13 -9
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +35 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
- package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
- package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
- package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
- package/src/resources/extensions/gsd/file-lock.ts +84 -11
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +2 -1
- package/src/resources/extensions/gsd/gsd-db.ts +92 -32
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
- package/src/resources/extensions/gsd/guided-flow.ts +259 -10
- package/src/resources/extensions/gsd/health-widget.ts +3 -1
- package/src/resources/extensions/gsd/journal.ts +29 -3
- package/src/resources/extensions/gsd/key-manager.ts +22 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/model-router.ts +42 -1
- package/src/resources/extensions/gsd/notifications.ts +27 -15
- package/src/resources/extensions/gsd/pre-execution-checks.ts +33 -7
- package/src/resources/extensions/gsd/preferences-types.ts +8 -0
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/reports.ts +5 -4
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +16 -3
- package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +35 -30
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +238 -4
- package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
- 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/custom-engine-loop-integration.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +296 -1
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +39 -25
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +138 -5
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
- package/src/resources/extensions/gsd/token-counter.ts +22 -5
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
- package/src/resources/extensions/gsd/uok/audit.ts +20 -2
- package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +23 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +54 -9
- package/src/resources/extensions/mcp-client/auth.ts +12 -1
- package/src/resources/extensions/mcp-client/index.ts +129 -10
- package/src/resources/extensions/shared/cmux-events.ts +59 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
- package/src/resources/skills/create-skill/SKILL.md +2 -2
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
- package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
- package/src/resources/skills/verify-before-complete/SKILL.md +2 -1
- package/src/resources/skills/write-docs/SKILL.md +2 -1
- package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → vidAVJkURvTJ0_V2-64ro}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{n21VtX2hZlkpdEUO_nU4z → vidAVJkURvTJ0_V2-64ro}/_ssgManifest.js +0 -0
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
shouldPromptToEnableCmux,
|
|
15
15
|
} from "../../cmux/index.ts";
|
|
16
16
|
import { autoEnableCmuxPreferences } from "../commands-cmux.ts";
|
|
17
|
-
import type {
|
|
17
|
+
import type { CmuxStateInput } from "../../shared/cmux-events.ts";
|
|
18
18
|
|
|
19
19
|
test("detectCmuxEnvironment requires workspace, surface, and socket", () => {
|
|
20
20
|
const detected = detectCmuxEnvironment(
|
|
@@ -146,15 +146,11 @@ describe("autoEnableCmuxPreferences", () => {
|
|
|
146
146
|
});
|
|
147
147
|
|
|
148
148
|
test("buildCmuxStatusLabel and progress prefer deepest active unit", () => {
|
|
149
|
-
const state:
|
|
150
|
-
activeMilestone: { id: "M001"
|
|
151
|
-
activeSlice: { id: "S02"
|
|
152
|
-
activeTask: { id: "T03"
|
|
149
|
+
const state: CmuxStateInput = {
|
|
150
|
+
activeMilestone: { id: "M001" },
|
|
151
|
+
activeSlice: { id: "S02" },
|
|
152
|
+
activeTask: { id: "T03" },
|
|
153
153
|
phase: "executing",
|
|
154
|
-
recentDecisions: [],
|
|
155
|
-
blockers: [],
|
|
156
|
-
nextAction: "Keep going",
|
|
157
|
-
registry: [],
|
|
158
154
|
progress: {
|
|
159
155
|
milestones: { done: 0, total: 1 },
|
|
160
156
|
slices: { done: 1, total: 3 },
|
|
@@ -105,6 +105,21 @@ test("#4175: postUnitPreVerification pauses complete-milestone after retries exh
|
|
|
105
105
|
);
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
+
test("#4658: postUnitPreVerification waits briefly for DB-close on complete-milestone before retrying", () => {
|
|
109
|
+
assert.ok(
|
|
110
|
+
/async function waitForMilestoneDbClose/.test(postUnitSrc),
|
|
111
|
+
"auto-post-unit should define a DB settle helper for complete-milestone",
|
|
112
|
+
);
|
|
113
|
+
assert.ok(
|
|
114
|
+
/setTimeout\(resolve,\s*COMPLETE_MILESTONE_DB_SETTLE_POLL_MS\)/.test(postUnitSrc),
|
|
115
|
+
"DB settle helper should poll with a bounded timeout window",
|
|
116
|
+
);
|
|
117
|
+
assert.ok(
|
|
118
|
+
/s\.currentUnit\.type\s*===\s*"complete-milestone"[\s\S]*waitForMilestoneDbClose/.test(postUnitSrc),
|
|
119
|
+
"complete-milestone path should invoke DB settle check before retry flow",
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
108
123
|
test("#4175: recoverTimedOutUnit pauses complete-milestone instead of writing a blocker placeholder", () => {
|
|
109
124
|
// The complete-milestone pause branch must sit immediately above the
|
|
110
125
|
// "retries exhausted" writeBlockerPlaceholder call so a failed
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { describe, test, afterEach } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync, existsSync } from "node:fs";
|
|
4
4
|
import { join, dirname } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { invalidateAllCaches } from '../cache.ts';
|
|
8
8
|
import { parseUnitId } from "../unit-id.ts";
|
|
9
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask } from "../gsd-db.ts";
|
|
10
|
+
import { clearPathCache } from "../paths.ts";
|
|
11
|
+
import { clearParseCache } from "../files.ts";
|
|
9
12
|
|
|
10
13
|
// loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
|
|
11
14
|
// In a worktree the file may not exist there yet, so we resolve prompts
|
|
@@ -404,6 +407,63 @@ describe("complete-milestone", () => {
|
|
|
404
407
|
}
|
|
405
408
|
});
|
|
406
409
|
|
|
410
|
+
test("handleCompleteMilestone does not overwrite existing SUMMARY.md on re-dispatch (#4598)", async () => {
|
|
411
|
+
// This test verifies that when SUMMARY.md already exists (from a prior completion),
|
|
412
|
+
// re-calling handleCompleteMilestone does not overwrite it.
|
|
413
|
+
// Before the fix this test FAILS because the handler unconditionally writes SUMMARY.md.
|
|
414
|
+
const { handleCompleteMilestone } = await import("../tools/complete-milestone.ts");
|
|
415
|
+
const base = createFixtureBase();
|
|
416
|
+
const mid = "M001";
|
|
417
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
418
|
+
try {
|
|
419
|
+
// Set up DB with milestone and a complete slice + task
|
|
420
|
+
openDatabase(dbPath);
|
|
421
|
+
insertMilestone({ id: mid, title: "Test Milestone", status: "active" });
|
|
422
|
+
insertSlice({ id: "S01", milestoneId: mid, title: "Slice One", status: "complete" });
|
|
423
|
+
insertTask({ id: "T01", sliceId: "S01", milestoneId: mid, title: "Task One", status: "complete" });
|
|
424
|
+
|
|
425
|
+
// Pre-write an existing SUMMARY.md to simulate a prior completion
|
|
426
|
+
const milestoneDir = join(base, ".gsd", "milestones", mid);
|
|
427
|
+
mkdirSync(milestoneDir, { recursive: true });
|
|
428
|
+
const summaryPath = join(milestoneDir, `${mid}-SUMMARY.md`);
|
|
429
|
+
const originalContent = "original content — must not be overwritten";
|
|
430
|
+
writeFileSync(summaryPath, originalContent, "utf-8");
|
|
431
|
+
|
|
432
|
+
// Call handleCompleteMilestone — this is the re-dispatch scenario
|
|
433
|
+
const params = {
|
|
434
|
+
milestoneId: mid,
|
|
435
|
+
title: "Test Milestone",
|
|
436
|
+
oneLiner: "Re-dispatched",
|
|
437
|
+
narrative: "This is a re-dispatch",
|
|
438
|
+
successCriteriaResults: "Met",
|
|
439
|
+
definitionOfDoneResults: "Done",
|
|
440
|
+
requirementOutcomes: "Covered",
|
|
441
|
+
keyDecisions: [],
|
|
442
|
+
keyFiles: [],
|
|
443
|
+
lessonsLearned: [],
|
|
444
|
+
followUps: "",
|
|
445
|
+
deviations: "",
|
|
446
|
+
verificationPassed: true,
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
const result = await handleCompleteMilestone(params, base);
|
|
450
|
+
|
|
451
|
+
// The call may return an error (milestone already complete) or success
|
|
452
|
+
// but in either case the SUMMARY.md must NOT be overwritten.
|
|
453
|
+
const actualContent = readFileSync(summaryPath, "utf-8");
|
|
454
|
+
assert.strictEqual(
|
|
455
|
+
actualContent,
|
|
456
|
+
originalContent,
|
|
457
|
+
"existing SUMMARY.md must not be overwritten on re-dispatch (#4598)",
|
|
458
|
+
);
|
|
459
|
+
} finally {
|
|
460
|
+
try { closeDatabase(); } catch { /* */ }
|
|
461
|
+
clearPathCache();
|
|
462
|
+
clearParseCache();
|
|
463
|
+
cleanup(base);
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
|
|
407
467
|
test("deriveState completing-milestone integration", async () => {
|
|
408
468
|
const { deriveState, isMilestoneComplete } = await import("../state.ts");
|
|
409
469
|
const { invalidateAllCaches: invalidateAllCachesDynamic } = await import("../cache.ts");
|
|
@@ -125,9 +125,9 @@ console.log('\n=== complete-slice: schema v6 migration ===');
|
|
|
125
125
|
|
|
126
126
|
const adapter = _getAdapter()!;
|
|
127
127
|
|
|
128
|
-
// Verify schema version is current (
|
|
128
|
+
// Verify schema version is current (v22 — quality_gates DDL fix)
|
|
129
129
|
const versionRow = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
130
|
-
assertEq(versionRow?.['v'],
|
|
130
|
+
assertEq(versionRow?.['v'], 22, 'schema version should be 22');
|
|
131
131
|
|
|
132
132
|
// Verify slices table has full_summary_md and full_uat_md columns
|
|
133
133
|
const cols = adapter.prepare("PRAGMA table_info(slices)").all();
|
|
@@ -109,9 +109,9 @@ console.log('\n=== complete-task: schema v5 migration ===');
|
|
|
109
109
|
|
|
110
110
|
const adapter = _getAdapter()!;
|
|
111
111
|
|
|
112
|
-
// Verify schema version is current (
|
|
112
|
+
// Verify schema version is current (v22 — quality_gates DDL fix)
|
|
113
113
|
const versionRow = adapter.prepare('SELECT MAX(version) as v FROM schema_version').get();
|
|
114
|
-
assertEq(versionRow?.['v'],
|
|
114
|
+
assertEq(versionRow?.['v'], 22, 'schema version should be 22');
|
|
115
115
|
|
|
116
116
|
// Verify all 4 new tables exist
|
|
117
117
|
const tables = adapter.prepare(
|
|
@@ -179,6 +179,8 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
|
|
|
179
179
|
autoWorktreeBranch: () => "auto/M001",
|
|
180
180
|
resolveMilestoneFile: () => null,
|
|
181
181
|
reconcileMergeState: () => "clean",
|
|
182
|
+
preflightCleanRoot: () => ({ stashPushed: false, summary: "" }),
|
|
183
|
+
postflightPopStash: () => {},
|
|
182
184
|
getLedger: () => null,
|
|
183
185
|
getProjectTotals: () => ({ cost: 0 }),
|
|
184
186
|
formatCost: (c: number) => `$${c.toFixed(2)}`,
|
|
@@ -479,6 +481,165 @@ describe("Custom engine loop integration", () => {
|
|
|
479
481
|
);
|
|
480
482
|
});
|
|
481
483
|
|
|
484
|
+
it("stops custom workflow after repeated verification retries", async () => {
|
|
485
|
+
_resetPendingResolve();
|
|
486
|
+
|
|
487
|
+
const runDir = makeTmpDir();
|
|
488
|
+
const graph = makeGraph([makeStep({ id: "retry-step" })], "retry-exhaustion");
|
|
489
|
+
writeGraph(runDir, graph);
|
|
490
|
+
writeFileSync(join(runDir, "DEFINITION.yaml"), stringify({
|
|
491
|
+
version: 1,
|
|
492
|
+
name: "retry-exhaustion",
|
|
493
|
+
steps: [{
|
|
494
|
+
id: "retry-step",
|
|
495
|
+
name: "retry-step",
|
|
496
|
+
prompt: "Do retry-step",
|
|
497
|
+
produces: "retry-step/output.md",
|
|
498
|
+
verify: { policy: "shell-command", command: "exit 1" },
|
|
499
|
+
}],
|
|
500
|
+
}));
|
|
501
|
+
|
|
502
|
+
const ctx = makeMockCtx();
|
|
503
|
+
const pi = makeMockPi();
|
|
504
|
+
const s = makeLoopSession({
|
|
505
|
+
activeEngineId: "custom",
|
|
506
|
+
activeRunDir: runDir,
|
|
507
|
+
basePath: runDir,
|
|
508
|
+
});
|
|
509
|
+
const deps = makeMockDeps({
|
|
510
|
+
stopAuto: async (_ctx, _pi, reason) => {
|
|
511
|
+
deps.callLog.push(`stopAuto:${reason ?? "no-reason"}`);
|
|
512
|
+
s.active = false;
|
|
513
|
+
},
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
const resolver = setInterval(() => {
|
|
517
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
518
|
+
}, 25);
|
|
519
|
+
let timeout: NodeJS.Timeout | undefined;
|
|
520
|
+
try {
|
|
521
|
+
await Promise.race([
|
|
522
|
+
autoLoop(ctx, pi, s, deps),
|
|
523
|
+
new Promise((_, reject) =>
|
|
524
|
+
timeout = setTimeout(() => {
|
|
525
|
+
s.active = false;
|
|
526
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
527
|
+
reject(new Error(
|
|
528
|
+
`autoLoop did not stop after verification retry exhaustion; calls=${pi.calls.length}; log=${deps.callLog.join(",")}`,
|
|
529
|
+
));
|
|
530
|
+
}, 3_000),
|
|
531
|
+
),
|
|
532
|
+
]);
|
|
533
|
+
} finally {
|
|
534
|
+
clearInterval(resolver);
|
|
535
|
+
if (timeout) clearTimeout(timeout);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
assert.equal(pi.calls.length, 4, "verification retry should be capped after four dispatched attempts");
|
|
539
|
+
const stopEntry = deps.callLog.find((e: string) => e.startsWith("stopAuto:"));
|
|
540
|
+
assert.match(stopEntry ?? "", /requested retry 4 times without passing/);
|
|
541
|
+
const finalGraph = readGraph(runDir);
|
|
542
|
+
assert.equal(finalGraph.steps[0]?.status, "active", "failed verification must not reconcile the step complete");
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it("persists custom verification retry budget across a session restart", async () => {
|
|
546
|
+
_resetPendingResolve();
|
|
547
|
+
|
|
548
|
+
const runDir = makeTmpDir();
|
|
549
|
+
const graph = makeGraph([makeStep({ id: "retry-step" })], "retry-restart");
|
|
550
|
+
writeGraph(runDir, graph);
|
|
551
|
+
writeFileSync(join(runDir, "DEFINITION.yaml"), stringify({
|
|
552
|
+
version: 1,
|
|
553
|
+
name: "retry-restart",
|
|
554
|
+
steps: [{
|
|
555
|
+
id: "retry-step",
|
|
556
|
+
name: "retry-step",
|
|
557
|
+
prompt: "Do retry-step",
|
|
558
|
+
produces: "retry-step/output.md",
|
|
559
|
+
verify: { policy: "shell-command", command: "exit 1" },
|
|
560
|
+
}],
|
|
561
|
+
}));
|
|
562
|
+
|
|
563
|
+
const ctx1 = makeMockCtx();
|
|
564
|
+
const pi1 = makeMockPi();
|
|
565
|
+
const s1 = makeLoopSession({
|
|
566
|
+
activeEngineId: "custom",
|
|
567
|
+
activeRunDir: runDir,
|
|
568
|
+
basePath: runDir,
|
|
569
|
+
});
|
|
570
|
+
const deps1 = makeMockDeps();
|
|
571
|
+
const resolver1 = setInterval(() => {
|
|
572
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
573
|
+
if (pi1.calls.length >= 2) {
|
|
574
|
+
s1.active = false;
|
|
575
|
+
}
|
|
576
|
+
}, 25);
|
|
577
|
+
let timeout1: NodeJS.Timeout | undefined;
|
|
578
|
+
try {
|
|
579
|
+
await Promise.race([
|
|
580
|
+
autoLoop(ctx1, pi1, s1, deps1),
|
|
581
|
+
new Promise((_, reject) =>
|
|
582
|
+
timeout1 = setTimeout(() => {
|
|
583
|
+
s1.active = false;
|
|
584
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
585
|
+
reject(new Error(
|
|
586
|
+
`first autoLoop did not pause after two retry attempts; calls=${pi1.calls.length}; log=${deps1.callLog.join(",")}`,
|
|
587
|
+
));
|
|
588
|
+
}, 3_000),
|
|
589
|
+
),
|
|
590
|
+
]);
|
|
591
|
+
} finally {
|
|
592
|
+
clearInterval(resolver1);
|
|
593
|
+
if (timeout1) clearTimeout(timeout1);
|
|
594
|
+
}
|
|
595
|
+
assert.equal(pi1.calls.length, 2, "first session should consume two retry attempts");
|
|
596
|
+
assert.equal(
|
|
597
|
+
deps1.callLog.some((e: string) => e.startsWith("stopAuto:")),
|
|
598
|
+
false,
|
|
599
|
+
"first session should stop because the session deactivated, not because retry budget exhausted",
|
|
600
|
+
);
|
|
601
|
+
|
|
602
|
+
_resetPendingResolve();
|
|
603
|
+
const ctx2 = makeMockCtx();
|
|
604
|
+
const pi2 = makeMockPi();
|
|
605
|
+
const s2 = makeLoopSession({
|
|
606
|
+
activeEngineId: "custom",
|
|
607
|
+
activeRunDir: runDir,
|
|
608
|
+
basePath: runDir,
|
|
609
|
+
});
|
|
610
|
+
const deps2 = makeMockDeps({
|
|
611
|
+
stopAuto: async (_ctx, _pi, reason) => {
|
|
612
|
+
deps2.callLog.push(`stopAuto:${reason ?? "no-reason"}`);
|
|
613
|
+
s2.active = false;
|
|
614
|
+
},
|
|
615
|
+
});
|
|
616
|
+
const resolver2 = setInterval(() => {
|
|
617
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
618
|
+
}, 25);
|
|
619
|
+
let timeout2: NodeJS.Timeout | undefined;
|
|
620
|
+
try {
|
|
621
|
+
await Promise.race([
|
|
622
|
+
autoLoop(ctx2, pi2, s2, deps2),
|
|
623
|
+
new Promise((_, reject) =>
|
|
624
|
+
timeout2 = setTimeout(() => {
|
|
625
|
+
s2.active = false;
|
|
626
|
+
resolveAgentEnd({ messages: [{ role: "assistant" }] });
|
|
627
|
+
reject(new Error(
|
|
628
|
+
`second autoLoop did not stop after persisted retry exhaustion; calls=${pi2.calls.length}; log=${deps2.callLog.join(",")}`,
|
|
629
|
+
));
|
|
630
|
+
}, 3_000),
|
|
631
|
+
),
|
|
632
|
+
]);
|
|
633
|
+
} finally {
|
|
634
|
+
clearInterval(resolver2);
|
|
635
|
+
if (timeout2) clearTimeout(timeout2);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
assert.equal(pi2.calls.length, 2, "second session should exhaust after attempts 3 and 4");
|
|
639
|
+
const stopEntry = deps2.callLog.find((e: string) => e.startsWith("stopAuto:"));
|
|
640
|
+
assert.match(stopEntry ?? "", /requested retry 4 times without passing/);
|
|
641
|
+
});
|
|
642
|
+
|
|
482
643
|
it("GRAPH.yaml step stays pending when session deactivates before reconcile", async () => {
|
|
483
644
|
_resetPendingResolve();
|
|
484
645
|
|
|
@@ -50,6 +50,7 @@ test("doctor-heal.md contains DB access guardrail naming gsd_milestone_status",
|
|
|
50
50
|
const prompt = readPrompt("doctor-heal");
|
|
51
51
|
assert.match(prompt, /gsd_milestone_status/, "doctor-heal.md must name gsd_milestone_status as the DB inspection tool");
|
|
52
52
|
assert.match(prompt, /Do NOT query.*\.gsd\/gsd\.db/i, "doctor-heal.md must prohibit direct DB queries");
|
|
53
|
+
assert.doesNotMatch(prompt, /\{\{milestoneId\}\}/, "doctor-heal.md must not declare unprovided milestoneId template variables");
|
|
53
54
|
});
|
|
54
55
|
|
|
55
56
|
test("forensics.md contains DB inspection guardrail", () => {
|
|
@@ -431,7 +431,7 @@ Continue from step 2.
|
|
|
431
431
|
cleanup(base1);
|
|
432
432
|
}
|
|
433
433
|
|
|
434
|
-
// Case B: S01 depends on nonexistent S99
|
|
434
|
+
// Case B: S01 depends on nonexistent S99 -> fallback picks best available slice
|
|
435
435
|
const base2 = createFixtureBase();
|
|
436
436
|
try {
|
|
437
437
|
writeRoadmap(base2, 'M001', `# M001: Test Milestone
|
|
@@ -446,7 +446,6 @@ Continue from step 2.
|
|
|
446
446
|
|
|
447
447
|
const state2 = await deriveState(base2);
|
|
448
448
|
|
|
449
|
-
// With partial-dep fallback, S01 is picked despite unmet dep on S99
|
|
450
449
|
assert.deepStrictEqual(state2.phase, 'planning', 'blocked-B: phase is planning (fallback picks S01)');
|
|
451
450
|
assert.deepStrictEqual(state2.activeSlice?.id, 'S01', 'blocked-B: activeSlice is S01 via fallback');
|
|
452
451
|
} finally {
|
|
@@ -47,21 +47,26 @@ describe("completing-milestone dispatch guard (#4324)", () => {
|
|
|
47
47
|
assert.ok(dispatchIdx > -1, "complete-milestone dispatch should exist after the skip guard");
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
test("
|
|
51
|
-
assert.match(source, /import\s*\{[^}]*updateMilestoneStatus[^}]*\}\s*from\s*["']\.\/gsd-db/);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test("reconciles DB when SUMMARY exists on disk but DB is out of sync", () => {
|
|
50
|
+
test("classifies SUMMARY outcome and conditionally reconciles DB (#4658)", () => {
|
|
55
51
|
const phaseCheck = source.indexOf('phase !== "completing-milestone"');
|
|
56
52
|
// The SUMMARY-exists reconciliation guard must appear in this rule
|
|
57
53
|
const summaryGuard = source.indexOf('resolveMilestoneFile(basePath, mid, "SUMMARY")', phaseCheck);
|
|
58
54
|
assert.ok(summaryGuard > -1, "SUMMARY file check should exist in the completing-milestone rule");
|
|
59
55
|
|
|
56
|
+
const classifyCall = source.indexOf("classifyMilestoneSummaryContent", summaryGuard);
|
|
57
|
+
assert.ok(classifyCall > -1, "SUMMARY mismatch handling should classify summary content");
|
|
58
|
+
const dbGateBeforeClassify = source.indexOf("existingSummary && isDbAvailable()", summaryGuard);
|
|
59
|
+
assert.ok(
|
|
60
|
+
dbGateBeforeClassify === -1 || dbGateBeforeClassify > classifyCall,
|
|
61
|
+
"SUMMARY classification must not be gated on DB availability",
|
|
62
|
+
);
|
|
63
|
+
|
|
60
64
|
const reconcileCall = source.indexOf('updateMilestoneStatus(mid, "complete"', summaryGuard);
|
|
61
|
-
assert.ok(reconcileCall > -1, "
|
|
65
|
+
assert.ok(reconcileCall > -1, "successful SUMMARY should reconcile DB to complete");
|
|
62
66
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
const stopAction = source.indexOf('action: "stop"', summaryGuard);
|
|
68
|
+
assert.ok(stopAction > -1, "SUMMARY mismatch should return stop action");
|
|
69
|
+
const warningLevel = source.indexOf('level: "warning"', summaryGuard);
|
|
70
|
+
assert.ok(warningLevel > -1, "SUMMARY mismatch should be warning-level stop (pauses auto-mode)");
|
|
66
71
|
});
|
|
67
72
|
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// GSD-2 dispatch-guard regression test: SUMMARY/DB mismatch fail-closed behavior (#4663)
|
|
2
|
+
//
|
|
3
|
+
// Sibling bug to #4658 / PR #4660. A failure-path SUMMARY file on disk
|
|
4
|
+
// must not let the cross-milestone dispatch guard treat an "active"
|
|
5
|
+
// milestone as complete. DB status is authoritative when available.
|
|
6
|
+
|
|
7
|
+
import test from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { getPriorSliceCompletionBlocker } from "../dispatch-guard.ts";
|
|
13
|
+
import { openDatabase, closeDatabase, insertMilestone, insertSlice } from "../gsd-db.ts";
|
|
14
|
+
|
|
15
|
+
function setupRepo(): string {
|
|
16
|
+
const repo = mkdtempSync(join(tmpdir(), "gsd-dispatch-guard-4663-"));
|
|
17
|
+
mkdirSync(join(repo, ".gsd"), { recursive: true });
|
|
18
|
+
openDatabase(join(repo, ".gsd", "gsd.db"));
|
|
19
|
+
return repo;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function teardownRepo(repo: string): void {
|
|
23
|
+
closeDatabase();
|
|
24
|
+
rmSync(repo, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
test("#4663: dispatch guard blocks when prior milestone has failure SUMMARY but DB is still active", (t) => {
|
|
28
|
+
const repo = setupRepo();
|
|
29
|
+
t.after(() => teardownRepo(repo));
|
|
30
|
+
|
|
31
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
|
|
32
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M003"), { recursive: true });
|
|
33
|
+
|
|
34
|
+
// M002: DB says active with a pending slice, but a failure SUMMARY exists on disk.
|
|
35
|
+
insertMilestone({ id: "M002", title: "Previous", status: "active" });
|
|
36
|
+
insertSlice({ id: "S01", milestoneId: "M002", title: "Pending", status: "pending", depends: [] });
|
|
37
|
+
|
|
38
|
+
insertMilestone({ id: "M003", title: "Current", status: "active" });
|
|
39
|
+
insertSlice({ id: "S01", milestoneId: "M003", title: "First", status: "pending", depends: [] });
|
|
40
|
+
|
|
41
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
|
|
42
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"), "# M003\n");
|
|
43
|
+
writeFileSync(
|
|
44
|
+
join(repo, ".gsd", "milestones", "M002", "M002-SUMMARY.md"),
|
|
45
|
+
"# M002 Summary\nverification FAILED — not complete.\n",
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
// Before #4663: SUMMARY presence short-circuited the loop and M002 was skipped,
|
|
49
|
+
// allowing M003/S01 to dispatch. After: DB status is consulted and M002 still blocks.
|
|
50
|
+
assert.equal(
|
|
51
|
+
getPriorSliceCompletionBlocker(repo, "main", "plan-slice", "M003/S01"),
|
|
52
|
+
"Cannot dispatch plan-slice M003/S01: earlier slice M002/S01 is not complete.",
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("#4663: dispatch guard allows dispatch when prior milestone has SUMMARY and DB is complete", (t) => {
|
|
57
|
+
const repo = setupRepo();
|
|
58
|
+
t.after(() => teardownRepo(repo));
|
|
59
|
+
|
|
60
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
|
|
61
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M003"), { recursive: true });
|
|
62
|
+
|
|
63
|
+
insertMilestone({ id: "M002", title: "Previous", status: "complete" });
|
|
64
|
+
insertSlice({ id: "S01", milestoneId: "M002", title: "Done", status: "complete", depends: [] });
|
|
65
|
+
|
|
66
|
+
insertMilestone({ id: "M003", title: "Current", status: "active" });
|
|
67
|
+
insertSlice({ id: "S01", milestoneId: "M003", title: "First", status: "pending", depends: [] });
|
|
68
|
+
|
|
69
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
|
|
70
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M003", "M003-ROADMAP.md"), "# M003\n");
|
|
71
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-SUMMARY.md"), "# M002 Summary\nDone.\n");
|
|
72
|
+
|
|
73
|
+
assert.equal(
|
|
74
|
+
getPriorSliceCompletionBlocker(repo, "main", "plan-slice", "M003/S01"),
|
|
75
|
+
null,
|
|
76
|
+
);
|
|
77
|
+
});
|
|
@@ -255,6 +255,31 @@ test("dispatch guard skips completed milestone with SUMMARY even if it has unche
|
|
|
255
255
|
);
|
|
256
256
|
});
|
|
257
257
|
|
|
258
|
+
test("dispatch guard does not skip failed milestone SUMMARY without blocker prose", (t) => {
|
|
259
|
+
const repo = setupRepo();
|
|
260
|
+
t.after(() => teardownRepo(repo));
|
|
261
|
+
|
|
262
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M001"), { recursive: true });
|
|
263
|
+
mkdirSync(join(repo, ".gsd", "milestones", "M002"), { recursive: true });
|
|
264
|
+
|
|
265
|
+
insertMilestone({ id: "M001", title: "Previous" });
|
|
266
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Core", status: "complete", depends: [], sequence: 1 });
|
|
267
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Unfinished", status: "pending", depends: ["S01"], sequence: 2 });
|
|
268
|
+
|
|
269
|
+
insertMilestone({ id: "M002", title: "Current" });
|
|
270
|
+
insertSlice({ id: "S01", milestoneId: "M002", title: "Start", status: "pending", depends: [], sequence: 1 });
|
|
271
|
+
|
|
272
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# M001\n");
|
|
273
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M001", "M001-SUMMARY.md"),
|
|
274
|
+
"---\nstatus: failed\n---\n# M001 Summary\nRecovery stopped.\n");
|
|
275
|
+
writeFileSync(join(repo, ".gsd", "milestones", "M002", "M002-ROADMAP.md"), "# M002\n");
|
|
276
|
+
|
|
277
|
+
assert.equal(
|
|
278
|
+
getPriorSliceCompletionBlocker(repo, "main", "plan-slice", "M002/S01"),
|
|
279
|
+
"Cannot dispatch plan-slice M002/S01: earlier slice M001/S02 is not complete.",
|
|
280
|
+
);
|
|
281
|
+
});
|
|
282
|
+
|
|
258
283
|
test("dispatch guard works without git repo", (t) => {
|
|
259
284
|
const repo = setupRepo();
|
|
260
285
|
t.after(() => teardownRepo(repo));
|
|
@@ -57,6 +57,17 @@ function scaffoldSlicePlan(basePath: string, mid: string, sid: string): void {
|
|
|
57
57
|
].join("\n"));
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
function scaffoldMilestoneContext(basePath: string, mid: string): void {
|
|
61
|
+
const dir = join(basePath, ".gsd", "milestones", mid);
|
|
62
|
+
mkdirSync(dir, { recursive: true });
|
|
63
|
+
writeFileSync(join(dir, `${mid}-CONTEXT.md`), [
|
|
64
|
+
`# ${mid}: Test Milestone`,
|
|
65
|
+
"",
|
|
66
|
+
"Context for dispatch recovery tests.",
|
|
67
|
+
"",
|
|
68
|
+
].join("\n"));
|
|
69
|
+
}
|
|
70
|
+
|
|
60
71
|
function scaffoldTaskPlan(basePath: string, mid: string, sid: string, tid: string): void {
|
|
61
72
|
const dir = join(basePath, ".gsd", "milestones", mid, "slices", sid, "tasks");
|
|
62
73
|
mkdirSync(dir, { recursive: true });
|
|
@@ -76,6 +87,7 @@ test("dispatch: missing task plan triggers plan-slice (not stop) — issue #909"
|
|
|
76
87
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
77
88
|
|
|
78
89
|
// Slice plan exists with tasks, but tasks/ directory is empty
|
|
90
|
+
scaffoldMilestoneContext(tmp, "M002");
|
|
79
91
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
80
92
|
|
|
81
93
|
const ctx = makeContext(tmp);
|
|
@@ -92,6 +104,7 @@ test("dispatch: present task plan proceeds to execute-task normally", async (t)
|
|
|
92
104
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-ok-"));
|
|
93
105
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
94
106
|
|
|
107
|
+
scaffoldMilestoneContext(tmp, "M002");
|
|
95
108
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
96
109
|
scaffoldTaskPlan(tmp, "M002", "S03", "T01");
|
|
97
110
|
|
|
@@ -111,6 +124,7 @@ test("dispatch: plan-slice recovery loop — second call after plan-slice still
|
|
|
111
124
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-909-loop-"));
|
|
112
125
|
t.after(() => rmSync(tmp, { recursive: true, force: true }));
|
|
113
126
|
|
|
127
|
+
scaffoldMilestoneContext(tmp, "M002");
|
|
114
128
|
scaffoldSlicePlan(tmp, "M002", "S03");
|
|
115
129
|
|
|
116
130
|
const ctx = makeContext(tmp);
|
|
@@ -768,6 +768,37 @@ test("runProviderChecks detects claude.cmd in PATH on Windows (#4503)", { skip:
|
|
|
768
768
|
});
|
|
769
769
|
});
|
|
770
770
|
|
|
771
|
+
test("runProviderChecks detects claude.exe in PATH on Windows (#4548)", { skip: process.platform !== "win32" }, () => {
|
|
772
|
+
const tmpHome = realpathSync(mkdtempSync(join(tmpdir(), "gsd-providers-cc-exe-home-")));
|
|
773
|
+
const binDir = join(tmpHome, "bin");
|
|
774
|
+
mkdirSync(binDir, { recursive: true });
|
|
775
|
+
|
|
776
|
+
// Some Windows installs ship a direct claude.exe binary (not a .cmd shim).
|
|
777
|
+
const fakeClaudeExe = join(binDir, "claude.exe");
|
|
778
|
+
writeFileSync(fakeClaudeExe, "");
|
|
779
|
+
|
|
780
|
+
withEnv({
|
|
781
|
+
HOME: tmpHome,
|
|
782
|
+
ANTHROPIC_API_KEY: undefined,
|
|
783
|
+
ANTHROPIC_OAUTH_TOKEN: undefined,
|
|
784
|
+
COPILOT_GITHUB_TOKEN: undefined,
|
|
785
|
+
GH_TOKEN: undefined,
|
|
786
|
+
GITHUB_TOKEN: undefined,
|
|
787
|
+
PATH: `${binDir};${process.env.PATH ?? ""}`,
|
|
788
|
+
PATHEXT: ".COM;.EXE;.BAT;.CMD",
|
|
789
|
+
}, () => {
|
|
790
|
+
try {
|
|
791
|
+
const results = runProviderChecks();
|
|
792
|
+
const anthropic = results.find(r => r.name === "anthropic");
|
|
793
|
+
assert.ok(anthropic, "anthropic result should exist");
|
|
794
|
+
assert.equal(anthropic!.status, "ok", "should be ok when claude.exe is in PATH (#4548)");
|
|
795
|
+
assert.ok(anthropic!.message.toLowerCase().includes("claude"), "should mention claude-code as source");
|
|
796
|
+
} finally {
|
|
797
|
+
rmSync(tmpHome, { recursive: true, force: true });
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
});
|
|
801
|
+
|
|
771
802
|
test("PROVIDER_ROUTES includes google-gemini-cli as route for google (#2922)", async () => {
|
|
772
803
|
const { readFileSync: readFS } = await import("node:fs");
|
|
773
804
|
const { dirname: dirn, join: joinPath } = await import("node:path");
|
|
@@ -42,7 +42,7 @@ describe("double mergeAndExit guard (#2645)", () => {
|
|
|
42
42
|
const allCompleteIdx = phasesSrc.indexOf("incomplete.length === 0");
|
|
43
43
|
assert.ok(allCompleteIdx > 0, "phases.ts should have an all-milestones-complete check");
|
|
44
44
|
|
|
45
|
-
const afterAllComplete = phasesSrc.slice(allCompleteIdx, allCompleteIdx +
|
|
45
|
+
const afterAllComplete = phasesSrc.slice(allCompleteIdx, allCompleteIdx + 800);
|
|
46
46
|
const mergeIdx = afterAllComplete.indexOf("deps.resolver.mergeAndExit");
|
|
47
47
|
const flagIdx = afterAllComplete.indexOf("s.milestoneMergedInPhases = true");
|
|
48
48
|
|
|
@@ -389,7 +389,7 @@ describe('ensure-db-open', () => {
|
|
|
389
389
|
assert.ok(db, 'adapter should be available after ensureDbOpen');
|
|
390
390
|
assert.equal(
|
|
391
391
|
db.prepare('SELECT MAX(version) as version FROM schema_version').get()?.version,
|
|
392
|
-
|
|
392
|
+
22,
|
|
393
393
|
'legacy DB should migrate to current schema version',
|
|
394
394
|
);
|
|
395
395
|
|
|
@@ -348,7 +348,7 @@ test("ADR-011 P2: schema v20 fresh DB has all escalation columns on tasks + sour
|
|
|
348
348
|
assert.ok(decCols.includes("source"), "decisions table must have source column");
|
|
349
349
|
|
|
350
350
|
const version = adapter.prepare("SELECT MAX(version) as v FROM schema_version").get();
|
|
351
|
-
assert.equal(version?.["v"],
|
|
351
|
+
assert.equal(version?.["v"], 22);
|
|
352
352
|
});
|
|
353
353
|
|
|
354
354
|
test("ADR-011 P2: findUnappliedEscalationOverride returns null when escalation_pending=1 (still pending)", (t) => {
|