@therocketcode/gsd-core 1.4.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/plugin.json +23 -0
- package/GEMINI.md +53 -0
- package/LICENSE +21 -0
- package/README.ja-JP.md +125 -0
- package/README.ko-KR.md +125 -0
- package/README.md +144 -0
- package/README.pt-BR.md +125 -0
- package/README.zh-CN.md +125 -0
- package/agents/gsd-advisor-researcher.md +108 -0
- package/agents/gsd-ai-researcher.md +114 -0
- package/agents/gsd-assumptions-analyzer.md +105 -0
- package/agents/gsd-code-fixer.md +668 -0
- package/agents/gsd-code-reviewer.md +387 -0
- package/agents/gsd-codebase-mapper.md +853 -0
- package/agents/gsd-debug-session-manager.md +314 -0
- package/agents/gsd-debugger.md +1452 -0
- package/agents/gsd-doc-classifier.md +168 -0
- package/agents/gsd-doc-synthesizer.md +204 -0
- package/agents/gsd-doc-verifier.md +217 -0
- package/agents/gsd-doc-writer.md +616 -0
- package/agents/gsd-domain-researcher.md +147 -0
- package/agents/gsd-eval-auditor.md +191 -0
- package/agents/gsd-eval-planner.md +154 -0
- package/agents/gsd-executor.md +785 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +342 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +867 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1204 -0
- package/agents/gsd-project-researcher.md +611 -0
- package/agents/gsd-research-synthesizer.md +259 -0
- package/agents/gsd-roadmapper.md +688 -0
- package/agents/gsd-security-auditor.md +155 -0
- package/agents/gsd-ui-auditor.md +495 -0
- package/agents/gsd-ui-checker.md +309 -0
- package/agents/gsd-ui-researcher.md +374 -0
- package/agents/gsd-user-profiler.md +171 -0
- package/agents/gsd-verifier.md +923 -0
- package/assets/gsd-logo-2000-transparent.png +0 -0
- package/assets/gsd-logo-2000-transparent.svg +17 -0
- package/assets/gsd-logo-2000.png +0 -0
- package/assets/gsd-logo-2000.svg +21 -0
- package/assets/terminal.svg +68 -0
- package/bin/install.js +12726 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/gsd/add-tests.md +42 -0
- package/commands/gsd/ai-integration-phase.md +37 -0
- package/commands/gsd/audit-fix.md +34 -0
- package/commands/gsd/audit-milestone.md +37 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +48 -0
- package/commands/gsd/capture.md +62 -0
- package/commands/gsd/cleanup.md +24 -0
- package/commands/gsd/code-review.md +59 -0
- package/commands/gsd/complete-milestone.md +143 -0
- package/commands/gsd/config.md +56 -0
- package/commands/gsd/debug.md +52 -0
- package/commands/gsd/discover-product.md +65 -0
- package/commands/gsd/discuss-phase.md +77 -0
- package/commands/gsd/docs-update.md +49 -0
- package/commands/gsd/eval-review.md +33 -0
- package/commands/gsd/execute-phase.md +66 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract-learnings.md +23 -0
- package/commands/gsd/fast.md +31 -0
- package/commands/gsd/forensics.md +57 -0
- package/commands/gsd/graphify.md +204 -0
- package/commands/gsd/health.md +31 -0
- package/commands/gsd/help.md +28 -0
- package/commands/gsd/import.md +45 -0
- package/commands/gsd/inbox.md +39 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/manager.md +45 -0
- package/commands/gsd/map-codebase.md +83 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/model-domain.md +65 -0
- package/commands/gsd/mvp-phase.md +45 -0
- package/commands/gsd/new-milestone.md +45 -0
- package/commands/gsd/new-project.md +47 -0
- package/commands/gsd/ns-context.md +23 -0
- package/commands/gsd/ns-ideate.md +24 -0
- package/commands/gsd/ns-manage.md +29 -0
- package/commands/gsd/ns-project.md +22 -0
- package/commands/gsd/ns-review.md +26 -0
- package/commands/gsd/ns-workflow.md +28 -0
- package/commands/gsd/pause-work.md +43 -0
- package/commands/gsd/phase.md +56 -0
- package/commands/gsd/plan-phase.md +64 -0
- package/commands/gsd/plan-review-convergence.md +59 -0
- package/commands/gsd/pr-branch.md +26 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +48 -0
- package/commands/gsd/quick.md +174 -0
- package/commands/gsd/recommend-architecture.md +64 -0
- package/commands/gsd/resume-work.md +30 -0
- package/commands/gsd/review-backlog.md +63 -0
- package/commands/gsd/review.md +42 -0
- package/commands/gsd/secure-phase.md +36 -0
- package/commands/gsd/settings.md +29 -0
- package/commands/gsd/ship.md +24 -0
- package/commands/gsd/sketch.md +60 -0
- package/commands/gsd/spec-phase.md +63 -0
- package/commands/gsd/spike.md +57 -0
- package/commands/gsd/stats.md +20 -0
- package/commands/gsd/surface.md +155 -0
- package/commands/gsd/testing-strategy.md +65 -0
- package/commands/gsd/thread.md +24 -0
- package/commands/gsd/ui-phase.md +35 -0
- package/commands/gsd/ui-review.md +33 -0
- package/commands/gsd/ultraplan-phase.md +34 -0
- package/commands/gsd/undo.md +35 -0
- package/commands/gsd/update.md +49 -0
- package/commands/gsd/validate-phase.md +36 -0
- package/commands/gsd/verify-work.md +39 -0
- package/commands/gsd/workspace.md +52 -0
- package/commands/gsd/workstreams.md +70 -0
- package/gemini-extension.json +6 -0
- package/gsd-core/bin/check-latest-version.cjs +161 -0
- package/gsd-core/bin/gsd-tools.cjs +1928 -0
- package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
- package/gsd-core/bin/lib/adr-parser.cjs +399 -0
- package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
- package/gsd-core/bin/lib/artifacts.cjs +51 -0
- package/gsd-core/bin/lib/audit.cjs +743 -0
- package/gsd-core/bin/lib/check-command-router.cjs +343 -0
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/gsd-core/bin/lib/cli-exit.cjs +42 -0
- package/gsd-core/bin/lib/clock.cjs +95 -0
- package/gsd-core/bin/lib/clusters.cjs +132 -0
- package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
- package/gsd-core/bin/lib/command-aliases.cjs +809 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
- package/gsd-core/bin/lib/commands.cjs +1203 -0
- package/gsd-core/bin/lib/config-schema.cjs +29 -0
- package/gsd-core/bin/lib/config-types.cjs +19 -0
- package/gsd-core/bin/lib/config.cjs +738 -0
- package/gsd-core/bin/lib/configuration.cjs +239 -0
- package/gsd-core/bin/lib/context-utilization.cjs +48 -0
- package/gsd-core/bin/lib/core.cjs +2051 -0
- package/gsd-core/bin/lib/decisions.cjs +118 -0
- package/gsd-core/bin/lib/docs.cjs +252 -0
- package/gsd-core/bin/lib/drift.cjs +364 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
- package/gsd-core/bin/lib/frontmatter.cjs +442 -0
- package/gsd-core/bin/lib/gap-checker.cjs +257 -0
- package/gsd-core/bin/lib/graphify.cjs +496 -0
- package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
- package/gsd-core/bin/lib/init-command-router.cjs +62 -0
- package/gsd-core/bin/lib/init.cjs +1815 -0
- package/gsd-core/bin/lib/install-profiles.cjs +584 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +350 -0
- package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
- package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
- package/gsd-core/bin/lib/intel.cjs +590 -0
- package/gsd-core/bin/lib/learnings.cjs +270 -0
- package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/gsd-core/bin/lib/milestone.cjs +373 -0
- package/gsd-core/bin/lib/model-catalog.cjs +154 -0
- package/gsd-core/bin/lib/model-profiles.cjs +24 -0
- package/gsd-core/bin/lib/observability/event.cjs +51 -0
- package/gsd-core/bin/lib/observability/logger.cjs +146 -0
- package/gsd-core/bin/lib/observability/redaction.cjs +48 -0
- package/gsd-core/bin/lib/package-identity.cjs +35 -0
- package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
- package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
- package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/gsd-core/bin/lib/phase.cjs +1307 -0
- package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
- package/gsd-core/bin/lib/plan-scan.cjs +91 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
- package/gsd-core/bin/lib/profile-output.cjs +1120 -0
- package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
- package/gsd-core/bin/lib/project-root.cjs +119 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
- package/gsd-core/bin/lib/research-provider.cjs +137 -0
- package/gsd-core/bin/lib/research-store.cjs +167 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +476 -0
- package/gsd-core/bin/lib/roadmap.cjs +600 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
- package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
- package/gsd-core/bin/lib/schema-detect.cjs +159 -0
- package/gsd-core/bin/lib/secrets.cjs +34 -0
- package/gsd-core/bin/lib/security.cjs +480 -0
- package/gsd-core/bin/lib/semver-compare.cjs +42 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
- package/gsd-core/bin/lib/state-command-router.cjs +160 -0
- package/gsd-core/bin/lib/state-document.cjs +259 -0
- package/gsd-core/bin/lib/state.cjs +2010 -0
- package/gsd-core/bin/lib/surface.cjs +449 -0
- package/gsd-core/bin/lib/task-command-router.cjs +85 -0
- package/gsd-core/bin/lib/template.cjs +237 -0
- package/gsd-core/bin/lib/uat.cjs +297 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/gsd-core/bin/lib/update-context.cjs +218 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
- package/gsd-core/bin/lib/validate.cjs +112 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +31 -0
- package/gsd-core/bin/lib/verification.cjs +193 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
- package/gsd-core/bin/lib/verify.cjs +1451 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
- package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
- package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
- package/gsd-core/bin/lib/workstream.cjs +380 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
- package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
- package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
- package/gsd-core/bin/shared/model-catalog.json +149 -0
- package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
- package/gsd-core/contexts/dev.md +21 -0
- package/gsd-core/contexts/research.md +22 -0
- package/gsd-core/contexts/review.md +23 -0
- package/gsd-core/references/agent-contracts.md +79 -0
- package/gsd-core/references/ai-evals.md +156 -0
- package/gsd-core/references/ai-frameworks.md +186 -0
- package/gsd-core/references/architecture-decision.md +74 -0
- package/gsd-core/references/artifact-types.md +131 -0
- package/gsd-core/references/auth-in-tests.md +91 -0
- package/gsd-core/references/autonomous-smart-discuss.md +277 -0
- package/gsd-core/references/checkpoints.md +814 -0
- package/gsd-core/references/common-bug-patterns.md +114 -0
- package/gsd-core/references/context-budget.md +85 -0
- package/gsd-core/references/continuation-format.md +253 -0
- package/gsd-core/references/db-test-isolation.md +54 -0
- package/gsd-core/references/debugger-philosophy.md +76 -0
- package/gsd-core/references/decimal-phase-calculation.md +64 -0
- package/gsd-core/references/doc-conflict-engine.md +91 -0
- package/gsd-core/references/domain-modeling.md +80 -0
- package/gsd-core/references/domain-probes.md +125 -0
- package/gsd-core/references/e2e-tiering.md +35 -0
- package/gsd-core/references/execute-mvp-tdd.md +81 -0
- package/gsd-core/references/executor-examples.md +110 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
- package/gsd-core/references/few-shot-examples/verifier.md +109 -0
- package/gsd-core/references/flaky-test-checklist.md +22 -0
- package/gsd-core/references/gate-prompts.md +100 -0
- package/gsd-core/references/gates.md +70 -0
- package/gsd-core/references/git-integration.md +298 -0
- package/gsd-core/references/git-planning-commit.md +40 -0
- package/gsd-core/references/ios-scaffold.md +123 -0
- package/gsd-core/references/mandatory-initial-read.md +2 -0
- package/gsd-core/references/model-profile-resolution.md +38 -0
- package/gsd-core/references/model-profiles.md +245 -0
- package/gsd-core/references/mvp-concepts.md +49 -0
- package/gsd-core/references/phase-argument-parsing.md +61 -0
- package/gsd-core/references/planner-antipatterns.md +89 -0
- package/gsd-core/references/planner-chunked.md +49 -0
- package/gsd-core/references/planner-gap-closure.md +62 -0
- package/gsd-core/references/planner-graphify-auto-update.md +67 -0
- package/gsd-core/references/planner-human-verify-mode.md +57 -0
- package/gsd-core/references/planner-interface-context.md +62 -0
- package/gsd-core/references/planner-load-graph-context.md +36 -0
- package/gsd-core/references/planner-mvp-mode.md +53 -0
- package/gsd-core/references/planner-reviews.md +39 -0
- package/gsd-core/references/planner-revision.md +87 -0
- package/gsd-core/references/planner-source-audit.md +73 -0
- package/gsd-core/references/planning-config.md +473 -0
- package/gsd-core/references/product-discovery.md +49 -0
- package/gsd-core/references/project-skills-discovery.md +19 -0
- package/gsd-core/references/questioning.md +162 -0
- package/gsd-core/references/realistic-test-data.md +44 -0
- package/gsd-core/references/research-documentation-lookup.md +29 -0
- package/gsd-core/references/research-philosophy.md +29 -0
- package/gsd-core/references/research-verification-protocol.md +27 -0
- package/gsd-core/references/revision-loop.md +97 -0
- package/gsd-core/references/scout-codebase.md +51 -0
- package/gsd-core/references/skeleton-template.md +48 -0
- package/gsd-core/references/sketch-interactivity.md +41 -0
- package/gsd-core/references/sketch-theme-system.md +94 -0
- package/gsd-core/references/sketch-tooling.md +45 -0
- package/gsd-core/references/sketch-variant-patterns.md +81 -0
- package/gsd-core/references/spidr-splitting.md +69 -0
- package/gsd-core/references/tdd.md +330 -0
- package/gsd-core/references/test-containers.md +55 -0
- package/gsd-core/references/test-strategy.md +75 -0
- package/gsd-core/references/thinking-models-debug.md +44 -0
- package/gsd-core/references/thinking-models-execution.md +50 -0
- package/gsd-core/references/thinking-models-planning.md +62 -0
- package/gsd-core/references/thinking-models-research.md +50 -0
- package/gsd-core/references/thinking-models-verification.md +55 -0
- package/gsd-core/references/thinking-partner.md +96 -0
- package/gsd-core/references/ui-brand.md +162 -0
- package/gsd-core/references/universal-anti-patterns.md +63 -0
- package/gsd-core/references/user-profiling.md +681 -0
- package/gsd-core/references/user-story-template.md +58 -0
- package/gsd-core/references/verification-overrides.md +227 -0
- package/gsd-core/references/verification-patterns.md +612 -0
- package/gsd-core/references/verify-mvp-mode.md +85 -0
- package/gsd-core/references/workstream-flag.md +111 -0
- package/gsd-core/references/worktree-branch-check.md +38 -0
- package/gsd-core/references/worktree-path-safety.md +67 -0
- package/gsd-core/templates/AI-SPEC.md +246 -0
- package/gsd-core/templates/DEBUG.md +169 -0
- package/gsd-core/templates/README.md +77 -0
- package/gsd-core/templates/SECURITY.md +61 -0
- package/gsd-core/templates/UAT.md +265 -0
- package/gsd-core/templates/UI-SPEC.md +100 -0
- package/gsd-core/templates/VALIDATION.md +76 -0
- package/gsd-core/templates/adr.md +58 -0
- package/gsd-core/templates/claude-md.md +145 -0
- package/gsd-core/templates/codebase/architecture.md +255 -0
- package/gsd-core/templates/codebase/concerns.md +310 -0
- package/gsd-core/templates/codebase/conventions.md +307 -0
- package/gsd-core/templates/codebase/integrations.md +280 -0
- package/gsd-core/templates/codebase/stack.md +186 -0
- package/gsd-core/templates/codebase/structure.md +285 -0
- package/gsd-core/templates/codebase/testing.md +480 -0
- package/gsd-core/templates/config.json +62 -0
- package/gsd-core/templates/context.md +352 -0
- package/gsd-core/templates/continue-here.md +78 -0
- package/gsd-core/templates/copilot-instructions.md +7 -0
- package/gsd-core/templates/debug-subagent-prompt.md +91 -0
- package/gsd-core/templates/dev-preferences.md +21 -0
- package/gsd-core/templates/discovery.md +146 -0
- package/gsd-core/templates/discussion-log.md +63 -0
- package/gsd-core/templates/domain-model.md +54 -0
- package/gsd-core/templates/milestone-archive.md +123 -0
- package/gsd-core/templates/milestone.md +115 -0
- package/gsd-core/templates/phase-prompt.md +610 -0
- package/gsd-core/templates/planner-subagent-prompt.md +117 -0
- package/gsd-core/templates/product-brief.md +55 -0
- package/gsd-core/templates/project.md +186 -0
- package/gsd-core/templates/requirements.md +231 -0
- package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
- package/gsd-core/templates/research-project/FEATURES.md +147 -0
- package/gsd-core/templates/research-project/PITFALLS.md +200 -0
- package/gsd-core/templates/research-project/STACK.md +120 -0
- package/gsd-core/templates/research-project/SUMMARY.md +170 -0
- package/gsd-core/templates/research.md +592 -0
- package/gsd-core/templates/retrospective.md +54 -0
- package/gsd-core/templates/roadmap.md +202 -0
- package/gsd-core/templates/spec.md +307 -0
- package/gsd-core/templates/state.md +195 -0
- package/gsd-core/templates/summary-complex.md +59 -0
- package/gsd-core/templates/summary-minimal.md +41 -0
- package/gsd-core/templates/summary-standard.md +48 -0
- package/gsd-core/templates/summary.md +248 -0
- package/gsd-core/templates/test-strategy.md +50 -0
- package/gsd-core/templates/user-profile.md +146 -0
- package/gsd-core/templates/user-setup.md +311 -0
- package/gsd-core/templates/verification-report.md +322 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/gsd-core/workflows/add-backlog.md +91 -0
- package/gsd-core/workflows/add-phase.md +113 -0
- package/gsd-core/workflows/add-tests.md +355 -0
- package/gsd-core/workflows/add-todo.md +161 -0
- package/gsd-core/workflows/ai-integration-phase.md +295 -0
- package/gsd-core/workflows/analyze-dependencies.md +96 -0
- package/gsd-core/workflows/audit-fix.md +178 -0
- package/gsd-core/workflows/audit-milestone.md +360 -0
- package/gsd-core/workflows/audit-uat.md +110 -0
- package/gsd-core/workflows/autonomous.md +797 -0
- package/gsd-core/workflows/check-todos.md +180 -0
- package/gsd-core/workflows/cleanup.md +195 -0
- package/gsd-core/workflows/code-review-fix.md +502 -0
- package/gsd-core/workflows/code-review.md +658 -0
- package/gsd-core/workflows/complete-milestone.md +855 -0
- package/gsd-core/workflows/debug.md +237 -0
- package/gsd-core/workflows/diagnose-issues.md +245 -0
- package/gsd-core/workflows/discover-product.md +112 -0
- package/gsd-core/workflows/discovery-phase.md +291 -0
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
- package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
- package/gsd-core/workflows/discuss-phase-power.md +291 -0
- package/gsd-core/workflows/discuss-phase.md +499 -0
- package/gsd-core/workflows/do.md +111 -0
- package/gsd-core/workflows/docs-update.md +1176 -0
- package/gsd-core/workflows/edit-phase.md +295 -0
- package/gsd-core/workflows/eval-review.md +156 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/gsd-core/workflows/execute-phase.md +1752 -0
- package/gsd-core/workflows/execute-plan.md +526 -0
- package/gsd-core/workflows/explore.md +146 -0
- package/gsd-core/workflows/extract-learnings.md +243 -0
- package/gsd-core/workflows/fast.md +124 -0
- package/gsd-core/workflows/forensics.md +279 -0
- package/gsd-core/workflows/graduation.md +196 -0
- package/gsd-core/workflows/health.md +224 -0
- package/gsd-core/workflows/help/modes/brief.md +22 -0
- package/gsd-core/workflows/help/modes/default.md +50 -0
- package/gsd-core/workflows/help/modes/full.md +789 -0
- package/gsd-core/workflows/help/modes/topic.md +74 -0
- package/gsd-core/workflows/help.md +24 -0
- package/gsd-core/workflows/import.md +256 -0
- package/gsd-core/workflows/inbox.md +387 -0
- package/gsd-core/workflows/ingest-docs.md +340 -0
- package/gsd-core/workflows/insert-phase.md +152 -0
- package/gsd-core/workflows/list-phase-assumptions.md +178 -0
- package/gsd-core/workflows/list-workspaces.md +57 -0
- package/gsd-core/workflows/manager.md +393 -0
- package/gsd-core/workflows/map-codebase.md +446 -0
- package/gsd-core/workflows/milestone-summary.md +224 -0
- package/gsd-core/workflows/model-domain.md +162 -0
- package/gsd-core/workflows/mvp-phase.md +222 -0
- package/gsd-core/workflows/new-milestone.md +635 -0
- package/gsd-core/workflows/new-project.md +1555 -0
- package/gsd-core/workflows/new-workspace.md +240 -0
- package/gsd-core/workflows/next.md +299 -0
- package/gsd-core/workflows/node-repair.md +92 -0
- package/gsd-core/workflows/note.md +158 -0
- package/gsd-core/workflows/pause-work.md +244 -0
- package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
- package/gsd-core/workflows/plan-phase.md +1814 -0
- package/gsd-core/workflows/plan-review-convergence.md +346 -0
- package/gsd-core/workflows/plant-seed.md +230 -0
- package/gsd-core/workflows/pr-branch.md +157 -0
- package/gsd-core/workflows/profile-user.md +453 -0
- package/gsd-core/workflows/progress.md +699 -0
- package/gsd-core/workflows/quick.md +1017 -0
- package/gsd-core/workflows/reapply-patches.md +426 -0
- package/gsd-core/workflows/recommend-architecture.md +135 -0
- package/gsd-core/workflows/remove-phase.md +156 -0
- package/gsd-core/workflows/remove-workspace.md +108 -0
- package/gsd-core/workflows/resume-project.md +332 -0
- package/gsd-core/workflows/review.md +748 -0
- package/gsd-core/workflows/scan.md +107 -0
- package/gsd-core/workflows/secure-phase.md +182 -0
- package/gsd-core/workflows/session-report.md +146 -0
- package/gsd-core/workflows/settings-advanced.md +810 -0
- package/gsd-core/workflows/settings-integrations.md +312 -0
- package/gsd-core/workflows/settings.md +566 -0
- package/gsd-core/workflows/ship.md +405 -0
- package/gsd-core/workflows/sketch-wrap-up.md +286 -0
- package/gsd-core/workflows/sketch.md +361 -0
- package/gsd-core/workflows/spec-phase.md +263 -0
- package/gsd-core/workflows/spike-wrap-up.md +307 -0
- package/gsd-core/workflows/spike.md +453 -0
- package/gsd-core/workflows/stats.md +80 -0
- package/gsd-core/workflows/sync-skills.md +182 -0
- package/gsd-core/workflows/testing-strategy.md +122 -0
- package/gsd-core/workflows/thread.md +222 -0
- package/gsd-core/workflows/transition.md +694 -0
- package/gsd-core/workflows/ui-phase.md +328 -0
- package/gsd-core/workflows/ui-review.md +193 -0
- package/gsd-core/workflows/ultraplan-phase.md +199 -0
- package/gsd-core/workflows/undo.md +314 -0
- package/gsd-core/workflows/update.md +496 -0
- package/gsd-core/workflows/validate-phase.md +181 -0
- package/gsd-core/workflows/verify-phase.md +544 -0
- package/gsd-core/workflows/verify-work.md +781 -0
- package/hooks/dist/gsd-check-update-worker.js +108 -0
- package/hooks/dist/gsd-check-update.js +66 -0
- package/hooks/dist/gsd-config-reload.js +133 -0
- package/hooks/dist/gsd-context-monitor.js +195 -0
- package/hooks/dist/gsd-cursor-post-tool.js +75 -0
- package/hooks/dist/gsd-cursor-session-start.js +52 -0
- package/hooks/dist/gsd-graphify-update.sh +158 -0
- package/hooks/dist/gsd-phase-boundary.sh +47 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +101 -0
- package/hooks/dist/gsd-read-injection-scanner.js +203 -0
- package/hooks/dist/gsd-session-state.sh +59 -0
- package/hooks/dist/gsd-statusline.js +566 -0
- package/hooks/dist/gsd-update-banner.js +138 -0
- package/hooks/dist/gsd-validate-commit.sh +57 -0
- package/hooks/dist/gsd-workflow-guard.js +167 -0
- package/hooks/dist/gsd-worktree-path-guard.js +169 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/dist/managed-hooks-registry.cjs +38 -0
- package/hooks/gsd-check-update-worker.js +108 -0
- package/hooks/gsd-check-update.js +66 -0
- package/hooks/gsd-config-reload.js +133 -0
- package/hooks/gsd-context-monitor.js +195 -0
- package/hooks/gsd-cursor-post-tool.js +75 -0
- package/hooks/gsd-cursor-session-start.js +52 -0
- package/hooks/gsd-graphify-update.sh +158 -0
- package/hooks/gsd-phase-boundary.sh +47 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +101 -0
- package/hooks/gsd-read-injection-scanner.js +203 -0
- package/hooks/gsd-session-state.sh +59 -0
- package/hooks/gsd-statusline.js +566 -0
- package/hooks/gsd-update-banner.js +138 -0
- package/hooks/gsd-validate-commit.sh +57 -0
- package/hooks/gsd-workflow-guard.js +167 -0
- package/hooks/gsd-worktree-path-guard.js +169 -0
- package/hooks/hooks.json +69 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +38 -0
- package/package.json +115 -0
- package/scripts/affected-tests-lib.cjs +542 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +351 -0
- package/scripts/build-hooks.js +247 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +590 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +111 -0
- package/scripts/changeset/new.cjs +137 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +114 -0
- package/scripts/check-env.cjs +312 -0
- package/scripts/check-npm-integrity.cjs +215 -0
- package/scripts/ci-guard-runner.cjs +22 -0
- package/scripts/ci-prepare-test-scope.cjs +51 -0
- package/scripts/ci-rebase-check.cjs +86 -0
- package/scripts/ci-test-scope.cjs +431 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +155 -0
- package/scripts/fix-slash-commands.cjs +147 -0
- package/scripts/gen-inventory-manifest.cjs +115 -0
- package/scripts/gen-research-agents.cjs +276 -0
- package/scripts/generate-package-identity.cjs +125 -0
- package/scripts/issue-dedupe.cjs +278 -0
- package/scripts/lib/allowlist-ratchet.cjs +136 -0
- package/scripts/lib/cli-exit.cjs +56 -0
- package/scripts/lint-command-contract.cjs +114 -0
- package/scripts/lint-descriptions.cjs +87 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-legacy-dir-name.cjs +160 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +99 -0
- package/scripts/lint-shell-command-projection-drift.cjs +62 -0
- package/scripts/lint-skill-deps.cjs +185 -0
- package/scripts/lint-test-file-count.allowlist.json +135 -0
- package/scripts/lint-test-file-count.cjs +246 -0
- package/scripts/mutation-matrix.cjs +222 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +207 -0
- package/scripts/release-notes/discord-release-summary.cjs +373 -0
- package/scripts/release-notes/format-github-release-notes.cjs +261 -0
- package/scripts/release-tarball-smoke.cjs +629 -0
- package/scripts/research-profiles.cjs +149 -0
- package/scripts/run-affected-tests.cjs +7 -0
- package/scripts/run-cross-platform-tests.cjs +67 -0
- package/scripts/run-tests.cjs +315 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +236 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-manifest-versions.cjs +119 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +399 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/verify-npm-publish.cjs +240 -0
- package/scripts/workflow-policy.cjs +450 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const { execFileSync } = require('child_process');
|
|
5
|
+
const { existsSync, readdirSync, appendFileSync } = require('fs');
|
|
6
|
+
|
|
7
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
8
|
+
|
|
9
|
+
// Workflow files that are purely administrative / policy bots. Changes to these
|
|
10
|
+
// files do NOT require the cross-platform test matrix — only a lightweight
|
|
11
|
+
// ubuntu lane running workflow-lint tests is needed.
|
|
12
|
+
// FAIL-SAFE: any .github/workflows/*.yml NOT listed here is treated as a
|
|
13
|
+
// pipeline workflow and gets the full matrix. New workflow files default to full.
|
|
14
|
+
const INERT_WORKFLOWS = new Set([
|
|
15
|
+
'stale.yml',
|
|
16
|
+
'branch-cleanup.yml',
|
|
17
|
+
'branch-naming.yml',
|
|
18
|
+
'auto-label-issues.yml',
|
|
19
|
+
'auto-branch.yml',
|
|
20
|
+
'auto-backmerge.yml',
|
|
21
|
+
'close-draft-prs.yml',
|
|
22
|
+
'dismiss-unauthorized-pr-approvals.yml',
|
|
23
|
+
'pr-gate.yml',
|
|
24
|
+
'pr-target-validator.yml',
|
|
25
|
+
'pr-template-format.yml',
|
|
26
|
+
'require-issue-link.yml',
|
|
27
|
+
'changeset-required.yml',
|
|
28
|
+
'docs-required.yml',
|
|
29
|
+
'discord-changelog.yml',
|
|
30
|
+
]);
|
|
31
|
+
|
|
32
|
+
// Workflows that gate merges, ship the product, or run security/cross-platform
|
|
33
|
+
// suites — these must ALWAYS get the full pipeline treatment and can never be
|
|
34
|
+
// added to INERT_WORKFLOWS. A module-load assertion enforces this so a mistaken
|
|
35
|
+
// or malicious addition fails CI loudly in the `changes` job on every PR.
|
|
36
|
+
const PROTECTED_WORKFLOWS = new Set([
|
|
37
|
+
'test.yml',
|
|
38
|
+
'install-smoke.yml',
|
|
39
|
+
'mutation.yml',
|
|
40
|
+
'security-scan.yml',
|
|
41
|
+
'release.yml',
|
|
42
|
+
]);
|
|
43
|
+
for (const wf of PROTECTED_WORKFLOWS) {
|
|
44
|
+
if (INERT_WORKFLOWS.has(wf)) {
|
|
45
|
+
throw new Error(`ci-test-scope: protected workflow "${wf}" must not be in INERT_WORKFLOWS (it requires the full test matrix).`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns true if the path is an inert (non-pipeline) workflow file.
|
|
51
|
+
* Only `.github/workflows/<name>` where <name> is in INERT_WORKFLOWS qualifies.
|
|
52
|
+
*/
|
|
53
|
+
function isInertCi(filePath) {
|
|
54
|
+
if (!filePath.startsWith('.github/workflows/')) return false;
|
|
55
|
+
const name = filePath.slice('.github/workflows/'.length);
|
|
56
|
+
// Must be a direct child (no further slashes) and in the allowlist.
|
|
57
|
+
return !name.includes('/') && INERT_WORKFLOWS.has(name);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Tests shared by both the 'workflow automation' and 'inert CI' rules.
|
|
61
|
+
const WORKFLOW_LINT_TESTS = [
|
|
62
|
+
'tests/workflow-shell-pinning.test.cjs',
|
|
63
|
+
'tests/pr-template-policy.test.cjs',
|
|
64
|
+
'tests/lint-pr-check-project-dir.test.cjs',
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
const RULES = [
|
|
68
|
+
{
|
|
69
|
+
name: 'workflow automation',
|
|
70
|
+
// Only NON-inert .github/workflows/* and all .github/rulesets/* trigger full matrix.
|
|
71
|
+
// FAIL-SAFE: any .github/workflows/*.yml not in INERT_WORKFLOWS is treated as pipeline.
|
|
72
|
+
match: filePath => (filePath.startsWith('.github/workflows/') && !isInertCi(filePath)) ||
|
|
73
|
+
filePath.startsWith('.github/rulesets/'),
|
|
74
|
+
fullMatrix: true,
|
|
75
|
+
tests: [
|
|
76
|
+
...WORKFLOW_LINT_TESTS,
|
|
77
|
+
'tests/release-tarball-smoke-workflow.test.cjs',
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'inert CI',
|
|
82
|
+
match: filePath => isInertCi(filePath),
|
|
83
|
+
fullMatrix: false,
|
|
84
|
+
tests: [
|
|
85
|
+
...WORKFLOW_LINT_TESTS,
|
|
86
|
+
'tests/policy-lint-shallow-checkout.test.cjs',
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'test harness',
|
|
91
|
+
match: path => path === 'scripts/run-tests.cjs',
|
|
92
|
+
fullMatrix: true,
|
|
93
|
+
tests: [
|
|
94
|
+
'tests/run-tests-harness.test.cjs',
|
|
95
|
+
'tests/workflow-shell-pinning.test.cjs',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'environment and dependency gates',
|
|
100
|
+
match: path => [
|
|
101
|
+
'scripts/check-env.cjs',
|
|
102
|
+
'scripts/check-npm-integrity.cjs',
|
|
103
|
+
'package.json',
|
|
104
|
+
'package-lock.json',
|
|
105
|
+
].includes(path),
|
|
106
|
+
fullMatrix: true,
|
|
107
|
+
tests: [
|
|
108
|
+
'tests/check-env.test.cjs',
|
|
109
|
+
'tests/npm-integrity-gate.test.cjs',
|
|
110
|
+
'tests/package-manifest.test.cjs',
|
|
111
|
+
'tests/bug-3588-npm-audit-clean.test.cjs',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'TS runtime sources (ADR-457 build-at-publish)',
|
|
116
|
+
// src/*.cts compiles into gsd-core/bin/lib/*.cjs; a source-only edit must
|
|
117
|
+
// still trigger the migrated module's tests (otherwise CI silently skips them).
|
|
118
|
+
match: path => path.startsWith('src/') || path === 'tsconfig.build.json',
|
|
119
|
+
tests: [
|
|
120
|
+
'tests/semver-compare.test.cjs',
|
|
121
|
+
'tests/bug-10-semver-policy-consolidation.test.cjs',
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'installer and package layout',
|
|
126
|
+
match: path => path.startsWith('bin/') ||
|
|
127
|
+
path.startsWith('gsd-core/bin/') ||
|
|
128
|
+
path.includes('install') ||
|
|
129
|
+
path.includes('release-tarball-smoke'),
|
|
130
|
+
fullMatrix: true,
|
|
131
|
+
tests: [
|
|
132
|
+
'tests/install.test.cjs',
|
|
133
|
+
'tests/install-regressions.test.cjs',
|
|
134
|
+
'tests/install-runtime-artifacts.test.cjs',
|
|
135
|
+
'tests/install-path-detection.test.cjs',
|
|
136
|
+
'tests/release-tarball-smoke.install.test.cjs',
|
|
137
|
+
'tests/runtime-artifact-layout.test.cjs',
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'hooks',
|
|
142
|
+
match: path => path.startsWith('hooks/'),
|
|
143
|
+
fullMatrix: true,
|
|
144
|
+
tests: [
|
|
145
|
+
'tests/hook-validation.test.cjs',
|
|
146
|
+
'tests/managed-hooks.test.cjs',
|
|
147
|
+
'tests/hooks-opt-in.test.cjs',
|
|
148
|
+
'tests/sh-hook-paths.test.cjs',
|
|
149
|
+
'tests/precommit-alias-drift-hook.test.cjs',
|
|
150
|
+
'tests/prepush-enterprise-email-hook.test.cjs',
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'changeset tooling',
|
|
155
|
+
match: path => path.startsWith('scripts/changeset/') || path.startsWith('.changeset/'),
|
|
156
|
+
tests: [
|
|
157
|
+
'tests/changeset-cli.test.cjs',
|
|
158
|
+
'tests/changeset-lint.test.cjs',
|
|
159
|
+
'tests/changeset-new.test.cjs',
|
|
160
|
+
'tests/changeset-parse.test.cjs',
|
|
161
|
+
'tests/changeset-render.test.cjs',
|
|
162
|
+
'tests/changeset-serialize.test.cjs',
|
|
163
|
+
'tests/changeset-github-release-notes.test.cjs',
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'security scanners',
|
|
168
|
+
match: path => path.includes('secret-scan') ||
|
|
169
|
+
path.includes('base64-scan') ||
|
|
170
|
+
path.includes('prompt-injection-scan') ||
|
|
171
|
+
path.startsWith('tests/fixtures/adversarial/security/'),
|
|
172
|
+
tests: [
|
|
173
|
+
'tests/secret-scan-lint.test.cjs',
|
|
174
|
+
'tests/prompt-injection-scan.test.cjs',
|
|
175
|
+
'tests/security-prompt-injection.test.cjs',
|
|
176
|
+
'tests/read-injection-scanner.test.cjs',
|
|
177
|
+
'tests/security-scan.test.cjs',
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'command definitions',
|
|
182
|
+
match: path => path.startsWith('commands/'),
|
|
183
|
+
tests: [
|
|
184
|
+
'tests/command-contract.test.cjs',
|
|
185
|
+
'tests/command-routing-hub.test.cjs',
|
|
186
|
+
'tests/commands.test.cjs',
|
|
187
|
+
'tests/docs-parity-live-registry.test.cjs',
|
|
188
|
+
'tests/phase-command-router.test.cjs',
|
|
189
|
+
'tests/roadmap-command-router.test.cjs',
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'workflow prompts',
|
|
194
|
+
match: path => path.startsWith('gsd-core/workflows/'),
|
|
195
|
+
tests: [
|
|
196
|
+
'tests/workflow-compat.test.cjs',
|
|
197
|
+
'tests/workflow-size-budget.test.cjs',
|
|
198
|
+
'tests/workflow-guard-registration.test.cjs',
|
|
199
|
+
'tests/commands.test.cjs',
|
|
200
|
+
'tests/bug-3683-workflow-colon-namespace-leak.test.cjs',
|
|
201
|
+
],
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: 'agent prompts',
|
|
205
|
+
match: path => path.startsWith('agents/'),
|
|
206
|
+
tests: [
|
|
207
|
+
'tests/agent-frontmatter.test.cjs',
|
|
208
|
+
'tests/agent-size-budget.test.cjs',
|
|
209
|
+
'tests/agent-skills.test.cjs',
|
|
210
|
+
'tests/agent-skills-awareness.test.cjs',
|
|
211
|
+
'tests/agent-required-reading-consistency.test.cjs',
|
|
212
|
+
'tests/docs-parity-live-registry.test.cjs',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'configuration',
|
|
217
|
+
match: path => ['config', 'configuration', 'model-catalog', 'model-profile'].some(k => path.includes(k)),
|
|
218
|
+
tests: [
|
|
219
|
+
'tests/config.test.cjs',
|
|
220
|
+
'tests/config-get-default.test.cjs',
|
|
221
|
+
'tests/configuration-migrate-config.test.cjs',
|
|
222
|
+
'tests/model-catalog-runtime-defaults.test.cjs',
|
|
223
|
+
'tests/model-profiles.test.cjs',
|
|
224
|
+
],
|
|
225
|
+
},
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
function usage() {
|
|
229
|
+
return [
|
|
230
|
+
'Usage:',
|
|
231
|
+
' node scripts/ci-test-scope.cjs --base <sha> --head <sha>',
|
|
232
|
+
' node scripts/ci-test-scope.cjs --files <path-list>',
|
|
233
|
+
'',
|
|
234
|
+
'Prints JSON by default. With GITHUB_OUTPUT set, also writes workflow outputs.',
|
|
235
|
+
].join('\n');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function parseArgs(argv) {
|
|
239
|
+
const out = { base: null, head: null, files: null };
|
|
240
|
+
for (let i = 0; i < argv.length; i++) {
|
|
241
|
+
const arg = argv[i];
|
|
242
|
+
if (arg === '--base') {
|
|
243
|
+
out.base = argv[++i];
|
|
244
|
+
if (!out.base || out.base.startsWith('--')) throw new Error('--base requires a value');
|
|
245
|
+
} else if (arg.startsWith('--base=')) {
|
|
246
|
+
out.base = arg.slice('--base='.length);
|
|
247
|
+
if (!out.base) throw new Error('--base requires a value');
|
|
248
|
+
} else if (arg === '--head') {
|
|
249
|
+
out.head = argv[++i];
|
|
250
|
+
if (!out.head || out.head.startsWith('--')) throw new Error('--head requires a value');
|
|
251
|
+
} else if (arg.startsWith('--head=')) {
|
|
252
|
+
out.head = arg.slice('--head='.length);
|
|
253
|
+
if (!out.head) throw new Error('--head requires a value');
|
|
254
|
+
} else if (arg === '--files') {
|
|
255
|
+
out.files = argv[++i];
|
|
256
|
+
if (!out.files || out.files.startsWith('--')) throw new Error('--files requires a value');
|
|
257
|
+
} else if (arg.startsWith('--files=')) {
|
|
258
|
+
out.files = arg.slice('--files='.length);
|
|
259
|
+
if (!out.files) throw new Error('--files requires a value');
|
|
260
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
261
|
+
console.log(usage());
|
|
262
|
+
throw new ExitError(0);
|
|
263
|
+
} else {
|
|
264
|
+
throw new Error(`unknown argument: ${arg}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return out;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function splitFiles(value) {
|
|
271
|
+
if (!value) return [];
|
|
272
|
+
const SEPARATORS = new Set([',', ' ', '\t', '\n', '\r', '\f', '\v']);
|
|
273
|
+
const tokens = [];
|
|
274
|
+
let current = '';
|
|
275
|
+
for (const ch of value) {
|
|
276
|
+
if (SEPARATORS.has(ch)) {
|
|
277
|
+
if (current) tokens.push(current);
|
|
278
|
+
current = '';
|
|
279
|
+
} else {
|
|
280
|
+
current += ch;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (current) tokens.push(current);
|
|
284
|
+
return tokens.map(v => v.trim()).filter(Boolean);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function changedFiles(args) {
|
|
288
|
+
if (args.files) return splitFiles(args.files);
|
|
289
|
+
if (!args.base || !args.head) {
|
|
290
|
+
throw new Error('--base/--head or --files is required');
|
|
291
|
+
}
|
|
292
|
+
// Three-dot diff (merge-base...head) matches GitHub's PR "Files changed" semantics.
|
|
293
|
+
// A two-dot `git diff base head` would surface every file `next` gained after this
|
|
294
|
+
// branch's merge-base, mis-flagging product_changed/full_matrix on docs-only PRs cut
|
|
295
|
+
// from a slightly stale base (#837). The `changes` job checks out with fetch-depth: 0,
|
|
296
|
+
// so the merge-base is always available.
|
|
297
|
+
const stdout = execFileSync('git', ['diff', '--name-only', `${args.base}...${args.head}`], {
|
|
298
|
+
encoding: 'utf8',
|
|
299
|
+
});
|
|
300
|
+
return splitFiles(stdout);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function existingTests(files) {
|
|
304
|
+
const all = new Set(readdirSync('tests').filter(f => f.endsWith('.test.cjs')).map(f => `tests/${f}`));
|
|
305
|
+
return files.filter(file => all.has(file) && existsSync(file));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function addAll(set, values) {
|
|
309
|
+
for (const value of values) set.add(value);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const WINDOWS_HINTS = ['windows', 'path', 'shell', 'workflow', 'install', 'hook'];
|
|
313
|
+
const isWindowsHint = s => WINDOWS_HINTS.some(k => s.toLowerCase().includes(k));
|
|
314
|
+
|
|
315
|
+
function classify(files) {
|
|
316
|
+
const targeted = new Set();
|
|
317
|
+
const windows = new Set();
|
|
318
|
+
const reasons = [];
|
|
319
|
+
let productOrPipelineChanged = false; // product/pipeline code (excludes docs)
|
|
320
|
+
let inertCiChanged = false; // inert workflow files
|
|
321
|
+
let fullMatrix = false;
|
|
322
|
+
|
|
323
|
+
for (const file of files) {
|
|
324
|
+
// Determine if this file is product/pipeline code.
|
|
325
|
+
// docs/ and root-level .md files are intentionally excluded.
|
|
326
|
+
if (
|
|
327
|
+
['bin/', 'src/', 'gsd-core/', 'agents/', 'commands/', 'hooks/', 'tests/', 'scripts/'].some(p => file.startsWith(p)) ||
|
|
328
|
+
file === 'package.json' || file === 'package-lock.json' ||
|
|
329
|
+
(file.startsWith('tsconfig') && file.endsWith('.json')) ||
|
|
330
|
+
file.startsWith('.github/rulesets/')
|
|
331
|
+
) {
|
|
332
|
+
productOrPipelineChanged = true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Non-inert .github/workflows/* are pipeline code → full matrix.
|
|
336
|
+
if (file.startsWith('.github/workflows/') && !isInertCi(file)) {
|
|
337
|
+
productOrPipelineChanged = true;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Inert workflow files set a lightweight signal.
|
|
341
|
+
if (isInertCi(file)) {
|
|
342
|
+
inertCiChanged = true;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (file.startsWith('tests/') && file.endsWith('.test.cjs')) {
|
|
346
|
+
targeted.add(file);
|
|
347
|
+
fullMatrix = true;
|
|
348
|
+
if (isWindowsHint(file)) {
|
|
349
|
+
windows.add(file);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
for (const rule of RULES) {
|
|
354
|
+
if (rule.match(file)) {
|
|
355
|
+
addAll(targeted, rule.tests);
|
|
356
|
+
reasons.push(`${file}: ${rule.name}`);
|
|
357
|
+
if (rule.fullMatrix) fullMatrix = true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// code_changed: true when product/pipeline OR inert CI changed.
|
|
363
|
+
// Docs-only PRs (neither flag set) get code_changed=false → full matrix skip.
|
|
364
|
+
const codeChanged = productOrPipelineChanged || inertCiChanged;
|
|
365
|
+
|
|
366
|
+
const targetedTests = existingTests([...targeted].sort());
|
|
367
|
+
|
|
368
|
+
// When code changed but no rule matched any changed file, fall back to the
|
|
369
|
+
// unit suite so the targeted lane always runs something meaningful (#408).
|
|
370
|
+
if (codeChanged && targetedTests.length === 0) {
|
|
371
|
+
targetedTests.push('unit');
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const windowsTests = existingTests([...new Set([...windows, ...targetedTests.filter(isWindowsHint)])].sort());
|
|
375
|
+
|
|
376
|
+
// Inert-CI-only: full_matrix must be false (override any RULES that fired).
|
|
377
|
+
if (inertCiChanged && !productOrPipelineChanged) {
|
|
378
|
+
fullMatrix = false;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Normalize: when code_changed is false, the output must be self-consistent.
|
|
382
|
+
// A docs file can coincidentally match a coarse content RULE (e.g. docs/installer-migrations.md
|
|
383
|
+
// matches the installer rule via path.includes('install')), leaving full_matrix=true and
|
|
384
|
+
// non-empty targeted_tests/windows_tests. The workflow skips correctly (gated on code_changed)
|
|
385
|
+
// but the output object would be self-contradictory. Force a clean "nothing to run" result.
|
|
386
|
+
if (!codeChanged) {
|
|
387
|
+
fullMatrix = false;
|
|
388
|
+
targetedTests.length = 0;
|
|
389
|
+
windowsTests.length = 0;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return {
|
|
393
|
+
code_changed: codeChanged,
|
|
394
|
+
product_changed: productOrPipelineChanged,
|
|
395
|
+
full_matrix: fullMatrix,
|
|
396
|
+
targeted_tests: targetedTests,
|
|
397
|
+
windows_tests: windowsTests,
|
|
398
|
+
reasons: [...new Set(reasons)].sort(),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function writeOutputs(result) {
|
|
403
|
+
if (!process.env.GITHUB_OUTPUT) return;
|
|
404
|
+
const lines = [
|
|
405
|
+
`code_changed=${result.code_changed}`,
|
|
406
|
+
`product_changed=${result.product_changed}`,
|
|
407
|
+
`full_matrix=${result.full_matrix}`,
|
|
408
|
+
`targeted_tests=${result.targeted_tests.join(' ')}`,
|
|
409
|
+
`windows_tests=${result.windows_tests.join(' ')}`,
|
|
410
|
+
];
|
|
411
|
+
appendFileSync(process.env.GITHUB_OUTPUT, `${lines.join('\n')}\n`);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function main() {
|
|
415
|
+
try {
|
|
416
|
+
const args = parseArgs(process.argv.slice(2));
|
|
417
|
+
|
|
418
|
+
const files = changedFiles(args);
|
|
419
|
+
const result = classify(files);
|
|
420
|
+
result.changed_files = files;
|
|
421
|
+
writeOutputs(result);
|
|
422
|
+
console.log(JSON.stringify(result, null, 2));
|
|
423
|
+
} catch (error) {
|
|
424
|
+
if (error instanceof ExitError) throw error;
|
|
425
|
+
console.error(`ci-test-scope: ${error.message}`);
|
|
426
|
+
console.error(usage());
|
|
427
|
+
throw new ExitError(2);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
runMain(main);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* command-contract-helpers.cjs (ADR-0002)
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for the commands/gsd/*.md contract constants and
|
|
6
|
+
* parsers shared by scripts/lint-command-contract.cjs and
|
|
7
|
+
* tests/command-contract.test.cjs.
|
|
8
|
+
*
|
|
9
|
+
* Keeping these in one place ensures the lint script and the test suite
|
|
10
|
+
* always agree on what constitutes a valid tool, a valid @-ref, and a valid
|
|
11
|
+
* frontmatter structure. A new canonical tool added here is automatically
|
|
12
|
+
* enforced by both consumers.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const CANONICAL_TOOLS = new Set([
|
|
16
|
+
'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep',
|
|
17
|
+
'Task', 'Agent', 'Skill', 'SlashCommand',
|
|
18
|
+
'AskUserQuestion', 'WebFetch', 'WebSearch', 'TodoWrite',
|
|
19
|
+
'mcp__context7__resolve-library-id',
|
|
20
|
+
'mcp__context7__query-docs',
|
|
21
|
+
'mcp__context7__*',
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
function parseFrontmatter(content) {
|
|
25
|
+
// CRLF-tolerant split: Windows checkouts (autocrlf=true) leave a trailing
|
|
26
|
+
// \r on every line, making lines.indexOf('---', 1) return -1 (the value
|
|
27
|
+
// would be '---\r', not '---') → returns {} → every field appears missing.
|
|
28
|
+
const lines = content.split(/\r?\n/);
|
|
29
|
+
if (lines[0].trim() !== '---') return {};
|
|
30
|
+
const end = lines.indexOf('---', 1);
|
|
31
|
+
if (end === -1) return {};
|
|
32
|
+
const fm = {};
|
|
33
|
+
let key = null;
|
|
34
|
+
for (const line of lines.slice(1, end)) {
|
|
35
|
+
const kv = line.match(/^([a-zA-Z0-9_-]+):\s*(.*)/);
|
|
36
|
+
if (kv) { key = kv[1]; fm[key] = kv[2].trim(); }
|
|
37
|
+
else if (key && line.match(/^\s+-\s+/)) {
|
|
38
|
+
const val = line.replace(/^\s+-\s+/, '').trim();
|
|
39
|
+
fm[key] = fm[key] ? fm[key] + '\n' + val : val;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return fm;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function executionContextRefs(content) {
|
|
46
|
+
const refs = [];
|
|
47
|
+
const re = /<execution_context(?:_extended)?>([\s\S]*?)<\/execution_context(?:_extended)?>/g;
|
|
48
|
+
let m;
|
|
49
|
+
while ((m = re.exec(content)) !== null) {
|
|
50
|
+
for (const rawLine of m[1].split('\n')) {
|
|
51
|
+
const line = rawLine.trim();
|
|
52
|
+
if (!line.startsWith('@')) continue;
|
|
53
|
+
const token = line.split(/\s+/)[0];
|
|
54
|
+
const trailingProse = line.length > token.length;
|
|
55
|
+
const normalized = token
|
|
56
|
+
.replace(/^@(?:~|\$HOME)\//, '')
|
|
57
|
+
.replace(/^(?:\.claude\/)?(?:gsd-core\/)?/, '');
|
|
58
|
+
refs.push({ token, normalized, trailingProse });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return refs;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = { CANONICAL_TOOLS, parseFrontmatter, executionContextRefs };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Used by the release-sdk hotfix cherry-pick loop to decide whether a
|
|
4
|
+
* candidate commit can possibly change what ships in the npm package.
|
|
5
|
+
*
|
|
6
|
+
* Reads a newline-separated list of paths from stdin (typically the
|
|
7
|
+
* output of `git diff-tree --no-commit-id --name-only -r <SHA>`) and
|
|
8
|
+
* exits with one of three codes so the workflow can distinguish a
|
|
9
|
+
* legitimate "skip this commit" signal from a classifier failure.
|
|
10
|
+
*
|
|
11
|
+
* "Shipped" = the union of:
|
|
12
|
+
* - package.json (always included by `npm pack`, regardless of `files`)
|
|
13
|
+
* - every entry in package.json `files`, treated as either an exact
|
|
14
|
+
* file match or a directory prefix (matching `npm pack` semantics).
|
|
15
|
+
* - CI-gating test paths: `tests/<anything>` plus
|
|
16
|
+
* `sdk/src/<anything>/<name>.test.<ts|cjs|mjs|js>` and `.spec.` variants
|
|
17
|
+
* — these don't ship in the tarball, but they gate the hotfix-branch
|
|
18
|
+
* test job. A test fixture update that aligns with a cherry-picked
|
|
19
|
+
* production fix MUST be pickable or CI fails on the hotfix run.
|
|
20
|
+
* #3621 — root cause of the v1.42.3 hotfix red CI.
|
|
21
|
+
*
|
|
22
|
+
* `package-lock.json` is intentionally NOT considered shipped — `npm pack`
|
|
23
|
+
* excludes it from the tarball unless it's explicitly in `files`, and at
|
|
24
|
+
* the time of writing this repo's `files` whitelist does not include it.
|
|
25
|
+
*
|
|
26
|
+
* Exit codes (the workflow MUST treat these distinctly — bug #2983):
|
|
27
|
+
* 0 at least one path is shipped → cherry-pick is meaningful
|
|
28
|
+
* 1 no shipped paths → CI / test / docs / planning
|
|
29
|
+
* only; hotfix loop skips
|
|
30
|
+
* 2 classifier error → bad/missing package.json,
|
|
31
|
+
* I/O failure, or any
|
|
32
|
+
* uncaught exception. The
|
|
33
|
+
* workflow MUST fail-fast on
|
|
34
|
+
* this code rather than
|
|
35
|
+
* treating it as a skip.
|
|
36
|
+
*
|
|
37
|
+
* Why distinct codes: Node's default exit code for uncaught throws is 1,
|
|
38
|
+
* which would otherwise be indistinguishable from the legitimate "no
|
|
39
|
+
* shipped paths" result. CodeRabbit on PR #2981 / bug #2983.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
'use strict';
|
|
43
|
+
|
|
44
|
+
const fs = require('node:fs');
|
|
45
|
+
const path = require('node:path');
|
|
46
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
47
|
+
|
|
48
|
+
const EXIT_SHIPPED = 0;
|
|
49
|
+
const EXIT_NOT_SHIPPED = 1;
|
|
50
|
+
const EXIT_ERROR = 2;
|
|
51
|
+
|
|
52
|
+
function loadShipPrefixes(pkgPath) {
|
|
53
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
54
|
+
const files = Array.isArray(pkg.files) ? pkg.files : [];
|
|
55
|
+
return ['package.json', ...files];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// #3621: paths that gate hotfix-branch CI even though they don't appear
|
|
59
|
+
// in the npm tarball. When a cherry-picked production fix changes behavior
|
|
60
|
+
// that an existing test on the v1.42.2 base asserts against, the matching
|
|
61
|
+
// test fixture from `main` must also be cherry-picked or CI fails on the
|
|
62
|
+
// hotfix run (exactly what happened on v1.42.3 — production fix(3562) was
|
|
63
|
+
// picked, the bundled test-fixture correction in commit 08848df8 was not).
|
|
64
|
+
// Combined with the `test:` prefix being added to the candidate-loop regex
|
|
65
|
+
// in hotfix.yml, this lets `test(####):` fixture-alignment commits be
|
|
66
|
+
// cherry-picked alongside their production counterparts.
|
|
67
|
+
function isCiGating(diffPath) {
|
|
68
|
+
if (diffPath.startsWith('tests/')) return true;
|
|
69
|
+
// SDK vitest specs live next to source. Production source ships via
|
|
70
|
+
// sdk/dist/ (already in package.json `files`); the test files are what's
|
|
71
|
+
// missing from that surface.
|
|
72
|
+
if (diffPath.startsWith('sdk/src/') && /\.(test|spec)\.(ts|cjs|mjs|js)$/.test(diffPath)) return true;
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isShipped(diffPath, shipPrefixes) {
|
|
77
|
+
// Normalize Windows-style separators just in case (git always emits
|
|
78
|
+
// forward slashes, but a developer running this locally on a different
|
|
79
|
+
// tool's output shouldn't get a false negative).
|
|
80
|
+
const p = diffPath.replace(/\\/g, '/');
|
|
81
|
+
return shipPrefixes.some((s) => p === s || p.startsWith(s + '/'));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// #2980: commits that touch `.github/workflows/*` cannot be cherry-picked
|
|
85
|
+
// onto a hotfix branch because the default GITHUB_TOKEN lacks the
|
|
86
|
+
// `workflow` permission and the push step fails. Detect them upfront so a
|
|
87
|
+
// `test:`-eligible commit bundling a workflow edit still gets skipped.
|
|
88
|
+
function isPushBlocking(diffPath) {
|
|
89
|
+
return diffPath.replace(/\\/g, '/').startsWith('.github/workflows/');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function readStdin() {
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
let data = '';
|
|
95
|
+
process.stdin.setEncoding('utf8');
|
|
96
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
97
|
+
process.stdin.on('end', () => resolve(data));
|
|
98
|
+
process.stdin.on('error', reject);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function main() {
|
|
103
|
+
try {
|
|
104
|
+
let shipPrefixes;
|
|
105
|
+
try {
|
|
106
|
+
const pkgPath = path.resolve(process.cwd(), 'package.json');
|
|
107
|
+
shipPrefixes = loadShipPrefixes(pkgPath);
|
|
108
|
+
} catch (err) {
|
|
109
|
+
process.stderr.write(`diff-touches-shipped-paths: failed to read package.json from ${process.cwd()}\n`);
|
|
110
|
+
if (err && err.stack) process.stderr.write(`${err.stack}\n`);
|
|
111
|
+
throw new ExitError(EXIT_ERROR);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let buf;
|
|
115
|
+
try {
|
|
116
|
+
buf = await readStdin();
|
|
117
|
+
} catch (err) {
|
|
118
|
+
process.stderr.write(`diff-touches-shipped-paths: stdin read error\n`);
|
|
119
|
+
if (err && err.stack) process.stderr.write(`${err.stack}\n`);
|
|
120
|
+
throw new ExitError(EXIT_ERROR);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const paths = buf.split('\n').map((s) => s.trim()).filter(Boolean);
|
|
124
|
+
// #2980 still wins over #3621: any commit touching .github/workflows/*
|
|
125
|
+
// is unpickable regardless of other content because the push step
|
|
126
|
+
// fails on workflow scope rejection. Check this first.
|
|
127
|
+
if (paths.some(isPushBlocking)) {
|
|
128
|
+
return EXIT_NOT_SHIPPED;
|
|
129
|
+
}
|
|
130
|
+
if (paths.some((p) => isShipped(p, shipPrefixes))) {
|
|
131
|
+
return EXIT_SHIPPED;
|
|
132
|
+
}
|
|
133
|
+
// #3621: a commit whose only relevant paths are CI-gating tests is
|
|
134
|
+
// still pickable — it can change whether the hotfix CI passes even
|
|
135
|
+
// though it doesn't change what the npm tarball ships.
|
|
136
|
+
if (paths.some(isCiGating)) {
|
|
137
|
+
return EXIT_SHIPPED;
|
|
138
|
+
}
|
|
139
|
+
return EXIT_NOT_SHIPPED;
|
|
140
|
+
} catch (e) {
|
|
141
|
+
// Re-throw ExitError unchanged; map any unexpected error to EXIT_ERROR=2
|
|
142
|
+
// (Node's default uncaught-exception code is 1, which is indistinguishable
|
|
143
|
+
// from the legitimate EXIT_NOT_SHIPPED result — bug #2983).
|
|
144
|
+
if (e instanceof ExitError) throw e;
|
|
145
|
+
process.stderr.write(`diff-touches-shipped-paths: classification failed\n`);
|
|
146
|
+
if (e && e.stack) process.stderr.write(`${e.stack}\n`);
|
|
147
|
+
throw new ExitError(EXIT_ERROR);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (require.main === module) {
|
|
152
|
+
runMain(main);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
module.exports = { loadShipPrefixes, isShipped, isCiGating, isPushBlocking, EXIT_SHIPPED, EXIT_NOT_SHIPPED, EXIT_ERROR };
|