gsd-pi 2.33.1 → 2.34.0-dev.bbb5216
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundled-resource-path.d.ts +8 -0
- package/dist/bundled-resource-path.js +14 -0
- package/dist/cli.js +16 -0
- package/dist/headless-query.js +6 -6
- package/dist/resource-loader.d.ts +2 -0
- package/dist/resource-loader.js +39 -4
- package/dist/resources/extensions/ask-user-questions.js +217 -0
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
- package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
- package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
- package/dist/resources/extensions/async-jobs/index.js +119 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
- package/dist/resources/extensions/aws-auth/index.js +138 -0
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
- package/dist/resources/extensions/bg-shell/index.js +41 -0
- package/dist/resources/extensions/bg-shell/interaction.js +160 -0
- package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
- package/dist/resources/extensions/bg-shell/overlay.js +378 -0
- package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
- package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
- package/dist/resources/extensions/bg-shell/types.js +96 -0
- package/dist/resources/extensions/bg-shell/utilities.js +50 -0
- package/dist/resources/extensions/browser-tools/capture.js +179 -0
- package/dist/resources/extensions/browser-tools/core.js +899 -0
- package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
- package/dist/resources/extensions/browser-tools/index.js +123 -0
- package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
- package/dist/resources/extensions/browser-tools/refs.js +254 -0
- package/dist/resources/extensions/browser-tools/settle.js +173 -0
- package/dist/resources/extensions/browser-tools/state.js +126 -0
- package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
- package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
- package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
- package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
- package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
- package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
- package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
- package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
- package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
- package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
- package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
- package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
- package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
- package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
- package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
- package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
- package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
- package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
- package/dist/resources/extensions/browser-tools/utils.js +490 -0
- package/dist/resources/extensions/context7/index.js +337 -0
- package/dist/resources/extensions/get-secrets-from-user.js +492 -0
- package/dist/resources/extensions/google-search/index.js +373 -0
- package/dist/resources/extensions/gsd/activity-log.js +146 -0
- package/dist/resources/extensions/gsd/atomic-write.js +38 -0
- package/dist/resources/extensions/gsd/auto/session.js +182 -0
- package/dist/resources/extensions/gsd/auto-budget.js +30 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
- package/dist/resources/extensions/gsd/auto-loop.js +956 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
- package/dist/resources/extensions/gsd/auto-observability.js +56 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
- package/dist/resources/extensions/gsd/auto-start.js +414 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
- package/dist/resources/extensions/gsd/auto-timers.js +180 -0
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
- package/dist/resources/extensions/gsd/auto-verification.js +171 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
- package/dist/resources/extensions/gsd/auto.js +765 -0
- package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
- package/dist/resources/extensions/gsd/captures.js +354 -0
- package/dist/resources/extensions/gsd/claude-import.js +540 -0
- package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
- package/dist/resources/extensions/gsd/commands-config.js +89 -0
- package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
- package/dist/resources/extensions/gsd/commands-logs.js +468 -0
- package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
- package/dist/resources/extensions/gsd/commands.js +1024 -0
- package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
- package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
- package/dist/resources/extensions/gsd/context-budget.js +187 -0
- package/dist/resources/extensions/gsd/context-store.js +165 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
- package/dist/resources/extensions/gsd/db-writer.js +298 -0
- package/dist/resources/extensions/gsd/debug-logger.js +161 -0
- package/dist/resources/extensions/gsd/detection.js +373 -0
- package/dist/resources/extensions/gsd/diff-context.js +168 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
- package/dist/resources/extensions/gsd/doctor-format.js +71 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
- package/dist/resources/extensions/gsd/doctor-types.js +12 -0
- package/dist/resources/extensions/gsd/doctor.js +672 -0
- package/dist/resources/extensions/gsd/error-utils.js +6 -0
- package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
- package/dist/resources/extensions/gsd/exit-command.js +11 -0
- package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
- package/dist/resources/extensions/gsd/export.js +268 -0
- package/dist/resources/extensions/gsd/file-watcher.js +76 -0
- package/dist/resources/extensions/gsd/files.js +937 -0
- package/dist/resources/extensions/gsd/forensics.js +511 -0
- package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
- package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
- package/dist/resources/extensions/gsd/git-service.js +460 -0
- package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
- package/dist/resources/extensions/gsd/gsd-db.js +735 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
- package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
- package/dist/resources/extensions/gsd/health-widget.js +141 -0
- package/dist/resources/extensions/gsd/history.js +118 -0
- package/dist/resources/extensions/gsd/index.js +1114 -0
- package/dist/resources/extensions/gsd/init-wizard.js +479 -0
- package/dist/resources/extensions/gsd/json-persistence.js +62 -0
- package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
- package/dist/resources/extensions/gsd/key-manager.js +829 -0
- package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
- package/dist/resources/extensions/gsd/md-importer.js +440 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
- package/dist/resources/extensions/gsd/memory-store.js +351 -0
- package/dist/resources/extensions/gsd/metrics.js +377 -0
- package/dist/resources/extensions/gsd/migrate/command.js +157 -0
- package/dist/resources/extensions/gsd/migrate/index.js +7 -0
- package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
- package/dist/resources/extensions/gsd/migrate/types.js +4 -0
- package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
- package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
- package/dist/resources/extensions/gsd/migrate-external.js +130 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
- package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
- package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
- package/dist/resources/extensions/gsd/model-router.js +187 -0
- package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
- package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
- package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
- package/dist/resources/extensions/gsd/notifications.js +58 -0
- package/dist/resources/extensions/gsd/observability-validator.js +398 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
- package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
- package/dist/resources/extensions/gsd/paths.js +414 -0
- package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
- package/dist/resources/extensions/gsd/preferences-models.js +294 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
- package/dist/resources/extensions/gsd/preferences-types.js +73 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
- package/dist/resources/extensions/gsd/preferences.js +325 -0
- package/dist/resources/extensions/gsd/progress-score.js +102 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
- package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
- package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
- package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
- package/dist/resources/extensions/gsd/queue-order.js +178 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
- package/dist/resources/extensions/gsd/quick.js +206 -0
- package/dist/resources/extensions/gsd/repo-identity.js +187 -0
- package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
- package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
- package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
- package/dist/resources/extensions/gsd/routing-history.js +210 -0
- package/dist/resources/extensions/gsd/safe-fs.js +52 -0
- package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
- package/dist/resources/extensions/gsd/session-forensics.js +427 -0
- package/dist/resources/extensions/gsd/session-lock.js +397 -0
- package/dist/resources/extensions/gsd/session-status-io.js +134 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
- package/dist/resources/extensions/gsd/skill-health.js +324 -0
- package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
- package/dist/resources/extensions/gsd/state.js +653 -0
- package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
- package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
- package/dist/resources/extensions/gsd/token-counter.js +54 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
- package/dist/resources/extensions/gsd/triage-ui.js +125 -0
- package/dist/resources/extensions/gsd/types.js +4 -0
- package/dist/resources/extensions/gsd/undo.js +205 -0
- package/dist/resources/extensions/gsd/unit-id.js +7 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
- package/dist/resources/extensions/gsd/validate-directory.js +143 -0
- package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
- package/dist/resources/extensions/gsd/verification-gate.js +514 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
- package/dist/resources/extensions/gsd/workspace-index.js +139 -0
- package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
- package/dist/resources/extensions/gsd/worktree-command.js +682 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
- package/dist/resources/extensions/gsd/worktree.js +199 -0
- package/dist/resources/extensions/mac-tools/index.js +768 -0
- package/dist/resources/extensions/mcp-client/index.js +363 -0
- package/dist/resources/extensions/package.json +3 -0
- package/dist/resources/extensions/remote-questions/config.js +70 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
- package/dist/resources/extensions/remote-questions/format.js +234 -0
- package/dist/resources/extensions/remote-questions/http-client.js +43 -0
- package/dist/resources/extensions/remote-questions/manager.js +156 -0
- package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
- package/dist/resources/extensions/remote-questions/notify.js +89 -0
- package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/status.js +25 -0
- package/dist/resources/extensions/remote-questions/store.js +70 -0
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/types.js +5 -0
- package/dist/resources/extensions/search-the-web/cache.js +74 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
- package/dist/resources/extensions/search-the-web/format.js +161 -0
- package/dist/resources/extensions/search-the-web/http.js +178 -0
- package/dist/resources/extensions/search-the-web/index.js +41 -0
- package/dist/resources/extensions/search-the-web/native-search.js +166 -0
- package/dist/resources/extensions/search-the-web/provider.js +143 -0
- package/dist/resources/extensions/search-the-web/tavily.js +82 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
- package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
- package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
- package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
- package/dist/resources/extensions/shared/confirm-ui.js +96 -0
- package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
- package/dist/resources/extensions/shared/frontmatter.js +109 -0
- package/dist/resources/extensions/shared/interview-ui.js +569 -0
- package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
- package/dist/resources/extensions/shared/next-action-ui.js +168 -0
- package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
- package/dist/resources/extensions/shared/sanitize.js +17 -0
- package/dist/resources/extensions/shared/terminal.js +21 -0
- package/dist/resources/extensions/shared/ui.js +245 -0
- package/dist/resources/extensions/shared/wizard-ui.js +478 -0
- package/dist/resources/extensions/slash-commands/audit.js +72 -0
- package/dist/resources/extensions/slash-commands/clear.js +8 -0
- package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
- package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
- package/dist/resources/extensions/slash-commands/index.js +10 -0
- package/dist/resources/extensions/subagent/agents.js +103 -0
- package/dist/resources/extensions/subagent/index.js +905 -0
- package/dist/resources/extensions/subagent/isolation.js +384 -0
- package/dist/resources/extensions/subagent/worker-registry.js +73 -0
- package/dist/resources/extensions/ttsr/index.js +144 -0
- package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
- package/dist/resources/extensions/universal-config/discovery.js +94 -0
- package/dist/resources/extensions/universal-config/format.js +178 -0
- package/dist/resources/extensions/universal-config/index.js +99 -0
- package/dist/resources/extensions/universal-config/scanners.js +574 -0
- package/dist/resources/extensions/universal-config/tools.js +57 -0
- package/dist/resources/extensions/universal-config/types.js +8 -0
- package/dist/resources/extensions/voice/index.js +247 -0
- package/dist/startup-timings.d.ts +2 -0
- package/dist/startup-timings.js +22 -0
- package/dist/tool-bootstrap.js +59 -11
- package/dist/worktree-cli.js +7 -7
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +9 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +9 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/index.ts +41 -46
- package/src/resources/extensions/browser-tools/index.ts +156 -67
- package/src/resources/extensions/gsd/auto/session.ts +47 -30
- package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
- package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
- package/src/resources/extensions/gsd/auto-observability.ts +4 -2
- package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
- package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
- package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
- package/src/resources/extensions/gsd/auto-start.ts +440 -354
- package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
- package/src/resources/extensions/gsd/auto-timers.ts +3 -4
- package/src/resources/extensions/gsd/auto-verification.ts +76 -72
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
- package/src/resources/extensions/gsd/auto.ts +516 -1189
- package/src/resources/extensions/gsd/captures.ts +10 -4
- package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
- package/src/resources/extensions/gsd/commands.ts +39 -31
- package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
- package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
- package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
- package/src/resources/extensions/gsd/git-service.ts +32 -12
- package/src/resources/extensions/gsd/gitignore.ts +4 -2
- package/src/resources/extensions/gsd/gsd-db.ts +375 -180
- package/src/resources/extensions/gsd/guided-flow.ts +22 -11
- package/src/resources/extensions/gsd/index.ts +76 -163
- package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
- package/src/resources/extensions/gsd/progress-score.ts +65 -200
- package/src/resources/extensions/gsd/quick.ts +121 -76
- package/src/resources/extensions/gsd/repo-identity.ts +56 -22
- package/src/resources/extensions/gsd/session-lock.ts +17 -0
- package/src/resources/extensions/gsd/templates/preferences.md +1 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
- package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
- package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
- package/src/resources/extensions/gsd/types.ts +90 -77
- package/src/resources/extensions/gsd/undo.ts +42 -46
- package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
- package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
- package/src/resources/extensions/gsd/verification-gate.ts +4 -16
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
- package/src/resources/extensions/gsd/worktree-command.ts +29 -11
- package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
- package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -44
- package/src/resources/extensions/package.json +3 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
- package/src/resources/extensions/search-the-web/index.ts +35 -52
- package/src/resources/extensions/search-the-web/tavily.ts +1 -1
- package/dist/resources/extensions/ask-user-questions.ts +0 -290
- package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
- package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
- package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
- package/dist/resources/extensions/async-jobs/index.ts +0 -141
- package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
- package/dist/resources/extensions/aws-auth/index.ts +0 -144
- package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
- package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
- package/dist/resources/extensions/bg-shell/index.ts +0 -59
- package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
- package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
- package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
- package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
- package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
- package/dist/resources/extensions/bg-shell/types.ts +0 -303
- package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
- package/dist/resources/extensions/browser-tools/capture.ts +0 -199
- package/dist/resources/extensions/browser-tools/core.ts +0 -1196
- package/dist/resources/extensions/browser-tools/index.ts +0 -71
- package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
- package/dist/resources/extensions/browser-tools/refs.ts +0 -264
- package/dist/resources/extensions/browser-tools/settle.ts +0 -197
- package/dist/resources/extensions/browser-tools/state.ts +0 -408
- package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
- package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
- package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
- package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
- package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
- package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
- package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
- package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
- package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
- package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
- package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
- package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
- package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
- package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
- package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
- package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
- package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
- package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
- package/dist/resources/extensions/browser-tools/utils.ts +0 -660
- package/dist/resources/extensions/context7/index.ts +0 -428
- package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
- package/dist/resources/extensions/google-search/index.ts +0 -466
- package/dist/resources/extensions/gsd/activity-log.ts +0 -162
- package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
- package/dist/resources/extensions/gsd/auto/session.ts +0 -236
- package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
- package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
- package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
- package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
- package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
- package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
- package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
- package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
- package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
- package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
- package/dist/resources/extensions/gsd/auto-start.ts +0 -483
- package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
- package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
- package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
- package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
- package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
- package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
- package/dist/resources/extensions/gsd/auto.ts +0 -1834
- package/dist/resources/extensions/gsd/captures.ts +0 -427
- package/dist/resources/extensions/gsd/claude-import.ts +0 -656
- package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
- package/dist/resources/extensions/gsd/commands-config.ts +0 -102
- package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
- package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
- package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
- package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
- package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
- package/dist/resources/extensions/gsd/commands.ts +0 -1149
- package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
- package/dist/resources/extensions/gsd/context-budget.ts +0 -266
- package/dist/resources/extensions/gsd/context-store.ts +0 -195
- package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
- package/dist/resources/extensions/gsd/db-writer.ts +0 -360
- package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
- package/dist/resources/extensions/gsd/detection.ts +0 -470
- package/dist/resources/extensions/gsd/diff-context.ts +0 -214
- package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
- package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
- package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
- package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
- package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
- package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
- package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
- package/dist/resources/extensions/gsd/doctor.ts +0 -722
- package/dist/resources/extensions/gsd/error-utils.ts +0 -6
- package/dist/resources/extensions/gsd/exit-command.ts +0 -18
- package/dist/resources/extensions/gsd/export.ts +0 -317
- package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
- package/dist/resources/extensions/gsd/files.ts +0 -1058
- package/dist/resources/extensions/gsd/forensics.ts +0 -629
- package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
- package/dist/resources/extensions/gsd/git-service.ts +0 -580
- package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
- package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
- package/dist/resources/extensions/gsd/health-widget.ts +0 -167
- package/dist/resources/extensions/gsd/history.ts +0 -143
- package/dist/resources/extensions/gsd/index.ts +0 -1390
- package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
- package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
- package/dist/resources/extensions/gsd/key-manager.ts +0 -996
- package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
- package/dist/resources/extensions/gsd/md-importer.ts +0 -527
- package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
- package/dist/resources/extensions/gsd/memory-store.ts +0 -441
- package/dist/resources/extensions/gsd/metrics.ts +0 -532
- package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
- package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
- package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
- package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
- package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
- package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
- package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
- package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
- package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
- package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
- package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
- package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
- package/dist/resources/extensions/gsd/model-router.ts +0 -256
- package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
- package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
- package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
- package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
- package/dist/resources/extensions/gsd/notifications.ts +0 -87
- package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
- package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
- package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
- package/dist/resources/extensions/gsd/paths.ts +0 -449
- package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
- package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
- package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
- package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
- package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
- package/dist/resources/extensions/gsd/preferences.ts +0 -416
- package/dist/resources/extensions/gsd/progress-score.ts +0 -273
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
- package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
- package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
- package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
- package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
- package/dist/resources/extensions/gsd/queue-order.ts +0 -230
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
- package/dist/resources/extensions/gsd/quick.ts +0 -212
- package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
- package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
- package/dist/resources/extensions/gsd/routing-history.ts +0 -286
- package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
- package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
- package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
- package/dist/resources/extensions/gsd/session-lock.ts +0 -426
- package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
- package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
- package/dist/resources/extensions/gsd/skill-health.ts +0 -417
- package/dist/resources/extensions/gsd/state.ts +0 -727
- package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
- package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
- package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
- package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
- package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
- package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
- package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
- package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
- package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
- package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
- package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
- package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
- package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
- package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
- package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
- package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
- package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
- package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
- package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
- package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
- package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
- package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
- package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
- package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
- package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
- package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
- package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
- package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
- package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
- package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
- package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
- package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
- package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
- package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
- package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
- package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
- package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
- package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
- package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
- package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
- package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
- package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
- package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
- package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
- package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
- package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
- package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
- package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
- package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
- package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
- package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
- package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
- package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
- package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
- package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
- package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
- package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
- package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
- package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
- package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
- package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
- package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
- package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
- package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
- package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
- package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
- package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
- package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
- package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
- package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
- package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
- package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
- package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
- package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
- package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
- package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
- package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
- package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
- package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
- package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
- package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
- package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
- package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
- package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
- package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
- package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
- package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
- package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
- package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
- package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
- package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
- package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
- package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
- package/dist/resources/extensions/gsd/token-counter.ts +0 -65
- package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
- package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
- package/dist/resources/extensions/gsd/types.ts +0 -425
- package/dist/resources/extensions/gsd/undo.ts +0 -223
- package/dist/resources/extensions/gsd/unit-id.ts +0 -14
- package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
- package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
- package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
- package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
- package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
- package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
- package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
- package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
- package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
- package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
- package/dist/resources/extensions/gsd/worktree.ts +0 -257
- package/dist/resources/extensions/mac-tools/index.ts +0 -852
- package/dist/resources/extensions/mcp-client/index.ts +0 -459
- package/dist/resources/extensions/remote-questions/config.ts +0 -83
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
- package/dist/resources/extensions/remote-questions/format.ts +0 -315
- package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
- package/dist/resources/extensions/remote-questions/manager.ts +0 -184
- package/dist/resources/extensions/remote-questions/notify.ts +0 -90
- package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
- package/dist/resources/extensions/remote-questions/status.ts +0 -31
- package/dist/resources/extensions/remote-questions/store.ts +0 -81
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
- package/dist/resources/extensions/remote-questions/types.ts +0 -102
- package/dist/resources/extensions/search-the-web/cache.ts +0 -78
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
- package/dist/resources/extensions/search-the-web/format.ts +0 -258
- package/dist/resources/extensions/search-the-web/http.ts +0 -238
- package/dist/resources/extensions/search-the-web/index.ts +0 -65
- package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
- package/dist/resources/extensions/search-the-web/provider.ts +0 -148
- package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
- package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
- package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
- package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
- package/dist/resources/extensions/shared/frontmatter.ts +0 -117
- package/dist/resources/extensions/shared/interview-ui.ts +0 -613
- package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
- package/dist/resources/extensions/shared/sanitize.ts +0 -19
- package/dist/resources/extensions/shared/terminal.ts +0 -23
- package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
- package/dist/resources/extensions/shared/ui.ts +0 -400
- package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
- package/dist/resources/extensions/slash-commands/audit.ts +0 -88
- package/dist/resources/extensions/slash-commands/clear.ts +0 -10
- package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
- package/dist/resources/extensions/slash-commands/index.ts +0 -12
- package/dist/resources/extensions/subagent/agents.ts +0 -126
- package/dist/resources/extensions/subagent/index.ts +0 -1121
- package/dist/resources/extensions/subagent/isolation.ts +0 -501
- package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
- package/dist/resources/extensions/ttsr/index.ts +0 -168
- package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
- package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
- package/dist/resources/extensions/universal-config/discovery.ts +0 -104
- package/dist/resources/extensions/universal-config/format.ts +0 -191
- package/dist/resources/extensions/universal-config/index.ts +0 -120
- package/dist/resources/extensions/universal-config/scanners.ts +0 -642
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
- package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
- package/dist/resources/extensions/universal-config/tools.ts +0 -60
- package/dist/resources/extensions/universal-config/types.ts +0 -135
- package/dist/resources/extensions/voice/index.ts +0 -272
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
- package/src/resources/extensions/gsd/auto-constants.ts +0 -6
- package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
- package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Session Lock — OS-level exclusive locking for auto-mode sessions.
|
|
3
|
+
*
|
|
4
|
+
* Prevents multiple GSD processes from running auto-mode concurrently on
|
|
5
|
+
* the same project. Uses proper-lockfile for OS-level file locking (flock/
|
|
6
|
+
* lockfile) which eliminates the TOCTOU race condition that existed with
|
|
7
|
+
* the old advisory JSON lock approach.
|
|
8
|
+
*
|
|
9
|
+
* The lock file (.gsd/auto.lock) contains JSON metadata (PID, start time,
|
|
10
|
+
* unit info) for diagnostics, but the actual exclusion is enforced by the
|
|
11
|
+
* OS-level lock held via proper-lockfile.
|
|
12
|
+
*
|
|
13
|
+
* Lifecycle:
|
|
14
|
+
* acquireSessionLock() — called at the START of bootstrapAutoSession
|
|
15
|
+
* validateSessionLock() — called periodically during dispatch to detect takeover
|
|
16
|
+
* releaseSessionLock() — called on clean stop/pause
|
|
17
|
+
*/
|
|
18
|
+
import { createRequire } from "node:module";
|
|
19
|
+
import { existsSync, readFileSync, readdirSync, mkdirSync, unlinkSync, rmSync, statSync } from "node:fs";
|
|
20
|
+
import { join, dirname } from "node:path";
|
|
21
|
+
import { gsdRoot } from "./paths.js";
|
|
22
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
23
|
+
const _require = createRequire(import.meta.url);
|
|
24
|
+
// ─── Module State ───────────────────────────────────────────────────────────
|
|
25
|
+
/** Release function from proper-lockfile — calling it releases the OS lock. */
|
|
26
|
+
let _releaseFunction = null;
|
|
27
|
+
/** The path we currently hold a lock on. */
|
|
28
|
+
let _lockedPath = null;
|
|
29
|
+
/** Our PID at lock acquisition time. */
|
|
30
|
+
let _lockPid = 0;
|
|
31
|
+
/** Set to true when proper-lockfile fires onCompromised (mtime drift, sleep, etc.). */
|
|
32
|
+
let _lockCompromised = false;
|
|
33
|
+
/** Whether we've already registered a process.on('exit') handler. */
|
|
34
|
+
let _exitHandlerRegistered = false;
|
|
35
|
+
const LOCK_FILE = "auto.lock";
|
|
36
|
+
function lockPath(basePath) {
|
|
37
|
+
return join(gsdRoot(basePath), LOCK_FILE);
|
|
38
|
+
}
|
|
39
|
+
// ─── Stray Lock Cleanup ─────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Remove numbered lock file variants (e.g. "auto 2.lock", "auto 3.lock")
|
|
42
|
+
* that accumulate from macOS file conflict resolution (iCloud/Dropbox/OneDrive)
|
|
43
|
+
* or other filesystem-level copy-on-conflict behavior (#1315).
|
|
44
|
+
*
|
|
45
|
+
* Also removes stray proper-lockfile directories beyond the canonical `.gsd.lock/`.
|
|
46
|
+
*/
|
|
47
|
+
export function cleanupStrayLockFiles(basePath) {
|
|
48
|
+
const gsdDir = gsdRoot(basePath);
|
|
49
|
+
// Clean numbered auto lock files inside .gsd/
|
|
50
|
+
try {
|
|
51
|
+
if (existsSync(gsdDir)) {
|
|
52
|
+
for (const entry of readdirSync(gsdDir)) {
|
|
53
|
+
// Match "auto <N>.lock" or "auto (<N>).lock" variants but NOT the canonical "auto.lock"
|
|
54
|
+
if (entry !== LOCK_FILE && /^auto\s.+\.lock$/i.test(entry)) {
|
|
55
|
+
try {
|
|
56
|
+
unlinkSync(join(gsdDir, entry));
|
|
57
|
+
}
|
|
58
|
+
catch { /* best-effort */ }
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch { /* non-fatal: directory read failure */ }
|
|
64
|
+
// Clean stray proper-lockfile directories (e.g. ".gsd 2.lock/")
|
|
65
|
+
// The canonical one is ".gsd.lock/" — anything else is stray.
|
|
66
|
+
try {
|
|
67
|
+
const parentDir = dirname(gsdDir);
|
|
68
|
+
const gsdDirName = gsdDir.split("/").pop() || ".gsd";
|
|
69
|
+
if (existsSync(parentDir)) {
|
|
70
|
+
for (const entry of readdirSync(parentDir)) {
|
|
71
|
+
// Match ".gsd <N>.lock" or ".gsd (<N>).lock" directories but NOT ".gsd.lock"
|
|
72
|
+
if (entry !== `${gsdDirName}.lock` && entry.startsWith(gsdDirName) && entry.endsWith(".lock")) {
|
|
73
|
+
const fullPath = join(parentDir, entry);
|
|
74
|
+
try {
|
|
75
|
+
const stat = statSync(fullPath);
|
|
76
|
+
if (stat.isDirectory()) {
|
|
77
|
+
rmSync(fullPath, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch { /* best-effort */ }
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch { /* non-fatal */ }
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Register a single process exit handler that cleans up lock state.
|
|
89
|
+
* Uses module-level references so it always operates on current state.
|
|
90
|
+
* Only registers once — subsequent calls are no-ops.
|
|
91
|
+
*/
|
|
92
|
+
function ensureExitHandler(gsdDir) {
|
|
93
|
+
if (_exitHandlerRegistered)
|
|
94
|
+
return;
|
|
95
|
+
_exitHandlerRegistered = true;
|
|
96
|
+
process.once("exit", () => {
|
|
97
|
+
try {
|
|
98
|
+
if (_releaseFunction) {
|
|
99
|
+
_releaseFunction();
|
|
100
|
+
_releaseFunction = null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch { /* best-effort */ }
|
|
104
|
+
// Remove the auto.lock metadata file so crash-recovery doesn't
|
|
105
|
+
// falsely detect an interrupted session on the next startup.
|
|
106
|
+
try {
|
|
107
|
+
const lockFile = join(gsdDir, LOCK_FILE);
|
|
108
|
+
if (existsSync(lockFile))
|
|
109
|
+
unlinkSync(lockFile);
|
|
110
|
+
}
|
|
111
|
+
catch { /* best-effort */ }
|
|
112
|
+
try {
|
|
113
|
+
const lockDir = join(gsdDir + ".lock");
|
|
114
|
+
if (existsSync(lockDir))
|
|
115
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
116
|
+
}
|
|
117
|
+
catch { /* best-effort */ }
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
121
|
+
/**
|
|
122
|
+
* Attempt to acquire an exclusive session lock for the given project.
|
|
123
|
+
*
|
|
124
|
+
* This uses proper-lockfile for OS-level file locking. If another process
|
|
125
|
+
* already holds the lock, this returns { acquired: false } with details.
|
|
126
|
+
*
|
|
127
|
+
* The lock file also contains JSON metadata about the session for
|
|
128
|
+
* diagnostic purposes (PID, unit info, etc.).
|
|
129
|
+
*/
|
|
130
|
+
export function acquireSessionLock(basePath) {
|
|
131
|
+
const lp = lockPath(basePath);
|
|
132
|
+
// Re-entrant acquire on the same path: release our current OS lock first so
|
|
133
|
+
// proper-lockfile clears its update timer before we acquire a fresh lock.
|
|
134
|
+
if (_releaseFunction && _lockedPath === basePath) {
|
|
135
|
+
try {
|
|
136
|
+
_releaseFunction();
|
|
137
|
+
}
|
|
138
|
+
catch { /* may already be released */ }
|
|
139
|
+
_releaseFunction = null;
|
|
140
|
+
_lockedPath = null;
|
|
141
|
+
_lockPid = 0;
|
|
142
|
+
_lockCompromised = false;
|
|
143
|
+
}
|
|
144
|
+
// Ensure the directory exists
|
|
145
|
+
mkdirSync(dirname(lp), { recursive: true });
|
|
146
|
+
// Clean up numbered lock file variants from cloud sync conflicts (#1315)
|
|
147
|
+
cleanupStrayLockFiles(basePath);
|
|
148
|
+
// Write our lock data first (the content is informational; the OS lock is the real guard)
|
|
149
|
+
const lockData = {
|
|
150
|
+
pid: process.pid,
|
|
151
|
+
startedAt: new Date().toISOString(),
|
|
152
|
+
unitType: "starting",
|
|
153
|
+
unitId: "bootstrap",
|
|
154
|
+
unitStartedAt: new Date().toISOString(),
|
|
155
|
+
completedUnits: 0,
|
|
156
|
+
};
|
|
157
|
+
let lockfile;
|
|
158
|
+
try {
|
|
159
|
+
lockfile = _require("proper-lockfile");
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// proper-lockfile not available — fall back to PID-based check
|
|
163
|
+
return acquireFallbackLock(basePath, lp, lockData);
|
|
164
|
+
}
|
|
165
|
+
const gsdDir = gsdRoot(basePath);
|
|
166
|
+
try {
|
|
167
|
+
// Try to acquire an exclusive OS-level lock on the lock file.
|
|
168
|
+
// We lock the directory (gsdRoot) since proper-lockfile works best
|
|
169
|
+
// on directories, and the lock file itself may not exist yet.
|
|
170
|
+
mkdirSync(gsdDir, { recursive: true });
|
|
171
|
+
const release = lockfile.lockSync(gsdDir, {
|
|
172
|
+
realpath: false,
|
|
173
|
+
stale: 1_800_000, // 30 minutes — safe for laptop sleep / long event loop stalls
|
|
174
|
+
update: 10_000, // Update lock mtime every 10s to prove liveness
|
|
175
|
+
onCompromised: () => {
|
|
176
|
+
// proper-lockfile detected mtime drift (system sleep, event loop stall, etc.).
|
|
177
|
+
// Default handler throws inside setTimeout — an uncaught exception that crashes
|
|
178
|
+
// or corrupts process state. Instead, set a flag so validateSessionLock() can
|
|
179
|
+
// detect the compromise gracefully on the next dispatch cycle.
|
|
180
|
+
_lockCompromised = true;
|
|
181
|
+
_releaseFunction = null;
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
_releaseFunction = release;
|
|
185
|
+
_lockedPath = basePath;
|
|
186
|
+
_lockPid = process.pid;
|
|
187
|
+
_lockCompromised = false;
|
|
188
|
+
// Safety net: clean up lock dir on process exit if _releaseFunction
|
|
189
|
+
// wasn't called (e.g., normal exit after clean completion) (#1245).
|
|
190
|
+
ensureExitHandler(gsdDir);
|
|
191
|
+
// Write the informational lock data
|
|
192
|
+
atomicWriteSync(lp, JSON.stringify(lockData, null, 2));
|
|
193
|
+
return { acquired: true };
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
// Lock is held by another process — or the .gsd.lock/ directory is stranded.
|
|
197
|
+
// Check: if auto.lock is gone and no process is alive, the lock dir is stale.
|
|
198
|
+
const existingData = readExistingLockData(lp);
|
|
199
|
+
const existingPid = existingData?.pid;
|
|
200
|
+
// If no lock file or no alive process, try to clean up and re-acquire (#1245)
|
|
201
|
+
if (!existingData || (existingPid && !isPidAlive(existingPid))) {
|
|
202
|
+
try {
|
|
203
|
+
const lockDir = join(gsdDir + ".lock");
|
|
204
|
+
if (existsSync(lockDir))
|
|
205
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
206
|
+
if (existsSync(lp))
|
|
207
|
+
unlinkSync(lp);
|
|
208
|
+
// Retry acquisition after cleanup
|
|
209
|
+
const release = lockfile.lockSync(gsdDir, {
|
|
210
|
+
realpath: false,
|
|
211
|
+
stale: 1_800_000, // 30 minutes — match primary lock settings
|
|
212
|
+
update: 10_000,
|
|
213
|
+
onCompromised: () => {
|
|
214
|
+
_lockCompromised = true;
|
|
215
|
+
_releaseFunction = null;
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
_releaseFunction = release;
|
|
219
|
+
_lockedPath = basePath;
|
|
220
|
+
_lockPid = process.pid;
|
|
221
|
+
_lockCompromised = false;
|
|
222
|
+
// Safety net — uses centralized handler to avoid double-registration
|
|
223
|
+
ensureExitHandler(gsdDir);
|
|
224
|
+
atomicWriteSync(lp, JSON.stringify(lockData, null, 2));
|
|
225
|
+
return { acquired: true };
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Retry also failed — fall through to the error path
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const reason = existingPid
|
|
232
|
+
? `Another auto-mode session (PID ${existingPid}) appears to be running.\nStop it with \`kill ${existingPid}\` before starting a new session.`
|
|
233
|
+
: `Another auto-mode session is already running on this project.`;
|
|
234
|
+
return { acquired: false, reason, existingPid };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Fallback lock acquisition when proper-lockfile is not available.
|
|
239
|
+
* Uses PID-based liveness checking (the old approach, but with the lock
|
|
240
|
+
* written BEFORE initialization rather than after).
|
|
241
|
+
*/
|
|
242
|
+
function acquireFallbackLock(basePath, lp, lockData) {
|
|
243
|
+
// Check if an existing lock is held by a live process
|
|
244
|
+
const existing = readExistingLockData(lp);
|
|
245
|
+
if (existing && existing.pid !== process.pid) {
|
|
246
|
+
if (isPidAlive(existing.pid)) {
|
|
247
|
+
return {
|
|
248
|
+
acquired: false,
|
|
249
|
+
reason: `Another auto-mode session (PID ${existing.pid}) is already running on this project.`,
|
|
250
|
+
existingPid: existing.pid,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Stale lock from dead process — we can take over
|
|
254
|
+
}
|
|
255
|
+
// Write our lock data
|
|
256
|
+
atomicWriteSync(lp, JSON.stringify(lockData, null, 2));
|
|
257
|
+
_lockedPath = basePath;
|
|
258
|
+
_lockPid = process.pid;
|
|
259
|
+
return { acquired: true };
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Update the lock file metadata (called on each unit dispatch).
|
|
263
|
+
* Does NOT re-acquire the OS lock — just updates the JSON content.
|
|
264
|
+
*/
|
|
265
|
+
export function updateSessionLock(basePath, unitType, unitId, completedUnits, sessionFile) {
|
|
266
|
+
if (_lockedPath !== basePath && _lockedPath !== null)
|
|
267
|
+
return;
|
|
268
|
+
const lp = lockPath(basePath);
|
|
269
|
+
try {
|
|
270
|
+
const data = {
|
|
271
|
+
pid: process.pid,
|
|
272
|
+
startedAt: new Date().toISOString(),
|
|
273
|
+
unitType,
|
|
274
|
+
unitId,
|
|
275
|
+
unitStartedAt: new Date().toISOString(),
|
|
276
|
+
completedUnits,
|
|
277
|
+
sessionFile,
|
|
278
|
+
};
|
|
279
|
+
atomicWriteSync(lp, JSON.stringify(data, null, 2));
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
// Non-fatal: lock update failure
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Validate that we still own the session lock.
|
|
287
|
+
*
|
|
288
|
+
* Returns true if we still hold the lock, false if another process
|
|
289
|
+
* has taken over (indicating we should gracefully stop).
|
|
290
|
+
*
|
|
291
|
+
* This is called periodically during the dispatch loop.
|
|
292
|
+
*/
|
|
293
|
+
export function validateSessionLock(basePath) {
|
|
294
|
+
// Lock was compromised by proper-lockfile (mtime drift from sleep, stall, etc.)
|
|
295
|
+
if (_lockCompromised) {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
// If we have an OS-level lock, we're still the owner
|
|
299
|
+
if (_releaseFunction && _lockedPath === basePath) {
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
// Fallback: check the lock file PID
|
|
303
|
+
const lp = lockPath(basePath);
|
|
304
|
+
const existing = readExistingLockData(lp);
|
|
305
|
+
if (!existing) {
|
|
306
|
+
// Lock file was deleted — we lost ownership
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
return existing.pid === process.pid;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Release the session lock. Called on clean stop/pause.
|
|
313
|
+
*/
|
|
314
|
+
export function releaseSessionLock(basePath) {
|
|
315
|
+
// Release the OS-level lock
|
|
316
|
+
if (_releaseFunction) {
|
|
317
|
+
try {
|
|
318
|
+
_releaseFunction();
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// Lock may already be released
|
|
322
|
+
}
|
|
323
|
+
_releaseFunction = null;
|
|
324
|
+
}
|
|
325
|
+
// Remove the lock file
|
|
326
|
+
const lp = lockPath(basePath);
|
|
327
|
+
try {
|
|
328
|
+
if (existsSync(lp))
|
|
329
|
+
unlinkSync(lp);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
// Non-fatal
|
|
333
|
+
}
|
|
334
|
+
// Remove the proper-lockfile directory (.gsd.lock/) if it exists.
|
|
335
|
+
// proper-lockfile creates this directory as the OS-level lock mechanism.
|
|
336
|
+
// If the process exits without calling _releaseFunction (SIGKILL, crash),
|
|
337
|
+
// this directory is stranded and blocks the next session (#1245).
|
|
338
|
+
try {
|
|
339
|
+
const lockDir = join(gsdRoot(basePath) + ".lock");
|
|
340
|
+
if (existsSync(lockDir))
|
|
341
|
+
rmSync(lockDir, { recursive: true, force: true });
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Non-fatal
|
|
345
|
+
}
|
|
346
|
+
// Clean up numbered lock file variants from cloud sync conflicts (#1315)
|
|
347
|
+
cleanupStrayLockFiles(basePath);
|
|
348
|
+
_lockedPath = null;
|
|
349
|
+
_lockPid = 0;
|
|
350
|
+
_lockCompromised = false;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Check if a session lock exists and return its data (for crash recovery).
|
|
354
|
+
* Does NOT acquire the lock.
|
|
355
|
+
*/
|
|
356
|
+
export function readSessionLockData(basePath) {
|
|
357
|
+
return readExistingLockData(lockPath(basePath));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Check if the process that wrote the lock is still alive.
|
|
361
|
+
*/
|
|
362
|
+
export function isSessionLockProcessAlive(data) {
|
|
363
|
+
return isPidAlive(data.pid);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Returns true if we currently hold a session lock for the given path.
|
|
367
|
+
*/
|
|
368
|
+
export function isSessionLockHeld(basePath) {
|
|
369
|
+
return _lockedPath === basePath && _lockPid === process.pid;
|
|
370
|
+
}
|
|
371
|
+
// ─── Internal Helpers ───────────────────────────────────────────────────────
|
|
372
|
+
function readExistingLockData(lp) {
|
|
373
|
+
try {
|
|
374
|
+
if (!existsSync(lp))
|
|
375
|
+
return null;
|
|
376
|
+
const raw = readFileSync(lp, "utf-8");
|
|
377
|
+
return JSON.parse(raw);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function isPidAlive(pid) {
|
|
384
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
385
|
+
return false;
|
|
386
|
+
if (pid === process.pid)
|
|
387
|
+
return false;
|
|
388
|
+
try {
|
|
389
|
+
process.kill(pid, 0);
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
if (err.code === "EPERM")
|
|
394
|
+
return true;
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Session Status I/O
|
|
3
|
+
*
|
|
4
|
+
* File-based IPC protocol for coordinator-worker communication in
|
|
5
|
+
* parallel milestone orchestration. Each worker writes its status to a
|
|
6
|
+
* file; the coordinator reads all status files to monitor progress.
|
|
7
|
+
*
|
|
8
|
+
* Atomic writes (write to .tmp, then rename) prevent partial reads.
|
|
9
|
+
* Signal files let the coordinator send pause/resume/stop/rebase to workers.
|
|
10
|
+
* Stale detection combines PID liveness checks with heartbeat timeouts.
|
|
11
|
+
*/
|
|
12
|
+
import { unlinkSync, readdirSync, mkdirSync, existsSync, } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { gsdRoot } from "./paths.js";
|
|
15
|
+
import { loadJsonFileOrNull, writeJsonFileAtomic } from "./json-persistence.js";
|
|
16
|
+
// ─── Constants ─────────────────────────────────────────────────────────────
|
|
17
|
+
const PARALLEL_DIR = "parallel";
|
|
18
|
+
const STATUS_SUFFIX = ".status.json";
|
|
19
|
+
const SIGNAL_SUFFIX = ".signal.json";
|
|
20
|
+
const DEFAULT_STALE_TIMEOUT_MS = 30_000;
|
|
21
|
+
function isSessionStatus(data) {
|
|
22
|
+
return data !== null && typeof data === "object" && "milestoneId" in data && "pid" in data;
|
|
23
|
+
}
|
|
24
|
+
function isSignalMessage(data) {
|
|
25
|
+
return data !== null && typeof data === "object" && "signal" in data && "sentAt" in data;
|
|
26
|
+
}
|
|
27
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
28
|
+
function parallelDir(basePath) {
|
|
29
|
+
return join(gsdRoot(basePath), PARALLEL_DIR);
|
|
30
|
+
}
|
|
31
|
+
function statusPath(basePath, milestoneId) {
|
|
32
|
+
return join(parallelDir(basePath), `${milestoneId}${STATUS_SUFFIX}`);
|
|
33
|
+
}
|
|
34
|
+
function signalPath(basePath, milestoneId) {
|
|
35
|
+
return join(parallelDir(basePath), `${milestoneId}${SIGNAL_SUFFIX}`);
|
|
36
|
+
}
|
|
37
|
+
function ensureParallelDir(basePath) {
|
|
38
|
+
const dir = parallelDir(basePath);
|
|
39
|
+
if (!existsSync(dir)) {
|
|
40
|
+
mkdirSync(dir, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function isPidAlive(pid) {
|
|
44
|
+
try {
|
|
45
|
+
process.kill(pid, 0);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ─── Status I/O ────────────────────────────────────────────────────────────
|
|
53
|
+
/** Write session status atomically (write to .tmp, then rename). */
|
|
54
|
+
export function writeSessionStatus(basePath, status) {
|
|
55
|
+
ensureParallelDir(basePath);
|
|
56
|
+
writeJsonFileAtomic(statusPath(basePath, status.milestoneId), status);
|
|
57
|
+
}
|
|
58
|
+
/** Read a specific milestone's session status. */
|
|
59
|
+
export function readSessionStatus(basePath, milestoneId) {
|
|
60
|
+
return loadJsonFileOrNull(statusPath(basePath, milestoneId), isSessionStatus);
|
|
61
|
+
}
|
|
62
|
+
/** Read all session status files from .gsd/parallel/. */
|
|
63
|
+
export function readAllSessionStatuses(basePath) {
|
|
64
|
+
const dir = parallelDir(basePath);
|
|
65
|
+
if (!existsSync(dir))
|
|
66
|
+
return [];
|
|
67
|
+
const results = [];
|
|
68
|
+
try {
|
|
69
|
+
for (const entry of readdirSync(dir)) {
|
|
70
|
+
if (!entry.endsWith(STATUS_SUFFIX))
|
|
71
|
+
continue;
|
|
72
|
+
const status = loadJsonFileOrNull(join(dir, entry), isSessionStatus);
|
|
73
|
+
if (status)
|
|
74
|
+
results.push(status);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch { /* non-fatal */ }
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
/** Remove a milestone's session status file. */
|
|
81
|
+
export function removeSessionStatus(basePath, milestoneId) {
|
|
82
|
+
try {
|
|
83
|
+
const p = statusPath(basePath, milestoneId);
|
|
84
|
+
if (existsSync(p))
|
|
85
|
+
unlinkSync(p);
|
|
86
|
+
}
|
|
87
|
+
catch { /* non-fatal */ }
|
|
88
|
+
}
|
|
89
|
+
// ─── Signal I/O ────────────────────────────────────────────────────────────
|
|
90
|
+
/** Write a signal file for a worker to consume. */
|
|
91
|
+
export function sendSignal(basePath, milestoneId, signal) {
|
|
92
|
+
ensureParallelDir(basePath);
|
|
93
|
+
const msg = { signal, sentAt: Date.now(), from: "coordinator" };
|
|
94
|
+
writeJsonFileAtomic(signalPath(basePath, milestoneId), msg);
|
|
95
|
+
}
|
|
96
|
+
/** Read and delete a signal file (atomic consume). Returns null if no signal pending. */
|
|
97
|
+
export function consumeSignal(basePath, milestoneId) {
|
|
98
|
+
const p = signalPath(basePath, milestoneId);
|
|
99
|
+
const msg = loadJsonFileOrNull(p, isSignalMessage);
|
|
100
|
+
if (msg) {
|
|
101
|
+
try {
|
|
102
|
+
unlinkSync(p);
|
|
103
|
+
}
|
|
104
|
+
catch { /* non-fatal */ }
|
|
105
|
+
}
|
|
106
|
+
return msg;
|
|
107
|
+
}
|
|
108
|
+
// ─── Stale Detection ───────────────────────────────────────────────────────
|
|
109
|
+
/** Check whether a session is stale (PID dead or heartbeat timed out). */
|
|
110
|
+
export function isSessionStale(status, timeoutMs = DEFAULT_STALE_TIMEOUT_MS) {
|
|
111
|
+
if (!isPidAlive(status.pid))
|
|
112
|
+
return true;
|
|
113
|
+
const elapsed = Date.now() - status.lastHeartbeat;
|
|
114
|
+
return elapsed > timeoutMs;
|
|
115
|
+
}
|
|
116
|
+
/** Find and remove stale sessions. Returns the milestone IDs that were cleaned up. */
|
|
117
|
+
export function cleanupStaleSessions(basePath, timeoutMs = DEFAULT_STALE_TIMEOUT_MS) {
|
|
118
|
+
const removed = [];
|
|
119
|
+
const statuses = readAllSessionStatuses(basePath);
|
|
120
|
+
for (const status of statuses) {
|
|
121
|
+
if (isSessionStale(status, timeoutMs)) {
|
|
122
|
+
removeSessionStatus(basePath, status.milestoneId);
|
|
123
|
+
// Also clean up any lingering signal file
|
|
124
|
+
try {
|
|
125
|
+
const sig = signalPath(basePath, status.milestoneId);
|
|
126
|
+
if (existsSync(sig))
|
|
127
|
+
unlinkSync(sig);
|
|
128
|
+
}
|
|
129
|
+
catch { /* non-fatal */ }
|
|
130
|
+
removed.push(status.milestoneId);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return removed;
|
|
134
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Skill Discovery
|
|
3
|
+
*
|
|
4
|
+
* Detects skills installed during auto-mode by comparing the current
|
|
5
|
+
* skills directory against a snapshot taken at auto-mode start.
|
|
6
|
+
*
|
|
7
|
+
* New skills are injected into the system prompt via before_agent_start,
|
|
8
|
+
* making them visible to all subsequent units without requiring a reload.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { getAgentDir } from "@gsd/pi-coding-agent";
|
|
13
|
+
const SKILLS_DIR = join(getAgentDir(), "skills");
|
|
14
|
+
/** Snapshot of skill names at auto-mode start */
|
|
15
|
+
let baselineSkills = null;
|
|
16
|
+
/**
|
|
17
|
+
* Snapshot the current skills directory. Call at auto-mode start.
|
|
18
|
+
*/
|
|
19
|
+
export function snapshotSkills() {
|
|
20
|
+
baselineSkills = new Set(listSkillDirs());
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Clear the snapshot. Call when auto-mode stops.
|
|
24
|
+
*/
|
|
25
|
+
export function clearSkillSnapshot() {
|
|
26
|
+
baselineSkills = null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if a snapshot is active (auto-mode is running with discovery).
|
|
30
|
+
*/
|
|
31
|
+
export function hasSkillSnapshot() {
|
|
32
|
+
return baselineSkills !== null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Detect skills installed since the snapshot was taken.
|
|
36
|
+
* Returns skill metadata for any new skills found.
|
|
37
|
+
*/
|
|
38
|
+
export function detectNewSkills() {
|
|
39
|
+
if (!baselineSkills)
|
|
40
|
+
return [];
|
|
41
|
+
const current = listSkillDirs();
|
|
42
|
+
const newSkills = [];
|
|
43
|
+
for (const dir of current) {
|
|
44
|
+
if (baselineSkills.has(dir))
|
|
45
|
+
continue;
|
|
46
|
+
const skillMdPath = join(SKILLS_DIR, dir, "SKILL.md");
|
|
47
|
+
if (!existsSync(skillMdPath))
|
|
48
|
+
continue;
|
|
49
|
+
const meta = parseSkillFrontmatter(skillMdPath);
|
|
50
|
+
if (meta) {
|
|
51
|
+
newSkills.push({
|
|
52
|
+
name: meta.name || dir,
|
|
53
|
+
description: meta.description || `Skill: ${dir}`,
|
|
54
|
+
location: skillMdPath,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return newSkills;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Format discovered skills as an XML block matching pi's <available_skills> format.
|
|
62
|
+
* This can be appended to the system prompt so the LLM sees them naturally.
|
|
63
|
+
*/
|
|
64
|
+
export function formatSkillsXml(skills) {
|
|
65
|
+
if (skills.length === 0)
|
|
66
|
+
return "";
|
|
67
|
+
const entries = skills.map(s => ` <skill>
|
|
68
|
+
<name>${escapeXml(s.name)}</name>
|
|
69
|
+
<description>${escapeXml(s.description)}</description>
|
|
70
|
+
<location>${escapeXml(s.location)}</location>
|
|
71
|
+
</skill>`).join("\n");
|
|
72
|
+
return `\n<newly_discovered_skills>
|
|
73
|
+
The following skills were installed during this auto-mode session.
|
|
74
|
+
Use the read tool to load a skill's file when the task matches its description.
|
|
75
|
+
|
|
76
|
+
${entries}
|
|
77
|
+
</newly_discovered_skills>`;
|
|
78
|
+
}
|
|
79
|
+
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
80
|
+
function listSkillDirs() {
|
|
81
|
+
if (!existsSync(SKILLS_DIR))
|
|
82
|
+
return [];
|
|
83
|
+
try {
|
|
84
|
+
return readdirSync(SKILLS_DIR, { withFileTypes: true })
|
|
85
|
+
.filter(d => d.isDirectory())
|
|
86
|
+
.map(d => d.name);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function parseSkillFrontmatter(path) {
|
|
93
|
+
try {
|
|
94
|
+
const content = readFileSync(path, "utf-8");
|
|
95
|
+
// Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
|
|
96
|
+
if (!content.startsWith('---\n'))
|
|
97
|
+
return null;
|
|
98
|
+
const endIdx = content.indexOf('\n---', 4);
|
|
99
|
+
if (endIdx === -1)
|
|
100
|
+
return null;
|
|
101
|
+
const fm = content.slice(4, endIdx);
|
|
102
|
+
const result = {};
|
|
103
|
+
const nameMatch = fm.match(/^name:\s*(.+)$/m);
|
|
104
|
+
if (nameMatch)
|
|
105
|
+
result.name = nameMatch[1].trim();
|
|
106
|
+
const descMatch = fm.match(/^description:\s*(.+)$/m);
|
|
107
|
+
if (descMatch)
|
|
108
|
+
result.description = descMatch[1].trim();
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function escapeXml(text) {
|
|
116
|
+
return text
|
|
117
|
+
.replace(/&/g, "&")
|
|
118
|
+
.replace(/</g, "<")
|
|
119
|
+
.replace(/>/g, ">")
|
|
120
|
+
.replace(/"/g, """);
|
|
121
|
+
}
|