@opengsd/gsd-pi 1.0.2-dev.867e002 → 1.0.2-dev.cce3612
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/onboarding.js +22 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/context7/index.js +12 -2
- package/dist/resources/extensions/get-secrets-from-user.js +16 -16
- package/dist/resources/extensions/google-cli/index.js +30 -0
- package/dist/resources/extensions/google-cli/models.js +55 -0
- package/dist/resources/extensions/google-cli/package.json +11 -0
- package/dist/resources/extensions/google-cli/readiness.js +12 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
- package/dist/resources/extensions/gsd/auto/loop.js +62 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +37 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +18 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/auto.js +6 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
- package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
- package/dist/resources/extensions/gsd/commands-usage.js +105 -1
- package/dist/resources/extensions/gsd/config-overlay.js +20 -14
- package/dist/resources/extensions/gsd/context-overlay.js +22 -16
- package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
- package/dist/resources/extensions/gsd/doctor.js +6 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +5 -6
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
- package/dist/resources/extensions/gsd/preferences.js +14 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -3
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/repository-registry.js +3 -1
- package/dist/resources/extensions/gsd/skill-activation.js +233 -0
- package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
- package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
- package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
- package/dist/resources/extensions/gsd/skill-scope.js +52 -0
- package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
- package/dist/resources/extensions/gsd/skills.js +60 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
- package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
- package/dist/resources/extensions/gsd/vision-ask.js +22 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
- package/dist/resources/extensions/search-the-web/native-search.js +57 -8
- package/dist/resources/extensions/shared/confirm-ui.js +9 -6
- package/dist/resources/extensions/shared/dialog-frame.js +42 -0
- package/dist/resources/extensions/shared/interview-ui.js +42 -30
- package/dist/resources/extensions/shared/next-action-ui.js +6 -6
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- 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/session/agent-session-extensions.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.js +6 -0
- package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -59
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +21 -72
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +50 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
- package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/context7/index.ts +15 -2
- package/src/resources/extensions/get-secrets-from-user.ts +17 -16
- package/src/resources/extensions/google-cli/index.ts +34 -0
- package/src/resources/extensions/google-cli/models.ts +57 -0
- package/src/resources/extensions/google-cli/package.json +11 -0
- package/src/resources/extensions/google-cli/readiness.ts +15 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
- package/src/resources/extensions/gsd/auto/loop.ts +74 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +46 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/auto.ts +6 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +18 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
- package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
- package/src/resources/extensions/gsd/commands-usage.ts +110 -5
- package/src/resources/extensions/gsd/config-overlay.ts +19 -16
- package/src/resources/extensions/gsd/context-overlay.ts +24 -19
- package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +6 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +5 -6
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
- package/src/resources/extensions/gsd/preferences.ts +17 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -3
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/repository-registry.ts +3 -1
- package/src/resources/extensions/gsd/skill-activation.ts +292 -0
- package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
- package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
- package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
- package/src/resources/extensions/gsd/skill-scope.ts +63 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
- package/src/resources/extensions/gsd/skills.ts +75 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
- package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
- package/src/resources/extensions/gsd/vision-ask.ts +28 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
- package/src/resources/extensions/search-the-web/native-search.ts +60 -8
- package/src/resources/extensions/shared/confirm-ui.ts +8 -12
- package/src/resources/extensions/shared/dialog-frame.ts +71 -0
- package/src/resources/extensions/shared/interview-ui.ts +43 -42
- package/src/resources/extensions/shared/next-action-ui.ts +6 -6
- package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → orfEoZqDIo6Be_Z9ZFipD}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{praHP_OATcjBkvAVejjGK → orfEoZqDIo6Be_Z9ZFipD}/_ssgManifest.js +0 -0
|
@@ -2,26 +2,23 @@
|
|
|
2
2
|
* GSD Skill Discovery
|
|
3
3
|
*
|
|
4
4
|
* Detects skills installed during auto-mode by comparing the current
|
|
5
|
-
*
|
|
5
|
+
* installed catalog and skill directories against a snapshot taken at auto-mode start.
|
|
6
6
|
*
|
|
7
|
-
* New skills are
|
|
8
|
-
*
|
|
7
|
+
* New skills are surfaced via resource reload when possible, with a fallback
|
|
8
|
+
* prompt block when reload fails before the next agent turn.
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
11
|
import { homedir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
13
|
import { gsdHome } from "./gsd-home.js";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const SKILLS_DIR = join(homedir(), ".agents", "skills");
|
|
17
|
-
const CLAUDE_SKILLS_DIR = join(homedir(), ".claude", "skills");
|
|
18
|
-
/** Snapshot of skill names at auto-mode start */
|
|
14
|
+
import { getInstalledSkills, normalizeSkillName } from "./skills.js";
|
|
15
|
+
/** Snapshot of normalized skill names at auto-mode start */
|
|
19
16
|
let baselineSkills = null;
|
|
20
17
|
/**
|
|
21
|
-
* Snapshot the current
|
|
18
|
+
* Snapshot the current installed skill catalog. Call at auto-mode start.
|
|
22
19
|
*/
|
|
23
20
|
export function snapshotSkills() {
|
|
24
|
-
baselineSkills =
|
|
21
|
+
baselineSkills = snapshotCurrentSkillNames();
|
|
25
22
|
}
|
|
26
23
|
/**
|
|
27
24
|
* Clear the snapshot. Call when auto-mode stops.
|
|
@@ -37,80 +34,140 @@ export function hasSkillSnapshot() {
|
|
|
37
34
|
}
|
|
38
35
|
/**
|
|
39
36
|
* Detect skills installed since the snapshot was taken.
|
|
40
|
-
* Returns skill metadata for any new skills found.
|
|
37
|
+
* Returns skill metadata for any new skills found in the loader catalog or on disk.
|
|
41
38
|
*/
|
|
42
39
|
export function detectNewSkills() {
|
|
43
40
|
if (!baselineSkills)
|
|
44
41
|
return [];
|
|
45
|
-
const current = listSkillDirs();
|
|
46
42
|
const newSkills = [];
|
|
47
|
-
for (const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// Check both skill directories for the SKILL.md file
|
|
51
|
-
const skillMdPath = resolveSkillMdPath(dir);
|
|
52
|
-
if (!skillMdPath)
|
|
43
|
+
for (const skill of getCurrentSkillsForDiscovery()) {
|
|
44
|
+
const normalized = normalizeSkillName(skill.name);
|
|
45
|
+
if (baselineSkills.has(normalized))
|
|
53
46
|
continue;
|
|
54
|
-
|
|
55
|
-
if (meta) {
|
|
56
|
-
newSkills.push({
|
|
57
|
-
name: meta.name || dir,
|
|
58
|
-
description: meta.description || `Skill: ${dir}`,
|
|
59
|
-
location: skillMdPath,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
47
|
+
newSkills.push(skill);
|
|
62
48
|
}
|
|
63
49
|
return newSkills;
|
|
64
50
|
}
|
|
65
51
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
52
|
+
* Reload the skill catalog when auto-mode detects newly installed skills.
|
|
53
|
+
* Returns discovered skills even if reload fails so callers can surface them
|
|
54
|
+
* in the prompt. Updates the snapshot baseline only after a successful reload
|
|
55
|
+
* so detection is retried after failures.
|
|
68
56
|
*/
|
|
69
|
-
export function
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
57
|
+
export async function refreshCatalogForNewSkills(options) {
|
|
58
|
+
const newSkills = detectNewSkills();
|
|
59
|
+
if (newSkills.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
if (options?.reload) {
|
|
62
|
+
try {
|
|
63
|
+
await options.reload();
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
|
+
options.notify?.(`GSD: failed to reload skill catalog: ${message}`, "warning");
|
|
68
|
+
return newSkills;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
snapshotSkills();
|
|
72
|
+
const names = newSkills.map((skill) => skill.name).join(", ");
|
|
73
|
+
options?.notify?.(`GSD: loaded new skills: ${names}`, "info");
|
|
74
|
+
return newSkills;
|
|
75
|
+
}
|
|
76
|
+
export function appendDiscoveredSkillsFallback(systemPrompt, skills) {
|
|
77
|
+
const missingSkills = skills.filter(skill => !systemPrompt.includes(skill.location));
|
|
78
|
+
if (missingSkills.length === 0)
|
|
79
|
+
return systemPrompt;
|
|
80
|
+
return `${systemPrompt}\n\n${formatDiscoveredSkillsXml(missingSkills)}`;
|
|
83
81
|
}
|
|
84
82
|
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
83
|
+
function formatDiscoveredSkillsXml(skills) {
|
|
84
|
+
const lines = [
|
|
85
|
+
"<newly_discovered_skills>",
|
|
86
|
+
" <note>These skills were detected after this session started and may be absent from <available_skills>. If relevant, read the skill file at its location before using it.</note>",
|
|
87
|
+
];
|
|
88
|
+
for (const skill of skills) {
|
|
89
|
+
lines.push(" <skill>", ` <name>${escapeXml(skill.name)}</name>`, ` <description>${escapeXml(skill.description)}</description>`, ` <location>${escapeXml(skill.location)}</location>`, " </skill>");
|
|
92
90
|
}
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
lines.push("</newly_discovered_skills>");
|
|
92
|
+
return lines.join("\n");
|
|
93
|
+
}
|
|
94
|
+
function escapeXml(value) {
|
|
95
|
+
return value.replace(/[<>&'"]/g, (char) => {
|
|
96
|
+
switch (char) {
|
|
97
|
+
case "<": return "<";
|
|
98
|
+
case ">": return ">";
|
|
99
|
+
case "&": return "&";
|
|
100
|
+
case "'": return "'";
|
|
101
|
+
case "\"": return """;
|
|
102
|
+
default: return char;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function skillSearchDirs() {
|
|
107
|
+
return [
|
|
108
|
+
join(gsdHome(), "agent", "skills"),
|
|
109
|
+
join(homedir(), ".agents", "skills"),
|
|
110
|
+
join(homedir(), ".claude", "skills"),
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
function snapshotCurrentSkillNames() {
|
|
114
|
+
return new Set(getCurrentSkillsForDiscovery().map(skill => normalizeSkillName(skill.name)));
|
|
115
|
+
}
|
|
116
|
+
function getCurrentSkillsForDiscovery() {
|
|
117
|
+
const skills = new Map();
|
|
118
|
+
for (const skill of getInstalledSkills()) {
|
|
119
|
+
const normalized = normalizeSkillName(skill.name);
|
|
120
|
+
skills.set(normalized, {
|
|
121
|
+
name: skill.name,
|
|
122
|
+
description: skill.description || `Skill: ${skill.name}`,
|
|
123
|
+
location: skill.filePath,
|
|
124
|
+
});
|
|
95
125
|
}
|
|
126
|
+
for (const skill of getDiskSkills()) {
|
|
127
|
+
const normalized = normalizeSkillName(skill.name);
|
|
128
|
+
if (!skills.has(normalized))
|
|
129
|
+
skills.set(normalized, skill);
|
|
130
|
+
}
|
|
131
|
+
return [...skills.values()];
|
|
96
132
|
}
|
|
97
|
-
function
|
|
98
|
-
const
|
|
99
|
-
for (const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
133
|
+
function getDiskSkills() {
|
|
134
|
+
const skills = new Map();
|
|
135
|
+
for (const dir of skillSearchDirs()) {
|
|
136
|
+
if (!existsSync(dir))
|
|
137
|
+
continue;
|
|
138
|
+
let entries;
|
|
139
|
+
try {
|
|
140
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
147
|
+
continue;
|
|
148
|
+
const skillMdPath = join(dir, entry.name, "SKILL.md");
|
|
149
|
+
if (!existsSync(skillMdPath))
|
|
150
|
+
continue;
|
|
151
|
+
const meta = parseSkillFrontmatter(skillMdPath);
|
|
152
|
+
const name = meta?.name || entry.name;
|
|
153
|
+
const normalized = normalizeSkillName(name);
|
|
154
|
+
if (skills.has(normalized))
|
|
155
|
+
continue;
|
|
156
|
+
skills.set(normalized, {
|
|
157
|
+
name,
|
|
158
|
+
description: meta?.description || `Skill: ${name}`,
|
|
159
|
+
location: skillMdPath,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return [...skills.values()];
|
|
106
164
|
}
|
|
107
165
|
function parseSkillFrontmatter(path) {
|
|
108
166
|
try {
|
|
109
167
|
const content = readFileSync(path, "utf-8");
|
|
110
|
-
|
|
111
|
-
if (!content.startsWith('---\n'))
|
|
168
|
+
if (!content.startsWith("---\n"))
|
|
112
169
|
return null;
|
|
113
|
-
const endIdx = content.indexOf(
|
|
170
|
+
const endIdx = content.indexOf("\n---", 4);
|
|
114
171
|
if (endIdx === -1)
|
|
115
172
|
return null;
|
|
116
173
|
const fm = content.slice(4, endIdx);
|
|
@@ -127,18 +184,3 @@ function parseSkillFrontmatter(path) {
|
|
|
127
184
|
return null;
|
|
128
185
|
}
|
|
129
186
|
}
|
|
130
|
-
function resolveSkillMdPath(skillName) {
|
|
131
|
-
for (const dir of [GSD_SKILLS_DIR, SKILLS_DIR, CLAUDE_SKILLS_DIR]) {
|
|
132
|
-
const candidate = join(dir, skillName, "SKILL.md");
|
|
133
|
-
if (existsSync(candidate))
|
|
134
|
-
return candidate;
|
|
135
|
-
}
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
function escapeXml(text) {
|
|
139
|
-
return text
|
|
140
|
-
.replace(/&/g, "&")
|
|
141
|
-
.replace(/</g, "<")
|
|
142
|
-
.replace(/>/g, ">")
|
|
143
|
-
.replace(/"/g, """);
|
|
144
|
-
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-unit skill catalog scoping for GSD auto and workflow dispatch.
|
|
3
|
+
*/
|
|
4
|
+
import { resolveSkillManifest } from "./skill-manifest.js";
|
|
5
|
+
import { normalizeSkillName } from "./skills.js";
|
|
6
|
+
import { resolveManifest } from "./unit-context-manifest.js";
|
|
7
|
+
/**
|
|
8
|
+
* Resolve which skill names should appear in `<available_skills>` for a unit.
|
|
9
|
+
* Returns `undefined` for full catalog, `[]` for suppressed catalog, or a
|
|
10
|
+
* name list for allowlist mode.
|
|
11
|
+
*/
|
|
12
|
+
export function resolveVisibleSkillNames(unitType) {
|
|
13
|
+
if (!unitType)
|
|
14
|
+
return undefined;
|
|
15
|
+
const unitManifest = resolveManifest(unitType);
|
|
16
|
+
if (unitManifest) {
|
|
17
|
+
switch (unitManifest.skills.mode) {
|
|
18
|
+
case "none":
|
|
19
|
+
return [];
|
|
20
|
+
case "all":
|
|
21
|
+
return undefined;
|
|
22
|
+
case "allowlist":
|
|
23
|
+
return [...unitManifest.skills.skills];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const legacyAllowlist = resolveSkillManifest(unitType);
|
|
27
|
+
return legacyAllowlist ?? undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Whether this unit narrows or suppresses the skill catalog (not mode "all"). */
|
|
30
|
+
export function unitHasSkillManifest(unitType) {
|
|
31
|
+
if (!unitType)
|
|
32
|
+
return false;
|
|
33
|
+
const unitManifest = resolveManifest(unitType);
|
|
34
|
+
if (unitManifest) {
|
|
35
|
+
return unitManifest.skills.mode !== "all";
|
|
36
|
+
}
|
|
37
|
+
return resolveSkillManifest(unitType) !== null;
|
|
38
|
+
}
|
|
39
|
+
/** Apply unit manifest skill policy via setVisibleSkills. */
|
|
40
|
+
export function applyUnitSkillVisibility(pi, unitType) {
|
|
41
|
+
pi.setVisibleSkills(resolveVisibleSkillNames(unitType));
|
|
42
|
+
}
|
|
43
|
+
/** Installed skill names visible for a unit per manifest policy. */
|
|
44
|
+
export function effectiveSkillNamesForUnit(unitType, installed) {
|
|
45
|
+
const visible = resolveVisibleSkillNames(unitType);
|
|
46
|
+
if (visible === undefined)
|
|
47
|
+
return installed;
|
|
48
|
+
if (visible.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const allowed = new Set(visible.map(normalizeSkillName));
|
|
51
|
+
return installed.filter((name) => allowed.has(normalizeSkillName(name)));
|
|
52
|
+
}
|
|
@@ -6,14 +6,11 @@
|
|
|
6
6
|
* "actively loaded" skills (read via tool calls during execution).
|
|
7
7
|
*
|
|
8
8
|
* Data flow:
|
|
9
|
-
* 1. At dispatch, captureAvailableSkills() records
|
|
9
|
+
* 1. At dispatch, captureAvailableSkills(names) records catalog skill names
|
|
10
10
|
* 2. During execution, recordSkillRead() tracks explicit SKILL.md reads
|
|
11
11
|
* 3. At unit completion, getAndClearSkills() returns the loaded list for metrics
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
14
|
-
import { join } from "node:path";
|
|
15
|
-
import { gsdHome } from "./gsd-home.js";
|
|
16
|
-
import { homedir } from "node:os";
|
|
13
|
+
import { getInstalledSkillNames } from "./skills.js";
|
|
17
14
|
// ─── In-memory state ──────────────────────────────────────────────────────────
|
|
18
15
|
/** Skills available in the system prompt for the current unit */
|
|
19
16
|
let availableSkills = [];
|
|
@@ -22,17 +19,10 @@ const activelyLoadedSkills = new Set();
|
|
|
22
19
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
23
20
|
/**
|
|
24
21
|
* Capture the list of available skill names at dispatch time.
|
|
25
|
-
*
|
|
22
|
+
* Callers should pass names from resourceLoader / {@link getInstalledSkillNames}.
|
|
26
23
|
*/
|
|
27
|
-
export function captureAvailableSkills() {
|
|
28
|
-
|
|
29
|
-
const skillsDir = join(homedir(), ".agents", "skills");
|
|
30
|
-
const claudeSkillsDir = join(homedir(), ".claude", "skills");
|
|
31
|
-
const gsdNames = listSkillNames(gsdSkillsDir);
|
|
32
|
-
const names = listSkillNames(skillsDir);
|
|
33
|
-
const claudeNames = listSkillNames(claudeSkillsDir);
|
|
34
|
-
const all = new Set([...gsdNames, ...names, ...claudeNames]);
|
|
35
|
-
availableSkills = [...all];
|
|
24
|
+
export function captureAvailableSkills(skillNames) {
|
|
25
|
+
availableSkills = [...skillNames];
|
|
36
26
|
activelyLoadedSkills.clear();
|
|
37
27
|
}
|
|
38
28
|
/**
|
|
@@ -91,16 +81,7 @@ export function detectStaleSkills(units, thresholdDays) {
|
|
|
91
81
|
const lastUsed = getSkillLastUsed(units);
|
|
92
82
|
const cutoff = Date.now() - (thresholdDays * 24 * 60 * 60 * 1000);
|
|
93
83
|
const stale = [];
|
|
94
|
-
|
|
95
|
-
const gsdSkillsDir = join(gsdHome(), "agent", "skills");
|
|
96
|
-
const skillsDir = join(homedir(), ".agents", "skills");
|
|
97
|
-
const claudeSkillsDir = join(homedir(), ".claude", "skills");
|
|
98
|
-
const installedSet = new Set([
|
|
99
|
-
...listSkillNames(gsdSkillsDir),
|
|
100
|
-
...listSkillNames(skillsDir),
|
|
101
|
-
...listSkillNames(claudeSkillsDir),
|
|
102
|
-
]);
|
|
103
|
-
const installed = [...installedSet];
|
|
84
|
+
const installed = getInstalledSkillNames();
|
|
104
85
|
for (const skill of installed) {
|
|
105
86
|
const lastTs = lastUsed.get(skill);
|
|
106
87
|
if (lastTs === undefined || lastTs < cutoff) {
|
|
@@ -109,17 +90,3 @@ export function detectStaleSkills(units, thresholdDays) {
|
|
|
109
90
|
}
|
|
110
91
|
return stale;
|
|
111
92
|
}
|
|
112
|
-
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
113
|
-
function listSkillNames(skillsDir) {
|
|
114
|
-
if (!existsSync(skillsDir))
|
|
115
|
-
return [];
|
|
116
|
-
try {
|
|
117
|
-
return readdirSync(skillsDir, { withFileTypes: true })
|
|
118
|
-
.filter(d => d.isDirectory() && !d.name.startsWith("."))
|
|
119
|
-
.filter(d => existsSync(join(skillsDir, d.name, "SKILL.md")))
|
|
120
|
-
.map(d => d.name);
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return [];
|
|
124
|
-
}
|
|
125
|
-
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical skill access for GSD extension code.
|
|
3
|
+
*
|
|
4
|
+
* Prefer {@link getInstalledSkills} (ResourceLoader / getLoadedSkills cache)
|
|
5
|
+
* over ad-hoc directory scans.
|
|
6
|
+
*/
|
|
7
|
+
import { getLoadedSkills } from "@gsd/pi-coding-agent";
|
|
8
|
+
import { resolveSkillReference } from "./preferences-skills.js";
|
|
9
|
+
/** Normalize a skill reference the same way preference matching does. */
|
|
10
|
+
export function normalizeSkillName(ref) {
|
|
11
|
+
return ref.trim().toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
/** Installed skills from the pi loader cache, or an explicit override (tests). */
|
|
14
|
+
export function getInstalledSkills(override) {
|
|
15
|
+
if (override)
|
|
16
|
+
return override;
|
|
17
|
+
return typeof getLoadedSkills === "function" ? getLoadedSkills() : [];
|
|
18
|
+
}
|
|
19
|
+
/** Skill names from the installed catalog. */
|
|
20
|
+
export function getInstalledSkillNames(skills) {
|
|
21
|
+
return getInstalledSkills(skills).map((skill) => skill.name);
|
|
22
|
+
}
|
|
23
|
+
/** Snapshot normalized skill names for auto-mode diffing. */
|
|
24
|
+
export function snapshotInstalledSkillNames(skills) {
|
|
25
|
+
return new Set(getInstalledSkillNames(skills).map(normalizeSkillName));
|
|
26
|
+
}
|
|
27
|
+
/** Names present now but absent from `baseline`. */
|
|
28
|
+
export function detectNewlyInstalledSkills(baseline, skills) {
|
|
29
|
+
const current = snapshotInstalledSkillNames(skills);
|
|
30
|
+
return [...current].filter((name) => !baseline.has(name));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a preference skill reference to a path, validating against the
|
|
34
|
+
* installed catalog when loader data is available.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveInstalledSkill(ref, cwd, skills) {
|
|
37
|
+
const resolution = resolveSkillReference(ref, cwd);
|
|
38
|
+
const installed = getInstalledSkills(skills);
|
|
39
|
+
if (installed.length === 0) {
|
|
40
|
+
return resolution;
|
|
41
|
+
}
|
|
42
|
+
const byName = new Map(installed.map((skill) => [normalizeSkillName(skill.name), skill]));
|
|
43
|
+
const normalizedRef = normalizeSkillName(ref);
|
|
44
|
+
const byRef = byName.get(normalizedRef);
|
|
45
|
+
if (byRef) {
|
|
46
|
+
return {
|
|
47
|
+
...resolution,
|
|
48
|
+
resolvedPath: byRef.filePath,
|
|
49
|
+
method: resolution.method === "unresolved" ? "user-skill" : resolution.method,
|
|
50
|
+
skill: byRef,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (resolution.resolvedPath) {
|
|
54
|
+
const match = installed.find((skill) => skill.filePath === resolution.resolvedPath);
|
|
55
|
+
if (match) {
|
|
56
|
+
return { ...resolution, skill: match };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return resolution;
|
|
60
|
+
}
|