gsd-pi 2.29.0-next.1 → 2.30.0-dev.54ac83b
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 +27 -12
- package/dist/cli.js +66 -9
- package/dist/extension-registry.d.ts +63 -0
- package/dist/extension-registry.js +166 -0
- package/dist/headless-query.d.ts +4 -0
- package/dist/headless-query.js +22 -4
- package/dist/headless.js +4 -0
- package/dist/help-text.js +35 -0
- package/dist/loader.js +10 -1
- package/dist/resource-loader.js +91 -9
- package/dist/resources/extensions/async-jobs/extension-manifest.json +13 -0
- package/dist/resources/extensions/aws-auth/index.ts +144 -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/capture.ts +34 -2
- package/dist/resources/extensions/browser-tools/extension-manifest.json +37 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- 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/google-search/index.ts +21 -8
- package/dist/resources/extensions/gsd/auto/session.ts +2 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +109 -2
- package/dist/resources/extensions/gsd/auto-dispatch.ts +32 -3
- package/dist/resources/extensions/gsd/auto-post-unit.ts +53 -16
- package/dist/resources/extensions/gsd/auto-prompts.ts +51 -17
- package/dist/resources/extensions/gsd/auto-recovery.ts +35 -24
- package/dist/resources/extensions/gsd/auto-start.ts +68 -54
- package/dist/resources/extensions/gsd/auto-verification.ts +41 -7
- package/dist/resources/extensions/gsd/auto-worktree.ts +54 -183
- package/dist/resources/extensions/gsd/auto.ts +101 -31
- 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 +5 -12
- package/dist/resources/extensions/gsd/commands-logs.ts +536 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +90 -47
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/dist/resources/extensions/gsd/commands.ts +200 -33
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +7 -2
- package/dist/resources/extensions/gsd/detection.ts +2 -1
- package/dist/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/dist/resources/extensions/gsd/doctor-checks.ts +49 -1
- package/dist/resources/extensions/gsd/doctor-types.ts +16 -1
- package/dist/resources/extensions/gsd/doctor.ts +2 -6
- package/dist/resources/extensions/gsd/export.ts +31 -5
- 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 +12 -157
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +4 -0
- package/dist/resources/extensions/gsd/guided-flow.ts +37 -8
- package/dist/resources/extensions/gsd/index.ts +136 -35
- package/dist/resources/extensions/gsd/json-persistence.ts +67 -0
- 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/metrics.ts +22 -31
- 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 -10
- 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/discuss.md +10 -0
- 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/queue.md +30 -0
- 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/queue-reorder-ui.ts +14 -1
- package/dist/resources/extensions/gsd/quick.ts +18 -15
- 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/routing-history.ts +13 -17
- package/dist/resources/extensions/gsd/session-forensics.ts +4 -3
- package/dist/resources/extensions/gsd/session-lock.ts +333 -0
- 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/all-milestones-complete-merge.test.ts +3 -0
- 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-secrets-gate.test.ts +108 -2
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +55 -0
- package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +1 -0
- 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 +8 -18
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +10 -37
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- 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/milestone-transition-worktree.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -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/reassess-detection.test.ts +154 -0
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +136 -7
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/dist/resources/extensions/gsd/triage-resolution.ts +2 -1
- package/dist/resources/extensions/gsd/types.ts +3 -0
- package/dist/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/dist/resources/extensions/gsd/verification-evidence.ts +2 -0
- package/dist/resources/extensions/gsd/verification-gate.ts +16 -4
- 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 +9 -20
- 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/mod.ts +1 -0
- package/dist/resources/extensions/remote-questions/notify.ts +90 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/dist/resources/extensions/remote-questions/types.ts +3 -0
- package/dist/resources/extensions/search-the-web/extension-manifest.json +13 -0
- package/dist/resources/extensions/shared/format-utils.ts +9 -0
- package/dist/resources/extensions/shared/mod.ts +4 -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 +10 -4
- 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/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +14 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +17 -0
- 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 +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +7 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.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/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +10 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +12 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +39 -8
- package/packages/pi-coding-agent/src/core/agent-session.ts +14 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +18 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +1 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +8 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -0
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +10 -1
- package/packages/pi-coding-agent/src/core/model-resolver.ts +14 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +11 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +11 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -1
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +11 -2
- package/packages/pi-tui/dist/autocomplete.d.ts +3 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +14 -0
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/src/autocomplete.ts +19 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
- package/src/resources/extensions/aws-auth/index.ts +144 -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/capture.ts +34 -2
- package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- 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/google-search/index.ts +21 -8
- package/src/resources/extensions/gsd/auto/session.ts +2 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +109 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +32 -3
- package/src/resources/extensions/gsd/auto-post-unit.ts +53 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +51 -17
- package/src/resources/extensions/gsd/auto-recovery.ts +35 -24
- package/src/resources/extensions/gsd/auto-start.ts +68 -54
- package/src/resources/extensions/gsd/auto-verification.ts +41 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +54 -183
- package/src/resources/extensions/gsd/auto.ts +101 -31
- 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 +5 -12
- package/src/resources/extensions/gsd/commands-logs.ts +536 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +90 -47
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/src/resources/extensions/gsd/commands.ts +200 -33
- package/src/resources/extensions/gsd/dashboard-overlay.ts +7 -2
- package/src/resources/extensions/gsd/detection.ts +2 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +49 -1
- package/src/resources/extensions/gsd/doctor-types.ts +16 -1
- package/src/resources/extensions/gsd/doctor.ts +2 -6
- package/src/resources/extensions/gsd/export.ts +31 -5
- 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 +12 -157
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -0
- package/src/resources/extensions/gsd/guided-flow.ts +37 -8
- package/src/resources/extensions/gsd/index.ts +136 -35
- package/src/resources/extensions/gsd/json-persistence.ts +67 -0
- 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/metrics.ts +22 -31
- 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 -10
- 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/discuss.md +10 -0
- 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/queue.md +30 -0
- 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/queue-reorder-ui.ts +14 -1
- package/src/resources/extensions/gsd/quick.ts +18 -15
- 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/routing-history.ts +13 -17
- package/src/resources/extensions/gsd/session-forensics.ts +4 -3
- package/src/resources/extensions/gsd/session-lock.ts +333 -0
- 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/all-milestones-complete-merge.test.ts +3 -0
- 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-secrets-gate.test.ts +108 -2
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -58
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +1 -0
- 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 +8 -18
- package/src/resources/extensions/gsd/tests/git-service.test.ts +10 -37
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- 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/milestone-transition-worktree.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -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/reassess-detection.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +136 -7
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/src/resources/extensions/gsd/triage-resolution.ts +2 -1
- package/src/resources/extensions/gsd/types.ts +3 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/src/resources/extensions/gsd/verification-evidence.ts +2 -0
- package/src/resources/extensions/gsd/verification-gate.ts +16 -4
- 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 +9 -20
- 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/mod.ts +1 -0
- package/src/resources/extensions/remote-questions/notify.ts +90 -0
- package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/src/resources/extensions/remote-questions/types.ts +3 -0
- package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
- package/src/resources/extensions/shared/format-utils.ts +9 -0
- package/src/resources/extensions/shared/mod.ts +4 -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 -184
- package/dist/resources/extensions/gsd/preferences-hooks.ts +0 -10
- 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 -512
- package/dist/resources/extensions/shared/progress-widget.ts +0 -282
- package/dist/resources/extensions/shared/thinking-widget.ts +0 -107
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +0 -184
- package/src/resources/extensions/gsd/preferences-hooks.ts +0 -10
- 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 -512
- package/src/resources/extensions/shared/progress-widget.ts +0 -282
- package/src/resources/extensions/shared/thinking-widget.ts +0 -107
package/README.md
CHANGED
|
@@ -24,14 +24,21 @@ One command. Walk away. Come back to a built project with clean git history.
|
|
|
24
24
|
|
|
25
25
|
---
|
|
26
26
|
|
|
27
|
-
## What's New in v2.
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
- **
|
|
34
|
-
- **
|
|
27
|
+
## What's New in v2.29
|
|
28
|
+
|
|
29
|
+
- **Node.js 24 LTS** — CI, Docker, and package config all upgraded to Node 24 (Krypton)
|
|
30
|
+
- **`searchExcludeDirs` setting** — blacklist directories from `@` file autocomplete (e.g., `node_modules`, `dist`)
|
|
31
|
+
- **Automated releases** — prod-release now auto-generates changelogs, bumps versions, and publishes to npm
|
|
32
|
+
- **`/gsd logs`** — browse activity, debug, and metrics logs from within a session
|
|
33
|
+
- **Configurable screenshots** — browser-tools now support custom resolution, format, and quality
|
|
34
|
+
- **Pre-commit secret scanning** — automatic detection of hardcoded secrets in CI and locally
|
|
35
|
+
- **Per-project MCP config** — `.gsd/mcp.json` for project-scoped MCP server definitions
|
|
36
|
+
- **API request metrics** — track request counts for Copilot/subscription users
|
|
37
|
+
- **`/gsd keys`** — full API key lifecycle management (list, add, remove, test, rotate, doctor)
|
|
38
|
+
- **Advisory verification gate** — auto-discovered checks (lint/test from package.json) no longer doom-loop on pre-existing errors
|
|
39
|
+
- **Worktree living doc sync** — DECISIONS, REQUIREMENTS, PROJECT, and KNOWLEDGE now sync between worktree and project root
|
|
40
|
+
- **Windows non-ASCII path support** — `cpSync` fallback for usernames with special characters
|
|
41
|
+
- **`needs-discussion` routing** — milestones with draft context now route to the interactive discussion flow instead of stopping
|
|
35
42
|
|
|
36
43
|
See the full [Changelog](./CHANGELOG.md) for details.
|
|
37
44
|
|
|
@@ -53,8 +60,11 @@ Full documentation is available in the [`docs/`](./docs/) directory:
|
|
|
53
60
|
- **[Commands Reference](./docs/commands.md)** — all commands and keyboard shortcuts
|
|
54
61
|
- **[Architecture](./docs/architecture.md)** — system design and dispatch pipeline
|
|
55
62
|
- **[Troubleshooting](./docs/troubleshooting.md)** — common issues, doctor, forensics, recovery
|
|
63
|
+
- **[CI/CD Pipeline](./docs/ci-cd-pipeline.md)** — three-stage promotion pipeline (Dev → Test → Prod)
|
|
56
64
|
- **[VS Code Extension](./vscode-extension/README.md)** — chat participant, sidebar dashboard, RPC integration
|
|
57
65
|
- **[Visualizer](./docs/visualizer.md)** — workflow visualizer with stats and discussion status
|
|
66
|
+
- **[Remote Questions](./docs/remote-questions.md)** — route decisions to Slack or Discord when human input is needed
|
|
67
|
+
- **[Dynamic Model Routing](./docs/dynamic-model-routing.md)** — complexity-based model selection and budget pressure
|
|
58
68
|
- **[Migration from v1](./docs/migration.md)** — `.planning` → `.gsd` migration
|
|
59
69
|
|
|
60
70
|
---
|
|
@@ -168,7 +178,7 @@ Auto mode is a state machine driven by files on disk. It reads `.gsd/STATE.md`,
|
|
|
168
178
|
|
|
169
179
|
9. **Adaptive replanning** — After each slice completes, the roadmap is reassessed. If the work revealed new information that changes the plan, slices are reordered, added, or removed before continuing.
|
|
170
180
|
|
|
171
|
-
10. **Verification enforcement** — Configure shell commands (`npm run lint`, `npm run test`, etc.) that run automatically after task execution. Failures trigger auto-fix retries before advancing. Configurable via `verification_commands`, `verification_auto_fix`, and `verification_max_retries` preferences.
|
|
181
|
+
10. **Verification enforcement** — Configure shell commands (`npm run lint`, `npm run test`, etc.) that run automatically after task execution. Failures trigger auto-fix retries before advancing. Auto-discovered checks from `package.json` run in advisory mode — they log warnings but don't block on pre-existing errors. Configurable via `verification_commands`, `verification_auto_fix`, and `verification_max_retries` preferences.
|
|
172
182
|
|
|
173
183
|
11. **Milestone validation** — After all slices complete, a `validate-milestone` gate compares roadmap success criteria against actual results before sealing the milestone.
|
|
174
184
|
|
|
@@ -299,6 +309,8 @@ On first run, GSD launches a branded setup wizard that walks you through LLM pro
|
|
|
299
309
|
| `/gsd forensics` | Post-mortem investigation of auto-mode failures |
|
|
300
310
|
| `/gsd cleanup` | Archive phase directories from completed milestones |
|
|
301
311
|
| `/gsd doctor` | Runtime health checks with auto-fix for common issues |
|
|
312
|
+
| `/gsd keys` | API key manager — list, add, remove, test, rotate, doctor |
|
|
313
|
+
| `/gsd logs` | Browse activity, debug, and metrics logs |
|
|
302
314
|
| `/gsd export --html` | Generate HTML report for current or completed milestone |
|
|
303
315
|
| `/worktree` (`/wt`) | Git worktree lifecycle — create, switch, merge, remove |
|
|
304
316
|
| `/voice` | Toggle real-time speech-to-text (macOS, Linux) |
|
|
@@ -439,6 +451,7 @@ auto_report: true
|
|
|
439
451
|
| `verification_max_retries` | Max retries for verification failures (default: 2) |
|
|
440
452
|
| `require_slice_discussion` | Pause auto-mode before each slice for human discussion review |
|
|
441
453
|
| `auto_report` | Auto-generate HTML reports after milestone completion (default: true) |
|
|
454
|
+
| `searchExcludeDirs` | Directories to exclude from `@` file autocomplete (e.g., `["node_modules", ".git", "dist"]`) |
|
|
442
455
|
|
|
443
456
|
### Agent Instructions
|
|
444
457
|
|
|
@@ -470,7 +483,7 @@ See the full [Token Optimization Guide](./docs/token-optimization.md) for detail
|
|
|
470
483
|
|
|
471
484
|
### Bundled Tools
|
|
472
485
|
|
|
473
|
-
GSD ships with
|
|
486
|
+
GSD ships with 16 extensions, all loaded automatically:
|
|
474
487
|
|
|
475
488
|
| Extension | What it provides |
|
|
476
489
|
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -482,12 +495,14 @@ GSD ships with 14 extensions, all loaded automatically:
|
|
|
482
495
|
| **Background Shell** | Long-running process management with readiness detection |
|
|
483
496
|
| **Subagent** | Delegated tasks with isolated context windows |
|
|
484
497
|
| **Mac Tools** | macOS native app automation via Accessibility APIs |
|
|
485
|
-
| **
|
|
498
|
+
| **MCP Client** | Native MCP server integration via @modelcontextprotocol/sdk |
|
|
486
499
|
| **Voice** | Real-time speech-to-text transcription (macOS, Linux — Ubuntu 22.04+) |
|
|
487
500
|
| **Slash Commands** | Custom command creation |
|
|
488
501
|
| **LSP** | Language Server Protocol integration — diagnostics, go-to-definition, references, hover, symbols, rename, code actions |
|
|
489
502
|
| **Ask User Questions** | Structured user input with single/multi-select |
|
|
490
503
|
| **Secure Env Collect** | Masked secret collection without manual .env editing |
|
|
504
|
+
| **Remote Questions** | Route decisions to Slack/Discord when human input is needed in headless/CI mode |
|
|
505
|
+
| **Universal Config** | Discover and import MCP servers and rules from other AI coding tools |
|
|
491
506
|
|
|
492
507
|
### Bundled Agents
|
|
493
508
|
|
|
@@ -589,7 +604,7 @@ gsd (CLI binary)
|
|
|
589
604
|
|
|
590
605
|
## Requirements
|
|
591
606
|
|
|
592
|
-
- **Node.js** ≥
|
|
607
|
+
- **Node.js** ≥ 22.0.0 (24 LTS recommended)
|
|
593
608
|
- **An LLM provider** — any of the 20+ supported providers (see [Use Any Model](#use-any-model))
|
|
594
609
|
- **Git** — initialized automatically if missing
|
|
595
610
|
|
package/dist/cli.js
CHANGED
|
@@ -59,6 +59,15 @@ function parseCliArgs(argv) {
|
|
|
59
59
|
process.stdout.write((process.env.GSD_VERSION || '0.0.0') + '\n');
|
|
60
60
|
process.exit(0);
|
|
61
61
|
}
|
|
62
|
+
else if (arg === '--worktree' || arg === '-w') {
|
|
63
|
+
// -w with no value → auto-generate name; -w <name> → use that name
|
|
64
|
+
if (i + 1 < args.length && !args[i + 1].startsWith('-')) {
|
|
65
|
+
flags.worktree = args[++i];
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
flags.worktree = true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
62
71
|
else if (arg === '--help' || arg === '-h') {
|
|
63
72
|
printHelp(process.env.GSD_VERSION || '0.0.0');
|
|
64
73
|
process.exit(0);
|
|
@@ -71,6 +80,21 @@ function parseCliArgs(argv) {
|
|
|
71
80
|
}
|
|
72
81
|
const cliFlags = parseCliArgs(process.argv);
|
|
73
82
|
const isPrintMode = cliFlags.print || cliFlags.mode !== undefined;
|
|
83
|
+
// Early resource-skew check — must run before TTY gate so version mismatch
|
|
84
|
+
// errors surface even in non-TTY environments.
|
|
85
|
+
exitIfManagedResourcesAreNewer(agentDir);
|
|
86
|
+
// Early TTY check — must come before heavy initialization to avoid dangling
|
|
87
|
+
// handles that prevent process.exit() from completing promptly.
|
|
88
|
+
const hasSubcommand = cliFlags.messages.length > 0;
|
|
89
|
+
if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listModels) {
|
|
90
|
+
process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
|
|
91
|
+
process.stderr.write('[gsd] Non-interactive alternatives:\n');
|
|
92
|
+
process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
|
|
93
|
+
process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
|
|
94
|
+
process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
|
|
95
|
+
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
74
98
|
// `gsd <subcommand> --help` — show subcommand-specific help
|
|
75
99
|
const subcommand = cliFlags.messages[0];
|
|
76
100
|
if (subcommand && process.argv.includes('--help')) {
|
|
@@ -328,6 +352,48 @@ if (isPrintMode) {
|
|
|
328
352
|
process.exit(0);
|
|
329
353
|
}
|
|
330
354
|
// ---------------------------------------------------------------------------
|
|
355
|
+
// Worktree subcommand — `gsd worktree <list|merge|clean|remove>`
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
if (cliFlags.messages[0] === 'worktree' || cliFlags.messages[0] === 'wt') {
|
|
358
|
+
const { handleList, handleMerge, handleClean, handleRemove } = await import('./worktree-cli.js');
|
|
359
|
+
const sub = cliFlags.messages[1];
|
|
360
|
+
const subArgs = cliFlags.messages.slice(2);
|
|
361
|
+
if (!sub || sub === 'list') {
|
|
362
|
+
handleList(process.cwd());
|
|
363
|
+
}
|
|
364
|
+
else if (sub === 'merge') {
|
|
365
|
+
await handleMerge(process.cwd(), subArgs);
|
|
366
|
+
}
|
|
367
|
+
else if (sub === 'clean') {
|
|
368
|
+
handleClean(process.cwd());
|
|
369
|
+
}
|
|
370
|
+
else if (sub === 'remove' || sub === 'rm') {
|
|
371
|
+
handleRemove(process.cwd(), subArgs);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
process.stderr.write(`Unknown worktree command: ${sub}\n`);
|
|
375
|
+
process.stderr.write('Commands: list, merge [name], clean, remove <name>\n');
|
|
376
|
+
}
|
|
377
|
+
process.exit(0);
|
|
378
|
+
}
|
|
379
|
+
// ---------------------------------------------------------------------------
|
|
380
|
+
// Worktree flag (-w) — create/resume a worktree for the interactive session
|
|
381
|
+
// ---------------------------------------------------------------------------
|
|
382
|
+
if (cliFlags.worktree) {
|
|
383
|
+
const { handleWorktreeFlag } = await import('./worktree-cli.js');
|
|
384
|
+
handleWorktreeFlag(cliFlags.worktree);
|
|
385
|
+
}
|
|
386
|
+
// ---------------------------------------------------------------------------
|
|
387
|
+
// Active worktree banner — remind user of unmerged worktrees on normal launch
|
|
388
|
+
// ---------------------------------------------------------------------------
|
|
389
|
+
if (!cliFlags.worktree && !isPrintMode) {
|
|
390
|
+
try {
|
|
391
|
+
const { handleStatusBanner } = await import('./worktree-cli.js');
|
|
392
|
+
handleStatusBanner(process.cwd());
|
|
393
|
+
}
|
|
394
|
+
catch { /* non-fatal */ }
|
|
395
|
+
}
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
331
397
|
// Interactive mode — normal TTY session
|
|
332
398
|
// ---------------------------------------------------------------------------
|
|
333
399
|
// Per-directory session storage — same encoding as the upstream SDK so that
|
|
@@ -420,14 +486,5 @@ if (enabledModelPatterns && enabledModelPatterns.length > 0) {
|
|
|
420
486
|
session.setScopedModels(scopedModels);
|
|
421
487
|
}
|
|
422
488
|
}
|
|
423
|
-
if (!process.stdin.isTTY) {
|
|
424
|
-
process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
|
|
425
|
-
process.stderr.write('[gsd] Non-interactive alternatives:\n');
|
|
426
|
-
process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
|
|
427
|
-
process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
|
|
428
|
-
process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
|
|
429
|
-
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
430
|
-
process.exit(1);
|
|
431
|
-
}
|
|
432
489
|
const interactiveMode = new InteractiveMode(session);
|
|
433
490
|
await interactiveMode.run();
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension Registry — manages manifest reading, registry persistence, and enable/disable state.
|
|
3
|
+
*
|
|
4
|
+
* Extensions without manifests always load (backwards compatible).
|
|
5
|
+
* A fresh install has an empty registry — all extensions enabled by default.
|
|
6
|
+
* The only way an extension stops loading is an explicit `gsd extensions disable <id>`.
|
|
7
|
+
*/
|
|
8
|
+
export interface ExtensionManifest {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
description: string;
|
|
13
|
+
tier: "core" | "bundled" | "community";
|
|
14
|
+
requires: {
|
|
15
|
+
platform: string;
|
|
16
|
+
};
|
|
17
|
+
provides?: {
|
|
18
|
+
tools?: string[];
|
|
19
|
+
commands?: string[];
|
|
20
|
+
hooks?: string[];
|
|
21
|
+
shortcuts?: string[];
|
|
22
|
+
};
|
|
23
|
+
dependencies?: {
|
|
24
|
+
extensions?: string[];
|
|
25
|
+
runtime?: string[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface ExtensionRegistryEntry {
|
|
29
|
+
id: string;
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
source: "bundled" | "user" | "project";
|
|
32
|
+
disabledAt?: string;
|
|
33
|
+
disabledReason?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ExtensionRegistry {
|
|
36
|
+
version: 1;
|
|
37
|
+
entries: Record<string, ExtensionRegistryEntry>;
|
|
38
|
+
}
|
|
39
|
+
export declare function getRegistryPath(): string;
|
|
40
|
+
export declare function loadRegistry(): ExtensionRegistry;
|
|
41
|
+
export declare function saveRegistry(registry: ExtensionRegistry): void;
|
|
42
|
+
/** Returns true if the extension is enabled (missing entries default to enabled). */
|
|
43
|
+
export declare function isExtensionEnabled(registry: ExtensionRegistry, id: string): boolean;
|
|
44
|
+
export declare function enableExtension(registry: ExtensionRegistry, id: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Disable an extension. Returns an error string if the extension is core (cannot disable),
|
|
47
|
+
* or null on success.
|
|
48
|
+
*/
|
|
49
|
+
export declare function disableExtension(registry: ExtensionRegistry, id: string, manifest: ExtensionManifest | null, reason?: string): string | null;
|
|
50
|
+
/** Read extension-manifest.json from a directory. Returns null if missing or invalid. */
|
|
51
|
+
export declare function readManifest(extensionDir: string): ExtensionManifest | null;
|
|
52
|
+
/**
|
|
53
|
+
* Given an entry path (e.g. `.../extensions/browser-tools/index.ts`),
|
|
54
|
+
* resolve the parent directory and read its manifest.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readManifestFromEntryPath(entryPath: string): ExtensionManifest | null;
|
|
57
|
+
/** Scan all subdirectories of extensionsDir for manifests. Returns a Map<id, manifest>. */
|
|
58
|
+
export declare function discoverAllManifests(extensionsDir: string): Map<string, ExtensionManifest>;
|
|
59
|
+
/**
|
|
60
|
+
* Auto-populate registry entries for newly discovered extensions.
|
|
61
|
+
* Extensions already in the registry are left untouched.
|
|
62
|
+
*/
|
|
63
|
+
export declare function ensureRegistryEntries(extensionsDir: string): void;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension Registry — manages manifest reading, registry persistence, and enable/disable state.
|
|
3
|
+
*
|
|
4
|
+
* Extensions without manifests always load (backwards compatible).
|
|
5
|
+
* A fresh install has an empty registry — all extensions enabled by default.
|
|
6
|
+
* The only way an extension stops loading is an explicit `gsd extensions disable <id>`.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
// ─── Validation ─────────────────────────────────────────────────────────────
|
|
12
|
+
function isRegistry(data) {
|
|
13
|
+
if (typeof data !== "object" || data === null)
|
|
14
|
+
return false;
|
|
15
|
+
const obj = data;
|
|
16
|
+
return obj.version === 1 && typeof obj.entries === "object" && obj.entries !== null;
|
|
17
|
+
}
|
|
18
|
+
function isManifest(data) {
|
|
19
|
+
if (typeof data !== "object" || data === null)
|
|
20
|
+
return false;
|
|
21
|
+
const obj = data;
|
|
22
|
+
return (typeof obj.id === "string" &&
|
|
23
|
+
typeof obj.name === "string" &&
|
|
24
|
+
typeof obj.version === "string" &&
|
|
25
|
+
typeof obj.tier === "string");
|
|
26
|
+
}
|
|
27
|
+
// ─── Registry Path ──────────────────────────────────────────────────────────
|
|
28
|
+
export function getRegistryPath() {
|
|
29
|
+
return join(homedir(), ".gsd", "extensions", "registry.json");
|
|
30
|
+
}
|
|
31
|
+
// ─── Registry I/O ───────────────────────────────────────────────────────────
|
|
32
|
+
function defaultRegistry() {
|
|
33
|
+
return { version: 1, entries: {} };
|
|
34
|
+
}
|
|
35
|
+
export function loadRegistry() {
|
|
36
|
+
const filePath = getRegistryPath();
|
|
37
|
+
try {
|
|
38
|
+
if (!existsSync(filePath))
|
|
39
|
+
return defaultRegistry();
|
|
40
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
41
|
+
const parsed = JSON.parse(raw);
|
|
42
|
+
return isRegistry(parsed) ? parsed : defaultRegistry();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return defaultRegistry();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function saveRegistry(registry) {
|
|
49
|
+
const filePath = getRegistryPath();
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
52
|
+
const tmp = filePath + ".tmp";
|
|
53
|
+
writeFileSync(tmp, JSON.stringify(registry, null, 2), "utf-8");
|
|
54
|
+
renameSync(tmp, filePath);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Non-fatal — don't let persistence failures break operation
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ─── Query ──────────────────────────────────────────────────────────────────
|
|
61
|
+
/** Returns true if the extension is enabled (missing entries default to enabled). */
|
|
62
|
+
export function isExtensionEnabled(registry, id) {
|
|
63
|
+
const entry = registry.entries[id];
|
|
64
|
+
if (!entry)
|
|
65
|
+
return true;
|
|
66
|
+
return entry.enabled;
|
|
67
|
+
}
|
|
68
|
+
// ─── Mutations ──────────────────────────────────────────────────────────────
|
|
69
|
+
export function enableExtension(registry, id) {
|
|
70
|
+
const entry = registry.entries[id];
|
|
71
|
+
if (entry) {
|
|
72
|
+
entry.enabled = true;
|
|
73
|
+
delete entry.disabledAt;
|
|
74
|
+
delete entry.disabledReason;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
registry.entries[id] = { id, enabled: true, source: "bundled" };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Disable an extension. Returns an error string if the extension is core (cannot disable),
|
|
82
|
+
* or null on success.
|
|
83
|
+
*/
|
|
84
|
+
export function disableExtension(registry, id, manifest, reason) {
|
|
85
|
+
if (manifest?.tier === "core") {
|
|
86
|
+
return `Cannot disable "${id}" — it is a core extension.`;
|
|
87
|
+
}
|
|
88
|
+
const entry = registry.entries[id];
|
|
89
|
+
if (entry) {
|
|
90
|
+
entry.enabled = false;
|
|
91
|
+
entry.disabledAt = new Date().toISOString();
|
|
92
|
+
entry.disabledReason = reason;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
registry.entries[id] = {
|
|
96
|
+
id,
|
|
97
|
+
enabled: false,
|
|
98
|
+
source: "bundled",
|
|
99
|
+
disabledAt: new Date().toISOString(),
|
|
100
|
+
disabledReason: reason,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
// ─── Manifest Reading ───────────────────────────────────────────────────────
|
|
106
|
+
/** Read extension-manifest.json from a directory. Returns null if missing or invalid. */
|
|
107
|
+
export function readManifest(extensionDir) {
|
|
108
|
+
const manifestPath = join(extensionDir, "extension-manifest.json");
|
|
109
|
+
if (!existsSync(manifestPath))
|
|
110
|
+
return null;
|
|
111
|
+
try {
|
|
112
|
+
const raw = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
113
|
+
return isManifest(raw) ? raw : null;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Given an entry path (e.g. `.../extensions/browser-tools/index.ts`),
|
|
121
|
+
* resolve the parent directory and read its manifest.
|
|
122
|
+
*/
|
|
123
|
+
export function readManifestFromEntryPath(entryPath) {
|
|
124
|
+
const dir = dirname(entryPath);
|
|
125
|
+
return readManifest(dir);
|
|
126
|
+
}
|
|
127
|
+
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
128
|
+
/** Scan all subdirectories of extensionsDir for manifests. Returns a Map<id, manifest>. */
|
|
129
|
+
export function discoverAllManifests(extensionsDir) {
|
|
130
|
+
const manifests = new Map();
|
|
131
|
+
if (!existsSync(extensionsDir))
|
|
132
|
+
return manifests;
|
|
133
|
+
for (const entry of readdirSync(extensionsDir, { withFileTypes: true })) {
|
|
134
|
+
if (!entry.isDirectory())
|
|
135
|
+
continue;
|
|
136
|
+
const manifest = readManifest(join(extensionsDir, entry.name));
|
|
137
|
+
if (manifest) {
|
|
138
|
+
manifests.set(manifest.id, manifest);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return manifests;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Auto-populate registry entries for newly discovered extensions.
|
|
145
|
+
* Extensions already in the registry are left untouched.
|
|
146
|
+
*/
|
|
147
|
+
export function ensureRegistryEntries(extensionsDir) {
|
|
148
|
+
const manifests = discoverAllManifests(extensionsDir);
|
|
149
|
+
if (manifests.size === 0)
|
|
150
|
+
return;
|
|
151
|
+
const registry = loadRegistry();
|
|
152
|
+
let changed = false;
|
|
153
|
+
for (const [id, manifest] of manifests) {
|
|
154
|
+
if (!registry.entries[id]) {
|
|
155
|
+
registry.entries[id] = {
|
|
156
|
+
id,
|
|
157
|
+
enabled: true,
|
|
158
|
+
source: "bundled",
|
|
159
|
+
};
|
|
160
|
+
changed = true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (changed) {
|
|
164
|
+
saveRegistry(registry);
|
|
165
|
+
}
|
|
166
|
+
}
|
package/dist/headless-query.d.ts
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* state — deriveState() output (phase, milestones, progress, blockers)
|
|
9
9
|
* next — dry-run dispatch preview (what auto-mode would do next)
|
|
10
10
|
* cost — aggregated parallel worker costs
|
|
11
|
+
*
|
|
12
|
+
* Note: Extension modules are .ts files loaded via jiti (not compiled to .js).
|
|
13
|
+
* We use createJiti() here because this module is imported directly from cli.ts,
|
|
14
|
+
* bypassing the extension loader's jiti setup (#1137).
|
|
11
15
|
*/
|
|
12
16
|
import type { GSDState } from './resources/extensions/gsd/types.js';
|
|
13
17
|
export interface QuerySnapshot {
|
package/dist/headless-query.js
CHANGED
|
@@ -8,13 +8,31 @@
|
|
|
8
8
|
* state — deriveState() output (phase, milestones, progress, blockers)
|
|
9
9
|
* next — dry-run dispatch preview (what auto-mode would do next)
|
|
10
10
|
* cost — aggregated parallel worker costs
|
|
11
|
+
*
|
|
12
|
+
* Note: Extension modules are .ts files loaded via jiti (not compiled to .js).
|
|
13
|
+
* We use createJiti() here because this module is imported directly from cli.ts,
|
|
14
|
+
* bypassing the extension loader's jiti setup (#1137).
|
|
11
15
|
*/
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
+
import { createJiti } from '@mariozechner/jiti';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const jiti = createJiti(fileURLToPath(import.meta.url), { interopDefault: true, debug: false });
|
|
21
|
+
async function loadExtensionModules() {
|
|
22
|
+
const stateModule = await jiti.import(join(__dirname, 'resources/extensions/gsd/state.ts'), {});
|
|
23
|
+
const dispatchModule = await jiti.import(join(__dirname, 'resources/extensions/gsd/auto-dispatch.ts'), {});
|
|
24
|
+
const sessionModule = await jiti.import(join(__dirname, 'resources/extensions/gsd/session-status-io.ts'), {});
|
|
25
|
+
const prefsModule = await jiti.import(join(__dirname, 'resources/extensions/gsd/preferences.ts'), {});
|
|
26
|
+
return {
|
|
27
|
+
deriveState: stateModule.deriveState,
|
|
28
|
+
resolveDispatch: dispatchModule.resolveDispatch,
|
|
29
|
+
readAllSessionStatuses: sessionModule.readAllSessionStatuses,
|
|
30
|
+
loadEffectiveGSDPreferences: prefsModule.loadEffectiveGSDPreferences,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
16
33
|
// ─── Implementation ─────────────────────────────────────────────────────────
|
|
17
34
|
export async function handleQuery(basePath) {
|
|
35
|
+
const { deriveState, resolveDispatch, readAllSessionStatuses, loadEffectiveGSDPreferences } = await loadExtensionModules();
|
|
18
36
|
const state = await deriveState(basePath);
|
|
19
37
|
// Derive next dispatch action
|
|
20
38
|
let next;
|
package/dist/headless.js
CHANGED
|
@@ -128,6 +128,10 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
128
128
|
let interrupted = false;
|
|
129
129
|
const startTime = Date.now();
|
|
130
130
|
const isNewMilestone = options.command === 'new-milestone';
|
|
131
|
+
// new-milestone involves codebase investigation + artifact writing — needs more time
|
|
132
|
+
if (isNewMilestone && options.timeout === 300_000) {
|
|
133
|
+
options.timeout = 600_000; // 10 minutes
|
|
134
|
+
}
|
|
131
135
|
// Supervised mode cannot share stdin with --context -
|
|
132
136
|
if (options.supervised && options.context === '-') {
|
|
133
137
|
process.stderr.write('[headless] Error: --supervised cannot be used with --context - (both require stdin)\n');
|
package/dist/help-text.js
CHANGED
|
@@ -29,6 +29,37 @@ const SUBCOMMAND_HELP = {
|
|
|
29
29
|
'',
|
|
30
30
|
'Compare with --continue (-c) which always resumes the most recent session.',
|
|
31
31
|
].join('\n'),
|
|
32
|
+
worktree: [
|
|
33
|
+
'Usage: gsd worktree <command> [args]',
|
|
34
|
+
'',
|
|
35
|
+
'Manage isolated git worktrees for parallel work streams.',
|
|
36
|
+
'',
|
|
37
|
+
'Commands:',
|
|
38
|
+
' list List worktrees with status (files changed, commits, dirty)',
|
|
39
|
+
' merge [name] Squash-merge a worktree into main and clean up',
|
|
40
|
+
' clean Remove all worktrees that have been merged or are empty',
|
|
41
|
+
' remove <name> Remove a worktree (--force to remove with unmerged changes)',
|
|
42
|
+
'',
|
|
43
|
+
'The -w flag creates/resumes worktrees for interactive sessions:',
|
|
44
|
+
' gsd -w Auto-name a new worktree, or resume the only active one',
|
|
45
|
+
' gsd -w my-feature Create or resume a named worktree',
|
|
46
|
+
'',
|
|
47
|
+
'Lifecycle:',
|
|
48
|
+
' 1. gsd -w Create worktree, start session inside it',
|
|
49
|
+
' 2. (work normally) All changes happen on the worktree branch',
|
|
50
|
+
' 3. Ctrl+C Exit — dirty work is auto-committed',
|
|
51
|
+
' 4. gsd -w Resume where you left off',
|
|
52
|
+
' 5. gsd worktree merge Squash-merge into main when done',
|
|
53
|
+
'',
|
|
54
|
+
'Examples:',
|
|
55
|
+
' gsd -w Start in a new auto-named worktree',
|
|
56
|
+
' gsd -w auth-refactor Create/resume "auth-refactor" worktree',
|
|
57
|
+
' gsd worktree list See all worktrees and their status',
|
|
58
|
+
' gsd worktree merge auth-refactor Merge and clean up',
|
|
59
|
+
' gsd worktree clean Remove all merged/empty worktrees',
|
|
60
|
+
' gsd worktree remove old-branch Remove a specific worktree',
|
|
61
|
+
' gsd worktree remove old-branch --force Remove even with unmerged changes',
|
|
62
|
+
].join('\n'),
|
|
32
63
|
headless: [
|
|
33
64
|
'Usage: gsd headless [flags] [command] [args...]',
|
|
34
65
|
'',
|
|
@@ -72,6 +103,8 @@ const SUBCOMMAND_HELP = {
|
|
|
72
103
|
'Exit codes: 0 = complete, 1 = error/timeout, 2 = blocked',
|
|
73
104
|
].join('\n'),
|
|
74
105
|
};
|
|
106
|
+
// Alias: `gsd wt --help` → same as `gsd worktree --help`
|
|
107
|
+
SUBCOMMAND_HELP['wt'] = SUBCOMMAND_HELP['worktree'];
|
|
75
108
|
export function printHelp(version) {
|
|
76
109
|
process.stdout.write(`GSD v${version} — Get Shit Done\n\n`);
|
|
77
110
|
process.stdout.write('Usage: gsd [options] [message...]\n\n');
|
|
@@ -79,6 +112,7 @@ export function printHelp(version) {
|
|
|
79
112
|
process.stdout.write(' --mode <text|json|rpc|mcp> Output mode (default: interactive)\n');
|
|
80
113
|
process.stdout.write(' --print, -p Single-shot print mode\n');
|
|
81
114
|
process.stdout.write(' --continue, -c Resume the most recent session\n');
|
|
115
|
+
process.stdout.write(' --worktree, -w [name] Start in an isolated worktree (auto-named if omitted)\n');
|
|
82
116
|
process.stdout.write(' --model <id> Override model (e.g. claude-opus-4-6)\n');
|
|
83
117
|
process.stdout.write(' --no-session Disable session persistence\n');
|
|
84
118
|
process.stdout.write(' --extension <path> Load additional extension\n');
|
|
@@ -90,6 +124,7 @@ export function printHelp(version) {
|
|
|
90
124
|
process.stdout.write(' config Re-run the setup wizard\n');
|
|
91
125
|
process.stdout.write(' update Update GSD to the latest version\n');
|
|
92
126
|
process.stdout.write(' sessions List and resume a past session\n');
|
|
127
|
+
process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
|
|
93
128
|
process.stdout.write(' headless [cmd] [args] Run /gsd commands without TUI (default: auto)\n');
|
|
94
129
|
process.stdout.write('\nRun gsd <subcommand> --help for subcommand-specific help.\n');
|
|
95
130
|
}
|
package/dist/loader.js
CHANGED
|
@@ -29,6 +29,7 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
29
29
|
import { agentDir, appRoot } from './app-paths.js';
|
|
30
30
|
import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
|
|
31
31
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
32
|
+
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled } from './extension-registry.js';
|
|
32
33
|
import { renderLogo } from './logo.js';
|
|
33
34
|
// pkg/ is a shim directory: contains gsd's piConfig (package.json) and pi's
|
|
34
35
|
// theme assets (dist/modes/interactive/theme/) without a src/ directory.
|
|
@@ -86,7 +87,15 @@ process.env.GSD_WORKFLOW_PATH = join(resourcesDir, 'GSD-WORKFLOW.md');
|
|
|
86
87
|
// where initResources() will sync them.
|
|
87
88
|
const bundledExtDir = join(resourcesDir, 'extensions');
|
|
88
89
|
const agentExtDir = join(agentDir, 'extensions');
|
|
89
|
-
const
|
|
90
|
+
const registry = loadRegistry();
|
|
91
|
+
const discoveredExtensionPaths = discoverExtensionEntryPaths(bundledExtDir)
|
|
92
|
+
.map((entryPath) => join(agentExtDir, relative(bundledExtDir, entryPath)))
|
|
93
|
+
.filter((entryPath) => {
|
|
94
|
+
const manifest = readManifestFromEntryPath(entryPath);
|
|
95
|
+
if (!manifest)
|
|
96
|
+
return true; // no manifest = always load
|
|
97
|
+
return isExtensionEnabled(registry, manifest.id);
|
|
98
|
+
});
|
|
90
99
|
process.env.GSD_BUNDLED_EXTENSION_PATHS = serializeBundledExtensionPaths(discoveredExtensionPaths);
|
|
91
100
|
// Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY env vars for all outbound requests.
|
|
92
101
|
// pi-coding-agent's cli.ts sets this, but GSD bypasses that entry point — so we
|