@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,149 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* research-profiles.cjs — hand-authored profile table for the 7 researcher agents.
|
|
6
|
+
*
|
|
7
|
+
* Each profile field is derived verbatim from the agent's current committed state so
|
|
8
|
+
* that the initial --check in gen-research-agents.cjs is green by construction.
|
|
9
|
+
*
|
|
10
|
+
* Fields:
|
|
11
|
+
* name — verbatim frontmatter `name:` value
|
|
12
|
+
* description — verbatim frontmatter `description:` value
|
|
13
|
+
* color — verbatim frontmatter `color:` value
|
|
14
|
+
* tools — verbatim frontmatter `tools:` value (single string, comma-separated)
|
|
15
|
+
* requiredIncludes — @~/.claude/gsd-core/references/<file>.md strings the body MUST contain
|
|
16
|
+
* requiredSeamCalls — `gsd-tools query <cmd>` strings the body MUST contain
|
|
17
|
+
* outputContract — strings the body MUST contain (output path, return marker, etc.)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const PROFILES = [
|
|
21
|
+
{
|
|
22
|
+
name: 'gsd-project-researcher',
|
|
23
|
+
description:
|
|
24
|
+
'Researches domain ecosystem before roadmap creation. Produces files in .planning/research/ consumed during roadmap creation. Spawned by /gsd:new-project or /gsd:new-milestone orchestrators.',
|
|
25
|
+
color: 'cyan',
|
|
26
|
+
tools:
|
|
27
|
+
'Read, Write, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
|
|
28
|
+
requiredIncludes: [
|
|
29
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
30
|
+
'@~/.claude/gsd-core/references/research-philosophy.md',
|
|
31
|
+
'@~/.claude/gsd-core/references/research-verification-protocol.md',
|
|
32
|
+
],
|
|
33
|
+
requiredSeamCalls: [
|
|
34
|
+
'gsd-tools query research-plan',
|
|
35
|
+
'gsd-tools query research-store put',
|
|
36
|
+
'gsd-tools query classify-confidence',
|
|
37
|
+
],
|
|
38
|
+
outputContract: [
|
|
39
|
+
'.planning/research/',
|
|
40
|
+
'## RESEARCH COMPLETE',
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'gsd-phase-researcher',
|
|
45
|
+
description:
|
|
46
|
+
'Researches how to implement a phase before planning. Produces RESEARCH.md consumed by gsd-planner. Spawned by /gsd:plan-phase orchestrator.',
|
|
47
|
+
color: 'cyan',
|
|
48
|
+
tools:
|
|
49
|
+
'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
|
|
50
|
+
requiredIncludes: [
|
|
51
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
52
|
+
'@~/.claude/gsd-core/references/research-philosophy.md',
|
|
53
|
+
'@~/.claude/gsd-core/references/research-verification-protocol.md',
|
|
54
|
+
],
|
|
55
|
+
requiredSeamCalls: [
|
|
56
|
+
'gsd-tools query research-plan',
|
|
57
|
+
'gsd-tools query research-store put',
|
|
58
|
+
'gsd-tools query classify-confidence',
|
|
59
|
+
'gsd-tools query package-legitimacy check',
|
|
60
|
+
],
|
|
61
|
+
outputContract: [
|
|
62
|
+
'.planning/phases/XX-name/{phase_num}-RESEARCH.md',
|
|
63
|
+
'## RESEARCH COMPLETE',
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'gsd-advisor-researcher',
|
|
68
|
+
description:
|
|
69
|
+
'Researches a single gray area decision and returns a structured comparison table with rationale. Spawned by discuss-phase advisor mode.',
|
|
70
|
+
color: 'cyan',
|
|
71
|
+
tools: 'Read, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*',
|
|
72
|
+
requiredIncludes: [
|
|
73
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
74
|
+
],
|
|
75
|
+
requiredSeamCalls: [],
|
|
76
|
+
outputContract: [
|
|
77
|
+
'| Option | Pros | Cons | Complexity | Recommendation |',
|
|
78
|
+
'**Rationale:**',
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'gsd-ai-researcher',
|
|
83
|
+
description:
|
|
84
|
+
'Researches a chosen AI framework\'s official docs to produce implementation-ready guidance — best practices, syntax, core patterns, and pitfalls distilled for the specific use case. Writes the Framework Quick Reference and Implementation Guidance sections of AI-SPEC.md. Spawned by /gsd:ai-integration-phase orchestrator.',
|
|
85
|
+
color: 'green',
|
|
86
|
+
tools:
|
|
87
|
+
'Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, mcp__context7__*',
|
|
88
|
+
requiredIncludes: [
|
|
89
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
90
|
+
],
|
|
91
|
+
requiredSeamCalls: [],
|
|
92
|
+
outputContract: [
|
|
93
|
+
'AI-SPEC.md',
|
|
94
|
+
'Section 3',
|
|
95
|
+
'Section 4',
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'gsd-domain-researcher',
|
|
100
|
+
description:
|
|
101
|
+
'Researches the business domain and real-world application context of the AI system being built. Surfaces domain expert evaluation criteria, industry-specific failure modes, regulatory context, and what "good" looks like for practitioners in this field — before the eval-planner turns it into measurable rubrics. Spawned by /gsd:ai-integration-phase orchestrator.',
|
|
102
|
+
color: 'purple',
|
|
103
|
+
tools:
|
|
104
|
+
'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*',
|
|
105
|
+
requiredIncludes: [
|
|
106
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
107
|
+
],
|
|
108
|
+
requiredSeamCalls: [],
|
|
109
|
+
outputContract: [
|
|
110
|
+
'AI-SPEC.md',
|
|
111
|
+
'Section 1b',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'gsd-ui-researcher',
|
|
116
|
+
description:
|
|
117
|
+
'Produces UI-SPEC.md design contract for frontend phases. Reads upstream artifacts, detects design system state, asks only unanswered questions. Spawned by /gsd:ui-phase orchestrator.',
|
|
118
|
+
color: 'purple',
|
|
119
|
+
tools:
|
|
120
|
+
'Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*, mcp__firecrawl__*, mcp__exa__*, mcp__tavily__*, mcp__ref__*, mcp__jina__*',
|
|
121
|
+
requiredIncludes: [
|
|
122
|
+
'@~/.claude/gsd-core/references/research-documentation-lookup.md',
|
|
123
|
+
],
|
|
124
|
+
requiredSeamCalls: [
|
|
125
|
+
'gsd-tools query commit',
|
|
126
|
+
],
|
|
127
|
+
outputContract: [
|
|
128
|
+
'UI-SPEC.md',
|
|
129
|
+
'## UI-SPEC COMPLETE',
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'gsd-research-synthesizer',
|
|
134
|
+
description:
|
|
135
|
+
'Synthesizes research outputs from parallel researcher agents into SUMMARY.md. Spawned by /gsd:new-project after 4 researcher agents complete.',
|
|
136
|
+
color: 'purple',
|
|
137
|
+
tools: 'Read, Write, Bash',
|
|
138
|
+
requiredIncludes: [],
|
|
139
|
+
requiredSeamCalls: [
|
|
140
|
+
'gsd-tools query commit',
|
|
141
|
+
],
|
|
142
|
+
outputContract: [
|
|
143
|
+
'.planning/research/SUMMARY.md',
|
|
144
|
+
'## SYNTHESIS COMPLETE',
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
module.exports = { PROFILES };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { spawnSync } = require('child_process');
|
|
4
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
5
|
+
|
|
6
|
+
const CROSS_PLATFORM_TEST_REASON = Object.freeze({
|
|
7
|
+
PASS: 'pass',
|
|
8
|
+
TEST_FAILURE: 'test_failure',
|
|
9
|
+
INFRA_FAILURE: 'infra_failure',
|
|
10
|
+
UNKNOWN_FAILURE: 'unknown_failure',
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
function classify(exitCode, output) {
|
|
14
|
+
if (exitCode === 0) return CROSS_PLATFORM_TEST_REASON.PASS;
|
|
15
|
+
if (exitCode === 2 || /infrastructure failure|worktree\.Construct/i.test(output)) {
|
|
16
|
+
return CROSS_PLATFORM_TEST_REASON.INFRA_FAILURE;
|
|
17
|
+
}
|
|
18
|
+
if (/\bFAIL\b|\d+\s+failures?\)/i.test(output)) {
|
|
19
|
+
return CROSS_PLATFORM_TEST_REASON.TEST_FAILURE;
|
|
20
|
+
}
|
|
21
|
+
return CROSS_PLATFORM_TEST_REASON.UNKNOWN_FAILURE;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function runCrossPlatformTests(options = {}, deps = {}) {
|
|
25
|
+
const {
|
|
26
|
+
base = 'next',
|
|
27
|
+
head = 'HEAD',
|
|
28
|
+
source = '.',
|
|
29
|
+
targets = 'linux,macos',
|
|
30
|
+
cwd = process.cwd(),
|
|
31
|
+
} = options;
|
|
32
|
+
const runner = deps.spawnSync || spawnSync;
|
|
33
|
+
|
|
34
|
+
const args = ['--targets', targets, '--base', base, '--head', head, '--source', source];
|
|
35
|
+
const result = runner('gsd-test', args, { cwd, encoding: 'utf8' });
|
|
36
|
+
|
|
37
|
+
const stdout = result.stdout || '';
|
|
38
|
+
const stderr = result.stderr || '';
|
|
39
|
+
const output = `${stdout}\n${stderr}`;
|
|
40
|
+
const exitCode = Number(result.status ?? 1);
|
|
41
|
+
const reason = classify(exitCode, output);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
ok: exitCode === 0,
|
|
45
|
+
reason,
|
|
46
|
+
exitCode,
|
|
47
|
+
command: ['gsd-test', ...args].join(' '),
|
|
48
|
+
stdout,
|
|
49
|
+
stderr,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (require.main === module) {
|
|
54
|
+
function main() {
|
|
55
|
+
const result = runCrossPlatformTests();
|
|
56
|
+
const line = `[cross-platform-tests] reason=${result.reason} exit=${result.exitCode}`;
|
|
57
|
+
if (result.ok) {
|
|
58
|
+
process.stdout.write(`${line}\n`);
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
process.stderr.write(`${line}\n`);
|
|
62
|
+
throw new ExitError(result.exitCode);
|
|
63
|
+
}
|
|
64
|
+
runMain(main);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = { CROSS_PLATFORM_TEST_REASON, runCrossPlatformTests };
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Cross-platform test runner — resolves test file globs via Node
|
|
3
|
+
// instead of relying on shell expansion (which fails on Windows PowerShell/cmd).
|
|
4
|
+
// Propagates NODE_V8_COVERAGE so c8 collects coverage from the child process.
|
|
5
|
+
//
|
|
6
|
+
// Suite filtering (issue #3597):
|
|
7
|
+
// node scripts/run-tests.cjs # default — runs ALL tests (backcompat)
|
|
8
|
+
// node scripts/run-tests.cjs --suite all # explicit "everything"
|
|
9
|
+
// node scripts/run-tests.cjs --suite unit # only files with no other suite marker
|
|
10
|
+
// node scripts/run-tests.cjs --suite security # *.security.test.cjs
|
|
11
|
+
// node scripts/run-tests.cjs --suite integration # *.integration.test.cjs
|
|
12
|
+
// node scripts/run-tests.cjs --suite install # *.install.test.cjs
|
|
13
|
+
// node scripts/run-tests.cjs --suite slow # *.slow.test.cjs
|
|
14
|
+
// node scripts/run-tests.cjs --files "a.test.cjs b.test.cjs"
|
|
15
|
+
// node scripts/run-tests.cjs --files-from /tmp/selected-tests.txt
|
|
16
|
+
//
|
|
17
|
+
// Suite grouping convention: filename suffix marker before `.test.cjs`.
|
|
18
|
+
// A file named `foo.security.test.cjs` belongs to the `security` suite.
|
|
19
|
+
// A file named `foo.test.cjs` (no marker) belongs to the `unit` suite.
|
|
20
|
+
// See docs/TESTING-SUITES.md for full grouping policy.
|
|
21
|
+
'use strict';
|
|
22
|
+
|
|
23
|
+
const { readdirSync, existsSync } = require('fs');
|
|
24
|
+
const { join } = require('path');
|
|
25
|
+
const { execFileSync } = require('child_process');
|
|
26
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
27
|
+
|
|
28
|
+
const SUITES = ['all', 'unit', 'integration', 'install', 'security', 'slow'];
|
|
29
|
+
|
|
30
|
+
// ADR-457 build-at-publish: gsd-core/bin/lib/*.cjs is generated from
|
|
31
|
+
// src/*.cts and gitignored, so on a clean checkout (fresh CI, before any build)
|
|
32
|
+
// the artifact is absent — yet test files require it. This is the universal
|
|
33
|
+
// chokepoint every test path funnels through (test:unit, --files-from, direct
|
|
34
|
+
// invocation), so build the artifact here if missing. It is a no-op once built
|
|
35
|
+
// (dev, pretest, a prior run in the same job), which keeps the harness test's
|
|
36
|
+
// spawned invocations side-effect-free. Paths resolve from __dirname (not cwd),
|
|
37
|
+
// so it works regardless of GSD_TEST_DIR / temp-dir cwd. NOTE: the sentinel is
|
|
38
|
+
// the pilot module; revisit (or switch to an unconditional quiet build) as more
|
|
39
|
+
// modules migrate into src/.
|
|
40
|
+
function ensureBuiltArtifacts() {
|
|
41
|
+
const root = join(__dirname, '..');
|
|
42
|
+
const sentinel = join(root, 'gsd-core', 'bin', 'lib', 'semver-compare.cjs');
|
|
43
|
+
if (existsSync(sentinel)) return;
|
|
44
|
+
const tscBin = require.resolve('typescript/bin/tsc');
|
|
45
|
+
execFileSync(process.execPath, [tscBin, '-p', join(root, 'tsconfig.build.json')], {
|
|
46
|
+
cwd: root,
|
|
47
|
+
stdio: 'inherit',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const MARKED_SUITES = ['integration', 'install', 'security', 'slow'];
|
|
51
|
+
|
|
52
|
+
function parseArgs(argv) {
|
|
53
|
+
let suite = null;
|
|
54
|
+
let seen = false;
|
|
55
|
+
let files = null;
|
|
56
|
+
let filesFrom = null;
|
|
57
|
+
for (let i = 0; i < argv.length; i++) {
|
|
58
|
+
const a = argv[i];
|
|
59
|
+
if (a === '--suite') {
|
|
60
|
+
if (seen) {
|
|
61
|
+
return { error: 'duplicate --suite flag' };
|
|
62
|
+
}
|
|
63
|
+
seen = true;
|
|
64
|
+
const v = argv[i + 1];
|
|
65
|
+
if (!v || v.startsWith('--')) {
|
|
66
|
+
return { error: '--suite requires a value' };
|
|
67
|
+
}
|
|
68
|
+
suite = v;
|
|
69
|
+
i++;
|
|
70
|
+
} else if (a.startsWith('--suite=')) {
|
|
71
|
+
if (seen) {
|
|
72
|
+
return { error: 'duplicate --suite flag' };
|
|
73
|
+
}
|
|
74
|
+
seen = true;
|
|
75
|
+
suite = a.slice('--suite='.length);
|
|
76
|
+
if (!suite) {
|
|
77
|
+
return { error: '--suite requires a value' };
|
|
78
|
+
}
|
|
79
|
+
} else if (a === '--files') {
|
|
80
|
+
if (files !== null) {
|
|
81
|
+
return { error: 'duplicate --files flag' };
|
|
82
|
+
}
|
|
83
|
+
const v = argv[i + 1];
|
|
84
|
+
if (!v || v.startsWith('--')) {
|
|
85
|
+
return { error: '--files requires a value' };
|
|
86
|
+
}
|
|
87
|
+
files = v;
|
|
88
|
+
i++;
|
|
89
|
+
} else if (a.startsWith('--files=')) {
|
|
90
|
+
if (files !== null) {
|
|
91
|
+
return { error: 'duplicate --files flag' };
|
|
92
|
+
}
|
|
93
|
+
files = a.slice('--files='.length);
|
|
94
|
+
if (!files) {
|
|
95
|
+
return { error: '--files requires a value' };
|
|
96
|
+
}
|
|
97
|
+
} else if (a === '--files-from') {
|
|
98
|
+
if (filesFrom !== null) {
|
|
99
|
+
return { error: 'duplicate --files-from flag' };
|
|
100
|
+
}
|
|
101
|
+
const v = argv[i + 1];
|
|
102
|
+
if (!v || v.startsWith('--')) {
|
|
103
|
+
return { error: '--files-from requires a value' };
|
|
104
|
+
}
|
|
105
|
+
filesFrom = v;
|
|
106
|
+
i++;
|
|
107
|
+
} else if (a.startsWith('--files-from=')) {
|
|
108
|
+
if (filesFrom !== null) {
|
|
109
|
+
return { error: 'duplicate --files-from flag' };
|
|
110
|
+
}
|
|
111
|
+
filesFrom = a.slice('--files-from='.length);
|
|
112
|
+
if (!filesFrom) {
|
|
113
|
+
return { error: '--files-from requires a value' };
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
return { error: `unknown argument: ${a}` };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (files !== null && filesFrom !== null) {
|
|
120
|
+
return { error: '--files and --files-from cannot be combined' };
|
|
121
|
+
}
|
|
122
|
+
return { suite, files, filesFrom };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Return the marked suite name embedded in a filename, or null if it's unmarked.
|
|
126
|
+
// foo.security.test.cjs -> "security"
|
|
127
|
+
// foo.test.cjs -> null (unit)
|
|
128
|
+
function suiteOf(filename) {
|
|
129
|
+
if (!filename.endsWith('.test.cjs')) return null;
|
|
130
|
+
const base = filename.slice(0, -'.test.cjs'.length);
|
|
131
|
+
const lastDot = base.lastIndexOf('.');
|
|
132
|
+
if (lastDot === -1) return null;
|
|
133
|
+
const marker = base.slice(lastDot + 1);
|
|
134
|
+
return MARKED_SUITES.includes(marker) ? marker : null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function selectFiles(allFiles, suite) {
|
|
138
|
+
if (suite === null || suite === 'all') {
|
|
139
|
+
return allFiles;
|
|
140
|
+
}
|
|
141
|
+
if (suite === 'unit') {
|
|
142
|
+
return allFiles.filter(f => suiteOf(f) === null);
|
|
143
|
+
}
|
|
144
|
+
return allFiles.filter(f => suiteOf(f) === suite);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function splitFileList(value) {
|
|
148
|
+
if (!value) return [];
|
|
149
|
+
return value
|
|
150
|
+
.split(/[,\s]+/)
|
|
151
|
+
.map(v => v.trim())
|
|
152
|
+
.filter(Boolean)
|
|
153
|
+
.map(v => v.replace(/^tests[\\/]/, ''));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function selectExplicitFiles(allFiles, filesValue, filesFrom) {
|
|
157
|
+
const fs = require('fs');
|
|
158
|
+
const requested = filesFrom
|
|
159
|
+
? splitFileList(fs.readFileSync(filesFrom, 'utf8'))
|
|
160
|
+
: splitFileList(filesValue);
|
|
161
|
+
const available = new Set(allFiles);
|
|
162
|
+
const selected = [];
|
|
163
|
+
const missing = [];
|
|
164
|
+
for (const file of requested) {
|
|
165
|
+
// If the token is a bare suite name (e.g. "unit" written by ci-test-scope
|
|
166
|
+
// as the #408 fallback sentinel), delegate to the existing suite resolver
|
|
167
|
+
// rather than treating it as a filename. This prevents the
|
|
168
|
+
// "requested test file(s) not found: unit" crash (#641).
|
|
169
|
+
if (SUITES.includes(file)) {
|
|
170
|
+
for (const f of selectFiles(allFiles, file)) {
|
|
171
|
+
selected.push(f);
|
|
172
|
+
}
|
|
173
|
+
} else if (available.has(file)) {
|
|
174
|
+
selected.push(file);
|
|
175
|
+
} else {
|
|
176
|
+
missing.push(file);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (missing.length > 0) {
|
|
180
|
+
return {
|
|
181
|
+
error: `requested test file(s) not found: ${missing.join(', ')}`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return { files: [...new Set(selected)] };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function main() {
|
|
188
|
+
const args = process.argv.slice(2);
|
|
189
|
+
const parsed = parseArgs(args);
|
|
190
|
+
if (parsed.error) {
|
|
191
|
+
console.error(`run-tests: ${parsed.error}`);
|
|
192
|
+
console.error(`Valid suites: ${SUITES.join(', ')}`);
|
|
193
|
+
throw new ExitError(2);
|
|
194
|
+
}
|
|
195
|
+
const suite = parsed.suite;
|
|
196
|
+
if (suite !== null && !SUITES.includes(suite)) {
|
|
197
|
+
console.error(`run-tests: unknown suite "${suite}"`);
|
|
198
|
+
console.error(`Valid suites: ${SUITES.join(', ')}`);
|
|
199
|
+
throw new ExitError(2);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const testDir = process.env.GSD_TEST_DIR
|
|
203
|
+
? process.env.GSD_TEST_DIR
|
|
204
|
+
: join(__dirname, '..', 'tests');
|
|
205
|
+
|
|
206
|
+
const allFiles = readdirSync(testDir)
|
|
207
|
+
.filter(f => f.endsWith('.test.cjs'))
|
|
208
|
+
.sort();
|
|
209
|
+
|
|
210
|
+
if (allFiles.length === 0) {
|
|
211
|
+
console.error(`No test files found in ${testDir}`);
|
|
212
|
+
throw new ExitError(1);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
let selectedNames;
|
|
216
|
+
if (parsed.files !== null || parsed.filesFrom !== null) {
|
|
217
|
+
const explicit = selectExplicitFiles(allFiles, parsed.files, parsed.filesFrom);
|
|
218
|
+
if (explicit.error) {
|
|
219
|
+
console.error(`run-tests: ${explicit.error}`);
|
|
220
|
+
throw new ExitError(2);
|
|
221
|
+
}
|
|
222
|
+
selectedNames = explicit.files;
|
|
223
|
+
} else {
|
|
224
|
+
selectedNames = selectFiles(allFiles, suite);
|
|
225
|
+
}
|
|
226
|
+
const selected = selectedNames.map(f => join(testDir, f));
|
|
227
|
+
|
|
228
|
+
if (selected.length === 0) {
|
|
229
|
+
// Empty suite: report and exit 0 so empty lanes (e.g. `security` before
|
|
230
|
+
// adversarial tests land) don't gate CI. CI consumers wanting strictness
|
|
231
|
+
// can grep stderr for "no tests in suite".
|
|
232
|
+
console.error(`run-tests: no tests in suite "${suite || 'all'}"`);
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Build the gitignored bin/lib artifact if absent, before any test requires it.
|
|
237
|
+
ensureBuiltArtifacts();
|
|
238
|
+
|
|
239
|
+
// Log selected files to stderr for CI / harness-test visibility.
|
|
240
|
+
// node:test default reporter doesn't echo filenames, so this gives
|
|
241
|
+
// operators a single stable line they can grep.
|
|
242
|
+
console.error(
|
|
243
|
+
`run-tests: suite="${suite || 'all'}" files=${selected.length}: ${selected
|
|
244
|
+
.map(f => f.split(/[\\/]/).pop())
|
|
245
|
+
.join(' ')}`,
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// Default concurrency: 4 on Linux/macOS, 2 on Windows.
|
|
249
|
+
//
|
|
250
|
+
// Windows has significantly higher per-subprocess overhead than Linux/macOS:
|
|
251
|
+
// - Windows Defender scans each spawned process
|
|
252
|
+
// - NTFS has higher file-system latency under concurrent access
|
|
253
|
+
// - synckit worker_threads (used by the SDK bridge in gsd-tools.cjs) spawn
|
|
254
|
+
// native threads that contend on SharedArrayBuffer + Atomics.wait; under
|
|
255
|
+
// Node 24 on Windows, 4-way concurrent gsd-tools invocations (each spawning
|
|
256
|
+
// a synckit worker) caused intermittent process crashes with empty stderr —
|
|
257
|
+
// a signature of OS-level resource exhaustion killing worker threads before
|
|
258
|
+
// they could flush. Reducing to 2 halves the peak concurrent worker count.
|
|
259
|
+
//
|
|
260
|
+
// Operator override via TEST_CONCURRENCY env var for local debugging.
|
|
261
|
+
const defaultConcurrency = process.platform === 'win32' ? 2 : 4;
|
|
262
|
+
const concurrency = process.env.TEST_CONCURRENCY
|
|
263
|
+
? `--test-concurrency=${process.env.TEST_CONCURRENCY}`
|
|
264
|
+
: `--test-concurrency=${defaultConcurrency}`;
|
|
265
|
+
|
|
266
|
+
// Windows `CreateProcess` caps the full command line at 32,767 chars
|
|
267
|
+
// (lpCommandLine). With 500+ test paths the spawn fails instantly with no
|
|
268
|
+
// test output. Linux/macOS allow ~2 MB (ARG_MAX) so unchunked spawns are
|
|
269
|
+
// fine there. Split into chunks sized for the tightest target so behavior
|
|
270
|
+
// is identical across platforms. (#3597)
|
|
271
|
+
// Operator override (also used by tests to force chunking with short paths).
|
|
272
|
+
const MAX_CMDLINE_CHARS = process.env.RUN_TESTS_MAX_CMDLINE_CHARS
|
|
273
|
+
? Number(process.env.RUN_TESTS_MAX_CMDLINE_CHARS)
|
|
274
|
+
: 28000; // headroom below the 32,767 Windows ceiling
|
|
275
|
+
const FIXED_OVERHEAD = process.execPath.length + '--test'.length + concurrency.length + 8;
|
|
276
|
+
const chunks = [];
|
|
277
|
+
let current = [];
|
|
278
|
+
let currentLen = FIXED_OVERHEAD;
|
|
279
|
+
for (const file of selected) {
|
|
280
|
+
const add = file.length + 1; // +1 for the inter-arg separator
|
|
281
|
+
if (current.length > 0 && currentLen + add > MAX_CMDLINE_CHARS) {
|
|
282
|
+
chunks.push(current);
|
|
283
|
+
current = [];
|
|
284
|
+
currentLen = FIXED_OVERHEAD;
|
|
285
|
+
}
|
|
286
|
+
current.push(file);
|
|
287
|
+
currentLen += add;
|
|
288
|
+
}
|
|
289
|
+
if (current.length > 0) chunks.push(current);
|
|
290
|
+
|
|
291
|
+
let firstFailureExit = 0;
|
|
292
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
293
|
+
if (chunks.length > 1) {
|
|
294
|
+
console.error(`run-tests: chunk ${i + 1}/${chunks.length} — ${chunks[i].length} files`);
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
execFileSync(process.execPath, ['--test', concurrency, ...chunks[i]], {
|
|
298
|
+
stdio: 'inherit',
|
|
299
|
+
env: { ...process.env },
|
|
300
|
+
});
|
|
301
|
+
} catch (err) {
|
|
302
|
+
const code = err.status || 1;
|
|
303
|
+
// Run every chunk so the operator sees all failures in one pass; report
|
|
304
|
+
// the first non-zero exit at the end.
|
|
305
|
+
if (firstFailureExit === 0) firstFailureExit = code;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (firstFailureExit !== 0) return firstFailureExit;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (require.main === module) {
|
|
312
|
+
runMain(main);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
module.exports = { suiteOf };
|