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
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workflow-plugins.ts — Unified discovery for workflow plugins.
|
|
3
|
+
*
|
|
4
|
+
* Discovers workflow definitions from three tiers (project > global > bundled)
|
|
5
|
+
* in both YAML and markdown formats. Each plugin declares an execution mode
|
|
6
|
+
* that controls how `/gsd workflow <name>` dispatches it:
|
|
7
|
+
*
|
|
8
|
+
* oneshot — prompt-only, no state or scaffolding
|
|
9
|
+
* yaml-step — CustomWorkflowEngine run with GRAPH.yaml
|
|
10
|
+
* markdown-phase — STATE.json + phase gates (current md template behavior)
|
|
11
|
+
* auto-milestone — hooks into /gsd auto pipeline (full-project only)
|
|
12
|
+
*
|
|
13
|
+
* Precedence: project > global > bundled. Same-named file wins.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
readFileSync,
|
|
18
|
+
readdirSync,
|
|
19
|
+
existsSync,
|
|
20
|
+
statSync,
|
|
21
|
+
} from "node:fs";
|
|
22
|
+
import { join, dirname, extname, basename } from "node:path";
|
|
23
|
+
import { fileURLToPath } from "node:url";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { parse as parseYaml } from "yaml";
|
|
26
|
+
|
|
27
|
+
import { loadRegistry, type TemplateEntry, type WorkflowMode } from "./workflow-templates.js";
|
|
28
|
+
|
|
29
|
+
export type { WorkflowMode } from "./workflow-templates.js";
|
|
30
|
+
|
|
31
|
+
export type PluginSource = "project" | "global" | "bundled";
|
|
32
|
+
export type PluginFormat = "yaml" | "md";
|
|
33
|
+
|
|
34
|
+
export interface WorkflowPluginMeta {
|
|
35
|
+
displayName: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
mode: WorkflowMode;
|
|
38
|
+
phases?: string[];
|
|
39
|
+
triggers?: string[];
|
|
40
|
+
complexity?: string;
|
|
41
|
+
artifactDir?: string | null;
|
|
42
|
+
requiresProject?: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface WorkflowPlugin {
|
|
46
|
+
name: string;
|
|
47
|
+
path: string;
|
|
48
|
+
format: PluginFormat;
|
|
49
|
+
source: PluginSource;
|
|
50
|
+
meta: WorkflowPluginMeta;
|
|
51
|
+
/** Populated if the plugin failed validation — discovery still succeeds. */
|
|
52
|
+
error?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ─── Path resolution ─────────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
function resolveBundledDir(): string {
|
|
58
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
59
|
+
const local = join(moduleDir, "workflow-templates");
|
|
60
|
+
if (existsSync(local)) return local;
|
|
61
|
+
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
62
|
+
const agentGsdDir = join(gsdHome, "agent", "extensions", "gsd", "workflow-templates");
|
|
63
|
+
if (existsSync(agentGsdDir)) return agentGsdDir;
|
|
64
|
+
return local;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function globalPluginsDir(): string {
|
|
68
|
+
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
69
|
+
return join(gsdHome, "workflows");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function projectPluginsDir(basePath: string): string {
|
|
73
|
+
return join(basePath, ".gsd", "workflows");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function legacyDefsDir(basePath: string): string {
|
|
77
|
+
return join(basePath, ".gsd", "workflow-defs");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ─── Markdown frontmatter parsing ────────────────────────────────────────
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Parse the `<template_meta>` block from bundled/user markdown workflow files.
|
|
84
|
+
* Returns a loose key-value map (strings only).
|
|
85
|
+
*/
|
|
86
|
+
function parseTemplateMeta(content: string): Record<string, string> {
|
|
87
|
+
const match = content.match(/<template_meta>([\s\S]*?)<\/template_meta>/);
|
|
88
|
+
if (!match) return {};
|
|
89
|
+
|
|
90
|
+
const body = match[1];
|
|
91
|
+
const result: Record<string, string> = {};
|
|
92
|
+
for (const line of body.split(/\r?\n/)) {
|
|
93
|
+
const trimmed = line.trim();
|
|
94
|
+
if (!trimmed) continue;
|
|
95
|
+
const colon = trimmed.indexOf(":");
|
|
96
|
+
if (colon === -1) continue;
|
|
97
|
+
const key = trimmed.slice(0, colon).trim();
|
|
98
|
+
const value = trimmed.slice(colon + 1).trim();
|
|
99
|
+
result[key] = value;
|
|
100
|
+
}
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function parsePhasesFromMarkdown(content: string): string[] {
|
|
105
|
+
const match = content.match(/<phases>([\s\S]*?)<\/phases>/);
|
|
106
|
+
if (!match) return [];
|
|
107
|
+
const phases: string[] = [];
|
|
108
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
109
|
+
const m = line.match(/^\s*\d+\.\s*(\S+)/);
|
|
110
|
+
if (m) phases.push(m[1]);
|
|
111
|
+
}
|
|
112
|
+
return phases;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function firstHeading(content: string): string | undefined {
|
|
116
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
117
|
+
return match ? match[1].trim() : undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function isValidMode(v: unknown): v is WorkflowMode {
|
|
121
|
+
return v === "oneshot" || v === "yaml-step" || v === "markdown-phase" || v === "auto-milestone";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ─── Single-file plugin loaders ──────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
function loadMarkdownPlugin(filePath: string, source: PluginSource): WorkflowPlugin | null {
|
|
127
|
+
const name = basenameNoExt(filePath);
|
|
128
|
+
let content: string;
|
|
129
|
+
try {
|
|
130
|
+
content = readFileSync(filePath, "utf-8");
|
|
131
|
+
} catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const meta = parseTemplateMeta(content);
|
|
136
|
+
const phases = parsePhasesFromMarkdown(content);
|
|
137
|
+
const declaredMode = meta.mode;
|
|
138
|
+
const mode: WorkflowMode = isValidMode(declaredMode) ? declaredMode : "markdown-phase";
|
|
139
|
+
|
|
140
|
+
const triggers = meta.triggers
|
|
141
|
+
? meta.triggers.split(",").map((s) => s.trim()).filter(Boolean)
|
|
142
|
+
: undefined;
|
|
143
|
+
|
|
144
|
+
const artifactDirValue = meta.artifact_dir === "null" || meta.artifact_dir === "" ? null : meta.artifact_dir;
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
name,
|
|
148
|
+
path: filePath,
|
|
149
|
+
format: "md",
|
|
150
|
+
source,
|
|
151
|
+
meta: {
|
|
152
|
+
displayName: meta.name || firstHeading(content) || name,
|
|
153
|
+
description: meta.description,
|
|
154
|
+
mode,
|
|
155
|
+
phases: phases.length > 0 ? phases : undefined,
|
|
156
|
+
triggers,
|
|
157
|
+
complexity: meta.complexity,
|
|
158
|
+
artifactDir: artifactDirValue ?? undefined,
|
|
159
|
+
requiresProject: meta.requires_project === "true",
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function loadYamlPlugin(filePath: string, source: PluginSource): WorkflowPlugin | null {
|
|
165
|
+
const name = basenameNoExt(filePath);
|
|
166
|
+
let raw: string;
|
|
167
|
+
try {
|
|
168
|
+
raw = readFileSync(filePath, "utf-8");
|
|
169
|
+
} catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let parsed: unknown;
|
|
174
|
+
try {
|
|
175
|
+
parsed = parseYaml(raw);
|
|
176
|
+
} catch (err) {
|
|
177
|
+
return {
|
|
178
|
+
name,
|
|
179
|
+
path: filePath,
|
|
180
|
+
format: "yaml",
|
|
181
|
+
source,
|
|
182
|
+
meta: { displayName: name, mode: "yaml-step" },
|
|
183
|
+
error: `YAML parse error: ${err instanceof Error ? err.message : String(err)}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (parsed == null || typeof parsed !== "object") {
|
|
188
|
+
return {
|
|
189
|
+
name,
|
|
190
|
+
path: filePath,
|
|
191
|
+
format: "yaml",
|
|
192
|
+
source,
|
|
193
|
+
meta: { displayName: name, mode: "yaml-step" },
|
|
194
|
+
error: "Definition is not an object",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const def = parsed as Record<string, unknown>;
|
|
199
|
+
const declaredMode = def.mode;
|
|
200
|
+
const mode: WorkflowMode = isValidMode(declaredMode) ? declaredMode : "yaml-step";
|
|
201
|
+
|
|
202
|
+
const steps = Array.isArray(def.steps) ? (def.steps as Array<Record<string, unknown>>) : [];
|
|
203
|
+
const phases = steps.map((s) => String(s.id ?? "")).filter(Boolean);
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
name,
|
|
207
|
+
path: filePath,
|
|
208
|
+
format: "yaml",
|
|
209
|
+
source,
|
|
210
|
+
meta: {
|
|
211
|
+
displayName: typeof def.name === "string" && def.name.trim() ? def.name : name,
|
|
212
|
+
description: typeof def.description === "string" ? def.description : undefined,
|
|
213
|
+
mode,
|
|
214
|
+
phases: phases.length > 0 ? phases : undefined,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function basenameNoExt(filePath: string): string {
|
|
220
|
+
const ext = extname(filePath);
|
|
221
|
+
return basename(filePath, ext);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ─── Directory walkers ───────────────────────────────────────────────────
|
|
225
|
+
|
|
226
|
+
const PLUGIN_EXTENSIONS = new Set([".yaml", ".yml", ".md"]);
|
|
227
|
+
|
|
228
|
+
function walkPluginDir(dir: string, source: PluginSource, out: Map<string, WorkflowPlugin>): void {
|
|
229
|
+
if (!existsSync(dir)) return;
|
|
230
|
+
let entries: string[];
|
|
231
|
+
try {
|
|
232
|
+
entries = readdirSync(dir);
|
|
233
|
+
} catch {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
for (const entry of entries) {
|
|
237
|
+
const full = join(dir, entry);
|
|
238
|
+
let info: ReturnType<typeof statSync>;
|
|
239
|
+
try {
|
|
240
|
+
info = statSync(full);
|
|
241
|
+
} catch {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (!info.isFile()) continue;
|
|
245
|
+
const ext = extname(entry).toLowerCase();
|
|
246
|
+
if (!PLUGIN_EXTENSIONS.has(ext)) continue;
|
|
247
|
+
|
|
248
|
+
const plugin = ext === ".md"
|
|
249
|
+
? loadMarkdownPlugin(full, source)
|
|
250
|
+
: loadYamlPlugin(full, source);
|
|
251
|
+
if (!plugin) continue;
|
|
252
|
+
out.set(plugin.name, plugin);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function loadBundledPlugins(out: Map<string, WorkflowPlugin>): void {
|
|
257
|
+
const bundledDir = resolveBundledDir();
|
|
258
|
+
if (!existsSync(bundledDir)) return;
|
|
259
|
+
|
|
260
|
+
const registry = loadRegistry();
|
|
261
|
+
for (const [id, entry] of Object.entries(registry.templates)) {
|
|
262
|
+
const filePath = join(bundledDir, entry.file);
|
|
263
|
+
if (!existsSync(filePath)) continue;
|
|
264
|
+
const ext = extname(entry.file).toLowerCase();
|
|
265
|
+
const format: PluginFormat = ext === ".md" ? "md" : "yaml";
|
|
266
|
+
const mode: WorkflowMode = isValidMode(entry.mode)
|
|
267
|
+
? entry.mode
|
|
268
|
+
: (format === "yaml" ? "yaml-step" : "markdown-phase");
|
|
269
|
+
out.set(id, {
|
|
270
|
+
name: id,
|
|
271
|
+
path: filePath,
|
|
272
|
+
format,
|
|
273
|
+
source: "bundled",
|
|
274
|
+
meta: {
|
|
275
|
+
displayName: entry.name,
|
|
276
|
+
description: entry.description,
|
|
277
|
+
mode,
|
|
278
|
+
phases: Array.isArray(entry.phases) && entry.phases.length > 0 ? entry.phases : undefined,
|
|
279
|
+
triggers: Array.isArray(entry.triggers) ? entry.triggers : undefined,
|
|
280
|
+
complexity: entry.estimated_complexity,
|
|
281
|
+
artifactDir: entry.artifact_dir,
|
|
282
|
+
requiresProject: entry.requires_project,
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Discover all workflow plugins. Project overrides global overrides bundled.
|
|
292
|
+
*
|
|
293
|
+
* The legacy `.gsd/workflow-defs/*.yaml` directory is also scanned as a
|
|
294
|
+
* fallback YAML source so existing user definitions keep working.
|
|
295
|
+
*/
|
|
296
|
+
export function discoverPlugins(basePath: string): Map<string, WorkflowPlugin> {
|
|
297
|
+
const out = new Map<string, WorkflowPlugin>();
|
|
298
|
+
|
|
299
|
+
loadBundledPlugins(out);
|
|
300
|
+
walkPluginDir(globalPluginsDir(), "global", out);
|
|
301
|
+
walkPluginDir(legacyDefsDir(basePath), "project", out);
|
|
302
|
+
walkPluginDir(projectPluginsDir(basePath), "project", out);
|
|
303
|
+
|
|
304
|
+
return out;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Resolve a plugin by name using the precedence chain.
|
|
309
|
+
* Returns null if no plugin by that name exists anywhere.
|
|
310
|
+
*/
|
|
311
|
+
export function resolvePlugin(basePath: string, name: string): WorkflowPlugin | null {
|
|
312
|
+
const plugins = discoverPlugins(basePath);
|
|
313
|
+
return plugins.get(name) ?? null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Format all discovered plugins for display, grouped by mode.
|
|
318
|
+
*/
|
|
319
|
+
export function listPluginsFormatted(basePath: string): string {
|
|
320
|
+
const plugins = discoverPlugins(basePath);
|
|
321
|
+
if (plugins.size === 0) {
|
|
322
|
+
return "No workflow plugins found.\n\nRun /gsd workflow new to author one.";
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const groups: Record<WorkflowMode, WorkflowPlugin[]> = {
|
|
326
|
+
"oneshot": [],
|
|
327
|
+
"yaml-step": [],
|
|
328
|
+
"markdown-phase": [],
|
|
329
|
+
"auto-milestone": [],
|
|
330
|
+
};
|
|
331
|
+
for (const p of plugins.values()) {
|
|
332
|
+
groups[p.meta.mode].push(p);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const lines: string[] = ["Workflow Plugins\n"];
|
|
336
|
+
|
|
337
|
+
const order: WorkflowMode[] = ["markdown-phase", "yaml-step", "oneshot", "auto-milestone"];
|
|
338
|
+
for (const mode of order) {
|
|
339
|
+
const list = groups[mode].slice().sort((a, b) => a.name.localeCompare(b.name));
|
|
340
|
+
if (list.length === 0) continue;
|
|
341
|
+
lines.push(` [${mode}]`);
|
|
342
|
+
for (const p of list) {
|
|
343
|
+
const tag = `${p.source}/${p.format}`;
|
|
344
|
+
const desc = p.meta.description ? ` — ${p.meta.description}` : "";
|
|
345
|
+
lines.push(` ${p.name.padEnd(22)} ${tag.padEnd(16)}${desc}`);
|
|
346
|
+
}
|
|
347
|
+
lines.push("");
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
lines.push("Usage:");
|
|
351
|
+
lines.push(" /gsd workflow <name> Run a plugin directly");
|
|
352
|
+
lines.push(" /gsd workflow info <name> Show plugin details");
|
|
353
|
+
lines.push(" /gsd workflow install <src> Install a plugin from a URL");
|
|
354
|
+
|
|
355
|
+
return lines.join("\n");
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Format a single plugin's metadata for `/gsd workflow info <name>`.
|
|
360
|
+
*/
|
|
361
|
+
export function formatPluginInfo(plugin: WorkflowPlugin): string {
|
|
362
|
+
const lines = [
|
|
363
|
+
`Plugin: ${plugin.meta.displayName} (${plugin.name})`,
|
|
364
|
+
"",
|
|
365
|
+
`Source: ${plugin.source}`,
|
|
366
|
+
`Format: ${plugin.format}`,
|
|
367
|
+
`Mode: ${plugin.meta.mode}`,
|
|
368
|
+
`Path: ${plugin.path}`,
|
|
369
|
+
];
|
|
370
|
+
if (plugin.meta.description) {
|
|
371
|
+
lines.push(`About: ${plugin.meta.description}`);
|
|
372
|
+
}
|
|
373
|
+
if (plugin.meta.complexity) {
|
|
374
|
+
lines.push(`Complexity: ${plugin.meta.complexity}`);
|
|
375
|
+
}
|
|
376
|
+
if (plugin.meta.phases && plugin.meta.phases.length > 0) {
|
|
377
|
+
lines.push("", "Phases/Steps:");
|
|
378
|
+
plugin.meta.phases.forEach((p, i) => lines.push(` ${i + 1}. ${p}`));
|
|
379
|
+
}
|
|
380
|
+
if (plugin.meta.triggers && plugin.meta.triggers.length > 0) {
|
|
381
|
+
lines.push("", `Triggers: ${plugin.meta.triggers.join(", ")}`);
|
|
382
|
+
}
|
|
383
|
+
if (plugin.meta.artifactDir) {
|
|
384
|
+
lines.push("", `Artifacts: ${plugin.meta.artifactDir}`);
|
|
385
|
+
}
|
|
386
|
+
if (plugin.error) {
|
|
387
|
+
lines.push("", `⚠ Error: ${plugin.error}`);
|
|
388
|
+
}
|
|
389
|
+
return lines.join("\n");
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Get the plugin directory paths for the project/global/bundled tiers.
|
|
394
|
+
* Exposed for the install command and tests.
|
|
395
|
+
*/
|
|
396
|
+
export function getPluginDirs(basePath: string): { project: string; global: string; bundled: string; legacy: string } {
|
|
397
|
+
return {
|
|
398
|
+
project: projectPluginsDir(basePath),
|
|
399
|
+
global: globalPluginsDir(),
|
|
400
|
+
bundled: resolveBundledDir(),
|
|
401
|
+
legacy: legacyDefsDir(basePath),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
@@ -19,6 +19,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
19
19
|
import { isClosedStatus } from "./status-guards.js";
|
|
20
20
|
import { deriveState } from "./state.js";
|
|
21
21
|
import type { GSDState } from "./types.js";
|
|
22
|
+
import { renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
22
23
|
|
|
23
24
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
24
25
|
|
|
@@ -375,11 +376,13 @@ export async function renderStateProjection(basePath: string): Promise<void> {
|
|
|
375
376
|
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
376
377
|
*/
|
|
377
378
|
export async function renderAllProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
378
|
-
//
|
|
379
|
+
// Delegate to the authoritative roadmap renderer — the reduced
|
|
380
|
+
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
381
|
+
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
379
382
|
try {
|
|
380
|
-
|
|
383
|
+
await renderRoadmapFromDb(basePath, milestoneId);
|
|
381
384
|
} catch (err) {
|
|
382
|
-
logWarning("projection", `
|
|
385
|
+
logWarning("projection", `renderRoadmapFromDb failed for ${milestoneId}: ${(err as Error).message}`);
|
|
383
386
|
}
|
|
384
387
|
|
|
385
388
|
// Query all slices for this milestone
|
|
@@ -416,15 +419,16 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
416
419
|
|
|
417
420
|
/**
|
|
418
421
|
* Check if a projection file exists on disk. If missing, regenerate it from DB.
|
|
419
|
-
* Returns true if the file was regenerated, false if it already existed
|
|
422
|
+
* Returns true if the file was regenerated, false if it already existed or
|
|
423
|
+
* regeneration failed.
|
|
420
424
|
* Satisfies PROJ-05 (corrupted/deleted projections regenerate on demand).
|
|
421
425
|
*/
|
|
422
|
-
export function regenerateIfMissing(
|
|
426
|
+
export async function regenerateIfMissing(
|
|
423
427
|
basePath: string,
|
|
424
428
|
milestoneId: string,
|
|
425
429
|
sliceId: string,
|
|
426
430
|
fileType: "PLAN" | "ROADMAP" | "SUMMARY" | "STATE",
|
|
427
|
-
): boolean {
|
|
431
|
+
): Promise<boolean> {
|
|
428
432
|
let filePath: string;
|
|
429
433
|
|
|
430
434
|
switch (fileType) {
|
|
@@ -466,23 +470,21 @@ export function regenerateIfMissing(
|
|
|
466
470
|
return false;
|
|
467
471
|
}
|
|
468
472
|
|
|
469
|
-
// Regenerate the missing file
|
|
473
|
+
// Regenerate the missing file. Each renderer may swallow its own errors
|
|
474
|
+
// (e.g. renderStateProjection), so confirm the file actually exists on
|
|
475
|
+
// disk before reporting success — true must mean "file is there now".
|
|
470
476
|
try {
|
|
471
477
|
switch (fileType) {
|
|
472
478
|
case "PLAN":
|
|
473
479
|
renderPlanProjection(basePath, milestoneId, sliceId);
|
|
474
|
-
|
|
480
|
+
return existsSync(filePath);
|
|
475
481
|
case "ROADMAP":
|
|
476
|
-
|
|
477
|
-
|
|
482
|
+
await renderRoadmapFromDb(basePath, milestoneId);
|
|
483
|
+
return existsSync(filePath);
|
|
478
484
|
case "STATE":
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
// on the next post-mutation hook cycle.
|
|
482
|
-
void renderStateProjection(basePath);
|
|
483
|
-
return false;
|
|
485
|
+
await renderStateProjection(basePath);
|
|
486
|
+
return existsSync(filePath);
|
|
484
487
|
}
|
|
485
|
-
return true;
|
|
486
488
|
} catch (err) {
|
|
487
489
|
logWarning("projection", `regenerateIfMissing ${fileType} failed: ${(err as Error).message}`);
|
|
488
490
|
return false;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Accessibility Audit
|
|
2
|
+
|
|
3
|
+
<template_meta>
|
|
4
|
+
name: accessibility-audit
|
|
5
|
+
version: 1
|
|
6
|
+
mode: oneshot
|
|
7
|
+
requires_project: false
|
|
8
|
+
artifact_dir: null
|
|
9
|
+
</template_meta>
|
|
10
|
+
|
|
11
|
+
<purpose>
|
|
12
|
+
Scan the UI layer for accessibility issues and produce a prioritized remediation
|
|
13
|
+
list. Oneshot — report only, no code changes.
|
|
14
|
+
</purpose>
|
|
15
|
+
|
|
16
|
+
<instructions>
|
|
17
|
+
|
|
18
|
+
## 1. Identify the UI stack
|
|
19
|
+
|
|
20
|
+
- React, Vue, Svelte, Angular, plain HTML, or something else?
|
|
21
|
+
- Which files contain user-facing templates? (e.g. `src/components/**/*.tsx`,
|
|
22
|
+
`pages/**/*.vue`, `templates/**/*.html`).
|
|
23
|
+
|
|
24
|
+
If the project has no UI layer (library, CLI, backend), say so and stop.
|
|
25
|
+
|
|
26
|
+
## 2. Run available a11y tooling
|
|
27
|
+
|
|
28
|
+
Prefer automated tools when installed:
|
|
29
|
+
- React: `@axe-core/react`, `eslint-plugin-jsx-a11y`.
|
|
30
|
+
- Vue: `eslint-plugin-vuejs-accessibility`.
|
|
31
|
+
- Any: `pa11y` or `axe` against a running dev server.
|
|
32
|
+
|
|
33
|
+
If nothing's installed, do a **static audit**: grep for the common
|
|
34
|
+
violations listed below.
|
|
35
|
+
|
|
36
|
+
## 3. Check the WCAG essentials
|
|
37
|
+
|
|
38
|
+
For each component/page:
|
|
39
|
+
|
|
40
|
+
1. **Images** without `alt`.
|
|
41
|
+
2. **Buttons** that are `<div onClick>` instead of real `<button>`.
|
|
42
|
+
3. **Links** without `href` or with only an icon and no label.
|
|
43
|
+
4. **Form inputs** without an associated `<label>` or `aria-label`.
|
|
44
|
+
5. **Color-only** state indicators (errors shown only with red, etc.).
|
|
45
|
+
6. **Focus management**: missing `:focus-visible`, tab traps, hidden focus.
|
|
46
|
+
7. **Headings** that skip levels (`h1` → `h3` with no `h2`).
|
|
47
|
+
8. **ARIA**: `role=button` on divs (should just be a button), misuse of
|
|
48
|
+
`aria-label` on elements that already have accessible text.
|
|
49
|
+
9. **Landmark regions**: missing `<main>`, `<nav>`, `<header>`.
|
|
50
|
+
10. **Keyboard traps**: modals/dialogs without escape handlers.
|
|
51
|
+
|
|
52
|
+
## 4. Triage by severity
|
|
53
|
+
|
|
54
|
+
- **Blocker** (P0) — prevents a user from completing a core task with
|
|
55
|
+
keyboard / screen reader.
|
|
56
|
+
- **Serious** (P1) — materially degrades the experience but workable.
|
|
57
|
+
- **Moderate** (P2) — fixable, would benefit most users.
|
|
58
|
+
- **Minor** (P3) — polish.
|
|
59
|
+
|
|
60
|
+
## 5. Output
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
# A11y Audit — <date>
|
|
64
|
+
|
|
65
|
+
## Summary
|
|
66
|
+
<scope — how many components/pages reviewed, tool coverage>
|
|
67
|
+
|
|
68
|
+
## Blockers (P0) — <n>
|
|
69
|
+
- file:line — issue
|
|
70
|
+
Fix: <specific code suggestion>
|
|
71
|
+
|
|
72
|
+
## Serious (P1) — <n>
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
## Moderate / Minor
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
## Top 5 Recommendations
|
|
79
|
+
1. <highest-impact fix first>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 6. Don't refactor
|
|
83
|
+
|
|
84
|
+
Suggestions should be specific enough to act on, but don't edit any files.
|
|
85
|
+
If the user wants to apply the fixes, suggest:
|
|
86
|
+
> `/gsd workflow refactor "apply a11y fixes"` with this report as context.
|
|
87
|
+
|
|
88
|
+
</instructions>
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# API Breaking Change Workflow
|
|
2
|
+
|
|
3
|
+
<template_meta>
|
|
4
|
+
name: api-breaking-change
|
|
5
|
+
version: 1
|
|
6
|
+
mode: markdown-phase
|
|
7
|
+
requires_project: false
|
|
8
|
+
artifact_dir: .gsd/workflows/api-breaks/
|
|
9
|
+
</template_meta>
|
|
10
|
+
|
|
11
|
+
<purpose>
|
|
12
|
+
Remove or redesign a public API in a controlled way. Surveys all callers,
|
|
13
|
+
migrates them, deprecates the old surface, and schedules the removal release.
|
|
14
|
+
Built for APIs consumed by other modules in the repo AND by external
|
|
15
|
+
dependents where feasible.
|
|
16
|
+
</purpose>
|
|
17
|
+
|
|
18
|
+
<phases>
|
|
19
|
+
1. survey — Identify all callers, draft the new design
|
|
20
|
+
2. migrate — Land the new API and migrate internal callers
|
|
21
|
+
3. deprecate — Mark the old API deprecated, communicate the change
|
|
22
|
+
4. release — Remove the old API in a future release
|
|
23
|
+
</phases>
|
|
24
|
+
|
|
25
|
+
<process>
|
|
26
|
+
|
|
27
|
+
## Phase 1: Survey
|
|
28
|
+
|
|
29
|
+
**Goal:** Understand the blast radius before touching anything.
|
|
30
|
+
|
|
31
|
+
1. **Identify the old API:**
|
|
32
|
+
- What's the symbol/route/contract? Where is it defined?
|
|
33
|
+
- Is it internal-only, exported to the SDK, or a public network endpoint?
|
|
34
|
+
|
|
35
|
+
2. **Map callers:**
|
|
36
|
+
- Internal: `grep` the symbol across the repo. List every call site with
|
|
37
|
+
file:line.
|
|
38
|
+
- External (if applicable): check the package registry for direct
|
|
39
|
+
dependents, look for GitHub code search results, check the docs.
|
|
40
|
+
|
|
41
|
+
3. **Draft the new shape:**
|
|
42
|
+
- What's changing? (rename, signature change, semantic change?)
|
|
43
|
+
- What's the migration pattern for a typical caller?
|
|
44
|
+
- Can callers migrate incrementally, or is it all-or-nothing?
|
|
45
|
+
|
|
46
|
+
4. **Produce `SURVEY.md`** with:
|
|
47
|
+
- Old signature vs new signature.
|
|
48
|
+
- Full caller list (internal + best-effort external).
|
|
49
|
+
- Migration difficulty per caller type.
|
|
50
|
+
- Timeline proposal: deprecate in release X, remove in release Y.
|
|
51
|
+
|
|
52
|
+
5. **Gate:** Review the survey with the user. This is the "do we actually want
|
|
53
|
+
to do this?" checkpoint. Don't proceed if the blast radius is larger than
|
|
54
|
+
the benefit.
|
|
55
|
+
|
|
56
|
+
## Phase 2: Migrate
|
|
57
|
+
|
|
58
|
+
**Goal:** Land the new API and move internal callers to it.
|
|
59
|
+
|
|
60
|
+
1. **Introduce the new API alongside the old one:**
|
|
61
|
+
- Export the new function/class/endpoint.
|
|
62
|
+
- The old API still works unchanged.
|
|
63
|
+
- Add tests for the new API.
|
|
64
|
+
|
|
65
|
+
2. **Migrate internal callers:**
|
|
66
|
+
- One file at a time, atomic commits: `refactor(api): migrate <caller> to <new-api>`.
|
|
67
|
+
- Run tests after each batch.
|
|
68
|
+
|
|
69
|
+
3. **Add a feature flag** if helpful — some callers may need runtime toggles
|
|
70
|
+
during a staged rollout.
|
|
71
|
+
|
|
72
|
+
4. **Gate:** All internal callers migrated, tests green. Confirm before
|
|
73
|
+
proceeding to the deprecation phase.
|
|
74
|
+
|
|
75
|
+
## Phase 3: Deprecate
|
|
76
|
+
|
|
77
|
+
**Goal:** Tell external callers to migrate.
|
|
78
|
+
|
|
79
|
+
1. **Mark the old API deprecated:**
|
|
80
|
+
- Add `@deprecated` JSDoc / language-equivalent annotations.
|
|
81
|
+
- Log a runtime deprecation warning on first use (if feasible and the
|
|
82
|
+
language supports it). Include the migration path in the message.
|
|
83
|
+
|
|
84
|
+
2. **Update docs:**
|
|
85
|
+
- Changelog: a prominent `### Deprecated` section with migration guidance.
|
|
86
|
+
- README / API docs: note the deprecation timeline.
|
|
87
|
+
- If there's a `MIGRATIONS.md`, add an entry.
|
|
88
|
+
|
|
89
|
+
3. **Communicate:**
|
|
90
|
+
- Draft a release-notes entry with before/after code examples.
|
|
91
|
+
- If the API has external users, draft an issue or blog post.
|
|
92
|
+
|
|
93
|
+
4. **Ship** the deprecation release (coordinate with `/gsd workflow release`).
|
|
94
|
+
|
|
95
|
+
5. **Gate:** Deprecation is live, callers have had time to migrate. Decide
|
|
96
|
+
the removal timeline (typically next minor or next major).
|
|
97
|
+
|
|
98
|
+
## Phase 4: Release (removal)
|
|
99
|
+
|
|
100
|
+
**Goal:** Delete the old API in a future release.
|
|
101
|
+
|
|
102
|
+
1. **Verify ecosystem readiness:**
|
|
103
|
+
- Have internal consumers upgraded?
|
|
104
|
+
- Have known external consumers upgraded? If not, is it OK to force it?
|
|
105
|
+
|
|
106
|
+
2. **Remove the old API:**
|
|
107
|
+
- Delete the deprecated code paths.
|
|
108
|
+
- Update tests.
|
|
109
|
+
- Update docs to remove references.
|
|
110
|
+
|
|
111
|
+
3. **Release** as part of a major version bump (semver). Document the removal
|
|
112
|
+
prominently in the changelog.
|
|
113
|
+
|
|
114
|
+
4. **Close the loop:** update `SURVEY.md` with the final outcome — what
|
|
115
|
+
shipped, what's still outstanding, any lessons learned.
|
|
116
|
+
|
|
117
|
+
</process>
|