gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.96d4bb599
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 +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/loader.js +0 -0
- package/dist/onboarding.d.ts +20 -1
- package/dist/onboarding.js +99 -39
- package/dist/resources/extensions/ask-user-questions.js +17 -5
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
- package/dist/resources/extensions/gsd/auto/loop.js +67 -4
- package/dist/resources/extensions/gsd/auto/phases.js +70 -47
- package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -0
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
- package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
- package/dist/resources/extensions/gsd/auto-loop.js +1 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
- package/dist/resources/extensions/gsd/auto.js +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +128 -0
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
- package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
- package/dist/resources/extensions/gsd/commands-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-memory.js +462 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +1 -0
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +490 -32
- package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
- package/dist/resources/extensions/gsd/health-widget.js +7 -4
- package/dist/resources/extensions/gsd/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
- package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
- package/dist/resources/extensions/gsd/memory-relations.js +189 -0
- package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
- package/dist/resources/extensions/gsd/memory-store.js +299 -6
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -6
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -0
- package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +47 -3
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
- package/dist/resources/extensions/gsd/uok/flags.js +7 -7
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -10
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +8 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +113 -14
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/mcp-server.test.ts +40 -4
- package/packages/mcp-server/src/server.ts +12 -10
- package/packages/mcp-server/src/session-manager.ts +10 -3
- package/packages/mcp-server/src/workflow-tools.test.ts +91 -1
- package/packages/mcp-server/src/workflow-tools.ts +128 -18
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +3 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
- package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
- package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
- package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
- package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/groq.js +0 -153
- package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
- package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +17 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +18 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
- package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +50 -0
- package/packages/pi-ai/src/models/capability-patches.ts +5 -2
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
- package/packages/pi-ai/src/models/generated/groq.ts +0 -153
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +17 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
- package/packages/pi-ai/src/providers/anthropic.ts +19 -1
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
- package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +1 -75
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +192 -24
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/src/resources/extensions/ask-user-questions.ts +24 -6
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +109 -3
- package/src/resources/extensions/gsd/auto/phases.ts +94 -60
- package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
- package/src/resources/extensions/gsd/auto-loop.ts +1 -1
- package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
- package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
- package/src/resources/extensions/gsd/auto.ts +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
- package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
- package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
- package/src/resources/extensions/gsd/commands-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +3 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +578 -32
- package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
- package/src/resources/extensions/gsd/health-widget.ts +7 -3
- package/src/resources/extensions/gsd/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +351 -7
- package/src/resources/extensions/gsd/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +25 -6
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -0
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +50 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/types.ts +62 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
- package/src/resources/extensions/gsd/uok/flags.ts +7 -7
- package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
- package/src/resources/extensions/gsd/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_ssgManifest.js +0 -0
|
@@ -2,189 +2,395 @@
|
|
|
2
2
|
* GSD Command — /gsd extract-learnings
|
|
3
3
|
*
|
|
4
4
|
* Analyses completed milestone artefacts and dispatches an LLM turn that
|
|
5
|
-
* extracts structured knowledge into 4 categories
|
|
6
|
-
*
|
|
5
|
+
* extracts structured knowledge into 4 categories (Decisions · Lessons ·
|
|
6
|
+
* Patterns · Surprises), writes a LEARNINGS.md audit trail, and persists
|
|
7
|
+
* the durable subset to GSD's cross-session surfaces:
|
|
8
|
+
*
|
|
9
|
+
* - Patterns + Lessons → appended to .gsd/KNOWLEDGE.md (inlined into
|
|
10
|
+
* every future dispatch prompt via auto-prompts::inlineGsdRootFile).
|
|
11
|
+
* - Decisions → persisted via the gsd_save_decision MCP tool, which
|
|
12
|
+
* regenerates .gsd/DECISIONS.md from the DB.
|
|
13
|
+
* - Surprises → stay only in LEARNINGS.md (milestone-local context).
|
|
14
|
+
*
|
|
15
|
+
* The same extraction steps are reused by the complete-milestone prompt
|
|
16
|
+
* via buildExtractionStepsBlock — single source of truth.
|
|
7
17
|
*/
|
|
8
18
|
|
|
9
19
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
10
20
|
|
|
11
21
|
import { existsSync, readFileSync } from "node:fs";
|
|
12
|
-
import { join, basename } from "node:path";
|
|
22
|
+
import { join, basename, relative } from "node:path";
|
|
13
23
|
|
|
14
24
|
import { gsdRoot, resolveMilestonePath } from "./paths.js";
|
|
15
25
|
import { projectRoot } from "./commands/context.js";
|
|
16
26
|
|
|
17
27
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
18
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Resolved paths for the four artefact files that feed a milestone-scoped
|
|
31
|
+
* learnings extraction. Paths are absolute when the file exists; `null`
|
|
32
|
+
* otherwise. `missingRequired` lists the filenames (not full paths) of the
|
|
33
|
+
* required artefacts that could not be found.
|
|
34
|
+
*/
|
|
19
35
|
export interface PhaseArtifacts {
|
|
20
|
-
|
|
36
|
+
/** Absolute path to `{MID}-ROADMAP.md`, or `null` if the file is missing. */
|
|
37
|
+
roadmap: string | null;
|
|
38
|
+
/** Absolute path to `{MID}-SUMMARY.md`, or `null` if the file is missing. */
|
|
21
39
|
summary: string | null;
|
|
40
|
+
/** Absolute path to `{MID}-VERIFICATION.md` (optional), or `null`. */
|
|
22
41
|
verification: string | null;
|
|
42
|
+
/** Absolute path to `{MID}-UAT.md` (optional), or `null`. */
|
|
23
43
|
uat: string | null;
|
|
44
|
+
/** Filenames of required artefacts that could not be resolved. */
|
|
24
45
|
missingRequired: string[];
|
|
25
46
|
}
|
|
26
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Full context required by `buildExtractLearningsPrompt` to construct the
|
|
50
|
+
* manual `/gsd extract-learnings` dispatch prompt. Covers the milestone
|
|
51
|
+
* identity, the output target, the inlined artefact contents, and any
|
|
52
|
+
* missing optional artefacts that should be surfaced to the agent.
|
|
53
|
+
*/
|
|
27
54
|
export interface ExtractLearningsPromptContext {
|
|
55
|
+
/** Milestone identifier, e.g. `"M001"` or `"M001-ush8s3"` (team mode). */
|
|
28
56
|
milestoneId: string;
|
|
57
|
+
/** Human-readable milestone title, taken from the roadmap H1 when present. */
|
|
29
58
|
milestoneName: string;
|
|
59
|
+
/** Absolute filesystem path at which the LEARNINGS.md file will be written. */
|
|
30
60
|
outputPath: string;
|
|
61
|
+
/** Project-root-relative path for the same file, used in prompt prose. */
|
|
31
62
|
relativeOutputPath: string;
|
|
32
|
-
|
|
63
|
+
/** Inlined contents of `{MID}-ROADMAP.md` (required). */
|
|
64
|
+
roadmapContent: string;
|
|
65
|
+
/** Inlined contents of `{MID}-SUMMARY.md` (required). */
|
|
33
66
|
summaryContent: string;
|
|
67
|
+
/** Inlined contents of `{MID}-VERIFICATION.md` when the file exists, else `null`. */
|
|
34
68
|
verificationContent: string | null;
|
|
69
|
+
/** Inlined contents of `{MID}-UAT.md` when the file exists, else `null`. */
|
|
35
70
|
uatContent: string | null;
|
|
71
|
+
/** Filenames of optional artefacts that were not available for inlining. */
|
|
36
72
|
missingArtifacts: string[];
|
|
73
|
+
/** Display name of the enclosing project (from `.gsd/PROJECT.md` or dir basename). */
|
|
37
74
|
projectName: string;
|
|
38
75
|
}
|
|
39
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Minimal context required to render the structured-extraction steps block.
|
|
79
|
+
*
|
|
80
|
+
* The block is milestone-scoped — it only needs the milestone ID (used for
|
|
81
|
+
* `scope` columns and `gsd_save_decision` calls) and the LEARNINGS.md output
|
|
82
|
+
* path (both absolute for unambiguous writes and relative for display in the
|
|
83
|
+
* prompt). Artefact content is NOT part of this context because both render
|
|
84
|
+
* sites (manual path and complete-milestone auto path) supply it separately.
|
|
85
|
+
*/
|
|
86
|
+
export interface ExtractionStepsContext {
|
|
87
|
+
/** Milestone identifier, e.g. `"M001"` or `"M001-ush8s3"` (team mode). */
|
|
88
|
+
milestoneId: string;
|
|
89
|
+
/** Absolute filesystem path at which the LEARNINGS.md file will be written. */
|
|
90
|
+
outputPath: string;
|
|
91
|
+
/** Project-root-relative path for the same file, used in prompt prose. */
|
|
92
|
+
relativeOutputPath: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Shape of the YAML frontmatter written at the top of `{MID}-LEARNINGS.md`.
|
|
97
|
+
*
|
|
98
|
+
* Produced by `buildFrontmatter` — consumed only by the human-readable audit
|
|
99
|
+
* trail, not by any downstream automated pipeline. The `counts` object and
|
|
100
|
+
* `missing_artifacts` list exist so reviewers can spot truncated extractions
|
|
101
|
+
* at a glance.
|
|
102
|
+
*/
|
|
40
103
|
export interface FrontmatterContext {
|
|
104
|
+
/** Milestone identifier (becomes the `phase` key). */
|
|
41
105
|
milestoneId: string;
|
|
106
|
+
/** Milestone title (becomes the `phase_name` key). */
|
|
42
107
|
milestoneName: string;
|
|
108
|
+
/** Project display name. */
|
|
43
109
|
projectName: string;
|
|
110
|
+
/** ISO-8601 UTC timestamp of when the extraction was performed. */
|
|
44
111
|
generatedAt: string;
|
|
112
|
+
/** Counts of extracted items per category. */
|
|
45
113
|
counts: {
|
|
46
114
|
decisions: number;
|
|
47
115
|
lessons: number;
|
|
48
116
|
patterns: number;
|
|
49
117
|
surprises: number;
|
|
50
118
|
};
|
|
119
|
+
/** Filenames of optional artefacts that were not available during extraction. */
|
|
51
120
|
missingArtifacts: string[];
|
|
52
121
|
}
|
|
53
122
|
|
|
54
123
|
// ─── Pure functions ───────────────────────────────────────────────────────────
|
|
55
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Parses the argument string passed to `/gsd extract-learnings`.
|
|
127
|
+
*
|
|
128
|
+
* Returns `{ milestoneId: null }` for empty / whitespace-only input — the
|
|
129
|
+
* handler surfaces a usage hint in that case. A non-empty trimmed value is
|
|
130
|
+
* returned as-is; the handler validates that the milestone actually exists.
|
|
131
|
+
*/
|
|
56
132
|
export function parseExtractLearningsArgs(args: string): { milestoneId: string | null } {
|
|
57
133
|
const trimmed = args.trim();
|
|
58
134
|
return { milestoneId: trimmed || null };
|
|
59
135
|
}
|
|
60
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Builds the absolute path at which the LEARNINGS.md audit trail should be
|
|
139
|
+
* written for the given milestone.
|
|
140
|
+
*/
|
|
61
141
|
export function buildLearningsOutputPath(milestoneDir: string, milestoneId: string): string {
|
|
62
142
|
return join(milestoneDir, `${milestoneId}-LEARNINGS.md`);
|
|
63
143
|
}
|
|
64
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Resolves the milestone-scoped artefact paths needed to perform an
|
|
147
|
+
* extraction. The milestone's ROADMAP and SUMMARY files are required; the
|
|
148
|
+
* VERIFICATION and UAT files are optional. Missing required files are
|
|
149
|
+
* reported by filename in `missingRequired` so the handler can surface a
|
|
150
|
+
* precise error without swallowing the cause.
|
|
151
|
+
*/
|
|
65
152
|
export function resolvePhaseArtifacts(milestoneDir: string, milestoneId: string): PhaseArtifacts {
|
|
66
153
|
const missingRequired: string[] = [];
|
|
67
154
|
|
|
68
|
-
const
|
|
155
|
+
const roadmapFile = `${milestoneId}-ROADMAP.md`;
|
|
69
156
|
const summaryFile = `${milestoneId}-SUMMARY.md`;
|
|
70
157
|
const verificationFile = `${milestoneId}-VERIFICATION.md`;
|
|
71
158
|
const uatFile = `${milestoneId}-UAT.md`;
|
|
72
159
|
|
|
73
|
-
const
|
|
160
|
+
const roadmapPath = join(milestoneDir, roadmapFile);
|
|
74
161
|
const summaryPath = join(milestoneDir, summaryFile);
|
|
75
162
|
const verificationPath = join(milestoneDir, verificationFile);
|
|
76
163
|
const uatPath = join(milestoneDir, uatFile);
|
|
77
164
|
|
|
78
|
-
const
|
|
165
|
+
const roadmap = existsSync(roadmapPath) ? roadmapPath : null;
|
|
79
166
|
const summary = existsSync(summaryPath) ? summaryPath : null;
|
|
80
167
|
const verification = existsSync(verificationPath) ? verificationPath : null;
|
|
81
168
|
const uat = existsSync(uatPath) ? uatPath : null;
|
|
82
169
|
|
|
83
|
-
if (!
|
|
170
|
+
if (!roadmap) missingRequired.push(roadmapFile);
|
|
84
171
|
if (!summary) missingRequired.push(summaryFile);
|
|
85
172
|
|
|
86
|
-
return {
|
|
173
|
+
return { roadmap, summary, verification, uat, missingRequired };
|
|
87
174
|
}
|
|
88
175
|
|
|
89
|
-
|
|
90
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Canonical structured-extraction instructions.
|
|
178
|
+
*
|
|
179
|
+
* Used in two places — kept in sync by construction:
|
|
180
|
+
* 1. /gsd extract-learnings manual path (buildExtractLearningsPrompt).
|
|
181
|
+
* 2. complete-milestone auto path ({{extractLearningsSteps}} placeholder,
|
|
182
|
+
* injected by auto-prompts::buildCompleteMilestonePrompt).
|
|
183
|
+
*
|
|
184
|
+
* The block assumes the LLM already has the milestone artefacts available —
|
|
185
|
+
* either inlined directly in the manual path, or via {{inlinedContext}} in
|
|
186
|
+
* complete-milestone. It does not re-inline artefacts.
|
|
187
|
+
*/
|
|
188
|
+
export function buildExtractionStepsBlock(ctx: ExtractionStepsContext): string {
|
|
189
|
+
return `## Structured Learnings Extraction
|
|
91
190
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (ctx.uatContent) {
|
|
96
|
-
optionalSections.push(`## UAT Report\n\n${ctx.uatContent}`);
|
|
97
|
-
}
|
|
191
|
+
Perform the following steps IN ORDER. Each step is mandatory unless explicitly
|
|
192
|
+
marked optional. These instructions are the single source of truth shared by
|
|
193
|
+
\`/gsd extract-learnings\` and the auto-mode milestone-completion turn.
|
|
98
194
|
|
|
99
|
-
|
|
100
|
-
? `\nNote: The following optional artefacts were not available: ${ctx.missingArtifacts.join(", ")}\n`
|
|
101
|
-
: "";
|
|
195
|
+
### Step 1 — Classify findings into four categories
|
|
102
196
|
|
|
103
|
-
|
|
197
|
+
Review the milestone artefacts (roadmap, slice summaries, verification report,
|
|
198
|
+
UAT report) and structure your findings into exactly four categories:
|
|
104
199
|
|
|
105
|
-
**
|
|
106
|
-
**
|
|
200
|
+
- **Decisions** — architectural or design choices made during this milestone, including rationale and alternatives considered.
|
|
201
|
+
- **Lessons** — technical discoveries, process insights, knowledge gaps that were filled.
|
|
202
|
+
- **Patterns** — reusable approaches or solutions that emerged and should be applied in future work.
|
|
203
|
+
- **Surprises** — unexpected challenges, discoveries, or outcomes that deviated from assumptions.
|
|
107
204
|
|
|
108
|
-
|
|
205
|
+
Every item MUST carry a \`Source:\` line using the format
|
|
206
|
+
\`Source: {artifact-filename}/{section}\` (e.g.
|
|
207
|
+
\`Source: ${ctx.milestoneId}-ROADMAP.md/Architecture Decisions\`).
|
|
208
|
+
Items without a source attribution are invalid — drop them.
|
|
109
209
|
|
|
110
|
-
|
|
210
|
+
### Step 2 — Write the LEARNINGS.md audit trail
|
|
111
211
|
|
|
112
|
-
|
|
212
|
+
Using the \`write\` tool, persist the full structured report to
|
|
213
|
+
\`${ctx.relativeOutputPath}\` with this shape:
|
|
113
214
|
|
|
114
|
-
|
|
115
|
-
|
|
215
|
+
- YAML frontmatter with keys: \`phase\`, \`phase_name\`, \`project\`, \`generated\` (ISO-8601 UTC), \`counts\` (decisions / lessons / patterns / surprises), \`missing_artifacts\`.
|
|
216
|
+
- Four H3 sections (\`### Decisions\`, \`### Lessons\`, \`### Patterns\`, \`### Surprises\`) containing bullet points. Each bullet is followed by its \`Source:\` line.
|
|
116
217
|
|
|
117
|
-
|
|
118
|
-
|
|
218
|
+
LEARNINGS.md is the full, cited audit trail. Write it first — subsequent steps
|
|
219
|
+
feed from its content.
|
|
119
220
|
|
|
120
|
-
###
|
|
121
|
-
Reusable patterns, approaches, or solutions that emerged and should be applied in future work.
|
|
221
|
+
### Step 3 — Read \`.gsd/KNOWLEDGE.md\` to prepare append
|
|
122
222
|
|
|
123
|
-
|
|
124
|
-
|
|
223
|
+
Read \`.gsd/KNOWLEDGE.md\`. It is a markdown file with three tables:
|
|
224
|
+
\`## Rules\`, \`## Patterns\`, and \`## Lessons Learned\`.
|
|
125
225
|
|
|
126
|
-
|
|
226
|
+
If the file does not exist yet, create it first using the \`write\` tool with
|
|
227
|
+
exactly this canonical structure, then treat all tables as empty (next IDs
|
|
228
|
+
\`P001\` / \`L001\`):
|
|
127
229
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
Example: \`Source: M001-PLAN.md/Architecture Decisions\`
|
|
230
|
+
\`\`\`
|
|
231
|
+
# Project Knowledge
|
|
131
232
|
|
|
132
|
-
|
|
233
|
+
Append-only register of project-specific rules, patterns, and lessons learned.
|
|
234
|
+
Agents read this before every unit. Add entries when you discover something worth remembering.
|
|
133
235
|
|
|
134
|
-
|
|
236
|
+
## Rules
|
|
135
237
|
|
|
136
|
-
|
|
238
|
+
| # | Scope | Rule | Why | Added |
|
|
239
|
+
|---|-------|------|-----|-------|
|
|
137
240
|
|
|
138
|
-
|
|
241
|
+
## Patterns
|
|
139
242
|
|
|
140
|
-
|
|
243
|
+
| # | Pattern | Where | Notes |
|
|
244
|
+
|---|---------|-------|-------|
|
|
141
245
|
|
|
142
|
-
|
|
246
|
+
## Lessons Learned
|
|
143
247
|
|
|
144
|
-
|
|
248
|
+
| # | What Happened | Root Cause | Fix | Scope |
|
|
249
|
+
|---|--------------|------------|-----|-------|
|
|
250
|
+
\`\`\`
|
|
145
251
|
|
|
146
|
-
|
|
252
|
+
If the file already exists:
|
|
147
253
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
254
|
+
- find the highest existing \`P###\` ID in the \`## Patterns\` table — the next pattern ID is that + 1, zero-padded to three digits
|
|
255
|
+
- find the highest existing \`L###\` ID in the \`## Lessons Learned\` table — same rule for the next lesson ID
|
|
256
|
+
- read the existing \`Pattern\` and \`What Happened\` column text so you can skip semantic duplicates in steps 4 and 5
|
|
151
257
|
|
|
152
|
-
|
|
258
|
+
### Step 4 — Append Patterns to \`## Patterns\`
|
|
153
259
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
260
|
+
For each extracted Pattern that is **not** already represented in the table
|
|
261
|
+
(semantic match, not exact-string match), append exactly one row to the
|
|
262
|
+
\`## Patterns\` table in \`.gsd/KNOWLEDGE.md\`:
|
|
157
263
|
|
|
158
264
|
\`\`\`
|
|
159
|
-
|
|
160
|
-
- Chose PostgreSQL over SQLite for concurrent write support.
|
|
161
|
-
Source: M001-PLAN.md/Architecture Decisions
|
|
265
|
+
| P<NNN> | <Pattern — one concise line> | <Where — component / file / subsystem> | ${ctx.milestoneId} |
|
|
162
266
|
\`\`\`
|
|
163
267
|
|
|
164
|
-
|
|
268
|
+
Rules:
|
|
269
|
+
- Zero-pad IDs to three digits (\`P017\`, not \`P17\`).
|
|
270
|
+
- Append-only — never reorder, edit, or delete existing rows.
|
|
271
|
+
- If a column value is genuinely unknown, write \`—\` (em-dash). Never leave a cell empty.
|
|
272
|
+
|
|
273
|
+
### Step 5 — Append Lessons to \`## Lessons Learned\`
|
|
274
|
+
|
|
275
|
+
For each extracted Lesson that is not already represented, append one row to
|
|
276
|
+
the \`## Lessons Learned\` table:
|
|
277
|
+
|
|
278
|
+
\`\`\`
|
|
279
|
+
| L<NNN> | <What happened> | <Root cause> | <Fix or forward guidance> | ${ctx.milestoneId} |
|
|
280
|
+
\`\`\`
|
|
281
|
+
|
|
282
|
+
Same ID numbering, append-only, and em-dash rules as Step 4.
|
|
283
|
+
|
|
284
|
+
### Step 6 — Do NOT modify the \`## Rules\` table
|
|
285
|
+
|
|
286
|
+
The \`## Rules\` table holds project-wide constraints authored manually via
|
|
287
|
+
\`/gsd knowledge\`. Milestone learnings never produce rules — leave this
|
|
288
|
+
table untouched.
|
|
289
|
+
|
|
290
|
+
### Step 7 — Persist Decisions via \`gsd_save_decision\`
|
|
291
|
+
|
|
292
|
+
For each extracted Decision, call the \`gsd_save_decision\` MCP tool exactly
|
|
293
|
+
once with these parameters:
|
|
294
|
+
|
|
295
|
+
- \`scope\` (string) — \`"${ctx.milestoneId}"\`
|
|
296
|
+
- \`decision\` (string) — the question or issue that was decided
|
|
297
|
+
- \`choice\` (string) — the concrete option selected
|
|
298
|
+
- \`rationale\` (string) — why this choice was made, with a brief citation to the source artefact
|
|
299
|
+
- \`made_by\` (string) — \`"agent"\`
|
|
300
|
+
- \`revisable\` (string, optional) — \`"yes"\` or \`"no"\` only if the source artefact clearly indicates reversibility; otherwise omit
|
|
301
|
+
|
|
302
|
+
The tool writes the decision to the GSD database and regenerates
|
|
303
|
+
\`.gsd/DECISIONS.md\` atomically. Never edit \`DECISIONS.md\` manually — the
|
|
304
|
+
file is DB-authoritative and manual edits will be overwritten.
|
|
305
|
+
|
|
306
|
+
### Step 8 — Surprises stay only in LEARNINGS.md
|
|
307
|
+
|
|
308
|
+
Surprises are milestone-local context and are NOT cross-session-reusable. Do
|
|
309
|
+
not append them to \`KNOWLEDGE.md\`. Do not persist them via any MCP tool.
|
|
310
|
+
They are captured only in the LEARNINGS.md file written in Step 2.
|
|
311
|
+
|
|
312
|
+
### Step 9 — Deduplication rule (applies to Steps 4, 5, 7)
|
|
313
|
+
|
|
314
|
+
Before appending a Pattern or Lesson row, or before calling
|
|
315
|
+
\`gsd_save_decision\`, check whether a semantically equivalent entry already
|
|
316
|
+
exists in the target surface. If so, skip that item entirely. Prefer skipping
|
|
317
|
+
a near-duplicate over creating a second slightly-different row — redundancy
|
|
318
|
+
degrades the signal.`;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Build the full dispatch prompt for the manual `/gsd extract-learnings` path.
|
|
323
|
+
*
|
|
324
|
+
* Composes a header block (title, project, output file), the inlined milestone
|
|
325
|
+
* artefacts (roadmap, summary, optional verification and UAT reports), and the
|
|
326
|
+
* canonical {@link buildExtractionStepsBlock} procedure. The same procedure is
|
|
327
|
+
* rendered verbatim in the auto-mode `complete-milestone` turn via the
|
|
328
|
+
* `{{extractLearningsSteps}}` placeholder, guaranteeing a single source of
|
|
329
|
+
* truth for how learnings flow into `KNOWLEDGE.md` and the DECISIONS database.
|
|
330
|
+
*
|
|
331
|
+
* Missing optional artefacts are surfaced as a note at the end of the artefact
|
|
332
|
+
* section so the LLM can mark them explicitly in the LEARNINGS frontmatter.
|
|
333
|
+
*/
|
|
334
|
+
export function buildExtractLearningsPrompt(ctx: ExtractLearningsPromptContext): string {
|
|
335
|
+
const optionalSections: string[] = [];
|
|
336
|
+
|
|
337
|
+
if (ctx.verificationContent) {
|
|
338
|
+
optionalSections.push(`### Verification Report\n\n${ctx.verificationContent}`);
|
|
339
|
+
}
|
|
340
|
+
if (ctx.uatContent) {
|
|
341
|
+
optionalSections.push(`### UAT Report\n\n${ctx.uatContent}`);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const missingNote = ctx.missingArtifacts.length > 0
|
|
345
|
+
? `\nNote: the following optional artefacts were not available: ${ctx.missingArtifacts.join(", ")}\n`
|
|
346
|
+
: "";
|
|
347
|
+
|
|
348
|
+
const stepsBlock = buildExtractionStepsBlock({
|
|
349
|
+
milestoneId: ctx.milestoneId,
|
|
350
|
+
outputPath: ctx.outputPath,
|
|
351
|
+
relativeOutputPath: ctx.relativeOutputPath,
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
return `# Extract Learnings — ${ctx.milestoneId}: ${ctx.milestoneName}
|
|
355
|
+
|
|
356
|
+
**Project:** ${ctx.projectName}
|
|
357
|
+
**Output file:** ${ctx.outputPath}
|
|
358
|
+
|
|
359
|
+
## Your Task
|
|
360
|
+
|
|
361
|
+
Analyse the milestone artefacts inlined below and follow the Structured
|
|
362
|
+
Learnings Extraction procedure in full. The procedure writes LEARNINGS.md
|
|
363
|
+
and routes the durable subset into \`.gsd/KNOWLEDGE.md\` and the DECISIONS
|
|
364
|
+
database so future milestone dispatches benefit from what was learned here.
|
|
165
365
|
|
|
166
366
|
---
|
|
167
367
|
|
|
168
|
-
##
|
|
368
|
+
## Artefacts
|
|
169
369
|
|
|
170
|
-
|
|
171
|
-
- category: "decision" | "lesson" | "pattern" | "surprise"
|
|
172
|
-
- phase: "${ctx.milestoneId}"
|
|
173
|
-
- content: {the learning text}
|
|
174
|
-
- source: {artifact filename}
|
|
370
|
+
### Roadmap
|
|
175
371
|
|
|
176
|
-
|
|
372
|
+
${ctx.roadmapContent}
|
|
177
373
|
|
|
178
374
|
---
|
|
179
375
|
|
|
180
|
-
|
|
376
|
+
### Summary
|
|
181
377
|
|
|
182
|
-
|
|
378
|
+
${ctx.summaryContent}
|
|
379
|
+
${optionalSections.length > 0 ? `\n---\n\n${optionalSections.join("\n\n---\n\n")}\n` : ""}${missingNote}
|
|
380
|
+
---
|
|
183
381
|
|
|
184
|
-
|
|
382
|
+
${stepsBlock}
|
|
185
383
|
`;
|
|
186
384
|
}
|
|
187
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Serialises the YAML frontmatter block prepended to `{MID}-LEARNINGS.md`.
|
|
388
|
+
*
|
|
389
|
+
* The output begins and ends with a `---` fence so it can be concatenated
|
|
390
|
+
* directly with the body. Empty `missingArtifacts` is rendered as an
|
|
391
|
+
* inline empty list (`missing_artifacts: []`) to keep the frontmatter valid
|
|
392
|
+
* YAML in every case.
|
|
393
|
+
*/
|
|
188
394
|
export function buildFrontmatter(ctx: FrontmatterContext): string {
|
|
189
395
|
const missingList = ctx.missingArtifacts.length > 0
|
|
190
396
|
? ctx.missingArtifacts.map((a) => ` - ${a}`).join("\n")
|
|
@@ -208,6 +414,14 @@ missing_artifacts:${missingValue}
|
|
|
208
414
|
---`;
|
|
209
415
|
}
|
|
210
416
|
|
|
417
|
+
/**
|
|
418
|
+
* Extracts the project display name from `.gsd/PROJECT.md` frontmatter.
|
|
419
|
+
*
|
|
420
|
+
* Falls back to the project directory's basename if PROJECT.md is missing,
|
|
421
|
+
* unreadable, or has no `name:` field. Never throws — surfacing the raw
|
|
422
|
+
* directory name is preferable to crashing an extraction over a display
|
|
423
|
+
* string.
|
|
424
|
+
*/
|
|
211
425
|
export function extractProjectName(basePath: string): string {
|
|
212
426
|
const projectMdPath = join(gsdRoot(basePath), "PROJECT.md");
|
|
213
427
|
|
|
@@ -226,6 +440,15 @@ export function extractProjectName(basePath: string): string {
|
|
|
226
440
|
|
|
227
441
|
// ─── Handler ──────────────────────────────────────────────────────────────────
|
|
228
442
|
|
|
443
|
+
/**
|
|
444
|
+
* Handles the `/gsd extract-learnings <MID>` slash command.
|
|
445
|
+
*
|
|
446
|
+
* Resolves and reads the milestone artefacts, constructs the dispatch prompt
|
|
447
|
+
* via {@link buildExtractLearningsPrompt}, and triggers a new LLM turn via
|
|
448
|
+
* `pi.sendMessage({ triggerTurn: true })`. Returns quickly with a UI
|
|
449
|
+
* notification (not an error) when the milestone cannot be found or required
|
|
450
|
+
* artefacts are missing, matching the behaviour of sibling `/gsd` commands.
|
|
451
|
+
*/
|
|
229
452
|
export async function handleExtractLearnings(
|
|
230
453
|
args: string,
|
|
231
454
|
ctx: ExtensionCommandContext,
|
|
@@ -257,11 +480,9 @@ export async function handleExtractLearnings(
|
|
|
257
480
|
return;
|
|
258
481
|
}
|
|
259
482
|
|
|
260
|
-
|
|
261
|
-
const planContent = readFileSync(artifacts.plan!, "utf-8");
|
|
483
|
+
const roadmapContent = readFileSync(artifacts.roadmap!, "utf-8");
|
|
262
484
|
const summaryContent = readFileSync(artifacts.summary!, "utf-8");
|
|
263
485
|
|
|
264
|
-
// Read optional artefacts
|
|
265
486
|
const verificationContent = artifacts.verification
|
|
266
487
|
? readFileSync(artifacts.verification, "utf-8")
|
|
267
488
|
: null;
|
|
@@ -269,25 +490,23 @@ export async function handleExtractLearnings(
|
|
|
269
490
|
? readFileSync(artifacts.uat, "utf-8")
|
|
270
491
|
: null;
|
|
271
492
|
|
|
272
|
-
// Determine missing optional artefacts for context
|
|
273
493
|
const missingArtifacts: string[] = [];
|
|
274
494
|
if (!artifacts.verification) missingArtifacts.push(`${milestoneId}-VERIFICATION.md`);
|
|
275
495
|
if (!artifacts.uat) missingArtifacts.push(`${milestoneId}-UAT.md`);
|
|
276
496
|
|
|
277
|
-
|
|
278
|
-
const h1Match = planContent.match(/^#\s+(.+)$/m);
|
|
497
|
+
const h1Match = roadmapContent.match(/^#\s+(.+)$/m);
|
|
279
498
|
const milestoneName = h1Match?.[1]?.trim() ?? milestoneId;
|
|
280
499
|
|
|
281
500
|
const projectName = extractProjectName(basePath);
|
|
282
501
|
const outputPath = buildLearningsOutputPath(milestoneDir, milestoneId);
|
|
283
|
-
const relativeOutputPath =
|
|
502
|
+
const relativeOutputPath = relative(basePath, outputPath);
|
|
284
503
|
|
|
285
504
|
const prompt = buildExtractLearningsPrompt({
|
|
286
505
|
milestoneId,
|
|
287
506
|
milestoneName,
|
|
288
507
|
outputPath,
|
|
289
508
|
relativeOutputPath,
|
|
290
|
-
|
|
509
|
+
roadmapContent,
|
|
291
510
|
summaryContent,
|
|
292
511
|
verificationContent,
|
|
293
512
|
uatContent,
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
9
9
|
import { existsSync, readFileSync, mkdirSync } from "node:fs";
|
|
10
|
-
import { join } from "node:path";
|
|
10
|
+
import { join, resolve as resolvePath, sep } from "node:path";
|
|
11
|
+
import { homedir } from "node:os";
|
|
11
12
|
import { deriveState } from "./state.js";
|
|
12
13
|
import { gsdRoot } from "./paths.js";
|
|
13
14
|
import { appendCapture, hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
@@ -28,8 +29,24 @@ import { loadPrompt } from "./prompt-loader.js";
|
|
|
28
29
|
const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/gsd-pi/latest";
|
|
29
30
|
const UPDATE_FETCH_TIMEOUT_MS = 5000;
|
|
30
31
|
|
|
32
|
+
// Detects a bun-installed gsd via `process.argv[1]`. Mirrors isBunInstall in
|
|
33
|
+
// src/update-check.ts — duplicated because tsconfig.resources.json rootDir
|
|
34
|
+
// prevents importing from src/. See #4145 for why the runtime-only check
|
|
35
|
+
// (process.versions.bun) is insufficient: bun's global bin shims are plain
|
|
36
|
+
// symlinks, so the target's #!/usr/bin/env node shebang runs the script under
|
|
37
|
+
// Node even when it was installed by bun.
|
|
38
|
+
function isBunInstall(argv1: string | undefined = process.argv[1]): boolean {
|
|
39
|
+
if ('bun' in process.versions) return true;
|
|
40
|
+
if (!argv1) return false;
|
|
41
|
+
const bunBinDirs: string[] = [];
|
|
42
|
+
if (process.env.BUN_INSTALL) bunBinDirs.push(join(process.env.BUN_INSTALL, "bin"));
|
|
43
|
+
bunBinDirs.push(join(homedir(), ".bun", "bin"));
|
|
44
|
+
const resolved = resolvePath(argv1);
|
|
45
|
+
return bunBinDirs.some((dir) => resolved.startsWith(resolvePath(dir) + sep));
|
|
46
|
+
}
|
|
47
|
+
|
|
31
48
|
function resolveInstallCommand(pkg: string): string {
|
|
32
|
-
if (
|
|
49
|
+
if (isBunInstall()) return `bun add -g ${pkg}`;
|
|
33
50
|
return `npm install -g ${pkg}`;
|
|
34
51
|
}
|
|
35
52
|
|