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,539 @@
|
|
|
1
|
+
// GSD Extension — ADR-011 Progressive Planning tests
|
|
2
|
+
// Sketch detection → refining phase, dispatch routing, auto-heal, migration idempotency.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
openDatabase,
|
|
12
|
+
closeDatabase,
|
|
13
|
+
insertMilestone,
|
|
14
|
+
insertSlice,
|
|
15
|
+
setSliceSketchFlag,
|
|
16
|
+
autoHealSketchFlags,
|
|
17
|
+
getSlice,
|
|
18
|
+
} from "../gsd-db.ts";
|
|
19
|
+
import { deriveStateFromDb } from "../state.ts";
|
|
20
|
+
import { resolveDispatch } from "../auto-dispatch.ts";
|
|
21
|
+
import type { DispatchContext } from "../auto-dispatch.ts";
|
|
22
|
+
|
|
23
|
+
function makeFixtureBase(): string {
|
|
24
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-"));
|
|
25
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
26
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S02"), { recursive: true });
|
|
27
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
28
|
+
return base;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function writePreferences(base: string, phasesBlock: string): void {
|
|
32
|
+
const prefsPath = join(base, ".gsd", "PREFERENCES.md");
|
|
33
|
+
const body = [
|
|
34
|
+
"---",
|
|
35
|
+
"version: 1",
|
|
36
|
+
phasesBlock,
|
|
37
|
+
"---",
|
|
38
|
+
].join("\n");
|
|
39
|
+
writeFileSync(prefsPath, body);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function seedMilestoneWithSketchedS02(base: string): void {
|
|
43
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
44
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
45
|
+
// S01: full slice, complete
|
|
46
|
+
insertSlice({
|
|
47
|
+
id: "S01",
|
|
48
|
+
milestoneId: "M001",
|
|
49
|
+
title: "Foundation",
|
|
50
|
+
status: "complete",
|
|
51
|
+
risk: "high",
|
|
52
|
+
depends: [],
|
|
53
|
+
demo: "S01 done.",
|
|
54
|
+
sequence: 1,
|
|
55
|
+
isSketch: false,
|
|
56
|
+
});
|
|
57
|
+
// S02: sketch slice, pending
|
|
58
|
+
insertSlice({
|
|
59
|
+
id: "S02",
|
|
60
|
+
milestoneId: "M001",
|
|
61
|
+
title: "Feature",
|
|
62
|
+
status: "pending",
|
|
63
|
+
risk: "medium",
|
|
64
|
+
depends: ["S01"],
|
|
65
|
+
demo: "S02 demo.",
|
|
66
|
+
sequence: 2,
|
|
67
|
+
isSketch: true,
|
|
68
|
+
sketchScope: "Scope limited to feature X in module Y; no cross-cutting refactors.",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function writeS01Artifacts(base: string): void {
|
|
73
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"), "# S01 Plan\n");
|
|
74
|
+
writeFileSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md"), "# S01 Summary\n");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function cleanup(base: string, originalCwd: string): void {
|
|
78
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
79
|
+
process.chdir(originalCwd);
|
|
80
|
+
try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
84
|
+
// Tests
|
|
85
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
86
|
+
|
|
87
|
+
test("ADR-011: sketch slice + progressive_planning ON → phase='refining'", async (t) => {
|
|
88
|
+
const originalCwd = process.cwd();
|
|
89
|
+
const base = makeFixtureBase();
|
|
90
|
+
t.after(() => cleanup(base, originalCwd));
|
|
91
|
+
|
|
92
|
+
seedMilestoneWithSketchedS02(base);
|
|
93
|
+
writeS01Artifacts(base);
|
|
94
|
+
writePreferences(base, "phases:\n progressive_planning: true");
|
|
95
|
+
process.chdir(base);
|
|
96
|
+
|
|
97
|
+
const state = await deriveStateFromDb(base);
|
|
98
|
+
assert.equal(state.activeSlice?.id, "S02", "S02 should be the active slice (S01 complete)");
|
|
99
|
+
assert.equal(state.phase, "refining", "sketch slice with flag ON must yield refining phase");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test("ADR-011: sketch slice + progressive_planning OFF → phase='planning' (backwards compat)", async (t) => {
|
|
103
|
+
const originalCwd = process.cwd();
|
|
104
|
+
const base = makeFixtureBase();
|
|
105
|
+
t.after(() => cleanup(base, originalCwd));
|
|
106
|
+
|
|
107
|
+
seedMilestoneWithSketchedS02(base);
|
|
108
|
+
writeS01Artifacts(base);
|
|
109
|
+
// Write a PREFERENCES.md without the flag so loadEffectiveGSDPreferences finds
|
|
110
|
+
// a valid file but progressive_planning resolves to undefined.
|
|
111
|
+
writePreferences(base, "phases:\n skip_research: false");
|
|
112
|
+
process.chdir(base);
|
|
113
|
+
|
|
114
|
+
const state = await deriveStateFromDb(base);
|
|
115
|
+
assert.equal(state.activeSlice?.id, "S02");
|
|
116
|
+
assert.equal(state.phase, "planning", "flag absent → must fall through to planning");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("ADR-011: dispatch rule maps refining → refine-slice unit", async (t) => {
|
|
120
|
+
const originalCwd = process.cwd();
|
|
121
|
+
const base = makeFixtureBase();
|
|
122
|
+
t.after(() => cleanup(base, originalCwd));
|
|
123
|
+
|
|
124
|
+
seedMilestoneWithSketchedS02(base);
|
|
125
|
+
writeS01Artifacts(base);
|
|
126
|
+
writePreferences(base, "phases:\n progressive_planning: true");
|
|
127
|
+
process.chdir(base);
|
|
128
|
+
|
|
129
|
+
const state = await deriveStateFromDb(base);
|
|
130
|
+
const ctx: DispatchContext = {
|
|
131
|
+
basePath: base,
|
|
132
|
+
mid: "M001",
|
|
133
|
+
midTitle: "Test",
|
|
134
|
+
state,
|
|
135
|
+
// Disable reassess-roadmap so it doesn't fire first on the just-completed S01.
|
|
136
|
+
prefs: { phases: { progressive_planning: true, reassess_after_slice: false } } as any,
|
|
137
|
+
};
|
|
138
|
+
const result = await resolveDispatch(ctx);
|
|
139
|
+
assert.equal(result.action, "dispatch");
|
|
140
|
+
if (result.action === "dispatch") {
|
|
141
|
+
assert.equal(result.unitType, "refine-slice");
|
|
142
|
+
assert.equal(result.unitId, "M001/S02");
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("ADR-011: refining + flag flipped OFF mid-milestone → falls through to plan-slice (no dead-end)", async (t) => {
|
|
147
|
+
const originalCwd = process.cwd();
|
|
148
|
+
const base = makeFixtureBase();
|
|
149
|
+
t.after(() => cleanup(base, originalCwd));
|
|
150
|
+
|
|
151
|
+
seedMilestoneWithSketchedS02(base);
|
|
152
|
+
writeS01Artifacts(base);
|
|
153
|
+
// prefs ON so state derivation yields 'refining'...
|
|
154
|
+
writePreferences(base, "phases:\n progressive_planning: true");
|
|
155
|
+
process.chdir(base);
|
|
156
|
+
const state = await deriveStateFromDb(base);
|
|
157
|
+
assert.equal(state.phase, "refining");
|
|
158
|
+
|
|
159
|
+
// ...then dispatch is invoked with the flag OFF (simulates user toggling
|
|
160
|
+
// progressive_planning off while a slice sits in 'refining'). The rule
|
|
161
|
+
// must gracefully downgrade to plan-slice, not return null (dead-end).
|
|
162
|
+
const ctx: DispatchContext = {
|
|
163
|
+
basePath: base,
|
|
164
|
+
mid: "M001",
|
|
165
|
+
midTitle: "Test",
|
|
166
|
+
state,
|
|
167
|
+
prefs: { phases: { progressive_planning: false, reassess_after_slice: false } } as any,
|
|
168
|
+
};
|
|
169
|
+
const result = await resolveDispatch(ctx);
|
|
170
|
+
assert.equal(result.action, "dispatch");
|
|
171
|
+
if (result.action === "dispatch") {
|
|
172
|
+
assert.equal(result.unitType, "plan-slice", "flag-off must downgrade to plan-slice");
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("ADR-011: autoHealSketchFlags flips is_sketch=0 when PLAN file exists", async (t) => {
|
|
177
|
+
const originalCwd = process.cwd();
|
|
178
|
+
const base = makeFixtureBase();
|
|
179
|
+
t.after(() => cleanup(base, originalCwd));
|
|
180
|
+
|
|
181
|
+
seedMilestoneWithSketchedS02(base);
|
|
182
|
+
writeS01Artifacts(base);
|
|
183
|
+
// Simulate crash between plan-slice write and sketch flip: PLAN.md exists
|
|
184
|
+
// but is_sketch is still 1.
|
|
185
|
+
writeFileSync(
|
|
186
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S02", "S02-PLAN.md"),
|
|
187
|
+
"# S02 Plan\n",
|
|
188
|
+
);
|
|
189
|
+
assert.equal(getSlice("M001", "S02")?.is_sketch, 1, "pre: flagged as sketch");
|
|
190
|
+
|
|
191
|
+
const { existsSync } = await import("node:fs");
|
|
192
|
+
autoHealSketchFlags("M001", (sid) => {
|
|
193
|
+
const planPath = join(base, ".gsd", "milestones", "M001", "slices", sid, `${sid}-PLAN.md`);
|
|
194
|
+
return existsSync(planPath);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
assert.equal(getSlice("M001", "S02")?.is_sketch, 0, "post-heal: flag cleared");
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test("ADR-011: schema v16 is idempotent — re-opening DB preserves is_sketch and sketch_scope columns", async (t) => {
|
|
201
|
+
const originalCwd = process.cwd();
|
|
202
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-schema-"));
|
|
203
|
+
t.after(() => {
|
|
204
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
205
|
+
// Restore cwd even though this test doesn't chdir — guards against
|
|
206
|
+
// leaked cwd from any earlier test in the file.
|
|
207
|
+
if (process.cwd() !== originalCwd) process.chdir(originalCwd);
|
|
208
|
+
rmSync(base, { recursive: true, force: true });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const dbPath = join(base, "gsd.db");
|
|
212
|
+
openDatabase(dbPath);
|
|
213
|
+
// Insert a sketch slice — round-trip proves the columns exist with correct
|
|
214
|
+
// defaults. If migration hadn't run, insertSlice would throw on the new
|
|
215
|
+
// named params.
|
|
216
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
217
|
+
insertSlice({
|
|
218
|
+
id: "S01",
|
|
219
|
+
milestoneId: "M001",
|
|
220
|
+
title: "X",
|
|
221
|
+
isSketch: true,
|
|
222
|
+
sketchScope: "narrow scope",
|
|
223
|
+
});
|
|
224
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 1);
|
|
225
|
+
assert.equal(getSlice("M001", "S01")?.sketch_scope, "narrow scope");
|
|
226
|
+
|
|
227
|
+
// Close and re-open — migration must be a no-op the second time and
|
|
228
|
+
// data must persist.
|
|
229
|
+
closeDatabase();
|
|
230
|
+
openDatabase(dbPath);
|
|
231
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 1, "data survives re-open");
|
|
232
|
+
assert.equal(getSlice("M001", "S01")?.sketch_scope, "narrow scope");
|
|
233
|
+
|
|
234
|
+
// Inserting a full (non-sketch) slice uses the default column values.
|
|
235
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Y" });
|
|
236
|
+
assert.equal(getSlice("M001", "S02")?.is_sketch, 0, "default is_sketch=0");
|
|
237
|
+
assert.equal(getSlice("M001", "S02")?.sketch_scope, "", "default sketch_scope=''");
|
|
238
|
+
|
|
239
|
+
// setSliceSketchFlag round-trip.
|
|
240
|
+
setSliceSketchFlag("M001", "S01", false);
|
|
241
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 0);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
245
|
+
// ADR-011: insertSlice ON CONFLICT sketch-flag preservation matrix
|
|
246
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
247
|
+
// Regression coverage for the 3-valued isSketch semantics (true/false/undefined).
|
|
248
|
+
// Re-planning a milestone must NOT silently flip a sketch slice to non-sketch
|
|
249
|
+
// (or vice versa) unless the caller explicitly intends the change.
|
|
250
|
+
|
|
251
|
+
test("ADR-011 ON CONFLICT: omitted isSketch preserves existing is_sketch=1", async (t) => {
|
|
252
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-conflict-"));
|
|
253
|
+
t.after(() => {
|
|
254
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
255
|
+
rmSync(base, { recursive: true, force: true });
|
|
256
|
+
});
|
|
257
|
+
openDatabase(join(base, "gsd.db"));
|
|
258
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
259
|
+
|
|
260
|
+
// Seed: S01 is a sketch.
|
|
261
|
+
insertSlice({
|
|
262
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
263
|
+
isSketch: true, sketchScope: "narrow scope",
|
|
264
|
+
});
|
|
265
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 1);
|
|
266
|
+
|
|
267
|
+
// Re-plan with isSketch omitted (undefined) — MUST preserve sketch state.
|
|
268
|
+
insertSlice({
|
|
269
|
+
id: "S01", milestoneId: "M001", title: "X (updated title)",
|
|
270
|
+
// isSketch intentionally omitted
|
|
271
|
+
});
|
|
272
|
+
assert.equal(
|
|
273
|
+
getSlice("M001", "S01")?.is_sketch, 1,
|
|
274
|
+
"omitted isSketch must preserve the existing sketch flag on ON CONFLICT",
|
|
275
|
+
);
|
|
276
|
+
assert.equal(
|
|
277
|
+
getSlice("M001", "S01")?.sketch_scope, "narrow scope",
|
|
278
|
+
"omitted sketchScope must preserve existing scope on ON CONFLICT",
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
test("ADR-011 ON CONFLICT: explicit isSketch=false clears existing sketch flag", async (t) => {
|
|
283
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-conflict-false-"));
|
|
284
|
+
t.after(() => {
|
|
285
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
286
|
+
rmSync(base, { recursive: true, force: true });
|
|
287
|
+
});
|
|
288
|
+
openDatabase(join(base, "gsd.db"));
|
|
289
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
290
|
+
|
|
291
|
+
insertSlice({
|
|
292
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
293
|
+
isSketch: true, sketchScope: "narrow scope",
|
|
294
|
+
});
|
|
295
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 1);
|
|
296
|
+
|
|
297
|
+
// Explicit isSketch=false intentionally clears the flag (e.g., user re-plans
|
|
298
|
+
// sketch as full slice).
|
|
299
|
+
insertSlice({
|
|
300
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
301
|
+
isSketch: false,
|
|
302
|
+
});
|
|
303
|
+
assert.equal(
|
|
304
|
+
getSlice("M001", "S01")?.is_sketch, 0,
|
|
305
|
+
"explicit isSketch=false must clear the sketch flag",
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
test("ADR-011 ON CONFLICT: isSketch=true upgrades existing non-sketch to sketch", async (t) => {
|
|
310
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-conflict-true-"));
|
|
311
|
+
t.after(() => {
|
|
312
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
313
|
+
rmSync(base, { recursive: true, force: true });
|
|
314
|
+
});
|
|
315
|
+
openDatabase(join(base, "gsd.db"));
|
|
316
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
317
|
+
|
|
318
|
+
// Seed as full slice.
|
|
319
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "X" });
|
|
320
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 0);
|
|
321
|
+
|
|
322
|
+
// Re-plan upgrading to sketch.
|
|
323
|
+
insertSlice({
|
|
324
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
325
|
+
isSketch: true, sketchScope: "new scope",
|
|
326
|
+
});
|
|
327
|
+
assert.equal(getSlice("M001", "S01")?.is_sketch, 1);
|
|
328
|
+
assert.equal(getSlice("M001", "S01")?.sketch_scope, "new scope");
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
test("ADR-011 ON CONFLICT: empty-string sketchScope clears existing scope (not preserves it)", async (t) => {
|
|
332
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-adr011-conflict-empty-"));
|
|
333
|
+
t.after(() => {
|
|
334
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
335
|
+
rmSync(base, { recursive: true, force: true });
|
|
336
|
+
});
|
|
337
|
+
openDatabase(join(base, "gsd.db"));
|
|
338
|
+
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
339
|
+
|
|
340
|
+
insertSlice({
|
|
341
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
342
|
+
isSketch: true, sketchScope: "existing scope",
|
|
343
|
+
});
|
|
344
|
+
// Explicit empty string is the caller saying "clear it" — must not be
|
|
345
|
+
// treated as absent (the `?? null` footgun the peer review flagged).
|
|
346
|
+
insertSlice({
|
|
347
|
+
id: "S01", milestoneId: "M001", title: "X",
|
|
348
|
+
isSketch: false, sketchScope: "",
|
|
349
|
+
});
|
|
350
|
+
assert.equal(getSlice("M001", "S01")?.sketch_scope, "", "explicit '' must clear, not preserve");
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
354
|
+
// ADR-011 Phase 3 — Integration: Progressive Planning
|
|
355
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
356
|
+
|
|
357
|
+
test("ADR-011 P3 #19: refine-slice prompt incorporates prior slice findings + sketch scope as hard constraint", async (t) => {
|
|
358
|
+
// Exercises the end-to-end path that makes progressive planning useful:
|
|
359
|
+
// 1. M001 has 3 slices. S01 is full and complete, with a SUMMARY.md that
|
|
360
|
+
// contains specific findings. S02 is a sketch that depends on S01.
|
|
361
|
+
// 2. The refining-phase dispatch builds S02's prompt via buildRefineSlicePrompt.
|
|
362
|
+
// 3. The generated prompt must contain BOTH the S01 findings (via
|
|
363
|
+
// inlineDependencySummaries, same path plan-slice uses) AND the stored
|
|
364
|
+
// sketch_scope prepended as a hard-constraint block (escalation-free
|
|
365
|
+
// Phase 1 contract).
|
|
366
|
+
//
|
|
367
|
+
// This is the core value proposition of ADR-011: refine against the latest
|
|
368
|
+
// codebase state + upstream findings, not the blank snapshot from initial
|
|
369
|
+
// plan-milestone. If either piece is missing, the refine flow has regressed.
|
|
370
|
+
const originalCwd = process.cwd();
|
|
371
|
+
const base = makeFixtureBase();
|
|
372
|
+
t.after(() => cleanup(base, originalCwd));
|
|
373
|
+
|
|
374
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
375
|
+
insertMilestone({ id: "M001", title: "Integration test milestone", status: "active" });
|
|
376
|
+
insertSlice({
|
|
377
|
+
id: "S01", milestoneId: "M001", title: "Foundation",
|
|
378
|
+
status: "complete", risk: "high", depends: [], sequence: 1,
|
|
379
|
+
isSketch: false,
|
|
380
|
+
});
|
|
381
|
+
insertSlice({
|
|
382
|
+
id: "S02", milestoneId: "M001", title: "Feature built on foundation",
|
|
383
|
+
status: "pending", risk: "medium", depends: ["S01"], sequence: 2,
|
|
384
|
+
isSketch: true,
|
|
385
|
+
sketchScope: "Feature X in module Y only; do not refactor the foundation.",
|
|
386
|
+
});
|
|
387
|
+
insertSlice({
|
|
388
|
+
id: "S03", milestoneId: "M001", title: "Polish",
|
|
389
|
+
status: "pending", risk: "low", depends: ["S02"], sequence: 3,
|
|
390
|
+
isSketch: true,
|
|
391
|
+
sketchScope: "Polish + docs for Feature X.",
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// Minimal roadmap so inlineRoadmapExcerpt has something to read.
|
|
395
|
+
writeFileSync(
|
|
396
|
+
join(base, ".gsd", "milestones", "M001", "ROADMAP.md"),
|
|
397
|
+
[
|
|
398
|
+
"# M001: Integration test milestone",
|
|
399
|
+
"",
|
|
400
|
+
"## Slices",
|
|
401
|
+
"",
|
|
402
|
+
"- [x] **S01: Foundation** `risk:high` `depends:[]`",
|
|
403
|
+
"- [ ] **S02: Feature built on foundation** `risk:medium` `depends:[S01]`",
|
|
404
|
+
"- [ ] **S03: Polish** `risk:low` `depends:[S02]`",
|
|
405
|
+
"",
|
|
406
|
+
].join("\n"),
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
// Write S01 artifacts — the SUMMARY carries findings that S02's refine pass
|
|
410
|
+
// must incorporate. The specific markers below are what the assertion pins.
|
|
411
|
+
writeFileSync(
|
|
412
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
|
|
413
|
+
"# S01 Plan\n",
|
|
414
|
+
);
|
|
415
|
+
const s01Findings = [
|
|
416
|
+
"# S01 Summary",
|
|
417
|
+
"",
|
|
418
|
+
"## Findings",
|
|
419
|
+
"",
|
|
420
|
+
"- FINDING-MARKER-AUTH: chose JWT over sessions for statelessness.",
|
|
421
|
+
"- FINDING-MARKER-DB: schema v17 migration required before S02 can safely add the feature table.",
|
|
422
|
+
"",
|
|
423
|
+
"## Key Decisions",
|
|
424
|
+
"",
|
|
425
|
+
"- Do not introduce a background worker yet — premature.",
|
|
426
|
+
].join("\n");
|
|
427
|
+
writeFileSync(
|
|
428
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-SUMMARY.md"),
|
|
429
|
+
s01Findings,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
writePreferences(base, "phases:\n progressive_planning: true");
|
|
433
|
+
process.chdir(base);
|
|
434
|
+
|
|
435
|
+
// Build the refine prompt for S02 — the same call the refining-phase
|
|
436
|
+
// dispatch rule would make in production.
|
|
437
|
+
const { buildRefineSlicePrompt } = await import("../auto-prompts.ts");
|
|
438
|
+
const prompt = await buildRefineSlicePrompt(
|
|
439
|
+
"M001", "Integration test milestone", "S02", "Feature built on foundation", base,
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
// ── Sketch scope injected as a hard constraint ─────────────────────────
|
|
443
|
+
assert.match(
|
|
444
|
+
prompt,
|
|
445
|
+
/## Sketch Scope \(hard constraint\)/,
|
|
446
|
+
"refine prompt must frame sketch_scope as a hard constraint",
|
|
447
|
+
);
|
|
448
|
+
assert.match(
|
|
449
|
+
prompt,
|
|
450
|
+
/Feature X in module Y only/,
|
|
451
|
+
"refine prompt must include the stored sketch_scope text verbatim",
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
// ── Prior slice findings carried forward from S01-SUMMARY ──────────────
|
|
455
|
+
assert.match(
|
|
456
|
+
prompt,
|
|
457
|
+
/FINDING-MARKER-AUTH/,
|
|
458
|
+
"S01's auth finding must surface in the S02 refine prompt",
|
|
459
|
+
);
|
|
460
|
+
assert.match(
|
|
461
|
+
prompt,
|
|
462
|
+
/FINDING-MARKER-DB/,
|
|
463
|
+
"S01's DB finding must surface in the S02 refine prompt",
|
|
464
|
+
);
|
|
465
|
+
assert.match(
|
|
466
|
+
prompt,
|
|
467
|
+
/S01 Summary/,
|
|
468
|
+
"inlineDependencySummaries must label the injected block with S01's section header",
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
// ── Not the stale blank-slate plan-slice framing ───────────────────────
|
|
472
|
+
// The refine prompt is a *transformation*, not a blank-sheet plan. Pin the
|
|
473
|
+
// distinction so future prompt edits don't silently collapse the two paths.
|
|
474
|
+
assert.doesNotMatch(
|
|
475
|
+
prompt,
|
|
476
|
+
/Prior Sketch Scope \(soft hint — non-binding\)/,
|
|
477
|
+
"refine prompt must NOT use the soft-hint framing (that's the plan-slice flag-off downgrade)",
|
|
478
|
+
);
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
test("ADR-011 P3 #26: refine-slice dispatch latency is bounded vs plan-slice baseline", async (t) => {
|
|
482
|
+
// Pins the Zylos 2026 research claim that progressive planning trades a
|
|
483
|
+
// small dispatch-time cost for significant plan quality. The refine path
|
|
484
|
+
// does extra work: it reads sketch_scope from the DB and inlines the
|
|
485
|
+
// dependency summaries. Neither operation should dominate the prompt build.
|
|
486
|
+
//
|
|
487
|
+
// Absolute: < 500ms wall clock. Relative: < 3x plan-slice baseline.
|
|
488
|
+
// Both bounds are deliberately generous — this test is a regression gate,
|
|
489
|
+
// not a benchmark. The goal is catching accidental O(N) fs walks or DB
|
|
490
|
+
// queries that would multiply dispatch time as milestones grow.
|
|
491
|
+
const originalCwd = process.cwd();
|
|
492
|
+
const base = makeFixtureBase();
|
|
493
|
+
t.after(() => cleanup(base, originalCwd));
|
|
494
|
+
|
|
495
|
+
seedMilestoneWithSketchedS02(base);
|
|
496
|
+
writeS01Artifacts(base);
|
|
497
|
+
writeFileSync(
|
|
498
|
+
join(base, ".gsd", "milestones", "M001", "ROADMAP.md"),
|
|
499
|
+
[
|
|
500
|
+
"# M001: Test",
|
|
501
|
+
"",
|
|
502
|
+
"## Slices",
|
|
503
|
+
"",
|
|
504
|
+
"- [x] **S01: Foundation** `risk:high` `depends:[]`",
|
|
505
|
+
"- [ ] **S02: Feature** `risk:medium` `depends:[S01]`",
|
|
506
|
+
"",
|
|
507
|
+
].join("\n"),
|
|
508
|
+
);
|
|
509
|
+
writePreferences(base, "phases:\n progressive_planning: true");
|
|
510
|
+
process.chdir(base);
|
|
511
|
+
|
|
512
|
+
const { buildRefineSlicePrompt, buildPlanSlicePrompt } = await import("../auto-prompts.ts");
|
|
513
|
+
|
|
514
|
+
// Warm-up pass — first call loads the prompt template from disk and primes
|
|
515
|
+
// fs/DB caches. Measuring the cold path would be noisy and misleading.
|
|
516
|
+
await buildPlanSlicePrompt("M001", "Test", "S02", "Feature", base);
|
|
517
|
+
await buildRefineSlicePrompt("M001", "Test", "S02", "Feature", base);
|
|
518
|
+
|
|
519
|
+
const planStart = Date.now();
|
|
520
|
+
await buildPlanSlicePrompt("M001", "Test", "S02", "Feature", base);
|
|
521
|
+
const planElapsed = Date.now() - planStart;
|
|
522
|
+
|
|
523
|
+
const refineStart = Date.now();
|
|
524
|
+
await buildRefineSlicePrompt("M001", "Test", "S02", "Feature", base);
|
|
525
|
+
const refineElapsed = Date.now() - refineStart;
|
|
526
|
+
|
|
527
|
+
assert.ok(
|
|
528
|
+
refineElapsed < 500,
|
|
529
|
+
`refine-slice prompt build must complete under 500ms (took ${refineElapsed}ms)`,
|
|
530
|
+
);
|
|
531
|
+
// Guard the ratio only when the baseline is large enough to be meaningful —
|
|
532
|
+
// if plan-slice measures 0-2ms the ratio is dominated by timer noise.
|
|
533
|
+
if (planElapsed >= 5) {
|
|
534
|
+
assert.ok(
|
|
535
|
+
refineElapsed < planElapsed * 3,
|
|
536
|
+
`refine-slice must not exceed 3x plan-slice baseline (refine=${refineElapsed}ms, plan=${planElapsed}ms)`,
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
});
|
|
@@ -30,6 +30,8 @@ function makeSliceRow(overrides?: Partial<SliceRow>): SliceRow {
|
|
|
30
30
|
observability_impact: '',
|
|
31
31
|
sequence: 0,
|
|
32
32
|
replan_triggered_at: null,
|
|
33
|
+
is_sketch: 0,
|
|
34
|
+
sketch_scope: '',
|
|
33
35
|
...overrides,
|
|
34
36
|
};
|
|
35
37
|
}
|
|
@@ -61,6 +63,11 @@ function makeTaskRow(overrides?: Partial<TaskRow>): TaskRow {
|
|
|
61
63
|
expected_output: [],
|
|
62
64
|
observability_impact: '',
|
|
63
65
|
sequence: 0,
|
|
66
|
+
blocker_source: '',
|
|
67
|
+
escalation_pending: 0,
|
|
68
|
+
escalation_awaiting_review: 0,
|
|
69
|
+
escalation_artifact_path: null,
|
|
70
|
+
escalation_override_applied_at: null,
|
|
64
71
|
...overrides,
|
|
65
72
|
};
|
|
66
73
|
}
|
|
@@ -164,6 +164,33 @@ describe("prompt-budget: inlineDependencySummaries truncation", () => {
|
|
|
164
164
|
const result = await inlineDependencySummaries("M001", "S01", base, 1000);
|
|
165
165
|
assert.equal(result, "- (no dependencies)");
|
|
166
166
|
});
|
|
167
|
+
|
|
168
|
+
// Regression for issue #4435: a slice with 12 declared dependencies on a
|
|
169
|
+
// small-window (32K) model should not inject the full concatenated 55-70K
|
|
170
|
+
// chars of dep summaries. Exercises the budget the builders now pass in
|
|
171
|
+
// (computeBudgets(32000).summaryBudgetChars ≈ 19_200 chars).
|
|
172
|
+
it("caps 12 cumulative dep summaries at the 32K summaryBudgetChars (#4435)", async () => {
|
|
173
|
+
const depIds = Array.from({ length: 12 }, (_, i) => `S${String(i + 1).padStart(2, "0")}`);
|
|
174
|
+
const section = (label: string) => `### ${label}\n\n${"Lorem ipsum dolor sit amet. ".repeat(200)}`;
|
|
175
|
+
const perSummary = [section("Results"), section("Key Decisions"), section("Forward Intelligence")].join("\n\n");
|
|
176
|
+
const summaries: Record<string, string> = {};
|
|
177
|
+
for (const id of depIds) summaries[id] = perSummary;
|
|
178
|
+
|
|
179
|
+
setupDependencyFixture(base, "M001", "S13", depIds, summaries);
|
|
180
|
+
|
|
181
|
+
const budget32K = computeBudgets(32_000).summaryBudgetChars;
|
|
182
|
+
const result = await inlineDependencySummaries("M001", "S13", base, budget32K);
|
|
183
|
+
|
|
184
|
+
// The total raw content would be 12 × ~17K chars ≈ 200K chars. Budget at
|
|
185
|
+
// 32K is ~19.2K chars. The result must be bounded and the overflow marker
|
|
186
|
+
// must be present.
|
|
187
|
+
assert.ok(result.length <= budget32K + 200, `result must fit within 32K summary budget, got ${result.length}`);
|
|
188
|
+
assert.ok(result.includes("[...truncated"), "must emit the truncation marker when over budget");
|
|
189
|
+
|
|
190
|
+
// Unbounded call returns the full ~200K — confirms this is the regression surface.
|
|
191
|
+
const unbounded = await inlineDependencySummaries("M001", "S13", base);
|
|
192
|
+
assert.ok(unbounded.length > budget32K * 5, "unbounded call should blow past the 32K budget (regression baseline)");
|
|
193
|
+
});
|
|
167
194
|
});
|
|
168
195
|
|
|
169
196
|
// ─── plan-slice template includes executor constraints placeholder ────────────
|
|
@@ -223,6 +223,30 @@ test("replan-slice prompt uses gsd_replan_slice as canonical DB-backed tool", ()
|
|
|
223
223
|
assert.doesNotMatch(prompt, /Degraded fallback/i);
|
|
224
224
|
});
|
|
225
225
|
|
|
226
|
+
// ─── ADR-011 refine-slice prompt contracts ────────────────────────────
|
|
227
|
+
|
|
228
|
+
test("refine-slice prompt names gsd_plan_slice as the DB-backed write path", () => {
|
|
229
|
+
const prompt = readPrompt("refine-slice");
|
|
230
|
+
assert.match(prompt, /gsd_plan_slice/, "refine-slice must call gsd_plan_slice to persist");
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("refine-slice prompt does not instruct direct PLAN.md writes", () => {
|
|
234
|
+
const prompt = readPrompt("refine-slice");
|
|
235
|
+
assert.match(
|
|
236
|
+
prompt,
|
|
237
|
+
/do NOT rely on direct `PLAN\.md` writes/i,
|
|
238
|
+
"refine-slice must not frame direct file writes as authoritative",
|
|
239
|
+
);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("refine-slice prompt frames the unit as a transformation, not blank-sheet planning", () => {
|
|
243
|
+
const prompt = readPrompt("refine-slice");
|
|
244
|
+
// The framing language is load-bearing — the model should treat this as
|
|
245
|
+
// expanding an approved sketch, not planning from scratch.
|
|
246
|
+
assert.match(prompt, /expands an approved sketch/i);
|
|
247
|
+
assert.match(prompt, /Sketch Scope/);
|
|
248
|
+
});
|
|
249
|
+
|
|
226
250
|
test("reassess-roadmap prompt references gsd_reassess_roadmap tool", () => {
|
|
227
251
|
const prompt = readPrompt("reassess-roadmap");
|
|
228
252
|
assert.match(prompt, /gsd_reassess_roadmap/);
|
|
@@ -360,7 +360,7 @@ test('prompt-db: re-import updates DB when source markdown changes', () => {
|
|
|
360
360
|
`;
|
|
361
361
|
writeFileSync(join(gsdDir, 'DECISIONS.md'), updatedDecisions);
|
|
362
362
|
|
|
363
|
-
// Re-import (simulating what
|
|
363
|
+
// Re-import (simulating what the agent_end path does)
|
|
364
364
|
migrateFromMarkdown(tmpDir);
|
|
365
365
|
|
|
366
366
|
// Verify DB now has 3 decisions
|