@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.fb12b103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +38 -6
- package/dist/resources/extensions/gsd/auto/orchestrator.js +40 -9
- package/dist/resources/extensions/gsd/auto/phases.js +6 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +12 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +19 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +15 -10
- package/dist/resources/extensions/gsd/auto-start.js +21 -21
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +8 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +151 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +30 -4
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +171 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +51 -5
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +1 -20
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/uat-policy.js +2 -1
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- 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 +10 -10
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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/mcp-connections/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.nft.json +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/shutdown/route.js.nft.json +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.nft.json +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.nft.json +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.nft.json +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.js.nft.json +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 +10 -10
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- 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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +46 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +478 -484
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +500 -533
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +46 -10
- package/src/resources/extensions/gsd/auto/phases.ts +10 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +12 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -7
- package/src/resources/extensions/gsd/auto-prompts.ts +40 -26
- package/src/resources/extensions/gsd/auto-start.ts +21 -22
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +20 -24
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +180 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +29 -3
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +173 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +50 -5
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +4 -21
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +16 -19
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +248 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +43 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/uat-policy.ts +2 -1
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +10 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → mU4QIDlpVHDdjDpeEKh5W}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → mU4QIDlpVHDdjDpeEKh5W}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Guidance module — the single catalog mapping typed findings
|
|
3
|
+
// (Recovery kinds, milestone blocker kinds, doctor issue codes, crash unit
|
|
4
|
+
// classes) to user-facing remediation: what happened and what to do next.
|
|
5
|
+
//
|
|
6
|
+
// Emit sites pass the typed finding; phrasing, command names, and step
|
|
7
|
+
// ordering live here. A missing catalog row is a visible gap, not a silent
|
|
8
|
+
// omission scattered across call sites.
|
|
9
|
+
/** Flatten guidance into a notification / pause-banner string. */
|
|
10
|
+
export function formatGuidance(guidance) {
|
|
11
|
+
if (guidance.steps.length === 0)
|
|
12
|
+
return guidance.summary;
|
|
13
|
+
const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
|
|
14
|
+
return `${guidance.summary}\n\n${numbered}`;
|
|
15
|
+
}
|
|
16
|
+
const RECOVERY_REMEDIATION = {
|
|
17
|
+
"tool-schema": "Fix the Unit Tool Contract or tool schema before retrying.",
|
|
18
|
+
"tool-contract": "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
|
|
19
|
+
"tool-unavailable": "The tool surface had not finished registering when the Unit called it (workflow MCP startup race). Retry after the surface is ready; escalate if the tool never appears.",
|
|
20
|
+
"deterministic-policy": "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
|
|
21
|
+
"lifecycle-progression": "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
|
|
22
|
+
"stale-worker": "Run `/gsd doctor` to detect and clear the stale worker or lock, then run `/gsd auto` to resume.",
|
|
23
|
+
"worktree-invalid": "Run `/gsd doctor` to diagnose the milestone worktree (`gsd worktree list` shows its state). Repair it, or merge salvageable work with `gsd worktree merge <name>` before recreating — recreating discards uncommitted work.",
|
|
24
|
+
"verification-drift": "Run `/gsd status` to see the verification finding, fix or re-run the verification, then run `/gsd auto` to resume. `/gsd doctor` can repair stale state files.",
|
|
25
|
+
"reconciliation-drift": "Run `/gsd doctor` to surface the persistent or repair-failed drift kinds, apply its fixes, then run `/gsd auto` to resume.",
|
|
26
|
+
"illegal-transition": "A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
|
|
27
|
+
"runtime-unknown": "Inspect the runtime error and add a dedicated classification if it is repeatable.",
|
|
28
|
+
"provider-transient": "Retry after the provider/network condition clears.",
|
|
29
|
+
"provider-permanent": "Inspect provider credentials, model entitlement, or request shape.",
|
|
30
|
+
};
|
|
31
|
+
export function recoveryRemediation(key) {
|
|
32
|
+
return RECOVERY_REMEDIATION[key];
|
|
33
|
+
}
|
|
34
|
+
// ─── Milestone validation blockers ──────────────────────────────────────
|
|
35
|
+
// NOTE: the first line of each blocker is load-bearing — validation-block-guard
|
|
36
|
+
// matches /milestone validation returned needs-(?:attention|remediation)/i.
|
|
37
|
+
// Keep that phrase intact when editing.
|
|
38
|
+
export function needsAttentionBlockerGuidance(milestoneId) {
|
|
39
|
+
return [
|
|
40
|
+
`Milestone ${milestoneId} is blocked because milestone validation returned needs-attention.`,
|
|
41
|
+
`Fix options:`,
|
|
42
|
+
`1. Review the validation details: \`/gsd status\``,
|
|
43
|
+
`2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
|
|
44
|
+
`3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
45
|
+
`4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
46
|
+
`After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
|
|
47
|
+
].join("\n");
|
|
48
|
+
}
|
|
49
|
+
export function needsRemediationBlockerGuidance(milestoneId) {
|
|
50
|
+
return [
|
|
51
|
+
`Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
|
|
52
|
+
`Fix options:`,
|
|
53
|
+
`1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
|
|
54
|
+
`2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
55
|
+
`3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
56
|
+
].join("\n");
|
|
57
|
+
}
|
|
58
|
+
// ─── Crash recovery resume hints ────────────────────────────────────────
|
|
59
|
+
/** Resume hint for an interrupted auto-mode unit, by unit class. */
|
|
60
|
+
export function crashResumeHint(unitType, unitId) {
|
|
61
|
+
if (unitType === "starting" && unitId === "bootstrap") {
|
|
62
|
+
return `No work was lost. Run /gsd auto to restart.`;
|
|
63
|
+
}
|
|
64
|
+
if (unitType.includes("research") || unitType.includes("plan")) {
|
|
65
|
+
return `The ${unitType} unit may be incomplete. Run /gsd auto to re-run it.`;
|
|
66
|
+
}
|
|
67
|
+
if (unitType.includes("execute")) {
|
|
68
|
+
return `Task execution was interrupted. Run /gsd auto to resume — completed work is preserved.`;
|
|
69
|
+
}
|
|
70
|
+
if (unitType.includes("complete")) {
|
|
71
|
+
return `Slice/milestone completion was interrupted. Run /gsd auto to finish.`;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
// ─── Doctor issue fix hints ─────────────────────────────────────────────
|
|
76
|
+
// Partial by design: codes without a row render no hint. Add rows here as
|
|
77
|
+
// guidance is authored — the gap is visible in one place.
|
|
78
|
+
const DOCTOR_FIX_HINTS = {
|
|
79
|
+
db_unavailable: "The workflow database could not be opened — state derivation is degraded. Restart the session; if it persists, run `/gsd doctor` from the project root.",
|
|
80
|
+
stale_crash_lock: "Run `/gsd doctor` to clear the stale lock, then `/gsd auto` to resume.",
|
|
81
|
+
stale_parallel_session: "Run `/gsd doctor` to clear the stale session registration.",
|
|
82
|
+
unresolved_git_conflicts: "Resolve the conflict markers, commit, then re-run `/gsd auto`.",
|
|
83
|
+
conflict_markers_in_tracked_files: "Search the listed files for `<<<<<<<` markers, resolve, and commit.",
|
|
84
|
+
worktree_dirty: "Commit or merge the worktree's changes (`gsd worktree merge <name>`) before removing it.",
|
|
85
|
+
worktree_branch_merged: "The branch is merged — remove the worktree to reclaim space.",
|
|
86
|
+
orphaned_auto_worktree: "Run `/gsd doctor` to fix, or merge salvageable work with `gsd worktree merge <name>`.",
|
|
87
|
+
gitignore_missing_patterns: "Run `/gsd doctor` to append the missing .gitignore patterns.",
|
|
88
|
+
invalid_preferences: "Edit .gsd/PREFERENCES.md to fix the invalid field, then re-run the command.",
|
|
89
|
+
provider_key_missing: "Add the provider API key to your environment or provider config, then retry.",
|
|
90
|
+
provider_key_backedoff: "The key is cooling down after repeated failures — wait, or switch the phase model in .gsd/PREFERENCES.md.",
|
|
91
|
+
state_file_stale: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
92
|
+
state_file_missing: "Run `/gsd doctor` to rebuild the projection from the database.",
|
|
93
|
+
projection_drift: "Run `/gsd doctor` to rebuild markdown projections from the database (DB is the source of truth).",
|
|
94
|
+
uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
|
|
95
|
+
};
|
|
96
|
+
export function doctorFixHint(code) {
|
|
97
|
+
return DOCTOR_FIX_HINTS[code];
|
|
98
|
+
}
|
|
@@ -47,10 +47,10 @@ import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
|
|
|
47
47
|
import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForGuidedUnit, supportsStructuredQuestions, } from "./workflow-mcp.js";
|
|
48
48
|
import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
|
|
49
49
|
import { verifyExpectedArtifact } from "./auto-recovery.js";
|
|
50
|
-
import { getPendingGate } from "./bootstrap/write-gate.js";
|
|
50
|
+
import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
51
51
|
import { _getPendingAutoStart, deletePendingAutoStart, hasPendingAutoStart, setPendingAutoStart, } from "./pending-auto-start.js";
|
|
52
52
|
import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
|
|
53
|
-
import { scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
|
|
53
|
+
import { checkAutoStartAfterDiscuss, scheduleAutoStartAfterIdle } from "./discussion-handoff.js";
|
|
54
54
|
export { maybeHandleEmptyIntentTurn, maybeHandleReadyPhraseWithoutFiles, resetEmptyTurnCounter, } from "./guided-unit-completion.js";
|
|
55
55
|
export { _getPendingAutoStart, clearPendingAutoStart, getDiscussionMilestoneId, setPendingAutoStart, } from "./pending-auto-start.js";
|
|
56
56
|
export { checkAutoStartAfterDiscuss } from "./discussion-handoff.js";
|
|
@@ -1188,6 +1188,27 @@ function selfHealRuntimeRecords(basePath, ctx) {
|
|
|
1188
1188
|
return { cleared: 0 };
|
|
1189
1189
|
}
|
|
1190
1190
|
}
|
|
1191
|
+
/**
|
|
1192
|
+
* True when an agent turn is currently streaming or a dispatched message is
|
|
1193
|
+
* still queued waiting to trigger one. Used by the pending-auto-start stale
|
|
1194
|
+
* check: a live discuss turn can run for minutes before writing its first
|
|
1195
|
+
* artifact, and deleting its entry as "stale" re-dispatches the workflow —
|
|
1196
|
+
* resetting the interview and producing a duplicate completion turn.
|
|
1197
|
+
*/
|
|
1198
|
+
function isAgentTurnInFlight(ctx) {
|
|
1199
|
+
try {
|
|
1200
|
+
if (typeof ctx.isIdle === "function" && !ctx.isIdle())
|
|
1201
|
+
return true;
|
|
1202
|
+
if (typeof ctx.hasPendingMessages === "function" && ctx.hasPendingMessages())
|
|
1203
|
+
return true;
|
|
1204
|
+
}
|
|
1205
|
+
catch {
|
|
1206
|
+
// assertActive() throws on a stale runner context; fall through to
|
|
1207
|
+
// artifact/age staleness signals.
|
|
1208
|
+
logWarning("guided", "isAgentTurnInFlight: ctx method threw (stale runner); assuming no turn in flight");
|
|
1209
|
+
}
|
|
1210
|
+
return false;
|
|
1211
|
+
}
|
|
1191
1212
|
// ─── Milestone Actions Submenu ──────────────────────────────────────────────
|
|
1192
1213
|
/**
|
|
1193
1214
|
* Shows a submenu with Park / Discard / Skip / Back options for the active milestone.
|
|
@@ -1479,12 +1500,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1479
1500
|
// and fires another dispatchWorkflow, resetting the conversation mid-interview.
|
|
1480
1501
|
if (hasPendingAutoStart(basePath)) {
|
|
1481
1502
|
// #3274: If /clear interrupted the discussion, the pending entry is stale.
|
|
1482
|
-
// Detect staleness: no manifest, no milestone CONTEXT artifact,
|
|
1483
|
-
// 30s (avoids race between .set() and LLM writing
|
|
1503
|
+
// Detect staleness: no manifest, no milestone CONTEXT/CONTEXT-DRAFT artifact,
|
|
1504
|
+
// the entry is older than 30s (avoids race between .set() and LLM writing the
|
|
1505
|
+
// first artifact), AND no agent turn is in flight. A dispatched discuss turn
|
|
1506
|
+
// can think for well over 30s before its first question round writes any
|
|
1507
|
+
// artifact; deleting the entry while that turn is live re-dispatches the
|
|
1508
|
+
// workflow, which both resets the interview and queues a duplicate turn that
|
|
1509
|
+
// replays the final "context written" message after the real one.
|
|
1484
1510
|
const entry = _getPendingAutoStart(basePath);
|
|
1485
1511
|
const ageMs = Date.now() - (entry.createdAt || 0);
|
|
1486
1512
|
const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
|
|
1487
1513
|
const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
|
|
1514
|
+
const milestoneHasDraft = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT-DRAFT");
|
|
1488
1515
|
const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
|
|
1489
1516
|
const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
|
|
1490
1517
|
const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
|
|
@@ -1493,11 +1520,30 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
|
|
|
1493
1520
|
// Clear stale in-memory guard and continue through normal active-milestone routing.
|
|
1494
1521
|
deletePendingAutoStart(basePath);
|
|
1495
1522
|
}
|
|
1496
|
-
else if (!manifestExists &&
|
|
1523
|
+
else if (!manifestExists &&
|
|
1524
|
+
!milestoneHasContext &&
|
|
1525
|
+
!milestoneHasDraft &&
|
|
1526
|
+
ageMs > 30_000 &&
|
|
1527
|
+
!isAgentTurnInFlight(ctx)) {
|
|
1497
1528
|
// Stale entry from an interrupted discussion — clear and continue
|
|
1498
1529
|
deletePendingAutoStart(basePath);
|
|
1499
1530
|
}
|
|
1500
1531
|
else {
|
|
1532
|
+
if (milestoneHasContext && !isAgentTurnInFlight(ctx)) {
|
|
1533
|
+
// The discussion already produced CONTEXT but the agent_end handoff
|
|
1534
|
+
// never consumed the entry — e.g. an external-engine post-hoc gate
|
|
1535
|
+
// re-arm wiped the depth verification after the save (write-gate
|
|
1536
|
+
// two-process sync). CONTEXT can only be written through a verified
|
|
1537
|
+
// depth gate, so a gate still pending for this milestone is stale:
|
|
1538
|
+
// clear it and re-run the handoff instead of dead-ending.
|
|
1539
|
+
const gateBasePath = entry.scope.workspace.projectRoot;
|
|
1540
|
+
const pendingGateId = getPendingGate(gateBasePath);
|
|
1541
|
+
if (pendingGateId && extractDepthVerificationMilestoneId(pendingGateId) === entry.milestoneId) {
|
|
1542
|
+
clearPendingGate(gateBasePath);
|
|
1543
|
+
}
|
|
1544
|
+
if (checkAutoStartAfterDiscuss(basePath))
|
|
1545
|
+
return;
|
|
1546
|
+
}
|
|
1501
1547
|
ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
|
|
1502
1548
|
return;
|
|
1503
1549
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
|
+
import { isGsdBrowserMcpServerConfig } from "../shared/gsd-browser-cli.js";
|
|
4
5
|
import { toMcpWildcardToolName } from "./mcp-tool-name.js";
|
|
5
6
|
import { resolveModelMcpConfig } from "./preferences-mcp.js";
|
|
6
7
|
function isRecord(value) {
|
|
@@ -63,29 +64,11 @@ function isWorkflowMcpServerConfig(config) {
|
|
|
63
64
|
const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
|
|
64
65
|
return args.some((arg) => arg.includes("gsd-mcp-server") || arg.includes("packages/mcp-server"));
|
|
65
66
|
}
|
|
66
|
-
function isBrowserMcpServerConfig(config) {
|
|
67
|
-
if (!isRecord(config))
|
|
68
|
-
return false;
|
|
69
|
-
const command = typeof config.command === "string" ? config.command : "";
|
|
70
|
-
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
const env = config.env;
|
|
74
|
-
if (isRecord(env)) {
|
|
75
|
-
if (typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
76
|
-
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
77
|
-
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string") {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
|
|
82
|
-
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
83
|
-
}
|
|
84
67
|
export function discoverWorkflowMcpServerName(projectDir) {
|
|
85
68
|
return discoverMcpServers(projectDir).find((server) => isWorkflowMcpServerConfig(server.config))?.name;
|
|
86
69
|
}
|
|
87
70
|
export function discoverBrowserMcpServerName(projectDir) {
|
|
88
|
-
return discoverMcpServers(projectDir).find((server) =>
|
|
71
|
+
return discoverMcpServers(projectDir).find((server) => isGsdBrowserMcpServerConfig(server.config))?.name;
|
|
89
72
|
}
|
|
90
73
|
export function discoverMcpServerNames(projectDir) {
|
|
91
74
|
return discoverMcpServers(projectDir).map((server) => server.name);
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
|
-
// File Purpose:
|
|
2
|
+
// File Purpose: GSD-facing face over the shared @gsd/pi-ai MCP tool-name helpers.
|
|
3
|
+
import { parseMcpToolName as parsePiAiMcpToolName, stripMcpToolPrefix } from "@gsd/pi-ai";
|
|
3
4
|
const MCP_TOOL_PREFIX = "mcp__";
|
|
4
5
|
export function parseMcpToolName(toolName) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const toolSeparator = toolName.indexOf("__", MCP_TOOL_PREFIX.length);
|
|
8
|
-
if (toolSeparator < 0)
|
|
9
|
-
return null;
|
|
10
|
-
return {
|
|
11
|
-
serverName: toolName.slice(MCP_TOOL_PREFIX.length, toolSeparator),
|
|
12
|
-
toolName: toolName.slice(toolSeparator + 2),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export function stripMcpToolPrefix(toolName) {
|
|
16
|
-
return parseMcpToolName(toolName)?.toolName ?? toolName;
|
|
6
|
+
const parsed = parsePiAiMcpToolName(toolName);
|
|
7
|
+
return parsed ? { serverName: parsed.server, toolName: parsed.tool } : null;
|
|
17
8
|
}
|
|
9
|
+
export { stripMcpToolPrefix };
|
|
18
10
|
export function toMcpToolName(serverName, toolName) {
|
|
19
11
|
return `${MCP_TOOL_PREFIX}${serverName}__${toolName}`;
|
|
20
12
|
}
|
|
@@ -211,7 +211,7 @@ export function reportConsolidationGaps(basePath) {
|
|
|
211
211
|
const report = scanConsolidationGaps(basePath);
|
|
212
212
|
if (report.totalGaps === 0)
|
|
213
213
|
return report;
|
|
214
|
-
appendNotification(report.summary, "warning", "workflow-logger");
|
|
214
|
+
appendNotification(report.summary, "warning", "workflow-logger", { kind: "memory-consolidation" });
|
|
215
215
|
logWarning("memory-consolidation", report.summary);
|
|
216
216
|
return report;
|
|
217
217
|
}
|
|
@@ -8,6 +8,7 @@ import { readCrashLock, isLockProcessAlive } from "../crash-recovery.js";
|
|
|
8
8
|
import { closeWorkflowDatabase } from "../db-workspace.js";
|
|
9
9
|
import { readPausedSessionMetadata } from "../interrupted-session.js";
|
|
10
10
|
import { gsdRoot } from "../paths.js";
|
|
11
|
+
import { canonicalWorktreesDir } from "../worktree-placement.js";
|
|
11
12
|
export class MigrationBlockedError extends Error {
|
|
12
13
|
constructor(message) {
|
|
13
14
|
super(message);
|
|
@@ -78,16 +79,26 @@ export function assertMigrationHasSlices(preview) {
|
|
|
78
79
|
throw new MigrationBlockedError("Migration blocked - the legacy project would produce zero slices. Add a ROADMAP.md or phases/ content before migrating.");
|
|
79
80
|
}
|
|
80
81
|
function hasWorktreeState(targetRoot) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
82
|
+
// Legacy container is probed via gsdRoot() (symlink-resolved) on purpose —
|
|
83
|
+
// migration targets may have .gsd in the external-state layout.
|
|
84
|
+
const containers = [
|
|
85
|
+
canonicalWorktreesDir(targetRoot),
|
|
86
|
+
join(gsdRoot(targetRoot), "worktrees"),
|
|
87
|
+
];
|
|
88
|
+
for (const worktreesDir of containers) {
|
|
89
|
+
if (!existsSync(worktreesDir))
|
|
90
|
+
continue;
|
|
91
|
+
try {
|
|
92
|
+
if (readdirSync(worktreesDir, { withFileTypes: true })
|
|
93
|
+
.some((entry) => entry.isDirectory() || entry.isFile())) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
90
100
|
}
|
|
101
|
+
return false;
|
|
91
102
|
}
|
|
92
103
|
export async function assertMigrationTargetAvailable(targetRoot) {
|
|
93
104
|
const targetGsdPath = gsdRoot(targetRoot);
|
|
@@ -8,7 +8,13 @@ function zeroCounts() {
|
|
|
8
8
|
return { milestones: 0, slices: 0, tasks: 0 };
|
|
9
9
|
}
|
|
10
10
|
function emptyScan() {
|
|
11
|
-
return {
|
|
11
|
+
return {
|
|
12
|
+
counts: zeroCounts(),
|
|
13
|
+
milestones: new Set(),
|
|
14
|
+
slices: new Set(),
|
|
15
|
+
tasks: new Set(),
|
|
16
|
+
milestonesWithoutRoadmap: new Set(),
|
|
17
|
+
};
|
|
12
18
|
}
|
|
13
19
|
function sameCounts(a, b) {
|
|
14
20
|
return a.milestones === b.milestones && a.slices === b.slices && a.tasks === b.tasks;
|
|
@@ -65,8 +71,10 @@ export function scanMarkdownHierarchy(basePath) {
|
|
|
65
71
|
scan.counts.milestones++;
|
|
66
72
|
scan.milestones.add(milestoneId);
|
|
67
73
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
68
|
-
if (!roadmapPath || !existsSync(roadmapPath))
|
|
74
|
+
if (!roadmapPath || !existsSync(roadmapPath)) {
|
|
75
|
+
scan.milestonesWithoutRoadmap.add(milestoneId);
|
|
69
76
|
continue;
|
|
77
|
+
}
|
|
70
78
|
const roadmap = parseRoadmap(readFileSync(roadmapPath, "utf-8"));
|
|
71
79
|
scan.counts.slices += roadmap.slices.length;
|
|
72
80
|
for (const slice of roadmap.slices) {
|
|
@@ -112,7 +120,6 @@ export function countDbHierarchy() {
|
|
|
112
120
|
}
|
|
113
121
|
export async function checkMarkdownHierarchyAgainstDb(basePath) {
|
|
114
122
|
const markdownScan = scanMarkdownHierarchy(basePath);
|
|
115
|
-
const markdown = markdownScan.counts;
|
|
116
123
|
// Always open the DB before deciding. An empty markdown tree does NOT imply
|
|
117
124
|
// an empty project — the DB may hold authoritative rows whose markdown was
|
|
118
125
|
// lost, which is itself recoverable drift. The previous early return here
|
|
@@ -128,6 +135,20 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
|
|
|
128
135
|
refreshWorkflowDatabaseFromDisk();
|
|
129
136
|
const dbScan = scanDbHierarchy();
|
|
130
137
|
const beforeDb = dbScan.counts;
|
|
138
|
+
// Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
|
|
139
|
+
// a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
|
|
140
|
+
// queued DB row is inserted only at discussion handoff). Treating it as
|
|
141
|
+
// drift would warn on every live discussion and recommend
|
|
142
|
+
// `/gsd recover --confirm`, an import that materializes abandoned-discussion
|
|
143
|
+
// dirs as ghost active milestones. Exclude such dirs from this comparison
|
|
144
|
+
// only; recover preflights use the raw scans and still see them.
|
|
145
|
+
for (const id of markdownScan.milestonesWithoutRoadmap) {
|
|
146
|
+
if (dbScan.milestones.has(id))
|
|
147
|
+
continue;
|
|
148
|
+
markdownScan.milestones.delete(id);
|
|
149
|
+
markdownScan.counts.milestones--;
|
|
150
|
+
}
|
|
151
|
+
const markdown = markdownScan.counts;
|
|
131
152
|
const markdownEmpty = sameCounts(markdown, zeroCounts());
|
|
132
153
|
const dbEmpty = sameCounts(beforeDb, zeroCounts());
|
|
133
154
|
// Genuinely empty project: nothing on disk, nothing in the DB.
|
|
@@ -13,6 +13,7 @@ export const BUNDLED_COST_TABLE = [
|
|
|
13
13
|
{ id: "claude-opus-4-6", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-04-16" },
|
|
14
14
|
{ id: "claude-opus-4-7", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-04-16" },
|
|
15
15
|
{ id: "claude-opus-4-8", inputPer1k: 0.005, outputPer1k: 0.025, updatedAt: "2026-05-28" },
|
|
16
|
+
{ id: "claude-fable-5", inputPer1k: 0.010, outputPer1k: 0.050, updatedAt: "2026-06-09" },
|
|
16
17
|
{ id: "claude-sonnet-4-6", inputPer1k: 0.003, outputPer1k: 0.015, updatedAt: "2025-03-15" },
|
|
17
18
|
{ id: "claude-haiku-4-5", inputPer1k: 0.0008, outputPer1k: 0.004, updatedAt: "2025-03-15" },
|
|
18
19
|
{ id: "claude-sonnet-4-5-20250514", inputPer1k: 0.003, outputPer1k: 0.015, updatedAt: "2025-03-15" },
|
|
@@ -35,6 +35,7 @@ export const MODEL_CAPABILITY_TIER = {
|
|
|
35
35
|
"claude-opus-4-6": "heavy",
|
|
36
36
|
"claude-opus-4-7": "heavy",
|
|
37
37
|
"claude-opus-4-8": "heavy",
|
|
38
|
+
"claude-fable-5": "heavy",
|
|
38
39
|
"claude-3-opus-latest": "heavy",
|
|
39
40
|
"gpt-4-turbo": "heavy",
|
|
40
41
|
"gpt-5": "heavy",
|
|
@@ -61,6 +62,7 @@ const MODEL_COST_PER_1K_INPUT = {
|
|
|
61
62
|
"claude-opus-4-6": 0.005,
|
|
62
63
|
"claude-opus-4-7": 0.005,
|
|
63
64
|
"claude-opus-4-8": 0.005,
|
|
65
|
+
"claude-fable-5": 0.010,
|
|
64
66
|
"gpt-4o-mini": 0.00015,
|
|
65
67
|
"gpt-4o": 0.0025,
|
|
66
68
|
"gpt-4.1": 0.002,
|
|
@@ -94,6 +96,7 @@ export const MODEL_CAPABILITY_PROFILES = {
|
|
|
94
96
|
"claude-opus-4-6": { coding: 95, debugging: 90, research: 85, reasoning: 95, speed: 30, longContext: 80, instruction: 90 },
|
|
95
97
|
"claude-opus-4-7": { coding: 95, debugging: 90, research: 85, reasoning: 95, speed: 30, longContext: 80, instruction: 90 },
|
|
96
98
|
"claude-opus-4-8": { coding: 97, debugging: 92, research: 87, reasoning: 97, speed: 30, longContext: 85, instruction: 92 },
|
|
99
|
+
"claude-fable-5": { coding: 97, debugging: 92, research: 87, reasoning: 97, speed: 30, longContext: 85, instruction: 92 },
|
|
97
100
|
"claude-sonnet-4-6": { coding: 85, debugging: 80, research: 75, reasoning: 80, speed: 60, longContext: 75, instruction: 85 },
|
|
98
101
|
"claude-sonnet-4-5-20250514": { coding: 85, debugging: 80, research: 75, reasoning: 80, speed: 60, longContext: 75, instruction: 85 },
|
|
99
102
|
"claude-3-5-sonnet-latest": { coding: 82, debugging: 78, research: 72, reasoning: 78, speed: 62, longContext: 70, instruction: 82 },
|
|
@@ -34,13 +34,16 @@ export function initNotificationStore(basePath) {
|
|
|
34
34
|
* Append a notification entry to the store. Synchronous — safe to call
|
|
35
35
|
* from the notify() shim which is declared void (not async).
|
|
36
36
|
*/
|
|
37
|
-
export function appendNotification(message, severity, source = "notify") {
|
|
37
|
+
export function appendNotification(message, severity, source = "notify", meta) {
|
|
38
38
|
if (!_basePath)
|
|
39
39
|
return;
|
|
40
40
|
if (_suppressCount > 0)
|
|
41
41
|
return;
|
|
42
42
|
const persistedMessage = message.length > 500 ? message.slice(0, 500) + "…" : message;
|
|
43
|
-
|
|
43
|
+
// Structured identity (kind + scope) keys dedup when present, so a rephrased
|
|
44
|
+
// message of the same event still dedups; otherwise fall back to the prose.
|
|
45
|
+
const identity = meta?.kind ? `${meta.kind}:${meta.scope ?? ""}` : persistedMessage;
|
|
46
|
+
const dedupKey = `${_basePath}:${severity}:${source}:${identity}`;
|
|
44
47
|
const now = Date.now();
|
|
45
48
|
const lastSeen = _recentMessageTimestamps.get(dedupKey);
|
|
46
49
|
if (lastSeen !== undefined && now - lastSeen < DEDUP_WINDOW_MS)
|
|
@@ -59,6 +62,8 @@ export function appendNotification(message, severity, source = "notify") {
|
|
|
59
62
|
message: persistedMessage,
|
|
60
63
|
source,
|
|
61
64
|
read: false,
|
|
65
|
+
...(meta?.kind ? { kind: meta.kind } : {}),
|
|
66
|
+
...(meta?.scope ? { scope: meta.scope } : {}),
|
|
62
67
|
};
|
|
63
68
|
try {
|
|
64
69
|
const dir = join(_basePath, ".gsd");
|
|
@@ -77,12 +82,14 @@ export function appendNotification(message, severity, source = "notify") {
|
|
|
77
82
|
}
|
|
78
83
|
/**
|
|
79
84
|
* Read all notification entries from disk. Returns newest-first.
|
|
85
|
+
* An optional filter narrows by structured identity (kind and/or scope).
|
|
80
86
|
*/
|
|
81
|
-
export function readNotifications(basePath) {
|
|
87
|
+
export function readNotifications(basePath, filter) {
|
|
82
88
|
const bp = basePath ?? _basePath;
|
|
83
89
|
if (!bp)
|
|
84
90
|
return [];
|
|
85
|
-
|
|
91
|
+
const entries = _readEntriesFromDisk(bp).filter((e) => (!filter?.kind || e.kind === filter.kind) && (!filter?.scope || e.scope === filter.scope));
|
|
92
|
+
return entries.reverse();
|
|
86
93
|
}
|
|
87
94
|
/**
|
|
88
95
|
* Mark all notifications as read. Atomic rewrite via temp-file + rename.
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* with safety checks for parallel execution context.
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
8
|
import { spawnSync } from "node:child_process";
|
|
10
9
|
import { resolveGsdPathContract } from "./paths.js";
|
|
10
|
+
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
11
11
|
import { getAutoWorktreePath } from "./auto-worktree.js";
|
|
12
12
|
import { buildWorktreeLifecycleDeps } from "./auto.js";
|
|
13
13
|
import { mergeMilestoneStandalone, } from "./worktree-lifecycle.js";
|
|
@@ -22,7 +22,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
22
22
|
* Returns true when milestones.status = 'complete' in project gsd.db.
|
|
23
23
|
*/
|
|
24
24
|
export function isMilestoneCompleteInProjectDb(basePath, mid) {
|
|
25
|
-
const workRoot =
|
|
25
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
26
26
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
27
27
|
if (!existsSync(dbPath))
|
|
28
28
|
return false;
|
|
@@ -41,16 +41,19 @@ export function isMilestoneCompleteInProjectDb(basePath, mid) {
|
|
|
41
41
|
*/
|
|
42
42
|
function discoverDbCompletedMilestones(basePath) {
|
|
43
43
|
const completed = new Set();
|
|
44
|
-
const worktreeDir
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
for (const worktreeDir of worktreesDirs(basePath)) {
|
|
45
|
+
if (!existsSync(worktreeDir))
|
|
46
|
+
continue;
|
|
47
|
+
try {
|
|
48
|
+
for (const entry of readdirSync(worktreeDir)) {
|
|
49
|
+
if (entry.startsWith("M") && isMilestoneCompleteInProjectDb(basePath, entry)) {
|
|
50
|
+
completed.add(entry);
|
|
51
|
+
}
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
catch (e) {
|
|
55
|
+
logWarning("parallel", `readdirSync for completed set failed: ${e.message}`);
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
return completed;
|
|
56
59
|
}
|
|
@@ -88,7 +91,7 @@ export function determineMergeOrder(workers, order = "sequential", basePath) {
|
|
|
88
91
|
title: mid,
|
|
89
92
|
pid: 0,
|
|
90
93
|
process: null,
|
|
91
|
-
worktreePath: basePath ?
|
|
94
|
+
worktreePath: basePath ? worktreePathFor(basePath, mid) : "",
|
|
92
95
|
startedAt: 0,
|
|
93
96
|
state: "stopped",
|
|
94
97
|
cost: 0,
|
|
@@ -7,6 +7,7 @@ import { matchesKey, Key } from "@gsd/pi-tui";
|
|
|
7
7
|
import { formatDuration } from "../shared/mod.js";
|
|
8
8
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
9
9
|
import { resolveGsdPathContract } from "./paths.js";
|
|
10
|
+
import { worktreePathFor, worktreesDirs } from "./worktree-placement.js";
|
|
10
11
|
import { renderBar, renderDialogFrame, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
|
|
11
12
|
// ─── Data Helpers ─────────────────────────────────────────────────────────
|
|
12
13
|
function readJsonSafe(filePath) {
|
|
@@ -42,7 +43,6 @@ function tailRead(filePath, maxBytes) {
|
|
|
42
43
|
}
|
|
43
44
|
function discoverWorkers(basePath) {
|
|
44
45
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
45
|
-
const worktreeDir = join(basePath, ".gsd", "worktrees");
|
|
46
46
|
const mids = new Set();
|
|
47
47
|
if (existsSync(parallelDir)) {
|
|
48
48
|
try {
|
|
@@ -56,7 +56,9 @@ function discoverWorkers(basePath) {
|
|
|
56
56
|
}
|
|
57
57
|
catch { /* skip */ }
|
|
58
58
|
}
|
|
59
|
-
|
|
59
|
+
for (const worktreeDir of worktreesDirs(basePath)) {
|
|
60
|
+
if (!existsSync(worktreeDir))
|
|
61
|
+
continue;
|
|
60
62
|
try {
|
|
61
63
|
for (const d of readdirSync(worktreeDir)) {
|
|
62
64
|
if (d.startsWith("M") && existsSync(join(worktreeDir, d, ".gsd", "auto.lock"))) {
|
|
@@ -68,8 +70,7 @@ function discoverWorkers(basePath) {
|
|
|
68
70
|
}
|
|
69
71
|
return [...mids].sort();
|
|
70
72
|
}
|
|
71
|
-
function querySliceProgress(basePath, mid) {
|
|
72
|
-
const workRoot = join(basePath, ".gsd", "worktrees", mid);
|
|
73
|
+
function querySliceProgress(basePath, mid, workRoot = worktreePathFor(basePath, mid)) {
|
|
73
74
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
74
75
|
if (!existsSync(dbPath))
|
|
75
76
|
return [];
|
|
@@ -115,7 +116,7 @@ function extractCostFromNdjson(basePath, mid) {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
function queryRecentCompletions(basePath, mid) {
|
|
118
|
-
const workRoot =
|
|
119
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
119
120
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
120
121
|
if (!existsSync(dbPath))
|
|
121
122
|
return [];
|
|
@@ -139,9 +140,12 @@ function collectWorkerData(basePath) {
|
|
|
139
140
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
140
141
|
const workers = [];
|
|
141
142
|
for (const mid of mids) {
|
|
143
|
+
// Resolve the worktree path once per worker per tick — this runs on a
|
|
144
|
+
// 5-second refresh interval and worktreePathFor probes the filesystem.
|
|
145
|
+
const workRoot = worktreePathFor(basePath, mid);
|
|
142
146
|
const status = readJsonSafe(join(parallelDir, `${mid}.status.json`));
|
|
143
|
-
const lock = readJsonSafe(join(
|
|
144
|
-
const slices = querySliceProgress(basePath, mid);
|
|
147
|
+
const lock = readJsonSafe(join(workRoot, ".gsd", "auto.lock"));
|
|
148
|
+
const slices = querySliceProgress(basePath, mid, workRoot);
|
|
145
149
|
const pid = lock?.pid || status?.pid || 0;
|
|
146
150
|
const alive = pid ? isPidAlive(pid) : false;
|
|
147
151
|
// Heartbeat: prefer status.json if PID matches, else use file mtime
|