@opengsd/gsd-core 1.11.0 → 1.13.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +78 -42
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +0 -1
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +3 -1
- package/agents/gsd-plan-checker.md +91 -112
- package/agents/gsd-planner.md +20 -4
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +82 -7
- package/agents/gsd-ui-researcher.md +70 -3
- package/agents/gsd-verifier.md +24 -2
- package/bin/install.js +847 -200
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/phase.md +1 -1
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/quick.md +8 -4
- package/commands/gsd/surface.md +18 -8
- package/gsd-core/bin/gsd-tools.cjs +761 -100
- package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
- package/gsd-core/bin/lib/api-coverage.cjs +30 -9
- package/gsd-core/bin/lib/artifacts.cjs +2 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
- package/gsd-core/bin/lib/audit.cjs +163 -41
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +785 -144
- package/gsd-core/bin/lib/capability-state.cjs +25 -4
- package/gsd-core/bin/lib/capability-validator.cjs +321 -18
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +229 -6
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +877 -54
- package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
- package/gsd-core/bin/lib/config-loader.cjs +121 -29
- package/gsd-core/bin/lib/config.cjs +92 -2
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +118 -14
- package/gsd-core/bin/lib/decisions.cjs +213 -1
- package/gsd-core/bin/lib/edge-probe.cjs +23 -2
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +975 -326
- package/gsd-core/bin/lib/gap-checker.cjs +41 -8
- package/gsd-core/bin/lib/git-base-branch.cjs +182 -39
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +60 -14
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +75 -22
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
- package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
- package/gsd-core/bin/lib/host-integration.cjs +96 -11
- package/gsd-core/bin/lib/init-command-router.cjs +132 -21
- package/gsd-core/bin/lib/init.cjs +252 -56
- package/gsd-core/bin/lib/install-engine.cjs +252 -15
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +78 -1
- package/gsd-core/bin/lib/install-profiles.cjs +100 -18
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +195 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/loop-resolver.cjs +14 -8
- package/gsd-core/bin/lib/markdown-table.cjs +175 -4
- package/gsd-core/bin/lib/milestone.cjs +112 -7
- package/gsd-core/bin/lib/model-catalog.cjs +177 -19
- package/gsd-core/bin/lib/model-resolver.cjs +10 -28
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +13 -6
- package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
- package/gsd-core/bin/lib/phase-id.cjs +321 -13
- package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
- package/gsd-core/bin/lib/phase-locator.cjs +138 -17
- package/gsd-core/bin/lib/phase.cjs +1175 -115
- package/gsd-core/bin/lib/plan-document.cjs +273 -0
- package/gsd-core/bin/lib/plan-scan.cjs +13 -2
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +165 -34
- package/gsd-core/bin/lib/planning-workspace.cjs +159 -28
- package/gsd-core/bin/lib/probe-core.cjs +4 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +62 -14
- package/gsd-core/bin/lib/review-lane-invocation.cjs +73 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
- package/gsd-core/bin/lib/roadmap-parser.cjs +577 -41
- package/gsd-core/bin/lib/roadmap.cjs +248 -64
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +329 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +16 -17
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +320 -109
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +487 -83
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
- package/gsd-core/bin/lib/shell-command-projection.cjs +75 -8
- package/gsd-core/bin/lib/smart-entry.cjs +19 -31
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +47 -18
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +216 -5
- package/gsd-core/bin/lib/state-md-schema.cjs +231 -0
- package/gsd-core/bin/lib/state-transition.cjs +850 -145
- package/gsd-core/bin/lib/state.cjs +1629 -287
- package/gsd-core/bin/lib/surface.cjs +33 -10
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
- package/gsd-core/bin/lib/uat.cjs +2542 -387
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
- package/gsd-core/bin/lib/unusable-input.cjs +13 -0
- package/gsd-core/bin/lib/update-context.cjs +6 -2
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/README.md +43 -5
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -13
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +441 -56
- package/gsd-core/bin/lib/workstream-inventory.cjs +20 -2
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +185 -21
- package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/bin/verify-reapply-patches.cjs +70 -3
- package/gsd-core/references/agent-contracts.md +6 -5
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +37 -19
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/edge-probe.md +17 -5
- package/gsd-core/references/execute-mvp-tdd.md +18 -18
- package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/execute-phase-wave-guard.md +11 -9
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +3 -3
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +22 -0
- package/gsd-core/references/model-profiles.md +1 -1
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +76 -3
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +39 -9
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/tdd.md +15 -12
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +2 -2
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +11 -11
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/phase-prompt.md +7 -0
- package/gsd-core/templates/state.md +7 -0
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +3 -1
- package/gsd-core/workflows/add-phase.md +5 -3
- package/gsd-core/workflows/add-tests.md +4 -9
- package/gsd-core/workflows/add-todo.md +2 -2
- package/gsd-core/workflows/ai-integration-phase.md +5 -10
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +14 -3
- package/gsd-core/workflows/audit-milestone.md +11 -9
- package/gsd-core/workflows/audit-uat.md +19 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +12 -26
- package/gsd-core/workflows/check-todos.md +2 -2
- package/gsd-core/workflows/cleanup.md +3 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +16 -14
- package/gsd-core/workflows/code-review-fix.md +3 -1
- package/gsd-core/workflows/code-review.md +192 -69
- package/gsd-core/workflows/complete-milestone.md +28 -14
- package/gsd-core/workflows/debug.md +6 -4
- package/gsd-core/workflows/diagnose-issues.md +17 -7
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +3 -1
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -7
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +3 -1
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -3
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +2 -2
- package/gsd-core/workflows/do.md +46 -19
- package/gsd-core/workflows/docs-update.md +6 -5
- package/gsd-core/workflows/edit-phase.md +3 -1
- package/gsd-core/workflows/eval-review.md +5 -10
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +129 -11
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +29 -5
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +4 -2
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +68 -66
- package/gsd-core/workflows/execute-plan.md +25 -20
- package/gsd-core/workflows/explore.md +3 -1
- package/gsd-core/workflows/extract-learnings.md +3 -1
- package/gsd-core/workflows/fast.md +8 -2
- package/gsd-core/workflows/forensics.md +3 -1
- package/gsd-core/workflows/graduation.md +6 -6
- package/gsd-core/workflows/health.md +4 -7
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +2 -0
- package/gsd-core/workflows/import.md +17 -14
- package/gsd-core/workflows/inbox.md +5 -6
- package/gsd-core/workflows/ingest-docs.md +45 -12
- package/gsd-core/workflows/insert-phase.md +7 -5
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +7 -3
- package/gsd-core/workflows/list-workspaces.md +3 -1
- package/gsd-core/workflows/manager.md +15 -26
- package/gsd-core/workflows/map-codebase.md +3 -1
- package/gsd-core/workflows/milestone-summary.md +3 -1
- package/gsd-core/workflows/mvp-phase.md +3 -3
- package/gsd-core/workflows/new-milestone.md +10 -22
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +17 -29
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +4 -2
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +20 -5
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +4 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +12 -3
- package/gsd-core/workflows/plan-phase.md +251 -54
- package/gsd-core/workflows/plan-review-convergence.md +148 -19
- package/gsd-core/workflows/plant-seed.md +3 -3
- package/gsd-core/workflows/pr-branch.md +195 -51
- package/gsd-core/workflows/profile-user.md +17 -15
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +52 -15
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +38 -5
- package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
- package/gsd-core/workflows/quick/steps/research-phase.md +5 -7
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +33 -32
- package/gsd-core/workflows/reapply-patches.md +2 -0
- package/gsd-core/workflows/remove-phase.md +6 -4
- package/gsd-core/workflows/remove-workspace.md +3 -3
- package/gsd-core/workflows/resume-project.md +14 -14
- package/gsd-core/workflows/review.md +404 -21
- package/gsd-core/workflows/scan.md +3 -1
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +9 -9
- package/gsd-core/workflows/settings-integrations.md +66 -32
- package/gsd-core/workflows/settings.md +4 -6
- package/gsd-core/workflows/ship.md +22 -16
- package/gsd-core/workflows/sketch-wrap-up.md +13 -17
- package/gsd-core/workflows/sketch.md +13 -19
- package/gsd-core/workflows/smart-entry.md +4 -6
- package/gsd-core/workflows/spec-phase.md +31 -4
- package/gsd-core/workflows/spike-wrap-up.md +9 -11
- package/gsd-core/workflows/spike.md +21 -32
- package/gsd-core/workflows/stats.md +4 -2
- package/gsd-core/workflows/sync-skills.md +13 -5
- package/gsd-core/workflows/thread.md +13 -7
- package/gsd-core/workflows/transition.md +7 -5
- package/gsd-core/workflows/ui-phase.md +36 -21
- package/gsd-core/workflows/ui-review.md +7 -11
- package/gsd-core/workflows/ultraplan-phase.md +7 -13
- package/gsd-core/workflows/undo.md +9 -17
- package/gsd-core/workflows/update.md +47 -48
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +106 -21
- package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +302 -22
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +77 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +46 -12
- package/hooks/dist/gsd-read-guard.js +18 -7
- package/hooks/dist/gsd-read-injection-scanner.js +22 -13
- package/hooks/dist/gsd-secret-read-guard.js +1079 -0
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +222 -29
- package/hooks/dist/gsd-validate-commit.sh +523 -12
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +36 -17
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/managed-hooks-registry.cjs +4 -0
- package/hooks/gsd-agent-isolation-guard.js +77 -38
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +302 -22
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +3 -1
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +28 -23
- package/hooks/gsd-cursor-subagent-stop.js +3 -1
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +77 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +46 -12
- package/hooks/gsd-read-guard.js +18 -7
- package/hooks/gsd-read-injection-scanner.js +22 -13
- package/hooks/gsd-secret-read-guard.js +1079 -0
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +222 -29
- package/hooks/gsd-validate-commit.sh +523 -12
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +36 -17
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/hooks.json +6 -0
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/managed-hooks-registry.cjs +4 -0
- package/package.json +14 -9
- package/scripts/base64-scan.sh +74 -12
- package/scripts/build-hooks.js +12 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +52 -12
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/docs-guard-registry.cjs +406 -0
- package/scripts/gen-capability-registry.cjs +8 -6
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-loop-host-contract.cjs +189 -4
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +32 -2
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +198 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +45 -14
- package/scripts/lint-phase-id-drift.cjs +133 -8
- package/scripts/lint-planning-prompt-drift.cjs +38 -1
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-removed-but-needed.cjs +184 -16
- package/scripts/lint-response-language-coverage.cjs +524 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-write-path-drift.cjs +337 -432
- package/scripts/lint-test-file-count.allowlist.json +124 -4
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +51 -64
- package/scripts/lint-vendored-deps.cjs +208 -35
- package/scripts/lint-workflow-shellcheck-baseline.json +1027 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +83 -14
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +22 -3
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -1
- package/skills/gsd-quick/SKILL.md +8 -4
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -109
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/state-write-path-drift-baseline.json +0 -19
|
@@ -7,26 +7,49 @@
|
|
|
7
7
|
* #3477 follow-up: gsd-core/bin/** is copied by the installer into trees
|
|
8
8
|
* that have NO node_modules, so it must carry zero external requires
|
|
9
9
|
* (local/no-external-require-in-bin, eslint-rules/no-external-require-in-bin.cjs).
|
|
10
|
-
*
|
|
11
|
-
* gsd-core/bin/lib/vendor/
|
|
10
|
+
* Third-party packages that gsd-core/bin/** needs at runtime are instead
|
|
11
|
+
* vendored verbatim under gsd-core/bin/lib/vendor/ — see
|
|
12
|
+
* gsd-core/bin/lib/vendor/README.md.
|
|
12
13
|
*
|
|
13
14
|
* A vendored artifact that silently drifts from its upstream package is
|
|
14
15
|
* just as dangerous as never vendoring it in the first place (a stale
|
|
15
16
|
* copy ships a different engine than the one actually reviewed/audited).
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
17
|
+
* #3881: this used to be a single hand-rolled check hardcoded to `re2js`.
|
|
18
|
+
* It is now table-driven (VENDORED below), so adding a second vendored
|
|
19
|
+
* package (js-yaml, #3881) does not require a second hardcoded block —
|
|
20
|
+
* that would violate ADR-3473 §8.3, "one implementation per rule."
|
|
21
|
+
*
|
|
22
|
+
* For each row in VENDORED, this guard fails CI when:
|
|
23
|
+
* 1. The vendored `.cjs` no longer matches its upstream `node_modules`
|
|
24
|
+
* build output byte-for-byte.
|
|
25
|
+
* 2. (upstream-verbatim twins only) The vendored `.d.cts` under
|
|
26
|
+
* gsd-core/bin/lib/vendor/ no longer matches its upstream
|
|
27
|
+
* `node_modules` `.d.cts` byte-for-byte.
|
|
28
|
+
* 3. (upstream-verbatim twins only) The source-side twin under
|
|
29
|
+
* src/vendor/ (which tsc needs to resolve types for a relative
|
|
30
|
+
* `./vendor/<pkg>.cjs` import — module resolution for a .cts source
|
|
31
|
+
* is relative to src/, not the output dir) no longer matches the
|
|
32
|
+
* vendored `.d.cts` under gsd-core/bin/lib/vendor/.
|
|
33
|
+
* 4. The package's version pinned in package.json `devDependencies` no
|
|
26
34
|
* longer matches the version actually installed at
|
|
27
|
-
* node_modules
|
|
35
|
+
* `node_modules/<pkg>/package.json` (read there, per the dispatch
|
|
28
36
|
* brief, rather than duplicating a second pin).
|
|
29
37
|
*
|
|
38
|
+
* Hand-authored twins (js-yaml.d.cts, #3881: js-yaml ships no type
|
|
39
|
+
* declarations upstream, so there is nothing to byte-compare) skip checks
|
|
40
|
+
* 2 and 3 (the byte-compares) — there is no upstream/bin-side counterpart
|
|
41
|
+
* to compare against, and that is deliberate rather than a gap in coverage.
|
|
42
|
+
* They get a DIFFERENT check instead (#3881 review, finding 4): every
|
|
43
|
+
* value-level export the twin DECLARES (`export function`/`export const`,
|
|
44
|
+
* not a type/interface) must be an actual own property of the vendored
|
|
45
|
+
* runtime module. `srcTwin` was previously read only inside the
|
|
46
|
+
* upstream-verbatim branch — for a hand-authored row it was declared and
|
|
47
|
+
* never consulted by anything, so a stale claim in the twin (a declared
|
|
48
|
+
* export that no longer exists at runtime, or the reverse) could drift
|
|
49
|
+
* silently. This is how a hand-authored twin's docblock/type surface could
|
|
50
|
+
* make a false claim about the runtime (ADR-3473 §8.1, finding 2) without
|
|
51
|
+
* this gate — or any other — ever catching it.
|
|
52
|
+
*
|
|
30
53
|
* Usage: node scripts/lint-vendored-deps.cjs
|
|
31
54
|
* Exit 0 when every vendored copy is fresh; 1 otherwise.
|
|
32
55
|
*/
|
|
@@ -37,10 +60,82 @@ const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
|
37
60
|
|
|
38
61
|
const ROOT = path.join(__dirname, '..');
|
|
39
62
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a path that may be either repo-relative (the shape every VENDORED
|
|
65
|
+
* row and CLI usage actually passes) or already absolute (the shape a test
|
|
66
|
+
* exercising drift against a scratch file outside the repo passes). Joining
|
|
67
|
+
* an absolute path onto ROOT via `path.join(ROOT, abs)` silently produces a
|
|
68
|
+
* nonsense path (Windows: crossing drive letters is not even representable
|
|
69
|
+
* as a relative join; POSIX: an absolute second segment wins but the result
|
|
70
|
+
* is coincidental, not correct) — this makes "absolute in, absolute out"
|
|
71
|
+
* explicit instead of relying on that coincidence.
|
|
72
|
+
* @param {string} p
|
|
73
|
+
* @returns {string}
|
|
74
|
+
*/
|
|
75
|
+
function resolvePath(p) {
|
|
76
|
+
return path.isAbsolute(p) ? p : path.join(ROOT, p);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* One row per vendored third-party package.
|
|
81
|
+
*
|
|
82
|
+
* @typedef {object} VendoredPackage
|
|
83
|
+
* @property {string} name npm package name, matches package.json devDependencies key
|
|
84
|
+
* @property {string} upstreamCjs path under node_modules/ to the upstream build artifact
|
|
85
|
+
* @property {string} vendoredCjs path under gsd-core/bin/lib/vendor/ to the vendored copy
|
|
86
|
+
* @property {string|null} upstreamDts path under node_modules/ to the upstream .d.cts/.d.ts, or
|
|
87
|
+
* null when upstream ships no types (forces hand-authored)
|
|
88
|
+
* @property {string|null} vendoredDts path under gsd-core/bin/lib/vendor/ to the vendored .d.cts,
|
|
89
|
+
* or null when there is no bin-side type twin
|
|
90
|
+
* @property {string|null} srcTwin path under src/vendor/ to the source-side type twin tsc
|
|
91
|
+
* resolves for a relative import from src/**, or null
|
|
92
|
+
* @property {'upstream-verbatim'|'hand-authored'} twinKind
|
|
93
|
+
* 'upstream-verbatim': srcTwin/vendoredDts are byte-compared
|
|
94
|
+
* against upstream and each other.
|
|
95
|
+
* 'hand-authored': no upstream counterpart exists, so the
|
|
96
|
+
* twin is excluded from the byte-compare (checks 2 and 3
|
|
97
|
+
* above are skipped for this row).
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/** @type {VendoredPackage[]} */
|
|
101
|
+
const VENDORED = [
|
|
102
|
+
{
|
|
103
|
+
name: 're2js',
|
|
104
|
+
upstreamCjs: 'node_modules/re2js/build/index.cjs',
|
|
105
|
+
vendoredCjs: 'gsd-core/bin/lib/vendor/re2js.cjs',
|
|
106
|
+
upstreamDts: 'node_modules/re2js/build/index.d.cts',
|
|
107
|
+
vendoredDts: 'gsd-core/bin/lib/vendor/re2js.d.cts',
|
|
108
|
+
srcTwin: 'src/vendor/re2js.d.cts',
|
|
109
|
+
twinKind: 'upstream-verbatim',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'js-yaml',
|
|
113
|
+
upstreamCjs: 'node_modules/js-yaml/dist/js-yaml.js',
|
|
114
|
+
vendoredCjs: 'gsd-core/bin/lib/vendor/js-yaml.cjs',
|
|
115
|
+
upstreamDts: null,
|
|
116
|
+
vendoredDts: null,
|
|
117
|
+
srcTwin: 'src/vendor/js-yaml.d.cts',
|
|
118
|
+
twinKind: 'hand-authored',
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Build the `cp` refresh command for one vendored package. Hand-authored
|
|
124
|
+
* twins have no upstream .d.ts to cp, so only the .cjs line is emitted for
|
|
125
|
+
* them; the twin itself must be refreshed by hand against the new API.
|
|
126
|
+
* @param {VendoredPackage} row
|
|
127
|
+
* @returns {string}
|
|
128
|
+
*/
|
|
129
|
+
function buildRefreshCommand(row) {
|
|
130
|
+
const parts = [`cp ${row.upstreamCjs} ${row.vendoredCjs}`];
|
|
131
|
+
if (row.twinKind === 'upstream-verbatim' && row.upstreamDts) {
|
|
132
|
+
if (row.vendoredDts) parts.push(`cp ${row.upstreamDts} ${row.vendoredDts}`);
|
|
133
|
+
if (row.srcTwin) parts.push(`cp ${row.upstreamDts} ${row.srcTwin}`);
|
|
134
|
+
}
|
|
135
|
+
return parts.join(' && ');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const REFRESH_COMMAND = VENDORED.map(buildRefreshCommand).join(' && ');
|
|
44
139
|
|
|
45
140
|
/**
|
|
46
141
|
* Compare two files byte-for-byte. Returns null when equal, or a short
|
|
@@ -50,8 +145,8 @@ const REFRESH_COMMAND =
|
|
|
50
145
|
* @returns {string | null}
|
|
51
146
|
*/
|
|
52
147
|
function compareFiles(relA, relB) {
|
|
53
|
-
const absA =
|
|
54
|
-
const absB =
|
|
148
|
+
const absA = resolvePath(relA);
|
|
149
|
+
const absB = resolvePath(relB);
|
|
55
150
|
if (!fs.existsSync(absA)) return `${relA} does not exist`;
|
|
56
151
|
if (!fs.existsSync(absB)) return `${relB} does not exist`;
|
|
57
152
|
const a = fs.readFileSync(absA);
|
|
@@ -70,44 +165,112 @@ function stripRangeOperator(spec) {
|
|
|
70
165
|
return String(spec || '').trim().replace(/^[\^~]|^>=|^<=|^>|^<|^=/, '').trim();
|
|
71
166
|
}
|
|
72
167
|
|
|
73
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Extract every value-level export name (`export function foo` / `export const
|
|
170
|
+
* foo`) declared in a hand-authored `.d.cts` twin. Deliberately excludes
|
|
171
|
+
* `export type`/`export interface` — those have no runtime existence to check
|
|
172
|
+
* against, so including them would only ever produce false failures.
|
|
173
|
+
* @param {string} dctsSource
|
|
174
|
+
* @returns {string[]}
|
|
175
|
+
*/
|
|
176
|
+
function declaredValueExports(dctsSource) {
|
|
177
|
+
const names = [];
|
|
178
|
+
const re = /^export\s+(?:function|const|class)\s+([A-Za-z_$][\w$]*)/gm;
|
|
179
|
+
let m;
|
|
180
|
+
while ((m = re.exec(dctsSource)) !== null) names.push(m[1]);
|
|
181
|
+
return names;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* #3881 review, finding 4: for a `hand-authored` twin, verify every value-level
|
|
186
|
+
* export it DECLARES is an actual own property of the vendored runtime module —
|
|
187
|
+
* the check `srcTwin` previously had no consumer for. Returns findings (empty
|
|
188
|
+
* when the twin's declared surface matches runtime reality).
|
|
189
|
+
* @param {VendoredPackage} row
|
|
190
|
+
* @returns {string[]}
|
|
191
|
+
*/
|
|
192
|
+
function checkHandAuthoredTwin(row) {
|
|
193
|
+
if (!row.srcTwin) return [`${row.name}: twinKind 'hand-authored' but srcTwin is null`];
|
|
194
|
+
const twinPath = resolvePath(row.srcTwin);
|
|
195
|
+
if (!fs.existsSync(twinPath)) return [`${row.srcTwin} does not exist`];
|
|
196
|
+
|
|
197
|
+
const declared = declaredValueExports(fs.readFileSync(twinPath, 'utf8'));
|
|
198
|
+
if (declared.length === 0) {
|
|
199
|
+
return [`${row.srcTwin} declares zero value-level exports — nothing for this twin to gate`];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const runtimeModule = require(resolvePath(row.vendoredCjs));
|
|
74
203
|
const findings = [];
|
|
204
|
+
for (const name of declared) {
|
|
205
|
+
if (!Object.prototype.hasOwnProperty.call(runtimeModule, name)) {
|
|
206
|
+
findings.push(
|
|
207
|
+
`${row.srcTwin} declares export "${name}" — not an own property of ${row.vendoredCjs} at runtime`,
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return findings;
|
|
212
|
+
}
|
|
75
213
|
|
|
76
|
-
|
|
77
|
-
|
|
214
|
+
/**
|
|
215
|
+
* Run all applicable freshness checks for one vendored package row.
|
|
216
|
+
* @param {VendoredPackage} row
|
|
217
|
+
* @returns {string[]} findings (empty when the row is fresh)
|
|
218
|
+
*/
|
|
219
|
+
function checkRow(row) {
|
|
220
|
+
const findings = [];
|
|
78
221
|
|
|
79
|
-
const
|
|
80
|
-
if (
|
|
222
|
+
const cjsDrift = compareFiles(row.vendoredCjs, row.upstreamCjs);
|
|
223
|
+
if (cjsDrift) findings.push(cjsDrift);
|
|
81
224
|
|
|
82
|
-
|
|
83
|
-
|
|
225
|
+
if (row.twinKind === 'upstream-verbatim') {
|
|
226
|
+
if (row.upstreamDts && row.vendoredDts) {
|
|
227
|
+
const dctsDrift = compareFiles(row.vendoredDts, row.upstreamDts);
|
|
228
|
+
if (dctsDrift) findings.push(dctsDrift);
|
|
229
|
+
}
|
|
230
|
+
if (row.srcTwin && row.vendoredDts) {
|
|
231
|
+
const srcTwinDrift = compareFiles(row.srcTwin, row.vendoredDts);
|
|
232
|
+
if (srcTwinDrift) findings.push(srcTwinDrift);
|
|
233
|
+
}
|
|
234
|
+
} else if (row.twinKind === 'hand-authored') {
|
|
235
|
+
findings.push(...checkHandAuthoredTwin(row));
|
|
236
|
+
}
|
|
84
237
|
|
|
85
238
|
const pkgPath = path.join(ROOT, 'package.json');
|
|
86
239
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
87
|
-
const pinnedSpec = pkg.devDependencies && pkg.devDependencies.
|
|
240
|
+
const pinnedSpec = pkg.devDependencies && pkg.devDependencies[row.name];
|
|
88
241
|
if (!pinnedSpec) {
|
|
89
|
-
findings.push(
|
|
242
|
+
findings.push(`package.json devDependencies.${row.name} is missing`);
|
|
90
243
|
} else {
|
|
91
|
-
const installedPkgPath = path.join(ROOT, 'node_modules',
|
|
244
|
+
const installedPkgPath = path.join(ROOT, 'node_modules', row.name, 'package.json');
|
|
92
245
|
if (!fs.existsSync(installedPkgPath)) {
|
|
93
|
-
findings.push(
|
|
246
|
+
findings.push(`node_modules/${row.name}/package.json does not exist (run npm install)`);
|
|
94
247
|
} else {
|
|
95
248
|
const installed = JSON.parse(fs.readFileSync(installedPkgPath, 'utf8'));
|
|
96
249
|
const pinned = stripRangeOperator(pinnedSpec);
|
|
97
250
|
if (pinned !== installed.version) {
|
|
98
251
|
findings.push(
|
|
99
|
-
`package.json devDependencies.
|
|
100
|
-
+ `node_modules/
|
|
252
|
+
`package.json devDependencies.${row.name} ("${pinnedSpec}" -> "${pinned}") != `
|
|
253
|
+
+ `node_modules/${row.name}/package.json version ("${installed.version}")`,
|
|
101
254
|
);
|
|
102
255
|
}
|
|
103
256
|
}
|
|
104
257
|
}
|
|
105
258
|
|
|
259
|
+
return findings;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function main() {
|
|
263
|
+
const findings = [];
|
|
264
|
+
for (const row of VENDORED) {
|
|
265
|
+
findings.push(...checkRow(row));
|
|
266
|
+
}
|
|
267
|
+
|
|
106
268
|
if (findings.length > 0) {
|
|
107
269
|
const detail = findings.map((f) => ` ${f}`).join('\n');
|
|
270
|
+
const names = VENDORED.map((row) => row.name).join(', ');
|
|
108
271
|
throw new ExitError(
|
|
109
272
|
1,
|
|
110
|
-
|
|
273
|
+
`lint-vendored-deps: gsd-core/bin/lib/vendor/{${names}} has drifted from its\n`
|
|
111
274
|
+ 'upstream package (or its version pin). Refresh with:\n'
|
|
112
275
|
+ ` ${REFRESH_COMMAND}\n`
|
|
113
276
|
+ 'Findings:\n'
|
|
@@ -115,10 +278,20 @@ function main() {
|
|
|
115
278
|
);
|
|
116
279
|
}
|
|
117
280
|
|
|
118
|
-
|
|
281
|
+
const names = VENDORED.map((row) => row.name).join(', ');
|
|
282
|
+
process.stdout.write(`ok lint-vendored-deps: gsd-core/bin/lib/vendor/{${names}} match node_modules and their pinned versions\n`);
|
|
119
283
|
return 0;
|
|
120
284
|
}
|
|
121
285
|
|
|
122
286
|
if (require.main === module) runMain(main);
|
|
123
287
|
|
|
124
|
-
module.exports = {
|
|
288
|
+
module.exports = {
|
|
289
|
+
compareFiles,
|
|
290
|
+
stripRangeOperator,
|
|
291
|
+
VENDORED,
|
|
292
|
+
buildRefreshCommand,
|
|
293
|
+
checkRow,
|
|
294
|
+
declaredValueExports,
|
|
295
|
+
checkHandAuthoredTwin,
|
|
296
|
+
resolvePath,
|
|
297
|
+
};
|