gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.fd2382b9f
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.js +39 -14
- 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 +10 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +9 -7
- package/dist/resources/extensions/gsd/auto-prompts.js +151 -37
- 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 +50 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +22 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +67 -3
- package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -0
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +16 -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-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -1
- 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-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 +254 -29
- 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/metrics.js +1 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
- package/dist/resources/extensions/gsd/model-router.js +7 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
- package/dist/resources/extensions/gsd/notification-widget.js +24 -39
- package/dist/resources/extensions/gsd/notifications.js +4 -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/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/run-manager.js +37 -17
- 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/plan-milestone.js +37 -12
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
- 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/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-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 +6 -6
- 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 +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/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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 +6 -6
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- 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.02df9631042cc18e.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-6c7cda3e318eedb6.js} +1 -1
- package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +1 -0
- 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/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 +13 -2
- package/src/resources/extensions/gsd/auto-post-unit.ts +9 -7
- package/src/resources/extensions/gsd/auto-prompts.ts +178 -38
- 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 +53 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +60 -3
- package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -0
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +16 -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-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -1
- 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-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 +306 -29
- 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/metrics.ts +1 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
- package/src/resources/extensions/gsd/model-router.ts +15 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -43
- package/src/resources/extensions/gsd/notifications.ts +6 -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/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/run-manager.ts +53 -19
- 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-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-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 +2 -2
- 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/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/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-store.test.ts +2 -2
- 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 +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
- 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-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/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/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/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/plan-milestone.ts +42 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
- 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/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- 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-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 → jaWw1Jh0TYayjbfOrFe8D}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → jaWw1Jh0TYayjbfOrFe8D}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
|
+
|
|
9
|
+
import { runAutoLoopWithUok } from "../uok/kernel.ts";
|
|
10
|
+
import type { AutoSession } from "../auto/session.ts";
|
|
11
|
+
import type { LoopDeps } from "../auto/loop-deps.ts";
|
|
12
|
+
import { gsdRoot } from "../paths.ts";
|
|
13
|
+
import type { GSDPreferences } from "../preferences.ts";
|
|
14
|
+
|
|
15
|
+
function makeBasePath(): string {
|
|
16
|
+
return mkdtempSync(join(tmpdir(), "gsd-uok-kernel-"));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function makeArgs(
|
|
20
|
+
basePath: string,
|
|
21
|
+
preferences: GSDPreferences | undefined,
|
|
22
|
+
): {
|
|
23
|
+
ctx: ExtensionContext;
|
|
24
|
+
pi: ExtensionAPI;
|
|
25
|
+
s: AutoSession;
|
|
26
|
+
deps: LoopDeps;
|
|
27
|
+
runKernelLoop: (
|
|
28
|
+
ctx: ExtensionContext,
|
|
29
|
+
pi: ExtensionAPI,
|
|
30
|
+
s: AutoSession,
|
|
31
|
+
deps: LoopDeps,
|
|
32
|
+
) => Promise<void>;
|
|
33
|
+
runLegacyLoop: (
|
|
34
|
+
ctx: ExtensionContext,
|
|
35
|
+
pi: ExtensionAPI,
|
|
36
|
+
s: AutoSession,
|
|
37
|
+
deps: LoopDeps,
|
|
38
|
+
) => Promise<void>;
|
|
39
|
+
calls: {
|
|
40
|
+
kernel: number;
|
|
41
|
+
legacy: number;
|
|
42
|
+
kernelDeps: LoopDeps | null;
|
|
43
|
+
legacyDeps: LoopDeps | null;
|
|
44
|
+
};
|
|
45
|
+
} {
|
|
46
|
+
const calls = {
|
|
47
|
+
kernel: 0,
|
|
48
|
+
legacy: 0,
|
|
49
|
+
kernelDeps: null as LoopDeps | null,
|
|
50
|
+
legacyDeps: null as LoopDeps | null,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
ctx: {
|
|
55
|
+
sessionManager: {
|
|
56
|
+
getSessionId: (): string => "session-test",
|
|
57
|
+
},
|
|
58
|
+
} as unknown as ExtensionContext,
|
|
59
|
+
pi: {} as unknown as ExtensionAPI,
|
|
60
|
+
s: {
|
|
61
|
+
basePath,
|
|
62
|
+
autoStartTime: 1,
|
|
63
|
+
} as unknown as AutoSession,
|
|
64
|
+
deps: {
|
|
65
|
+
loadEffectiveGSDPreferences: () => ({ preferences }),
|
|
66
|
+
} as unknown as LoopDeps,
|
|
67
|
+
runKernelLoop: async (_ctx, _pi, _s, loopDeps): Promise<void> => {
|
|
68
|
+
calls.kernel += 1;
|
|
69
|
+
calls.kernelDeps = loopDeps;
|
|
70
|
+
},
|
|
71
|
+
runLegacyLoop: async (_ctx, _pi, _s, loopDeps): Promise<void> => {
|
|
72
|
+
calls.legacy += 1;
|
|
73
|
+
calls.legacyDeps = loopDeps;
|
|
74
|
+
},
|
|
75
|
+
calls,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function readParityEvents(basePath: string): Array<Record<string, unknown>> {
|
|
80
|
+
const file = join(gsdRoot(basePath), "runtime", "uok-parity.jsonl");
|
|
81
|
+
const raw = readFileSync(file, "utf-8").trim();
|
|
82
|
+
if (raw.length === 0) return [];
|
|
83
|
+
return raw.split("\n").map(line => JSON.parse(line) as Record<string, unknown>);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
test("runAutoLoopWithUok uses kernel path by default and records uok-kernel parity", async () => {
|
|
87
|
+
const basePath = makeBasePath();
|
|
88
|
+
try {
|
|
89
|
+
const args = makeArgs(basePath, {
|
|
90
|
+
uok: {
|
|
91
|
+
enabled: true,
|
|
92
|
+
audit_unified: { enabled: false },
|
|
93
|
+
gitops: { enabled: false },
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
await runAutoLoopWithUok(args);
|
|
97
|
+
|
|
98
|
+
assert.equal(args.calls.kernel, 1);
|
|
99
|
+
assert.equal(args.calls.legacy, 0);
|
|
100
|
+
assert.ok(args.calls.kernelDeps);
|
|
101
|
+
assert.notEqual(args.calls.kernelDeps, args.deps);
|
|
102
|
+
assert.ok(args.calls.kernelDeps?.uokObserver);
|
|
103
|
+
assert.equal(process.env.GSD_UOK_AUDIT_UNIFIED, "0");
|
|
104
|
+
|
|
105
|
+
const events = readParityEvents(basePath);
|
|
106
|
+
assert.equal(events.length, 2);
|
|
107
|
+
assert.equal(events[0]?.path, "uok-kernel");
|
|
108
|
+
assert.equal(events[0]?.phase, "enter");
|
|
109
|
+
assert.equal(events[1]?.path, "uok-kernel");
|
|
110
|
+
assert.equal(events[1]?.phase, "exit");
|
|
111
|
+
assert.equal(events[1]?.status, "ok");
|
|
112
|
+
} finally {
|
|
113
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("runAutoLoopWithUok uses legacy path when explicit legacy fallback is enabled", async () => {
|
|
118
|
+
const basePath = makeBasePath();
|
|
119
|
+
try {
|
|
120
|
+
const args = makeArgs(basePath, {
|
|
121
|
+
uok: {
|
|
122
|
+
enabled: true,
|
|
123
|
+
legacy_fallback: { enabled: true },
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
await runAutoLoopWithUok(args);
|
|
127
|
+
|
|
128
|
+
assert.equal(args.calls.kernel, 0);
|
|
129
|
+
assert.equal(args.calls.legacy, 1);
|
|
130
|
+
assert.equal(args.calls.legacyDeps, args.deps);
|
|
131
|
+
|
|
132
|
+
const events = readParityEvents(basePath);
|
|
133
|
+
assert.equal(events.length, 2);
|
|
134
|
+
assert.equal(events[0]?.path, "legacy-fallback");
|
|
135
|
+
assert.equal(events[1]?.path, "legacy-fallback");
|
|
136
|
+
assert.equal(events[1]?.status, "ok");
|
|
137
|
+
} finally {
|
|
138
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("runAutoLoopWithUok respects GSD_UOK_FORCE_LEGACY emergency switch", async () => {
|
|
143
|
+
const basePath = makeBasePath();
|
|
144
|
+
const previous = process.env.GSD_UOK_FORCE_LEGACY;
|
|
145
|
+
process.env.GSD_UOK_FORCE_LEGACY = "1";
|
|
146
|
+
try {
|
|
147
|
+
const args = makeArgs(basePath, {
|
|
148
|
+
uok: {
|
|
149
|
+
enabled: true,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
await runAutoLoopWithUok(args);
|
|
153
|
+
|
|
154
|
+
assert.equal(args.calls.kernel, 0);
|
|
155
|
+
assert.equal(args.calls.legacy, 1);
|
|
156
|
+
|
|
157
|
+
const events = readParityEvents(basePath);
|
|
158
|
+
assert.equal(events.length, 2);
|
|
159
|
+
assert.equal(events[0]?.path, "legacy-fallback");
|
|
160
|
+
assert.equal(events[1]?.path, "legacy-fallback");
|
|
161
|
+
} finally {
|
|
162
|
+
if (previous === undefined) delete process.env.GSD_UOK_FORCE_LEGACY;
|
|
163
|
+
else process.env.GSD_UOK_FORCE_LEGACY = previous;
|
|
164
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// gsd-2 — Regression tests for workflow-install path containment and ext fallback.
|
|
2
|
+
|
|
3
|
+
import { describe, it, afterEach, beforeEach } from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync, existsSync } from "node:fs";
|
|
6
|
+
import { join, sep as pathSep } from "node:path";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
installPlugin,
|
|
11
|
+
uninstallPlugin,
|
|
12
|
+
projectInstallDir,
|
|
13
|
+
type FetchedContent,
|
|
14
|
+
type InstallTarget,
|
|
15
|
+
} from "../workflow-install.ts";
|
|
16
|
+
import { parseWorkflowOverridesOnly } from "../commands/handlers/workflow.ts";
|
|
17
|
+
|
|
18
|
+
const tmpDirs: string[] = [];
|
|
19
|
+
let savedGsdHome: string | undefined;
|
|
20
|
+
|
|
21
|
+
function makeTmpBase(): string {
|
|
22
|
+
const dir = mkdtempSync(join(tmpdir(), "wf-install-test-"));
|
|
23
|
+
tmpDirs.push(dir);
|
|
24
|
+
return dir;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
savedGsdHome = process.env.GSD_HOME;
|
|
29
|
+
process.env.GSD_HOME = makeTmpBase();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
if (savedGsdHome === undefined) delete process.env.GSD_HOME;
|
|
34
|
+
else process.env.GSD_HOME = savedGsdHome;
|
|
35
|
+
for (const d of tmpDirs) {
|
|
36
|
+
try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 50 }); } catch { /* ignore */ }
|
|
37
|
+
}
|
|
38
|
+
tmpDirs.length = 0;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
function fakeFetched(content: string, ext: ".yaml" | ".md" = ".yaml"): FetchedContent {
|
|
42
|
+
return {
|
|
43
|
+
url: `https://example.test/raw/foo${ext}`,
|
|
44
|
+
filename: `foo${ext}`,
|
|
45
|
+
ext,
|
|
46
|
+
content,
|
|
47
|
+
sha256: "deadbeef",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe("workflow-install path containment", () => {
|
|
52
|
+
it("installPlugin rejects names with path separators", () => {
|
|
53
|
+
const base = makeTmpBase();
|
|
54
|
+
const target: InstallTarget = { dir: projectInstallDir(base), scope: "project" };
|
|
55
|
+
const fetched = fakeFetched("name: ok\nsteps: []\n");
|
|
56
|
+
assert.throws(() => installPlugin(target, fetched, "../evil"), /Invalid plugin name/);
|
|
57
|
+
assert.throws(() => installPlugin(target, fetched, "evil/nested"), /Invalid plugin name/);
|
|
58
|
+
assert.throws(() => installPlugin(target, fetched, ".."), /Invalid plugin name/);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("uninstallPlugin rejects names with path separators", () => {
|
|
62
|
+
const base = makeTmpBase();
|
|
63
|
+
assert.throws(() => uninstallPlugin(base, "../evil"), /Invalid plugin name/);
|
|
64
|
+
assert.throws(() => uninstallPlugin(base, "evil/nested"), /Invalid plugin name/);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("installPlugin writes a safe name into the target dir", () => {
|
|
68
|
+
const base = makeTmpBase();
|
|
69
|
+
const target: InstallTarget = { dir: projectInstallDir(base), scope: "project" };
|
|
70
|
+
const fetched = fakeFetched("name: ok\nsteps: []\n");
|
|
71
|
+
const result = installPlugin(target, fetched, "safe-name");
|
|
72
|
+
assert.ok(result.path.startsWith(target.dir + pathSep) || result.path === join(target.dir, "safe-name.yaml"));
|
|
73
|
+
assert.ok(existsSync(result.path));
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("uninstallPlugin ignores provenance entries whose filename escapes the dir", () => {
|
|
77
|
+
const base = makeTmpBase();
|
|
78
|
+
const target: InstallTarget = { dir: projectInstallDir(base), scope: "project" };
|
|
79
|
+
mkdirSync(target.dir, { recursive: true });
|
|
80
|
+
// Seed a malicious provenance record.
|
|
81
|
+
const bogus = {
|
|
82
|
+
"hijack": {
|
|
83
|
+
source: "https://example.test/x",
|
|
84
|
+
installedAt: new Date().toISOString(),
|
|
85
|
+
sha256: "0",
|
|
86
|
+
filename: "../../etc/passwd",
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
writeFileSync(join(target.dir, ".installed.json"), JSON.stringify(bogus), "utf-8");
|
|
90
|
+
assert.throws(() => uninstallPlugin(base, "hijack"), /Invalid plugin name|Refusing to operate outside/);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("parseWorkflowOverridesOnly", () => {
|
|
95
|
+
it("keeps all k=v pairs when no name prefix is present", () => {
|
|
96
|
+
const ov = parseWorkflowOverridesOnly("target=src/foo.ts newName=bar");
|
|
97
|
+
assert.equal(ov.target, "src/foo.ts");
|
|
98
|
+
assert.equal(ov.newName, "bar");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("does not drop the first argument", () => {
|
|
102
|
+
const ov = parseWorkflowOverridesOnly("a=1 b=2");
|
|
103
|
+
assert.equal(ov.a, "1");
|
|
104
|
+
assert.equal(ov.b, "2");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("ignores tokens without `=`", () => {
|
|
108
|
+
const ov = parseWorkflowOverridesOnly("a=1 bareword b=2");
|
|
109
|
+
assert.equal(ov.a, "1");
|
|
110
|
+
assert.equal(ov.b, "2");
|
|
111
|
+
assert.equal(Object.keys(ov).length, 2);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
@@ -88,15 +88,24 @@ test("runFinalize drains and surfaces logger buffer via ctx.ui.notify", () => {
|
|
|
88
88
|
});
|
|
89
89
|
|
|
90
90
|
test("runFinalize timeout branches drain the buffer to prevent bleed", () => {
|
|
91
|
-
// Both timeout branches
|
|
92
|
-
//
|
|
91
|
+
// Both timeout branches route through failClosedOnFinalizeTimeout; that
|
|
92
|
+
// helper must drain the buffer so timed-out unit logs do not bleed into
|
|
93
|
+
// the next unit.
|
|
93
94
|
const runFinalizeIdx = phasesSrc.indexOf("export async function runFinalize");
|
|
94
95
|
const finalizeBody = phasesSrc.slice(runFinalizeIdx);
|
|
95
|
-
const
|
|
96
|
-
(finalizeBody.match(/
|
|
96
|
+
const timeoutHelperCalls =
|
|
97
|
+
(finalizeBody.match(/failClosedOnFinalizeTimeout\(/g) ?? []).length;
|
|
97
98
|
assert.ok(
|
|
98
|
-
|
|
99
|
-
`runFinalize timeout branches should each
|
|
99
|
+
timeoutHelperCalls >= 2,
|
|
100
|
+
`runFinalize timeout branches should each route through failClosedOnFinalizeTimeout() (found ${timeoutHelperCalls}, expected >= 2)`,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const helperMatch = phasesSrc.match(
|
|
104
|
+
/async function failClosedOnFinalizeTimeout[\s\S]*?drainLogs\(\)/,
|
|
105
|
+
);
|
|
106
|
+
assert.ok(
|
|
107
|
+
helperMatch,
|
|
108
|
+
"failClosedOnFinalizeTimeout should drain the logger buffer before returning",
|
|
100
109
|
);
|
|
101
110
|
});
|
|
102
111
|
|
|
@@ -441,13 +441,13 @@ test("usesWorkflowMcpTransport matches local externalCli providers", () => {
|
|
|
441
441
|
assert.equal(usesWorkflowMcpTransport("oauth", "local://custom"), false);
|
|
442
442
|
});
|
|
443
443
|
|
|
444
|
-
test("supportsStructuredQuestions
|
|
444
|
+
test("supportsStructuredQuestions stays enabled on workflow MCP transports when ask_user_questions is available", () => {
|
|
445
445
|
assert.equal(
|
|
446
446
|
supportsStructuredQuestions(["ask_user_questions"], {
|
|
447
447
|
authMode: "externalCli",
|
|
448
448
|
baseUrl: "local://claude-code",
|
|
449
449
|
}),
|
|
450
|
-
|
|
450
|
+
true,
|
|
451
451
|
);
|
|
452
452
|
assert.equal(
|
|
453
453
|
supportsStructuredQuestions(["ask_user_questions"], {
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workflow-plugins.test.ts — Tests for the unified plugin discovery & resolution.
|
|
3
|
+
*
|
|
4
|
+
* Verifies precedence (project > global > bundled), both YAML and markdown
|
|
5
|
+
* formats, mode defaults, invalid-file handling, and legacy compat with
|
|
6
|
+
* `.gsd/workflow-defs/`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, afterEach, beforeEach } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import {
|
|
12
|
+
mkdtempSync,
|
|
13
|
+
rmSync,
|
|
14
|
+
mkdirSync,
|
|
15
|
+
writeFileSync,
|
|
16
|
+
} from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { tmpdir } from "node:os";
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
discoverPlugins,
|
|
22
|
+
resolvePlugin,
|
|
23
|
+
listPluginsFormatted,
|
|
24
|
+
formatPluginInfo,
|
|
25
|
+
} from "../workflow-plugins.ts";
|
|
26
|
+
|
|
27
|
+
// ─── Test setup ──────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
const tmpDirs: string[] = [];
|
|
30
|
+
let savedGsdHome: string | undefined;
|
|
31
|
+
|
|
32
|
+
function makeTmpBase(): string {
|
|
33
|
+
const dir = mkdtempSync(join(tmpdir(), "wf-plugins-test-"));
|
|
34
|
+
tmpDirs.push(dir);
|
|
35
|
+
return dir;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
savedGsdHome = process.env.GSD_HOME;
|
|
40
|
+
const fakeHome = makeTmpBase();
|
|
41
|
+
process.env.GSD_HOME = fakeHome;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
if (savedGsdHome === undefined) {
|
|
46
|
+
delete process.env.GSD_HOME;
|
|
47
|
+
} else {
|
|
48
|
+
process.env.GSD_HOME = savedGsdHome;
|
|
49
|
+
}
|
|
50
|
+
for (const d of tmpDirs) {
|
|
51
|
+
try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* non-fatal */ }
|
|
52
|
+
}
|
|
53
|
+
tmpDirs.length = 0;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
function writeFile(path: string, content: string): void {
|
|
57
|
+
mkdirSync(join(path, "..").replace(/[^/]+$/, ""), { recursive: true });
|
|
58
|
+
writeFileSync(path, content, "utf-8");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function writeProjectPlugin(basePath: string, filename: string, content: string): void {
|
|
62
|
+
const dir = join(basePath, ".gsd", "workflows");
|
|
63
|
+
mkdirSync(dir, { recursive: true });
|
|
64
|
+
writeFileSync(join(dir, filename), content, "utf-8");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function writeGlobalPlugin(filename: string, content: string): void {
|
|
68
|
+
const dir = join(process.env.GSD_HOME!, "workflows");
|
|
69
|
+
mkdirSync(dir, { recursive: true });
|
|
70
|
+
writeFileSync(join(dir, filename), content, "utf-8");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function writeLegacyDef(basePath: string, filename: string, content: string): void {
|
|
74
|
+
const dir = join(basePath, ".gsd", "workflow-defs");
|
|
75
|
+
mkdirSync(dir, { recursive: true });
|
|
76
|
+
writeFileSync(join(dir, filename), content, "utf-8");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const SIMPLE_YAML = `
|
|
80
|
+
version: 1
|
|
81
|
+
name: sample
|
|
82
|
+
description: A sample YAML plugin
|
|
83
|
+
steps:
|
|
84
|
+
- id: s1
|
|
85
|
+
name: Step 1
|
|
86
|
+
prompt: Do the thing
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
const SIMPLE_ONESHOT_YAML = `
|
|
90
|
+
version: 1
|
|
91
|
+
name: oneshot-sample
|
|
92
|
+
mode: oneshot
|
|
93
|
+
description: A oneshot yaml plugin
|
|
94
|
+
steps:
|
|
95
|
+
- id: only
|
|
96
|
+
name: Only
|
|
97
|
+
prompt: Just do it
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
const SIMPLE_MD = `# Sample MD Plugin
|
|
101
|
+
|
|
102
|
+
<template_meta>
|
|
103
|
+
name: sample-md
|
|
104
|
+
version: 1
|
|
105
|
+
mode: markdown-phase
|
|
106
|
+
artifact_dir: .gsd/workflows/samples/
|
|
107
|
+
</template_meta>
|
|
108
|
+
|
|
109
|
+
<phases>
|
|
110
|
+
1. one
|
|
111
|
+
2. two
|
|
112
|
+
</phases>
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
const ONESHOT_MD = `# Oneshot MD Plugin
|
|
116
|
+
|
|
117
|
+
<template_meta>
|
|
118
|
+
name: oneshot-md
|
|
119
|
+
version: 1
|
|
120
|
+
mode: oneshot
|
|
121
|
+
</template_meta>
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
// ─── Bundled discovery ───────────────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
describe("discoverPlugins: bundled tier", () => {
|
|
127
|
+
it("discovers the 8+ bundled templates", () => {
|
|
128
|
+
const base = makeTmpBase();
|
|
129
|
+
const plugins = discoverPlugins(base);
|
|
130
|
+
for (const id of ["bugfix", "hotfix", "spike", "full-project"]) {
|
|
131
|
+
assert.ok(plugins.has(id), `bundled plugin "${id}" should be discovered`);
|
|
132
|
+
}
|
|
133
|
+
assert.equal(plugins.get("bugfix")!.source, "bundled");
|
|
134
|
+
assert.equal(plugins.get("bugfix")!.format, "md");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("bundled templates have valid mode values", () => {
|
|
138
|
+
const base = makeTmpBase();
|
|
139
|
+
const plugins = discoverPlugins(base);
|
|
140
|
+
const bugfix = plugins.get("bugfix")!;
|
|
141
|
+
assert.equal(bugfix.meta.mode, "markdown-phase");
|
|
142
|
+
const fullProject = plugins.get("full-project")!;
|
|
143
|
+
assert.equal(fullProject.meta.mode, "auto-milestone");
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// ─── Project / Global / Bundled precedence ───────────────────────────────
|
|
148
|
+
|
|
149
|
+
describe("discoverPlugins: precedence", () => {
|
|
150
|
+
it("project overrides bundled", () => {
|
|
151
|
+
const base = makeTmpBase();
|
|
152
|
+
writeProjectPlugin(base, "bugfix.md", `# Overridden\n\n<template_meta>\nname: bugfix-override\nmode: markdown-phase\n</template_meta>`);
|
|
153
|
+
const plugins = discoverPlugins(base);
|
|
154
|
+
const bugfix = plugins.get("bugfix")!;
|
|
155
|
+
assert.equal(bugfix.source, "project");
|
|
156
|
+
assert.ok(bugfix.path.includes(".gsd/workflows/bugfix.md"));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("global overrides bundled when project is absent", () => {
|
|
160
|
+
const base = makeTmpBase();
|
|
161
|
+
writeGlobalPlugin("bugfix.md", `# Global\n\n<template_meta>\nname: bugfix-global\nmode: markdown-phase\n</template_meta>`);
|
|
162
|
+
const plugins = discoverPlugins(base);
|
|
163
|
+
const bugfix = plugins.get("bugfix")!;
|
|
164
|
+
assert.equal(bugfix.source, "global");
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("project overrides global", () => {
|
|
168
|
+
const base = makeTmpBase();
|
|
169
|
+
writeGlobalPlugin("foo.yaml", SIMPLE_YAML);
|
|
170
|
+
writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML.replace("sample", "foo"));
|
|
171
|
+
const plugins = discoverPlugins(base);
|
|
172
|
+
assert.equal(plugins.get("foo")!.source, "project");
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// ─── YAML + MD format handling ───────────────────────────────────────────
|
|
177
|
+
|
|
178
|
+
describe("discoverPlugins: formats", () => {
|
|
179
|
+
it("loads a project YAML plugin with default mode yaml-step", () => {
|
|
180
|
+
const base = makeTmpBase();
|
|
181
|
+
writeProjectPlugin(base, "sample.yaml", SIMPLE_YAML);
|
|
182
|
+
const plugins = discoverPlugins(base);
|
|
183
|
+
const p = plugins.get("sample")!;
|
|
184
|
+
assert.equal(p.format, "yaml");
|
|
185
|
+
assert.equal(p.meta.mode, "yaml-step");
|
|
186
|
+
assert.equal(p.meta.displayName, "sample");
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("respects mode: oneshot in YAML", () => {
|
|
190
|
+
const base = makeTmpBase();
|
|
191
|
+
writeProjectPlugin(base, "oneshot-sample.yaml", SIMPLE_ONESHOT_YAML);
|
|
192
|
+
const plugins = discoverPlugins(base);
|
|
193
|
+
assert.equal(plugins.get("oneshot-sample")!.meta.mode, "oneshot");
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("loads a project MD plugin with default mode markdown-phase", () => {
|
|
197
|
+
const base = makeTmpBase();
|
|
198
|
+
writeProjectPlugin(base, "simple-md.md", `# Plain\n\n<template_meta>\nname: plain\n</template_meta>`);
|
|
199
|
+
const plugins = discoverPlugins(base);
|
|
200
|
+
assert.equal(plugins.get("simple-md")!.meta.mode, "markdown-phase");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("respects mode: oneshot in MD", () => {
|
|
204
|
+
const base = makeTmpBase();
|
|
205
|
+
writeProjectPlugin(base, "oneshot-md.md", ONESHOT_MD);
|
|
206
|
+
const plugins = discoverPlugins(base);
|
|
207
|
+
assert.equal(plugins.get("oneshot-md")!.meta.mode, "oneshot");
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("parses phases from MD <phases> block", () => {
|
|
211
|
+
const base = makeTmpBase();
|
|
212
|
+
writeProjectPlugin(base, "sample-md.md", SIMPLE_MD);
|
|
213
|
+
const plugins = discoverPlugins(base);
|
|
214
|
+
const p = plugins.get("sample-md")!;
|
|
215
|
+
assert.deepEqual(p.meta.phases, ["one", "two"]);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// ─── Error handling ──────────────────────────────────────────────────────
|
|
220
|
+
|
|
221
|
+
describe("discoverPlugins: error handling", () => {
|
|
222
|
+
it("invalid YAML surfaces as an entry with an error, doesn't crash", () => {
|
|
223
|
+
const base = makeTmpBase();
|
|
224
|
+
writeProjectPlugin(base, "broken.yaml", "this: is: not: valid: yaml:\n - x\n - y");
|
|
225
|
+
const plugins = discoverPlugins(base);
|
|
226
|
+
const p = plugins.get("broken");
|
|
227
|
+
assert.ok(p, "broken plugin should still appear");
|
|
228
|
+
if (p!.error) {
|
|
229
|
+
assert.match(p!.error, /parse|object/i);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it("ignores subdirectories under .gsd/workflows/ (artifact dirs)", () => {
|
|
234
|
+
const base = makeTmpBase();
|
|
235
|
+
// Create a subdir — simulates `/gsd start bugfix` artifact dir
|
|
236
|
+
mkdirSync(join(base, ".gsd", "workflows", "bugfixes", "250101-1-slug"), { recursive: true });
|
|
237
|
+
writeFileSync(join(base, ".gsd", "workflows", "bugfixes", "250101-1-slug", "STATE.json"), "{}", "utf-8");
|
|
238
|
+
const plugins = discoverPlugins(base);
|
|
239
|
+
assert.ok(!plugins.has("bugfixes"), "should not pick up subdir as a plugin");
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// ─── resolvePlugin ───────────────────────────────────────────────────────
|
|
244
|
+
|
|
245
|
+
describe("resolvePlugin", () => {
|
|
246
|
+
it("returns the plugin by name", () => {
|
|
247
|
+
const base = makeTmpBase();
|
|
248
|
+
writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML);
|
|
249
|
+
const p = resolvePlugin(base, "foo");
|
|
250
|
+
assert.ok(p);
|
|
251
|
+
assert.equal(p!.name, "foo");
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it("returns null for unknown names", () => {
|
|
255
|
+
const base = makeTmpBase();
|
|
256
|
+
assert.equal(resolvePlugin(base, "nonexistent-plugin-xyz"), null);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it("resolves bundled templates", () => {
|
|
260
|
+
const base = makeTmpBase();
|
|
261
|
+
const p = resolvePlugin(base, "bugfix");
|
|
262
|
+
assert.ok(p);
|
|
263
|
+
assert.equal(p!.source, "bundled");
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// ─── Legacy fallback ─────────────────────────────────────────────────────
|
|
268
|
+
|
|
269
|
+
describe("discoverPlugins: legacy .gsd/workflow-defs/", () => {
|
|
270
|
+
it("still discovers legacy YAML definitions", () => {
|
|
271
|
+
const base = makeTmpBase();
|
|
272
|
+
writeLegacyDef(base, "legacy.yaml", SIMPLE_YAML);
|
|
273
|
+
const plugins = discoverPlugins(base);
|
|
274
|
+
assert.ok(plugins.has("legacy"), "legacy definition should be discovered");
|
|
275
|
+
assert.equal(plugins.get("legacy")!.format, "yaml");
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("new .gsd/workflows/ overrides legacy .gsd/workflow-defs/", () => {
|
|
279
|
+
const base = makeTmpBase();
|
|
280
|
+
writeLegacyDef(base, "dup.yaml", SIMPLE_YAML);
|
|
281
|
+
writeProjectPlugin(base, "dup.yaml", SIMPLE_YAML);
|
|
282
|
+
const plugins = discoverPlugins(base);
|
|
283
|
+
const p = plugins.get("dup")!;
|
|
284
|
+
assert.ok(p.path.includes(".gsd/workflows/dup.yaml"));
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// ─── Display ─────────────────────────────────────────────────────────────
|
|
289
|
+
|
|
290
|
+
describe("listPluginsFormatted", () => {
|
|
291
|
+
it("produces output grouped by mode with bundled templates", () => {
|
|
292
|
+
const base = makeTmpBase();
|
|
293
|
+
const out = listPluginsFormatted(base);
|
|
294
|
+
assert.match(out, /Workflow Plugins/);
|
|
295
|
+
assert.match(out, /\[markdown-phase\]/);
|
|
296
|
+
assert.match(out, /bugfix/);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
describe("formatPluginInfo", () => {
|
|
301
|
+
it("formats YAML plugin info", () => {
|
|
302
|
+
const base = makeTmpBase();
|
|
303
|
+
writeProjectPlugin(base, "foo.yaml", SIMPLE_YAML);
|
|
304
|
+
const p = resolvePlugin(base, "foo")!;
|
|
305
|
+
const info = formatPluginInfo(p);
|
|
306
|
+
assert.match(info, /Plugin:/);
|
|
307
|
+
assert.match(info, /Mode:\s+yaml-step/);
|
|
308
|
+
assert.match(info, /Source:\s+project/);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
@@ -28,6 +28,8 @@ function makeSlice(overrides: Partial<SliceRow> = {}): SliceRow {
|
|
|
28
28
|
completed_at: null,
|
|
29
29
|
sequence: 1,
|
|
30
30
|
replan_triggered_at: null,
|
|
31
|
+
is_sketch: 0,
|
|
32
|
+
sketch_scope: '',
|
|
31
33
|
...overrides,
|
|
32
34
|
};
|
|
33
35
|
}
|
|
@@ -59,6 +61,11 @@ function makeTask(overrides: Partial<TaskRow> = {}): TaskRow {
|
|
|
59
61
|
expected_output: [],
|
|
60
62
|
observability_impact: '',
|
|
61
63
|
sequence: 1,
|
|
64
|
+
blocker_source: '',
|
|
65
|
+
escalation_pending: 0,
|
|
66
|
+
escalation_awaiting_review: 0,
|
|
67
|
+
escalation_artifact_path: null,
|
|
68
|
+
escalation_override_applied_at: null,
|
|
62
69
|
...overrides,
|
|
63
70
|
};
|
|
64
71
|
}
|
|
@@ -36,8 +36,14 @@ console.log('\n── Registry Loading ──');
|
|
|
36
36
|
for (const [id, entry] of Object.entries(registry.templates)) {
|
|
37
37
|
assert.ok(typeof entry.name === 'string' && entry.name.length > 0, `${id}: name should be non-empty string`);
|
|
38
38
|
assert.ok(typeof entry.description === 'string' && entry.description.length > 0, `${id}: description should be non-empty`);
|
|
39
|
-
assert.ok(typeof entry.file === 'string' && entry.file.endsWith('.md'), `${id}: file should be a .md path`);
|
|
40
|
-
|
|
39
|
+
assert.ok(typeof entry.file === 'string' && (entry.file.endsWith('.md') || entry.file.endsWith('.yaml') || entry.file.endsWith('.yml')), `${id}: file should be a .md or .yaml path`);
|
|
40
|
+
// Phases are only required for phased modes (markdown-phase, auto-milestone).
|
|
41
|
+
const isPhased = !entry.mode || entry.mode === 'markdown-phase' || entry.mode === 'auto-milestone';
|
|
42
|
+
if (isPhased) {
|
|
43
|
+
assert.ok(Array.isArray(entry.phases) && entry.phases.length > 0, `${id}: phases should be non-empty array for phased mode`);
|
|
44
|
+
} else {
|
|
45
|
+
assert.ok(Array.isArray(entry.phases), `${id}: phases should be an array (may be empty for ${entry.mode})`);
|
|
46
|
+
}
|
|
41
47
|
assert.ok(Array.isArray(entry.triggers) && entry.triggers.length > 0, `${id}: triggers should be non-empty array`);
|
|
42
48
|
}
|
|
43
49
|
}
|