gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.2203010a0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -149
- package/dist/claude-cli-check.d.ts +10 -0
- package/dist/claude-cli-check.js +13 -3
- package/dist/headless-events.d.ts +1 -1
- package/dist/headless-events.js +5 -2
- package/dist/headless.js +5 -6
- package/dist/loader.js +0 -0
- package/dist/onboarding.d.ts +15 -0
- package/dist/onboarding.js +94 -36
- 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 +10 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
- package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
- package/dist/resources/extensions/gsd/auto-start.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
- package/dist/resources/extensions/gsd/auto.js +57 -25
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +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 +81 -9
- package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
- package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
- package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +175 -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-config.js +5 -0
- package/dist/resources/extensions/gsd/commands-debug.js +388 -0
- package/dist/resources/extensions/gsd/commands-do.js +1 -0
- package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
- package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
- package/dist/resources/extensions/gsd/commands-scan.js +94 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
- package/dist/resources/extensions/gsd/db-writer.js +1 -0
- package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
- package/dist/resources/extensions/gsd/definition-loader.js +7 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
- package/dist/resources/extensions/gsd/doctor.js +7 -1
- package/dist/resources/extensions/gsd/error-classifier.js +6 -3
- package/dist/resources/extensions/gsd/escalation.js +321 -0
- package/dist/resources/extensions/gsd/forensics.js +26 -29
- package/dist/resources/extensions/gsd/git-service.js +0 -1
- package/dist/resources/extensions/gsd/graph.js +26 -2
- package/dist/resources/extensions/gsd/gsd-db.js +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/init-wizard.js +86 -45
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
- 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/onboarding-state.js +133 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
- package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
- package/dist/resources/extensions/gsd/preferences-models.js +1 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
- package/dist/resources/extensions/gsd/preferences.js +10 -10
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
- package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/dist/resources/extensions/gsd/python-resolver.js +70 -0
- package/dist/resources/extensions/gsd/run-manager.js +37 -17
- package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
- package/dist/resources/extensions/gsd/state.js +47 -3
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
- package/dist/resources/extensions/gsd/tools/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/verification-gate.js +2 -1
- package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
- package/dist/resources/extensions/gsd/workflow-install.js +327 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
- package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
- package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
- package/dist/resources/extensions/remote-questions/commands.js +380 -0
- package/dist/resources/extensions/remote-questions/manager.js +39 -5
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
- package/dist/resources/extensions/shared/interview-ui.js +189 -1
- package/dist/resources/extensions/shared/layout-utils.js +17 -0
- package/dist/resources/extensions/shared/rtk-shared.js +47 -0
- package/dist/resources/extensions/shared/rtk.js +3 -46
- package/dist/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/rtk-shared.d.ts +10 -0
- package/dist/rtk-shared.js +47 -0
- package/dist/rtk.d.ts +2 -6
- package/dist/rtk.js +3 -48
- package/dist/shared/workspace-types.d.ts +52 -0
- package/dist/shared/workspace-types.js +1 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +10 -0
- package/dist/update-check.js +24 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
- package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
- package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +48 -24
- package/dist/wizard.js +2 -2
- package/dist/worktree-cli.d.ts +6 -5
- package/dist/worktree-cli.js +23 -7
- package/package.json +3 -3
- package/packages/mcp-server/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 +10 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
- package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
- package/src/resources/extensions/gsd/auto-start.ts +8 -6
- package/src/resources/extensions/gsd/auto-verification.ts +3 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
- package/src/resources/extensions/gsd/auto.ts +61 -28
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +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 +74 -9
- package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +229 -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-config.ts +10 -0
- package/src/resources/extensions/gsd/commands-debug.ts +484 -0
- package/src/resources/extensions/gsd/commands-do.ts +1 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
- package/src/resources/extensions/gsd/commands-scan.ts +125 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
- package/src/resources/extensions/gsd/db-writer.ts +3 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/definition-loader.ts +7 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -1
- package/src/resources/extensions/gsd/error-classifier.ts +6 -3
- package/src/resources/extensions/gsd/escalation.ts +367 -0
- package/src/resources/extensions/gsd/forensics.ts +25 -29
- package/src/resources/extensions/gsd/git-service.ts +0 -1
- package/src/resources/extensions/gsd/graph.ts +33 -3
- package/src/resources/extensions/gsd/gsd-db.ts +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/init-wizard.ts +87 -54
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
- 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/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
- package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
- package/src/resources/extensions/gsd/preferences-models.ts +1 -0
- package/src/resources/extensions/gsd/preferences-types.ts +10 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
- package/src/resources/extensions/gsd/preferences.ts +10 -10
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/run-manager.ts +53 -19
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/state.ts +50 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-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/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
- package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/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/verification-gate.ts +2 -1
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-install.ts +423 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
- package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
- package/src/resources/extensions/gsd/workspace-index.ts +9 -4
- package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/manager.ts +49 -4
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/shared/interview-ui.ts +195 -1
- package/src/resources/extensions/shared/layout-utils.ts +26 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +12 -52
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/skills/create-workflow/SKILL.md +33 -6
- package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/dist/ps/types.d.ts +0 -5
- package/packages/native/dist/ps/types.js +0 -2
- package/packages/native/src/ps/types.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
- package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
- package/packages/pi-ai/oauth.d.ts +0 -1
- package/packages/pi-ai/oauth.js +0 -1
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → 8FZqxNe9FxQDmsbRzR8tA}/_ssgManifest.js +0 -0
|
@@ -1,60 +1,42 @@
|
|
|
1
|
-
// GSD Extension — Notification
|
|
2
|
-
// Always-on ambient
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// GSD Extension — Notification Status
|
|
2
|
+
// Always-on ambient notification chip surfaced as an extension status on the
|
|
3
|
+
// footer pwd row. Refreshes on store change + on a 30s timer. Hidden when
|
|
4
|
+
// unread=0. Key sorts late so the chip renders to the right of other
|
|
5
|
+
// extension statuses.
|
|
5
6
|
|
|
6
7
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
7
8
|
|
|
8
9
|
import { getUnreadCount, onNotificationStoreChange } from "./notification-store.js";
|
|
9
10
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
10
11
|
|
|
11
|
-
//
|
|
12
|
+
// Key chosen to sort after alphabetic extension keys so the chip lands on the
|
|
13
|
+
// far right of the extension-status block.
|
|
14
|
+
const STATUS_KEY = "zz-notifications";
|
|
12
15
|
|
|
13
|
-
export function
|
|
16
|
+
export function buildNotificationChip(): string {
|
|
14
17
|
const unread = getUnreadCount();
|
|
15
|
-
if (unread === 0) return
|
|
16
|
-
|
|
17
|
-
return [` 🔔 Notifications: ${unread} unread (${formattedShortcutPair("notifications")})`];
|
|
18
|
+
if (unread === 0) return "";
|
|
19
|
+
return `🔔 ${unread} unread (${formattedShortcutPair("notifications")})`;
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
//
|
|
22
|
+
// Retained for backwards compatibility with tests and the RPC fallback path
|
|
23
|
+
// that still expected a line-array widget. Returns empty when no unread.
|
|
24
|
+
export function buildNotificationWidgetLines(): string[] {
|
|
25
|
+
const chip = buildNotificationChip();
|
|
26
|
+
return chip ? [` ${chip}`] : [];
|
|
27
|
+
}
|
|
21
28
|
|
|
22
29
|
const REFRESH_INTERVAL_MS = 30_000;
|
|
23
30
|
|
|
24
|
-
/**
|
|
25
|
-
* Initialize the always-on notification widget (belowEditor).
|
|
26
|
-
* Call once from session_start after the notification store is initialized.
|
|
27
|
-
*/
|
|
28
31
|
export function initNotificationWidget(ctx: ExtensionContext): void {
|
|
29
32
|
if (!ctx.hasUI) return;
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
cachedLines = undefined;
|
|
40
|
-
_tui.requestRender();
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const unsubscribe = onNotificationStoreChange(refresh);
|
|
44
|
-
const refreshTimer = setInterval(refresh, REFRESH_INTERVAL_MS);
|
|
45
|
-
|
|
46
|
-
return {
|
|
47
|
-
render(_width: number): string[] {
|
|
48
|
-
if (!cachedLines) cachedLines = buildNotificationWidgetLines();
|
|
49
|
-
return cachedLines;
|
|
50
|
-
},
|
|
51
|
-
invalidate(): void {
|
|
52
|
-
cachedLines = undefined;
|
|
53
|
-
},
|
|
54
|
-
dispose(): void {
|
|
55
|
-
unsubscribe();
|
|
56
|
-
clearInterval(refreshTimer);
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}, { placement: "belowEditor" });
|
|
34
|
+
const push = () => {
|
|
35
|
+
const chip = buildNotificationChip();
|
|
36
|
+
ctx.ui.setStatus(STATUS_KEY, chip.length > 0 ? chip : undefined);
|
|
37
|
+
};
|
|
38
|
+
push();
|
|
39
|
+
|
|
40
|
+
onNotificationStoreChange(push);
|
|
41
|
+
setInterval(push, REFRESH_INTERVAL_MS).unref?.();
|
|
60
42
|
}
|
|
@@ -5,6 +5,7 @@ import { execFileSync } from "node:child_process";
|
|
|
5
5
|
import type { NotificationPreferences } from "./types.js";
|
|
6
6
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
7
7
|
import { CmuxClient, emitOsc777Notification, resolveCmuxConfig } from "../cmux/index.js";
|
|
8
|
+
import { sendRemoteNotification } from "../remote-questions/notify.js";
|
|
8
9
|
|
|
9
10
|
export type NotifyLevel = "info" | "success" | "warning" | "error";
|
|
10
11
|
export type NotificationKind = "complete" | "error" | "budget" | "milestone" | "attention";
|
|
@@ -31,6 +32,11 @@ export function sendDesktopNotification(
|
|
|
31
32
|
title = formatNotificationTitle(projectName);
|
|
32
33
|
}
|
|
33
34
|
const loaded = loadEffectiveGSDPreferences()?.preferences;
|
|
35
|
+
|
|
36
|
+
// Remote notifications fire independently of desktop preferences.
|
|
37
|
+
// sendRemoteNotification handles "not configured" gracefully (early return).
|
|
38
|
+
void sendRemoteNotification(title, message).catch(() => {});
|
|
39
|
+
|
|
34
40
|
if (!shouldSendDesktopNotification(kind, loaded?.notifications)) return;
|
|
35
41
|
|
|
36
42
|
const cmux = resolveCmuxConfig(loaded);
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// GSD — Onboarding completion record (~/.gsd/agent/onboarding.json)
|
|
2
|
+
//
|
|
3
|
+
// First-class state for the onboarding wizard so re-entry, resume, and the
|
|
4
|
+
// web boot probe all read the same source of truth. Replaces the implicit
|
|
5
|
+
// "settings.defaultProvider exists" heuristic.
|
|
6
|
+
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs"
|
|
8
|
+
import { homedir } from "node:os"
|
|
9
|
+
import { dirname, join } from "node:path"
|
|
10
|
+
import { logWarning } from "./workflow-logger.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Bump `FLOW_VERSION` whenever a new required step is added to ONBOARDING_STEPS.
|
|
14
|
+
* Records with an older flowVersion are treated as "needs partial re-onboarding"
|
|
15
|
+
* by isOnboardingComplete().
|
|
16
|
+
*/
|
|
17
|
+
export const FLOW_VERSION = 1
|
|
18
|
+
|
|
19
|
+
const RECORD_VERSION = 1
|
|
20
|
+
// Inline agentDir computation (mirrors src/app-paths.ts) — keep this module
|
|
21
|
+
// rootDir-clean for the resources tsconfig; importing from src/ pulls files
|
|
22
|
+
// outside src/resources and breaks the build.
|
|
23
|
+
const AGENT_DIR =
|
|
24
|
+
process.env.GSD_CODING_AGENT_DIR ||
|
|
25
|
+
join(process.env.GSD_HOME || join(homedir(), ".gsd"), "agent")
|
|
26
|
+
const FILE = join(AGENT_DIR, "onboarding.json")
|
|
27
|
+
|
|
28
|
+
export interface OnboardingRecord {
|
|
29
|
+
version: number
|
|
30
|
+
flowVersion: number
|
|
31
|
+
completedAt: string | null
|
|
32
|
+
completedSteps: string[]
|
|
33
|
+
skippedSteps: string[]
|
|
34
|
+
lastResumePoint: string | null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const DEFAULT: OnboardingRecord = {
|
|
38
|
+
version: RECORD_VERSION,
|
|
39
|
+
flowVersion: FLOW_VERSION,
|
|
40
|
+
completedAt: null,
|
|
41
|
+
completedSteps: [],
|
|
42
|
+
skippedSteps: [],
|
|
43
|
+
lastResumePoint: null,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function readOnboardingRecord(): OnboardingRecord {
|
|
47
|
+
if (!existsSync(FILE)) return { ...DEFAULT }
|
|
48
|
+
try {
|
|
49
|
+
const raw = JSON.parse(readFileSync(FILE, "utf-8")) as Partial<OnboardingRecord>
|
|
50
|
+
return {
|
|
51
|
+
version: typeof raw.version === "number" ? raw.version : RECORD_VERSION,
|
|
52
|
+
flowVersion: typeof raw.flowVersion === "number" ? raw.flowVersion : 0,
|
|
53
|
+
completedAt: typeof raw.completedAt === "string" ? raw.completedAt : null,
|
|
54
|
+
completedSteps: Array.isArray(raw.completedSteps) ? raw.completedSteps.filter(s => typeof s === "string") : [],
|
|
55
|
+
skippedSteps: Array.isArray(raw.skippedSteps) ? raw.skippedSteps.filter(s => typeof s === "string") : [],
|
|
56
|
+
lastResumePoint: typeof raw.lastResumePoint === "string" ? raw.lastResumePoint : null,
|
|
57
|
+
}
|
|
58
|
+
} catch {
|
|
59
|
+
// Corrupt/unreadable — fall back to defaults rather than crashing onboarding flow
|
|
60
|
+
return { ...DEFAULT }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function atomicWrite(record: OnboardingRecord): void {
|
|
65
|
+
mkdirSync(dirname(FILE), { recursive: true })
|
|
66
|
+
const tmp = `${FILE}.tmp.${process.pid}.${Date.now()}`
|
|
67
|
+
try {
|
|
68
|
+
writeFileSync(tmp, JSON.stringify(record, null, 2), "utf-8")
|
|
69
|
+
renameSync(tmp, FILE)
|
|
70
|
+
} catch (err) {
|
|
71
|
+
// Best-effort: drop the tmp file if the rename failed (don't leak stale tmps)
|
|
72
|
+
try { if (existsSync(tmp)) unlinkSync(tmp) } catch { /* swallow secondary error */ }
|
|
73
|
+
throw err
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function writeOnboardingRecord(patch: Partial<OnboardingRecord>): OnboardingRecord {
|
|
78
|
+
const current = readOnboardingRecord()
|
|
79
|
+
const next: OnboardingRecord = {
|
|
80
|
+
...current,
|
|
81
|
+
...patch,
|
|
82
|
+
version: RECORD_VERSION,
|
|
83
|
+
// flowVersion is sticky on writes unless explicitly patched
|
|
84
|
+
flowVersion: typeof patch.flowVersion === "number" ? patch.flowVersion : current.flowVersion,
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
atomicWrite(next)
|
|
88
|
+
} catch (err) {
|
|
89
|
+
// Non-fatal for the wizard, but make the failure diagnosable. The next boot
|
|
90
|
+
// will re-prompt for onboarding because the record didn't persist; the
|
|
91
|
+
// logWarning entry tells the user why.
|
|
92
|
+
logWarning("state", `Failed to persist onboarding record: ${err instanceof Error ? err.message : String(err)}`, {
|
|
93
|
+
file: FILE,
|
|
94
|
+
})
|
|
95
|
+
}
|
|
96
|
+
return next
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Onboarding is "complete" when there's a completedAt timestamp AND the
|
|
101
|
+
* flowVersion matches the current FLOW_VERSION. A flowVersion bump means
|
|
102
|
+
* a new required step exists and the user should re-enter to configure it.
|
|
103
|
+
*/
|
|
104
|
+
export function isOnboardingComplete(): boolean {
|
|
105
|
+
const r = readOnboardingRecord()
|
|
106
|
+
return r.completedAt !== null && r.flowVersion === FLOW_VERSION
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function markStepCompleted(stepId: string): void {
|
|
110
|
+
const r = readOnboardingRecord()
|
|
111
|
+
if (r.completedSteps.includes(stepId)) {
|
|
112
|
+
writeOnboardingRecord({ lastResumePoint: stepId })
|
|
113
|
+
return
|
|
114
|
+
}
|
|
115
|
+
writeOnboardingRecord({
|
|
116
|
+
completedSteps: [...r.completedSteps, stepId],
|
|
117
|
+
skippedSteps: r.skippedSteps.filter(s => s !== stepId),
|
|
118
|
+
lastResumePoint: stepId,
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function markStepSkipped(stepId: string): void {
|
|
123
|
+
const r = readOnboardingRecord()
|
|
124
|
+
if (r.skippedSteps.includes(stepId) || r.completedSteps.includes(stepId)) return
|
|
125
|
+
writeOnboardingRecord({
|
|
126
|
+
skippedSteps: [...r.skippedSteps, stepId],
|
|
127
|
+
lastResumePoint: stepId,
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function markOnboardingComplete(completedSteps: string[]): void {
|
|
132
|
+
writeOnboardingRecord({
|
|
133
|
+
completedAt: new Date().toISOString(),
|
|
134
|
+
flowVersion: FLOW_VERSION,
|
|
135
|
+
completedSteps,
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function resetOnboarding(): void {
|
|
140
|
+
writeOnboardingRecord({
|
|
141
|
+
completedAt: null,
|
|
142
|
+
completedSteps: [],
|
|
143
|
+
skippedSteps: [],
|
|
144
|
+
lastResumePoint: null,
|
|
145
|
+
})
|
|
146
|
+
}
|
|
@@ -118,8 +118,12 @@ export function extractRelativeImports(
|
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
120
|
* Check if a relative import resolves to an existing file.
|
|
121
|
-
*
|
|
122
|
-
*
|
|
121
|
+
* Resolution order:
|
|
122
|
+
* 1. Imports carrying an explicit extension are checked as-is (handles assets
|
|
123
|
+
* like .css/.scss/images/fonts and .json, not just code extensions).
|
|
124
|
+
* 2. TypeScript ESM convention where .js imports resolve to .ts files.
|
|
125
|
+
* 3. Extensionless imports resolved against .ts/.tsx/.js/.jsx/.mjs/.cjs.
|
|
126
|
+
* 4. Directory imports resolved against index.{ts,tsx,js,jsx,mjs,cjs}.
|
|
123
127
|
*/
|
|
124
128
|
export function resolveImportPath(
|
|
125
129
|
importPath: string,
|
|
@@ -129,6 +133,27 @@ export function resolveImportPath(
|
|
|
129
133
|
const sourceDir = dirname(resolve(basePath, sourceFile));
|
|
130
134
|
const extensions = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
131
135
|
|
|
136
|
+
// If the import already has an explicit extension, check it as-is first.
|
|
137
|
+
// This correctly resolves asset imports like .css, .scss, images, fonts
|
|
138
|
+
// without requiring each extension to be enumerated (issue #4411). We only
|
|
139
|
+
// do this when the import carries an extension so that extensionless module
|
|
140
|
+
// imports still flow through the TS ESM convention and index-file resolvers.
|
|
141
|
+
const explicitExt = extname(importPath);
|
|
142
|
+
if (explicitExt !== "") {
|
|
143
|
+
const directPath = resolve(sourceDir, importPath);
|
|
144
|
+
if (existsSync(directPath)) {
|
|
145
|
+
return { exists: true, resolvedPath: directPath };
|
|
146
|
+
}
|
|
147
|
+
// Only .js/.jsx/.mjs/.cjs imports legitimately fall through for the TS
|
|
148
|
+
// ESM convention (.js → .ts). Any other explicit extension (.css, .json,
|
|
149
|
+
// .svg, images, fonts, .ts, .tsx, …) must stay unresolved when the direct
|
|
150
|
+
// path is missing — otherwise a stray `./missing.css.ts` could shadow a
|
|
151
|
+
// genuinely missing `./missing.css` import.
|
|
152
|
+
if (![".js", ".jsx", ".mjs", ".cjs"].includes(explicitExt)) {
|
|
153
|
+
return { exists: false, resolvedPath: null };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
132
157
|
// Handle TypeScript ESM convention: .js imports resolve to .ts files
|
|
133
158
|
// e.g., import './types.js' -> ./types.ts
|
|
134
159
|
let normalizedPath = importPath;
|
|
@@ -142,7 +167,7 @@ export function resolveImportPath(
|
|
|
142
167
|
normalizedPath = importPath.slice(0, -4);
|
|
143
168
|
}
|
|
144
169
|
|
|
145
|
-
// Try the normalized path with common extensions
|
|
170
|
+
// Try the normalized path with common extensions
|
|
146
171
|
for (const ext of extensions) {
|
|
147
172
|
const fullPath = resolve(sourceDir, normalizedPath + ext);
|
|
148
173
|
if (existsSync(fullPath)) {
|
|
@@ -158,17 +183,6 @@ export function resolveImportPath(
|
|
|
158
183
|
}
|
|
159
184
|
}
|
|
160
185
|
|
|
161
|
-
// Check if path already has extension (for .json, etc.)
|
|
162
|
-
const hasExt = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".json"].some(
|
|
163
|
-
(ext) => importPath.endsWith(ext)
|
|
164
|
-
);
|
|
165
|
-
if (hasExt) {
|
|
166
|
-
const fullPath = resolve(sourceDir, importPath);
|
|
167
|
-
if (existsSync(fullPath)) {
|
|
168
|
-
return { exists: true, resolvedPath: fullPath };
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
186
|
return { exists: false, resolvedPath: null };
|
|
173
187
|
}
|
|
174
188
|
|
|
@@ -227,11 +241,20 @@ export function checkImportResolution(
|
|
|
227
241
|
|
|
228
242
|
// ─── Cross-Task Signature Check ──────────────────────────────────────────────
|
|
229
243
|
|
|
244
|
+
/**
|
|
245
|
+
* Normalized function signature extracted from a source file.
|
|
246
|
+
* Used to compare definitions across tasks and detect signature drift.
|
|
247
|
+
*/
|
|
230
248
|
interface FunctionSignature {
|
|
249
|
+
/** Function or exported const name. */
|
|
231
250
|
name: string;
|
|
251
|
+
/** Parameter list with defaults and comments stripped. */
|
|
232
252
|
params: string;
|
|
253
|
+
/** Declared return type, or "void" when none is annotated. */
|
|
233
254
|
returnType: string;
|
|
255
|
+
/** Source file the signature was extracted from. */
|
|
234
256
|
file: string;
|
|
257
|
+
/** 1-based line number of the declaration. */
|
|
235
258
|
lineNum: number;
|
|
236
259
|
}
|
|
237
260
|
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import { existsSync } from "node:fs";
|
|
18
18
|
import { spawn } from "node:child_process";
|
|
19
|
+
import { homedir } from "node:os";
|
|
19
20
|
import { resolve } from "node:path";
|
|
20
21
|
import type { TaskRow } from "./gsd-db.ts";
|
|
21
22
|
import type { PreExecutionCheckJSON } from "./verification-evidence.ts";
|
|
@@ -245,23 +246,74 @@ export function normalizeFilePath(filePath: string): string {
|
|
|
245
246
|
|
|
246
247
|
// Normalize path separators to forward slashes
|
|
247
248
|
normalized = normalized.replace(/\\/g, "/");
|
|
248
|
-
|
|
249
|
+
|
|
250
|
+
// Expand a leading ~ or ~/ so downstream resolve()/set lookups hit the real
|
|
251
|
+
// home directory instead of treating the tilde as a literal path segment.
|
|
252
|
+
if (normalized === "~") {
|
|
253
|
+
normalized = homedir();
|
|
254
|
+
} else if (normalized.startsWith("~/")) {
|
|
255
|
+
normalized = resolve(homedir(), normalized.slice(2));
|
|
256
|
+
}
|
|
257
|
+
// homedir()/resolve() can emit platform separators (e.g. "\" on Windows).
|
|
258
|
+
normalized = normalized.replace(/\\/g, "/");
|
|
259
|
+
|
|
249
260
|
// Remove leading ./
|
|
250
261
|
while (normalized.startsWith("./")) {
|
|
251
262
|
normalized = normalized.slice(2);
|
|
252
263
|
}
|
|
253
|
-
|
|
264
|
+
|
|
254
265
|
// Remove duplicate slashes
|
|
255
266
|
normalized = normalized.replace(/\/+/g, "/");
|
|
256
|
-
|
|
267
|
+
|
|
257
268
|
// Remove trailing slash unless it's the root
|
|
258
269
|
if (normalized.length > 1 && normalized.endsWith("/")) {
|
|
259
270
|
normalized = normalized.slice(0, -1);
|
|
260
271
|
}
|
|
261
|
-
|
|
272
|
+
|
|
262
273
|
return normalized;
|
|
263
274
|
}
|
|
264
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Planning units sometimes pass a directory reference as task.inputs
|
|
278
|
+
* (e.g. `artifacts/M009-S03/`). The trailing slash is meaningful — the task
|
|
279
|
+
* reads whatever lands inside — but normalizeFilePath strips it, so call this
|
|
280
|
+
* helper against the raw input before normalization.
|
|
281
|
+
*/
|
|
282
|
+
function isDirectoryReference(raw: string): boolean {
|
|
283
|
+
const candidate = extractPathFromAnnotation(raw.trim());
|
|
284
|
+
if (!candidate) return false;
|
|
285
|
+
if (containsGlobPattern(candidate)) return false;
|
|
286
|
+
return candidate.endsWith("/");
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* True when any of `knownOutputs` lives under `normalizedDir` (i.e. the task
|
|
291
|
+
* directory input is the parent of something a prior/same task produces).
|
|
292
|
+
*/
|
|
293
|
+
function anyOutputUnderDirectory(
|
|
294
|
+
normalizedDir: string,
|
|
295
|
+
knownOutputs: Iterable<string>,
|
|
296
|
+
): boolean {
|
|
297
|
+
const prefix = normalizedDir + "/";
|
|
298
|
+
for (const output of knownOutputs) {
|
|
299
|
+
if (output === normalizedDir) return true;
|
|
300
|
+
if (output.startsWith(prefix)) return true;
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const URL_SCHEME_PATTERN = /^(https?|ftp|file|ssh|git):\/\//i;
|
|
306
|
+
const SCP_PATTERN = /^[\w.-]+@[\w.-]+:[^/]/;
|
|
307
|
+
|
|
308
|
+
function looksLikePathOrUrl(token: string): boolean {
|
|
309
|
+
if (URL_SCHEME_PATTERN.test(token)) return true;
|
|
310
|
+
if (SCP_PATTERN.test(token)) return true;
|
|
311
|
+
if (/^[./~]/.test(token)) return true;
|
|
312
|
+
if (/[\\/]/.test(token)) return true;
|
|
313
|
+
if (/\.[A-Za-z0-9]{1,8}$/.test(token)) return true;
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
265
317
|
function extractPathFromAnnotation(raw: string): string {
|
|
266
318
|
const trimmed = raw.trim();
|
|
267
319
|
if (!trimmed) return trimmed;
|
|
@@ -276,6 +328,20 @@ function extractPathFromAnnotation(raw: string): string {
|
|
|
276
328
|
return annotatedMatch[1].trim();
|
|
277
329
|
}
|
|
278
330
|
|
|
331
|
+
// Fallback: scan all backticked tokens and return the first one that looks
|
|
332
|
+
// like a path or URL. Handles prose-annotated bullets such as:
|
|
333
|
+
// `path/` directory listing (...)
|
|
334
|
+
// Prefix prose `https://...` suffix prose
|
|
335
|
+
// Citing `.gsd/REQUIREMENTS.md` mid-sentence
|
|
336
|
+
// Skips non-path backticked tokens like `note` or `npm test`.
|
|
337
|
+
const backtickTokens = trimmed.matchAll(/`([^`]+)`/g);
|
|
338
|
+
for (const match of backtickTokens) {
|
|
339
|
+
const token = match[1].trim();
|
|
340
|
+
if (looksLikePathOrUrl(token)) {
|
|
341
|
+
return token;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
279
345
|
// Fall back to the original behavior for already-plain paths.
|
|
280
346
|
return trimmed.replace(/`/g, "");
|
|
281
347
|
}
|
|
@@ -291,13 +357,17 @@ function shouldValidateInputAsPath(raw: string): boolean {
|
|
|
291
357
|
const trimmed = raw.trim();
|
|
292
358
|
if (!trimmed) return false;
|
|
293
359
|
|
|
360
|
+
const candidate = extractPathFromAnnotation(trimmed);
|
|
361
|
+
if (!candidate) return false;
|
|
362
|
+
|
|
363
|
+
// URLs and remote repo refs are not filesystem paths.
|
|
364
|
+
if (URL_SCHEME_PATTERN.test(candidate)) return false;
|
|
365
|
+
if (SCP_PATTERN.test(candidate)) return false;
|
|
366
|
+
|
|
294
367
|
if (/^`+[^`]+`+/.test(trimmed)) {
|
|
295
368
|
return true;
|
|
296
369
|
}
|
|
297
370
|
|
|
298
|
-
const candidate = extractPathFromAnnotation(trimmed);
|
|
299
|
-
if (!candidate) return false;
|
|
300
|
-
|
|
301
371
|
if (!/\s/.test(candidate)) {
|
|
302
372
|
return true;
|
|
303
373
|
}
|
|
@@ -312,6 +382,10 @@ function shouldValidateInputAsPath(raw: string): boolean {
|
|
|
312
382
|
);
|
|
313
383
|
}
|
|
314
384
|
|
|
385
|
+
function containsGlobPattern(candidate: string): boolean {
|
|
386
|
+
return ["*", "?", "[", "]", "{", "}"].some((char) => candidate.includes(char));
|
|
387
|
+
}
|
|
388
|
+
|
|
315
389
|
/**
|
|
316
390
|
* Build a set of files that will be created by tasks up to (but not including) taskIndex.
|
|
317
391
|
* All paths are normalized for consistent comparison.
|
|
@@ -354,6 +428,7 @@ export function checkFilePathConsistency(
|
|
|
354
428
|
|
|
355
429
|
// Normalize path for consistent comparison
|
|
356
430
|
const normalizedFile = normalizeFilePath(file);
|
|
431
|
+
if (containsGlobPattern(normalizedFile)) continue;
|
|
357
432
|
|
|
358
433
|
// Check if file exists on disk
|
|
359
434
|
const absolutePath = resolve(basePath, normalizedFile);
|
|
@@ -362,7 +437,17 @@ export function checkFilePathConsistency(
|
|
|
362
437
|
// Check if file is in prior expected outputs (priorOutputs already normalized)
|
|
363
438
|
const inPriorOutputs = priorOutputs.has(normalizedFile);
|
|
364
439
|
|
|
365
|
-
|
|
440
|
+
// Directory inputs are satisfied when something produces a file beneath
|
|
441
|
+
// them — either a prior task or the current task itself.
|
|
442
|
+
let directorySatisfied = false;
|
|
443
|
+
if (!existsOnDisk && !inPriorOutputs && isDirectoryReference(file)) {
|
|
444
|
+
const sameTaskOutputs = task.expected_output.map(normalizeFilePath);
|
|
445
|
+
directorySatisfied =
|
|
446
|
+
anyOutputUnderDirectory(normalizedFile, priorOutputs) ||
|
|
447
|
+
anyOutputUnderDirectory(normalizedFile, sameTaskOutputs);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (!existsOnDisk && !inPriorOutputs && !directorySatisfied) {
|
|
366
451
|
results.push({
|
|
367
452
|
category: "file",
|
|
368
453
|
target: file,
|
|
@@ -414,6 +499,11 @@ export function checkTaskOrdering(
|
|
|
414
499
|
if (!shouldValidateInputAsPath(file)) continue;
|
|
415
500
|
|
|
416
501
|
const normalizedFile = normalizeFilePath(file);
|
|
502
|
+
if (containsGlobPattern(normalizedFile)) continue;
|
|
503
|
+
// A directory reference like `artifacts/M009-S03/` is never a concrete
|
|
504
|
+
// read-before-create dependency: the fileCreators map is keyed by leaf
|
|
505
|
+
// files, and a same-task output under the directory satisfies it.
|
|
506
|
+
if (isDirectoryReference(file)) continue;
|
|
417
507
|
const creator = fileCreators.get(normalizedFile);
|
|
418
508
|
const absolutePath = resolve(basePath, normalizedFile);
|
|
419
509
|
const existsOnDisk = existsSync(absolutePath);
|
|
@@ -116,11 +116,12 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
116
116
|
"discuss_depth",
|
|
117
117
|
"flat_rate_providers",
|
|
118
118
|
"language",
|
|
119
|
+
"context_window_override",
|
|
119
120
|
]);
|
|
120
121
|
|
|
121
122
|
/** Canonical list of all dispatch unit types. */
|
|
122
123
|
export const KNOWN_UNIT_TYPES = [
|
|
123
|
-
"research-milestone", "plan-milestone", "research-slice", "plan-slice",
|
|
124
|
+
"research-milestone", "plan-milestone", "research-slice", "plan-slice", "refine-slice",
|
|
124
125
|
"execute-task", "reactive-execute", "gate-evaluate", "complete-slice", "replan-slice", "reassess-roadmap",
|
|
125
126
|
"run-uat", "complete-milestone", "validate-milestone", "rewrite-docs",
|
|
126
127
|
"discuss-milestone", "discuss-slice", "worktree-merge",
|
|
@@ -287,10 +288,17 @@ export interface GSDPreferences {
|
|
|
287
288
|
post_unit_hooks?: PostUnitHookConfig[];
|
|
288
289
|
pre_dispatch_hooks?: PreDispatchHookConfig[];
|
|
289
290
|
dynamic_routing?: DynamicRoutingConfig;
|
|
290
|
-
/** Unified Orchestration Kernel controls (
|
|
291
|
+
/** Unified Orchestration Kernel controls (default-on, with opt-out and emergency legacy fallback). */
|
|
291
292
|
uok?: UokPreferences;
|
|
292
293
|
/** Per-model capability overrides. Deep-merged with built-in profiles for capability-aware routing (ADR-004). */
|
|
293
294
|
modelOverrides?: Record<string, { capabilities?: Partial<ModelCapabilities> }>;
|
|
295
|
+
/**
|
|
296
|
+
* Override executor context window (in tokens) for prompt budget sizing.
|
|
297
|
+
* Useful when the configured model registry can't resolve the runtime limit
|
|
298
|
+
* — e.g. local llama.cpp/lemonade servers where the server-side n_ctx is
|
|
299
|
+
* smaller than the model's advertised window. Issue #4435.
|
|
300
|
+
*/
|
|
301
|
+
context_window_override?: number;
|
|
294
302
|
context_management?: ContextManagementConfig;
|
|
295
303
|
token_profile?: TokenProfile;
|
|
296
304
|
phases?: PhaseSkipPreferences;
|
|
@@ -313,14 +313,36 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
313
313
|
if (typeof preferences.phases === "object" && preferences.phases !== null) {
|
|
314
314
|
const validatedPhases: PhaseSkipPreferences = {};
|
|
315
315
|
const p = preferences.phases as Record<string, unknown>;
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
316
|
+
// Strict boolean parsing — YAML usually delivers real booleans, but
|
|
317
|
+
// hand-edits like `progressive_planning: "false"` otherwise coerce to
|
|
318
|
+
// truthy via `!!`. Accept only real booleans or the literal strings
|
|
319
|
+
// "true"/"false"; anything else becomes a warning + ignored.
|
|
320
|
+
const parseStrictBoolean = (key: string, raw: unknown): boolean | undefined => {
|
|
321
|
+
if (typeof raw === "boolean") return raw;
|
|
322
|
+
if (typeof raw === "string") {
|
|
323
|
+
if (raw === "true") return true;
|
|
324
|
+
if (raw === "false") return false;
|
|
325
|
+
}
|
|
326
|
+
warnings.push(`phases.${key} must be a boolean (got ${typeof raw}: ${JSON.stringify(raw)}) — ignored`);
|
|
327
|
+
return undefined;
|
|
328
|
+
};
|
|
329
|
+
const assignBool = (key: keyof PhaseSkipPreferences, raw: unknown): void => {
|
|
330
|
+
const v = parseStrictBoolean(String(key), raw);
|
|
331
|
+
if (v !== undefined) (validatedPhases as Record<string, boolean>)[key as string] = v;
|
|
332
|
+
};
|
|
333
|
+
if (p.skip_research !== undefined) assignBool("skip_research", p.skip_research);
|
|
334
|
+
if (p.skip_reassess !== undefined) assignBool("skip_reassess", p.skip_reassess);
|
|
335
|
+
if (p.skip_slice_research !== undefined) assignBool("skip_slice_research", p.skip_slice_research);
|
|
336
|
+
if (p.skip_milestone_validation !== undefined) assignBool("skip_milestone_validation", p.skip_milestone_validation);
|
|
337
|
+
if (p.reassess_after_slice !== undefined) assignBool("reassess_after_slice", p.reassess_after_slice);
|
|
338
|
+
if ((p as any).require_slice_discussion !== undefined) {
|
|
339
|
+
const v = parseStrictBoolean("require_slice_discussion", (p as any).require_slice_discussion);
|
|
340
|
+
if (v !== undefined) (validatedPhases as any).require_slice_discussion = v;
|
|
341
|
+
}
|
|
342
|
+
if (p.mid_execution_escalation !== undefined) assignBool("mid_execution_escalation", p.mid_execution_escalation);
|
|
343
|
+
if (p.progressive_planning !== undefined) assignBool("progressive_planning", p.progressive_planning);
|
|
322
344
|
// Warn on unknown phase keys
|
|
323
|
-
const knownPhaseKeys = new Set(["skip_research", "skip_reassess", "skip_slice_research", "skip_milestone_validation", "reassess_after_slice", "require_slice_discussion"]);
|
|
345
|
+
const knownPhaseKeys = new Set(["skip_research", "skip_reassess", "skip_slice_research", "skip_milestone_validation", "reassess_after_slice", "require_slice_discussion", "mid_execution_escalation", "progressive_planning"]);
|
|
324
346
|
for (const key of Object.keys(p)) {
|
|
325
347
|
if (!knownPhaseKeys.has(key)) {
|
|
326
348
|
warnings.push(`unknown phases key "${key}" — ignored`);
|
|
@@ -560,6 +582,10 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
560
582
|
if (typeof dr.capability_routing === "boolean") validDr.capability_routing = dr.capability_routing;
|
|
561
583
|
else errors.push("dynamic_routing.capability_routing must be a boolean");
|
|
562
584
|
}
|
|
585
|
+
if (dr.allow_flat_rate_providers !== undefined) {
|
|
586
|
+
if (typeof dr.allow_flat_rate_providers === "boolean") validDr.allow_flat_rate_providers = dr.allow_flat_rate_providers;
|
|
587
|
+
else errors.push("dynamic_routing.allow_flat_rate_providers must be a boolean");
|
|
588
|
+
}
|
|
563
589
|
if (dr.tier_models !== undefined) {
|
|
564
590
|
if (typeof dr.tier_models === "object" && dr.tier_models !== null) {
|
|
565
591
|
const tm = dr.tier_models as Record<string, unknown>;
|
|
@@ -102,7 +102,7 @@ function gsdHome(): string {
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
function globalPreferencesPath(): string {
|
|
105
|
-
return join(gsdHome(), "
|
|
105
|
+
return join(gsdHome(), "PREFERENCES.md");
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
function legacyGlobalPreferencesPath(): string {
|
|
@@ -110,15 +110,15 @@ function legacyGlobalPreferencesPath(): string {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
function projectPreferencesPath(): string {
|
|
113
|
-
return join(gsdRoot(process.cwd()), "
|
|
113
|
+
return join(gsdRoot(process.cwd()), "PREFERENCES.md");
|
|
114
114
|
}
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
function
|
|
118
|
-
return join(gsdHome(), "
|
|
115
|
+
// Legacy lowercase files can still exist in older projects. Keep them as a
|
|
116
|
+
// compatibility-only fallback, but route new reads/writes through PREFERENCES.md.
|
|
117
|
+
function legacyGlobalPreferencesPathLowercase(): string {
|
|
118
|
+
return join(gsdHome(), "preferences.md");
|
|
119
119
|
}
|
|
120
|
-
function
|
|
121
|
-
return join(gsdRoot(process.cwd()), "
|
|
120
|
+
function legacyProjectPreferencesPathLowercase(): string {
|
|
121
|
+
return join(gsdRoot(process.cwd()), "preferences.md");
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
export function getGlobalGSDPreferencesPath(): string {
|
|
@@ -137,13 +137,13 @@ export function getProjectGSDPreferencesPath(): string {
|
|
|
137
137
|
|
|
138
138
|
export function loadGlobalGSDPreferences(): LoadedGSDPreferences | null {
|
|
139
139
|
return loadPreferencesFile(globalPreferencesPath(), "global")
|
|
140
|
-
?? loadPreferencesFile(
|
|
140
|
+
?? loadPreferencesFile(legacyGlobalPreferencesPathLowercase(), "global")
|
|
141
141
|
?? loadPreferencesFile(legacyGlobalPreferencesPath(), "global");
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
export function loadProjectGSDPreferences(): LoadedGSDPreferences | null {
|
|
145
145
|
return loadPreferencesFile(projectPreferencesPath(), "project")
|
|
146
|
-
?? loadPreferencesFile(
|
|
146
|
+
?? loadPreferencesFile(legacyProjectPreferencesPathLowercase(), "project");
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
export function loadEffectiveGSDPreferences(): LoadedGSDPreferences | null {
|