@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
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 +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- 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 +3 -0
- 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/stream-adapter.js +30 -4
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- 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 +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +26 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- 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/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +23 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- 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 +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- 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/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- 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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state.js +6 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- 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/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- 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 +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- 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/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/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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- 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/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +2 -2
- 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 +5 -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 +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +116 -39
- 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/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/README.md +1 -0
- 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/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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 +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- 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/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/GSD-WORKFLOW.md +5 -4
- 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 +3 -0
- 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 +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- 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 +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +37 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- 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/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -28
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- 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 +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- 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/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- 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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- 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 +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -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/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- 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/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- 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/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -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/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -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/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- 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/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- 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 +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
* git operations during worktree transitions:
|
|
8
8
|
*
|
|
9
9
|
* - `checkoutBranchWithStashGuard` — branch switch with stash protection,
|
|
10
|
-
* including the stash-pop EEXIST collision recovery for
|
|
11
|
-
*
|
|
10
|
+
* including the stash-pop EEXIST collision recovery for untracked files
|
|
11
|
+
* (force-checkout + targeted stash drop; #645 broadened it beyond `.gsd/`,
|
|
12
|
+
* guarded by "no non-.gsd unmerged entries remain").
|
|
12
13
|
* - `removeMergeStateFiles` — clears SQUASH_MSG / MERGE_HEAD / etc. left by
|
|
13
14
|
* a failed merge so subsequent merges don't fail on stale state.
|
|
14
15
|
* - `cleanupConflictState` — merge-abort + index reset + state-file cleanup
|
|
@@ -240,20 +241,25 @@ export function checkoutBranchWithStashGuard(basePath, branch, reason) {
|
|
|
240
241
|
: "";
|
|
241
242
|
const stashPopMessage = `${stderrText}\n${msg}`.trim();
|
|
242
243
|
const alreadyExists = stashAlreadyExistsFilesFromError(popErr);
|
|
243
|
-
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
244
|
-
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
245
244
|
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
246
245
|
const stashRefForDrop = stashRefFromError(popErr);
|
|
247
|
-
const
|
|
246
|
+
const allConflictFiles = nativeConflictFiles(basePath);
|
|
247
|
+
const nonGsdUnmerged = allConflictFiles.filter((f) => !f.startsWith(".gsd/"));
|
|
248
|
+
const gsdUnmerged = allConflictFiles.filter((f) => f.startsWith(".gsd/"));
|
|
248
249
|
const gsdContentConflicts = isUntrackedRestoreFailure
|
|
249
250
|
? gsdJsonlFilesWithConflictMarkers(basePath)
|
|
250
251
|
: [];
|
|
251
|
-
|
|
252
|
+
// Resolve ALL untracked-collision files by accepting HEAD — files in
|
|
253
|
+
// alreadyExists were untracked on the source branch by definition of the
|
|
254
|
+
// "already exists, no checkout" failure, so target HEAD is authoritative.
|
|
255
|
+
// gsdUnmerged: .gsd/ index conflicts left by the partial stash pop are
|
|
256
|
+
// also resolved via HEAD — .gsd/ runtime state is always authoritative
|
|
257
|
+
// on the target branch, so accepting HEAD is safe here too.
|
|
258
|
+
const resolvable = [...new Set([...alreadyExists, ...gsdContentConflicts, ...gsdUnmerged])];
|
|
252
259
|
if (isUntrackedRestoreFailure &&
|
|
253
|
-
|
|
254
|
-
nonGsdAlreadyExists.length === 0 &&
|
|
260
|
+
resolvable.length > 0 &&
|
|
255
261
|
nonGsdUnmerged.length === 0) {
|
|
256
|
-
for (const f of
|
|
262
|
+
for (const f of resolvable) {
|
|
257
263
|
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
258
264
|
cwd: basePath,
|
|
259
265
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -32,6 +32,7 @@ import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain, } fr
|
|
|
32
32
|
// callers — production wiring previously injected them via deps; the seam
|
|
33
33
|
// added type churn without enabling test variation.
|
|
34
34
|
import { loadEffectiveGSDPreferences, getIsolationMode } from "./preferences.js";
|
|
35
|
+
import { isolationDegradedFallbackGuidance, worktreeCreationFailedGuidance } from "./guidance.js";
|
|
35
36
|
import { invalidateAllCaches } from "./cache.js";
|
|
36
37
|
import { resolveMilestoneFile } from "./paths.js";
|
|
37
38
|
import { getMilestone, insertMilestone, isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
@@ -343,7 +344,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
343
344
|
s.basePath = basePath;
|
|
344
345
|
rebuildGitService(s, deps);
|
|
345
346
|
invalidateAllCaches();
|
|
346
|
-
ctx.notify(
|
|
347
|
+
ctx.notify(isolationDegradedFallbackGuidance(milestoneId), "warning");
|
|
347
348
|
return { ok: true, mode: "branch", path: basePath };
|
|
348
349
|
}
|
|
349
350
|
catch (err) {
|
|
@@ -517,7 +518,7 @@ export function _enterMilestoneCore(s, deps, milestoneId, ctx, opts = {}) {
|
|
|
517
518
|
eventType: "worktree-create-failed",
|
|
518
519
|
data: { milestoneId, error: msg, fallback: "project-root" },
|
|
519
520
|
});
|
|
520
|
-
ctx.notify(
|
|
521
|
+
ctx.notify(worktreeCreationFailedGuidance(milestoneId, msg), "warning");
|
|
521
522
|
// Degrade isolation for the rest of this session so mergeAndExit
|
|
522
523
|
// doesn't try to merge a nonexistent worktree branch (#2483)
|
|
523
524
|
s.isolationDegraded = true;
|
|
@@ -528,7 +528,13 @@ export function removeWorktree(basePath, name, opts = {}) {
|
|
|
528
528
|
// inside .gsd/worktrees/ — a symlink inside the directory could point out.
|
|
529
529
|
const resolvedPathSafe = isInsideWorktreesDir(basePath, resolvedWtPath);
|
|
530
530
|
// If we're inside the worktree, move out first — git can't remove an in-use directory
|
|
531
|
-
|
|
531
|
+
let cwd;
|
|
532
|
+
try {
|
|
533
|
+
cwd = process.cwd();
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
cwd = basePath;
|
|
537
|
+
}
|
|
532
538
|
const resolvedCwd = existsSync(cwd) ? realpathSync(cwd) : cwd;
|
|
533
539
|
if (resolvedCwd === resolvedWtPath || resolvedCwd.startsWith(resolvedWtPath + sep)) {
|
|
534
540
|
process.chdir(basePath);
|
|
@@ -57,6 +57,17 @@ export function findWorktreeSegment(normalizedPath) {
|
|
|
57
57
|
export function isGsdWorktreePath(path) {
|
|
58
58
|
return findWorktreeSegment(path.replaceAll("\\", "/")) !== null;
|
|
59
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Project-root prefix of a GSD worktree path, or null when the path is not
|
|
62
|
+
* inside a recognized worktree layout. Pure string split — no env handling,
|
|
63
|
+
* HOME guard, or filesystem fallbacks (resolveWorktreeProjectRoot adds
|
|
64
|
+
* those). Separator normalization is 1:1 on characters, so the prefix is
|
|
65
|
+
* sliced from the ORIGINAL string and keeps its separators.
|
|
66
|
+
*/
|
|
67
|
+
export function projectRootFromWorktreePath(path) {
|
|
68
|
+
const segment = findWorktreeSegment(path.replaceAll("\\", "/"));
|
|
69
|
+
return segment ? path.slice(0, segment.gsdIdx) : null;
|
|
70
|
+
}
|
|
60
71
|
/**
|
|
61
72
|
* When a milestone worktree lives under the external-state layout
|
|
62
73
|
* (`<gsdHome>/projects/<hash>/worktrees/<MID>/`, or the `GSD_STATE_DIR`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// GSD worktree session state
|
|
2
|
-
import { findWorktreeSegment } from "./worktree-root.js";
|
|
2
|
+
import { findWorktreeSegment, projectRootFromWorktreePath } from "./worktree-root.js";
|
|
3
3
|
let originalCwd = null;
|
|
4
4
|
export function getWorktreeOriginalCwd() {
|
|
5
5
|
return originalCwd;
|
|
@@ -13,10 +13,9 @@ export function clearWorktreeOriginalCwd() {
|
|
|
13
13
|
export function ensureWorktreeOriginalCwdFromPath(cwd = process.cwd()) {
|
|
14
14
|
if (originalCwd)
|
|
15
15
|
return originalCwd;
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
originalCwd =
|
|
19
|
-
}
|
|
16
|
+
const root = projectRootFromWorktreePath(cwd);
|
|
17
|
+
if (root)
|
|
18
|
+
originalCwd = root;
|
|
20
19
|
return originalCwd;
|
|
21
20
|
}
|
|
22
21
|
export function getActiveWorktreeName() {
|
|
@@ -195,7 +195,14 @@ export function resolveGitHeadPath(dir) {
|
|
|
195
195
|
*/
|
|
196
196
|
export function nudgeGitBranchCache(previousCwd) {
|
|
197
197
|
const now = new Date();
|
|
198
|
-
|
|
198
|
+
let currentCwd = null;
|
|
199
|
+
try {
|
|
200
|
+
currentCwd = process.cwd();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
currentCwd = null;
|
|
204
|
+
}
|
|
205
|
+
for (const dir of [previousCwd, currentCwd].filter((dir) => Boolean(dir))) {
|
|
199
206
|
try {
|
|
200
207
|
const headPath = resolveGitHeadPath(dir);
|
|
201
208
|
if (headPath)
|
|
@@ -214,9 +214,11 @@ export function registerNativeSearchHooks(pi) {
|
|
|
214
214
|
isAnthropic = isAnthropicProvider && payloadLooksAnthropic !== false;
|
|
215
215
|
}
|
|
216
216
|
else {
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
|
|
217
|
+
// No authoritative provider info available (no event.model, no model_select).
|
|
218
|
+
// Do NOT inject native web_search — guessing on model name alone causes 400
|
|
219
|
+
// "unsupported_value" errors when the actual provider (copilot, openrouter,
|
|
220
|
+
// proxy, etc.) doesn't expose the server-side search tool (#648).
|
|
221
|
+
isAnthropic = false;
|
|
220
222
|
}
|
|
221
223
|
if (!isAnthropic)
|
|
222
224
|
return;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Browser Automation Contract — the single source for the canonical
|
|
3
|
+
// Pi-facing browser tool vocabulary. Engine adapters (legacy Playwright, managed
|
|
4
|
+
// gsd-browser), UAT policy, dispatch preflight, and evidence detection all derive
|
|
5
|
+
// their browser tool knowledge from this module instead of re-listing names.
|
|
6
|
+
/**
|
|
7
|
+
* Canonical `browser_*` tool names of the Browser Automation Contract.
|
|
8
|
+
*
|
|
9
|
+
* These are the product-level names Units see regardless of which Browser
|
|
10
|
+
* Automation Engine serves them (ADR-024). Adding a capability here is the
|
|
11
|
+
* one-line vocabulary change; the engine adapters and presentation surfaces
|
|
12
|
+
* are typed against this list, so missing coverage fails typecheck.
|
|
13
|
+
*/
|
|
14
|
+
export const BROWSER_CONTRACT_TOOL_NAMES = [
|
|
15
|
+
"browser_navigate",
|
|
16
|
+
"browser_click",
|
|
17
|
+
"browser_type",
|
|
18
|
+
"browser_fill_form",
|
|
19
|
+
"browser_click_ref",
|
|
20
|
+
"browser_fill_ref",
|
|
21
|
+
"browser_wait_for",
|
|
22
|
+
"browser_assert",
|
|
23
|
+
"browser_verify",
|
|
24
|
+
"browser_screenshot",
|
|
25
|
+
"browser_snapshot_refs",
|
|
26
|
+
"browser_find",
|
|
27
|
+
"browser_get_console_logs",
|
|
28
|
+
"browser_get_network_logs",
|
|
29
|
+
"browser_evaluate",
|
|
30
|
+
"browser_reload",
|
|
31
|
+
"browser_batch",
|
|
32
|
+
"browser_act",
|
|
33
|
+
];
|
|
34
|
+
const BROWSER_CONTRACT_TOOL_NAME_SET = new Set(BROWSER_CONTRACT_TOOL_NAMES);
|
|
35
|
+
export function isBrowserContractToolName(name) {
|
|
36
|
+
return BROWSER_CONTRACT_TOOL_NAME_SET.has(name);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether a canonical (non-MCP-prefixed) tool name belongs to the browser tool
|
|
40
|
+
* family. Broader than the contract list on purpose: an External MCP Client or
|
|
41
|
+
* host integration may supply additional `browser_*` tools that still satisfy
|
|
42
|
+
* browser-backed UAT.
|
|
43
|
+
*/
|
|
44
|
+
export function hasBrowserContractPrefix(canonicalToolName) {
|
|
45
|
+
return canonicalToolName.startsWith("browser_");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Contract tool names whose appearance in prose marks browser-backed UAT
|
|
49
|
+
* activity (requirement or evidence language). Consumed by the
|
|
50
|
+
* browser-evidence regexes so textual detection stays derived from the
|
|
51
|
+
* contract vocabulary.
|
|
52
|
+
*/
|
|
53
|
+
export const BROWSER_EVIDENCE_SIGNAL_TOOL_NAMES = [
|
|
54
|
+
"browser_assert",
|
|
55
|
+
"browser_batch",
|
|
56
|
+
"browser_find",
|
|
57
|
+
"browser_verify",
|
|
58
|
+
"browser_snapshot_refs",
|
|
59
|
+
];
|
|
@@ -38,6 +38,28 @@ function compareSemverLocal(a, b) {
|
|
|
38
38
|
function parseGsdBrowserVersion(output) {
|
|
39
39
|
return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
40
40
|
}
|
|
41
|
+
function splitCommandLine(commandLine) {
|
|
42
|
+
const parts = commandLine.match(/(?:"[^"]*"|'[^']*'|[^\s"']+)/g) ?? [];
|
|
43
|
+
return parts.map((part) => {
|
|
44
|
+
const quote = part[0];
|
|
45
|
+
if ((quote === '"' || quote === "'") && part.endsWith(quote)) {
|
|
46
|
+
return part.slice(1, -1);
|
|
47
|
+
}
|
|
48
|
+
return part;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function buildPathGsdBrowserVersionInvocation(platform) {
|
|
52
|
+
if (platform === "win32") {
|
|
53
|
+
return { command: "cmd", args: ["/d", "/s", "/c", "gsd-browser", "--version"] };
|
|
54
|
+
}
|
|
55
|
+
return { command: "gsd-browser", args: ["--version"] };
|
|
56
|
+
}
|
|
57
|
+
function isRecord(value) {
|
|
58
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
59
|
+
}
|
|
60
|
+
function resolveExplicitGsdBrowserCliPath(env) {
|
|
61
|
+
return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
|
|
62
|
+
}
|
|
41
63
|
function resolveBundledGsdBrowserPackageVersion() {
|
|
42
64
|
try {
|
|
43
65
|
const requireFromHere = createRequire(import.meta.url);
|
|
@@ -49,12 +71,20 @@ function resolveBundledGsdBrowserPackageVersion() {
|
|
|
49
71
|
return null;
|
|
50
72
|
}
|
|
51
73
|
}
|
|
74
|
+
// The `gsd-browser --version` subprocess result cannot change mid-session (the
|
|
75
|
+
// engine-switch guard forbids restarting with a different engine), and both the
|
|
76
|
+
// availability probe and the launch-config resolution ask for it at session
|
|
77
|
+
// start — memoize so the up-to-2s spawn happens once per process.
|
|
78
|
+
let cachedPathProbeVersion;
|
|
52
79
|
function resolvePathGsdBrowserVersion(env) {
|
|
53
80
|
const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
|
|
54
81
|
if (explicit)
|
|
55
82
|
return parseGsdBrowserVersion(explicit);
|
|
83
|
+
if (cachedPathProbeVersion !== undefined)
|
|
84
|
+
return cachedPathProbeVersion;
|
|
56
85
|
try {
|
|
57
|
-
|
|
86
|
+
const invocation = buildPathGsdBrowserVersionInvocation(process.platform);
|
|
87
|
+
cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync(invocation.command, invocation.args, {
|
|
58
88
|
encoding: "utf-8",
|
|
59
89
|
env,
|
|
60
90
|
stdio: ["ignore", "pipe", "ignore"],
|
|
@@ -62,8 +92,9 @@ function resolvePathGsdBrowserVersion(env) {
|
|
|
62
92
|
}));
|
|
63
93
|
}
|
|
64
94
|
catch {
|
|
65
|
-
|
|
95
|
+
cachedPathProbeVersion = null;
|
|
66
96
|
}
|
|
97
|
+
return cachedPathProbeVersion;
|
|
67
98
|
}
|
|
68
99
|
function shouldPreferPathGsdBrowser(env) {
|
|
69
100
|
const pathVersion = resolvePathGsdBrowserVersion(env);
|
|
@@ -73,7 +104,7 @@ function shouldPreferPathGsdBrowser(env) {
|
|
|
73
104
|
return !bundledVersion || compareSemverLocal(pathVersion, bundledVersion) > 0;
|
|
74
105
|
}
|
|
75
106
|
export function resolveBundledGsdBrowserCliPath(env = process.env) {
|
|
76
|
-
const explicit =
|
|
107
|
+
const explicit = resolveExplicitGsdBrowserCliPath(env);
|
|
77
108
|
if (explicit)
|
|
78
109
|
return explicit;
|
|
79
110
|
try {
|
|
@@ -96,6 +127,36 @@ export function resolveBundledGsdBrowserCliPath(env = process.env) {
|
|
|
96
127
|
}
|
|
97
128
|
return null;
|
|
98
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Cheap availability probe for the gsd-browser CLI: explicit env overrides,
|
|
132
|
+
* then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
|
|
133
|
+
* a PATH lookup (one short subprocess, memoized). Used by Browser Automation
|
|
134
|
+
* Engine resolution to decide whether the managed engine is provable before
|
|
135
|
+
* preferring it over legacy Playwright. `via` names the provable source, not
|
|
136
|
+
* necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
|
|
137
|
+
* prefer a newer PATH CLI over the bundled one.
|
|
138
|
+
*/
|
|
139
|
+
export function resolveGsdBrowserCliAvailability(env = process.env) {
|
|
140
|
+
const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
141
|
+
if (explicitCommand) {
|
|
142
|
+
return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
|
|
143
|
+
}
|
|
144
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
145
|
+
if (explicitCliPath) {
|
|
146
|
+
return existsSync(explicitCliPath)
|
|
147
|
+
? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
|
|
148
|
+
: { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
|
|
149
|
+
}
|
|
150
|
+
const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
|
|
151
|
+
if (bundledCliPath) {
|
|
152
|
+
return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
|
|
153
|
+
}
|
|
154
|
+
const pathVersion = resolvePathGsdBrowserVersion(env);
|
|
155
|
+
if (pathVersion) {
|
|
156
|
+
return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
|
|
157
|
+
}
|
|
158
|
+
return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
|
|
159
|
+
}
|
|
99
160
|
export function buildGsdBrowserSessionName(projectRoot, suffix) {
|
|
100
161
|
const resolvedProjectRoot = resolve(projectRoot);
|
|
101
162
|
const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
|
|
@@ -103,13 +164,38 @@ export function buildGsdBrowserSessionName(projectRoot, suffix) {
|
|
|
103
164
|
const cleanSuffix = suffix ? sanitizeSessionSegment(suffix) : "";
|
|
104
165
|
return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
|
|
105
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Recognize an MCP server config (from .mcp.json / Claude settings) as a
|
|
169
|
+
* gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
|
|
170
|
+
* writes the config shape, so it also owns recognizing it. New launch shapes
|
|
171
|
+
* are taught here, in one place.
|
|
172
|
+
*/
|
|
173
|
+
export function isGsdBrowserMcpServerConfig(config) {
|
|
174
|
+
if (!isRecord(config))
|
|
175
|
+
return false;
|
|
176
|
+
const command = typeof config.command === "string" ? config.command : "";
|
|
177
|
+
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
if (isRecord(config.env)) {
|
|
181
|
+
const env = config.env;
|
|
182
|
+
if (typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
183
|
+
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
184
|
+
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string") {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
|
|
189
|
+
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
190
|
+
}
|
|
106
191
|
export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env, options = {}) {
|
|
107
192
|
const resolvedProjectRoot = resolve(projectRoot);
|
|
108
193
|
const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
|
|
109
194
|
const explicitArgs = parseJsonEnv(env, "GSD_BROWSER_MCP_ARGS");
|
|
110
195
|
const explicitEnv = parseJsonEnv(env, "GSD_BROWSER_MCP_ENV");
|
|
111
|
-
const
|
|
112
|
-
const
|
|
196
|
+
const explicitCommandLine = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
197
|
+
const [explicitCommand, ...explicitCommandArgs] = explicitCommandLine ? splitCommandLine(explicitCommandLine) : [];
|
|
198
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
113
199
|
const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
|
|
114
200
|
const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
|
|
115
201
|
? resolveBundledGsdBrowserCliPath(env)
|
|
@@ -119,6 +205,9 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
119
205
|
// profile/cookies persist across pi sessions for the same project. gsd-browser
|
|
120
206
|
// rejects --identity-scope unless --identity-key is also supplied.
|
|
121
207
|
const identityKey = env.GSD_BROWSER_IDENTITY_KEY?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
208
|
+
// identity-project must be a safe identifier (no path separators); full paths
|
|
209
|
+
// cause daemon startup to fail with "invalid name".
|
|
210
|
+
const identityProject = env.GSD_BROWSER_IDENTITY_PROJECT?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
122
211
|
const command = explicitCommand
|
|
123
212
|
|| explicitCliPath
|
|
124
213
|
|| (preferPathCli ? "gsd-browser" : undefined)
|
|
@@ -127,6 +216,7 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
127
216
|
const args = Array.isArray(explicitArgs) && explicitArgs.length > 0
|
|
128
217
|
? explicitArgs.map(String)
|
|
129
218
|
: [
|
|
219
|
+
...explicitCommandArgs,
|
|
130
220
|
...(bundledCliPath ? [bundledCliPath] : []),
|
|
131
221
|
"mcp",
|
|
132
222
|
"--session",
|
|
@@ -136,7 +226,7 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
136
226
|
"--identity-key",
|
|
137
227
|
identityKey,
|
|
138
228
|
"--identity-project",
|
|
139
|
-
|
|
229
|
+
identityProject,
|
|
140
230
|
];
|
|
141
231
|
const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
|
|
142
232
|
return {
|
|
@@ -149,3 +239,23 @@ export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env,
|
|
|
149
239
|
sessionName,
|
|
150
240
|
};
|
|
151
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* CLI invocation that starts the gsd-browser session daemon with the same
|
|
244
|
+
* session and identity flags as {@link resolveGsdBrowserMcpLaunchConfig}, so
|
|
245
|
+
* browser UAT can warm Chrome/CDP before the first MCP navigation.
|
|
246
|
+
*/
|
|
247
|
+
export function resolveGsdBrowserDaemonStartInvocation(projectRoot, env = process.env, options = {}) {
|
|
248
|
+
const launch = resolveGsdBrowserMcpLaunchConfig(projectRoot, env, options);
|
|
249
|
+
const mcpIndex = launch.args.indexOf("mcp");
|
|
250
|
+
if (mcpIndex < 0) {
|
|
251
|
+
throw new Error("gsd-browser launch config is missing mcp subcommand");
|
|
252
|
+
}
|
|
253
|
+
const prefix = launch.args.slice(0, mcpIndex);
|
|
254
|
+
const sessionFlags = launch.args.slice(mcpIndex + 1);
|
|
255
|
+
return {
|
|
256
|
+
command: launch.command,
|
|
257
|
+
args: [...prefix, "daemon", "start", ...sessionFlags],
|
|
258
|
+
cwd: launch.cwd,
|
|
259
|
+
...(launch.env ? { env: launch.env } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { chmodSync, copyFileSync, existsSync, lstatSync, readlinkSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, isAbsolute, join, delimiter as pathDelimiter, resolve as resolvePath } from 'node:path';
|
|
5
|
+
import { isPnpmInstall, pathStartsWith } from './package-manager-detection.js';
|
|
6
|
+
function isBunGlobalInstall(argv1, env) {
|
|
7
|
+
if ('bun' in process.versions)
|
|
8
|
+
return true;
|
|
9
|
+
if (!argv1)
|
|
10
|
+
return false;
|
|
11
|
+
const bunBinDirs = [];
|
|
12
|
+
if (env.BUN_INSTALL)
|
|
13
|
+
bunBinDirs.push(join(env.BUN_INSTALL, 'bin'));
|
|
14
|
+
bunBinDirs.push(join(homedir(), '.bun', 'bin'));
|
|
15
|
+
return bunBinDirs.some((dir) => pathStartsWith(argv1, dir));
|
|
16
|
+
}
|
|
17
|
+
function gsdBrowserBinaryName(platform) {
|
|
18
|
+
return platform === 'win32' ? 'gsd-browser.cmd' : 'gsd-browser';
|
|
19
|
+
}
|
|
20
|
+
function tryResolveFromBinDir(binDir, platform) {
|
|
21
|
+
const primary = join(binDir, gsdBrowserBinaryName(platform));
|
|
22
|
+
if (existsSync(primary))
|
|
23
|
+
return primary;
|
|
24
|
+
if (platform === 'win32') {
|
|
25
|
+
const fallback = join(binDir, 'gsd-browser');
|
|
26
|
+
if (existsSync(fallback))
|
|
27
|
+
return fallback;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function tryResolveFromPackageRoot(rootDir, platform) {
|
|
32
|
+
const candidate = join(rootDir, '@opengsd', 'gsd-browser', 'bin', gsdBrowserBinaryName(platform));
|
|
33
|
+
if (existsSync(candidate))
|
|
34
|
+
return candidate;
|
|
35
|
+
if (platform === 'win32') {
|
|
36
|
+
const fallback = join(rootDir, '@opengsd', 'gsd-browser', 'bin', 'gsd-browser');
|
|
37
|
+
if (existsSync(fallback))
|
|
38
|
+
return fallback;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function tryExecLookup(command, args, env, platform, resolve) {
|
|
43
|
+
try {
|
|
44
|
+
const dir = execFileSync(command, args, {
|
|
45
|
+
encoding: 'utf-8',
|
|
46
|
+
env,
|
|
47
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
48
|
+
timeout: 5000,
|
|
49
|
+
}).trim();
|
|
50
|
+
return resolve(dir, platform);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function resolvePathBinary(env, platform) {
|
|
57
|
+
if (platform === 'win32') {
|
|
58
|
+
try {
|
|
59
|
+
const out = execFileSync('where', ['gsd-browser'], {
|
|
60
|
+
encoding: 'utf-8',
|
|
61
|
+
env,
|
|
62
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
63
|
+
timeout: 5000,
|
|
64
|
+
}).trim();
|
|
65
|
+
const first = out.split(/\r?\n/).map((line) => line.trim()).find(Boolean);
|
|
66
|
+
return first && existsSync(first) ? first : null;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const entry of (env.PATH ?? '').split(pathDelimiter)) {
|
|
73
|
+
if (!entry)
|
|
74
|
+
continue;
|
|
75
|
+
const candidate = join(entry, 'gsd-browser');
|
|
76
|
+
if (existsSync(candidate))
|
|
77
|
+
return candidate;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function resolveRealPath(pathValue) {
|
|
82
|
+
try {
|
|
83
|
+
return realpathSync(pathValue);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return resolvePath(pathValue);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function resolveSymlinkTarget(pathCli) {
|
|
90
|
+
try {
|
|
91
|
+
const stat = lstatSync(pathCli);
|
|
92
|
+
if (!stat.isSymbolicLink())
|
|
93
|
+
return pathCli;
|
|
94
|
+
const target = readlinkSync(pathCli);
|
|
95
|
+
return isAbsolute(target) ? target : resolvePath(dirname(pathCli), target);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// PATH entry vanished or is inaccessible between resolution and sync.
|
|
99
|
+
// Fall back to the original path; subsequent sync will surface a useful
|
|
100
|
+
// error rather than escaping as an unhandled throw.
|
|
101
|
+
return pathCli;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function resolveHomeDir(env) {
|
|
105
|
+
const fromEnv = env.HOME?.trim() || env.USERPROFILE?.trim();
|
|
106
|
+
return resolvePath(fromEnv || homedir());
|
|
107
|
+
}
|
|
108
|
+
function canAutoSyncTarget(targetPath, env) {
|
|
109
|
+
const home = resolveHomeDir(env);
|
|
110
|
+
const resolved = resolvePath(targetPath);
|
|
111
|
+
return pathStartsWith(resolved, home);
|
|
112
|
+
}
|
|
113
|
+
function syncBinary(installedCli, targetPath, platform) {
|
|
114
|
+
const source = resolveRealPath(installedCli);
|
|
115
|
+
copyFileSync(source, targetPath);
|
|
116
|
+
if (platform !== 'win32') {
|
|
117
|
+
chmodSync(targetPath, 0o755);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolve the gsd-browser binary installed by the active global package manager.
|
|
122
|
+
*/
|
|
123
|
+
export function resolveGlobalGsdBrowserCliPath(options = {}) {
|
|
124
|
+
const env = options.env ?? process.env;
|
|
125
|
+
const argv1 = options.argv1 ?? process.argv[1];
|
|
126
|
+
const platform = options.platform ?? process.platform;
|
|
127
|
+
if (isBunGlobalInstall(argv1, env)) {
|
|
128
|
+
return (tryExecLookup('bun', ['pm', 'bin', '-g'], env, platform, tryResolveFromBinDir)
|
|
129
|
+
?? (env.BUN_INSTALL ? tryResolveFromBinDir(join(env.BUN_INSTALL, 'bin'), platform) : null)
|
|
130
|
+
?? tryResolveFromBinDir(join(homedir(), '.bun', 'bin'), platform));
|
|
131
|
+
}
|
|
132
|
+
if (isPnpmInstall(argv1, env)) {
|
|
133
|
+
return (tryExecLookup('pnpm', ['bin', '-g'], env, platform, tryResolveFromBinDir)
|
|
134
|
+
?? tryExecLookup('pnpm', ['root', '-g'], env, platform, tryResolveFromPackageRoot));
|
|
135
|
+
}
|
|
136
|
+
return (tryExecLookup('npm', ['bin', '-g'], env, platform, tryResolveFromBinDir)
|
|
137
|
+
?? tryExecLookup('npm', ['root', '-g'], env, platform, tryResolveFromPackageRoot));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Resolve the gsd-browser binary that wins on PATH (`command -v` / `where`).
|
|
141
|
+
*/
|
|
142
|
+
export function resolveGsdBrowserOnPath(env = process.env, platform = process.platform) {
|
|
143
|
+
return resolvePathBinary(env, platform);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* After a global gsd-browser install, ensure the PATH-resolved binary matches
|
|
147
|
+
* the freshly installed global binary when an older copy is shadowing it.
|
|
148
|
+
*/
|
|
149
|
+
export function reconcileGsdBrowserPathAfterInstall(options) {
|
|
150
|
+
const env = options.env ?? process.env;
|
|
151
|
+
const argv1 = options.argv1 ?? process.argv[1];
|
|
152
|
+
const platform = options.platform ?? process.platform;
|
|
153
|
+
const installedCli = resolveGlobalGsdBrowserCliPath({ env, argv1, platform });
|
|
154
|
+
if (!installedCli) {
|
|
155
|
+
return { action: 'none' };
|
|
156
|
+
}
|
|
157
|
+
const pathCli = resolveGsdBrowserOnPath(env, platform);
|
|
158
|
+
const installedReal = resolveRealPath(installedCli);
|
|
159
|
+
if (pathCli && resolveRealPath(pathCli) === installedReal) {
|
|
160
|
+
return { action: 'none', pathCli, installedCli };
|
|
161
|
+
}
|
|
162
|
+
const pathVersion = options.resolvePathVersion(env);
|
|
163
|
+
if (pathVersion && options.compareSemver(pathVersion, options.latestVersion) >= 0) {
|
|
164
|
+
return { action: 'none', pathCli: pathCli ?? undefined, installedCli };
|
|
165
|
+
}
|
|
166
|
+
if (!pathCli) {
|
|
167
|
+
return {
|
|
168
|
+
action: 'shadowed',
|
|
169
|
+
installedCli,
|
|
170
|
+
message: 'Installed gsd-browser globally, but no gsd-browser was found on PATH. Add your package manager global bin directory to PATH.',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const syncTarget = resolveSymlinkTarget(pathCli);
|
|
174
|
+
if (!canAutoSyncTarget(syncTarget, env)) {
|
|
175
|
+
return {
|
|
176
|
+
action: 'shadowed',
|
|
177
|
+
pathCli,
|
|
178
|
+
installedCli,
|
|
179
|
+
syncTarget,
|
|
180
|
+
message: `PATH resolves gsd-browser to ${pathCli}, but the updated global install is at ${installedCli}. ` +
|
|
181
|
+
'Move your package manager global bin directory ahead of the stale location on PATH, or update the stale binary manually.',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
let syncSucceeded = false;
|
|
185
|
+
try {
|
|
186
|
+
syncBinary(installedCli, syncTarget, platform);
|
|
187
|
+
syncSucceeded = true;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Fall through to shadowed guidance.
|
|
191
|
+
}
|
|
192
|
+
if (syncSucceeded) {
|
|
193
|
+
const refreshedVersion = options.resolvePathVersion(env);
|
|
194
|
+
const verified = refreshedVersion !== null
|
|
195
|
+
&& options.compareSemver(refreshedVersion, options.latestVersion) >= 0;
|
|
196
|
+
return {
|
|
197
|
+
action: 'synced',
|
|
198
|
+
pathCli,
|
|
199
|
+
installedCli,
|
|
200
|
+
syncTarget,
|
|
201
|
+
message: verified
|
|
202
|
+
? `Synced PATH-resolved gsd-browser at ${syncTarget} to the updated global install.`
|
|
203
|
+
: `Synced PATH-resolved gsd-browser at ${syncTarget} to the updated global install. Could not verify the new version on PATH; restart your shell or rerun if it still reports the old version.`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
action: 'shadowed',
|
|
208
|
+
pathCli,
|
|
209
|
+
installedCli,
|
|
210
|
+
syncTarget,
|
|
211
|
+
message: `PATH resolves gsd-browser to ${pathCli}, but the updated global install is at ${installedCli}. ` +
|
|
212
|
+
'Move your package manager global bin directory ahead of the stale location on PATH, or update the stale binary manually.',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
@@ -9,7 +9,7 @@ function hasPnpmPath(value) {
|
|
|
9
9
|
normalized.endsWith('/pnpm.cjs') ||
|
|
10
10
|
normalized.endsWith('/pnpm.js'));
|
|
11
11
|
}
|
|
12
|
-
function pathStartsWith(pathValue, dir) {
|
|
12
|
+
export function pathStartsWith(pathValue, dir) {
|
|
13
13
|
if (!pathValue)
|
|
14
14
|
return false;
|
|
15
15
|
const resolvedPath = resolvePath(pathValue);
|
|
@@ -174,6 +174,9 @@ description: ... # What it does AND when to use it (third person)
|
|
|
174
174
|
---
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
+
Frontmatter must parse as YAML. Quote description values containing `:` or use
|
|
178
|
+
a folded block (`description: >`) for longer trigger descriptions.
|
|
179
|
+
|
|
177
180
|
Name conventions: `create-*`, `manage-*`, `setup-*`, `generate-*`, `build-*`
|
|
178
181
|
</yaml_requirements>
|
|
179
182
|
|