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,346 @@
|
|
|
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
|
+
import { readFileSync, readdirSync, existsSync, statSync, } from "node:fs";
|
|
16
|
+
import { join, dirname, extname, basename } from "node:path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
import { parse as parseYaml } from "yaml";
|
|
20
|
+
import { loadRegistry } from "./workflow-templates.js";
|
|
21
|
+
// ─── Path resolution ─────────────────────────────────────────────────────
|
|
22
|
+
function resolveBundledDir() {
|
|
23
|
+
const moduleDir = dirname(fileURLToPath(import.meta.url));
|
|
24
|
+
const local = join(moduleDir, "workflow-templates");
|
|
25
|
+
if (existsSync(local))
|
|
26
|
+
return local;
|
|
27
|
+
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
28
|
+
const agentGsdDir = join(gsdHome, "agent", "extensions", "gsd", "workflow-templates");
|
|
29
|
+
if (existsSync(agentGsdDir))
|
|
30
|
+
return agentGsdDir;
|
|
31
|
+
return local;
|
|
32
|
+
}
|
|
33
|
+
function globalPluginsDir() {
|
|
34
|
+
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
35
|
+
return join(gsdHome, "workflows");
|
|
36
|
+
}
|
|
37
|
+
function projectPluginsDir(basePath) {
|
|
38
|
+
return join(basePath, ".gsd", "workflows");
|
|
39
|
+
}
|
|
40
|
+
function legacyDefsDir(basePath) {
|
|
41
|
+
return join(basePath, ".gsd", "workflow-defs");
|
|
42
|
+
}
|
|
43
|
+
// ─── Markdown frontmatter parsing ────────────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Parse the `<template_meta>` block from bundled/user markdown workflow files.
|
|
46
|
+
* Returns a loose key-value map (strings only).
|
|
47
|
+
*/
|
|
48
|
+
function parseTemplateMeta(content) {
|
|
49
|
+
const match = content.match(/<template_meta>([\s\S]*?)<\/template_meta>/);
|
|
50
|
+
if (!match)
|
|
51
|
+
return {};
|
|
52
|
+
const body = match[1];
|
|
53
|
+
const result = {};
|
|
54
|
+
for (const line of body.split(/\r?\n/)) {
|
|
55
|
+
const trimmed = line.trim();
|
|
56
|
+
if (!trimmed)
|
|
57
|
+
continue;
|
|
58
|
+
const colon = trimmed.indexOf(":");
|
|
59
|
+
if (colon === -1)
|
|
60
|
+
continue;
|
|
61
|
+
const key = trimmed.slice(0, colon).trim();
|
|
62
|
+
const value = trimmed.slice(colon + 1).trim();
|
|
63
|
+
result[key] = value;
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
function parsePhasesFromMarkdown(content) {
|
|
68
|
+
const match = content.match(/<phases>([\s\S]*?)<\/phases>/);
|
|
69
|
+
if (!match)
|
|
70
|
+
return [];
|
|
71
|
+
const phases = [];
|
|
72
|
+
for (const line of match[1].split(/\r?\n/)) {
|
|
73
|
+
const m = line.match(/^\s*\d+\.\s*(\S+)/);
|
|
74
|
+
if (m)
|
|
75
|
+
phases.push(m[1]);
|
|
76
|
+
}
|
|
77
|
+
return phases;
|
|
78
|
+
}
|
|
79
|
+
function firstHeading(content) {
|
|
80
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
81
|
+
return match ? match[1].trim() : undefined;
|
|
82
|
+
}
|
|
83
|
+
function isValidMode(v) {
|
|
84
|
+
return v === "oneshot" || v === "yaml-step" || v === "markdown-phase" || v === "auto-milestone";
|
|
85
|
+
}
|
|
86
|
+
// ─── Single-file plugin loaders ──────────────────────────────────────────
|
|
87
|
+
function loadMarkdownPlugin(filePath, source) {
|
|
88
|
+
const name = basenameNoExt(filePath);
|
|
89
|
+
let content;
|
|
90
|
+
try {
|
|
91
|
+
content = readFileSync(filePath, "utf-8");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const meta = parseTemplateMeta(content);
|
|
97
|
+
const phases = parsePhasesFromMarkdown(content);
|
|
98
|
+
const declaredMode = meta.mode;
|
|
99
|
+
const mode = isValidMode(declaredMode) ? declaredMode : "markdown-phase";
|
|
100
|
+
const triggers = meta.triggers
|
|
101
|
+
? meta.triggers.split(",").map((s) => s.trim()).filter(Boolean)
|
|
102
|
+
: undefined;
|
|
103
|
+
const artifactDirValue = meta.artifact_dir === "null" || meta.artifact_dir === "" ? null : meta.artifact_dir;
|
|
104
|
+
return {
|
|
105
|
+
name,
|
|
106
|
+
path: filePath,
|
|
107
|
+
format: "md",
|
|
108
|
+
source,
|
|
109
|
+
meta: {
|
|
110
|
+
displayName: meta.name || firstHeading(content) || name,
|
|
111
|
+
description: meta.description,
|
|
112
|
+
mode,
|
|
113
|
+
phases: phases.length > 0 ? phases : undefined,
|
|
114
|
+
triggers,
|
|
115
|
+
complexity: meta.complexity,
|
|
116
|
+
artifactDir: artifactDirValue ?? undefined,
|
|
117
|
+
requiresProject: meta.requires_project === "true",
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function loadYamlPlugin(filePath, source) {
|
|
122
|
+
const name = basenameNoExt(filePath);
|
|
123
|
+
let raw;
|
|
124
|
+
try {
|
|
125
|
+
raw = readFileSync(filePath, "utf-8");
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
let parsed;
|
|
131
|
+
try {
|
|
132
|
+
parsed = parseYaml(raw);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return {
|
|
136
|
+
name,
|
|
137
|
+
path: filePath,
|
|
138
|
+
format: "yaml",
|
|
139
|
+
source,
|
|
140
|
+
meta: { displayName: name, mode: "yaml-step" },
|
|
141
|
+
error: `YAML parse error: ${err instanceof Error ? err.message : String(err)}`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (parsed == null || typeof parsed !== "object") {
|
|
145
|
+
return {
|
|
146
|
+
name,
|
|
147
|
+
path: filePath,
|
|
148
|
+
format: "yaml",
|
|
149
|
+
source,
|
|
150
|
+
meta: { displayName: name, mode: "yaml-step" },
|
|
151
|
+
error: "Definition is not an object",
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const def = parsed;
|
|
155
|
+
const declaredMode = def.mode;
|
|
156
|
+
const mode = isValidMode(declaredMode) ? declaredMode : "yaml-step";
|
|
157
|
+
const steps = Array.isArray(def.steps) ? def.steps : [];
|
|
158
|
+
const phases = steps.map((s) => String(s.id ?? "")).filter(Boolean);
|
|
159
|
+
return {
|
|
160
|
+
name,
|
|
161
|
+
path: filePath,
|
|
162
|
+
format: "yaml",
|
|
163
|
+
source,
|
|
164
|
+
meta: {
|
|
165
|
+
displayName: typeof def.name === "string" && def.name.trim() ? def.name : name,
|
|
166
|
+
description: typeof def.description === "string" ? def.description : undefined,
|
|
167
|
+
mode,
|
|
168
|
+
phases: phases.length > 0 ? phases : undefined,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function basenameNoExt(filePath) {
|
|
173
|
+
const ext = extname(filePath);
|
|
174
|
+
return basename(filePath, ext);
|
|
175
|
+
}
|
|
176
|
+
// ─── Directory walkers ───────────────────────────────────────────────────
|
|
177
|
+
const PLUGIN_EXTENSIONS = new Set([".yaml", ".yml", ".md"]);
|
|
178
|
+
function walkPluginDir(dir, source, out) {
|
|
179
|
+
if (!existsSync(dir))
|
|
180
|
+
return;
|
|
181
|
+
let entries;
|
|
182
|
+
try {
|
|
183
|
+
entries = readdirSync(dir);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
for (const entry of entries) {
|
|
189
|
+
const full = join(dir, entry);
|
|
190
|
+
let info;
|
|
191
|
+
try {
|
|
192
|
+
info = statSync(full);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (!info.isFile())
|
|
198
|
+
continue;
|
|
199
|
+
const ext = extname(entry).toLowerCase();
|
|
200
|
+
if (!PLUGIN_EXTENSIONS.has(ext))
|
|
201
|
+
continue;
|
|
202
|
+
const plugin = ext === ".md"
|
|
203
|
+
? loadMarkdownPlugin(full, source)
|
|
204
|
+
: loadYamlPlugin(full, source);
|
|
205
|
+
if (!plugin)
|
|
206
|
+
continue;
|
|
207
|
+
out.set(plugin.name, plugin);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function loadBundledPlugins(out) {
|
|
211
|
+
const bundledDir = resolveBundledDir();
|
|
212
|
+
if (!existsSync(bundledDir))
|
|
213
|
+
return;
|
|
214
|
+
const registry = loadRegistry();
|
|
215
|
+
for (const [id, entry] of Object.entries(registry.templates)) {
|
|
216
|
+
const filePath = join(bundledDir, entry.file);
|
|
217
|
+
if (!existsSync(filePath))
|
|
218
|
+
continue;
|
|
219
|
+
const ext = extname(entry.file).toLowerCase();
|
|
220
|
+
const format = ext === ".md" ? "md" : "yaml";
|
|
221
|
+
const mode = isValidMode(entry.mode)
|
|
222
|
+
? entry.mode
|
|
223
|
+
: (format === "yaml" ? "yaml-step" : "markdown-phase");
|
|
224
|
+
out.set(id, {
|
|
225
|
+
name: id,
|
|
226
|
+
path: filePath,
|
|
227
|
+
format,
|
|
228
|
+
source: "bundled",
|
|
229
|
+
meta: {
|
|
230
|
+
displayName: entry.name,
|
|
231
|
+
description: entry.description,
|
|
232
|
+
mode,
|
|
233
|
+
phases: Array.isArray(entry.phases) && entry.phases.length > 0 ? entry.phases : undefined,
|
|
234
|
+
triggers: Array.isArray(entry.triggers) ? entry.triggers : undefined,
|
|
235
|
+
complexity: entry.estimated_complexity,
|
|
236
|
+
artifactDir: entry.artifact_dir,
|
|
237
|
+
requiresProject: entry.requires_project,
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
243
|
+
/**
|
|
244
|
+
* Discover all workflow plugins. Project overrides global overrides bundled.
|
|
245
|
+
*
|
|
246
|
+
* The legacy `.gsd/workflow-defs/*.yaml` directory is also scanned as a
|
|
247
|
+
* fallback YAML source so existing user definitions keep working.
|
|
248
|
+
*/
|
|
249
|
+
export function discoverPlugins(basePath) {
|
|
250
|
+
const out = new Map();
|
|
251
|
+
loadBundledPlugins(out);
|
|
252
|
+
walkPluginDir(globalPluginsDir(), "global", out);
|
|
253
|
+
walkPluginDir(legacyDefsDir(basePath), "project", out);
|
|
254
|
+
walkPluginDir(projectPluginsDir(basePath), "project", out);
|
|
255
|
+
return out;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Resolve a plugin by name using the precedence chain.
|
|
259
|
+
* Returns null if no plugin by that name exists anywhere.
|
|
260
|
+
*/
|
|
261
|
+
export function resolvePlugin(basePath, name) {
|
|
262
|
+
const plugins = discoverPlugins(basePath);
|
|
263
|
+
return plugins.get(name) ?? null;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Format all discovered plugins for display, grouped by mode.
|
|
267
|
+
*/
|
|
268
|
+
export function listPluginsFormatted(basePath) {
|
|
269
|
+
const plugins = discoverPlugins(basePath);
|
|
270
|
+
if (plugins.size === 0) {
|
|
271
|
+
return "No workflow plugins found.\n\nRun /gsd workflow new to author one.";
|
|
272
|
+
}
|
|
273
|
+
const groups = {
|
|
274
|
+
"oneshot": [],
|
|
275
|
+
"yaml-step": [],
|
|
276
|
+
"markdown-phase": [],
|
|
277
|
+
"auto-milestone": [],
|
|
278
|
+
};
|
|
279
|
+
for (const p of plugins.values()) {
|
|
280
|
+
groups[p.meta.mode].push(p);
|
|
281
|
+
}
|
|
282
|
+
const lines = ["Workflow Plugins\n"];
|
|
283
|
+
const order = ["markdown-phase", "yaml-step", "oneshot", "auto-milestone"];
|
|
284
|
+
for (const mode of order) {
|
|
285
|
+
const list = groups[mode].slice().sort((a, b) => a.name.localeCompare(b.name));
|
|
286
|
+
if (list.length === 0)
|
|
287
|
+
continue;
|
|
288
|
+
lines.push(` [${mode}]`);
|
|
289
|
+
for (const p of list) {
|
|
290
|
+
const tag = `${p.source}/${p.format}`;
|
|
291
|
+
const desc = p.meta.description ? ` — ${p.meta.description}` : "";
|
|
292
|
+
lines.push(` ${p.name.padEnd(22)} ${tag.padEnd(16)}${desc}`);
|
|
293
|
+
}
|
|
294
|
+
lines.push("");
|
|
295
|
+
}
|
|
296
|
+
lines.push("Usage:");
|
|
297
|
+
lines.push(" /gsd workflow <name> Run a plugin directly");
|
|
298
|
+
lines.push(" /gsd workflow info <name> Show plugin details");
|
|
299
|
+
lines.push(" /gsd workflow install <src> Install a plugin from a URL");
|
|
300
|
+
return lines.join("\n");
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Format a single plugin's metadata for `/gsd workflow info <name>`.
|
|
304
|
+
*/
|
|
305
|
+
export function formatPluginInfo(plugin) {
|
|
306
|
+
const lines = [
|
|
307
|
+
`Plugin: ${plugin.meta.displayName} (${plugin.name})`,
|
|
308
|
+
"",
|
|
309
|
+
`Source: ${plugin.source}`,
|
|
310
|
+
`Format: ${plugin.format}`,
|
|
311
|
+
`Mode: ${plugin.meta.mode}`,
|
|
312
|
+
`Path: ${plugin.path}`,
|
|
313
|
+
];
|
|
314
|
+
if (plugin.meta.description) {
|
|
315
|
+
lines.push(`About: ${plugin.meta.description}`);
|
|
316
|
+
}
|
|
317
|
+
if (plugin.meta.complexity) {
|
|
318
|
+
lines.push(`Complexity: ${plugin.meta.complexity}`);
|
|
319
|
+
}
|
|
320
|
+
if (plugin.meta.phases && plugin.meta.phases.length > 0) {
|
|
321
|
+
lines.push("", "Phases/Steps:");
|
|
322
|
+
plugin.meta.phases.forEach((p, i) => lines.push(` ${i + 1}. ${p}`));
|
|
323
|
+
}
|
|
324
|
+
if (plugin.meta.triggers && plugin.meta.triggers.length > 0) {
|
|
325
|
+
lines.push("", `Triggers: ${plugin.meta.triggers.join(", ")}`);
|
|
326
|
+
}
|
|
327
|
+
if (plugin.meta.artifactDir) {
|
|
328
|
+
lines.push("", `Artifacts: ${plugin.meta.artifactDir}`);
|
|
329
|
+
}
|
|
330
|
+
if (plugin.error) {
|
|
331
|
+
lines.push("", `⚠ Error: ${plugin.error}`);
|
|
332
|
+
}
|
|
333
|
+
return lines.join("\n");
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get the plugin directory paths for the project/global/bundled tiers.
|
|
337
|
+
* Exposed for the install command and tests.
|
|
338
|
+
*/
|
|
339
|
+
export function getPluginDirs(basePath) {
|
|
340
|
+
return {
|
|
341
|
+
project: projectPluginsDir(basePath),
|
|
342
|
+
global: globalPluginsDir(),
|
|
343
|
+
bundled: resolveBundledDir(),
|
|
344
|
+
legacy: legacyDefsDir(basePath),
|
|
345
|
+
};
|
|
346
|
+
}
|
|
@@ -8,6 +8,7 @@ import { mkdirSync, existsSync } from "node:fs";
|
|
|
8
8
|
import { logWarning } from "./workflow-logger.js";
|
|
9
9
|
import { isClosedStatus } from "./status-guards.js";
|
|
10
10
|
import { deriveState } from "./state.js";
|
|
11
|
+
import { renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
11
12
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
12
13
|
/**
|
|
13
14
|
* Strip a leading ID prefix (e.g. "M001: " or "S04: ") from a title
|
|
@@ -325,12 +326,14 @@ export async function renderStateProjection(basePath) {
|
|
|
325
326
|
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
326
327
|
*/
|
|
327
328
|
export async function renderAllProjections(basePath, milestoneId) {
|
|
328
|
-
//
|
|
329
|
+
// Delegate to the authoritative roadmap renderer — the reduced
|
|
330
|
+
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
331
|
+
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
329
332
|
try {
|
|
330
|
-
|
|
333
|
+
await renderRoadmapFromDb(basePath, milestoneId);
|
|
331
334
|
}
|
|
332
335
|
catch (err) {
|
|
333
|
-
logWarning("projection", `
|
|
336
|
+
logWarning("projection", `renderRoadmapFromDb failed for ${milestoneId}: ${err.message}`);
|
|
334
337
|
}
|
|
335
338
|
// Query all slices for this milestone
|
|
336
339
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
@@ -362,10 +365,11 @@ export async function renderAllProjections(basePath, milestoneId) {
|
|
|
362
365
|
// ─── regenerateIfMissing ────────────────────────────────────────────────
|
|
363
366
|
/**
|
|
364
367
|
* Check if a projection file exists on disk. If missing, regenerate it from DB.
|
|
365
|
-
* Returns true if the file was regenerated, false if it already existed
|
|
368
|
+
* Returns true if the file was regenerated, false if it already existed or
|
|
369
|
+
* regeneration failed.
|
|
366
370
|
* Satisfies PROJ-05 (corrupted/deleted projections regenerate on demand).
|
|
367
371
|
*/
|
|
368
|
-
export function regenerateIfMissing(basePath, milestoneId, sliceId, fileType) {
|
|
372
|
+
export async function regenerateIfMissing(basePath, milestoneId, sliceId, fileType) {
|
|
369
373
|
let filePath;
|
|
370
374
|
switch (fileType) {
|
|
371
375
|
case "PLAN":
|
|
@@ -404,23 +408,21 @@ export function regenerateIfMissing(basePath, milestoneId, sliceId, fileType) {
|
|
|
404
408
|
if (existsSync(filePath)) {
|
|
405
409
|
return false;
|
|
406
410
|
}
|
|
407
|
-
// Regenerate the missing file
|
|
411
|
+
// Regenerate the missing file. Each renderer may swallow its own errors
|
|
412
|
+
// (e.g. renderStateProjection), so confirm the file actually exists on
|
|
413
|
+
// disk before reporting success — true must mean "file is there now".
|
|
408
414
|
try {
|
|
409
415
|
switch (fileType) {
|
|
410
416
|
case "PLAN":
|
|
411
417
|
renderPlanProjection(basePath, milestoneId, sliceId);
|
|
412
|
-
|
|
418
|
+
return existsSync(filePath);
|
|
413
419
|
case "ROADMAP":
|
|
414
|
-
|
|
415
|
-
|
|
420
|
+
await renderRoadmapFromDb(basePath, milestoneId);
|
|
421
|
+
return existsSync(filePath);
|
|
416
422
|
case "STATE":
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
// on the next post-mutation hook cycle.
|
|
420
|
-
void renderStateProjection(basePath);
|
|
421
|
-
return false;
|
|
423
|
+
await renderStateProjection(basePath);
|
|
424
|
+
return existsSync(filePath);
|
|
422
425
|
}
|
|
423
|
-
return true;
|
|
424
426
|
}
|
|
425
427
|
catch (err) {
|
|
426
428
|
logWarning("projection", `regenerateIfMissing ${fileType} failed: ${err.message}`);
|
|
@@ -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>
|