gsd-pi 2.71.0 → 2.72.0-dev.3118184
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 +69 -19
- package/dist/cli.js +88 -6
- package/dist/headless-events.d.ts +2 -0
- package/dist/headless-events.js +7 -0
- package/dist/headless.js +16 -3
- package/dist/mcp-server.js +40 -17
- package/dist/onboarding.js +10 -0
- package/dist/provider-migrations.d.ts +10 -0
- package/dist/provider-migrations.js +12 -0
- package/dist/resource-loader.js +139 -13
- package/dist/resources/GSD-WORKFLOW.md +1 -1
- package/dist/resources/agents/debugger.md +58 -0
- package/dist/resources/agents/doc-writer.md +43 -0
- package/dist/resources/agents/git-ops.md +56 -0
- package/dist/resources/agents/javascript-pro.md +46 -271
- package/dist/resources/agents/planner.md +55 -0
- package/dist/resources/agents/refactorer.md +47 -0
- package/dist/resources/agents/reviewer.md +48 -0
- package/dist/resources/agents/security.md +59 -0
- package/dist/resources/agents/tester.md +50 -0
- package/dist/resources/agents/typescript-pro.md +41 -235
- package/dist/resources/extensions/async-jobs/await-tool.js +7 -4
- package/dist/resources/extensions/async-jobs/job-manager.js +28 -3
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +40 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +142 -14
- package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
- package/dist/resources/extensions/gsd/auto/loop.js +116 -2
- package/dist/resources/extensions/gsd/auto/phases.js +5 -1
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
- package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +6 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
- package/dist/resources/extensions/gsd/auto-recovery.js +11 -0
- package/dist/resources/extensions/gsd/auto-start.js +34 -7
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +81 -19
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -11
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
- package/dist/resources/extensions/gsd/commands/context.js +15 -6
- package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
- package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
- package/dist/resources/extensions/gsd/commands-handlers.js +4 -1
- package/dist/resources/extensions/gsd/context-injector.js +1 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -7
- package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
- package/dist/resources/extensions/gsd/definition-io.js +15 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +22 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +6 -3
- package/dist/resources/extensions/gsd/error-classifier.js +5 -2
- package/dist/resources/extensions/gsd/forensics.js +19 -6
- package/dist/resources/extensions/gsd/gate-registry.js +208 -0
- package/dist/resources/extensions/gsd/git-service.js +11 -8
- package/dist/resources/extensions/gsd/gitignore.js +12 -6
- package/dist/resources/extensions/gsd/gsd-db.js +90 -6
- package/dist/resources/extensions/gsd/guided-flow.js +5 -10
- package/dist/resources/extensions/gsd/key-manager.js +2 -0
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
- package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
- package/dist/resources/extensions/gsd/notification-store.js +56 -5
- package/dist/resources/extensions/gsd/notification-widget.js +5 -13
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
- package/dist/resources/extensions/gsd/preferences-skills.js +2 -34
- package/dist/resources/extensions/gsd/preferences-types.js +15 -0
- package/dist/resources/extensions/gsd/preferences.js +16 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
- package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/discuss.md +123 -12
- package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/dist/resources/extensions/gsd/session-model-override.js +25 -0
- package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
- package/dist/resources/extensions/gsd/state.js +29 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +7 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +30 -3
- package/dist/resources/extensions/gsd/write-intercept.js +10 -1
- package/dist/resources/extensions/ollama/index.js +17 -10
- package/dist/resources/extensions/ollama/ollama-client.js +35 -6
- package/dist/resources/extensions/ollama/ollama-discovery.js +32 -6
- package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
- package/dist/resources/extensions/subagent/agents.js +8 -0
- package/dist/resources/extensions/subagent/index.js +17 -0
- package/dist/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/startup-model-validation.d.ts +0 -1
- package/dist/startup-model-validation.js +6 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
- 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/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +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 +15 -15
- package/dist/web/standalone/.next/server/chunks/2331.js +16 -16
- package/dist/web/standalone/.next/server/chunks/4741.js +12 -12
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -2
- package/dist/web/standalone/.next/server/chunks/63.js +8 -8
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/edge-runtime-webpack.js +2 -0
- package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -9
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +29 -2
- package/dist/web/standalone/.next/server/middleware.js +4 -12
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/server.d.ts +12 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +90 -42
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -12
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/server.ts +110 -38
- package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
- package/packages/mcp-server/src/workflow-tools.ts +32 -12
- package/packages/pi-ai/dist/env-api-keys.js +1 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.custom.d.ts +105 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.custom.js +97 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +648 -140
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +867 -370
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.generated.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.generated.test.js +334 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -0
- package/packages/pi-ai/dist/models.test.js +105 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +7 -4
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +5 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +57 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -0
- package/packages/pi-ai/src/env-api-keys.ts +1 -0
- package/packages/pi-ai/src/models.custom.ts +98 -0
- package/packages/pi-ai/src/models.generated.test.ts +373 -0
- package/packages/pi-ai/src/models.generated.ts +867 -370
- package/packages/pi-ai/src/models.test.ts +135 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
- package/packages/pi-ai/src/providers/anthropic.ts +8 -4
- package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
- package/packages/pi-ai/src/types.ts +1 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +71 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +4 -1
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +2 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -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 +27 -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 +85 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +23 -18
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +55 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +47 -5
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +130 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- 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 +7 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
- package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
- package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +23 -18
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
- package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +55 -9
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +72 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +131 -12
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -3
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
- package/packages/pi-tui/dist/components/__tests__/editor.test.js +12 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +12 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +27 -0
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/src/components/__tests__/editor.test.ts +18 -0
- package/packages/pi-tui/src/components/__tests__/input.test.ts +18 -0
- package/packages/pi-tui/src/keys.ts +32 -0
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +1 -1
- package/src/resources/agents/debugger.md +58 -0
- package/src/resources/agents/doc-writer.md +43 -0
- package/src/resources/agents/git-ops.md +56 -0
- package/src/resources/agents/javascript-pro.md +46 -271
- package/src/resources/agents/planner.md +55 -0
- package/src/resources/agents/refactorer.md +47 -0
- package/src/resources/agents/reviewer.md +48 -0
- package/src/resources/agents/security.md +59 -0
- package/src/resources/agents/tester.md +50 -0
- package/src/resources/agents/typescript-pro.md +41 -235
- package/src/resources/extensions/async-jobs/await-tool.test.ts +40 -7
- package/src/resources/extensions/async-jobs/await-tool.ts +7 -4
- package/src/resources/extensions/async-jobs/job-manager.ts +33 -3
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +45 -12
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +152 -13
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +91 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +301 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +134 -2
- package/src/resources/extensions/gsd/auto/phases.ts +6 -0
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +7 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -0
- package/src/resources/extensions/gsd/auto-start.ts +41 -7
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +97 -20
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -10
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -5
- package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
- package/src/resources/extensions/gsd/commands-handlers.ts +5 -1
- package/src/resources/extensions/gsd/context-injector.ts +1 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +4 -8
- package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
- package/src/resources/extensions/gsd/definition-io.ts +18 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +23 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +6 -3
- package/src/resources/extensions/gsd/error-classifier.ts +5 -2
- package/src/resources/extensions/gsd/forensics.ts +23 -7
- package/src/resources/extensions/gsd/gate-registry.ts +251 -0
- package/src/resources/extensions/gsd/git-service.ts +11 -8
- package/src/resources/extensions/gsd/gitignore.ts +12 -6
- package/src/resources/extensions/gsd/gsd-db.ts +105 -6
- package/src/resources/extensions/gsd/guided-flow.ts +5 -10
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/key-manager.ts +2 -0
- package/src/resources/extensions/gsd/metrics.ts +12 -1
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
- package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
- package/src/resources/extensions/gsd/notification-store.ts +54 -5
- package/src/resources/extensions/gsd/notification-widget.ts +5 -14
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
- package/src/resources/extensions/gsd/preferences-skills.ts +2 -36
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +19 -6
- package/src/resources/extensions/gsd/prompt-loader.ts +6 -1
- package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +123 -12
- package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +3 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/src/resources/extensions/gsd/session-model-override.ts +36 -0
- package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
- package/src/resources/extensions/gsd/state.ts +33 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +107 -5
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
- package/src/resources/extensions/gsd/types.ts +26 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +29 -3
- package/src/resources/extensions/gsd/write-intercept.ts +10 -1
- package/src/resources/extensions/ollama/index.ts +17 -8
- package/src/resources/extensions/ollama/ollama-client.ts +35 -6
- package/src/resources/extensions/ollama/ollama-discovery.ts +37 -6
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +54 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
- package/src/resources/extensions/subagent/agents.ts +10 -0
- package/src/resources/extensions/subagent/index.ts +18 -0
- package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
- package/src/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { initNotificationStore, appendNotification, _resetNotificationStore } from "../notification-store.js";
|
|
8
|
+
import { buildNotificationWidgetLines } from "../notification-widget.js";
|
|
9
|
+
|
|
10
|
+
test("buildNotificationWidgetLines shows unread count with shortcut pair", () => {
|
|
11
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-notification-widget-"));
|
|
12
|
+
try {
|
|
13
|
+
mkdirSync(join(tmp, ".gsd"), { recursive: true });
|
|
14
|
+
_resetNotificationStore();
|
|
15
|
+
initNotificationStore(tmp);
|
|
16
|
+
appendNotification("Need attention", "warning");
|
|
17
|
+
|
|
18
|
+
const lines = buildNotificationWidgetLines();
|
|
19
|
+
assert.equal(lines.length, 1);
|
|
20
|
+
assert.match(lines[0]!, /Notifications:\s+1 unread/);
|
|
21
|
+
assert.match(lines[0]!, /\(.+\/.+\)/);
|
|
22
|
+
} finally {
|
|
23
|
+
_resetNotificationStore();
|
|
24
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { mkdirSync, rmSync } from "node:fs";
|
|
6
|
+
|
|
7
|
+
import { handleNotificationsCommand } from "../commands/handlers/notifications-handler.ts";
|
|
8
|
+
import {
|
|
9
|
+
_resetNotificationStore,
|
|
10
|
+
appendNotification,
|
|
11
|
+
initNotificationStore,
|
|
12
|
+
} from "../notification-store.ts";
|
|
13
|
+
|
|
14
|
+
function makeTempDir(prefix: string): string {
|
|
15
|
+
const dir = join(
|
|
16
|
+
tmpdir(),
|
|
17
|
+
`gsd-notifications-handler-test-${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
18
|
+
);
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function cleanup(dir: string): void {
|
|
25
|
+
try {
|
|
26
|
+
rmSync(dir, { recursive: true, force: true });
|
|
27
|
+
} catch {
|
|
28
|
+
// best-effort
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
test("notifications command falls back to text output when overlay returns undefined", async (t) => {
|
|
33
|
+
const base = makeTempDir("overlay-fallback");
|
|
34
|
+
initNotificationStore(base);
|
|
35
|
+
appendNotification("Build complete", "success");
|
|
36
|
+
|
|
37
|
+
t.after(() => {
|
|
38
|
+
_resetNotificationStore();
|
|
39
|
+
cleanup(base);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const notices: Array<{ message: string; level?: string }> = [];
|
|
43
|
+
await handleNotificationsCommand(
|
|
44
|
+
"",
|
|
45
|
+
{
|
|
46
|
+
hasUI: true,
|
|
47
|
+
ui: {
|
|
48
|
+
custom: async () => undefined,
|
|
49
|
+
notify: (message: string, level?: string) => {
|
|
50
|
+
notices.push({ message, level });
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
} as any,
|
|
54
|
+
{} as any,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
assert.equal(notices.length, 1, "text fallback should be emitted when overlay cannot render");
|
|
58
|
+
assert.match(notices[0].message, /Recent notifications:/);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("notifications tail caps inline output and hints to open overlay", async (t) => {
|
|
62
|
+
const base = makeTempDir("tail-cap");
|
|
63
|
+
initNotificationStore(base);
|
|
64
|
+
for (let i = 0; i < 55; i++) {
|
|
65
|
+
appendNotification(`notification-${i + 1}`, "info");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
t.after(() => {
|
|
69
|
+
_resetNotificationStore();
|
|
70
|
+
cleanup(base);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const notices: Array<{ message: string; level?: string }> = [];
|
|
74
|
+
await handleNotificationsCommand(
|
|
75
|
+
"tail 200",
|
|
76
|
+
{
|
|
77
|
+
hasUI: true,
|
|
78
|
+
ui: {
|
|
79
|
+
notify: (message: string, level?: string) => {
|
|
80
|
+
notices.push({ message, level });
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
} as any,
|
|
84
|
+
{} as any,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
assert.equal(notices.length, 1);
|
|
88
|
+
assert.match(notices[0].message, /Last 40 notification\(s\):/);
|
|
89
|
+
assert.match(notices[0].message, /\.\.\. and \d+ more \(open \/gsd notifications to browse all\)/);
|
|
90
|
+
});
|
|
@@ -69,6 +69,24 @@ test("unparkMilestone updates DB status to 'active' (#2694)", () => {
|
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
+
test("unparkMilestone repairs parked DB state when PARKED.md is missing (#3707)", () => {
|
|
73
|
+
const base = createBase();
|
|
74
|
+
try {
|
|
75
|
+
openDatabase(":memory:");
|
|
76
|
+
insertMilestone({ id: "M001", title: "Test", status: "parked" });
|
|
77
|
+
|
|
78
|
+
const unparked = unparkMilestone(base, "M001");
|
|
79
|
+
|
|
80
|
+
assert.ok(unparked, "unparkMilestone should recover DB-only parked state");
|
|
81
|
+
assert.equal(getMilestone("M001")!.status, "active", "DB status should be repaired to active");
|
|
82
|
+
|
|
83
|
+
closeDatabase();
|
|
84
|
+
} finally {
|
|
85
|
+
closeDatabase();
|
|
86
|
+
rmSync(base, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
72
90
|
test("park/unpark are safe when DB is not available (#2694 guard)", () => {
|
|
73
91
|
const base = createBase();
|
|
74
92
|
try {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
|
|
7
|
+
import { verifyExpectedArtifact } from "../auto-recovery.ts";
|
|
8
|
+
|
|
9
|
+
function createFixtureBase(): string {
|
|
10
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-plan-milestone-artifact-"));
|
|
11
|
+
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
12
|
+
return base;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function writeRoadmap(base: string, milestoneId: string, content: string): void {
|
|
16
|
+
const milestoneDir = join(base, ".gsd", "milestones", milestoneId);
|
|
17
|
+
mkdirSync(milestoneDir, { recursive: true });
|
|
18
|
+
writeFileSync(join(milestoneDir, `${milestoneId}-ROADMAP.md`), content, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("#3405: plan-milestone roadmap stub does not count as a verified artifact", () => {
|
|
22
|
+
const base = createFixtureBase();
|
|
23
|
+
try {
|
|
24
|
+
writeRoadmap(base, "M001", [
|
|
25
|
+
"# M001: Placeholder",
|
|
26
|
+
"",
|
|
27
|
+
"**Vision:** Stub only.",
|
|
28
|
+
"",
|
|
29
|
+
"## Slices",
|
|
30
|
+
"",
|
|
31
|
+
"_TBD_",
|
|
32
|
+
"",
|
|
33
|
+
].join("\n"));
|
|
34
|
+
|
|
35
|
+
const result = verifyExpectedArtifact("plan-milestone", "M001", base);
|
|
36
|
+
assert.equal(result, false, "zero-slice roadmap stubs must fail verification");
|
|
37
|
+
} finally {
|
|
38
|
+
rmSync(base, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("#3405: plan-milestone roadmap with real slices still passes artifact verification", () => {
|
|
43
|
+
const base = createFixtureBase();
|
|
44
|
+
try {
|
|
45
|
+
writeRoadmap(base, "M001", [
|
|
46
|
+
"# M001: Real roadmap",
|
|
47
|
+
"",
|
|
48
|
+
"**Vision:** Real work.",
|
|
49
|
+
"",
|
|
50
|
+
"## Slices",
|
|
51
|
+
"",
|
|
52
|
+
"- [ ] **S01: First slice** `risk:low` `depends:[]`",
|
|
53
|
+
" > After this: a real slice exists.",
|
|
54
|
+
"",
|
|
55
|
+
].join("\n"));
|
|
56
|
+
|
|
57
|
+
const result = verifyExpectedArtifact("plan-milestone", "M001", base);
|
|
58
|
+
assert.equal(result, true, "real roadmap slices should keep passing verification");
|
|
59
|
+
} finally {
|
|
60
|
+
rmSync(base, { recursive: true, force: true });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for #3869: normal post-unit flow should rebuild STATE.md
|
|
3
|
+
* before syncing worktree state back to the project root.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
|
|
11
|
+
const source = readFileSync(join(import.meta.dirname, "..", "auto-post-unit.ts"), "utf-8");
|
|
12
|
+
|
|
13
|
+
test("auto-post-unit imports rebuildState", () => {
|
|
14
|
+
assert.ok(
|
|
15
|
+
source.includes('import { rebuildState } from "./doctor.js";'),
|
|
16
|
+
"auto-post-unit.ts should import rebuildState from doctor.ts",
|
|
17
|
+
);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("postUnitPreVerification rebuilds STATE.md before worktree sync", () => {
|
|
21
|
+
const fnStart = source.indexOf("export async function postUnitPreVerification");
|
|
22
|
+
assert.ok(fnStart > 0, "postUnitPreVerification should exist");
|
|
23
|
+
|
|
24
|
+
const section = source.slice(fnStart, fnStart + 8000);
|
|
25
|
+
const rebuildIdx = section.indexOf('await runSafely("postUnit", "state-rebuild"');
|
|
26
|
+
const syncIdx = section.indexOf('await runSafely("postUnit", "worktree-sync"');
|
|
27
|
+
|
|
28
|
+
assert.ok(rebuildIdx > 0, "postUnitPreVerification should rebuild STATE.md after unit completion");
|
|
29
|
+
assert.ok(syncIdx > 0, "postUnitPreVerification should sync worktree state back to the project root");
|
|
30
|
+
assert.ok(
|
|
31
|
+
rebuildIdx < syncIdx,
|
|
32
|
+
"STATE.md rebuild should happen before worktree sync so synced state is fresh",
|
|
33
|
+
);
|
|
34
|
+
});
|
|
@@ -1107,6 +1107,38 @@ describe("checkTaskOrdering false positive regression (#3677)", () => {
|
|
|
1107
1107
|
assert.equal(results[0].target, "`later.ts` — needed first");
|
|
1108
1108
|
assert.ok(results[0].message.includes("sequence violation"));
|
|
1109
1109
|
});
|
|
1110
|
+
|
|
1111
|
+
test("existing on-disk files do not trigger ordering violations just because a later task modifies them", () => {
|
|
1112
|
+
const tempDir = join(tmpdir(), `pre-exec-ordering-existing-file-${Date.now()}`);
|
|
1113
|
+
const existingFile = "frontend/src/__tests__/ProcurementPage29.test.tsx";
|
|
1114
|
+
|
|
1115
|
+
mkdirSync(join(tempDir, "frontend", "src", "__tests__"), { recursive: true });
|
|
1116
|
+
writeFileSync(join(tempDir, existingFile), "// existing file");
|
|
1117
|
+
|
|
1118
|
+
try {
|
|
1119
|
+
const tasks = [
|
|
1120
|
+
createTask({
|
|
1121
|
+
id: "T01",
|
|
1122
|
+
sequence: 0,
|
|
1123
|
+
files: [],
|
|
1124
|
+
inputs: ["`frontend/src/__tests__/ProcurementPage29.test.tsx` — contains matchMedia stub to remove"],
|
|
1125
|
+
expected_output: [],
|
|
1126
|
+
}),
|
|
1127
|
+
createTask({
|
|
1128
|
+
id: "T03",
|
|
1129
|
+
sequence: 2,
|
|
1130
|
+
files: [],
|
|
1131
|
+
inputs: [],
|
|
1132
|
+
expected_output: ["frontend/src/__tests__/ProcurementPage29.test.tsx"],
|
|
1133
|
+
}),
|
|
1134
|
+
];
|
|
1135
|
+
|
|
1136
|
+
const results = checkTaskOrdering(tasks, tempDir);
|
|
1137
|
+
assert.equal(results.length, 0, "Pre-existing files should not be treated as created by later tasks");
|
|
1138
|
+
} finally {
|
|
1139
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
1140
|
+
}
|
|
1141
|
+
});
|
|
1110
1142
|
});
|
|
1111
1143
|
|
|
1112
1144
|
// ─── checkFilePathConsistency additional edge cases ──────────────────────────
|
|
@@ -1175,6 +1207,23 @@ describe("checkFilePathConsistency additional edge cases", () => {
|
|
|
1175
1207
|
assert.equal(results![0].blocking, true);
|
|
1176
1208
|
});
|
|
1177
1209
|
|
|
1210
|
+
test("multi-word prose inputs are ignored by path consistency checks", () => {
|
|
1211
|
+
const tasks = [
|
|
1212
|
+
createTask({
|
|
1213
|
+
id: "T01",
|
|
1214
|
+
files: [],
|
|
1215
|
+
inputs: [
|
|
1216
|
+
"Current WIZARD_PRODUCTS enum",
|
|
1217
|
+
"Existing test patterns in wizard.test.ts",
|
|
1218
|
+
],
|
|
1219
|
+
expected_output: [],
|
|
1220
|
+
}),
|
|
1221
|
+
];
|
|
1222
|
+
|
|
1223
|
+
const results = checkFilePathConsistency(tasks, "/tmp");
|
|
1224
|
+
assert.equal(results.length, 0, "Prose planning hints should not be treated as missing file paths");
|
|
1225
|
+
});
|
|
1226
|
+
|
|
1178
1227
|
test("empty inputs array produces no results", () => {
|
|
1179
1228
|
// A task with no inputs and only files should produce zero results from
|
|
1180
1229
|
// consistency check — files are not checked (#3626).
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for formatSkillRef — pure formatting logic for skill references
|
|
3
|
+
* in the system prompt. Moved from preferences-skills.ts to preferences-types.ts
|
|
4
|
+
* to break the preferences ↔ preferences-skills circular dependency.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { describe, test } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
|
|
10
|
+
import { formatSkillRef } from "../preferences-types.ts";
|
|
11
|
+
import type { SkillResolution } from "../preferences-types.ts";
|
|
12
|
+
|
|
13
|
+
function makeResolutions(entries: [string, Partial<SkillResolution>][]): Map<string, SkillResolution> {
|
|
14
|
+
const map = new Map<string, SkillResolution>();
|
|
15
|
+
for (const [key, partial] of entries) {
|
|
16
|
+
map.set(key, {
|
|
17
|
+
original: partial.original ?? key,
|
|
18
|
+
resolvedPath: partial.resolvedPath ?? null,
|
|
19
|
+
method: partial.method ?? "unresolved",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return map;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe("formatSkillRef", () => {
|
|
26
|
+
test("marks unresolved references with a warning", () => {
|
|
27
|
+
const resolutions = makeResolutions([
|
|
28
|
+
["my-skill", { method: "unresolved" }],
|
|
29
|
+
]);
|
|
30
|
+
const result = formatSkillRef("my-skill", resolutions);
|
|
31
|
+
assert.match(result, /my-skill/);
|
|
32
|
+
assert.match(result, /not found/);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("marks unknown references (not in map) with a warning", () => {
|
|
36
|
+
const resolutions = new Map<string, SkillResolution>();
|
|
37
|
+
const result = formatSkillRef("unknown-skill", resolutions);
|
|
38
|
+
assert.match(result, /unknown-skill/);
|
|
39
|
+
assert.match(result, /not found/);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("returns bare ref for absolute-path resolution", () => {
|
|
43
|
+
const resolutions = makeResolutions([
|
|
44
|
+
["/home/user/skills/SKILL.md", {
|
|
45
|
+
method: "absolute-path",
|
|
46
|
+
resolvedPath: "/home/user/skills/SKILL.md",
|
|
47
|
+
}],
|
|
48
|
+
]);
|
|
49
|
+
const result = formatSkillRef("/home/user/skills/SKILL.md", resolutions);
|
|
50
|
+
assert.equal(result, "/home/user/skills/SKILL.md");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("returns bare ref for absolute-dir resolution", () => {
|
|
54
|
+
const resolutions = makeResolutions([
|
|
55
|
+
["/home/user/skills/my-skill", {
|
|
56
|
+
method: "absolute-dir",
|
|
57
|
+
resolvedPath: "/home/user/skills/my-skill/SKILL.md",
|
|
58
|
+
}],
|
|
59
|
+
]);
|
|
60
|
+
const result = formatSkillRef("/home/user/skills/my-skill", resolutions);
|
|
61
|
+
assert.equal(result, "/home/user/skills/my-skill");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("shows resolved path for user-skill resolution", () => {
|
|
65
|
+
const resolutions = makeResolutions([
|
|
66
|
+
["code-review", {
|
|
67
|
+
method: "user-skill",
|
|
68
|
+
resolvedPath: "/home/user/.claude/skills/code-review/SKILL.md",
|
|
69
|
+
}],
|
|
70
|
+
]);
|
|
71
|
+
const result = formatSkillRef("code-review", resolutions);
|
|
72
|
+
assert.match(result, /code-review/);
|
|
73
|
+
assert.match(result, /\.claude\/skills\/code-review\/SKILL\.md/);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("shows resolved path for project-skill resolution", () => {
|
|
77
|
+
const resolutions = makeResolutions([
|
|
78
|
+
["lint-fix", {
|
|
79
|
+
method: "project-skill",
|
|
80
|
+
resolvedPath: "/repo/.gsd/skills/lint-fix/SKILL.md",
|
|
81
|
+
}],
|
|
82
|
+
]);
|
|
83
|
+
const result = formatSkillRef("lint-fix", resolutions);
|
|
84
|
+
assert.match(result, /lint-fix/);
|
|
85
|
+
assert.match(result, /\.gsd\/skills\/lint-fix\/SKILL\.md/);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
import test from "node:test";
|
|
12
12
|
import assert from "node:assert/strict";
|
|
13
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
13
16
|
import {
|
|
14
17
|
validatePreferences,
|
|
15
18
|
applyModeDefaults,
|
|
16
19
|
getIsolationMode,
|
|
20
|
+
loadEffectiveGSDPreferences,
|
|
17
21
|
parsePreferencesMarkdown,
|
|
18
22
|
_resetParseWarningFlag,
|
|
19
23
|
} from "../preferences.ts";
|
|
@@ -501,6 +505,55 @@ test("experimental.rtk parses correctly from preferences markdown", () => {
|
|
|
501
505
|
assert.equal(prefs!.experimental?.rtk, true);
|
|
502
506
|
});
|
|
503
507
|
|
|
508
|
+
test("loadEffectiveGSDPreferences preserves experimental prefs across global+project merge", () => {
|
|
509
|
+
const originalCwd = process.cwd();
|
|
510
|
+
const originalGsdHome = process.env.GSD_HOME;
|
|
511
|
+
const tempProject = mkdtempSync(join(tmpdir(), "gsd-prefs-project-"));
|
|
512
|
+
const tempGsdHome = mkdtempSync(join(tmpdir(), "gsd-prefs-home-"));
|
|
513
|
+
|
|
514
|
+
try {
|
|
515
|
+
mkdirSync(join(tempProject, ".gsd"), { recursive: true });
|
|
516
|
+
|
|
517
|
+
writeFileSync(
|
|
518
|
+
join(tempGsdHome, "preferences.md"),
|
|
519
|
+
[
|
|
520
|
+
"---",
|
|
521
|
+
"version: 1",
|
|
522
|
+
"experimental:",
|
|
523
|
+
" rtk: true",
|
|
524
|
+
"---",
|
|
525
|
+
].join("\n"),
|
|
526
|
+
"utf-8",
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
writeFileSync(
|
|
530
|
+
join(tempProject, ".gsd", "PREFERENCES.md"),
|
|
531
|
+
[
|
|
532
|
+
"---",
|
|
533
|
+
"version: 1",
|
|
534
|
+
"git:",
|
|
535
|
+
" isolation: none",
|
|
536
|
+
"---",
|
|
537
|
+
].join("\n"),
|
|
538
|
+
"utf-8",
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
process.env.GSD_HOME = tempGsdHome;
|
|
542
|
+
process.chdir(tempProject);
|
|
543
|
+
|
|
544
|
+
const loaded = loadEffectiveGSDPreferences();
|
|
545
|
+
assert.notEqual(loaded, null);
|
|
546
|
+
assert.equal(loaded!.preferences.experimental?.rtk, true);
|
|
547
|
+
assert.equal(loaded!.preferences.git?.isolation, "none");
|
|
548
|
+
} finally {
|
|
549
|
+
process.chdir(originalCwd);
|
|
550
|
+
if (originalGsdHome === undefined) delete process.env.GSD_HOME;
|
|
551
|
+
else process.env.GSD_HOME = originalGsdHome;
|
|
552
|
+
rmSync(tempProject, { recursive: true, force: true });
|
|
553
|
+
rmSync(tempGsdHome, { recursive: true, force: true });
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
|
|
504
557
|
test("experimental.rtk defaults to off in new project preferences", () => {
|
|
505
558
|
// No experimental key → feature is disabled
|
|
506
559
|
const content = "---\nversion: 1\n---\n";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import test from 'node:test';
|
|
6
6
|
import assert from 'node:assert/strict';
|
|
7
7
|
|
|
8
|
-
import { renderPlanContent, renderRoadmapContent } from '../workflow-projections.ts';
|
|
8
|
+
import { renderPlanContent, renderRoadmapContent, renderSummaryContent } from '../workflow-projections.ts';
|
|
9
9
|
import type { SliceRow, TaskRow } from '../gsd-db.ts';
|
|
10
10
|
|
|
11
11
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
@@ -172,3 +172,98 @@ test('renderRoadmapContent: slice with status "pending" shows ⬜', () => {
|
|
|
172
172
|
|
|
173
173
|
assert.ok(content.includes('⬜'), 'pending slice should show ⬜');
|
|
174
174
|
});
|
|
175
|
+
|
|
176
|
+
// ─── renderSummaryContent: double-frontmatter regression ─────────────────
|
|
177
|
+
|
|
178
|
+
test('renderSummaryContent: uses full_summary_md as-is when it contains frontmatter', () => {
|
|
179
|
+
const existingSummary = [
|
|
180
|
+
'---',
|
|
181
|
+
'id: T01',
|
|
182
|
+
'parent: S01',
|
|
183
|
+
'milestone: M001',
|
|
184
|
+
'key_files:',
|
|
185
|
+
' - src/thing.ts',
|
|
186
|
+
'verification_result: passed',
|
|
187
|
+
'completed_at: 2026-01-01T00:00:00Z',
|
|
188
|
+
'blocker_discovered: false',
|
|
189
|
+
'---',
|
|
190
|
+
'',
|
|
191
|
+
'# T01: Did the thing',
|
|
192
|
+
'',
|
|
193
|
+
'**One-liner summary**',
|
|
194
|
+
'',
|
|
195
|
+
'## What Happened',
|
|
196
|
+
'',
|
|
197
|
+
'Narrative content here.',
|
|
198
|
+
'',
|
|
199
|
+
'## Deviations',
|
|
200
|
+
'',
|
|
201
|
+
'None.',
|
|
202
|
+
'',
|
|
203
|
+
].join('\n');
|
|
204
|
+
|
|
205
|
+
const task = makeTaskRow({
|
|
206
|
+
id: 'T01',
|
|
207
|
+
status: 'complete',
|
|
208
|
+
title: 'Did the thing',
|
|
209
|
+
one_liner: 'One-liner summary',
|
|
210
|
+
narrative: 'Narrative content here.',
|
|
211
|
+
full_summary_md: existingSummary,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const result = renderSummaryContent(task, 'S01', 'M001');
|
|
215
|
+
|
|
216
|
+
// Must NOT produce double frontmatter
|
|
217
|
+
const frontmatterCount = (result.match(/^---$/gm) || []).length;
|
|
218
|
+
assert.equal(frontmatterCount, 2, `Expected exactly 2 frontmatter delimiters (one block), got ${frontmatterCount}`);
|
|
219
|
+
|
|
220
|
+
// Must NOT produce double H1 heading
|
|
221
|
+
const h1Count = (result.match(/^# T01:/gm) || []).length;
|
|
222
|
+
assert.equal(h1Count, 1, `Expected exactly 1 H1 heading, got ${h1Count}`);
|
|
223
|
+
|
|
224
|
+
// Content should match the full_summary_md exactly
|
|
225
|
+
assert.equal(result, existingSummary);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test('renderSummaryContent: synthesizes from DB columns when full_summary_md is empty', () => {
|
|
229
|
+
const task = makeTaskRow({
|
|
230
|
+
id: 'T01',
|
|
231
|
+
status: 'complete',
|
|
232
|
+
title: 'Did the thing',
|
|
233
|
+
one_liner: 'One-liner summary',
|
|
234
|
+
narrative: 'Built the feature.',
|
|
235
|
+
full_summary_md: '',
|
|
236
|
+
deviations: 'Deviated slightly.',
|
|
237
|
+
known_issues: 'None.',
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
const result = renderSummaryContent(task, 'S01', 'M001');
|
|
241
|
+
|
|
242
|
+
// Should have exactly one frontmatter block
|
|
243
|
+
const frontmatterCount = (result.match(/^---$/gm) || []).length;
|
|
244
|
+
assert.equal(frontmatterCount, 2, 'Should have one frontmatter block (2 delimiters)');
|
|
245
|
+
|
|
246
|
+
// Should contain synthesized sections
|
|
247
|
+
assert.ok(result.includes('## What Happened'), 'Should have What Happened section');
|
|
248
|
+
assert.ok(result.includes('Built the feature.'), 'Should use narrative for content');
|
|
249
|
+
assert.ok(result.includes('## Deviations'), 'Should have Deviations section');
|
|
250
|
+
assert.ok(result.includes('Deviated slightly.'), 'Should include deviation text');
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('renderSummaryContent: synthesizes when full_summary_md has no frontmatter', () => {
|
|
254
|
+
const task = makeTaskRow({
|
|
255
|
+
id: 'T02',
|
|
256
|
+
status: 'complete',
|
|
257
|
+
title: 'Partial summary',
|
|
258
|
+
narrative: 'Did some work.',
|
|
259
|
+
full_summary_md: 'Just a plain text summary with no frontmatter.',
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
const result = renderSummaryContent(task, 'S01', 'M001');
|
|
263
|
+
|
|
264
|
+
// Should synthesize with proper frontmatter since the stored md lacks it
|
|
265
|
+
assert.ok(result.startsWith('---'), 'Should start with frontmatter');
|
|
266
|
+
assert.ok(result.includes('id: T02'), 'Should have task ID in frontmatter');
|
|
267
|
+
assert.ok(result.includes('## What Happened'), 'Should have What Happened section');
|
|
268
|
+
assert.ok(result.includes('Did some work.'), 'Should use narrative');
|
|
269
|
+
});
|
|
@@ -42,9 +42,19 @@ test("system prompt references CODEBASE.md and /gsd codebase", () => {
|
|
|
42
42
|
assert.match(prompt, /auto-refreshes it when tracked files change/i);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
+
test("system prompt hard rules forbid fabricating user responses", () => {
|
|
46
|
+
const prompt = readPrompt("system");
|
|
47
|
+
assert.match(prompt, /never fabricate, simulate, or role-play user responses/i);
|
|
48
|
+
assert.match(prompt, /never generate markers like `?\[User\]`?, `?\[Human\]`?, `?User:`?/i);
|
|
49
|
+
assert.match(prompt, /ask one question round \(1-3 questions\), then stop and wait for the user's actual response/i);
|
|
50
|
+
assert.match(prompt, /ask_user_questions.*only valid structured user input/i);
|
|
51
|
+
});
|
|
52
|
+
|
|
45
53
|
test("discuss prompt allows implementation questions when they materially matter", () => {
|
|
46
54
|
const prompt = readPrompt("discuss");
|
|
47
55
|
assert.match(prompt, /Lead with experience, but ask implementation when it materially matters/i);
|
|
56
|
+
assert.match(prompt, /Never fabricate, simulate, or role-play user responses/i);
|
|
57
|
+
assert.match(prompt, /Ask one question round \(1-3 questions\) per turn, then stop and wait for the user's actual response/i);
|
|
48
58
|
assert.match(prompt, /one gate, not two/i);
|
|
49
59
|
assert.doesNotMatch(prompt, /Questions must be about the experience, not the implementation/i);
|
|
50
60
|
});
|
|
@@ -56,6 +66,8 @@ test("guided discussion prompts avoid wrap-up prompts after every round", () =>
|
|
|
56
66
|
assert.match(slicePrompt, /Do \*\*not\*\* ask a meta "ready to wrap up\?" question after every round/i);
|
|
57
67
|
assert.doesNotMatch(milestonePrompt, /I think I have a solid picture of this milestone\. Ready to wrap up/i);
|
|
58
68
|
assert.doesNotMatch(slicePrompt, /I think I have a solid picture of this slice\. Ready to wrap up/i);
|
|
69
|
+
assert.match(milestonePrompt, /Never fabricate or simulate user input/i);
|
|
70
|
+
assert.match(slicePrompt, /Never fabricate or simulate user input/i);
|
|
59
71
|
});
|
|
60
72
|
|
|
61
73
|
test("guided milestone discussion scopes depth verification to the milestone id", () => {
|
|
@@ -64,6 +76,13 @@ test("guided milestone discussion scopes depth verification to the milestone id"
|
|
|
64
76
|
assert.doesNotMatch(prompt, /depth_verification_confirm" — this enables the write-gate downstream/i, "legacy global depth gate wording should be gone");
|
|
65
77
|
});
|
|
66
78
|
|
|
79
|
+
test("queue prompt requires waiting for user response between rounds", () => {
|
|
80
|
+
const prompt = readPrompt("queue");
|
|
81
|
+
assert.match(prompt, /Never fabricate or simulate user input during this discussion/i);
|
|
82
|
+
assert.match(prompt, /Ask 1-3 questions per round, then wait for the user's response before asking the next round\./i);
|
|
83
|
+
assert.doesNotMatch(prompt, /treat that as permission to continue/i);
|
|
84
|
+
});
|
|
85
|
+
|
|
67
86
|
test("guided-resume-task prompt preserves recovery state until work is superseded", () => {
|
|
68
87
|
const prompt = readPrompt("guided-resume-task");
|
|
69
88
|
assert.match(prompt, /Do \*\*not\*\* delete the continue file immediately/i);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
|
|
4
|
+
import { loadPrompt } from "../prompt-loader.ts";
|
|
5
|
+
|
|
6
|
+
test("loadPrompt normalizes workingDirectory backslashes for bash-friendly prompts (#4048)", () => {
|
|
7
|
+
const prompt = loadPrompt("research-milestone", {
|
|
8
|
+
milestoneId: "M001",
|
|
9
|
+
milestoneTitle: "Windows path fix",
|
|
10
|
+
workingDirectory: "C:\\Dev\\NB\\TR",
|
|
11
|
+
inlinedContext: "context",
|
|
12
|
+
skillActivation: "skill activation",
|
|
13
|
+
skillDiscoveryMode: "off",
|
|
14
|
+
skillDiscoveryInstructions: " disabled",
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
assert.match(prompt, /Your working directory is `C:\/Dev\/NB\/TR`/);
|
|
18
|
+
assert.doesNotMatch(prompt, /C:\\Dev\\NB\\TR/);
|
|
19
|
+
});
|