@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
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/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- 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/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.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 +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- 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/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -714,31 +714,23 @@ async function mirrorDecisionToMemory(
|
|
|
714
714
|
/**
|
|
715
715
|
* Extract a milestone/slice reference from a deferral decision.
|
|
716
716
|
*
|
|
717
|
-
* Detects deferrals
|
|
718
|
-
* - scope contains "defer" (e.g., "deferral", "defer")
|
|
719
|
-
* - choice or decision contains "defer" + an M###/S## pattern
|
|
717
|
+
* Detects deferrals when the slice reference is part of the deferral phrase.
|
|
720
718
|
*
|
|
721
719
|
* Returns { milestoneId, sliceId } if found, null otherwise.
|
|
722
720
|
*/
|
|
723
721
|
export function extractDeferredSliceRef(
|
|
724
722
|
fields: Pick<SaveDecisionFields, 'scope' | 'decision' | 'choice'>,
|
|
725
723
|
): { milestoneId: string; sliceId: string } | null {
|
|
726
|
-
const
|
|
727
|
-
/\bdefer(?:ral|red|ring|s)?\b/i
|
|
728
|
-
|
|
729
|
-
/\
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
if (choiceMatch) {
|
|
737
|
-
return { milestoneId: choiceMatch[1], sliceId: choiceMatch[2] };
|
|
738
|
-
}
|
|
739
|
-
const decisionMatch = fields.decision.match(slicePattern);
|
|
740
|
-
if (decisionMatch) {
|
|
741
|
-
return { milestoneId: decisionMatch[1], sliceId: decisionMatch[2] };
|
|
724
|
+
const defersSlicePattern =
|
|
725
|
+
/\bdefer(?:ral|red|ring|s)?\b\s+(?:(?:of|the)\s+)*(?:slice\s+)?\b(M\d{3,4})\/(S\d{2,3})\b/i;
|
|
726
|
+
const sliceIsDeferredPattern =
|
|
727
|
+
/\b(M\d{3,4})\/(S\d{2,3})\b\s+(?:is|was|will be|should be|can be)\s+defer(?:red|ring)?\b/i;
|
|
728
|
+
|
|
729
|
+
for (const text of [fields.choice, fields.decision, fields.scope]) {
|
|
730
|
+
const match = text.match(defersSlicePattern) ?? text.match(sliceIsDeferredPattern);
|
|
731
|
+
if (match) {
|
|
732
|
+
return { milestoneId: match[1], sliceId: match[2] };
|
|
733
|
+
}
|
|
742
734
|
}
|
|
743
735
|
|
|
744
736
|
return null;
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
import { resolveMilestoneFile } from "./paths.js";
|
|
4
4
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
5
5
|
import { parseUnitId } from "./unit-id.js";
|
|
6
|
-
import { isDbAvailable,
|
|
7
|
-
import {
|
|
8
|
-
import { isClosedStatus, isSkippedForDispatch } from "./status-guards.js";
|
|
6
|
+
import { isDbAvailable, getMilestoneSliceSummaries, getMilestone } from "./gsd-db.js";
|
|
7
|
+
import { isSkippedForDispatch } from "./status-guards.js";
|
|
9
8
|
import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
|
|
10
9
|
import { readFileSync } from "node:fs";
|
|
11
10
|
import type { LoopState } from "./auto/types.js";
|
|
@@ -117,34 +116,12 @@ export function getPriorSliceCompletionBlocker(
|
|
|
117
116
|
}
|
|
118
117
|
}
|
|
119
118
|
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (rows.length > 0) {
|
|
127
|
-
slices = rows.map((r) => ({
|
|
128
|
-
id: r.id,
|
|
129
|
-
done: isClosedStatus(r.status),
|
|
130
|
-
depends: r.depends ?? [],
|
|
131
|
-
}));
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
if (!slices) {
|
|
135
|
-
// File-based fallback: parse roadmap checkboxes
|
|
136
|
-
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
137
|
-
if (!roadmapPath) continue;
|
|
138
|
-
let roadmapContent: string;
|
|
139
|
-
try { roadmapContent = readFileSync(roadmapPath, "utf-8"); } catch { continue; }
|
|
140
|
-
const parsed = parseRoadmap(roadmapContent);
|
|
141
|
-
if (parsed.slices.length === 0) continue;
|
|
142
|
-
slices = parsed.slices.map((s) => ({
|
|
143
|
-
id: s.id,
|
|
144
|
-
done: s.done,
|
|
145
|
-
depends: s.depends ?? [],
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
119
|
+
// DB-authoritative eligibility list (ADR-017) — markdown projections are
|
|
120
|
+
// never parsed for dispatch decisions. No DB / no rows → skip this
|
|
121
|
+
// milestone's check (unknown is not a blocker).
|
|
122
|
+
if (!isDbAvailable()) continue;
|
|
123
|
+
const slices = getMilestoneSliceSummaries(mid);
|
|
124
|
+
if (slices.length === 0) continue;
|
|
148
125
|
|
|
149
126
|
if (mid !== targetMid) {
|
|
150
127
|
const incomplete = slices.find((slice) => !slice.done);
|
|
@@ -6,8 +6,9 @@ import { isDbAvailable, _getAdapter } from "./gsd-db.js";
|
|
|
6
6
|
import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
|
|
7
7
|
import { resolveGsdPathContract, resolveMilestoneFile } from "./paths.js";
|
|
8
8
|
import { deriveState } from "./state.js";
|
|
9
|
+
import { workflowEventLogPath } from "./workflow-event-ledger.js";
|
|
9
10
|
import { readEvents } from "./workflow-events.js";
|
|
10
|
-
import {
|
|
11
|
+
import { flushWorkflowProjections } from "./projection-flush.js";
|
|
11
12
|
|
|
12
13
|
export async function checkEngineHealth(
|
|
13
14
|
basePath: string,
|
|
@@ -260,7 +261,7 @@ export async function checkEngineHealth(
|
|
|
260
261
|
// relative to the event log and re-render them.
|
|
261
262
|
try {
|
|
262
263
|
if (isDbAvailable()) {
|
|
263
|
-
const eventLogPath =
|
|
264
|
+
const eventLogPath = workflowEventLogPath(basePath);
|
|
264
265
|
const events = readEvents(eventLogPath);
|
|
265
266
|
if (events.length > 0) {
|
|
266
267
|
const lastEventTs = new Date(events[events.length - 1]!.ts).getTime();
|
|
@@ -270,7 +271,7 @@ export async function checkEngineHealth(
|
|
|
270
271
|
const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
|
|
271
272
|
if (!roadmapPath || !existsSync(roadmapPath)) {
|
|
272
273
|
try {
|
|
273
|
-
await
|
|
274
|
+
await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
|
|
274
275
|
fixesApplied.push(`re-rendered missing projections for ${milestone.id}`);
|
|
275
276
|
} catch {
|
|
276
277
|
// Non-fatal — projection re-render failed
|
|
@@ -280,7 +281,7 @@ export async function checkEngineHealth(
|
|
|
280
281
|
const projectionMtime = statSync(roadmapPath).mtimeMs;
|
|
281
282
|
if (lastEventTs > projectionMtime) {
|
|
282
283
|
try {
|
|
283
|
-
await
|
|
284
|
+
await flushWorkflowProjections(basePath, { milestoneId: milestone.id });
|
|
284
285
|
fixesApplied.push(`re-rendered stale projections for ${milestone.id}`);
|
|
285
286
|
} catch {
|
|
286
287
|
// Non-fatal — projection re-render failed
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
13
|
-
import { execSync } from "node:child_process";
|
|
13
|
+
import { execFile, execSync } from "node:child_process";
|
|
14
14
|
import { join } from "node:path";
|
|
15
15
|
|
|
16
16
|
import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
17
17
|
import { detectPythonExecutable } from "./python-resolver.js";
|
|
18
|
-
import {
|
|
18
|
+
import { projectRootFromWorktreePath } from "./worktree-root.js";
|
|
19
19
|
|
|
20
20
|
// ── Types ──────────────────────────────────────────────────────────────────
|
|
21
21
|
|
|
@@ -50,12 +50,7 @@ const CMD_TIMEOUT = 5_000;
|
|
|
50
50
|
function resolveWorktreeProjectRoot(basePath: string): string | null {
|
|
51
51
|
const envRoot = process.env.GSD_WORKTREE;
|
|
52
52
|
if (envRoot) return envRoot;
|
|
53
|
-
|
|
54
|
-
const segment = findWorktreeSegment(basePath.replace(/\\/g, "/"));
|
|
55
|
-
if (!segment) return null;
|
|
56
|
-
|
|
57
|
-
// Everything before the worktree segment is the project root
|
|
58
|
-
return basePath.slice(0, segment.gsdIdx);
|
|
53
|
+
return projectRootFromWorktreePath(basePath);
|
|
59
54
|
}
|
|
60
55
|
|
|
61
56
|
function tryExec(cmd: string, cwd: string): string | null {
|
|
@@ -81,48 +76,47 @@ function commandExists(name: string, cwd: string): boolean {
|
|
|
81
76
|
/**
|
|
82
77
|
* Check that Node.js version meets the project's engines requirement.
|
|
83
78
|
*/
|
|
84
|
-
function
|
|
79
|
+
function readPackageEngineNode(basePath: string): string | null {
|
|
85
80
|
const pkgPath = join(basePath, "package.json");
|
|
86
81
|
if (!existsSync(pkgPath)) return null;
|
|
87
|
-
|
|
88
82
|
try {
|
|
89
83
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
90
|
-
|
|
91
|
-
if (!required) return null;
|
|
92
|
-
|
|
93
|
-
const currentVersion = tryExec("node --version", basePath);
|
|
94
|
-
if (!currentVersion) {
|
|
95
|
-
return { name: "node_version", status: "error", message: "Node.js not found in PATH" };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Parse semver requirement (handles >=X.Y.Z format)
|
|
99
|
-
const reqMatch = required.match(/>=?\s*(\d+)(?:\.(\d+))?/);
|
|
100
|
-
if (!reqMatch) return null;
|
|
101
|
-
|
|
102
|
-
const reqMajor = parseInt(reqMatch[1], 10);
|
|
103
|
-
const reqMinor = parseInt(reqMatch[2] ?? "0", 10);
|
|
104
|
-
|
|
105
|
-
const curMatch = currentVersion.match(/v?(\d+)\.(\d+)/);
|
|
106
|
-
if (!curMatch) return null;
|
|
107
|
-
|
|
108
|
-
const curMajor = parseInt(curMatch[1], 10);
|
|
109
|
-
const curMinor = parseInt(curMatch[2], 10);
|
|
110
|
-
|
|
111
|
-
if (curMajor < reqMajor || (curMajor === reqMajor && curMinor < reqMinor)) {
|
|
112
|
-
return {
|
|
113
|
-
name: "node_version",
|
|
114
|
-
status: "warning",
|
|
115
|
-
message: `Node.js ${currentVersion} does not meet requirement "${required}"`,
|
|
116
|
-
detail: `Current: ${currentVersion}, Required: ${required}`,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return { name: "node_version", status: "ok", message: `Node.js ${currentVersion}` };
|
|
84
|
+
return pkg.engines?.node ?? null;
|
|
121
85
|
} catch {
|
|
122
86
|
return null;
|
|
123
87
|
}
|
|
124
88
|
}
|
|
125
89
|
|
|
90
|
+
function buildNodeVersionResult(required: string, currentVersion: string | null): EnvironmentCheckResult | null {
|
|
91
|
+
if (!currentVersion) {
|
|
92
|
+
return { name: "node_version", status: "error", message: "Node.js not found in PATH" };
|
|
93
|
+
}
|
|
94
|
+
// Parse semver requirement (handles >=X.Y.Z format)
|
|
95
|
+
const reqMatch = required.match(/>=?\s*(\d+)(?:\.(\d+))?/);
|
|
96
|
+
if (!reqMatch) return null;
|
|
97
|
+
const reqMajor = parseInt(reqMatch[1], 10);
|
|
98
|
+
const reqMinor = parseInt(reqMatch[2] ?? "0", 10);
|
|
99
|
+
const curMatch = currentVersion.match(/v?(\d+)\.(\d+)/);
|
|
100
|
+
if (!curMatch) return null;
|
|
101
|
+
const curMajor = parseInt(curMatch[1], 10);
|
|
102
|
+
const curMinor = parseInt(curMatch[2], 10);
|
|
103
|
+
if (curMajor < reqMajor || (curMajor === reqMajor && curMinor < reqMinor)) {
|
|
104
|
+
return {
|
|
105
|
+
name: "node_version",
|
|
106
|
+
status: "warning",
|
|
107
|
+
message: `Node.js ${currentVersion} does not meet requirement "${required}"`,
|
|
108
|
+
detail: `Current: ${currentVersion}, Required: ${required}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return { name: "node_version", status: "ok", message: `Node.js ${currentVersion}` };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function checkNodeVersion(basePath: string): EnvironmentCheckResult | null {
|
|
115
|
+
const required = readPackageEngineNode(basePath);
|
|
116
|
+
if (!required) return null;
|
|
117
|
+
return buildNodeVersionResult(required, tryExec("node --version", basePath));
|
|
118
|
+
}
|
|
119
|
+
|
|
126
120
|
/**
|
|
127
121
|
* Check if node_modules exists and is not stale vs the lockfile.
|
|
128
122
|
*/
|
|
@@ -222,28 +216,19 @@ function checkEnvFiles(basePath: string): EnvironmentCheckResult | null {
|
|
|
222
216
|
* Check for port conflicts on common dev server ports.
|
|
223
217
|
* Only checks ports that appear in package.json scripts.
|
|
224
218
|
*/
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
// Try to detect ports from package.json scripts
|
|
219
|
+
// Detect the dev ports worth checking from package.json scripts, falling back to
|
|
220
|
+
// common defaults. Returns an empty set when there's no Node project (no
|
|
221
|
+
// package.json) or a parse failure — the caller then skips port checks entirely,
|
|
222
|
+
// avoiding false positives from system services (e.g. macOS AirPlay on 5000, #1381).
|
|
223
|
+
function collectPortsToCheck(basePath: string): Set<number> {
|
|
232
224
|
const portsToCheck = new Set<number>();
|
|
233
225
|
const pkgPath = join(basePath, "package.json");
|
|
234
|
-
|
|
235
|
-
if (!existsSync(pkgPath)) {
|
|
236
|
-
// No package.json — this isn't a Node.js project. Skip port checks
|
|
237
|
-
// entirely to avoid false positives from system services (e.g., macOS
|
|
238
|
-
// AirPlay Receiver on port 5000). (#1381)
|
|
239
|
-
return [];
|
|
240
|
-
}
|
|
226
|
+
if (!existsSync(pkgPath)) return portsToCheck;
|
|
241
227
|
|
|
242
228
|
try {
|
|
243
229
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
244
230
|
const scripts = pkg.scripts ?? {};
|
|
245
231
|
const scriptText = Object.values(scripts).join(" ");
|
|
246
|
-
|
|
247
232
|
// Look for --port NNNN, -p NNNN, PORT=NNNN, :NNNN patterns
|
|
248
233
|
const portMatches = scriptText.matchAll(/(?:--port\s+|(?:^|[^a-z])PORT[=:]\s*|-p\s+|:)(\d{4,5})\b/gi);
|
|
249
234
|
for (const m of portMatches) {
|
|
@@ -251,48 +236,66 @@ function checkPortConflicts(basePath: string): EnvironmentCheckResult[] {
|
|
|
251
236
|
if (port >= 1024 && port <= 65535) portsToCheck.add(port);
|
|
252
237
|
}
|
|
253
238
|
} catch {
|
|
254
|
-
|
|
255
|
-
return [];
|
|
239
|
+
return new Set();
|
|
256
240
|
}
|
|
257
241
|
|
|
258
|
-
// If no ports found in scripts, check common defaults.
|
|
259
|
-
// Filter out port 5000 on macOS — AirPlay Receiver uses it by default (#1381).
|
|
260
242
|
if (portsToCheck.size === 0) {
|
|
261
243
|
for (const p of DEFAULT_DEV_PORTS) {
|
|
262
244
|
if (p === 5000 && process.platform === "darwin") continue;
|
|
263
245
|
portsToCheck.add(p);
|
|
264
246
|
}
|
|
265
247
|
}
|
|
248
|
+
return portsToCheck;
|
|
249
|
+
}
|
|
266
250
|
|
|
251
|
+
// Parse a single `lsof -nP -iTCP -sTCP:LISTEN` scan and report which of the
|
|
252
|
+
// requested ports are in use. Replaces the old per-port lsof loop (up to ~14
|
|
253
|
+
// system-wide socket scans, ~350ms) with one scan + an in-memory lookup.
|
|
254
|
+
function buildPortConflictResults(
|
|
255
|
+
lsofOut: string | null,
|
|
256
|
+
portsToCheck: Set<number>,
|
|
257
|
+
): EnvironmentCheckResult[] {
|
|
258
|
+
const results: EnvironmentCheckResult[] = [];
|
|
259
|
+
const listening = new Map<number, { pid: string; command: string }>();
|
|
260
|
+
if (lsofOut) {
|
|
261
|
+
for (const line of lsofOut.split("\n")) {
|
|
262
|
+
// COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
|
|
263
|
+
// e.g. `node 12345 user 23u IPv4 0x.. 0t0 TCP *:3000 (LISTEN)`
|
|
264
|
+
const portMatch = line.match(/:(\d+)(?:\s+\(LISTEN\))?\s*$/);
|
|
265
|
+
if (!portMatch) continue;
|
|
266
|
+
const port = parseInt(portMatch[1], 10);
|
|
267
|
+
if (!Number.isFinite(port) || listening.has(port)) continue;
|
|
268
|
+
const cols = line.split(/\s+/);
|
|
269
|
+
listening.set(port, { command: cols[0] ?? "unknown", pid: cols[1] ?? "?" });
|
|
270
|
+
}
|
|
271
|
+
}
|
|
267
272
|
for (const port of portsToCheck) {
|
|
268
|
-
const
|
|
269
|
-
if (
|
|
270
|
-
// Get process name
|
|
271
|
-
const nameResult = tryExec(`lsof -i :${port} -sTCP:LISTEN -Fp | head -2`, basePath);
|
|
272
|
-
const processName = nameResult?.match(/p(\d+)\n?c?(.+)?/)?.[2] ?? "unknown";
|
|
273
|
-
|
|
273
|
+
const hit = listening.get(port);
|
|
274
|
+
if (hit) {
|
|
274
275
|
results.push({
|
|
275
276
|
name: "port_conflict",
|
|
276
277
|
status: "warning",
|
|
277
|
-
message: `Port ${port} is already in use by ${
|
|
278
|
+
message: `Port ${port} is already in use by ${hit.command} (PID ${hit.pid})`,
|
|
278
279
|
detail: `Kill the process or use a different port`,
|
|
279
280
|
});
|
|
280
281
|
}
|
|
281
282
|
}
|
|
282
|
-
|
|
283
283
|
return results;
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
+
function checkPortConflicts(basePath: string): EnvironmentCheckResult[] {
|
|
287
|
+
// Only run on macOS/Linux — lsof is not available on Windows
|
|
288
|
+
if (process.platform === "win32") return [];
|
|
289
|
+
const portsToCheck = collectPortsToCheck(basePath);
|
|
290
|
+
if (portsToCheck.size === 0) return [];
|
|
291
|
+
return buildPortConflictResults(tryExec("lsof -nP -iTCP -sTCP:LISTEN", basePath), portsToCheck);
|
|
292
|
+
}
|
|
293
|
+
|
|
286
294
|
/**
|
|
287
295
|
* Check available disk space on the working directory partition.
|
|
288
296
|
*/
|
|
289
|
-
function
|
|
290
|
-
// Only run on macOS/Linux
|
|
291
|
-
if (process.platform === "win32") return null;
|
|
292
|
-
|
|
293
|
-
const dfOutput = tryExec(`df -k "${basePath}" | tail -1`, basePath);
|
|
297
|
+
function buildDiskSpaceResult(dfOutput: string | null): EnvironmentCheckResult | null {
|
|
294
298
|
if (!dfOutput) return null;
|
|
295
|
-
|
|
296
299
|
try {
|
|
297
300
|
// df output: filesystem blocks used avail capacity mount
|
|
298
301
|
const parts = dfOutput.split(/\s+/);
|
|
@@ -311,32 +314,34 @@ function checkDiskSpace(basePath: string): EnvironmentCheckResult | null {
|
|
|
311
314
|
detail: `Free up space — builds and git operations may fail`,
|
|
312
315
|
};
|
|
313
316
|
}
|
|
314
|
-
|
|
315
317
|
if (availBytes < MIN_DISK_BYTES * 4) {
|
|
316
|
-
return {
|
|
317
|
-
name: "disk_space",
|
|
318
|
-
status: "warning",
|
|
319
|
-
message: `Disk space getting low: ${availGB}GB free`,
|
|
320
|
-
};
|
|
318
|
+
return { name: "disk_space", status: "warning", message: `Disk space getting low: ${availGB}GB free` };
|
|
321
319
|
}
|
|
322
|
-
|
|
323
320
|
return { name: "disk_space", status: "ok", message: `${availGB}GB free` };
|
|
324
321
|
} catch {
|
|
325
322
|
return null;
|
|
326
323
|
}
|
|
327
324
|
}
|
|
328
325
|
|
|
326
|
+
function checkDiskSpace(basePath: string): EnvironmentCheckResult | null {
|
|
327
|
+
// Only run on macOS/Linux
|
|
328
|
+
if (process.platform === "win32") return null;
|
|
329
|
+
return buildDiskSpaceResult(tryExec(`df -k "${basePath}" | tail -1`, basePath));
|
|
330
|
+
}
|
|
331
|
+
|
|
329
332
|
/**
|
|
330
333
|
* Check if Docker is available when project has a Dockerfile.
|
|
331
334
|
*/
|
|
332
|
-
function
|
|
333
|
-
|
|
335
|
+
function hasDockerConfig(basePath: string): boolean {
|
|
336
|
+
return existsSync(join(basePath, "Dockerfile")) ||
|
|
334
337
|
existsSync(join(basePath, "docker-compose.yml")) ||
|
|
335
338
|
existsSync(join(basePath, "docker-compose.yaml")) ||
|
|
336
339
|
existsSync(join(basePath, "compose.yml")) ||
|
|
337
340
|
existsSync(join(basePath, "compose.yaml"));
|
|
341
|
+
}
|
|
338
342
|
|
|
339
|
-
|
|
343
|
+
function checkDocker(basePath: string): EnvironmentCheckResult | null {
|
|
344
|
+
if (!hasDockerConfig(basePath)) return null;
|
|
340
345
|
|
|
341
346
|
if (!commandExists("docker", basePath)) {
|
|
342
347
|
return {
|
|
@@ -362,78 +367,68 @@ function checkDocker(basePath: string): EnvironmentCheckResult | null {
|
|
|
362
367
|
/**
|
|
363
368
|
* Check for common project tools that should be available.
|
|
364
369
|
*/
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
+
interface ProjectToolSpec {
|
|
371
|
+
packageManager: string | null; // non-npm manager that must be on PATH, or null
|
|
372
|
+
needsTsc: boolean;
|
|
373
|
+
needsPython: boolean;
|
|
374
|
+
needsCargo: boolean;
|
|
375
|
+
needsGo: boolean;
|
|
376
|
+
}
|
|
370
377
|
|
|
378
|
+
// Decide which project tools to verify from package.json + marker files (pure fs).
|
|
379
|
+
// The actual `command -v` probes are left to the sync/async checkers so both share
|
|
380
|
+
// this logic.
|
|
381
|
+
function readProjectToolSpec(basePath: string): ProjectToolSpec | null {
|
|
382
|
+
const pkgPath = join(basePath, "package.json");
|
|
383
|
+
if (!existsSync(pkgPath)) return null;
|
|
371
384
|
try {
|
|
372
385
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
373
|
-
const allDeps = {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
// Check for package manager
|
|
379
|
-
const packageManager = pkg.packageManager;
|
|
380
|
-
if (packageManager) {
|
|
381
|
-
const managerName = packageManager.split("@")[0];
|
|
382
|
-
if (managerName && managerName !== "npm" && !commandExists(managerName, basePath)) {
|
|
383
|
-
results.push({
|
|
384
|
-
name: "package_manager",
|
|
385
|
-
status: "warning",
|
|
386
|
-
message: `Project requires ${managerName} but it's not installed`,
|
|
387
|
-
detail: `Install with: npm install -g ${managerName}`,
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
// Check for TypeScript if it's a dependency
|
|
393
|
-
if (allDeps["typescript"] && !existsSync(join(basePath, "node_modules", ".bin", "tsc"))) {
|
|
394
|
-
results.push({
|
|
395
|
-
name: "typescript",
|
|
396
|
-
status: "warning",
|
|
397
|
-
message: "TypeScript is a dependency but tsc is not available (run npm install)",
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Check for Python if pyproject.toml or requirements.txt exists
|
|
402
|
-
if (existsSync(join(basePath, "pyproject.toml")) || existsSync(join(basePath, "requirements.txt"))) {
|
|
403
|
-
if (detectPythonExecutable() === null) {
|
|
404
|
-
results.push({
|
|
405
|
-
name: "python",
|
|
406
|
-
status: "warning",
|
|
407
|
-
message: "Project has Python config but python is not installed",
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Check for Rust if Cargo.toml exists
|
|
413
|
-
if (existsSync(join(basePath, "Cargo.toml"))) {
|
|
414
|
-
if (!commandExists("cargo", basePath)) {
|
|
415
|
-
results.push({
|
|
416
|
-
name: "cargo",
|
|
417
|
-
status: "warning",
|
|
418
|
-
message: "Project has Cargo.toml but cargo is not installed",
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
// Check for Go if go.mod exists
|
|
424
|
-
if (existsSync(join(basePath, "go.mod"))) {
|
|
425
|
-
if (!commandExists("go", basePath)) {
|
|
426
|
-
results.push({
|
|
427
|
-
name: "go",
|
|
428
|
-
status: "warning",
|
|
429
|
-
message: "Project has go.mod but go is not installed",
|
|
430
|
-
});
|
|
431
|
-
}
|
|
386
|
+
const allDeps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
387
|
+
let packageManager: string | null = null;
|
|
388
|
+
if (pkg.packageManager) {
|
|
389
|
+
const managerName = String(pkg.packageManager).split("@")[0];
|
|
390
|
+
if (managerName && managerName !== "npm") packageManager = managerName;
|
|
432
391
|
}
|
|
392
|
+
return {
|
|
393
|
+
packageManager,
|
|
394
|
+
needsTsc: Boolean(allDeps["typescript"]) && !existsSync(join(basePath, "node_modules", ".bin", "tsc")),
|
|
395
|
+
needsPython: existsSync(join(basePath, "pyproject.toml")) || existsSync(join(basePath, "requirements.txt")),
|
|
396
|
+
needsCargo: existsSync(join(basePath, "Cargo.toml")),
|
|
397
|
+
needsGo: existsSync(join(basePath, "go.mod")),
|
|
398
|
+
};
|
|
433
399
|
} catch {
|
|
434
|
-
|
|
400
|
+
return null;
|
|
435
401
|
}
|
|
402
|
+
}
|
|
436
403
|
|
|
404
|
+
function checkProjectTools(basePath: string): EnvironmentCheckResult[] {
|
|
405
|
+
const spec = readProjectToolSpec(basePath);
|
|
406
|
+
if (!spec) return [];
|
|
407
|
+
const results: EnvironmentCheckResult[] = [];
|
|
408
|
+
if (spec.packageManager && !commandExists(spec.packageManager, basePath)) {
|
|
409
|
+
results.push({
|
|
410
|
+
name: "package_manager",
|
|
411
|
+
status: "warning",
|
|
412
|
+
message: `Project requires ${spec.packageManager} but it's not installed`,
|
|
413
|
+
detail: `Install with: npm install -g ${spec.packageManager}`,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
if (spec.needsTsc) {
|
|
417
|
+
results.push({
|
|
418
|
+
name: "typescript",
|
|
419
|
+
status: "warning",
|
|
420
|
+
message: "TypeScript is a dependency but tsc is not available (run npm install)",
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
if (spec.needsPython && detectPythonExecutable() === null) {
|
|
424
|
+
results.push({ name: "python", status: "warning", message: "Project has Python config but python is not installed" });
|
|
425
|
+
}
|
|
426
|
+
if (spec.needsCargo && !commandExists("cargo", basePath)) {
|
|
427
|
+
results.push({ name: "cargo", status: "warning", message: "Project has Cargo.toml but cargo is not installed" });
|
|
428
|
+
}
|
|
429
|
+
if (spec.needsGo && !commandExists("go", basePath)) {
|
|
430
|
+
results.push({ name: "go", status: "warning", message: "Project has go.mod but go is not installed" });
|
|
431
|
+
}
|
|
437
432
|
return results;
|
|
438
433
|
}
|
|
439
434
|
|
|
@@ -522,6 +517,131 @@ function checkTestHealth(basePath: string): EnvironmentCheckResult | null {
|
|
|
522
517
|
* Run all environment health checks. Returns structured results for
|
|
523
518
|
* integration with the doctor pipeline.
|
|
524
519
|
*/
|
|
520
|
+
// ── Async variants ─────────────────────────────────────────────────────────
|
|
521
|
+
// The always-on health widget refreshes off the first-paint path, but the sync
|
|
522
|
+
// `runEnvironmentChecks` blocks the event loop on its subprocess checks (~300ms,
|
|
523
|
+
// and again every 60s). These async siblings run the same checks via non-blocking
|
|
524
|
+
// `execFile` and fan the independent ones out concurrently, so the UI thread never
|
|
525
|
+
// stalls. The sync API above is unchanged for /gsd doctor and the dashboards.
|
|
526
|
+
|
|
527
|
+
function tryExecAsync(cmd: string, cwd: string): Promise<string | null> {
|
|
528
|
+
return new Promise((resolve) => {
|
|
529
|
+
const isWin = process.platform === "win32";
|
|
530
|
+
const child = execFile(
|
|
531
|
+
isWin ? "cmd" : "sh",
|
|
532
|
+
isWin ? ["/c", cmd] : ["-c", cmd],
|
|
533
|
+
{ cwd, timeout: CMD_TIMEOUT, encoding: "utf-8" },
|
|
534
|
+
(err, stdout) => resolve(err ? null : String(stdout).trim()),
|
|
535
|
+
);
|
|
536
|
+
child.on("error", () => resolve(null));
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
async function commandExistsAsync(name: string, cwd: string): Promise<boolean> {
|
|
541
|
+
const whichCmd = process.platform === "win32" ? `where ${name}` : `command -v ${name}`;
|
|
542
|
+
return (await tryExecAsync(whichCmd, cwd)) !== null;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
async function checkNodeVersionAsync(basePath: string): Promise<EnvironmentCheckResult | null> {
|
|
546
|
+
const required = readPackageEngineNode(basePath);
|
|
547
|
+
if (!required) return null;
|
|
548
|
+
const currentVersion = await tryExecAsync("node --version", basePath);
|
|
549
|
+
return buildNodeVersionResult(required, currentVersion);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
async function checkPortConflictsAsync(basePath: string): Promise<EnvironmentCheckResult[]> {
|
|
553
|
+
if (process.platform === "win32") return [];
|
|
554
|
+
const portsToCheck = collectPortsToCheck(basePath);
|
|
555
|
+
if (portsToCheck.size === 0) return [];
|
|
556
|
+
const lsofOut = await tryExecAsync("lsof -nP -iTCP -sTCP:LISTEN", basePath);
|
|
557
|
+
return buildPortConflictResults(lsofOut, portsToCheck);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
async function checkDiskSpaceAsync(basePath: string): Promise<EnvironmentCheckResult | null> {
|
|
561
|
+
if (process.platform === "win32") return null;
|
|
562
|
+
return buildDiskSpaceResult(await tryExecAsync(`df -k "${basePath}" | tail -1`, basePath));
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
async function checkDockerAsync(basePath: string): Promise<EnvironmentCheckResult | null> {
|
|
566
|
+
if (!hasDockerConfig(basePath)) return null;
|
|
567
|
+
if (!(await commandExistsAsync("docker", basePath))) {
|
|
568
|
+
return { name: "docker", status: "warning", message: "Project has Docker files but docker is not installed" };
|
|
569
|
+
}
|
|
570
|
+
const info = await tryExecAsync("docker info --format '{{.ServerVersion}}'", basePath);
|
|
571
|
+
if (!info) {
|
|
572
|
+
return {
|
|
573
|
+
name: "docker",
|
|
574
|
+
status: "warning",
|
|
575
|
+
message: "Docker is installed but daemon is not running",
|
|
576
|
+
detail: "Start Docker Desktop or the docker daemon",
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
return { name: "docker", status: "ok", message: `Docker ${info}` };
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
async function checkProjectToolsAsync(basePath: string): Promise<EnvironmentCheckResult[]> {
|
|
583
|
+
const spec = readProjectToolSpec(basePath);
|
|
584
|
+
if (!spec) return [];
|
|
585
|
+
const results: EnvironmentCheckResult[] = [];
|
|
586
|
+
if (spec.packageManager && !(await commandExistsAsync(spec.packageManager, basePath))) {
|
|
587
|
+
results.push({
|
|
588
|
+
name: "package_manager",
|
|
589
|
+
status: "warning",
|
|
590
|
+
message: `Project requires ${spec.packageManager} but it's not installed`,
|
|
591
|
+
detail: `Install with: npm install -g ${spec.packageManager}`,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
if (spec.needsTsc) {
|
|
595
|
+
results.push({
|
|
596
|
+
name: "typescript",
|
|
597
|
+
status: "warning",
|
|
598
|
+
message: "TypeScript is a dependency but tsc is not available (run npm install)",
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
if (spec.needsPython && detectPythonExecutable() === null) {
|
|
602
|
+
results.push({ name: "python", status: "warning", message: "Project has Python config but python is not installed" });
|
|
603
|
+
}
|
|
604
|
+
if (spec.needsCargo && !(await commandExistsAsync("cargo", basePath))) {
|
|
605
|
+
results.push({ name: "cargo", status: "warning", message: "Project has Cargo.toml but cargo is not installed" });
|
|
606
|
+
}
|
|
607
|
+
if (spec.needsGo && !(await commandExistsAsync("go", basePath))) {
|
|
608
|
+
results.push({ name: "go", status: "warning", message: "Project has go.mod but go is not installed" });
|
|
609
|
+
}
|
|
610
|
+
return results;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Non-blocking equivalent of `runEnvironmentChecks` for the health-widget
|
|
615
|
+
* background refresh. Cheap fs checks run inline; the subprocess-backed checks
|
|
616
|
+
* fan out concurrently so the whole suite costs ~max(check), not the sum.
|
|
617
|
+
*/
|
|
618
|
+
export async function runEnvironmentChecksAsync(basePath: string): Promise<EnvironmentCheckResult[]> {
|
|
619
|
+
const results: EnvironmentCheckResult[] = [];
|
|
620
|
+
|
|
621
|
+
// fs-only checks — already cheap and synchronous.
|
|
622
|
+
const depsCheck = checkDependenciesInstalled(basePath);
|
|
623
|
+
if (depsCheck) results.push(depsCheck);
|
|
624
|
+
const envCheck = checkEnvFiles(basePath);
|
|
625
|
+
if (envCheck) results.push(envCheck);
|
|
626
|
+
|
|
627
|
+
// subprocess-backed checks — run concurrently, off the event-loop critical path.
|
|
628
|
+
const [nodeCheck, portChecks, diskCheck, dockerCheck, toolChecks] = await Promise.all([
|
|
629
|
+
checkNodeVersionAsync(basePath),
|
|
630
|
+
checkPortConflictsAsync(basePath),
|
|
631
|
+
checkDiskSpaceAsync(basePath),
|
|
632
|
+
checkDockerAsync(basePath),
|
|
633
|
+
checkProjectToolsAsync(basePath),
|
|
634
|
+
]);
|
|
635
|
+
|
|
636
|
+
if (nodeCheck) results.push(nodeCheck);
|
|
637
|
+
results.push(...portChecks);
|
|
638
|
+
if (diskCheck) results.push(diskCheck);
|
|
639
|
+
if (dockerCheck) results.push(dockerCheck);
|
|
640
|
+
results.push(...toolChecks);
|
|
641
|
+
|
|
642
|
+
return results;
|
|
643
|
+
}
|
|
644
|
+
|
|
525
645
|
export function runEnvironmentChecks(basePath: string): EnvironmentCheckResult[] {
|
|
526
646
|
const results: EnvironmentCheckResult[] = [];
|
|
527
647
|
|