@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,147 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* One-shot script + library: bidirectional GSD slash-command namespace normalizer.
|
|
4
|
+
*
|
|
5
|
+
* - Default direction (transformContent): retired /gsd-<cmd> → /gsd:<cmd>
|
|
6
|
+
* (keeps monorepo sources, docs, and workflows in the active colon form).
|
|
7
|
+
* - Reverse direction (transformContentToHyphen): /gsd:<cmd> / gsd:<cmd> → gsd-<cmd>
|
|
8
|
+
* (used during skill installation for runtimes that register skills under the
|
|
9
|
+
* canonical hyphen form established in #2808).
|
|
10
|
+
*
|
|
11
|
+
* Both directions only rewrite known commands from `commands/gsd/*.md` (longest-first
|
|
12
|
+
* matching + word-boundary safety). Non-commands (gsd-sdk, gsd-tools, etc.) are
|
|
13
|
+
* intentionally left untouched.
|
|
14
|
+
*
|
|
15
|
+
* The transforms are pure and exported for use by the installer and tests.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const fs = require('node:fs');
|
|
19
|
+
const path = require('node:path');
|
|
20
|
+
|
|
21
|
+
const COMMANDS_DIR = path.join(__dirname, '..', 'commands', 'gsd');
|
|
22
|
+
const SEARCH_DIRS = [
|
|
23
|
+
path.join(__dirname, '..', 'gsd-core', 'bin', 'lib'),
|
|
24
|
+
path.join(__dirname, '..', 'gsd-core', 'workflows'),
|
|
25
|
+
path.join(__dirname, '..', 'gsd-core', 'references'),
|
|
26
|
+
path.join(__dirname, '..', 'gsd-core', 'templates'),
|
|
27
|
+
path.join(__dirname, '..', 'gsd-core', 'contexts'),
|
|
28
|
+
path.join(__dirname, '..', 'commands', 'gsd'),
|
|
29
|
+
path.join(__dirname, '..', 'agents'),
|
|
30
|
+
path.join(__dirname, '..', 'hooks'),
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const TOP_LEVEL_FILES = [
|
|
34
|
+
path.join(__dirname, '..', '.clinerules'),
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const SKIP_DIRS = new Set(['node_modules', 'dist', '.turbo']);
|
|
38
|
+
const EXTENSIONS = new Set(['.md', '.cjs', '.js', '.ts', '.tsx']);
|
|
39
|
+
|
|
40
|
+
// Test files contain intentional fixture strings (e.g. inputs the sanitizer
|
|
41
|
+
// is expected to strip). Rewriting them changes test semantics.
|
|
42
|
+
function isTestFile(name) {
|
|
43
|
+
return /\.test\.(c?js|tsx?)$/.test(name);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function buildPattern(cmdNames) {
|
|
47
|
+
// Empty input would compile `/gsd-()(?=[^a-zA-Z0-9_-]|$)/g`, which the regex
|
|
48
|
+
// engine still matches at any `/gsd-` token followed by a non-word boundary
|
|
49
|
+
// (e.g. EOL, whitespace, punctuation) — rewriting it to a stray `/gsd:`.
|
|
50
|
+
// Short-circuit so the caller can no-op on a missing/empty registry rather
|
|
51
|
+
// than perform an unintended broad rewrite.
|
|
52
|
+
if (!Array.isArray(cmdNames) || cmdNames.length === 0) return null;
|
|
53
|
+
const sorted = [...cmdNames].sort((a, b) => b.length - a.length); // longest first to avoid partial matches
|
|
54
|
+
return new RegExp(`/gsd-(${sorted.join('|')})(?=[^a-zA-Z0-9_-]|$)`, 'g');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Pure transform: rewrite retired `/gsd-<cmd>` to `/gsd:<cmd>` for the given command names.
|
|
59
|
+
* Returns the rewritten string. Identifiers not in `cmdNames` (e.g. `/gsd-sdk`,
|
|
60
|
+
* `/gsd-tools`) are left untouched.
|
|
61
|
+
*/
|
|
62
|
+
function transformContent(src, cmdNames) {
|
|
63
|
+
const pattern = buildPattern(cmdNames);
|
|
64
|
+
if (!pattern) return src;
|
|
65
|
+
return src.replace(pattern, (_, cmd) => `/gsd:${cmd}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Build regex for the reverse direction (colon form → hyphen form).
|
|
70
|
+
* Matches both "gsd:cmd" and "/gsd:cmd" (the leading / is preserved automatically
|
|
71
|
+
* because it is not part of the match). Uses longest-first ordering plus
|
|
72
|
+
* bidirectional word-boundary safety (negative lookbehind on the left, lookahead
|
|
73
|
+
* on the right) so matches only occur at token boundaries.
|
|
74
|
+
*/
|
|
75
|
+
function buildColonPattern(cmdNames) {
|
|
76
|
+
if (!Array.isArray(cmdNames) || cmdNames.length === 0) return null;
|
|
77
|
+
const sorted = [...cmdNames].sort((a, b) => b.length - a.length);
|
|
78
|
+
return new RegExp(`(?<![a-zA-Z0-9_-])gsd:(${sorted.join('|')})(?=[^a-zA-Z0-9_-]|$)`, 'g');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Pure transform (reverse): rewrite `/gsd:<cmd>` / `gsd:<cmd>` to hyphen form
|
|
83
|
+
* for known GSD commands.
|
|
84
|
+
*
|
|
85
|
+
* Non-command identifiers (e.g. gsd-sdk, gsd-tools) are left untouched, matching
|
|
86
|
+
* the safety contract of the forward transform.
|
|
87
|
+
*/
|
|
88
|
+
function transformContentToHyphen(src, cmdNames) {
|
|
89
|
+
const pattern = buildColonPattern(cmdNames);
|
|
90
|
+
if (!pattern) return src;
|
|
91
|
+
return src.replace(pattern, (_, cmd) => `gsd-${cmd}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function readCmdNames() {
|
|
95
|
+
return fs.readdirSync(COMMANDS_DIR)
|
|
96
|
+
.filter(f => f.endsWith('.md'))
|
|
97
|
+
.map(f => f.replace(/\.md$/, ''));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function processFile(file, cmdNames) {
|
|
101
|
+
const pattern = buildPattern(cmdNames);
|
|
102
|
+
if (!pattern) return;
|
|
103
|
+
let src;
|
|
104
|
+
try { src = fs.readFileSync(file, 'utf-8'); } catch { return; }
|
|
105
|
+
const replaced = transformContent(src, cmdNames);
|
|
106
|
+
if (replaced !== src) {
|
|
107
|
+
fs.writeFileSync(file, replaced, 'utf-8');
|
|
108
|
+
const count = (src.match(pattern) || []).length;
|
|
109
|
+
console.log(` ${count} replacements: ${path.relative(path.join(__dirname, '..'), file)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function processDir(dir, cmdNames) {
|
|
114
|
+
const pattern = buildPattern(cmdNames);
|
|
115
|
+
if (!pattern) return;
|
|
116
|
+
let entries;
|
|
117
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
118
|
+
for (const e of entries) {
|
|
119
|
+
const full = path.join(dir, e.name);
|
|
120
|
+
if (e.isDirectory()) {
|
|
121
|
+
if (SKIP_DIRS.has(e.name)) continue;
|
|
122
|
+
processDir(full, cmdNames);
|
|
123
|
+
} else if (EXTENSIONS.has(path.extname(e.name)) && !isTestFile(e.name)) {
|
|
124
|
+
processFile(full, cmdNames);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (require.main === module) {
|
|
130
|
+
const cmdNames = readCmdNames();
|
|
131
|
+
for (const dir of SEARCH_DIRS) {
|
|
132
|
+
processDir(dir, cmdNames);
|
|
133
|
+
}
|
|
134
|
+
for (const file of TOP_LEVEL_FILES) {
|
|
135
|
+
processFile(file, cmdNames);
|
|
136
|
+
}
|
|
137
|
+
console.log('Done.');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
module.exports = {
|
|
141
|
+
transformContent,
|
|
142
|
+
transformContentToHyphen,
|
|
143
|
+
buildPattern,
|
|
144
|
+
buildColonPattern,
|
|
145
|
+
readCmdNames,
|
|
146
|
+
SKIP_DIRS
|
|
147
|
+
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates docs/INVENTORY-MANIFEST.json — a structural skeleton of every
|
|
6
|
+
* shipped surface derived entirely from the filesystem. Commit this file;
|
|
7
|
+
* CI re-runs the script and diffs. A non-empty diff means a surface shipped
|
|
8
|
+
* without an INVENTORY.md row.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* node scripts/gen-inventory-manifest.cjs # print to stdout
|
|
12
|
+
* node scripts/gen-inventory-manifest.cjs --write # write docs/INVENTORY-MANIFEST.json
|
|
13
|
+
* node scripts/gen-inventory-manifest.cjs --check # exit 1 if committed manifest is stale
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('node:fs');
|
|
17
|
+
const path = require('node:path');
|
|
18
|
+
|
|
19
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
20
|
+
|
|
21
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
22
|
+
const MANIFEST_PATH = path.join(ROOT, 'docs', 'INVENTORY-MANIFEST.json');
|
|
23
|
+
|
|
24
|
+
const FAMILIES = [
|
|
25
|
+
{
|
|
26
|
+
name: 'agents',
|
|
27
|
+
dir: path.join(ROOT, 'agents'),
|
|
28
|
+
filter: (f) => /^gsd-.*\.md$/.test(f),
|
|
29
|
+
toName: (f) => f.replace(/\.md$/, ''),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'commands',
|
|
33
|
+
dir: path.join(ROOT, 'commands', 'gsd'),
|
|
34
|
+
filter: (f) => f.endsWith('.md'),
|
|
35
|
+
toName: (f) => '/gsd-' + f.replace(/\.md$/, ''),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'workflows',
|
|
39
|
+
dir: path.join(ROOT, 'gsd-core', 'workflows'),
|
|
40
|
+
filter: (f) => f.endsWith('.md'),
|
|
41
|
+
toName: (f) => f,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'references',
|
|
45
|
+
dir: path.join(ROOT, 'gsd-core', 'references'),
|
|
46
|
+
filter: (f) => f.endsWith('.md'),
|
|
47
|
+
toName: (f) => f,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'cli_modules',
|
|
51
|
+
dir: path.join(ROOT, 'gsd-core', 'bin', 'lib'),
|
|
52
|
+
filter: (f) => f.endsWith('.cjs'),
|
|
53
|
+
toName: (f) => f,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'hooks',
|
|
57
|
+
dir: path.join(ROOT, 'hooks'),
|
|
58
|
+
filter: (f) => /\.(js|sh)$/.test(f),
|
|
59
|
+
toName: (f) => f,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
function buildManifest() {
|
|
64
|
+
const manifest = { generated: new Date().toISOString().slice(0, 10), families: {} };
|
|
65
|
+
for (const { name, dir, filter, toName } of FAMILIES) {
|
|
66
|
+
manifest.families[name] = fs
|
|
67
|
+
.readdirSync(dir)
|
|
68
|
+
.filter((f) => fs.statSync(path.join(dir, f)).isFile() && filter(f))
|
|
69
|
+
.map(toName)
|
|
70
|
+
.sort();
|
|
71
|
+
}
|
|
72
|
+
return manifest;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function main() {
|
|
76
|
+
const [, , flag] = process.argv;
|
|
77
|
+
|
|
78
|
+
if (flag === '--check') {
|
|
79
|
+
const committed = JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8'));
|
|
80
|
+
const live = buildManifest();
|
|
81
|
+
// Strip the generated date for comparison
|
|
82
|
+
delete committed.generated;
|
|
83
|
+
delete live.generated;
|
|
84
|
+
const committedStr = JSON.stringify(committed, null, 2);
|
|
85
|
+
const liveStr = JSON.stringify(live, null, 2);
|
|
86
|
+
if (committedStr !== liveStr) {
|
|
87
|
+
process.stderr.write(
|
|
88
|
+
'docs/INVENTORY-MANIFEST.json is stale. Run:\n' +
|
|
89
|
+
' node scripts/gen-inventory-manifest.cjs --write\n' +
|
|
90
|
+
'then add a matching row in docs/INVENTORY.md for each new entry.\n\n',
|
|
91
|
+
);
|
|
92
|
+
// Show diff-friendly output
|
|
93
|
+
for (const family of Object.keys(live.families)) {
|
|
94
|
+
const liveSet = new Set(live.families[family]);
|
|
95
|
+
const committedSet = new Set((committed.families || {})[family] || []);
|
|
96
|
+
for (const name of liveSet) {
|
|
97
|
+
if (!committedSet.has(name)) process.stderr.write(' + ' + family + '/' + name + '\n');
|
|
98
|
+
}
|
|
99
|
+
for (const name of committedSet) {
|
|
100
|
+
if (!liveSet.has(name)) process.stderr.write(' - ' + family + '/' + name + '\n');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
throw new ExitError(1);
|
|
104
|
+
}
|
|
105
|
+
process.stdout.write('docs/INVENTORY-MANIFEST.json is up to date.\n');
|
|
106
|
+
} else if (flag === '--write') {
|
|
107
|
+
const manifest = buildManifest();
|
|
108
|
+
fs.writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2) + '\n');
|
|
109
|
+
process.stdout.write('Wrote ' + MANIFEST_PATH + '\n');
|
|
110
|
+
} else {
|
|
111
|
+
process.stdout.write(JSON.stringify(buildManifest(), null, 2) + '\n');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
runMain(main);
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* gen-research-agents.cjs — profile-driven drift guard for the 7 researcher agents.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node scripts/gen-research-agents.cjs # same as --check
|
|
9
|
+
* node scripts/gen-research-agents.cjs --check # assert every agent matches its profile
|
|
10
|
+
* node scripts/gen-research-agents.cjs --write # regenerate frontmatter from profiles
|
|
11
|
+
*
|
|
12
|
+
* --check assertions per agent:
|
|
13
|
+
* (a) frontmatter name/description/color/tools exactly match the profile
|
|
14
|
+
* (b) every requiredInclude string is present in the body
|
|
15
|
+
* (c) every requiredSeamCall string is present in the body
|
|
16
|
+
* (d) every outputContract marker string is present in the body
|
|
17
|
+
*
|
|
18
|
+
* --write regenerates ONLY the opening `---\n...\n---` frontmatter block from the
|
|
19
|
+
* profile, leaving the body byte-identical. After --write, --check must pass and
|
|
20
|
+
* `git diff` must be empty (profiles were derived from current state).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const fs = require('node:fs');
|
|
24
|
+
const path = require('node:path');
|
|
25
|
+
|
|
26
|
+
const { PROFILES } = require('./research-profiles.cjs');
|
|
27
|
+
const { ExitError, runMain } = require('./lib/cli-exit.cjs');
|
|
28
|
+
|
|
29
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
30
|
+
const AGENTS_DIR = path.join(ROOT, 'agents');
|
|
31
|
+
|
|
32
|
+
// ─── Frontmatter serialization ────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build the frontmatter block for a profile.
|
|
36
|
+
*
|
|
37
|
+
* The agent files have two patterns for commented hooks:
|
|
38
|
+
* - Agents with Write in tools (file-writers): include the commented hooks block
|
|
39
|
+
* - The advisor-researcher (Read-only tools, no Write): no commented hooks
|
|
40
|
+
*
|
|
41
|
+
* We read the CURRENT commented-hooks block from the agent file and preserve it
|
|
42
|
+
* byte-for-byte; only name/description/tools/color are regenerated.
|
|
43
|
+
*/
|
|
44
|
+
function buildFrontmatter(profile, existingFrontmatter) {
|
|
45
|
+
// Extract the commented hooks section from the existing frontmatter, if any.
|
|
46
|
+
// The hooks block starts at `# hooks:` and runs to (but not including) the
|
|
47
|
+
// closing `---`. In the committed files there is NO blank line between
|
|
48
|
+
// `color:` and `# hooks:`, so we append it directly after the color line's `\n`.
|
|
49
|
+
const hooksMatch = existingFrontmatter.match(/(# hooks:[\s\S]*?)(?=\n---)/);
|
|
50
|
+
// hooksSuffix: if present, the block followed by a newline so `---` is on its own line;
|
|
51
|
+
// if absent, empty string (the closing `---` follows directly after color's `\n`).
|
|
52
|
+
const hooksSuffix = hooksMatch ? hooksMatch[1] + '\n' : '';
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
'---\n' +
|
|
56
|
+
'name: ' + profile.name + '\n' +
|
|
57
|
+
'description: ' + profile.description + '\n' +
|
|
58
|
+
'tools: ' + profile.tools + '\n' +
|
|
59
|
+
'color: ' + profile.color + '\n' +
|
|
60
|
+
hooksSuffix +
|
|
61
|
+
'---'
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ─── Parse agent file ─────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Parse a .md file and return { frontmatterRaw, body, frontmatterFields }.
|
|
69
|
+
*
|
|
70
|
+
* frontmatterRaw: the raw text between the first and second `---` delimiters (exclusive)
|
|
71
|
+
* body: everything after the closing `---\n`
|
|
72
|
+
* frontmatterFields: { name, description, color, tools }
|
|
73
|
+
*/
|
|
74
|
+
function parseAgentFile(filePath) {
|
|
75
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
76
|
+
|
|
77
|
+
// The frontmatter is between the first `---` line and the next `---` line.
|
|
78
|
+
const lines = raw.split('\n');
|
|
79
|
+
let start = -1;
|
|
80
|
+
let end = -1;
|
|
81
|
+
for (let i = 0; i < lines.length; i++) {
|
|
82
|
+
if (lines[i].trim() === '---') {
|
|
83
|
+
if (start === -1) {
|
|
84
|
+
start = i;
|
|
85
|
+
} else {
|
|
86
|
+
end = i;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (start === -1 || end === -1) {
|
|
93
|
+
throw new Error('No valid frontmatter delimiters found in ' + filePath);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const frontmatterLines = lines.slice(start + 1, end);
|
|
97
|
+
const frontmatterRaw = frontmatterLines.join('\n');
|
|
98
|
+
// body includes the closing `---` line and everything after
|
|
99
|
+
const fullFrontmatter = lines.slice(start, end + 1).join('\n');
|
|
100
|
+
const body = lines.slice(end + 1).join('\n');
|
|
101
|
+
|
|
102
|
+
const fields = {};
|
|
103
|
+
// Parse simple key: value pairs (not nested YAML, no multi-line values here)
|
|
104
|
+
for (const line of frontmatterLines) {
|
|
105
|
+
// Skip comment lines
|
|
106
|
+
if (line.trimStart().startsWith('#')) continue;
|
|
107
|
+
const m = line.match(/^(\w+):\s*(.*)/);
|
|
108
|
+
if (m) {
|
|
109
|
+
fields[m[1]] = m[2].trim();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return { raw, frontmatterRaw, fullFrontmatter, body, fields };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ─── Check ────────────────────────────────────────────────────────────────────
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Check one profile against its agent file.
|
|
120
|
+
* Returns an array of failure strings (empty = pass).
|
|
121
|
+
*/
|
|
122
|
+
function checkAgent(profile) {
|
|
123
|
+
// Validate required array fields — return a clear failure rather than throwing TypeError.
|
|
124
|
+
for (const field of ['requiredIncludes', 'requiredSeamCalls', 'outputContract']) {
|
|
125
|
+
if (!Array.isArray(profile[field])) {
|
|
126
|
+
return ['profile ' + profile.name + ': missing required array field ' + field];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const agentPath = path.join(AGENTS_DIR, profile.name + '.md');
|
|
131
|
+
const failures = [];
|
|
132
|
+
|
|
133
|
+
if (!fs.existsSync(agentPath)) {
|
|
134
|
+
return ['agent file not found: ' + agentPath];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const { fields } = parseAgentFile(agentPath);
|
|
138
|
+
const fullContent = fs.readFileSync(agentPath, 'utf8');
|
|
139
|
+
|
|
140
|
+
// (a) frontmatter fields
|
|
141
|
+
if (fields.name !== profile.name) {
|
|
142
|
+
failures.push(
|
|
143
|
+
'name mismatch: got "' + fields.name + '", want "' + profile.name + '"',
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
if (fields.description !== profile.description) {
|
|
147
|
+
failures.push(
|
|
148
|
+
'description mismatch:\n got: "' + fields.description + '"\n want: "' + profile.description + '"',
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
if (fields.color !== profile.color) {
|
|
152
|
+
failures.push(
|
|
153
|
+
'color mismatch: got "' + fields.color + '", want "' + profile.color + '"',
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
if (fields.tools !== profile.tools) {
|
|
157
|
+
failures.push(
|
|
158
|
+
'tools mismatch:\n got: "' + fields.tools + '"\n want: "' + profile.tools + '"',
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// (b) requiredIncludes
|
|
163
|
+
for (const include of profile.requiredIncludes) {
|
|
164
|
+
if (!fullContent.includes(include)) {
|
|
165
|
+
failures.push('missing required include: ' + include);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// (c) requiredSeamCalls
|
|
170
|
+
for (const seam of profile.requiredSeamCalls) {
|
|
171
|
+
if (!fullContent.includes(seam)) {
|
|
172
|
+
failures.push('missing required seam call: ' + seam);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// (d) outputContract
|
|
177
|
+
for (const marker of profile.outputContract) {
|
|
178
|
+
if (!fullContent.includes(marker)) {
|
|
179
|
+
failures.push('missing output contract marker: ' + marker);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return failures;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Run --check for all profiles. Prints pass/fail per agent.
|
|
188
|
+
* Returns true if all pass, false otherwise.
|
|
189
|
+
*/
|
|
190
|
+
function runCheck() {
|
|
191
|
+
let allPassed = true;
|
|
192
|
+
|
|
193
|
+
for (const profile of PROFILES) {
|
|
194
|
+
const failures = checkAgent(profile);
|
|
195
|
+
if (failures.length === 0) {
|
|
196
|
+
process.stdout.write(' PASS ' + profile.name + '\n');
|
|
197
|
+
} else {
|
|
198
|
+
process.stdout.write(' FAIL ' + profile.name + '\n');
|
|
199
|
+
for (const f of failures) {
|
|
200
|
+
process.stdout.write(' ' + f.replace(/\n/g, '\n ') + '\n');
|
|
201
|
+
}
|
|
202
|
+
allPassed = false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return allPassed;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// ─── Write ────────────────────────────────────────────────────────────────────
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Regenerate the frontmatter block of one agent file from its profile.
|
|
213
|
+
* The body (everything after the closing ---) is preserved byte-for-byte.
|
|
214
|
+
*/
|
|
215
|
+
function writeAgent(profile) {
|
|
216
|
+
const agentPath = path.join(AGENTS_DIR, profile.name + '.md');
|
|
217
|
+
const { fullFrontmatter, body } = parseAgentFile(agentPath);
|
|
218
|
+
|
|
219
|
+
const newFrontmatter = buildFrontmatter(profile, fullFrontmatter);
|
|
220
|
+
const newContent = newFrontmatter + '\n' + body;
|
|
221
|
+
|
|
222
|
+
fs.writeFileSync(agentPath, newContent, 'utf8');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function runWrite() {
|
|
226
|
+
for (const profile of PROFILES) {
|
|
227
|
+
const agentPath = path.join(AGENTS_DIR, profile.name + '.md');
|
|
228
|
+
if (!fs.existsSync(agentPath)) {
|
|
229
|
+
throw new ExitError(1, 'ERROR: agent file not found: ' + agentPath);
|
|
230
|
+
}
|
|
231
|
+
writeAgent(profile);
|
|
232
|
+
process.stdout.write(' wrote ' + profile.name + '.md\n');
|
|
233
|
+
}
|
|
234
|
+
process.stdout.write('\nRun --check to verify:\n');
|
|
235
|
+
process.stdout.write(' node scripts/gen-research-agents.cjs --check\n');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ─── Exports (for tests) ──────────────────────────────────────────────────────
|
|
239
|
+
|
|
240
|
+
module.exports = { PROFILES, checkAgent, runCheck, parseAgentFile };
|
|
241
|
+
|
|
242
|
+
// ─── CLI entry point ──────────────────────────────────────────────────────────
|
|
243
|
+
|
|
244
|
+
function main() {
|
|
245
|
+
const flag = process.argv[2] || '--check';
|
|
246
|
+
|
|
247
|
+
if (flag === '--write') {
|
|
248
|
+
process.stdout.write('Writing frontmatter from profiles...\n');
|
|
249
|
+
runWrite();
|
|
250
|
+
process.stdout.write('\nVerifying...\n');
|
|
251
|
+
const ok = runCheck();
|
|
252
|
+
if (!ok) {
|
|
253
|
+
process.stderr.write('\nERROR: --check failed after --write. Fix serialization.\n');
|
|
254
|
+
throw new ExitError(1);
|
|
255
|
+
}
|
|
256
|
+
process.stdout.write('\nAll agents match their profiles.\n');
|
|
257
|
+
} else if (flag === '--check') {
|
|
258
|
+
process.stdout.write('Checking research agent profiles...\n');
|
|
259
|
+
const ok = runCheck();
|
|
260
|
+
if (!ok) {
|
|
261
|
+
process.stderr.write('\nSome agents do not match their profiles.\n');
|
|
262
|
+
process.stdout.write(
|
|
263
|
+
'\nTo regenerate frontmatter from profiles:\n' +
|
|
264
|
+
' node scripts/gen-research-agents.cjs --write\n',
|
|
265
|
+
);
|
|
266
|
+
throw new ExitError(1);
|
|
267
|
+
}
|
|
268
|
+
process.stdout.write('\nAll 7 agents match their profiles.\n');
|
|
269
|
+
} else {
|
|
270
|
+
throw new ExitError(1, 'Unknown flag: ' + flag + '\nUsage: node scripts/gen-research-agents.cjs [--check|--write]');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (require.main === module) {
|
|
275
|
+
runMain(main);
|
|
276
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Single source for GSD's published-package coordinates (issue #498).
|
|
6
|
+
*
|
|
7
|
+
* `deriveIdentity(pkg)` is the pure core: it turns a parsed package.json into
|
|
8
|
+
* the coordinate record every consumer needs. The generated runtime module
|
|
9
|
+
* `gsd-core/bin/lib/package-identity.cjs` bakes those values at build
|
|
10
|
+
* time, because the installed tree carries only a synthetic
|
|
11
|
+
* `{"type":"commonjs"}` package.json (no `.name`) — so a runtime
|
|
12
|
+
* `require('package.json').name` resolves to `undefined` (the #378 bug this
|
|
13
|
+
* seam retires). Baking from package.json reconciles #378 (renames survive)
|
|
14
|
+
* with #2992 (the value is never an LLM runtime choice).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Parse `owner/name` out of a package.json `repository.url`, stripping the
|
|
19
|
+
* `git+` prefix and `.git` suffix npm conventionally adds.
|
|
20
|
+
*/
|
|
21
|
+
function parseRepoSlug(repository) {
|
|
22
|
+
const url = typeof repository === 'string' ? repository : (repository && repository.url) || '';
|
|
23
|
+
const m = url.replace(/^git\+/, '').replace(/\.git$/, '').match(/github\.com[/:]([^/]+\/[^/]+)$/);
|
|
24
|
+
return m ? m[1] : '';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Pure: turn an npm package name into a filesystem-safe slug for cache filenames.
|
|
29
|
+
* Strips a leading `@`, replaces `/` with `-`, then collapses any run of
|
|
30
|
+
* characters that are NOT `[a-z0-9]` to a single `-`, and trims leading/trailing `-`.
|
|
31
|
+
*/
|
|
32
|
+
function slugifyPackageName(name) {
|
|
33
|
+
if (!name) return '';
|
|
34
|
+
return name
|
|
35
|
+
.replace(/^@/, '')
|
|
36
|
+
.replace(/\//g, '-')
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
39
|
+
.replace(/^-+|-+$/g, '');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Pure: package.json object -> the package identity coordinates.
|
|
44
|
+
*/
|
|
45
|
+
function deriveIdentity(pkg = {}) {
|
|
46
|
+
const packageName = pkg.name || '';
|
|
47
|
+
const binName = pkg.bin ? Object.keys(pkg.bin)[0] || '' : '';
|
|
48
|
+
const repoSlug = parseRepoSlug(pkg.repository);
|
|
49
|
+
const repoUrl = repoSlug ? `https://github.com/${repoSlug}` : '';
|
|
50
|
+
const changelogRawUrl = repoSlug
|
|
51
|
+
? `https://raw.githubusercontent.com/${repoSlug}/main/CHANGELOG.md`
|
|
52
|
+
: '';
|
|
53
|
+
const cacheSlug = slugifyPackageName(packageName);
|
|
54
|
+
const updateCacheFileName = cacheSlug ? `gsd-update-check-${cacheSlug}.json` : 'gsd-update-check.json';
|
|
55
|
+
return { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Pure: format the `npx` fallback install command. Shape matches the literal
|
|
60
|
+
* the update workflow embeds: `npx -y --package=<pkg>@latest -- <bin>
|
|
61
|
+
* [--<runtime>] --<scope>`. The runtime flag is omitted when not supplied.
|
|
62
|
+
*
|
|
63
|
+
* This function is the canonical source — `render()` serializes it verbatim
|
|
64
|
+
* into the generated module, so the runtime copy can never drift from it.
|
|
65
|
+
*/
|
|
66
|
+
function formatManualInstall({ packageName, binName, scope, runtime } = {}) {
|
|
67
|
+
const runtimeFlag = runtime ? ` --${runtime}` : '';
|
|
68
|
+
return `npx -y --package=${packageName}@latest -- ${binName}${runtimeFlag} --${scope}`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const GENERATED_HEADER =
|
|
72
|
+
'// @generated by scripts/generate-package-identity.cjs from package.json — DO NOT EDIT.\n' +
|
|
73
|
+
'// Single source for GSD package coordinates (issue #498). Regenerate with:\n' +
|
|
74
|
+
'// node scripts/generate-package-identity.cjs\n';
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Render the generated runtime module text for a derived identity. Values are
|
|
78
|
+
* baked as literals; `formatManualInstall` is embedded by `.toString()` so the
|
|
79
|
+
* runtime command builder is byte-identical to the tested source above.
|
|
80
|
+
*/
|
|
81
|
+
function render(identity) {
|
|
82
|
+
const { packageName, binName, repoSlug, repoUrl, changelogRawUrl, cacheSlug, updateCacheFileName } = identity;
|
|
83
|
+
const j = (v) => JSON.stringify(v);
|
|
84
|
+
return (
|
|
85
|
+
GENERATED_HEADER +
|
|
86
|
+
"'use strict';\n\n" +
|
|
87
|
+
`const packageName = ${j(packageName)};\n` +
|
|
88
|
+
`const binName = ${j(binName)};\n` +
|
|
89
|
+
`const repoSlug = ${j(repoSlug)};\n` +
|
|
90
|
+
`const repoUrl = ${j(repoUrl)};\n` +
|
|
91
|
+
`const changelogRawUrl = ${j(changelogRawUrl)};\n` +
|
|
92
|
+
`const cacheSlug = ${j(cacheSlug)};\n` +
|
|
93
|
+
`const updateCacheFileName = ${j(updateCacheFileName)};\n\n` +
|
|
94
|
+
`${formatManualInstall.toString()}\n\n` +
|
|
95
|
+
'function manualInstallCommand(opts = {}) {\n' +
|
|
96
|
+
' return formatManualInstall({ packageName, binName, scope: opts.scope, runtime: opts.runtime });\n' +
|
|
97
|
+
'}\n\n' +
|
|
98
|
+
'module.exports = Object.freeze({\n' +
|
|
99
|
+
' packageName,\n' +
|
|
100
|
+
' // PACKAGE_NAME: back-compat alias for #516-era consumers. Baked here, so it\n' +
|
|
101
|
+
" // survives the installed tree's synthetic package.json (fixes the #378 undefined).\n" +
|
|
102
|
+
' PACKAGE_NAME: packageName,\n' +
|
|
103
|
+
' binName,\n' +
|
|
104
|
+
' repoSlug,\n' +
|
|
105
|
+
' repoUrl,\n' +
|
|
106
|
+
' changelogRawUrl,\n' +
|
|
107
|
+
' cacheSlug,\n' +
|
|
108
|
+
' updateCacheFileName,\n' +
|
|
109
|
+
' manualInstallCommand,\n' +
|
|
110
|
+
'});\n'
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function main() {
|
|
115
|
+
const fs = require('node:fs');
|
|
116
|
+
const path = require('node:path');
|
|
117
|
+
const pkg = require(path.join(__dirname, '..', 'package.json'));
|
|
118
|
+
const out = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs');
|
|
119
|
+
fs.writeFileSync(out, render(deriveIdentity(pkg)));
|
|
120
|
+
process.stdout.write(`wrote ${path.relative(path.join(__dirname, '..'), out)}\n`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (require.main === module) main();
|
|
124
|
+
|
|
125
|
+
module.exports = { deriveIdentity, parseRepoSlug, slugifyPackageName, formatManualInstall, render, main };
|