gsd-pi 2.41.0 → 2.42.0-dev.1df898f
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 +92 -29
- package/dist/cli-web-branch.d.ts +6 -0
- package/dist/cli-web-branch.js +17 -0
- package/dist/cli.js +18 -3
- package/dist/loader.js +3 -1
- package/dist/onboarding.js +2 -1
- package/dist/resource-loader.js +39 -6
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +52 -4
- package/dist/resources/extensions/async-jobs/await-tool.js +5 -0
- package/dist/resources/extensions/async-jobs/index.js +2 -0
- package/dist/resources/extensions/gsd/auto/loop.js +89 -1
- package/dist/resources/extensions/gsd/auto/phases.js +29 -13
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +7 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +3 -16
- package/dist/resources/extensions/gsd/auto-recovery.js +12 -4
- package/dist/resources/extensions/gsd/auto-start.js +16 -14
- package/dist/resources/extensions/gsd/auto-worktree.js +147 -13
- package/dist/resources/extensions/gsd/auto.js +64 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +199 -164
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +62 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +25 -3
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +7 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +40 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +146 -0
- package/dist/resources/extensions/gsd/context-injector.js +74 -0
- package/dist/resources/extensions/gsd/context-store.js +4 -3
- package/dist/resources/extensions/gsd/custom-execution-policy.js +47 -0
- package/dist/resources/extensions/gsd/custom-verification.js +145 -0
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +164 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -0
- package/dist/resources/extensions/gsd/db-writer.js +5 -2
- package/dist/resources/extensions/gsd/definition-loader.js +352 -0
- package/dist/resources/extensions/gsd/detection.js +20 -1
- package/dist/resources/extensions/gsd/dev-execution-policy.js +24 -0
- package/dist/resources/extensions/gsd/dev-workflow-engine.js +82 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +31 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +10 -0
- package/dist/resources/extensions/gsd/doctor.js +11 -1
- package/dist/resources/extensions/gsd/engine-resolver.js +40 -0
- package/dist/resources/extensions/gsd/engine-types.js +8 -0
- package/dist/resources/extensions/gsd/execution-policy.js +8 -0
- package/dist/resources/extensions/gsd/exit-command.js +12 -2
- package/dist/resources/extensions/gsd/export.js +9 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +2 -2
- package/dist/resources/extensions/gsd/files.js +28 -11
- package/dist/resources/extensions/gsd/forensics.js +94 -3
- package/dist/resources/extensions/gsd/git-constants.js +1 -0
- package/dist/resources/extensions/gsd/git-service.js +6 -2
- package/dist/resources/extensions/gsd/graph.js +225 -0
- package/dist/resources/extensions/gsd/gsd-db.js +25 -8
- package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
- package/dist/resources/extensions/gsd/guided-flow.js +7 -3
- package/dist/resources/extensions/gsd/journal.js +85 -0
- package/dist/resources/extensions/gsd/md-importer.js +5 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +1 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +3 -2
- package/dist/resources/extensions/gsd/post-unit-hooks.js +24 -412
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences.js +60 -8
- package/dist/resources/extensions/gsd/prompt-loader.js +34 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/forensics.md +12 -5
- package/dist/resources/extensions/gsd/prompts/queue.md +1 -1
- package/dist/resources/extensions/gsd/repo-identity.js +92 -7
- package/dist/resources/extensions/gsd/rule-registry.js +489 -0
- package/dist/resources/extensions/gsd/rule-types.js +6 -0
- package/dist/resources/extensions/gsd/run-manager.js +134 -0
- package/dist/resources/extensions/gsd/service-tier.js +147 -0
- package/dist/resources/extensions/gsd/session-lock.js +2 -2
- package/dist/resources/extensions/gsd/structured-data-formatter.js +2 -1
- package/dist/resources/extensions/gsd/templates/decisions.md +2 -2
- package/dist/resources/extensions/gsd/workflow-engine.js +7 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +13 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -6
- package/dist/resources/extensions/gsd/worktree-resolver.js +21 -4
- package/dist/resources/extensions/gsd/worktree.js +2 -2
- package/dist/resources/extensions/mcp-client/index.js +2 -1
- package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
- package/dist/resources/extensions/subagent/index.js +7 -3
- package/dist/resources/extensions/voice/index.js +4 -4
- package/dist/resources/skills/create-workflow/SKILL.md +103 -0
- package/dist/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/dist/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/dist/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/dist/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/dist/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/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 +2 -2
- 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/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/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 +5 -5
- 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/terminal/input/route.js +1 -1
- 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 +4 -4
- 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 +9 -9
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.c195dc1fdd2adbea.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-9afaaebf6042a1d7.js → webpack-fa307370fcf9fb2c.js} +1 -1
- 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/dist/web-mode.d.ts +4 -0
- package/dist/web-mode.js +69 -11
- package/package.json +1 -1
- package/packages/native/src/__tests__/text.test.mjs +33 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +6 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent.test.ts +53 -0
- package/packages/pi-agent-core/src/agent.ts +3 -0
- package/packages/pi-agent-core/src/types.ts +6 -0
- package/packages/pi-agent-core/tsconfig.json +1 -1
- package/packages/pi-ai/dist/models.d.ts +5 -3
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +801 -1468
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +1135 -1588
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.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 +60 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +1543 -0
- package/packages/pi-ai/src/models.generated.ts +1140 -1593
- package/packages/pi-ai/src/models.ts +7 -4
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +74 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +8 -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 +7 -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 +29 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +60 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +23 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +63 -11
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +20 -6
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +6 -5
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.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 +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- 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 +10 -7
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.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 +34 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +68 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -2
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +4 -2
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +18 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +29 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +3 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +99 -58
- package/packages/pi-coding-agent/src/core/resource-loader.ts +24 -6
- package/packages/pi-coding-agent/src/core/system-prompt.ts +6 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +10 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +11 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +36 -11
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +40 -4
- package/src/resources/extensions/async-jobs/await-tool.test.ts +47 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +5 -0
- package/src/resources/extensions/async-jobs/index.ts +1 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +5 -2
- package/src/resources/extensions/gsd/auto/loop.ts +101 -1
- package/src/resources/extensions/gsd/auto/phases.ts +31 -13
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto/types.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +9 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +8 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +2 -18
- package/src/resources/extensions/gsd/auto-recovery.ts +12 -4
- package/src/resources/extensions/gsd/auto-start.ts +15 -13
- package/src/resources/extensions/gsd/auto-worktree.ts +162 -18
- package/src/resources/extensions/gsd/auto.ts +71 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +209 -162
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +62 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +25 -4
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +9 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +40 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +164 -0
- package/src/resources/extensions/gsd/context-injector.ts +100 -0
- package/src/resources/extensions/gsd/context-store.ts +4 -3
- package/src/resources/extensions/gsd/custom-execution-policy.ts +73 -0
- package/src/resources/extensions/gsd/custom-verification.ts +180 -0
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +216 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -0
- package/src/resources/extensions/gsd/db-writer.ts +6 -2
- package/src/resources/extensions/gsd/definition-loader.ts +462 -0
- package/src/resources/extensions/gsd/detection.ts +20 -1
- package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +32 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +13 -0
- package/src/resources/extensions/gsd/doctor-types.ts +1 -0
- package/src/resources/extensions/gsd/doctor.ts +12 -1
- package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
- package/src/resources/extensions/gsd/engine-types.ts +71 -0
- package/src/resources/extensions/gsd/execution-policy.ts +43 -0
- package/src/resources/extensions/gsd/exit-command.ts +14 -2
- package/src/resources/extensions/gsd/export.ts +8 -15
- package/src/resources/extensions/gsd/extension-manifest.json +2 -2
- package/src/resources/extensions/gsd/files.ts +29 -12
- package/src/resources/extensions/gsd/forensics.ts +101 -3
- package/src/resources/extensions/gsd/git-constants.ts +1 -0
- package/src/resources/extensions/gsd/git-service.ts +5 -5
- package/src/resources/extensions/gsd/gitignore.ts +1 -1
- package/src/resources/extensions/gsd/graph.ts +312 -0
- package/src/resources/extensions/gsd/gsd-db.ts +37 -8
- package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
- package/src/resources/extensions/gsd/guided-flow.ts +7 -3
- package/src/resources/extensions/gsd/journal.ts +134 -0
- package/src/resources/extensions/gsd/md-importer.ts +6 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +1 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +3 -2
- package/src/resources/extensions/gsd/post-unit-hooks.ts +24 -462
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences.ts +63 -6
- package/src/resources/extensions/gsd/prompt-loader.ts +35 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +11 -10
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/forensics.md +12 -5
- package/src/resources/extensions/gsd/prompts/queue.md +1 -1
- package/src/resources/extensions/gsd/repo-identity.ts +95 -7
- package/src/resources/extensions/gsd/rule-registry.ts +599 -0
- package/src/resources/extensions/gsd/rule-types.ts +68 -0
- package/src/resources/extensions/gsd/run-manager.ts +180 -0
- package/src/resources/extensions/gsd/service-tier.ts +184 -0
- package/src/resources/extensions/gsd/session-lock.ts +2 -2
- package/src/resources/extensions/gsd/structured-data-formatter.ts +3 -1
- package/src/resources/extensions/gsd/templates/decisions.md +2 -2
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +31 -69
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +103 -120
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/captures.test.ts +12 -1
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +283 -0
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +10 -5
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +540 -0
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +382 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +778 -0
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +318 -0
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +15 -10
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +476 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +513 -0
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/journal.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +73 -82
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parsers.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -25
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +11 -22
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +56 -3
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +156 -263
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +203 -106
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +79 -5
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +74 -0
- package/src/resources/extensions/gsd/types.ts +3 -0
- package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +12 -1
- package/src/resources/extensions/gsd/worktree-manager.ts +21 -6
- package/src/resources/extensions/gsd/worktree-resolver.ts +32 -12
- package/src/resources/extensions/gsd/worktree.ts +2 -2
- package/src/resources/extensions/mcp-client/index.ts +5 -1
- package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
- package/src/resources/extensions/subagent/index.ts +7 -3
- package/src/resources/extensions/voice/index.ts +4 -4
- package/src/resources/skills/create-workflow/SKILL.md +103 -0
- package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/dist/web/standalone/.next/static/chunks/4024.279c423e4661ece1.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Ute3pMouVczQyT15qrBBO → qw8qDHXOTLUXBq1vEknSz}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// tool-naming — Verifies canonical + alias tool registration for GSD DB tools.
|
|
2
|
+
//
|
|
3
|
+
// Each of the 4 DB tools must register under its canonical gsd_concept_action name
|
|
4
|
+
// AND under the old gsd_action_concept name as a backward-compatible alias.
|
|
5
|
+
// The alias must share the exact same execute function reference as the canonical tool.
|
|
6
|
+
|
|
7
|
+
import { createTestContext } from './test-helpers.ts';
|
|
8
|
+
import { registerDbTools } from '../bootstrap/db-tools.ts';
|
|
9
|
+
|
|
10
|
+
const { assertEq, assertTrue, report } = createTestContext();
|
|
11
|
+
|
|
12
|
+
// ─── Mock PI ──────────────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
function makeMockPi() {
|
|
15
|
+
const tools: any[] = [];
|
|
16
|
+
return {
|
|
17
|
+
registerTool: (tool: any) => tools.push(tool),
|
|
18
|
+
tools,
|
|
19
|
+
} as any;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── Rename map ───────────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
const RENAME_MAP: Array<{ canonical: string; alias: string }> = [
|
|
25
|
+
{ canonical: "gsd_decision_save", alias: "gsd_save_decision" },
|
|
26
|
+
{ canonical: "gsd_requirement_update", alias: "gsd_update_requirement" },
|
|
27
|
+
{ canonical: "gsd_summary_save", alias: "gsd_save_summary" },
|
|
28
|
+
{ canonical: "gsd_milestone_generate_id", alias: "gsd_generate_milestone_id" },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// ─── Registration count ──────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
console.log('\n── Tool naming: registration count ──');
|
|
34
|
+
|
|
35
|
+
const pi = makeMockPi();
|
|
36
|
+
registerDbTools(pi);
|
|
37
|
+
|
|
38
|
+
assertEq(pi.tools.length, 8, 'Should register exactly 8 tools (4 canonical + 4 aliases)');
|
|
39
|
+
|
|
40
|
+
// ─── Both names exist for each pair ──────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
console.log('\n── Tool naming: canonical and alias names exist ──');
|
|
43
|
+
|
|
44
|
+
for (const { canonical, alias } of RENAME_MAP) {
|
|
45
|
+
const canonicalTool = pi.tools.find((t: any) => t.name === canonical);
|
|
46
|
+
const aliasTool = pi.tools.find((t: any) => t.name === alias);
|
|
47
|
+
|
|
48
|
+
assertTrue(canonicalTool !== undefined, `Canonical tool "${canonical}" should be registered`);
|
|
49
|
+
assertTrue(aliasTool !== undefined, `Alias tool "${alias}" should be registered`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ─── Execute function identity ───────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
console.log('\n── Tool naming: execute function identity (===) ──');
|
|
55
|
+
|
|
56
|
+
for (const { canonical, alias } of RENAME_MAP) {
|
|
57
|
+
const canonicalTool = pi.tools.find((t: any) => t.name === canonical);
|
|
58
|
+
const aliasTool = pi.tools.find((t: any) => t.name === alias);
|
|
59
|
+
|
|
60
|
+
if (canonicalTool && aliasTool) {
|
|
61
|
+
assertTrue(
|
|
62
|
+
canonicalTool.execute === aliasTool.execute,
|
|
63
|
+
`"${canonical}" and "${alias}" should share the same execute function reference`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ─── Alias descriptions include "(alias for ...)" ───────────────────────────
|
|
69
|
+
|
|
70
|
+
console.log('\n── Tool naming: alias descriptions ──');
|
|
71
|
+
|
|
72
|
+
for (const { canonical, alias } of RENAME_MAP) {
|
|
73
|
+
const aliasTool = pi.tools.find((t: any) => t.name === alias);
|
|
74
|
+
|
|
75
|
+
if (aliasTool) {
|
|
76
|
+
assertTrue(
|
|
77
|
+
aliasTool.description.includes(`alias for ${canonical}`),
|
|
78
|
+
`Alias "${alias}" description should include "alias for ${canonical}"`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ─── Canonical tools have proper promptGuidelines ────────────────────────────
|
|
84
|
+
|
|
85
|
+
console.log('\n── Tool naming: canonical promptGuidelines use canonical name ──');
|
|
86
|
+
|
|
87
|
+
for (const { canonical } of RENAME_MAP) {
|
|
88
|
+
const canonicalTool = pi.tools.find((t: any) => t.name === canonical);
|
|
89
|
+
|
|
90
|
+
if (canonicalTool) {
|
|
91
|
+
const guidelinesText = canonicalTool.promptGuidelines.join(' ');
|
|
92
|
+
assertTrue(
|
|
93
|
+
guidelinesText.includes(canonical),
|
|
94
|
+
`Canonical tool "${canonical}" promptGuidelines should reference its own name`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ─── Alias promptGuidelines direct to canonical ──────────────────────────────
|
|
100
|
+
|
|
101
|
+
console.log('\n── Tool naming: alias promptGuidelines redirect to canonical ──');
|
|
102
|
+
|
|
103
|
+
for (const { canonical, alias } of RENAME_MAP) {
|
|
104
|
+
const aliasTool = pi.tools.find((t: any) => t.name === alias);
|
|
105
|
+
|
|
106
|
+
if (aliasTool) {
|
|
107
|
+
const guidelinesText = aliasTool.promptGuidelines.join(' ');
|
|
108
|
+
assertTrue(
|
|
109
|
+
guidelinesText.includes(`Alias for ${canonical}`),
|
|
110
|
+
`Alias "${alias}" promptGuidelines should say "Alias for ${canonical}"`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
116
|
+
|
|
117
|
+
report();
|
|
@@ -15,6 +15,7 @@ import { fileURLToPath } from "node:url";
|
|
|
15
15
|
|
|
16
16
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
const hooksPath = join(__dirname, "..", "post-unit-hooks.ts");
|
|
18
|
+
const registryPath = join(__dirname, "..", "rule-registry.ts");
|
|
18
19
|
const autoPromptsPath = join(__dirname, "..", "auto-prompts.ts");
|
|
19
20
|
|
|
20
21
|
// After decomposition, triage/dispatch logic lives in auto-post-unit.ts
|
|
@@ -25,7 +26,11 @@ const autoSrc = [
|
|
|
25
26
|
postUnitSrc,
|
|
26
27
|
readFileSync(join(__dirname, "..", "auto-start.ts"), "utf-8"),
|
|
27
28
|
].join("\n");
|
|
28
|
-
|
|
29
|
+
// Hook exclusion logic lives in the rule-registry (facade delegates there)
|
|
30
|
+
const hooksSrc = [
|
|
31
|
+
readFileSync(hooksPath, "utf-8"),
|
|
32
|
+
readFileSync(registryPath, "utf-8"),
|
|
33
|
+
].join("\n");
|
|
29
34
|
const autoPromptsSrc = (() => { try { return readFileSync(autoPromptsPath, "utf-8"); } catch { return autoSrc; } })();
|
|
30
35
|
|
|
31
36
|
// ─── Hook exclusion ──────────────────────────────────────────────────────────
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 11. Dependency audit — git diff detection, npm audit parsing, graceful failures
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import test from "node:test";
|
|
18
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
19
19
|
import assert from "node:assert/strict";
|
|
20
20
|
import { mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
21
21
|
import { join, dirname } from "node:path";
|
|
@@ -37,37 +37,30 @@ function makeTempDir(prefix: string): string {
|
|
|
37
37
|
|
|
38
38
|
// ─── Discovery Tests ─────────────────────────────────────────────────────────
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
describe("verification-gate: discovery", () => {
|
|
41
|
+
let tmp: string;
|
|
42
|
+
beforeEach(() => { tmp = makeTempDir("vg-discovery"); });
|
|
43
|
+
afterEach(() => { rmSync(tmp, { recursive: true, force: true }); });
|
|
44
|
+
|
|
45
|
+
test("discoverCommands from preference commands", () => {
|
|
43
46
|
const result = discoverCommands({
|
|
44
47
|
preferenceCommands: ["npm run lint", "npm run test"],
|
|
45
48
|
cwd: tmp,
|
|
46
49
|
});
|
|
47
50
|
assert.deepStrictEqual(result.commands, ["npm run lint", "npm run test"]);
|
|
48
51
|
assert.equal(result.source, "preference");
|
|
49
|
-
}
|
|
50
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
51
|
-
}
|
|
52
|
-
});
|
|
52
|
+
});
|
|
53
53
|
|
|
54
|
-
test("
|
|
55
|
-
const tmp = makeTempDir("vg-taskplan");
|
|
56
|
-
try {
|
|
54
|
+
test("discoverCommands from task plan verify field", () => {
|
|
57
55
|
const result = discoverCommands({
|
|
58
56
|
taskPlanVerify: "npm run lint && npm run test",
|
|
59
57
|
cwd: tmp,
|
|
60
58
|
});
|
|
61
59
|
assert.deepStrictEqual(result.commands, ["npm run lint", "npm run test"]);
|
|
62
60
|
assert.equal(result.source, "task-plan");
|
|
63
|
-
}
|
|
64
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
65
|
-
}
|
|
66
|
-
});
|
|
61
|
+
});
|
|
67
62
|
|
|
68
|
-
test("
|
|
69
|
-
const tmp = makeTempDir("vg-pkg");
|
|
70
|
-
try {
|
|
63
|
+
test("discoverCommands from package.json scripts", () => {
|
|
71
64
|
writeFileSync(
|
|
72
65
|
join(tmp, "package.json"),
|
|
73
66
|
JSON.stringify({
|
|
@@ -86,14 +79,9 @@ test("verification-gate: discoverCommands from package.json scripts", () => {
|
|
|
86
79
|
"npm run test",
|
|
87
80
|
]);
|
|
88
81
|
assert.equal(result.source, "package-json");
|
|
89
|
-
}
|
|
90
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
91
|
-
}
|
|
92
|
-
});
|
|
82
|
+
});
|
|
93
83
|
|
|
94
|
-
test("
|
|
95
|
-
const tmp = makeTempDir("vg-precedence");
|
|
96
|
-
try {
|
|
84
|
+
test("first-non-empty-wins — preference beats task plan and package.json", () => {
|
|
97
85
|
writeFileSync(
|
|
98
86
|
join(tmp, "package.json"),
|
|
99
87
|
JSON.stringify({ scripts: { lint: "eslint ." } }),
|
|
@@ -105,14 +93,9 @@ test("verification-gate: first-non-empty-wins — preference beats task plan and
|
|
|
105
93
|
});
|
|
106
94
|
assert.deepStrictEqual(result.commands, ["custom-check"]);
|
|
107
95
|
assert.equal(result.source, "preference");
|
|
108
|
-
}
|
|
109
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
110
|
-
}
|
|
111
|
-
});
|
|
96
|
+
});
|
|
112
97
|
|
|
113
|
-
test("
|
|
114
|
-
const tmp = makeTempDir("vg-tp-beats-pkg");
|
|
115
|
-
try {
|
|
98
|
+
test("task plan verify beats package.json", () => {
|
|
116
99
|
writeFileSync(
|
|
117
100
|
join(tmp, "package.json"),
|
|
118
101
|
JSON.stringify({ scripts: { lint: "eslint ." } }),
|
|
@@ -123,25 +106,15 @@ test("verification-gate: task plan verify beats package.json", () => {
|
|
|
123
106
|
});
|
|
124
107
|
assert.deepStrictEqual(result.commands, ["custom-verify"]);
|
|
125
108
|
assert.equal(result.source, "task-plan");
|
|
126
|
-
}
|
|
127
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
128
|
-
}
|
|
129
|
-
});
|
|
109
|
+
});
|
|
130
110
|
|
|
131
|
-
test("
|
|
132
|
-
const tmp = makeTempDir("vg-no-pkg");
|
|
133
|
-
try {
|
|
111
|
+
test("missing package.json → 0 checks, source none", () => {
|
|
134
112
|
const result = discoverCommands({ cwd: tmp });
|
|
135
113
|
assert.deepStrictEqual(result.commands, []);
|
|
136
114
|
assert.equal(result.source, "none");
|
|
137
|
-
}
|
|
138
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
139
|
-
}
|
|
140
|
-
});
|
|
115
|
+
});
|
|
141
116
|
|
|
142
|
-
test("
|
|
143
|
-
const tmp = makeTempDir("vg-no-scripts");
|
|
144
|
-
try {
|
|
117
|
+
test("package.json with no matching scripts → 0 checks", () => {
|
|
145
118
|
writeFileSync(
|
|
146
119
|
join(tmp, "package.json"),
|
|
147
120
|
JSON.stringify({ scripts: { build: "tsc", start: "node index.js" } }),
|
|
@@ -149,14 +122,9 @@ test("verification-gate: package.json with no matching scripts → 0 checks", ()
|
|
|
149
122
|
const result = discoverCommands({ cwd: tmp });
|
|
150
123
|
assert.deepStrictEqual(result.commands, []);
|
|
151
124
|
assert.equal(result.source, "none");
|
|
152
|
-
}
|
|
153
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
154
|
-
}
|
|
155
|
-
});
|
|
125
|
+
});
|
|
156
126
|
|
|
157
|
-
test("
|
|
158
|
-
const tmp = makeTempDir("vg-empty-pref");
|
|
159
|
-
try {
|
|
127
|
+
test("empty preference array falls through to task plan", () => {
|
|
160
128
|
const result = discoverCommands({
|
|
161
129
|
preferenceCommands: [],
|
|
162
130
|
taskPlanVerify: "echo ok",
|
|
@@ -164,16 +132,99 @@ test("verification-gate: empty preference array falls through to task plan", ()
|
|
|
164
132
|
});
|
|
165
133
|
assert.deepStrictEqual(result.commands, ["echo ok"]);
|
|
166
134
|
assert.equal(result.source, "task-plan");
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("package.json with only test script → returns only npm run test", () => {
|
|
138
|
+
writeFileSync(
|
|
139
|
+
join(tmp, "package.json"),
|
|
140
|
+
JSON.stringify({
|
|
141
|
+
scripts: {
|
|
142
|
+
test: "vitest",
|
|
143
|
+
build: "tsc",
|
|
144
|
+
start: "node index.js",
|
|
145
|
+
},
|
|
146
|
+
}),
|
|
147
|
+
);
|
|
148
|
+
const result = discoverCommands({ cwd: tmp });
|
|
149
|
+
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
150
|
+
assert.equal(result.source, "package-json");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("taskPlanVerify with single command (no &&)", () => {
|
|
154
|
+
const result = discoverCommands({
|
|
155
|
+
taskPlanVerify: "npm test",
|
|
156
|
+
cwd: tmp,
|
|
157
|
+
});
|
|
158
|
+
assert.deepStrictEqual(result.commands, ["npm test"]);
|
|
159
|
+
assert.equal(result.source, "task-plan");
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("whitespace-only preference commands fall through", () => {
|
|
163
|
+
writeFileSync(
|
|
164
|
+
join(tmp, "package.json"),
|
|
165
|
+
JSON.stringify({ scripts: { lint: "eslint ." } }),
|
|
166
|
+
);
|
|
167
|
+
const result = discoverCommands({
|
|
168
|
+
preferenceCommands: [" ", ""],
|
|
169
|
+
cwd: tmp,
|
|
170
|
+
});
|
|
171
|
+
// Whitespace-only strings are trimmed to empty and filtered out
|
|
172
|
+
assert.equal(result.source, "package-json");
|
|
173
|
+
assert.deepStrictEqual(result.commands, ["npm run lint"]);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("prose taskPlanVerify is rejected, falls through to package.json", () => {
|
|
177
|
+
writeFileSync(
|
|
178
|
+
join(tmp, "package.json"),
|
|
179
|
+
JSON.stringify({ scripts: { test: "vitest" } }),
|
|
180
|
+
);
|
|
181
|
+
const result = discoverCommands({
|
|
182
|
+
taskPlanVerify: "Document exists, contains all 5 scale names, all 14 semantic tokens",
|
|
183
|
+
cwd: tmp,
|
|
184
|
+
});
|
|
185
|
+
// Prose should be rejected, so it falls through to package.json
|
|
186
|
+
assert.equal(result.source, "package-json");
|
|
187
|
+
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("prose taskPlanVerify with no package.json → source none", () => {
|
|
191
|
+
const result = discoverCommands({
|
|
192
|
+
taskPlanVerify: "Verify the output matches expected format and all fields are present",
|
|
193
|
+
cwd: tmp,
|
|
194
|
+
});
|
|
195
|
+
assert.equal(result.source, "none");
|
|
196
|
+
assert.deepStrictEqual(result.commands, []);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test("valid command in taskPlanVerify still works", () => {
|
|
200
|
+
const result = discoverCommands({
|
|
201
|
+
taskPlanVerify: "npm run lint && npm run test",
|
|
202
|
+
cwd: tmp,
|
|
203
|
+
});
|
|
204
|
+
assert.equal(result.source, "task-plan");
|
|
205
|
+
assert.deepStrictEqual(result.commands, ["npm run lint", "npm run test"]);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("mixed prose and commands in taskPlanVerify — only commands kept", () => {
|
|
209
|
+
const result = discoverCommands({
|
|
210
|
+
taskPlanVerify: "Check that everything works && npm run test",
|
|
211
|
+
cwd: tmp,
|
|
212
|
+
});
|
|
213
|
+
// "Check that everything works" is prose (starts with capital, 4+ words)
|
|
214
|
+
// "npm run test" is a valid command
|
|
215
|
+
assert.equal(result.source, "task-plan");
|
|
216
|
+
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
217
|
+
});
|
|
170
218
|
});
|
|
171
219
|
|
|
172
220
|
// ─── Execution Tests ─────────────────────────────────────────────────────────
|
|
173
221
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
222
|
+
describe("verification-gate: execution", () => {
|
|
223
|
+
let tmp: string;
|
|
224
|
+
beforeEach(() => { tmp = makeTempDir("vg-exec"); });
|
|
225
|
+
afterEach(() => { rmSync(tmp, { recursive: true, force: true }); });
|
|
226
|
+
|
|
227
|
+
test("all commands pass → gate passes", () => {
|
|
177
228
|
const result = runVerificationGate({
|
|
178
229
|
basePath: tmp,
|
|
179
230
|
unitId: "T01",
|
|
@@ -188,14 +239,9 @@ test("verification-gate: all commands pass → gate passes", () => {
|
|
|
188
239
|
assert.ok(result.checks[0].stdout.includes("hello"));
|
|
189
240
|
assert.ok(result.checks[1].stdout.includes("world"));
|
|
190
241
|
assert.equal(typeof result.timestamp, "number");
|
|
191
|
-
}
|
|
192
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
193
|
-
}
|
|
194
|
-
});
|
|
242
|
+
});
|
|
195
243
|
|
|
196
|
-
test("
|
|
197
|
-
const tmp = makeTempDir("vg-fail");
|
|
198
|
-
try {
|
|
244
|
+
test("one command fails → gate fails with exit code + stderr", () => {
|
|
199
245
|
const result = runVerificationGate({
|
|
200
246
|
basePath: tmp,
|
|
201
247
|
unitId: "T01",
|
|
@@ -207,14 +253,9 @@ test("verification-gate: one command fails → gate fails with exit code + stder
|
|
|
207
253
|
assert.equal(result.checks[0].exitCode, 0);
|
|
208
254
|
assert.equal(result.checks[1].exitCode, 1);
|
|
209
255
|
assert.ok(result.checks[1].stderr.includes("err"));
|
|
210
|
-
}
|
|
211
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
212
|
-
}
|
|
213
|
-
});
|
|
256
|
+
});
|
|
214
257
|
|
|
215
|
-
test("
|
|
216
|
-
const tmp = makeTempDir("vg-empty");
|
|
217
|
-
try {
|
|
258
|
+
test("no commands discovered → gate passes with 0 checks", () => {
|
|
218
259
|
const result = runVerificationGate({
|
|
219
260
|
basePath: tmp,
|
|
220
261
|
unitId: "T01",
|
|
@@ -223,14 +264,9 @@ test("verification-gate: no commands discovered → gate passes with 0 checks",
|
|
|
223
264
|
assert.equal(result.passed, true);
|
|
224
265
|
assert.equal(result.checks.length, 0);
|
|
225
266
|
assert.equal(result.discoverySource, "none");
|
|
226
|
-
}
|
|
227
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
228
|
-
}
|
|
229
|
-
});
|
|
267
|
+
});
|
|
230
268
|
|
|
231
|
-
test("
|
|
232
|
-
const tmp = makeTempDir("vg-notfound");
|
|
233
|
-
try {
|
|
269
|
+
test("command not found → exit code 127", () => {
|
|
234
270
|
const result = runVerificationGate({
|
|
235
271
|
basePath: tmp,
|
|
236
272
|
unitId: "T01",
|
|
@@ -241,14 +277,9 @@ test("verification-gate: command not found → exit code 127", () => {
|
|
|
241
277
|
assert.equal(result.checks.length, 1);
|
|
242
278
|
assert.ok(result.checks[0].exitCode !== 0, "should have non-zero exit code");
|
|
243
279
|
assert.ok(result.checks[0].durationMs >= 0);
|
|
244
|
-
}
|
|
245
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
246
|
-
}
|
|
247
|
-
});
|
|
280
|
+
});
|
|
248
281
|
|
|
249
|
-
test("
|
|
250
|
-
const tmp = makeTempDir("vg-dep0190");
|
|
251
|
-
try {
|
|
282
|
+
test("no DEP0190 deprecation warning when running commands", () => {
|
|
252
283
|
// Run a subprocess with --throw-deprecation so any DeprecationWarning
|
|
253
284
|
// becomes a thrown error (non-zero exit). The fix passes the command
|
|
254
285
|
// string to sh -c explicitly instead of using spawnSync(cmd, {shell:true}).
|
|
@@ -282,14 +313,9 @@ test("verification-gate: no DEP0190 deprecation warning when running commands",
|
|
|
282
313
|
0,
|
|
283
314
|
`Expected exit 0 (no deprecation) but got ${child.status}. stderr: ${child.stderr}`,
|
|
284
315
|
);
|
|
285
|
-
}
|
|
286
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
287
|
-
}
|
|
288
|
-
});
|
|
316
|
+
});
|
|
289
317
|
|
|
290
|
-
test("
|
|
291
|
-
const tmp = makeTempDir("vg-duration");
|
|
292
|
-
try {
|
|
318
|
+
test("each check has durationMs", () => {
|
|
293
319
|
const result = runVerificationGate({
|
|
294
320
|
basePath: tmp,
|
|
295
321
|
unitId: "T01",
|
|
@@ -299,9 +325,42 @@ test("verification-gate: each check has durationMs", () => {
|
|
|
299
325
|
assert.equal(result.checks.length, 1);
|
|
300
326
|
assert.equal(typeof result.checks[0].durationMs, "number");
|
|
301
327
|
assert.ok(result.checks[0].durationMs >= 0);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
test("one command fails — remaining commands still run (non-short-circuit)", () => {
|
|
331
|
+
// First fails, second and third should still execute
|
|
332
|
+
const result = runVerificationGate({
|
|
333
|
+
basePath: tmp,
|
|
334
|
+
unitId: "T02",
|
|
335
|
+
cwd: tmp,
|
|
336
|
+
preferenceCommands: [
|
|
337
|
+
"sh -c 'exit 1'",
|
|
338
|
+
"echo second",
|
|
339
|
+
"echo third",
|
|
340
|
+
],
|
|
341
|
+
});
|
|
342
|
+
assert.equal(result.passed, false);
|
|
343
|
+
assert.equal(result.checks.length, 3, "all 3 commands should run");
|
|
344
|
+
assert.equal(result.checks[0].exitCode, 1, "first command fails");
|
|
345
|
+
assert.equal(result.checks[1].exitCode, 0, "second command runs and passes");
|
|
346
|
+
assert.ok(result.checks[1].stdout.includes("second"));
|
|
347
|
+
assert.equal(result.checks[2].exitCode, 0, "third command runs and passes");
|
|
348
|
+
assert.ok(result.checks[2].stdout.includes("third"));
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
test("gate execution uses cwd for spawnSync", () => {
|
|
352
|
+
// pwd should report the temp dir
|
|
353
|
+
const result = runVerificationGate({
|
|
354
|
+
basePath: tmp,
|
|
355
|
+
unitId: "T02",
|
|
356
|
+
cwd: tmp,
|
|
357
|
+
preferenceCommands: ["pwd"],
|
|
358
|
+
});
|
|
359
|
+
assert.equal(result.passed, true);
|
|
360
|
+
assert.equal(result.checks.length, 1);
|
|
361
|
+
// The stdout should contain the tmp dir path (resolving symlinks)
|
|
362
|
+
assert.ok(result.checks[0].stdout.trim().length > 0, "pwd should produce output");
|
|
363
|
+
});
|
|
305
364
|
});
|
|
306
365
|
|
|
307
366
|
// ─── Preference Validation Tests ─────────────────────────────────────────────
|
|
@@ -361,62 +420,6 @@ test("verification-gate: validatePreferences floors verification_max_retries", (
|
|
|
361
420
|
assert.equal(result.errors.length, 0);
|
|
362
421
|
});
|
|
363
422
|
|
|
364
|
-
// ─── Additional Discovery Tests (T02) ───────────────────────────────────────
|
|
365
|
-
|
|
366
|
-
test("verification-gate: package.json with only test script → returns only npm run test", () => {
|
|
367
|
-
const tmp = makeTempDir("vg-only-test");
|
|
368
|
-
try {
|
|
369
|
-
writeFileSync(
|
|
370
|
-
join(tmp, "package.json"),
|
|
371
|
-
JSON.stringify({
|
|
372
|
-
scripts: {
|
|
373
|
-
test: "vitest",
|
|
374
|
-
build: "tsc",
|
|
375
|
-
start: "node index.js",
|
|
376
|
-
},
|
|
377
|
-
}),
|
|
378
|
-
);
|
|
379
|
-
const result = discoverCommands({ cwd: tmp });
|
|
380
|
-
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
381
|
-
assert.equal(result.source, "package-json");
|
|
382
|
-
} finally {
|
|
383
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
test("verification-gate: taskPlanVerify with single command (no &&)", () => {
|
|
388
|
-
const tmp = makeTempDir("vg-tp-single");
|
|
389
|
-
try {
|
|
390
|
-
const result = discoverCommands({
|
|
391
|
-
taskPlanVerify: "npm test",
|
|
392
|
-
cwd: tmp,
|
|
393
|
-
});
|
|
394
|
-
assert.deepStrictEqual(result.commands, ["npm test"]);
|
|
395
|
-
assert.equal(result.source, "task-plan");
|
|
396
|
-
} finally {
|
|
397
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
test("verification-gate: whitespace-only preference commands fall through", () => {
|
|
402
|
-
const tmp = makeTempDir("vg-ws-pref");
|
|
403
|
-
try {
|
|
404
|
-
writeFileSync(
|
|
405
|
-
join(tmp, "package.json"),
|
|
406
|
-
JSON.stringify({ scripts: { lint: "eslint ." } }),
|
|
407
|
-
);
|
|
408
|
-
const result = discoverCommands({
|
|
409
|
-
preferenceCommands: [" ", ""],
|
|
410
|
-
cwd: tmp,
|
|
411
|
-
});
|
|
412
|
-
// Whitespace-only strings are trimmed to empty and filtered out
|
|
413
|
-
assert.equal(result.source, "package-json");
|
|
414
|
-
assert.deepStrictEqual(result.commands, ["npm run lint"]);
|
|
415
|
-
} finally {
|
|
416
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
|
|
420
423
|
// ─── isLikelyCommand Tests (issue #1066) ────────────────────────────────────
|
|
421
424
|
|
|
422
425
|
test("isLikelyCommand: known command prefixes are accepted", () => {
|
|
@@ -468,116 +471,6 @@ test("isLikelyCommand: short lowercase tokens without flags are accepted (could
|
|
|
468
471
|
assert.equal(isLikelyCommand("mycheck"), true);
|
|
469
472
|
});
|
|
470
473
|
|
|
471
|
-
test("verification-gate: prose taskPlanVerify is rejected, falls through to package.json", () => {
|
|
472
|
-
const tmp = makeTempDir("vg-prose-reject");
|
|
473
|
-
try {
|
|
474
|
-
writeFileSync(
|
|
475
|
-
join(tmp, "package.json"),
|
|
476
|
-
JSON.stringify({ scripts: { test: "vitest" } }),
|
|
477
|
-
);
|
|
478
|
-
const result = discoverCommands({
|
|
479
|
-
taskPlanVerify: "Document exists, contains all 5 scale names, all 14 semantic tokens",
|
|
480
|
-
cwd: tmp,
|
|
481
|
-
});
|
|
482
|
-
// Prose should be rejected, so it falls through to package.json
|
|
483
|
-
assert.equal(result.source, "package-json");
|
|
484
|
-
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
485
|
-
} finally {
|
|
486
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
487
|
-
}
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
test("verification-gate: prose taskPlanVerify with no package.json → source none", () => {
|
|
491
|
-
const tmp = makeTempDir("vg-prose-none");
|
|
492
|
-
try {
|
|
493
|
-
const result = discoverCommands({
|
|
494
|
-
taskPlanVerify: "Verify the output matches expected format and all fields are present",
|
|
495
|
-
cwd: tmp,
|
|
496
|
-
});
|
|
497
|
-
assert.equal(result.source, "none");
|
|
498
|
-
assert.deepStrictEqual(result.commands, []);
|
|
499
|
-
} finally {
|
|
500
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
test("verification-gate: valid command in taskPlanVerify still works", () => {
|
|
505
|
-
const tmp = makeTempDir("vg-valid-cmd");
|
|
506
|
-
try {
|
|
507
|
-
const result = discoverCommands({
|
|
508
|
-
taskPlanVerify: "npm run lint && npm run test",
|
|
509
|
-
cwd: tmp,
|
|
510
|
-
});
|
|
511
|
-
assert.equal(result.source, "task-plan");
|
|
512
|
-
assert.deepStrictEqual(result.commands, ["npm run lint", "npm run test"]);
|
|
513
|
-
} finally {
|
|
514
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
515
|
-
}
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
test("verification-gate: mixed prose and commands in taskPlanVerify — only commands kept", () => {
|
|
519
|
-
const tmp = makeTempDir("vg-mixed");
|
|
520
|
-
try {
|
|
521
|
-
const result = discoverCommands({
|
|
522
|
-
taskPlanVerify: "Check that everything works && npm run test",
|
|
523
|
-
cwd: tmp,
|
|
524
|
-
});
|
|
525
|
-
// "Check that everything works" is prose (starts with capital, 4+ words)
|
|
526
|
-
// "npm run test" is a valid command
|
|
527
|
-
assert.equal(result.source, "task-plan");
|
|
528
|
-
assert.deepStrictEqual(result.commands, ["npm run test"]);
|
|
529
|
-
} finally {
|
|
530
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
// ─── Additional Execution Tests (T02) ───────────────────────────────────────
|
|
535
|
-
|
|
536
|
-
test("verification-gate: one command fails — remaining commands still run (non-short-circuit)", () => {
|
|
537
|
-
const tmp = makeTempDir("vg-no-short-circuit");
|
|
538
|
-
try {
|
|
539
|
-
// First fails, second and third should still execute
|
|
540
|
-
const result = runVerificationGate({
|
|
541
|
-
basePath: tmp,
|
|
542
|
-
unitId: "T02",
|
|
543
|
-
cwd: tmp,
|
|
544
|
-
preferenceCommands: [
|
|
545
|
-
"sh -c 'exit 1'",
|
|
546
|
-
"echo second",
|
|
547
|
-
"echo third",
|
|
548
|
-
],
|
|
549
|
-
});
|
|
550
|
-
assert.equal(result.passed, false);
|
|
551
|
-
assert.equal(result.checks.length, 3, "all 3 commands should run");
|
|
552
|
-
assert.equal(result.checks[0].exitCode, 1, "first command fails");
|
|
553
|
-
assert.equal(result.checks[1].exitCode, 0, "second command runs and passes");
|
|
554
|
-
assert.ok(result.checks[1].stdout.includes("second"));
|
|
555
|
-
assert.equal(result.checks[2].exitCode, 0, "third command runs and passes");
|
|
556
|
-
assert.ok(result.checks[2].stdout.includes("third"));
|
|
557
|
-
} finally {
|
|
558
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
559
|
-
}
|
|
560
|
-
});
|
|
561
|
-
|
|
562
|
-
test("verification-gate: gate execution uses cwd for spawnSync", () => {
|
|
563
|
-
const tmp = makeTempDir("vg-cwd");
|
|
564
|
-
try {
|
|
565
|
-
// pwd should report the temp dir
|
|
566
|
-
const result = runVerificationGate({
|
|
567
|
-
basePath: tmp,
|
|
568
|
-
unitId: "T02",
|
|
569
|
-
cwd: tmp,
|
|
570
|
-
preferenceCommands: ["pwd"],
|
|
571
|
-
});
|
|
572
|
-
assert.equal(result.passed, true);
|
|
573
|
-
assert.equal(result.checks.length, 1);
|
|
574
|
-
// The stdout should contain the tmp dir path (resolving symlinks)
|
|
575
|
-
assert.ok(result.checks[0].stdout.trim().length > 0, "pwd should produce output");
|
|
576
|
-
} finally {
|
|
577
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
578
|
-
}
|
|
579
|
-
});
|
|
580
|
-
|
|
581
474
|
// ─── Additional Preference Validation Tests (T02) ──────────────────────────
|
|
582
475
|
|
|
583
476
|
test("verification-gate: verification_commands produces no unknown-key warnings", () => {
|