@opengsd/gsd-pi 1.2.0-dev.e8563f58 → 1.2.0-dev.fbdca60b
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +3 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +18 -6
- package/dist/resources/extensions/gsd/auto-start.js +23 -3
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +45 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- 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/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +3 -1
- 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/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- 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/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- 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-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -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 +50 -6
- 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 +2 -0
- 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 +34 -5
- 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.d.ts +1 -0
- 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 +17 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +10 -16
- package/src/resources/extensions/gsd/auto-dispatch.ts +11 -10
- package/src/resources/extensions/gsd/auto-post-unit.ts +21 -6
- package/src/resources/extensions/gsd/auto-start.ts +24 -4
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +56 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- 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/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +3 -1
- 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/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- 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/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -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 +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- 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 +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- 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/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- 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/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- 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/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- 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-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ModelRegistry as ModelRegistryInstance } from '@gsd/pi-coding-agent';
|
|
2
|
+
/**
|
|
3
|
+
* Apply the --model CLI flag override to the active session.
|
|
4
|
+
* Searches available models by exact id or provider/id pattern and warns
|
|
5
|
+
* on stderr when the requested model is not found in the registry.
|
|
6
|
+
*
|
|
7
|
+
* The setModel call is intentionally fire-and-forget: provider readiness
|
|
8
|
+
* checks run later in startup so --model does not block session creation.
|
|
9
|
+
*/
|
|
10
|
+
export declare function applyModelOverride(session: {
|
|
11
|
+
setModel(model: {
|
|
12
|
+
provider: string;
|
|
13
|
+
id: string;
|
|
14
|
+
}): unknown | Promise<unknown>;
|
|
15
|
+
}, modelRegistry: ModelRegistryInstance, modelFlag: string | undefined): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply the --model CLI flag override to the active session.
|
|
3
|
+
* Searches available models by exact id or provider/id pattern and warns
|
|
4
|
+
* on stderr when the requested model is not found in the registry.
|
|
5
|
+
*
|
|
6
|
+
* The setModel call is intentionally fire-and-forget: provider readiness
|
|
7
|
+
* checks run later in startup so --model does not block session creation.
|
|
8
|
+
*/
|
|
9
|
+
export function applyModelOverride(session, modelRegistry, modelFlag) {
|
|
10
|
+
if (!modelFlag)
|
|
11
|
+
return;
|
|
12
|
+
const available = modelRegistry.getAvailable();
|
|
13
|
+
const match = available.find((m) => m.id === modelFlag) ||
|
|
14
|
+
available.find((m) => `${m.provider}/${m.id}` === modelFlag);
|
|
15
|
+
if (match) {
|
|
16
|
+
void session.setModel(match);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
process.stderr.write(`[gsd] Warning: Model "${modelFlag}" not found. Using configured default.\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
package/dist/cli.js
CHANGED
|
@@ -14,6 +14,7 @@ import { printHelp, printSubcommandHelp } from './help-text.js';
|
|
|
14
14
|
import { applySecurityOverrides } from './security-overrides.js';
|
|
15
15
|
import { validateConfiguredModel } from './startup-model-validation.js';
|
|
16
16
|
import { migrateAnthropicDefaultToClaudeCode } from './provider-migrations.js';
|
|
17
|
+
import { applyModelOverride } from './cli-model-override.js';
|
|
17
18
|
import { buildHeadlessAutoArgs, parseCliArgs, runWebCliBranch, migrateLegacyFlatSessions, } from './cli-web-branch.js';
|
|
18
19
|
import { stopWebMode } from './web-mode.js';
|
|
19
20
|
import { getProjectSessionsDir } from './project-sessions.js';
|
|
@@ -122,24 +123,6 @@ async function reapplyValidatedModelOnFallback(session, modelRegistry, settingsM
|
|
|
122
123
|
// Provider not ready — leave session on its current model
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
|
-
/**
|
|
126
|
-
* Apply the --model CLI flag override to the active session.
|
|
127
|
-
* Searches available models by exact id or provider/id pattern and warns
|
|
128
|
-
* on stderr when the requested model is not found in the registry.
|
|
129
|
-
*/
|
|
130
|
-
function applyModelOverride(session, modelRegistry, modelFlag) {
|
|
131
|
-
if (!modelFlag)
|
|
132
|
-
return;
|
|
133
|
-
const available = modelRegistry.getAvailable();
|
|
134
|
-
const match = available.find((m) => m.id === modelFlag) ||
|
|
135
|
-
available.find((m) => `${m.provider}/${m.id}` === modelFlag);
|
|
136
|
-
if (match) {
|
|
137
|
-
void session.setModel(match);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
process.stderr.write(`[gsd] Warning: Model "${modelFlag}" not found. Using configured default.\n`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
126
|
const cliFlags = parseCliArgs(process.argv);
|
|
144
127
|
const isPrintMode = cliFlags.print || cliFlags.mode !== undefined;
|
|
145
128
|
// `gsd [subcommand] --help` / `-h` — print help before any subcommand runs.
|
package/dist/loader.js
CHANGED
|
@@ -31,7 +31,7 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
31
31
|
// package.json (already parsed above) and verifies git is available.
|
|
32
32
|
// ---------------------------------------------------------------------------
|
|
33
33
|
{
|
|
34
|
-
const { MIN_NODE_MAJOR, checkNodeVersion,
|
|
34
|
+
const { MIN_NODE_MAJOR, checkNodeVersion, gitAvailableOnPath } = await import('./runtime-checks.js');
|
|
35
35
|
const red = '\x1b[31m';
|
|
36
36
|
const bold = '\x1b[1m';
|
|
37
37
|
const dim = '\x1b[2m';
|
|
@@ -48,8 +48,10 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
48
48
|
process.exit(1);
|
|
49
49
|
}
|
|
50
50
|
// -- git --
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
// Presence-check git via a $PATH scan rather than spawning `git --version`:
|
|
52
|
+
// the subprocess cost ~15ms on every cold start (~5% of startup CPU) just to
|
|
53
|
+
// confirm git is installed.
|
|
54
|
+
const gitOk = gitAvailableOnPath();
|
|
53
55
|
if (!gitOk) {
|
|
54
56
|
process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires git but it was not found on PATH.\n\n` +
|
|
55
57
|
`${dim}Install git:${reset}\n` +
|
|
@@ -230,6 +232,6 @@ if (missingPackages.length > 0) {
|
|
|
230
232
|
}
|
|
231
233
|
// Register GSD agent packages for extension imports before CLI loads.
|
|
232
234
|
const { registerAgentBundles } = await import('./register-agent-bundles.js');
|
|
233
|
-
registerAgentBundles();
|
|
235
|
+
await registerAgentBundles();
|
|
234
236
|
// Dynamic import defers ESM evaluation — config.js will see PI_PACKAGE_DIR above
|
|
235
237
|
await import('./cli.js');
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Register GSD agent packages for extension virtual module resolution.
|
|
3
|
+
*
|
|
4
|
+
* The eager `@gsd/agent-core` and `@gsd/agent-modes` barrels are only consumed
|
|
5
|
+
* by the Bun-binary extension loader (which has no filesystem and resolves
|
|
6
|
+
* bundled packages through `virtualModules`). On the Node/dev path the loader
|
|
7
|
+
* resolves those same specifiers by file path via `getAliases()`, so importing
|
|
8
|
+
* the full barrels at startup there is ~400ms of wasted module loading.
|
|
9
|
+
* Load them only when actually needed (Bun), keeping Node startup lean.
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerAgentBundles(): Promise<void>;
|
|
@@ -1,12 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as agentModes from '@gsd/agent-modes';
|
|
1
|
+
import { isBunBinary } from '@gsd/pi-coding-agent/config.js';
|
|
3
2
|
import { registerExtensionBundledModules } from '@gsd/pi-coding-agent/core/extensions/loader.js';
|
|
4
3
|
let registered = false;
|
|
5
|
-
/**
|
|
6
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Register GSD agent packages for extension virtual module resolution.
|
|
6
|
+
*
|
|
7
|
+
* The eager `@gsd/agent-core` and `@gsd/agent-modes` barrels are only consumed
|
|
8
|
+
* by the Bun-binary extension loader (which has no filesystem and resolves
|
|
9
|
+
* bundled packages through `virtualModules`). On the Node/dev path the loader
|
|
10
|
+
* resolves those same specifiers by file path via `getAliases()`, so importing
|
|
11
|
+
* the full barrels at startup there is ~400ms of wasted module loading.
|
|
12
|
+
* Load them only when actually needed (Bun), keeping Node startup lean.
|
|
13
|
+
*/
|
|
14
|
+
export async function registerAgentBundles() {
|
|
7
15
|
if (registered)
|
|
8
16
|
return;
|
|
9
17
|
registered = true;
|
|
18
|
+
if (!isBunBinary)
|
|
19
|
+
return;
|
|
20
|
+
const [agentCore, agentModes] = await Promise.all([
|
|
21
|
+
import('@gsd/agent-core'),
|
|
22
|
+
import('@gsd/agent-modes'),
|
|
23
|
+
]);
|
|
10
24
|
registerExtensionBundledModules({
|
|
11
25
|
'@gsd/agent-core': agentCore,
|
|
12
26
|
'@gsd/agent-modes': agentModes,
|
|
@@ -22,6 +22,9 @@ export declare function readManagedResourceVersion(agentDir: string): string | n
|
|
|
22
22
|
* directory (e.g. pre-install verification).
|
|
23
23
|
*/
|
|
24
24
|
export declare function computeResourceFingerprint(rootDir?: string): string;
|
|
25
|
+
export declare function setGsdBrowserPackageSkillPathForTests(skillPath: string | null | undefined): void;
|
|
26
|
+
export declare function collectGsdBrowserPackageSkillReferences(content: string): string[];
|
|
27
|
+
export declare function hasStaleGsdBrowserPackageSkill(skillsDir: string): boolean;
|
|
25
28
|
export declare function getNewerManagedResourceVersion(agentDir: string, currentVersion: string): string | null;
|
|
26
29
|
/**
|
|
27
30
|
* Syncs a single bundled resource directory into the agent directory.
|
|
@@ -49,18 +52,20 @@ export declare function reconcileMergedNodeModules(agentNodeModules: string, hoi
|
|
|
49
52
|
/** Build a cache fingerprint from packageRoot + sorted entry names of both directories */
|
|
50
53
|
export declare function mergedFingerprint(hoisted: string, internal: string): string;
|
|
51
54
|
/**
|
|
52
|
-
*
|
|
55
|
+
* Initializes managed resources under agentDir (~/.gsd/agent/).
|
|
53
56
|
*
|
|
54
57
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
55
58
|
* - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
|
|
56
59
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
57
60
|
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
61
|
+
* - gsd-browser skill → ~/.gsd/agent/skills/gsd-browser/ from @opengsd/gsd-browser
|
|
58
62
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
59
63
|
*
|
|
60
|
-
* Skips the copy when the managed-resources.json version
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
+
* Skips the full copy only when the managed-resources.json version, content
|
|
65
|
+
* fingerprint, and package-owned gsd-browser skill all match the current
|
|
66
|
+
* install, avoiding ~128ms of synchronous cpSync on steady-state startup.
|
|
67
|
+
* After `npm update -g @opengsd/gsd-pi`, versions will differ and the copy
|
|
68
|
+
* runs once to land the new resources.
|
|
64
69
|
*
|
|
65
70
|
* Inspectable: `ls ~/.gsd/agent/extensions/`
|
|
66
71
|
*/
|
package/dist/resource-loader.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, readdirSync, rmSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
4
5
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
5
6
|
import { fileURLToPath } from 'node:url';
|
|
6
7
|
import { compareSemver } from './update-check.js';
|
|
@@ -24,6 +25,10 @@ const resourcesDir = resolveBundledResourcesDirFromPackageRoot(packageRoot);
|
|
|
24
25
|
const bundledExtensionsDir = join(resourcesDir, 'extensions');
|
|
25
26
|
const resourceVersionManifestName = 'managed-resources.json';
|
|
26
27
|
const resourceFingerprintFileName = '.managed-resources-content-hash';
|
|
28
|
+
const gsdBrowserSkillName = 'gsd-browser';
|
|
29
|
+
const requireFromResourceLoader = createRequire(import.meta.url);
|
|
30
|
+
const gsdBrowserSkillReferenceDirs = ['docs', 'scripts', 'gsd-browser-skill'];
|
|
31
|
+
let gsdBrowserPackageSkillPathForTests;
|
|
27
32
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
28
33
|
export function getExtensionKey(entryPath, extensionsDir) {
|
|
29
34
|
const relPath = relative(extensionsDir, entryPath);
|
|
@@ -153,6 +158,111 @@ function getCurrentResourceFingerprint() {
|
|
|
153
158
|
}
|
|
154
159
|
return computeResourceFingerprint();
|
|
155
160
|
}
|
|
161
|
+
function resolveGsdBrowserPackageSkillPath() {
|
|
162
|
+
if (gsdBrowserPackageSkillPathForTests !== undefined) {
|
|
163
|
+
return gsdBrowserPackageSkillPathForTests;
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
return requireFromResourceLoader.resolve('@opengsd/gsd-browser/SKILL.md');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export function setGsdBrowserPackageSkillPathForTests(skillPath) {
|
|
173
|
+
gsdBrowserPackageSkillPathForTests = skillPath;
|
|
174
|
+
}
|
|
175
|
+
export function collectGsdBrowserPackageSkillReferences(content) {
|
|
176
|
+
const refs = new Set();
|
|
177
|
+
const referencePattern = /`((?:\.\/)?(?:docs|scripts|gsd-browser-skill)\/[^`\s]+)`/g;
|
|
178
|
+
for (const match of content.matchAll(referencePattern)) {
|
|
179
|
+
const ref = normalizeGsdBrowserPackageSkillReference(match[1]);
|
|
180
|
+
if (ref)
|
|
181
|
+
refs.add(ref);
|
|
182
|
+
}
|
|
183
|
+
return [...refs].sort();
|
|
184
|
+
}
|
|
185
|
+
function normalizeGsdBrowserPackageSkillReference(ref) {
|
|
186
|
+
if (!ref)
|
|
187
|
+
return null;
|
|
188
|
+
const normalized = ref
|
|
189
|
+
.replace(/^\.\//, '')
|
|
190
|
+
.replace(/[),.;:]+$/, '');
|
|
191
|
+
if (normalized.includes('..') || normalized.startsWith('/'))
|
|
192
|
+
return null;
|
|
193
|
+
if (!gsdBrowserSkillReferenceDirs.some(dir => normalized === dir || normalized.startsWith(`${dir}/`))) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
return normalized;
|
|
197
|
+
}
|
|
198
|
+
function readGsdBrowserPackageSkillBundle(sourceSkillPath) {
|
|
199
|
+
const skillContent = readFileSync(sourceSkillPath);
|
|
200
|
+
const files = new Map([['SKILL.md', skillContent]]);
|
|
201
|
+
const supportRefs = collectGsdBrowserPackageSkillReferences(skillContent.toString('utf-8'));
|
|
202
|
+
const sourceDir = dirname(sourceSkillPath);
|
|
203
|
+
for (const relPath of supportRefs) {
|
|
204
|
+
const sourcePath = join(sourceDir, relPath);
|
|
205
|
+
if (existsSync(sourcePath)) {
|
|
206
|
+
files.set(relPath, readFileSync(sourcePath));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return files;
|
|
210
|
+
}
|
|
211
|
+
export function hasStaleGsdBrowserPackageSkill(skillsDir) {
|
|
212
|
+
const targetDir = join(skillsDir, gsdBrowserSkillName);
|
|
213
|
+
const sourceSkillPath = resolveGsdBrowserPackageSkillPath();
|
|
214
|
+
// Package unresolvable. syncGsdBrowserPackageSkill is a no-op in this case
|
|
215
|
+
// (it preserves any existing managed skill), so reporting "stale" here
|
|
216
|
+
// would drive a full resource resync on every launch that the sync cannot
|
|
217
|
+
// actually satisfy. Keep the existing managed skill in place until the
|
|
218
|
+
// package becomes resolvable again or the manifest fingerprint changes.
|
|
219
|
+
if (!sourceSkillPath)
|
|
220
|
+
return false;
|
|
221
|
+
try {
|
|
222
|
+
const sourceDir = dirname(sourceSkillPath);
|
|
223
|
+
const skillContent = readFileSync(sourceSkillPath, 'utf-8');
|
|
224
|
+
for (const [relPath, content] of readGsdBrowserPackageSkillBundle(sourceSkillPath)) {
|
|
225
|
+
const targetPath = join(targetDir, relPath);
|
|
226
|
+
if (!existsSync(targetPath) || !readFileSync(targetPath).equals(content)) {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Only flag SKILL.md references when sync can actually correct them.
|
|
231
|
+
// The bundle loop above already covers "source has it, target missing".
|
|
232
|
+
// A reference the package itself does not ship (source missing) is only
|
|
233
|
+
// worth a resync if the target still has a stale copy that sync should
|
|
234
|
+
// clean up; missing on both sides is the steady state when upstream
|
|
235
|
+
// omits files referenced from SKILL.md and is not actionable here.
|
|
236
|
+
for (const relPath of collectGsdBrowserPackageSkillReferences(skillContent)) {
|
|
237
|
+
const sourcePath = join(sourceDir, relPath);
|
|
238
|
+
const targetPath = join(targetDir, relPath);
|
|
239
|
+
if (!existsSync(sourcePath) && existsSync(targetPath)) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function syncGsdBrowserPackageSkill(skillsDir) {
|
|
250
|
+
const targetDir = join(skillsDir, gsdBrowserSkillName);
|
|
251
|
+
const sourceSkillPath = resolveGsdBrowserPackageSkillPath();
|
|
252
|
+
if (!sourceSkillPath)
|
|
253
|
+
return;
|
|
254
|
+
makeTreeWritable(targetDir);
|
|
255
|
+
rmSync(targetDir, { recursive: true, force: true });
|
|
256
|
+
for (const [relPath, content] of readGsdBrowserPackageSkillBundle(sourceSkillPath)) {
|
|
257
|
+
const targetPath = join(targetDir, relPath);
|
|
258
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
259
|
+
writeFileSync(targetPath, content);
|
|
260
|
+
if (relPath.startsWith('scripts/') && relPath.endsWith('.sh')) {
|
|
261
|
+
chmodSync(targetPath, 0o755);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
makeTreeWritable(targetDir);
|
|
265
|
+
}
|
|
156
266
|
function collectFileEntries(dir, root, out) {
|
|
157
267
|
if (!existsSync(dir))
|
|
158
268
|
return;
|
|
@@ -557,18 +667,20 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
557
667
|
removeFileIfStale('env-utils.js');
|
|
558
668
|
}
|
|
559
669
|
/**
|
|
560
|
-
*
|
|
670
|
+
* Initializes managed resources under agentDir (~/.gsd/agent/).
|
|
561
671
|
*
|
|
562
672
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
563
673
|
* - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
|
|
564
674
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
565
675
|
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
676
|
+
* - gsd-browser skill → ~/.gsd/agent/skills/gsd-browser/ from @opengsd/gsd-browser
|
|
566
677
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
567
678
|
*
|
|
568
|
-
* Skips the copy when the managed-resources.json version
|
|
569
|
-
*
|
|
570
|
-
*
|
|
571
|
-
*
|
|
679
|
+
* Skips the full copy only when the managed-resources.json version, content
|
|
680
|
+
* fingerprint, and package-owned gsd-browser skill all match the current
|
|
681
|
+
* install, avoiding ~128ms of synchronous cpSync on steady-state startup.
|
|
682
|
+
* After `npm update -g @opengsd/gsd-pi`, versions will differ and the copy
|
|
683
|
+
* runs once to land the new resources.
|
|
572
684
|
*
|
|
573
685
|
* Inspectable: `ls ~/.gsd/agent/extensions/`
|
|
574
686
|
*/
|
|
@@ -603,11 +715,13 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
|
|
|
603
715
|
const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
|
|
604
716
|
const hasMissingSharedFiles = hasMissingBundledResourceFiles(join(agentDir, 'shared'), join(resourcesDir, 'shared'));
|
|
605
717
|
const hasMissingSkillFiles = hasMissingBundledResourceFiles(skillsDir, join(resourcesDir, 'skills'));
|
|
718
|
+
const hasStaleGsdBrowserSkill = hasStaleGsdBrowserPackageSkill(skillsDir);
|
|
606
719
|
if (manifest.contentHash &&
|
|
607
720
|
manifest.contentHash === currentHash &&
|
|
608
721
|
!hasStaleExtensionFiles &&
|
|
609
722
|
!hasMissingSharedFiles &&
|
|
610
|
-
!hasMissingSkillFiles
|
|
723
|
+
!hasMissingSkillFiles &&
|
|
724
|
+
!hasStaleGsdBrowserSkill) {
|
|
611
725
|
return;
|
|
612
726
|
}
|
|
613
727
|
}
|
|
@@ -616,6 +730,7 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
|
|
|
616
730
|
syncResourceDir(join(resourcesDir, 'shared'), join(agentDir, 'shared'));
|
|
617
731
|
syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
|
|
618
732
|
syncResourceDir(join(resourcesDir, 'skills'), skillsDir);
|
|
733
|
+
syncGsdBrowserPackageSkill(skillsDir);
|
|
619
734
|
// Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
|
|
620
735
|
// env var is not set (e.g. fork/dev builds, alternative entry points).
|
|
621
736
|
const workflowSrc = join(resourcesDir, 'GSD-WORKFLOW.md');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
e6a2fdc55c9bdca7
|
|
@@ -187,10 +187,11 @@ function formatForLLM(result) {
|
|
|
187
187
|
}
|
|
188
188
|
return JSON.stringify({ answers });
|
|
189
189
|
}
|
|
190
|
-
|
|
190
|
+
/** @internal Exported for testing only. */
|
|
191
|
+
export async function playQuestionBell(preferences, stream) {
|
|
191
192
|
try {
|
|
192
193
|
const { playNotificationBell } = await import("./gsd/notifications.js");
|
|
193
|
-
playNotificationBell("question");
|
|
194
|
+
playNotificationBell("question", preferences, stream);
|
|
194
195
|
}
|
|
195
196
|
catch {
|
|
196
197
|
// Best-effort: question rendering must never depend on alert delivery.
|