@opengsd/gsd-pi 1.0.2-dev.e9a1b49 → 1.0.2-dev.fb7ddf1
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 +63 -12
- package/dist/headless-answers.js +2 -1
- package/dist/headless-events.d.ts +1 -0
- package/dist/headless-events.js +8 -1
- package/dist/onboarding.js +22 -3
- package/dist/resource-loader.d.ts +7 -0
- package/dist/resource-loader.js +44 -9
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
- package/dist/resources/extensions/context7/index.js +12 -2
- package/dist/resources/extensions/get-secrets-from-user.js +16 -16
- package/dist/resources/extensions/google-cli/index.js +30 -0
- package/dist/resources/extensions/google-cli/models.js +55 -0
- package/dist/resources/extensions/google-cli/package.json +11 -0
- package/dist/resources/extensions/google-cli/readiness.js +12 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
- package/dist/resources/extensions/gsd/auto/loop.js +81 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +38 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +36 -55
- package/dist/resources/extensions/gsd/auto.js +40 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
- package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
- package/dist/resources/extensions/gsd/commands-usage.js +105 -1
- package/dist/resources/extensions/gsd/config-overlay.js +20 -14
- package/dist/resources/extensions/gsd/context-overlay.js +22 -16
- package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
- package/dist/resources/extensions/gsd/doctor.js +7 -2
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +5 -6
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
- package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
- package/dist/resources/extensions/gsd/preferences.js +14 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +3 -20
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/repo-identity.js +36 -6
- package/dist/resources/extensions/gsd/repository-registry.js +3 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
- package/dist/resources/extensions/gsd/skill-activation.js +233 -0
- package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
- package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
- package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
- package/dist/resources/extensions/gsd/skill-scope.js +52 -0
- package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/dist/resources/extensions/gsd/skills.js +60 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
- package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
- package/dist/resources/extensions/gsd/vision-ask.js +22 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
- package/dist/resources/extensions/gsd/worktree-post-create-hook.js +117 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
- package/dist/resources/extensions/search-the-web/native-search.js +57 -8
- package/dist/resources/extensions/shared/confirm-ui.js +9 -6
- package/dist/resources/extensions/shared/dialog-frame.js +42 -0
- package/dist/resources/extensions/shared/interview-ui.js +42 -30
- package/dist/resources/extensions/shared/next-action-ui.js +6 -6
- package/dist/resources/extensions/subagent/index.js +8 -15
- package/dist/resources/shared/package-manager-detection.js +36 -0
- package/dist/resources/skills/agent-browser/SKILL.md +1 -1
- package/dist/resources/skills/api-design/SKILL.md +1 -1
- package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/dist/resources/skills/forensics/SKILL.md +2 -2
- package/dist/resources/skills/grill-me/SKILL.md +1 -1
- package/dist/resources/skills/handoff/SKILL.md +1 -1
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/dist/resources/skills/observability/SKILL.md +1 -1
- package/dist/resources/skills/security-review/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/dist/resources/skills/tdd/SKILL.md +1 -1
- package/dist/resources/skills/write-docs/SKILL.md +1 -1
- package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +7 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-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/node_modules/node-pty/build/Makefile +1 -1
- package/dist/worktree-cli.d.ts +0 -2
- package/dist/worktree-cli.js +21 -9
- package/package.json +5 -2
- package/packages/cloud-mcp-gateway/bin/gsd-cloud-mcp-gateway.js +14 -0
- package/packages/cloud-mcp-gateway/package.json +4 -3
- package/packages/contracts/dist/rpc.test.js +5 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +15 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/dist/workflow.test.js +1 -0
- package/packages/contracts/dist/workflow.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- 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 +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
- 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 +144 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/bin/gsd-mcp-server.js +14 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +7 -1
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +47 -8
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +16 -14
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.js +6 -0
- package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/bin/pi-ai.js +14 -0
- package/packages/pi-ai/dist/models.generated.d.ts +48 -206
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +73 -226
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +50 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
- package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
- package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/README.md +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/install/detect-existing.js +17 -3
- package/scripts/install/npm-global.js +103 -33
- package/scripts/install.js +1 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
- package/src/resources/extensions/context7/index.ts +15 -2
- package/src/resources/extensions/get-secrets-from-user.ts +17 -16
- package/src/resources/extensions/google-cli/index.ts +34 -0
- package/src/resources/extensions/google-cli/models.ts +57 -0
- package/src/resources/extensions/google-cli/package.json +11 -0
- package/src/resources/extensions/google-cli/readiness.ts +15 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
- package/src/resources/extensions/gsd/auto/loop.ts +96 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +47 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +47 -57
- package/src/resources/extensions/gsd/auto.ts +50 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
- package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-usage.ts +110 -5
- package/src/resources/extensions/gsd/config-overlay.ts +19 -16
- package/src/resources/extensions/gsd/context-overlay.ts +24 -19
- package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -2
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +5 -6
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
- package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
- package/src/resources/extensions/gsd/preferences.ts +17 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +3 -20
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/repo-identity.ts +35 -7
- package/src/resources/extensions/gsd/repository-registry.ts +3 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
- package/src/resources/extensions/gsd/skill-activation.ts +292 -0
- package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
- package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
- package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
- package/src/resources/extensions/gsd/skill-scope.ts +63 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/src/resources/extensions/gsd/skills.ts +75 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
- package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
- package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +141 -1
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
- package/src/resources/extensions/gsd/vision-ask.ts +28 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
- package/src/resources/extensions/gsd/worktree-post-create-hook.ts +127 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
- package/src/resources/extensions/search-the-web/native-search.ts +60 -8
- package/src/resources/extensions/shared/confirm-ui.ts +8 -12
- package/src/resources/extensions/shared/dialog-frame.ts +71 -0
- package/src/resources/extensions/shared/interview-ui.ts +43 -42
- package/src/resources/extensions/shared/next-action-ui.ts +6 -6
- package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
- package/src/resources/extensions/subagent/index.ts +8 -15
- package/src/resources/shared/package-manager-detection.ts +39 -0
- package/src/resources/skills/agent-browser/SKILL.md +1 -1
- package/src/resources/skills/api-design/SKILL.md +1 -1
- package/src/resources/skills/code-optimizer/SKILL.md +6 -11
- package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/src/resources/skills/forensics/SKILL.md +2 -2
- package/src/resources/skills/grill-me/SKILL.md +1 -1
- package/src/resources/skills/handoff/SKILL.md +1 -1
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/src/resources/skills/observability/SKILL.md +1 -1
- package/src/resources/skills/security-review/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/src/resources/skills/tdd/SKILL.md +1 -1
- package/src/resources/skills/write-docs/SKILL.md +1 -1
- package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +0 -1
- /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
//
|
|
14
14
|
// Phased rollout tracking:
|
|
15
15
|
// - Phase 1 (this PR): schema + manifests + coverage test.
|
|
16
|
+
// - Phase 1b (skill token savings): skills policy wired via skill-scope.ts
|
|
17
|
+
// and setVisibleSkills(); allowlists derived from skill-manifest.ts.
|
|
16
18
|
// - Phase 2: add composeSystemPromptForUnit(); migrate one low-risk
|
|
17
19
|
// unit type (e.g. reassess-roadmap) as the pilot.
|
|
18
20
|
// - Phase 3: migrate remaining unit types, tighten manifests per
|
|
@@ -277,11 +279,20 @@ export interface UnitContextManifest {
|
|
|
277
279
|
|
|
278
280
|
// ─── Manifests ────────────────────────────────────────────────────────────
|
|
279
281
|
|
|
280
|
-
// Phase 1 policy:
|
|
281
|
-
//
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
282
|
+
// Phase 1 policy: skills policy is derived from skill-manifest.ts allowlists
|
|
283
|
+
// via `skillPolicyForUnit()`; units without an allowlist keep mode "all".
|
|
284
|
+
// Explicit mode "none" remains for lightweight config units.
|
|
285
|
+
|
|
286
|
+
import { resolveSkillManifest } from "./skill-manifest.js";
|
|
287
|
+
|
|
288
|
+
/** Derive skills policy from skill-manifest allowlists; default to full catalog. */
|
|
289
|
+
function skillPolicyForUnit(unitType: string): SkillsPolicy {
|
|
290
|
+
const allowlist = resolveSkillManifest(unitType);
|
|
291
|
+
if (allowlist) {
|
|
292
|
+
return { mode: "allowlist", skills: allowlist };
|
|
293
|
+
}
|
|
294
|
+
return { mode: "all" };
|
|
295
|
+
}
|
|
285
296
|
|
|
286
297
|
const COMMON_BUDGET_LARGE = 1_500_000; // ~400K tokens
|
|
287
298
|
const COMMON_BUDGET_MEDIUM = 750_000; // ~200K tokens
|
|
@@ -360,7 +371,7 @@ export type UnitType = typeof KNOWN_UNIT_TYPES[number];
|
|
|
360
371
|
export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
361
372
|
// ─── Milestone-scoped ────────────────────────────────────────────────
|
|
362
373
|
"research-milestone": {
|
|
363
|
-
skills:
|
|
374
|
+
skills: skillPolicyForUnit("research-milestone"),
|
|
364
375
|
knowledge: "full",
|
|
365
376
|
memory: "prompt-relevant",
|
|
366
377
|
codebaseMap: true,
|
|
@@ -377,7 +388,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
377
388
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
378
389
|
},
|
|
379
390
|
"plan-milestone": {
|
|
380
|
-
skills:
|
|
391
|
+
skills: skillPolicyForUnit("plan-milestone"),
|
|
381
392
|
knowledge: "full",
|
|
382
393
|
memory: "prompt-relevant",
|
|
383
394
|
codebaseMap: true,
|
|
@@ -392,7 +403,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
392
403
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
393
404
|
},
|
|
394
405
|
"discuss-milestone": {
|
|
395
|
-
skills:
|
|
406
|
+
skills: skillPolicyForUnit("discuss-milestone"),
|
|
396
407
|
knowledge: "full",
|
|
397
408
|
memory: "prompt-relevant",
|
|
398
409
|
codebaseMap: true,
|
|
@@ -407,7 +418,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
407
418
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
408
419
|
},
|
|
409
420
|
"validate-milestone": {
|
|
410
|
-
skills:
|
|
421
|
+
skills: skillPolicyForUnit("validate-milestone"),
|
|
411
422
|
knowledge: "scoped",
|
|
412
423
|
memory: "prompt-relevant",
|
|
413
424
|
codebaseMap: false,
|
|
@@ -424,7 +435,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
424
435
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
425
436
|
},
|
|
426
437
|
"complete-milestone": {
|
|
427
|
-
skills:
|
|
438
|
+
skills: skillPolicyForUnit("complete-milestone"),
|
|
428
439
|
knowledge: "scoped",
|
|
429
440
|
memory: "prompt-relevant",
|
|
430
441
|
codebaseMap: false,
|
|
@@ -446,7 +457,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
446
457
|
|
|
447
458
|
// ─── Slice-scoped ────────────────────────────────────────────────────
|
|
448
459
|
"research-slice": {
|
|
449
|
-
skills:
|
|
460
|
+
skills: skillPolicyForUnit("research-slice"),
|
|
450
461
|
knowledge: "full",
|
|
451
462
|
memory: "prompt-relevant",
|
|
452
463
|
codebaseMap: true,
|
|
@@ -463,7 +474,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
463
474
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
464
475
|
},
|
|
465
476
|
"plan-slice": {
|
|
466
|
-
skills:
|
|
477
|
+
skills: skillPolicyForUnit("plan-slice"),
|
|
467
478
|
knowledge: "full",
|
|
468
479
|
memory: "prompt-relevant",
|
|
469
480
|
codebaseMap: true,
|
|
@@ -481,7 +492,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
481
492
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
482
493
|
},
|
|
483
494
|
"refine-slice": {
|
|
484
|
-
skills:
|
|
495
|
+
skills: skillPolicyForUnit("refine-slice"),
|
|
485
496
|
knowledge: "scoped",
|
|
486
497
|
memory: "prompt-relevant",
|
|
487
498
|
codebaseMap: true,
|
|
@@ -499,7 +510,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
499
510
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
500
511
|
},
|
|
501
512
|
"replan-slice": {
|
|
502
|
-
skills:
|
|
513
|
+
skills: skillPolicyForUnit("replan-slice"),
|
|
503
514
|
knowledge: "scoped",
|
|
504
515
|
memory: "prompt-relevant",
|
|
505
516
|
codebaseMap: true,
|
|
@@ -514,7 +525,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
514
525
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
515
526
|
},
|
|
516
527
|
"complete-slice": {
|
|
517
|
-
skills:
|
|
528
|
+
skills: skillPolicyForUnit("complete-slice"),
|
|
518
529
|
knowledge: "scoped",
|
|
519
530
|
memory: "prompt-relevant",
|
|
520
531
|
codebaseMap: false,
|
|
@@ -535,7 +546,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
535
546
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
536
547
|
},
|
|
537
548
|
"reassess-roadmap": {
|
|
538
|
-
skills:
|
|
549
|
+
skills: skillPolicyForUnit("reassess-roadmap"),
|
|
539
550
|
knowledge: "scoped",
|
|
540
551
|
memory: "critical-only",
|
|
541
552
|
codebaseMap: false,
|
|
@@ -552,7 +563,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
552
563
|
|
|
553
564
|
// ─── Task-scoped ─────────────────────────────────────────────────────
|
|
554
565
|
"execute-task": {
|
|
555
|
-
skills:
|
|
566
|
+
skills: skillPolicyForUnit("execute-task"),
|
|
556
567
|
knowledge: "scoped",
|
|
557
568
|
memory: "prompt-relevant",
|
|
558
569
|
codebaseMap: true,
|
|
@@ -567,7 +578,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
567
578
|
maxSystemPromptChars: COMMON_BUDGET_LARGE,
|
|
568
579
|
},
|
|
569
580
|
"reactive-execute": {
|
|
570
|
-
skills:
|
|
581
|
+
skills: skillPolicyForUnit("reactive-execute"),
|
|
571
582
|
knowledge: "scoped",
|
|
572
583
|
memory: "prompt-relevant",
|
|
573
584
|
codebaseMap: true,
|
|
@@ -584,7 +595,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
584
595
|
|
|
585
596
|
// ─── Ancillary units ─────────────────────────────────────────────────
|
|
586
597
|
"run-uat": {
|
|
587
|
-
skills:
|
|
598
|
+
skills: skillPolicyForUnit("run-uat"),
|
|
588
599
|
knowledge: "critical-only",
|
|
589
600
|
memory: "critical-only",
|
|
590
601
|
codebaseMap: false,
|
|
@@ -599,7 +610,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
599
610
|
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
600
611
|
},
|
|
601
612
|
"gate-evaluate": {
|
|
602
|
-
skills:
|
|
613
|
+
skills: skillPolicyForUnit("gate-evaluate"),
|
|
603
614
|
knowledge: "critical-only",
|
|
604
615
|
memory: "critical-only",
|
|
605
616
|
codebaseMap: false,
|
|
@@ -616,7 +627,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
616
627
|
maxSystemPromptChars: COMMON_BUDGET_SMALL,
|
|
617
628
|
},
|
|
618
629
|
"rewrite-docs": {
|
|
619
|
-
skills:
|
|
630
|
+
skills: skillPolicyForUnit("rewrite-docs"),
|
|
620
631
|
knowledge: "scoped",
|
|
621
632
|
memory: "prompt-relevant",
|
|
622
633
|
codebaseMap: true,
|
|
@@ -631,7 +642,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
631
642
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
632
643
|
},
|
|
633
644
|
"triage-captures": {
|
|
634
|
-
skills:
|
|
645
|
+
skills: skillPolicyForUnit("triage-captures"),
|
|
635
646
|
knowledge: "scoped",
|
|
636
647
|
memory: "prompt-relevant",
|
|
637
648
|
codebaseMap: false,
|
|
@@ -646,7 +657,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
646
657
|
maxSystemPromptChars: COMMON_BUDGET_MEDIUM,
|
|
647
658
|
},
|
|
648
659
|
"quick-task": {
|
|
649
|
-
skills:
|
|
660
|
+
skills: skillPolicyForUnit("quick-task"),
|
|
650
661
|
knowledge: "full",
|
|
651
662
|
memory: "prompt-relevant",
|
|
652
663
|
codebaseMap: true,
|
|
@@ -684,7 +695,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
684
695
|
// discussion runs before any milestone exists, so milestone artifacts are
|
|
685
696
|
// not loaded. Keeps templates available for PROJECT.md scaffolding.
|
|
686
697
|
"discuss-project": {
|
|
687
|
-
skills:
|
|
698
|
+
skills: skillPolicyForUnit("discuss-project"),
|
|
688
699
|
knowledge: "scoped",
|
|
689
700
|
memory: "prompt-relevant",
|
|
690
701
|
codebaseMap: true,
|
|
@@ -701,7 +712,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
701
712
|
// discuss-requirements: REQUIREMENTS.md interview. PROJECT.md is the
|
|
702
713
|
// primary context input; templates carry the requirements format.
|
|
703
714
|
"discuss-requirements": {
|
|
704
|
-
skills:
|
|
715
|
+
skills: skillPolicyForUnit("discuss-requirements"),
|
|
705
716
|
knowledge: "scoped",
|
|
706
717
|
memory: "prompt-relevant",
|
|
707
718
|
codebaseMap: true,
|
|
@@ -737,7 +748,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
737
748
|
// planning-dispatch policy to dispatch them. PROJECT.md + REQUIREMENTS.md
|
|
738
749
|
// give the orchestrator the framing context.
|
|
739
750
|
"research-project": {
|
|
740
|
-
skills:
|
|
751
|
+
skills: skillPolicyForUnit("research-project"),
|
|
741
752
|
knowledge: "scoped",
|
|
742
753
|
memory: "prompt-relevant",
|
|
743
754
|
codebaseMap: true,
|
|
@@ -39,7 +39,7 @@ function extractTextFromMessage(msg: unknown): string {
|
|
|
39
39
|
return parts.join("\n");
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
function lastAssistantText(messages: unknown[] | undefined): string {
|
|
42
|
+
export function lastAssistantText(messages: unknown[] | null | undefined): string {
|
|
43
43
|
if (!Array.isArray(messages)) return "";
|
|
44
44
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
45
45
|
const msg = messages[i];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural-language openers for milestone discussion.
|
|
3
|
+
*
|
|
4
|
+
* Keep these short and conversational. They are often the user's first prompt
|
|
5
|
+
* when GSD starts shaping a project or milestone, so they should feel like a
|
|
6
|
+
* collaborator starting a working session rather than a form field.
|
|
7
|
+
*/
|
|
8
|
+
import { randomInt } from "node:crypto";
|
|
9
|
+
|
|
10
|
+
export const VISION_ASK_VARIANTS = [
|
|
11
|
+
"What are we building?",
|
|
12
|
+
"What do you want to make next?",
|
|
13
|
+
"What should this become?",
|
|
14
|
+
"What are you picturing?",
|
|
15
|
+
"Where should we take this?",
|
|
16
|
+
"What should this milestone unlock?",
|
|
17
|
+
"Tell me what you want to build.",
|
|
18
|
+
"What should GSD help you shape?",
|
|
19
|
+
] as const;
|
|
20
|
+
|
|
21
|
+
export type VisionAskVariant = typeof VISION_ASK_VARIANTS[number];
|
|
22
|
+
|
|
23
|
+
export function chooseVisionAskVariant(
|
|
24
|
+
pickIndex: (exclusiveMax: number) => number = randomInt,
|
|
25
|
+
): VisionAskVariant {
|
|
26
|
+
const index = pickIndex(VISION_ASK_VARIANTS.length);
|
|
27
|
+
return VISION_ASK_VARIANTS[index] ?? VISION_ASK_VARIANTS[0];
|
|
28
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Theme } from "@gsd/pi-coding-agent";
|
|
2
|
-
import {
|
|
2
|
+
import { visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
3
3
|
import { loadVisualizerData, type VisualizerData } from "./visualizer-data.js";
|
|
4
4
|
import {
|
|
5
5
|
renderProgressView,
|
|
@@ -19,6 +19,7 @@ import { join } from "node:path";
|
|
|
19
19
|
import { writeExportFile } from "./export.js";
|
|
20
20
|
import { gsdRoot } from "./paths.js";
|
|
21
21
|
import { stripAnsi } from "../shared/mod.js";
|
|
22
|
+
import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
|
|
22
23
|
|
|
23
24
|
export const TAB_COUNT = 10;
|
|
24
25
|
const TAB_LABELS = [
|
|
@@ -500,8 +501,7 @@ export class GSDVisualizerOverlay {
|
|
|
500
501
|
|
|
501
502
|
// Apply scroll
|
|
502
503
|
const viewportHeight = Math.max(5, process.stdout.rows ? process.stdout.rows - 8 : 24);
|
|
503
|
-
const
|
|
504
|
-
const visibleContentRows = Math.max(1, viewportHeight - chromeHeight);
|
|
504
|
+
const visibleContentRows = Math.max(1, viewportHeight - 4);
|
|
505
505
|
this.lastVisibleRows = visibleContentRows;
|
|
506
506
|
const totalLines = content.length;
|
|
507
507
|
const maxScroll = Math.max(0, content.length - visibleContentRows);
|
|
@@ -509,49 +509,21 @@ export class GSDVisualizerOverlay {
|
|
|
509
509
|
const offset = this.scrollOffsets[this.activeTab];
|
|
510
510
|
const visibleContent = content.slice(offset, offset + visibleContentRows);
|
|
511
511
|
|
|
512
|
-
const
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
const
|
|
518
|
-
|
|
512
|
+
const footer = renderKeyHints(
|
|
513
|
+
th,
|
|
514
|
+
["Tab/Shift+Tab/1-9,0 switch", "/ filter", "PgUp/PgDn scroll", "? help", "esc close"],
|
|
515
|
+
Math.max(1, width - 4),
|
|
516
|
+
);
|
|
517
|
+
const lines = renderDialogFrame(th, "GSD Visualizer", visibleContent, width, {
|
|
518
|
+
footer,
|
|
519
|
+
scroll: { offset, visibleRows: visibleContentRows, totalRows: totalLines },
|
|
520
|
+
});
|
|
519
521
|
|
|
520
522
|
this.cachedWidth = width;
|
|
521
523
|
this.cachedLines = lines;
|
|
522
524
|
return lines;
|
|
523
525
|
}
|
|
524
526
|
|
|
525
|
-
private wrapInBox(inner: string[], width: number, offset?: number, visibleRows?: number, totalLines?: number): string[] {
|
|
526
|
-
const th = this.theme;
|
|
527
|
-
const border = (s: string) => th.fg("borderAccent", s);
|
|
528
|
-
const innerWidth = width - 4;
|
|
529
|
-
const lines: string[] = [];
|
|
530
|
-
lines.push(border("\u256d" + "\u2500".repeat(width - 2) + "\u256e"));
|
|
531
|
-
|
|
532
|
-
// Compute scroll indicator positions
|
|
533
|
-
const scrollable = totalLines !== undefined && visibleRows !== undefined && totalLines > visibleRows;
|
|
534
|
-
let thumbStart = -1;
|
|
535
|
-
let thumbLen = 0;
|
|
536
|
-
const innerRows = inner.length;
|
|
537
|
-
if (scrollable && innerRows > 0 && totalLines! > 0) {
|
|
538
|
-
thumbStart = Math.round(((offset ?? 0) / totalLines!) * innerRows);
|
|
539
|
-
thumbLen = Math.max(1, Math.round((visibleRows! / totalLines!) * innerRows));
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
for (let i = 0; i < inner.length; i++) {
|
|
543
|
-
const line = inner[i];
|
|
544
|
-
const truncated = truncateToWidth(line, innerWidth);
|
|
545
|
-
const padWidth = Math.max(0, innerWidth - visibleWidth(truncated));
|
|
546
|
-
const rightBorder = scrollable && i >= thumbStart && i < thumbStart + thumbLen
|
|
547
|
-
? border("\u2503")
|
|
548
|
-
: border("\u2502");
|
|
549
|
-
lines.push(border("\u2502") + " " + truncated + " ".repeat(padWidth) + " " + rightBorder);
|
|
550
|
-
}
|
|
551
|
-
lines.push(border("\u2570" + "\u2500".repeat(width - 2) + "\u256f"));
|
|
552
|
-
return lines;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
527
|
invalidate(): void {
|
|
556
528
|
this.cachedWidth = undefined;
|
|
557
529
|
this.cachedLines = undefined;
|
|
@@ -216,6 +216,10 @@ export type EnterResult =
|
|
|
216
216
|
cause?: unknown;
|
|
217
217
|
};
|
|
218
218
|
|
|
219
|
+
export interface StrandedMilestoneAdoptionOptions {
|
|
220
|
+
mode: "worktree" | "branch";
|
|
221
|
+
}
|
|
222
|
+
|
|
219
223
|
export type ExitResult =
|
|
220
224
|
| { ok: true; merged: boolean; codeFilesChanged: boolean }
|
|
221
225
|
| { ok: false; reason: "merge-conflict" | "teardown-failed"; cause?: unknown };
|
|
@@ -237,6 +241,8 @@ export interface MergeContext {
|
|
|
237
241
|
*/
|
|
238
242
|
worktreeBasePath: string;
|
|
239
243
|
milestoneId: string;
|
|
244
|
+
/** Temporary override used while recovering stranded work. */
|
|
245
|
+
isolationModeOverride?: "worktree" | "branch" | "none";
|
|
240
246
|
/**
|
|
241
247
|
* When true, `mergeMilestoneStandalone` returns `{ merged: false,
|
|
242
248
|
* mode: "skipped" }` immediately (mirrors the single-loop guard). Default
|
|
@@ -533,6 +539,7 @@ export function _enterMilestoneCore(
|
|
|
533
539
|
deps: WorktreeLifecycleDeps,
|
|
534
540
|
milestoneId: string,
|
|
535
541
|
ctx: NotifyCtx,
|
|
542
|
+
opts: { modeOverride?: "worktree" | "branch" } = {},
|
|
536
543
|
): EnterResult {
|
|
537
544
|
if (!isValidMilestoneId(milestoneId)) {
|
|
538
545
|
debugLog("WorktreeLifecycle", {
|
|
@@ -653,7 +660,7 @@ export function _enterMilestoneCore(
|
|
|
653
660
|
// Handles the case where originalBasePath is falsy and basePath is itself
|
|
654
661
|
// a worktree path — prevents double-nested worktree paths (#3729).
|
|
655
662
|
const basePath = resolveWorktreeProjectRoot(s.basePath, s.originalBasePath);
|
|
656
|
-
const mode = getIsolationMode(basePath);
|
|
663
|
+
const mode = opts.modeOverride ?? getIsolationMode(basePath);
|
|
657
664
|
|
|
658
665
|
if (s.isolationDegraded) {
|
|
659
666
|
if (mode === "worktree") {
|
|
@@ -1298,7 +1305,9 @@ export function mergeMilestoneStandalone(
|
|
|
1298
1305
|
};
|
|
1299
1306
|
}
|
|
1300
1307
|
|
|
1301
|
-
const mode =
|
|
1308
|
+
const mode =
|
|
1309
|
+
mctx.isolationModeOverride ??
|
|
1310
|
+
getIsolationMode(originalBasePath || worktreeBasePath);
|
|
1302
1311
|
debugLog("WorktreeLifecycle", {
|
|
1303
1312
|
action: "mergeAndExit",
|
|
1304
1313
|
milestoneId,
|
|
@@ -1637,6 +1646,7 @@ export class WorktreeLifecycle {
|
|
|
1637
1646
|
originalBasePath: this.s.originalBasePath,
|
|
1638
1647
|
worktreeBasePath: this.s.basePath,
|
|
1639
1648
|
milestoneId,
|
|
1649
|
+
isolationModeOverride: this.s.strandedRecoveryIsolationMode ?? undefined,
|
|
1640
1650
|
isolationDegraded: this.s.isolationDegraded,
|
|
1641
1651
|
notify: ctx.notify,
|
|
1642
1652
|
});
|
|
@@ -1740,6 +1750,7 @@ export class WorktreeLifecycle {
|
|
|
1740
1750
|
// Rebuild GitService after merge (branch HEAD changed)
|
|
1741
1751
|
rebuildGitService(this.s, this.deps);
|
|
1742
1752
|
}
|
|
1753
|
+
this.s.strandedRecoveryIsolationMode = null;
|
|
1743
1754
|
return result;
|
|
1744
1755
|
}
|
|
1745
1756
|
|
|
@@ -1876,6 +1887,30 @@ export class WorktreeLifecycle {
|
|
|
1876
1887
|
this.s.basePath = resolvePausedResumeBasePath(base, persistedWorktreePath);
|
|
1877
1888
|
}
|
|
1878
1889
|
|
|
1890
|
+
/**
|
|
1891
|
+
* Adopt in-progress stranded work during bootstrap.
|
|
1892
|
+
*
|
|
1893
|
+
* Unlike completed-orphan recovery, this does not merge, delete, or commit.
|
|
1894
|
+
* It only moves the live session onto the branch/worktree proven by the
|
|
1895
|
+
* audit evidence, while preserving that mode for the eventual merge.
|
|
1896
|
+
*/
|
|
1897
|
+
adoptStrandedMilestone(
|
|
1898
|
+
milestoneId: string,
|
|
1899
|
+
base: string,
|
|
1900
|
+
ctx: NotifyCtx,
|
|
1901
|
+
opts: StrandedMilestoneAdoptionOptions,
|
|
1902
|
+
): EnterResult {
|
|
1903
|
+
this.adoptSessionRoot(base);
|
|
1904
|
+
this.s.strandedRecoveryIsolationMode = opts.mode;
|
|
1905
|
+
const result = _enterMilestoneCore(this.s, this.deps, milestoneId, ctx, {
|
|
1906
|
+
modeOverride: opts.mode,
|
|
1907
|
+
});
|
|
1908
|
+
if (!result.ok) {
|
|
1909
|
+
this.s.strandedRecoveryIsolationMode = null;
|
|
1910
|
+
}
|
|
1911
|
+
return result;
|
|
1912
|
+
}
|
|
1913
|
+
|
|
1879
1914
|
/**
|
|
1880
1915
|
* Adopt an orphan worktree for a bootstrap-time merge (ADR-016 phase 2 / B4,
|
|
1881
1916
|
* issue #5622).
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Lightweight worktree post-create hook runner.
|
|
3
|
+
|
|
4
|
+
import { execFileSync } from "node:child_process";
|
|
5
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { isAbsolute, join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { parse as parseYaml } from "yaml";
|
|
10
|
+
|
|
11
|
+
import { gsdHome } from "./gsd-home.js";
|
|
12
|
+
import { gsdRoot } from "./paths.js";
|
|
13
|
+
|
|
14
|
+
function readPreferencesObject(path: string): Record<string, unknown> | null {
|
|
15
|
+
if (!existsSync(path)) return null;
|
|
16
|
+
|
|
17
|
+
const content = readFileSync(path, "utf-8");
|
|
18
|
+
try {
|
|
19
|
+
const startMarker = content.startsWith("---\r\n") ? "---\r\n" : "---\n";
|
|
20
|
+
if (content.startsWith(startMarker)) {
|
|
21
|
+
const searchStart = startMarker.length;
|
|
22
|
+
const endIdx = content.indexOf("\n---", searchStart);
|
|
23
|
+
if (endIdx === -1) return null;
|
|
24
|
+
|
|
25
|
+
const parsed = parseYaml(content.slice(searchStart, endIdx).replace(/\r/g, ""));
|
|
26
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
27
|
+
? parsed as Record<string, unknown>
|
|
28
|
+
: null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const gitLines: string[] = [];
|
|
32
|
+
let inGitSection = false;
|
|
33
|
+
for (const rawLine of content.split("\n")) {
|
|
34
|
+
const line = rawLine.replace(/\r$/, "");
|
|
35
|
+
const heading = line.match(/^##\s+(.+)$/);
|
|
36
|
+
if (heading) {
|
|
37
|
+
inGitSection = heading[1].trim().toLowerCase().replace(/\s+/g, "_") === "git";
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (inGitSection && line.trim() && !line.trimStart().startsWith("#")) {
|
|
41
|
+
gitLines.push(line.replace(/^\s*-\s*/, ""));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (gitLines.length === 0) return null;
|
|
45
|
+
|
|
46
|
+
const parsed = parseYaml(gitLines.join("\n"));
|
|
47
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
48
|
+
? { git: parsed as Record<string, unknown> }
|
|
49
|
+
: null;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function extractHookPath(preferences: Record<string, unknown> | null): string | null {
|
|
56
|
+
const git = preferences?.git;
|
|
57
|
+
if (!git || typeof git !== "object" || Array.isArray(git)) return null;
|
|
58
|
+
const hookPath = (git as Record<string, unknown>).worktree_post_create;
|
|
59
|
+
return typeof hookPath === "string" && hookPath.trim() ? hookPath : null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function resolveConfiguredHookPath(sourceDir: string): string | null {
|
|
63
|
+
const paths = [
|
|
64
|
+
join(homedir(), ".pi", "agent", "gsd-preferences.md"),
|
|
65
|
+
join(gsdHome(), "preferences.md"),
|
|
66
|
+
join(gsdHome(), "PREFERENCES.md"),
|
|
67
|
+
join(gsdRoot(sourceDir), "preferences.md"),
|
|
68
|
+
join(gsdRoot(sourceDir), "PREFERENCES.md"),
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
let hookPath: string | null = null;
|
|
72
|
+
for (const path of paths) {
|
|
73
|
+
hookPath = extractHookPath(readPreferencesObject(path)) ?? hookPath;
|
|
74
|
+
}
|
|
75
|
+
return hookPath;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Run the user-configured post-create hook script after worktree creation.
|
|
80
|
+
* The script receives SOURCE_DIR and WORKTREE_DIR as environment variables.
|
|
81
|
+
* Failure is non-fatal -- returns the error message or null on success.
|
|
82
|
+
*
|
|
83
|
+
* Reads git.worktree_post_create from effective global/project preferences
|
|
84
|
+
* unless hookPath is provided directly.
|
|
85
|
+
*/
|
|
86
|
+
export function runWorktreePostCreateHook(
|
|
87
|
+
sourceDir: string,
|
|
88
|
+
worktreeDir: string,
|
|
89
|
+
hookPath?: string,
|
|
90
|
+
): string | null {
|
|
91
|
+
if (hookPath === undefined) {
|
|
92
|
+
hookPath = resolveConfiguredHookPath(sourceDir) ?? undefined;
|
|
93
|
+
}
|
|
94
|
+
if (!hookPath) return null;
|
|
95
|
+
|
|
96
|
+
let resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
|
|
97
|
+
if (!existsSync(resolved)) {
|
|
98
|
+
return `Worktree post-create hook not found: ${resolved}`;
|
|
99
|
+
}
|
|
100
|
+
if (process.platform === "win32") {
|
|
101
|
+
try {
|
|
102
|
+
resolved = realpathSync.native(resolved);
|
|
103
|
+
} catch {
|
|
104
|
+
// Keep the original path; the exec error below will include the failure.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
const needsShell = process.platform === "win32" && /\.(bat|cmd)$/i.test(resolved);
|
|
110
|
+
execFileSync(resolved, [], {
|
|
111
|
+
cwd: worktreeDir,
|
|
112
|
+
env: {
|
|
113
|
+
...process.env,
|
|
114
|
+
SOURCE_DIR: sourceDir,
|
|
115
|
+
WORKTREE_DIR: worktreeDir,
|
|
116
|
+
},
|
|
117
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
118
|
+
encoding: "utf-8",
|
|
119
|
+
timeout: 30_000,
|
|
120
|
+
shell: needsShell,
|
|
121
|
+
});
|
|
122
|
+
return null;
|
|
123
|
+
} catch (err) {
|
|
124
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
125
|
+
return `Worktree post-create hook failed: ${msg}`;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -172,6 +172,35 @@ const ROOT_DIAGNOSTIC_FILES = [
|
|
|
172
172
|
"metrics.json",
|
|
173
173
|
] as const;
|
|
174
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Root-level .gsd/ projections copied from project root into worktrees for
|
|
177
|
+
* compatibility reads. Project root remains authoritative; copy-back still
|
|
178
|
+
* excludes these markdown projections.
|
|
179
|
+
*/
|
|
180
|
+
const ROOT_FORWARD_PROJECTION_FILES = [
|
|
181
|
+
"DECISIONS.md",
|
|
182
|
+
"REQUIREMENTS.md",
|
|
183
|
+
"PROJECT.md",
|
|
184
|
+
"KNOWLEDGE.md",
|
|
185
|
+
"OVERRIDES.md",
|
|
186
|
+
"QUEUE.md",
|
|
187
|
+
"completed-units.json",
|
|
188
|
+
"metrics.json",
|
|
189
|
+
"mcp.json",
|
|
190
|
+
] as const;
|
|
191
|
+
|
|
192
|
+
function syncRootProjectionFilesToWorktree(prGsd: string, wtGsd: string): void {
|
|
193
|
+
mkdirSync(wtGsd, { recursive: true });
|
|
194
|
+
|
|
195
|
+
for (const file of ROOT_FORWARD_PROJECTION_FILES) {
|
|
196
|
+
const src = join(prGsd, file);
|
|
197
|
+
const dst = join(wtGsd, file);
|
|
198
|
+
if (!existsSync(src) || existsSync(dst)) continue;
|
|
199
|
+
|
|
200
|
+
safeCopy(src, dst, { force: false });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
175
204
|
// ─── Implementation cores ────────────────────────────────────────────────
|
|
176
205
|
//
|
|
177
206
|
// The `_*Impl` exports take raw paths so the deprecated path-string
|
|
@@ -204,6 +233,10 @@ export function _projectRootToWorktreeImpl(
|
|
|
204
233
|
// Compare realpaths and skip when they resolve to the same physical path (#2184).
|
|
205
234
|
if (isSamePath(prGsd, wtGsd)) return;
|
|
206
235
|
|
|
236
|
+
// Root PROJECT/REQUIREMENTS/DECISIONS projections must be readable from a
|
|
237
|
+
// worktree-bound unit; the project root remains authoritative.
|
|
238
|
+
syncRootProjectionFilesToWorktree(prGsd, wtGsd);
|
|
239
|
+
|
|
207
240
|
// Copy milestone directory from project root to worktree — additive only.
|
|
208
241
|
// force:false prevents cpSync from overwriting existing worktree files.
|
|
209
242
|
// Without this, worktree-local files (e.g. VALIDATION.md written
|