gsd-pi 2.29.0 → 2.30.0-dev.7e1bbce
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -17
- package/dist/cli.js +51 -0
- package/dist/extension-registry.d.ts +63 -0
- package/dist/extension-registry.js +166 -0
- package/dist/headless.js +4 -0
- package/dist/help-text.js +35 -0
- package/dist/loader.js +10 -1
- package/dist/resource-loader.js +11 -1
- package/dist/resources/extensions/async-jobs/extension-manifest.json +13 -0
- package/dist/resources/extensions/bg-shell/extension-manifest.json +14 -0
- package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/dist/resources/extensions/browser-tools/extension-manifest.json +37 -0
- package/dist/resources/extensions/context7/extension-manifest.json +12 -0
- package/dist/resources/extensions/google-search/extension-manifest.json +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +31 -0
- package/dist/resources/extensions/gsd/auto-dispatch.ts +32 -3
- package/dist/resources/extensions/gsd/auto-post-unit.ts +45 -13
- package/dist/resources/extensions/gsd/auto-prompts.ts +40 -17
- package/dist/resources/extensions/gsd/auto-recovery.ts +18 -23
- package/dist/resources/extensions/gsd/auto-start.ts +18 -32
- package/dist/resources/extensions/gsd/auto-worktree.ts +21 -182
- package/dist/resources/extensions/gsd/auto.ts +2 -24
- package/dist/resources/extensions/gsd/captures.ts +4 -10
- package/dist/resources/extensions/gsd/commands-extensions.ts +328 -0
- package/dist/resources/extensions/gsd/commands-handlers.ts +22 -2
- package/dist/resources/extensions/gsd/commands-logs.ts +13 -14
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/dist/resources/extensions/gsd/commands.ts +108 -24
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +2 -1
- package/dist/resources/extensions/gsd/detection.ts +2 -1
- package/dist/resources/extensions/gsd/doctor-checks.ts +49 -1
- package/dist/resources/extensions/gsd/doctor-types.ts +3 -1
- package/dist/resources/extensions/gsd/extension-manifest.json +18 -0
- package/dist/resources/extensions/gsd/forensics.ts +2 -2
- package/dist/resources/extensions/gsd/git-service.ts +3 -2
- package/dist/resources/extensions/gsd/gitignore.ts +9 -63
- package/dist/resources/extensions/gsd/gsd-db.ts +1 -165
- package/dist/resources/extensions/gsd/guided-flow.ts +8 -5
- package/dist/resources/extensions/gsd/index.ts +16 -3
- package/dist/resources/extensions/gsd/json-persistence.ts +16 -1
- package/dist/resources/extensions/gsd/md-importer.ts +3 -2
- package/dist/resources/extensions/gsd/mechanical-completion.ts +430 -0
- package/dist/resources/extensions/gsd/migrate/command.ts +3 -2
- package/dist/resources/extensions/gsd/migrate/writer.ts +2 -1
- package/dist/resources/extensions/gsd/migrate-external.ts +123 -0
- package/dist/resources/extensions/gsd/paths.ts +24 -2
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +6 -5
- package/dist/resources/extensions/gsd/preferences-models.ts +7 -1
- package/dist/resources/extensions/gsd/preferences-validation.ts +2 -1
- package/dist/resources/extensions/gsd/preferences.ts +10 -5
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/dist/resources/extensions/gsd/queue-order.ts +10 -11
- package/dist/resources/extensions/gsd/repo-identity.ts +148 -0
- package/dist/resources/extensions/gsd/resource-version.ts +99 -0
- package/dist/resources/extensions/gsd/roadmap-slices.ts +22 -7
- package/dist/resources/extensions/gsd/session-forensics.ts +4 -3
- package/dist/resources/extensions/gsd/session-lock.ts +53 -4
- package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
- package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +10 -37
- package/dist/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
- package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/dist/resources/extensions/gsd/triage-resolution.ts +2 -1
- package/dist/resources/extensions/gsd/types.ts +2 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/dist/resources/extensions/gsd/worktree-command.ts +1 -11
- package/dist/resources/extensions/gsd/worktree-manager.ts +3 -2
- package/dist/resources/extensions/gsd/worktree.ts +42 -5
- package/dist/resources/extensions/mac-tools/extension-manifest.json +16 -0
- package/dist/resources/extensions/mcp-client/index.ts +459 -0
- package/dist/resources/extensions/mcporter/extension-manifest.json +12 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +8 -19
- package/dist/resources/extensions/remote-questions/extension-manifest.json +11 -0
- package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -17
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
- package/dist/resources/extensions/search-the-web/extension-manifest.json +13 -0
- package/dist/resources/extensions/slash-commands/extension-manifest.json +11 -0
- package/dist/resources/extensions/subagent/extension-manifest.json +13 -0
- package/dist/resources/extensions/ttsr/extension-manifest.json +11 -0
- package/dist/resources/extensions/universal-config/extension-manifest.json +13 -0
- package/dist/resources/extensions/voice/extension-manifest.json +12 -0
- package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/dist/resources/skills/create-skill/SKILL.md +184 -0
- package/dist/resources/skills/create-skill/references/api-security.md +226 -0
- package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
- package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/dist/resources/skills/react-best-practices/SKILL.md +1 -1
- package/dist/worktree-cli.d.ts +34 -0
- package/dist/worktree-cli.js +294 -0
- package/dist/worktree-name-gen.d.ts +7 -0
- package/dist/worktree-name-gen.js +44 -0
- package/package.json +1 -1
- package/packages/native/dist/native.d.ts +2 -0
- package/packages/native/dist/native.js +19 -5
- package/packages/native/src/native.ts +23 -9
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +13 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +13 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
- package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
- package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
- package/src/resources/extensions/context7/extension-manifest.json +12 -0
- package/src/resources/extensions/google-search/extension-manifest.json +12 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +31 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +32 -3
- package/src/resources/extensions/gsd/auto-post-unit.ts +45 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +40 -17
- package/src/resources/extensions/gsd/auto-recovery.ts +18 -23
- package/src/resources/extensions/gsd/auto-start.ts +18 -32
- package/src/resources/extensions/gsd/auto-worktree.ts +21 -182
- package/src/resources/extensions/gsd/auto.ts +2 -24
- package/src/resources/extensions/gsd/captures.ts +4 -10
- package/src/resources/extensions/gsd/commands-extensions.ts +328 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +22 -2
- package/src/resources/extensions/gsd/commands-logs.ts +13 -14
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +44 -14
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/src/resources/extensions/gsd/commands.ts +108 -24
- package/src/resources/extensions/gsd/dashboard-overlay.ts +2 -1
- package/src/resources/extensions/gsd/detection.ts +2 -1
- package/src/resources/extensions/gsd/doctor-checks.ts +49 -1
- package/src/resources/extensions/gsd/doctor-types.ts +3 -1
- package/src/resources/extensions/gsd/extension-manifest.json +18 -0
- package/src/resources/extensions/gsd/forensics.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +3 -2
- package/src/resources/extensions/gsd/gitignore.ts +9 -63
- package/src/resources/extensions/gsd/gsd-db.ts +1 -165
- package/src/resources/extensions/gsd/guided-flow.ts +8 -5
- package/src/resources/extensions/gsd/index.ts +16 -3
- package/src/resources/extensions/gsd/json-persistence.ts +16 -1
- package/src/resources/extensions/gsd/md-importer.ts +3 -2
- package/src/resources/extensions/gsd/mechanical-completion.ts +430 -0
- package/src/resources/extensions/gsd/migrate/command.ts +3 -2
- package/src/resources/extensions/gsd/migrate/writer.ts +2 -1
- package/src/resources/extensions/gsd/migrate-external.ts +123 -0
- package/src/resources/extensions/gsd/paths.ts +24 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +6 -5
- package/src/resources/extensions/gsd/preferences-models.ts +7 -1
- package/src/resources/extensions/gsd/preferences-validation.ts +2 -1
- package/src/resources/extensions/gsd/preferences.ts +10 -5
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +4 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +26 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/src/resources/extensions/gsd/queue-order.ts +10 -11
- package/src/resources/extensions/gsd/repo-identity.ts +148 -0
- package/src/resources/extensions/gsd/resource-version.ts +99 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +22 -7
- package/src/resources/extensions/gsd/session-forensics.ts +4 -3
- package/src/resources/extensions/gsd/session-lock.ts +53 -4
- package/src/resources/extensions/gsd/session-status-io.ts +23 -41
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +60 -38
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +5 -18
- package/src/resources/extensions/gsd/tests/git-service.test.ts +10 -37
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +356 -0
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -1
- package/src/resources/extensions/gsd/types.ts +2 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/src/resources/extensions/gsd/worktree-command.ts +1 -11
- package/src/resources/extensions/gsd/worktree-manager.ts +3 -2
- package/src/resources/extensions/gsd/worktree.ts +42 -5
- package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
- package/src/resources/extensions/mcp-client/index.ts +459 -0
- package/src/resources/extensions/mcporter/extension-manifest.json +12 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +8 -19
- package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
- package/src/resources/extensions/remote-questions/http-client.ts +76 -0
- package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -17
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -19
- package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
- package/src/resources/extensions/subagent/extension-manifest.json +13 -0
- package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
- package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
- package/src/resources/extensions/voice/extension-manifest.json +12 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/src/resources/skills/create-skill/SKILL.md +184 -0
- package/src/resources/skills/create-skill/references/api-security.md +226 -0
- package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/src/resources/skills/create-skill/references/core-principles.md +437 -0
- package/src/resources/skills/create-skill/references/executable-code.md +175 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/src/resources/skills/create-skill/references/using-templates.md +112 -0
- package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/src/resources/skills/react-best-practices/SKILL.md +1 -1
- package/dist/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
- package/dist/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
- package/dist/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
- package/dist/resources/extensions/mcporter/index.ts +0 -525
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -198
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +0 -205
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +0 -442
- package/src/resources/extensions/mcporter/index.ts +0 -525
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Worktree CLI — standalone subcommand and -w flag handling.
|
|
3
|
+
*
|
|
4
|
+
* Manages the full worktree lifecycle from the command line:
|
|
5
|
+
* gsd -w Create auto-named worktree, start interactive session
|
|
6
|
+
* gsd -w my-feature Create/resume named worktree
|
|
7
|
+
* gsd worktree list List worktrees with status
|
|
8
|
+
* gsd worktree merge [name] Squash-merge a worktree into main
|
|
9
|
+
* gsd worktree clean Remove all merged/empty worktrees
|
|
10
|
+
* gsd worktree remove <n> Remove a specific worktree
|
|
11
|
+
*
|
|
12
|
+
* On session exit (via session_shutdown event), auto-commits dirty work
|
|
13
|
+
* so nothing is lost. The GSD extension reads GSD_CLI_WORKTREE to know
|
|
14
|
+
* when a session was launched via -w.
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import { createWorktree, listWorktrees, removeWorktree, mergeWorktreeToMain, diffWorktreeAll, diffWorktreeNumstat, worktreeBranchName, } from './resources/extensions/gsd/worktree-manager.js';
|
|
18
|
+
import { runWorktreePostCreateHook } from './resources/extensions/gsd/auto-worktree.js';
|
|
19
|
+
import { generateWorktreeName } from './worktree-name-gen.js';
|
|
20
|
+
import { nativeHasChanges, nativeDetectMainBranch, nativeCommitCountBetween, } from './resources/extensions/gsd/native-git-bridge.js';
|
|
21
|
+
import { inferCommitType } from './resources/extensions/gsd/git-service.js';
|
|
22
|
+
import { existsSync } from 'node:fs';
|
|
23
|
+
// ─── Status Helpers ─────────────────────────────────────────────────────────
|
|
24
|
+
function getWorktreeStatus(basePath, name, wtPath) {
|
|
25
|
+
const diff = diffWorktreeAll(basePath, name);
|
|
26
|
+
const numstat = diffWorktreeNumstat(basePath, name);
|
|
27
|
+
const filesChanged = diff.added.length + diff.modified.length + diff.removed.length;
|
|
28
|
+
let linesAdded = 0;
|
|
29
|
+
let linesRemoved = 0;
|
|
30
|
+
for (const s of numstat) {
|
|
31
|
+
linesAdded += s.added;
|
|
32
|
+
linesRemoved += s.removed;
|
|
33
|
+
}
|
|
34
|
+
let uncommitted = false;
|
|
35
|
+
try {
|
|
36
|
+
uncommitted = existsSync(wtPath) && nativeHasChanges(wtPath);
|
|
37
|
+
}
|
|
38
|
+
catch { /* */ }
|
|
39
|
+
let commits = 0;
|
|
40
|
+
try {
|
|
41
|
+
const mainBranch = nativeDetectMainBranch(basePath);
|
|
42
|
+
commits = nativeCommitCountBetween(basePath, mainBranch, worktreeBranchName(name));
|
|
43
|
+
}
|
|
44
|
+
catch { /* */ }
|
|
45
|
+
return {
|
|
46
|
+
name,
|
|
47
|
+
path: wtPath,
|
|
48
|
+
branch: worktreeBranchName(name),
|
|
49
|
+
exists: existsSync(wtPath),
|
|
50
|
+
filesChanged,
|
|
51
|
+
linesAdded,
|
|
52
|
+
linesRemoved,
|
|
53
|
+
uncommitted,
|
|
54
|
+
commits,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// ─── Formatters ─────────────────────────────────────────────────────────────
|
|
58
|
+
function formatStatus(s) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
const badge = s.uncommitted
|
|
61
|
+
? chalk.yellow(' (uncommitted)')
|
|
62
|
+
: s.filesChanged > 0
|
|
63
|
+
? chalk.cyan(' (unmerged)')
|
|
64
|
+
: chalk.green(' (clean)');
|
|
65
|
+
lines.push(` ${chalk.bold.cyan(s.name)}${badge}`);
|
|
66
|
+
lines.push(` ${chalk.dim('branch')} ${chalk.magenta(s.branch)}`);
|
|
67
|
+
lines.push(` ${chalk.dim('path')} ${chalk.dim(s.path)}`);
|
|
68
|
+
if (s.filesChanged > 0) {
|
|
69
|
+
lines.push(` ${chalk.dim('diff')} ${s.filesChanged} files, ${chalk.green(`+${s.linesAdded}`)} ${chalk.red(`-${s.linesRemoved}`)}, ${s.commits} commit${s.commits === 1 ? '' : 's'}`);
|
|
70
|
+
}
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
// ─── Subcommand: list ───────────────────────────────────────────────────────
|
|
74
|
+
function handleList(basePath) {
|
|
75
|
+
const worktrees = listWorktrees(basePath);
|
|
76
|
+
if (worktrees.length === 0) {
|
|
77
|
+
process.stderr.write(chalk.dim('No worktrees. Create one with: gsd -w <name>\n'));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
process.stderr.write(chalk.bold('\nWorktrees\n\n'));
|
|
81
|
+
for (const wt of worktrees) {
|
|
82
|
+
const status = getWorktreeStatus(basePath, wt.name, wt.path);
|
|
83
|
+
process.stderr.write(formatStatus(status) + '\n\n');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ─── Subcommand: merge ──────────────────────────────────────────────────────
|
|
87
|
+
async function handleMerge(basePath, args) {
|
|
88
|
+
const name = args[0];
|
|
89
|
+
if (!name) {
|
|
90
|
+
// If only one worktree exists, merge it
|
|
91
|
+
const worktrees = listWorktrees(basePath);
|
|
92
|
+
if (worktrees.length === 1) {
|
|
93
|
+
await doMerge(basePath, worktrees[0].name);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
process.stderr.write(chalk.red('Usage: gsd worktree merge <name>\n'));
|
|
97
|
+
process.stderr.write(chalk.dim('Run gsd worktree list to see worktrees.\n'));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
await doMerge(basePath, name);
|
|
101
|
+
}
|
|
102
|
+
async function doMerge(basePath, name) {
|
|
103
|
+
const worktrees = listWorktrees(basePath);
|
|
104
|
+
const wt = worktrees.find(w => w.name === name);
|
|
105
|
+
if (!wt) {
|
|
106
|
+
process.stderr.write(chalk.red(`Worktree "${name}" not found.\n`));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const status = getWorktreeStatus(basePath, name, wt.path);
|
|
110
|
+
if (status.filesChanged === 0 && !status.uncommitted) {
|
|
111
|
+
process.stderr.write(chalk.dim(`Worktree "${name}" has no changes to merge.\n`));
|
|
112
|
+
// Clean up empty worktree
|
|
113
|
+
removeWorktree(basePath, name, { deleteBranch: true });
|
|
114
|
+
process.stderr.write(chalk.green(`Removed empty worktree ${chalk.bold(name)}.\n`));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Auto-commit dirty work before merge
|
|
118
|
+
if (status.uncommitted) {
|
|
119
|
+
try {
|
|
120
|
+
const { autoCommitCurrentBranch } = await import('./resources/extensions/gsd/worktree.js');
|
|
121
|
+
autoCommitCurrentBranch(wt.path, 'worktree-merge', name);
|
|
122
|
+
process.stderr.write(chalk.dim(' Auto-committed dirty work before merge.\n'));
|
|
123
|
+
}
|
|
124
|
+
catch { /* best-effort */ }
|
|
125
|
+
}
|
|
126
|
+
const commitType = inferCommitType(name);
|
|
127
|
+
const commitMessage = `${commitType}(${name}): merge worktree ${name}`;
|
|
128
|
+
process.stderr.write(`\nMerging ${chalk.bold.cyan(name)} → ${chalk.magenta(nativeDetectMainBranch(basePath))}\n`);
|
|
129
|
+
process.stderr.write(chalk.dim(` ${status.filesChanged} files, ${chalk.green(`+${status.linesAdded}`)} ${chalk.red(`-${status.linesRemoved}`)}\n\n`));
|
|
130
|
+
try {
|
|
131
|
+
mergeWorktreeToMain(basePath, name, commitMessage);
|
|
132
|
+
removeWorktree(basePath, name, { deleteBranch: true });
|
|
133
|
+
process.stderr.write(chalk.green(`✓ Merged and cleaned up ${chalk.bold(name)}\n`));
|
|
134
|
+
process.stderr.write(chalk.dim(` commit: ${commitMessage}\n`));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
process.stderr.write(chalk.red(`✗ Merge failed: ${msg}\n`));
|
|
139
|
+
process.stderr.write(chalk.dim(' Resolve conflicts manually, then run gsd worktree merge again.\n'));
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ─── Subcommand: clean ──────────────────────────────────────────────────────
|
|
144
|
+
function handleClean(basePath) {
|
|
145
|
+
const worktrees = listWorktrees(basePath);
|
|
146
|
+
if (worktrees.length === 0) {
|
|
147
|
+
process.stderr.write(chalk.dim('No worktrees to clean.\n'));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
let cleaned = 0;
|
|
151
|
+
for (const wt of worktrees) {
|
|
152
|
+
const status = getWorktreeStatus(basePath, wt.name, wt.path);
|
|
153
|
+
if (status.filesChanged === 0 && !status.uncommitted) {
|
|
154
|
+
try {
|
|
155
|
+
removeWorktree(basePath, wt.name, { deleteBranch: true });
|
|
156
|
+
process.stderr.write(chalk.green(` ✓ Removed ${chalk.bold(wt.name)} (clean)\n`));
|
|
157
|
+
cleaned++;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
process.stderr.write(chalk.yellow(` ✗ Failed to remove ${wt.name}\n`));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
process.stderr.write(chalk.dim(` ─ Kept ${chalk.bold(wt.name)} (${status.filesChanged} changed files)\n`));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
process.stderr.write(chalk.dim(`\nCleaned ${cleaned} worktree${cleaned === 1 ? '' : 's'}.\n`));
|
|
168
|
+
}
|
|
169
|
+
// ─── Subcommand: remove ─────────────────────────────────────────────────────
|
|
170
|
+
function handleRemove(basePath, args) {
|
|
171
|
+
const name = args[0];
|
|
172
|
+
if (!name) {
|
|
173
|
+
process.stderr.write(chalk.red('Usage: gsd worktree remove <name>\n'));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
const worktrees = listWorktrees(basePath);
|
|
177
|
+
const wt = worktrees.find(w => w.name === name);
|
|
178
|
+
if (!wt) {
|
|
179
|
+
process.stderr.write(chalk.red(`Worktree "${name}" not found.\n`));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const status = getWorktreeStatus(basePath, name, wt.path);
|
|
183
|
+
if (status.filesChanged > 0 || status.uncommitted) {
|
|
184
|
+
process.stderr.write(chalk.yellow(`⚠ Worktree "${name}" has unmerged changes (${status.filesChanged} files).\n`));
|
|
185
|
+
process.stderr.write(chalk.yellow(' Use --force to remove anyway, or merge first: gsd worktree merge ' + name + '\n'));
|
|
186
|
+
if (!process.argv.includes('--force')) {
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
removeWorktree(basePath, name, { deleteBranch: true });
|
|
191
|
+
process.stderr.write(chalk.green(`✓ Removed worktree ${chalk.bold(name)}\n`));
|
|
192
|
+
}
|
|
193
|
+
// ─── Subcommand: status (default when no args) ─────────────────────────────
|
|
194
|
+
function handleStatusBanner(basePath) {
|
|
195
|
+
const worktrees = listWorktrees(basePath);
|
|
196
|
+
if (worktrees.length === 0)
|
|
197
|
+
return;
|
|
198
|
+
const withChanges = worktrees.filter(wt => {
|
|
199
|
+
try {
|
|
200
|
+
const diff = diffWorktreeAll(basePath, wt.name);
|
|
201
|
+
return diff.added.length + diff.modified.length + diff.removed.length > 0;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
if (withChanges.length === 0)
|
|
208
|
+
return;
|
|
209
|
+
const names = withChanges.map(w => chalk.cyan(w.name)).join(', ');
|
|
210
|
+
process.stderr.write(chalk.dim('[gsd] ') +
|
|
211
|
+
chalk.yellow(`${withChanges.length} worktree${withChanges.length === 1 ? '' : 's'} with unmerged changes: `) +
|
|
212
|
+
names + '\n' +
|
|
213
|
+
chalk.dim('[gsd] ') +
|
|
214
|
+
chalk.dim('Resume: gsd -w <name> | Merge: gsd worktree merge <name> | List: gsd worktree list\n\n'));
|
|
215
|
+
}
|
|
216
|
+
// ─── -w flag: create/resume worktree for interactive session ────────────────
|
|
217
|
+
function handleWorktreeFlag(worktreeFlag) {
|
|
218
|
+
const basePath = process.cwd();
|
|
219
|
+
// gsd -w (no name) — resume most recent worktree with changes, or create new
|
|
220
|
+
if (worktreeFlag === true) {
|
|
221
|
+
const existing = listWorktrees(basePath);
|
|
222
|
+
const withChanges = existing.filter(wt => {
|
|
223
|
+
try {
|
|
224
|
+
const diff = diffWorktreeAll(basePath, wt.name);
|
|
225
|
+
return diff.added.length + diff.modified.length + diff.removed.length > 0;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
if (withChanges.length === 1) {
|
|
232
|
+
// Single active worktree — resume it
|
|
233
|
+
const wt = withChanges[0];
|
|
234
|
+
process.chdir(wt.path);
|
|
235
|
+
process.env.GSD_CLI_WORKTREE = wt.name;
|
|
236
|
+
process.env.GSD_CLI_WORKTREE_BASE = basePath;
|
|
237
|
+
process.stderr.write(chalk.green(`✓ Resumed worktree ${chalk.bold(wt.name)}\n`));
|
|
238
|
+
process.stderr.write(chalk.dim(` path ${wt.path}\n`));
|
|
239
|
+
process.stderr.write(chalk.dim(` branch ${wt.branch}\n\n`));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (withChanges.length > 1) {
|
|
243
|
+
// Multiple active worktrees — show them and ask user to pick
|
|
244
|
+
process.stderr.write(chalk.yellow(`${withChanges.length} worktrees have unmerged changes:\n\n`));
|
|
245
|
+
for (const wt of withChanges) {
|
|
246
|
+
const status = getWorktreeStatus(basePath, wt.name, wt.path);
|
|
247
|
+
process.stderr.write(formatStatus(status) + '\n\n');
|
|
248
|
+
}
|
|
249
|
+
process.stderr.write(chalk.dim('Specify which one: gsd -w <name>\n'));
|
|
250
|
+
process.exit(0);
|
|
251
|
+
}
|
|
252
|
+
// No active worktrees — create a new one
|
|
253
|
+
const name = generateWorktreeName();
|
|
254
|
+
createAndEnter(basePath, name);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// gsd -w <name> — create or resume named worktree
|
|
258
|
+
const name = worktreeFlag;
|
|
259
|
+
const existing = listWorktrees(basePath);
|
|
260
|
+
const found = existing.find(wt => wt.name === name);
|
|
261
|
+
if (found) {
|
|
262
|
+
process.chdir(found.path);
|
|
263
|
+
process.env.GSD_CLI_WORKTREE = name;
|
|
264
|
+
process.env.GSD_CLI_WORKTREE_BASE = basePath;
|
|
265
|
+
process.stderr.write(chalk.green(`✓ Resumed worktree ${chalk.bold(name)}\n`));
|
|
266
|
+
process.stderr.write(chalk.dim(` path ${found.path}\n`));
|
|
267
|
+
process.stderr.write(chalk.dim(` branch ${found.branch}\n\n`));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
createAndEnter(basePath, name);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function createAndEnter(basePath, name) {
|
|
274
|
+
try {
|
|
275
|
+
const info = createWorktree(basePath, name);
|
|
276
|
+
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
277
|
+
if (hookError) {
|
|
278
|
+
process.stderr.write(chalk.yellow(`[gsd] ${hookError}\n`));
|
|
279
|
+
}
|
|
280
|
+
process.chdir(info.path);
|
|
281
|
+
process.env.GSD_CLI_WORKTREE = name;
|
|
282
|
+
process.env.GSD_CLI_WORKTREE_BASE = basePath;
|
|
283
|
+
process.stderr.write(chalk.green(`✓ Created worktree ${chalk.bold(name)}\n`));
|
|
284
|
+
process.stderr.write(chalk.dim(` path ${info.path}\n`));
|
|
285
|
+
process.stderr.write(chalk.dim(` branch ${info.branch}\n\n`));
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
289
|
+
process.stderr.write(chalk.red(`[gsd] Failed to create worktree: ${msg}\n`));
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
294
|
+
export { handleList, handleMerge, handleClean, handleRemove, handleStatusBanner, handleWorktreeFlag, getWorktreeStatus, };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Random worktree name generator.
|
|
3
|
+
*
|
|
4
|
+
* Produces names in the pattern: adjective-verbing-noun
|
|
5
|
+
* e.g. "noble-roaming-karp", "swift-whistling-matsumoto"
|
|
6
|
+
*/
|
|
7
|
+
const ADJECTIVES = [
|
|
8
|
+
'agile', 'bold', 'brave', 'bright', 'calm', 'clear', 'cool', 'crisp',
|
|
9
|
+
'dapper', 'eager', 'fair', 'fast', 'fierce', 'fine', 'fleet', 'fond',
|
|
10
|
+
'gentle', 'glad', 'grand', 'happy', 'keen', 'kind', 'lively', 'lucid',
|
|
11
|
+
'mellow', 'merry', 'mighty', 'neat', 'nimble', 'noble', 'plucky', 'polite',
|
|
12
|
+
'proud', 'quiet', 'rapid', 'ready', 'serene', 'sharp', 'sleek', 'sleepy',
|
|
13
|
+
'smooth', 'snappy', 'steady', 'sturdy', 'sunny', 'sure', 'swift', 'tidy',
|
|
14
|
+
'tough', 'tranquil', 'vivid', 'warm', 'wise', 'witty', 'zesty',
|
|
15
|
+
];
|
|
16
|
+
const VERBS = [
|
|
17
|
+
'baking', 'bouncing', 'building', 'carving', 'chasing', 'climbing',
|
|
18
|
+
'coding', 'crafting', 'dancing', 'dashing', 'diving', 'drawing',
|
|
19
|
+
'dreaming', 'drifting', 'drumming', 'exploring', 'fishing', 'floating',
|
|
20
|
+
'flying', 'forging', 'gliding', 'growing', 'hiking', 'humming',
|
|
21
|
+
'jumping', 'juggling', 'knitting', 'laughing', 'leaping', 'mapping',
|
|
22
|
+
'mixing', 'painting', 'planting', 'playing', 'racing', 'reading',
|
|
23
|
+
'riding', 'roaming', 'rowing', 'running', 'sailing', 'singing',
|
|
24
|
+
'skating', 'sketching', 'spinning', 'squishing', 'surfing', 'swimming',
|
|
25
|
+
'thinking', 'threading', 'tracing', 'walking', 'weaving', 'whistling',
|
|
26
|
+
'writing',
|
|
27
|
+
];
|
|
28
|
+
const NOUNS = [
|
|
29
|
+
'atlas', 'aurora', 'balloon', 'beacon', 'bolt', 'brook', 'canyon',
|
|
30
|
+
'cedar', 'comet', 'cook', 'coral', 'cosmos', 'crest', 'dawn', 'delta',
|
|
31
|
+
'echo', 'ember', 'falcon', 'fern', 'flare', 'frost', 'gale', 'glacier',
|
|
32
|
+
'grove', 'harbor', 'hawk', 'horizon', 'iris', 'jade', 'karp', 'lantern',
|
|
33
|
+
'lark', 'luna', 'maple', 'marsh', 'matsumoto', 'mesa', 'nebula', 'oasis',
|
|
34
|
+
'orbit', 'otter', 'pebble', 'phoenix', 'pine', 'prism', 'puppy', 'quartz',
|
|
35
|
+
'raven', 'reef', 'ridge', 'river', 'sage', 'shore', 'sierra', 'spark',
|
|
36
|
+
'sprout', 'stone', 'summit', 'thorn', 'tide', 'topaz', 'trail', 'vale',
|
|
37
|
+
'violet', 'wave', 'willow', 'zenith',
|
|
38
|
+
];
|
|
39
|
+
function pick(arr) {
|
|
40
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
41
|
+
}
|
|
42
|
+
export function generateWorktreeName() {
|
|
43
|
+
return `${pick(ADJECTIVES)}-${pick(VERBS)}-${pick(NOUNS)}`;
|
|
44
|
+
}
|
package/package.json
CHANGED
|
@@ -55,3 +55,5 @@ export declare const native: {
|
|
|
55
55
|
parseStreamingJson: (text: string) => unknown;
|
|
56
56
|
xxHash32: (input: string, seed: number) => number;
|
|
57
57
|
};
|
|
58
|
+
/** True when the native addon loaded successfully. False on unsupported platforms. */
|
|
59
|
+
export declare const nativeAvailable = false;
|
|
@@ -22,12 +22,14 @@ const platformPackageMap = {
|
|
|
22
22
|
"linux-arm64": "linux-arm64-gnu",
|
|
23
23
|
"win32-x64": "win32-x64-msvc",
|
|
24
24
|
};
|
|
25
|
+
let _loadedSuccessfully = false;
|
|
25
26
|
function loadNative() {
|
|
26
27
|
const errors = [];
|
|
27
28
|
// 1. Try the platform-specific npm optional dependency
|
|
28
29
|
const packageSuffix = platformPackageMap[platformTag];
|
|
29
30
|
if (packageSuffix) {
|
|
30
31
|
try {
|
|
32
|
+
_loadedSuccessfully = true;
|
|
31
33
|
return require(`@gsd-build/engine-${packageSuffix}`);
|
|
32
34
|
}
|
|
33
35
|
catch (err) {
|
|
@@ -38,6 +40,7 @@ function loadNative() {
|
|
|
38
40
|
// 2. Try local release build (native/addon/gsd_engine.{platform}.node)
|
|
39
41
|
const releasePath = path.join(addonDir, `gsd_engine.${platformTag}.node`);
|
|
40
42
|
try {
|
|
43
|
+
_loadedSuccessfully = true;
|
|
41
44
|
return require(releasePath);
|
|
42
45
|
}
|
|
43
46
|
catch (err) {
|
|
@@ -47,6 +50,7 @@ function loadNative() {
|
|
|
47
50
|
// 3. Try local dev build (native/addon/gsd_engine.dev.node)
|
|
48
51
|
const devPath = path.join(addonDir, "gsd_engine.dev.node");
|
|
49
52
|
try {
|
|
53
|
+
_loadedSuccessfully = true;
|
|
50
54
|
return require(devPath);
|
|
51
55
|
}
|
|
52
56
|
catch (err) {
|
|
@@ -55,10 +59,20 @@ function loadNative() {
|
|
|
55
59
|
}
|
|
56
60
|
const details = errors.map((e) => ` - ${e}`).join("\n");
|
|
57
61
|
const supportedPlatforms = Object.keys(platformPackageMap);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
// Graceful fallback: on unsupported platforms (e.g., win32-arm64), return a
|
|
63
|
+
// proxy that throws on individual function calls rather than crashing the
|
|
64
|
+
// entire import chain at startup (#1223). Consumers with JS fallbacks
|
|
65
|
+
// (parseRoadmap, parsePlan, fuzzyFind, etc.) catch these and degrade gracefully.
|
|
66
|
+
process.stderr.write(`[gsd] Native addon not available for ${platformTag}. Falling back to JS implementations (slower).\n` +
|
|
67
|
+
` Supported native platforms: ${supportedPlatforms.join(", ")}\n`);
|
|
68
|
+
return new Proxy({}, {
|
|
69
|
+
get(_target, prop) {
|
|
70
|
+
return (..._args) => {
|
|
71
|
+
throw new Error(`Native function '${String(prop)}' is not available on ${platformTag}`);
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
});
|
|
63
75
|
}
|
|
64
76
|
export const native = loadNative();
|
|
77
|
+
/** True when the native addon loaded successfully. False on unsupported platforms. */
|
|
78
|
+
export const nativeAvailable = _loadedSuccessfully;
|
|
@@ -27,6 +27,8 @@ const platformPackageMap: Record<string, string> = {
|
|
|
27
27
|
"win32-x64": "win32-x64-msvc",
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
+
let _loadedSuccessfully = false;
|
|
31
|
+
|
|
30
32
|
function loadNative(): Record<string, unknown> {
|
|
31
33
|
const errors: string[] = [];
|
|
32
34
|
|
|
@@ -34,7 +36,7 @@ function loadNative(): Record<string, unknown> {
|
|
|
34
36
|
const packageSuffix = platformPackageMap[platformTag];
|
|
35
37
|
if (packageSuffix) {
|
|
36
38
|
try {
|
|
37
|
-
return require(`@gsd-build/engine-${packageSuffix}`) as Record<string, unknown>;
|
|
39
|
+
_loadedSuccessfully = true; return require(`@gsd-build/engine-${packageSuffix}`) as Record<string, unknown>;
|
|
38
40
|
} catch (err) {
|
|
39
41
|
const message = err instanceof Error ? err.message : String(err);
|
|
40
42
|
errors.push(`@gsd-build/engine-${packageSuffix}: ${message}`);
|
|
@@ -44,7 +46,7 @@ function loadNative(): Record<string, unknown> {
|
|
|
44
46
|
// 2. Try local release build (native/addon/gsd_engine.{platform}.node)
|
|
45
47
|
const releasePath = path.join(addonDir, `gsd_engine.${platformTag}.node`);
|
|
46
48
|
try {
|
|
47
|
-
return require(releasePath) as Record<string, unknown>;
|
|
49
|
+
_loadedSuccessfully = true; return require(releasePath) as Record<string, unknown>;
|
|
48
50
|
} catch (err) {
|
|
49
51
|
const message = err instanceof Error ? err.message : String(err);
|
|
50
52
|
errors.push(`${releasePath}: ${message}`);
|
|
@@ -53,7 +55,7 @@ function loadNative(): Record<string, unknown> {
|
|
|
53
55
|
// 3. Try local dev build (native/addon/gsd_engine.dev.node)
|
|
54
56
|
const devPath = path.join(addonDir, "gsd_engine.dev.node");
|
|
55
57
|
try {
|
|
56
|
-
return require(devPath) as Record<string, unknown>;
|
|
58
|
+
_loadedSuccessfully = true; return require(devPath) as Record<string, unknown>;
|
|
57
59
|
} catch (err) {
|
|
58
60
|
const message = err instanceof Error ? err.message : String(err);
|
|
59
61
|
errors.push(`${devPath}: ${message}`);
|
|
@@ -61,13 +63,22 @@ function loadNative(): Record<string, unknown> {
|
|
|
61
63
|
|
|
62
64
|
const details = errors.map((e) => ` - ${e}`).join("\n");
|
|
63
65
|
const supportedPlatforms = Object.keys(platformPackageMap);
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
|
|
67
|
+
// Graceful fallback: on unsupported platforms (e.g., win32-arm64), return a
|
|
68
|
+
// proxy that throws on individual function calls rather than crashing the
|
|
69
|
+
// entire import chain at startup (#1223). Consumers with JS fallbacks
|
|
70
|
+
// (parseRoadmap, parsePlan, fuzzyFind, etc.) catch these and degrade gracefully.
|
|
71
|
+
process.stderr.write(
|
|
72
|
+
`[gsd] Native addon not available for ${platformTag}. Falling back to JS implementations (slower).\n` +
|
|
73
|
+
` Supported native platforms: ${supportedPlatforms.join(", ")}\n`,
|
|
70
74
|
);
|
|
75
|
+
return new Proxy({} as Record<string, unknown>, {
|
|
76
|
+
get(_target, prop) {
|
|
77
|
+
return (..._args: unknown[]) => {
|
|
78
|
+
throw new Error(`Native function '${String(prop)}' is not available on ${platformTag}`);
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
});
|
|
71
82
|
}
|
|
72
83
|
|
|
73
84
|
export const native = loadNative() as {
|
|
@@ -140,3 +151,6 @@ export const native = loadNative() as {
|
|
|
140
151
|
parseStreamingJson: (text: string) => unknown;
|
|
141
152
|
xxHash32: (input: string, seed: number) => number;
|
|
142
153
|
};
|
|
154
|
+
|
|
155
|
+
/** True when the native addon loaded successfully. False on unsupported platforms. */
|
|
156
|
+
export const nativeAvailable = _loadedSuccessfully;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAuGpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAkCzD;AA6LD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAKpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA+GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B"}
|
|
@@ -18,6 +18,9 @@ import * as _bundledPiTui from "@gsd/pi-tui";
|
|
|
18
18
|
// The virtualModules option then makes them available to extensions.
|
|
19
19
|
import * as _bundledTypebox from "@sinclair/typebox";
|
|
20
20
|
import * as _bundledYaml from "yaml";
|
|
21
|
+
import * as _bundledMcpClient from "@modelcontextprotocol/sdk/client";
|
|
22
|
+
import * as _bundledMcpStdio from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
23
|
+
import * as _bundledMcpStreamableHttp from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
21
24
|
import { getAgentDir, isBunBinary } from "../../config.js";
|
|
22
25
|
// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,
|
|
23
26
|
// avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.
|
|
@@ -35,6 +38,11 @@ const VIRTUAL_MODULES = {
|
|
|
35
38
|
"@gsd/pi-ai/oauth": _bundledPiAiOauth,
|
|
36
39
|
"@gsd/pi-coding-agent": _bundledPiCodingAgent,
|
|
37
40
|
"yaml": _bundledYaml,
|
|
41
|
+
"@modelcontextprotocol/sdk/client": _bundledMcpClient,
|
|
42
|
+
"@modelcontextprotocol/sdk/client/stdio": _bundledMcpStdio,
|
|
43
|
+
"@modelcontextprotocol/sdk/client/stdio.js": _bundledMcpStdio,
|
|
44
|
+
"@modelcontextprotocol/sdk/client/streamableHttp": _bundledMcpStreamableHttp,
|
|
45
|
+
"@modelcontextprotocol/sdk/client/streamableHttp.js": _bundledMcpStreamableHttp,
|
|
38
46
|
// Aliases for external PI ecosystem packages that import from the original scope
|
|
39
47
|
"@mariozechner/pi-agent-core": _bundledPiAgentCore,
|
|
40
48
|
"@mariozechner/pi-tui": _bundledPiTui,
|
|
@@ -73,6 +81,11 @@ function getAliases() {
|
|
|
73
81
|
"@gsd/pi-ai/oauth": resolveWorkspaceOrImport("ai/dist/oauth.js", "@gsd/pi-ai/oauth"),
|
|
74
82
|
"@sinclair/typebox": typeboxRoot,
|
|
75
83
|
"yaml": yamlRoot,
|
|
84
|
+
"@modelcontextprotocol/sdk/client": require.resolve("@modelcontextprotocol/sdk/client"),
|
|
85
|
+
"@modelcontextprotocol/sdk/client/stdio": require.resolve("@modelcontextprotocol/sdk/client/stdio.js"),
|
|
86
|
+
"@modelcontextprotocol/sdk/client/stdio.js": require.resolve("@modelcontextprotocol/sdk/client/stdio.js"),
|
|
87
|
+
"@modelcontextprotocol/sdk/client/streamableHttp": require.resolve("@modelcontextprotocol/sdk/client/streamableHttp.js"),
|
|
88
|
+
"@modelcontextprotocol/sdk/client/streamableHttp.js": require.resolve("@modelcontextprotocol/sdk/client/streamableHttp.js"),
|
|
76
89
|
// Aliases for external PI ecosystem packages that import from the original scope
|
|
77
90
|
"@mariozechner/pi-coding-agent": packageIndex,
|
|
78
91
|
"@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/dist/index.js", "@gsd/pi-agent-core"),
|