@opengsd/gsd-core 1.9.1 → 1.11.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 +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* lint-removed-but-needed.cjs — DEFECT.REMOVED-BUT-NEEDED (CONTEXT.md).
|
|
6
|
+
*
|
|
7
|
+
* ## Why
|
|
8
|
+
*
|
|
9
|
+
* A file/key gets removed because "no longer used" without verifying every
|
|
10
|
+
* consumer (workflows, docs, manifests, npm scripts, tests). #3316: root
|
|
11
|
+
* `package-lock.json` was deleted while `package.json` still declares deps
|
|
12
|
+
* and workflows still use `cache: 'npm'` + `npm ci` (which require a
|
|
13
|
+
* lockfile). e3b52c70: docs referenced a removed `/gsd-new-workspace`
|
|
14
|
+
* workflow after it was deleted. #3560: a deleted workflow was pinned by an
|
|
15
|
+
* existence assertion in `tests/phase.test.cjs` — the lint passed clean and
|
|
16
|
+
* the breakage surfaced only as four red tests on the remote runner,
|
|
17
|
+
* because `tests/` was not scanned at all.
|
|
18
|
+
*
|
|
19
|
+
* ## What this checks
|
|
20
|
+
*
|
|
21
|
+
* For every file deleted (`git diff --name-status <base>...HEAD`, status
|
|
22
|
+
* `D`), grep the post-diff tree for the deleted file's basename:
|
|
23
|
+
*
|
|
24
|
+
* - `.github/workflows/`, `gsd-core/`, `docs/`, `package.json` — ANY
|
|
25
|
+
* surviving reference fails (the original rule).
|
|
26
|
+
* - `tests/` — scanned with a discriminator (#3565): a reference that PINS
|
|
27
|
+
* existence (`fs.existsSync(path)`, `readFileSync`, `require`, or the
|
|
28
|
+
* basename as a quoted object key) fails; a reference that ASSERTS
|
|
29
|
+
* ABSENCE (`assert.ok(!content.includes('x.md'))`, `!fs.existsSync(...)`)
|
|
30
|
+
* is the correct post-deletion state and passes. The naive widening —
|
|
31
|
+
* flagging every mention — was tried in #3560 and reverted: an absence
|
|
32
|
+
* assertion must contain the basename to assert the file is gone, so
|
|
33
|
+
* without the two kinds separated the guard fires on correct code and
|
|
34
|
+
* gets disabled. A mention that is neither a pin nor an absence
|
|
35
|
+
* assertion (prose, a path assembled on another line) is not flagged —
|
|
36
|
+
* a documented known limit, chosen because a false violation reds a
|
|
37
|
+
* correct tree while a missed prose mention only loses one detection
|
|
38
|
+
* channel.
|
|
39
|
+
*
|
|
40
|
+
* `package-lock.json` deletions additionally fail if any workflow still
|
|
41
|
+
* uses `npm ci` or `cache: 'npm'`/`cache: "npm"` — those depend on a
|
|
42
|
+
* lockfile even though they never spell out its filename.
|
|
43
|
+
*
|
|
44
|
+
* ## False-positive risk (moderate, per audit)
|
|
45
|
+
*
|
|
46
|
+
* A common basename (`index.js`, `config.json`) can coincidentally match an
|
|
47
|
+
* unrelated file, and this only catches LITERAL string references — not a
|
|
48
|
+
* variable holding the filename or a glob that happened to match it.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
const fs = require('node:fs');
|
|
52
|
+
const path = require('node:path');
|
|
53
|
+
const cp = require('node:child_process');
|
|
54
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
55
|
+
const { escapeRegex } = require('../gsd-core/bin/lib/pattern.cjs');
|
|
56
|
+
const { sanitizeEcho } = require('./command-contract-helpers.cjs');
|
|
57
|
+
|
|
58
|
+
const ROOT = path.join(__dirname, '..');
|
|
59
|
+
const SCAN_ROOTS = ['.github/workflows', 'gsd-core', 'docs'];
|
|
60
|
+
const EXTRA_FILES = ['package.json'];
|
|
61
|
+
const TESTS_ROOT = 'tests';
|
|
62
|
+
|
|
63
|
+
// Skip these when walking SCAN_ROOTS — binary/generated content that can
|
|
64
|
+
// never carry a meaningful basename reference, and is often large.
|
|
65
|
+
const SKIP_EXT = new Set(['.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2', '.ttf', '.zip']);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Pure: does `content` contain a literal reference to `basename`, delimited
|
|
69
|
+
* by non-identifier/non-path characters on both sides (so "foo.json" doesn't
|
|
70
|
+
* match inside "old-foo.json.bak" style names but does match in a normal
|
|
71
|
+
* path/prose context)?
|
|
72
|
+
* @param {string} content
|
|
73
|
+
* @param {string} basename
|
|
74
|
+
* @returns {boolean}
|
|
75
|
+
*/
|
|
76
|
+
function referencesBasename(content, basename) {
|
|
77
|
+
const re = new RegExp(`(^|[^\\w.-])${escapeRegex(basename)}($|[^\\w.-])`);
|
|
78
|
+
return re.test(content);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Pure: given the deleted file's basename, does content contain a
|
|
83
|
+
* lockfile-dependent idiom (`npm ci`, `cache: 'npm'` / `cache: "npm"`)?
|
|
84
|
+
* Only meaningful for package-lock.json deletions.
|
|
85
|
+
* @param {string} content
|
|
86
|
+
* @returns {boolean}
|
|
87
|
+
*/
|
|
88
|
+
function referencesNpmLockfileDependency(content) {
|
|
89
|
+
return /\bnpm ci\b/.test(content) || /cache:\s*['"]npm['"]/.test(content);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function walk(dir) {
|
|
93
|
+
const out = [];
|
|
94
|
+
let entries;
|
|
95
|
+
try {
|
|
96
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
97
|
+
} catch {
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
const full = path.join(dir, entry.name);
|
|
102
|
+
if (entry.isDirectory()) out.push(...walk(full));
|
|
103
|
+
else if (entry.isFile() && !SKIP_EXT.has(path.extname(entry.name))) out.push(full);
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Pure: given a list of deleted basenames and a `{ file, content }[]` corpus
|
|
110
|
+
* of the post-diff tree, find every surviving reference.
|
|
111
|
+
* @param {string[]} deletedFiles - repo-relative deleted paths
|
|
112
|
+
* @param {{ file: string, content: string }[]} corpus
|
|
113
|
+
* @returns {{ deletedFile: string, referencedIn: string, reason: string }[]}
|
|
114
|
+
*/
|
|
115
|
+
function findSurvivingReferences(deletedFiles, corpus) {
|
|
116
|
+
const violations = [];
|
|
117
|
+
for (const deletedFile of deletedFiles) {
|
|
118
|
+
const basename = path.basename(deletedFile);
|
|
119
|
+
for (const { file, content } of corpus) {
|
|
120
|
+
if (referencesBasename(content, basename)) {
|
|
121
|
+
violations.push({ deletedFile, referencedIn: file, reason: `basename '${basename}' still referenced` });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (basename === 'package-lock.json') {
|
|
125
|
+
for (const { file, content } of corpus) {
|
|
126
|
+
if (file.startsWith('.github/workflows') && referencesNpmLockfileDependency(content)) {
|
|
127
|
+
violations.push({
|
|
128
|
+
deletedFile,
|
|
129
|
+
referencedIn: file,
|
|
130
|
+
reason: '`npm ci` / `cache: \'npm\'` still present — both require a lockfile',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return violations;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Pure: classify ONE line of a test file that references `basename`.
|
|
141
|
+
* Returns 'asserts-absence' | 'pins-existence' | null.
|
|
142
|
+
*
|
|
143
|
+
* - asserts-absence: a NEGATED check carrying the basename —
|
|
144
|
+
* `assert.ok(!content.includes('x.md'))`, `!fs.existsSync(p)`,
|
|
145
|
+
* `!/x\.md/.test(s)`. The basename must appear for the assertion to
|
|
146
|
+
* work, so this is the CORRECT post-deletion state (#3560's reverted
|
|
147
|
+
* naive widening fired exactly here).
|
|
148
|
+
* - pins-existence: a direct dependency on the file existing —
|
|
149
|
+
* `fs.existsSync/readFileSync/statSync/readdirSync/require(...)` on the
|
|
150
|
+
* same line, or the basename as a quoted object key (`'x.md': ...`,
|
|
151
|
+
* the allowlist trap — a key means the test resolves against the file).
|
|
152
|
+
* - null: neither (prose mention, path assembled on another line). Not a
|
|
153
|
+
* violation — see the header's known-limit note.
|
|
154
|
+
*
|
|
155
|
+
* @param {string} line
|
|
156
|
+
* @param {string} basename
|
|
157
|
+
* @returns {'asserts-absence'|'pins-existence'|null}
|
|
158
|
+
*/
|
|
159
|
+
function classifyTestReference(line, basename) {
|
|
160
|
+
const negatedCheck =
|
|
161
|
+
/!\s*[A-Za-z_$][\w.$]*\.(includes|indexOf|search|startsWith|endsWith|match)\s*\(/.test(line) ||
|
|
162
|
+
/!\s*(fs\.)?(existsSync|statSync)\s*\(/.test(line) ||
|
|
163
|
+
// [^/\n]* (not .*) so an adversarial line cannot backtrack the regex
|
|
164
|
+
/!\s*\/[^/\n]*\/\s*\.(test|match)\s*\(/.test(line);
|
|
165
|
+
if (negatedCheck) return 'asserts-absence';
|
|
166
|
+
const pinsByCall =
|
|
167
|
+
/\b(existsSync|readFileSync|statSync|readdirSync|require|accessSync)\s*\(/.test(line) ||
|
|
168
|
+
/\brequire\s*\(?['"]/.test(line);
|
|
169
|
+
if (pinsByCall) return 'pins-existence';
|
|
170
|
+
// Template literal needs \\s so the RegExp constructor receives \s — a
|
|
171
|
+
// bare \s in a template literal collapses to 's' and silently matches a
|
|
172
|
+
// literal 's' instead of whitespace.
|
|
173
|
+
if (new RegExp(`['"\`]${escapeRegex(basename)}['"\`]\\s*:`).test(line)) return 'pins-existence';
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Pure: for every deleted basename, scan the tests corpus line by line and
|
|
179
|
+
* report each `pins-existence` reference as a violation. `asserts-absence`
|
|
180
|
+
* references are explicitly NOT violations; unclassifiable mentions are
|
|
181
|
+
* skipped (known limit). Violations are per-reference — one test file
|
|
182
|
+
* carrying both an absence assertion and an existence pin reports the pin.
|
|
183
|
+
*
|
|
184
|
+
* @param {string[]} deletedFiles - repo-relative deleted paths
|
|
185
|
+
* @param {{ file: string, content: string }[]} testsCorpus
|
|
186
|
+
* @returns {{ deletedFile: string, referencedIn: string, reason: string }[]}
|
|
187
|
+
*/
|
|
188
|
+
function findSurvivingTestReferences(deletedFiles, testsCorpus) {
|
|
189
|
+
const violations = [];
|
|
190
|
+
for (const deletedFile of deletedFiles) {
|
|
191
|
+
const basename = path.basename(deletedFile);
|
|
192
|
+
const refRe = new RegExp(`(^|[^\\w.-])${escapeRegex(basename)}($|[^\\w.-])`);
|
|
193
|
+
for (const { file, content } of testsCorpus) {
|
|
194
|
+
for (const line of content.split(/\r?\n/)) {
|
|
195
|
+
if (!refRe.test(line)) continue;
|
|
196
|
+
const kind = classifyTestReference(line, basename);
|
|
197
|
+
if (kind === 'pins-existence') {
|
|
198
|
+
violations.push({
|
|
199
|
+
deletedFile,
|
|
200
|
+
referencedIn: file,
|
|
201
|
+
// control-char-stripped + capped: this text is echoed into lint
|
|
202
|
+
// output that AI agents read as trusted instructions
|
|
203
|
+
reason: `pins-existence: test depends on deleted basename '${basename}' — ${sanitizeEcho(line.trim())}`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// 'asserts-absence' is correct post-deletion state; null is a
|
|
207
|
+
// documented known limit — neither is a violation.
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return violations;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function getDeletedFiles(root, baseRef) {
|
|
215
|
+
// Deliberately let a git failure (unresolvable ref, no merge base, etc.)
|
|
216
|
+
// propagate as a plain Error — main() treats ANY scan() failure as "cannot
|
|
217
|
+
// resolve this base ref in this environment" and degrades to a skip,
|
|
218
|
+
// matching lint-fix-has-regression-test.cjs. There is no failure mode here
|
|
219
|
+
// that should hard-exit non-zero; a real drift is only ever reported once
|
|
220
|
+
// the diff succeeds and findSurvivingReferences finds a violation.
|
|
221
|
+
const out = cp.execFileSync('git', ['diff', '--name-status', `${baseRef}...HEAD`], {
|
|
222
|
+
cwd: root,
|
|
223
|
+
encoding: 'utf8',
|
|
224
|
+
timeout: 15000,
|
|
225
|
+
});
|
|
226
|
+
return out
|
|
227
|
+
.trim()
|
|
228
|
+
.split('\n')
|
|
229
|
+
.filter(Boolean)
|
|
230
|
+
.filter((line) => line.startsWith('D\t'))
|
|
231
|
+
.map((line) => line.slice(2));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function buildCorpus(root) {
|
|
235
|
+
const corpus = [];
|
|
236
|
+
for (const rel of SCAN_ROOTS) {
|
|
237
|
+
for (const abs of walk(path.join(root, rel))) {
|
|
238
|
+
try {
|
|
239
|
+
corpus.push({ file: path.relative(root, abs).replace(/\\/g, '/'), content: fs.readFileSync(abs, 'utf8') });
|
|
240
|
+
} catch {
|
|
241
|
+
// unreadable (broken symlink, binary that slipped past SKIP_EXT) — skip
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
for (const rel of EXTRA_FILES) {
|
|
246
|
+
const abs = path.join(root, rel);
|
|
247
|
+
try {
|
|
248
|
+
corpus.push({ file: rel, content: fs.readFileSync(abs, 'utf8') });
|
|
249
|
+
} catch {
|
|
250
|
+
// optional file absent — skip
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return corpus;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function scan(root, baseRef) {
|
|
257
|
+
const deletedFiles = getDeletedFiles(root, baseRef);
|
|
258
|
+
if (deletedFiles.length === 0) return [];
|
|
259
|
+
const corpus = buildCorpus(root);
|
|
260
|
+
const violations = findSurvivingReferences(deletedFiles, corpus);
|
|
261
|
+
// tests/ arm (#3565): same deletions, discriminated references. A bare
|
|
262
|
+
// mention that pins nothing is skipped; an absence assertion is the
|
|
263
|
+
// correct post-deletion state; only a pin on a deleted file fails.
|
|
264
|
+
const testsCorpus = [];
|
|
265
|
+
for (const abs of walk(path.join(root, TESTS_ROOT))) {
|
|
266
|
+
try {
|
|
267
|
+
testsCorpus.push({
|
|
268
|
+
file: path.relative(root, abs).replace(/\\/g, '/'),
|
|
269
|
+
content: fs.readFileSync(abs, 'utf8'),
|
|
270
|
+
});
|
|
271
|
+
} catch {
|
|
272
|
+
// unreadable (broken symlink, binary that slipped past SKIP_EXT) — skip
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
violations.push(...findSurvivingTestReferences(deletedFiles, testsCorpus));
|
|
276
|
+
return violations;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function main() {
|
|
280
|
+
const baseRef = `origin/${process.env.GSD_REMOVED_BUT_NEEDED_BASE || process.env.GITHUB_BASE_REF || 'next'}`;
|
|
281
|
+
let violations;
|
|
282
|
+
try {
|
|
283
|
+
violations = scan(ROOT, baseRef);
|
|
284
|
+
} catch (e) {
|
|
285
|
+
// origin/<base> unreachable in this environment (e.g. a shallow local
|
|
286
|
+
// clone with no matching remote-tracking ref) — degrade to a skip rather
|
|
287
|
+
// than a false failure, matching lint-fix-has-regression-test.cjs.
|
|
288
|
+
console.log(`lint-removed-but-needed: could not resolve ${baseRef}, skipping (${e.message})`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (violations.length > 0) {
|
|
292
|
+
const detail = violations
|
|
293
|
+
.map((v) => ` ${v.deletedFile} deleted, but still referenced in ${v.referencedIn}: ${v.reason}`)
|
|
294
|
+
.join('\n');
|
|
295
|
+
throw new ExitError(
|
|
296
|
+
1,
|
|
297
|
+
'lint-removed-but-needed: a deleted file is still referenced by a live consumer\n'
|
|
298
|
+
+ '(DEFECT.REMOVED-BUT-NEEDED). Either restore the file or update every consumer in the\n'
|
|
299
|
+
+ 'same commit — do not paper over with a workaround that loses reproducibility:\n'
|
|
300
|
+
+ detail,
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
console.log('ok lint-removed-but-needed: no deleted file has a surviving reference');
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
module.exports = {
|
|
307
|
+
referencesBasename,
|
|
308
|
+
referencesNpmLockfileDependency,
|
|
309
|
+
findSurvivingReferences,
|
|
310
|
+
classifyTestReference,
|
|
311
|
+
findSurvivingTestReferences,
|
|
312
|
+
getDeletedFiles,
|
|
313
|
+
buildCorpus,
|
|
314
|
+
scan,
|
|
315
|
+
SCAN_ROOTS,
|
|
316
|
+
EXTRA_FILES,
|
|
317
|
+
TESTS_ROOT,
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
if (require.main === module) runMain(main);
|