@pareto4/pp-core 1.5.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 +22 -0
- package/README.md +100 -0
- package/agents/pp-advisor-researcher.md +108 -0
- package/agents/pp-ai-researcher.md +114 -0
- package/agents/pp-assumptions-analyzer.md +105 -0
- package/agents/pp-code-fixer.md +669 -0
- package/agents/pp-code-reviewer.md +387 -0
- package/agents/pp-codebase-mapper.md +853 -0
- package/agents/pp-debug-session-manager.md +315 -0
- package/agents/pp-debugger.md +1453 -0
- package/agents/pp-doc-classifier.md +168 -0
- package/agents/pp-doc-synthesizer.md +204 -0
- package/agents/pp-doc-verifier.md +217 -0
- package/agents/pp-doc-writer.md +616 -0
- package/agents/pp-domain-researcher.md +147 -0
- package/agents/pp-eval-auditor.md +191 -0
- package/agents/pp-eval-planner.md +154 -0
- package/agents/pp-executor.md +808 -0
- package/agents/pp-framework-selector.md +160 -0
- package/agents/pp-integration-checker.md +470 -0
- package/agents/pp-intel-updater.md +339 -0
- package/agents/pp-mempalace-curator.md +47 -0
- package/agents/pp-nyquist-auditor.md +204 -0
- package/agents/pp-pattern-mapper.md +335 -0
- package/agents/pp-phase-researcher.md +867 -0
- package/agents/pp-plan-checker.md +988 -0
- package/agents/pp-planner.md +1052 -0
- package/agents/pp-project-researcher.md +612 -0
- package/agents/pp-research-synthesizer.md +260 -0
- package/agents/pp-roadmapper.md +741 -0
- package/agents/pp-security-auditor.md +156 -0
- package/agents/pp-ui-auditor.md +495 -0
- package/agents/pp-ui-checker.md +309 -0
- package/agents/pp-ui-researcher.md +375 -0
- package/agents/pp-user-profiler.md +171 -0
- package/agents/pp-verifier.md +967 -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 +12370 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/pp-add-tests.md +42 -0
- package/commands/pp-ai-integration-phase.md +37 -0
- package/commands/pp-audit-fix.md +34 -0
- package/commands/pp-audit-milestone.md +37 -0
- package/commands/pp-audit-uat.md +24 -0
- package/commands/pp-autonomous.md +51 -0
- package/commands/pp-capture.md +62 -0
- package/commands/pp-cleanup.md +24 -0
- package/commands/pp-code-review.md +59 -0
- package/commands/pp-complete-milestone.md +143 -0
- package/commands/pp-config.md +56 -0
- package/commands/pp-debug.md +52 -0
- package/commands/pp-discovery.md +34 -0
- package/commands/pp-discuss-phase.md +77 -0
- package/commands/pp-docs-update.md +49 -0
- package/commands/pp-eval-review.md +33 -0
- package/commands/pp-execute-phase.md +65 -0
- package/commands/pp-explore.md +27 -0
- package/commands/pp-extract-learnings.md +23 -0
- package/commands/pp-fast.md +31 -0
- package/commands/pp-forensics.md +57 -0
- package/commands/pp-graphify.md +204 -0
- package/commands/pp-health.md +31 -0
- package/commands/pp-help.md +28 -0
- package/commands/pp-import.md +45 -0
- package/commands/pp-inbox.md +39 -0
- package/commands/pp-ingest-docs.md +42 -0
- package/commands/pp-manager.md +45 -0
- package/commands/pp-map-codebase.md +83 -0
- package/commands/pp-mempalace-capture.md +71 -0
- package/commands/pp-mempalace-recall.md +102 -0
- package/commands/pp-milestone-summary.md +51 -0
- package/commands/pp-mvp-phase.md +45 -0
- package/commands/pp-new-milestone.md +45 -0
- package/commands/pp-new-project.md +47 -0
- package/commands/pp-ns-context.md +25 -0
- package/commands/pp-ns-ideate.md +24 -0
- package/commands/pp-ns-manage.md +36 -0
- package/commands/pp-ns-project.md +27 -0
- package/commands/pp-ns-review.md +29 -0
- package/commands/pp-ns-workflow.md +35 -0
- package/commands/pp-pause-work.md +43 -0
- package/commands/pp-phase.md +56 -0
- package/commands/pp-plan-phase.md +63 -0
- package/commands/pp-plan-review-convergence.md +60 -0
- package/commands/pp-pr-branch.md +26 -0
- package/commands/pp-profile-user.md +46 -0
- package/commands/pp-progress.md +49 -0
- package/commands/pp-quick.md +174 -0
- package/commands/pp-resume-work.md +30 -0
- package/commands/pp-review-backlog.md +63 -0
- package/commands/pp-review.md +42 -0
- package/commands/pp-secure-phase.md +36 -0
- package/commands/pp-settings.md +29 -0
- package/commands/pp-ship.md +24 -0
- package/commands/pp-sketch.md +60 -0
- package/commands/pp-spec-phase.md +63 -0
- package/commands/pp-spike.md +57 -0
- package/commands/pp-stats.md +20 -0
- package/commands/pp-surface.md +162 -0
- package/commands/pp-thread.md +24 -0
- package/commands/pp-ui-phase.md +35 -0
- package/commands/pp-ui-review.md +33 -0
- package/commands/pp-ultraplan-phase.md +34 -0
- package/commands/pp-undo.md +35 -0
- package/commands/pp-update.md +49 -0
- package/commands/pp-validate-phase.md +36 -0
- package/commands/pp-verify-work.md +39 -0
- package/commands/pp-workspace.md +52 -0
- package/commands/pp-workstreams.md +70 -0
- package/gemini-extension.json +6 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/dist/managed-hooks-registry.cjs +39 -0
- package/hooks/dist/pp-check-update-worker.js +108 -0
- package/hooks/dist/pp-check-update.js +66 -0
- package/hooks/dist/pp-config-reload.js +133 -0
- package/hooks/dist/pp-context-monitor.js +196 -0
- package/hooks/dist/pp-cursor-post-tool.js +75 -0
- package/hooks/dist/pp-cursor-session-start.js +52 -0
- package/hooks/dist/pp-ensure-canonical-path.js +305 -0
- package/hooks/dist/pp-graphify-update.sh +158 -0
- package/hooks/dist/pp-phase-boundary.sh +47 -0
- package/hooks/dist/pp-prompt-guard.js +97 -0
- package/hooks/dist/pp-read-guard.js +101 -0
- package/hooks/dist/pp-read-injection-scanner.js +203 -0
- package/hooks/dist/pp-session-state.sh +59 -0
- package/hooks/dist/pp-statusline.js +566 -0
- package/hooks/dist/pp-update-banner.js +138 -0
- package/hooks/dist/pp-validate-commit.sh +57 -0
- package/hooks/dist/pp-workflow-guard.js +167 -0
- package/hooks/dist/pp-worktree-path-guard.js +185 -0
- package/hooks/hooks.json +70 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/pp-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +39 -0
- package/hooks/pp-check-update-worker.js +108 -0
- package/hooks/pp-check-update.js +66 -0
- package/hooks/pp-config-reload.js +133 -0
- package/hooks/pp-context-monitor.js +196 -0
- package/hooks/pp-cursor-post-tool.js +75 -0
- package/hooks/pp-cursor-session-start.js +52 -0
- package/hooks/pp-ensure-canonical-path.js +305 -0
- package/hooks/pp-graphify-update.sh +158 -0
- package/hooks/pp-phase-boundary.sh +47 -0
- package/hooks/pp-prompt-guard.js +97 -0
- package/hooks/pp-read-guard.js +101 -0
- package/hooks/pp-read-injection-scanner.js +203 -0
- package/hooks/pp-session-state.sh +59 -0
- package/hooks/pp-statusline.js +566 -0
- package/hooks/pp-update-banner.js +138 -0
- package/hooks/pp-validate-commit.sh +57 -0
- package/hooks/pp-workflow-guard.js +167 -0
- package/hooks/pp-worktree-path-guard.js +185 -0
- package/package.json +125 -0
- package/pp-core/bin/check-latest-version.cjs +161 -0
- package/pp-core/bin/lib/active-workstream-store.cjs +297 -0
- package/pp-core/bin/lib/adr-parser.cjs +399 -0
- package/pp-core/bin/lib/agent-command-router.cjs +68 -0
- package/pp-core/bin/lib/agent-install-check.cjs +143 -0
- package/pp-core/bin/lib/artifacts.cjs +51 -0
- package/pp-core/bin/lib/audit-command-router.cjs +61 -0
- package/pp-core/bin/lib/audit.cjs +743 -0
- package/pp-core/bin/lib/capability-activation.cjs +113 -0
- package/pp-core/bin/lib/capability-registry.cjs +3727 -0
- package/pp-core/bin/lib/capability-state.cjs +497 -0
- package/pp-core/bin/lib/capability-writer.cjs +355 -0
- package/pp-core/bin/lib/check-command-router.cjs +800 -0
- package/pp-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/pp-core/bin/lib/cli-exit.cjs +61 -0
- package/pp-core/bin/lib/clock.cjs +95 -0
- package/pp-core/bin/lib/clusters.cjs +131 -0
- package/pp-core/bin/lib/code-review-flags.cjs +59 -0
- package/pp-core/bin/lib/command-aliases.cjs +809 -0
- package/pp-core/bin/lib/command-arg-projection.cjs +55 -0
- package/pp-core/bin/lib/command-roster.cjs +19 -0
- package/pp-core/bin/lib/command-routing-hub.cjs +300 -0
- package/pp-core/bin/lib/commands.cjs +1244 -0
- package/pp-core/bin/lib/config-loader.cjs +714 -0
- package/pp-core/bin/lib/config-schema.cjs +58 -0
- package/pp-core/bin/lib/config-types.cjs +20 -0
- package/pp-core/bin/lib/config.cjs +796 -0
- package/pp-core/bin/lib/configuration.cjs +209 -0
- package/pp-core/bin/lib/context-utilization.cjs +48 -0
- package/pp-core/bin/lib/core-utils.cjs +198 -0
- package/pp-core/bin/lib/decisions.cjs +136 -0
- package/pp-core/bin/lib/docs.cjs +264 -0
- package/pp-core/bin/lib/drift.cjs +364 -0
- package/pp-core/bin/lib/edge-probe.cjs +196 -0
- package/pp-core/bin/lib/fallow-runner.cjs +153 -0
- package/pp-core/bin/lib/federated-config.cjs +182 -0
- package/pp-core/bin/lib/frontmatter.cjs +494 -0
- package/pp-core/bin/lib/gap-checker.cjs +260 -0
- package/pp-core/bin/lib/git-base-branch.cjs +220 -0
- package/pp-core/bin/lib/graphify-command-router.cjs +72 -0
- package/pp-core/bin/lib/graphify.cjs +472 -0
- package/pp-core/bin/lib/gsd2-import.cjs +456 -0
- package/pp-core/bin/lib/init-command-router.cjs +62 -0
- package/pp-core/bin/lib/init.cjs +1912 -0
- package/pp-core/bin/lib/install-profiles.cjs +814 -0
- package/pp-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/pp-core/bin/lib/installer-migration-report.cjs +351 -0
- package/pp-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +225 -0
- package/pp-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/pp-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/pp-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/pp-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs +123 -0
- package/pp-core/bin/lib/installer-migrations/005-rename-gsd-core-to-pp-core.cjs +109 -0
- package/pp-core/bin/lib/installer-migrations/006-rename-gsd-command-namespace.cjs +135 -0
- package/pp-core/bin/lib/installer-migrations.cjs +823 -0
- package/pp-core/bin/lib/intel-command-router.cjs +119 -0
- package/pp-core/bin/lib/intel.cjs +584 -0
- package/pp-core/bin/lib/io.cjs +220 -0
- package/pp-core/bin/lib/learnings.cjs +270 -0
- package/pp-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/pp-core/bin/lib/loop-host-contract.cjs +105 -0
- package/pp-core/bin/lib/loop-resolver.cjs +479 -0
- package/pp-core/bin/lib/milestone.cjs +381 -0
- package/pp-core/bin/lib/model-catalog.cjs +154 -0
- package/pp-core/bin/lib/model-profiles.cjs +24 -0
- package/pp-core/bin/lib/model-resolver.cjs +467 -0
- package/pp-core/bin/lib/observability/event.cjs +51 -0
- package/pp-core/bin/lib/observability/logger.cjs +146 -0
- package/pp-core/bin/lib/observability/redaction.cjs +48 -0
- package/pp-core/bin/lib/package-identity.cjs +35 -0
- package/pp-core/bin/lib/package-legitimacy.cjs +368 -0
- package/pp-core/bin/lib/phase-command-router.cjs +209 -0
- package/pp-core/bin/lib/phase-id.cjs +213 -0
- package/pp-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/pp-core/bin/lib/phase-locator.cjs +145 -0
- package/pp-core/bin/lib/phase.cjs +1446 -0
- package/pp-core/bin/lib/phases-command-router.cjs +43 -0
- package/pp-core/bin/lib/plan-drift-guard.cjs +117 -0
- package/pp-core/bin/lib/plan-scan.cjs +91 -0
- package/pp-core/bin/lib/planning-workspace.cjs +245 -0
- package/pp-core/bin/lib/probe-core.cjs +402 -0
- package/pp-core/bin/lib/profile-output.cjs +1164 -0
- package/pp-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
- package/pp-core/bin/lib/profile-pipeline.cjs +519 -0
- package/pp-core/bin/lib/prohibition-enforcement.cjs +660 -0
- package/pp-core/bin/lib/project-root.cjs +119 -0
- package/pp-core/bin/lib/prompt-budget.cjs +305 -0
- package/pp-core/bin/lib/research-provider.cjs +137 -0
- package/pp-core/bin/lib/research-store.cjs +167 -0
- package/pp-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/pp-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/pp-core/bin/lib/roadmap-parser.cjs +456 -0
- package/pp-core/bin/lib/roadmap-upgrade.cjs +476 -0
- package/pp-core/bin/lib/roadmap.cjs +738 -0
- package/pp-core/bin/lib/runtime-artifact-conversion.cjs +1966 -0
- package/pp-core/bin/lib/runtime-artifact-layout.cjs +342 -0
- package/pp-core/bin/lib/runtime-config-adapter-registry.cjs +103 -0
- package/pp-core/bin/lib/runtime-homes.cjs +272 -0
- package/pp-core/bin/lib/runtime-hooks-surface.cjs +1460 -0
- package/pp-core/bin/lib/runtime-name-policy.cjs +97 -0
- package/pp-core/bin/lib/runtime-slash.cjs +137 -0
- package/pp-core/bin/lib/schema-detect.cjs +159 -0
- package/pp-core/bin/lib/secrets.cjs +34 -0
- package/pp-core/bin/lib/security.cjs +480 -0
- package/pp-core/bin/lib/semver-compare.cjs +42 -0
- package/pp-core/bin/lib/shell-command-projection.cjs +550 -0
- package/pp-core/bin/lib/state-command-router.cjs +172 -0
- package/pp-core/bin/lib/state-document.cjs +312 -0
- package/pp-core/bin/lib/state.cjs +2587 -0
- package/pp-core/bin/lib/surface.cjs +505 -0
- package/pp-core/bin/lib/task-command-router.cjs +85 -0
- package/pp-core/bin/lib/teams-status.cjs +74 -0
- package/pp-core/bin/lib/template.cjs +246 -0
- package/pp-core/bin/lib/uat-predicate.cjs +329 -0
- package/pp-core/bin/lib/uat.cjs +359 -0
- package/pp-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/pp-core/bin/lib/update-context.cjs +221 -0
- package/pp-core/bin/lib/validate-command-router.cjs +91 -0
- package/pp-core/bin/lib/validate.cjs +122 -0
- package/pp-core/bin/lib/verification-command-router.cjs +31 -0
- package/pp-core/bin/lib/verification.cjs +196 -0
- package/pp-core/bin/lib/verify-command-router.cjs +44 -0
- package/pp-core/bin/lib/verify.cjs +1932 -0
- package/pp-core/bin/lib/workstream-inventory-builder.cjs +81 -0
- package/pp-core/bin/lib/workstream-inventory.cjs +147 -0
- package/pp-core/bin/lib/workstream-name-policy.cjs +91 -0
- package/pp-core/bin/lib/workstream.cjs +386 -0
- package/pp-core/bin/lib/worktree-base-ref.cjs +350 -0
- package/pp-core/bin/lib/worktree-safety.cjs +985 -0
- package/pp-core/bin/pp-tools.cjs +2239 -0
- package/pp-core/bin/pp_run +20 -0
- package/pp-core/bin/shared/config-defaults.manifest.json +97 -0
- package/pp-core/bin/shared/config-schema.manifest.json +176 -0
- package/pp-core/bin/shared/model-catalog.json +160 -0
- package/pp-core/bin/shared/runtime-aliases.manifest.json +79 -0
- package/pp-core/bin/verify-reapply-patches.cjs +400 -0
- package/pp-core/contexts/dev.md +21 -0
- package/pp-core/contexts/research.md +22 -0
- package/pp-core/contexts/review.md +23 -0
- package/pp-core/references/agent-contracts.md +79 -0
- package/pp-core/references/ai-evals.md +156 -0
- package/pp-core/references/ai-frameworks.md +186 -0
- package/pp-core/references/artifact-types.md +131 -0
- package/pp-core/references/autonomous-smart-discuss.md +277 -0
- package/pp-core/references/checkpoints.md +814 -0
- package/pp-core/references/common-bug-patterns.md +114 -0
- package/pp-core/references/context-budget.md +85 -0
- package/pp-core/references/continuation-format.md +253 -0
- package/pp-core/references/debugger-philosophy.md +76 -0
- package/pp-core/references/decimal-phase-calculation.md +64 -0
- package/pp-core/references/doc-conflict-engine.md +91 -0
- package/pp-core/references/domain-probes.md +125 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/01-round-half-even/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +7 -0
- package/pp-core/references/edge-probe-fixtures/04-money-rounding/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +8 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json +1 -0
- package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json +4 -0
- package/pp-core/references/edge-probe.md +272 -0
- package/pp-core/references/execute-mvp-tdd.md +81 -0
- package/pp-core/references/executor-examples.md +110 -0
- package/pp-core/references/few-shot-examples/plan-checker.md +73 -0
- package/pp-core/references/few-shot-examples/verifier.md +109 -0
- package/pp-core/references/gate-prompts.md +100 -0
- package/pp-core/references/gates.md +70 -0
- package/pp-core/references/git-integration.md +298 -0
- package/pp-core/references/git-planning-commit.md +40 -0
- package/pp-core/references/ios-scaffold.md +123 -0
- package/pp-core/references/loop-hook-dispatch.md +61 -0
- package/pp-core/references/mandatory-initial-read.md +2 -0
- package/pp-core/references/model-profile-resolution.md +38 -0
- package/pp-core/references/model-profiles.md +245 -0
- package/pp-core/references/mvp-concepts.md +49 -0
- package/pp-core/references/phase-argument-parsing.md +61 -0
- package/pp-core/references/planner-antipatterns.md +176 -0
- package/pp-core/references/planner-chunked.md +49 -0
- package/pp-core/references/planner-gap-closure.md +62 -0
- package/pp-core/references/planner-graphify-auto-update.md +67 -0
- package/pp-core/references/planner-guidance.md +186 -0
- package/pp-core/references/planner-human-verify-mode.md +57 -0
- package/pp-core/references/planner-interface-context.md +62 -0
- package/pp-core/references/planner-load-graph-context.md +36 -0
- package/pp-core/references/planner-mvp-mode.md +53 -0
- package/pp-core/references/planner-reviews.md +42 -0
- package/pp-core/references/planner-revision.md +87 -0
- package/pp-core/references/planner-source-audit.md +73 -0
- package/pp-core/references/planning-config.md +477 -0
- package/pp-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
- package/pp-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
- package/pp-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
- package/pp-core/references/prohibition-probe.md +326 -0
- package/pp-core/references/project-skills-discovery.md +19 -0
- package/pp-core/references/questioning.md +162 -0
- package/pp-core/references/research-documentation-lookup.md +29 -0
- package/pp-core/references/research-philosophy.md +29 -0
- package/pp-core/references/research-verification-protocol.md +27 -0
- package/pp-core/references/revision-loop.md +97 -0
- package/pp-core/references/scout-codebase.md +51 -0
- package/pp-core/references/skeleton-template.md +48 -0
- package/pp-core/references/sketch-interactivity.md +41 -0
- package/pp-core/references/sketch-theme-system.md +94 -0
- package/pp-core/references/sketch-tooling.md +45 -0
- package/pp-core/references/sketch-variant-patterns.md +81 -0
- package/pp-core/references/spidr-splitting.md +69 -0
- package/pp-core/references/tdd.md +330 -0
- package/pp-core/references/thinking-models-debug.md +44 -0
- package/pp-core/references/thinking-models-execution.md +50 -0
- package/pp-core/references/thinking-models-planning.md +62 -0
- package/pp-core/references/thinking-models-research.md +50 -0
- package/pp-core/references/thinking-models-verification.md +55 -0
- package/pp-core/references/thinking-partner.md +96 -0
- package/pp-core/references/ui-brand.md +162 -0
- package/pp-core/references/universal-anti-patterns.md +63 -0
- package/pp-core/references/user-profiling.md +681 -0
- package/pp-core/references/user-story-template.md +58 -0
- package/pp-core/references/verification-overrides.md +227 -0
- package/pp-core/references/verification-patterns.md +612 -0
- package/pp-core/references/verify-mvp-mode.md +85 -0
- package/pp-core/references/workstream-flag.md +111 -0
- package/pp-core/references/worktree-branch-check.md +44 -0
- package/pp-core/references/worktree-path-safety.md +67 -0
- package/pp-core/templates/AI-SPEC.md +246 -0
- package/pp-core/templates/DEBUG.md +169 -0
- package/pp-core/templates/README.md +77 -0
- package/pp-core/templates/SECURITY.md +61 -0
- package/pp-core/templates/UAT.md +265 -0
- package/pp-core/templates/UI-SPEC.md +100 -0
- package/pp-core/templates/VALIDATION.md +76 -0
- package/pp-core/templates/claude-md.md +145 -0
- package/pp-core/templates/codebase/architecture.md +255 -0
- package/pp-core/templates/codebase/concerns.md +310 -0
- package/pp-core/templates/codebase/conventions.md +307 -0
- package/pp-core/templates/codebase/integrations.md +280 -0
- package/pp-core/templates/codebase/stack.md +186 -0
- package/pp-core/templates/codebase/structure.md +285 -0
- package/pp-core/templates/codebase/testing.md +480 -0
- package/pp-core/templates/config.json +62 -0
- package/pp-core/templates/context.md +352 -0
- package/pp-core/templates/continue-here.md +78 -0
- package/pp-core/templates/copilot-instructions.md +7 -0
- package/pp-core/templates/debug-subagent-prompt.md +91 -0
- package/pp-core/templates/dev-preferences.md +21 -0
- package/pp-core/templates/discovery.md +146 -0
- package/pp-core/templates/discussion-log.md +63 -0
- package/pp-core/templates/milestone-archive.md +123 -0
- package/pp-core/templates/milestone.md +115 -0
- package/pp-core/templates/phase-prompt.md +610 -0
- package/pp-core/templates/planner-subagent-prompt.md +117 -0
- package/pp-core/templates/project.md +203 -0
- package/pp-core/templates/requirements.md +231 -0
- package/pp-core/templates/research-project/ARCHITECTURE.md +204 -0
- package/pp-core/templates/research-project/FEATURES.md +147 -0
- package/pp-core/templates/research-project/PITFALLS.md +200 -0
- package/pp-core/templates/research-project/STACK.md +120 -0
- package/pp-core/templates/research-project/SUMMARY.md +170 -0
- package/pp-core/templates/research.md +592 -0
- package/pp-core/templates/retrospective.md +54 -0
- package/pp-core/templates/roadmap.md +202 -0
- package/pp-core/templates/spec.md +333 -0
- package/pp-core/templates/state.md +195 -0
- package/pp-core/templates/summary-complex.md +60 -0
- package/pp-core/templates/summary-minimal.md +42 -0
- package/pp-core/templates/summary-standard.md +49 -0
- package/pp-core/templates/summary.md +249 -0
- package/pp-core/templates/user-profile.md +146 -0
- package/pp-core/templates/user-setup.md +311 -0
- package/pp-core/templates/verification-report.md +335 -0
- package/pp-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/pp-core/workflows/add-backlog.md +91 -0
- package/pp-core/workflows/add-phase.md +113 -0
- package/pp-core/workflows/add-tests.md +355 -0
- package/pp-core/workflows/add-todo.md +161 -0
- package/pp-core/workflows/ai-integration-phase.md +295 -0
- package/pp-core/workflows/analyze-dependencies.md +96 -0
- package/pp-core/workflows/audit-fix.md +178 -0
- package/pp-core/workflows/audit-milestone.md +362 -0
- package/pp-core/workflows/audit-uat.md +110 -0
- package/pp-core/workflows/autonomous.md +886 -0
- package/pp-core/workflows/check-todos.md +180 -0
- package/pp-core/workflows/cleanup.md +195 -0
- package/pp-core/workflows/code-review-fix.md +506 -0
- package/pp-core/workflows/code-review.md +696 -0
- package/pp-core/workflows/complete-milestone.md +857 -0
- package/pp-core/workflows/debug.md +237 -0
- package/pp-core/workflows/diagnose-issues.md +245 -0
- package/pp-core/workflows/discovery-phase.md +291 -0
- package/pp-core/workflows/discovery-sprint.md +1546 -0
- package/pp-core/workflows/discuss-phase/modes/advisor.md +176 -0
- package/pp-core/workflows/discuss-phase/modes/all.md +28 -0
- package/pp-core/workflows/discuss-phase/modes/analyze.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/auto.md +57 -0
- package/pp-core/workflows/discuss-phase/modes/batch.md +52 -0
- package/pp-core/workflows/discuss-phase/modes/chain.md +98 -0
- package/pp-core/workflows/discuss-phase/modes/default.md +141 -0
- package/pp-core/workflows/discuss-phase/modes/power.md +44 -0
- package/pp-core/workflows/discuss-phase/modes/text.md +55 -0
- package/pp-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/pp-core/workflows/discuss-phase/templates/context.md +136 -0
- package/pp-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/pp-core/workflows/discuss-phase-assumptions.md +675 -0
- package/pp-core/workflows/discuss-phase-power.md +291 -0
- package/pp-core/workflows/discuss-phase.md +520 -0
- package/pp-core/workflows/do.md +111 -0
- package/pp-core/workflows/docs-update.md +1168 -0
- package/pp-core/workflows/edit-phase.md +295 -0
- package/pp-core/workflows/eval-review.md +159 -0
- package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
- package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/pp-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
- package/pp-core/workflows/execute-phase.md +1707 -0
- package/pp-core/workflows/execute-plan.md +541 -0
- package/pp-core/workflows/explore.md +146 -0
- package/pp-core/workflows/extract-learnings.md +243 -0
- package/pp-core/workflows/fast.md +124 -0
- package/pp-core/workflows/forensics.md +279 -0
- package/pp-core/workflows/graduation.md +196 -0
- package/pp-core/workflows/health.md +224 -0
- package/pp-core/workflows/help/modes/brief.md +22 -0
- package/pp-core/workflows/help/modes/default.md +50 -0
- package/pp-core/workflows/help/modes/full.md +791 -0
- package/pp-core/workflows/help/modes/topic.md +74 -0
- package/pp-core/workflows/help.md +24 -0
- package/pp-core/workflows/import.md +256 -0
- package/pp-core/workflows/inbox.md +387 -0
- package/pp-core/workflows/ingest-docs.md +340 -0
- package/pp-core/workflows/insert-phase.md +152 -0
- package/pp-core/workflows/list-phase-assumptions.md +178 -0
- package/pp-core/workflows/list-workspaces.md +57 -0
- package/pp-core/workflows/manager.md +435 -0
- package/pp-core/workflows/map-codebase.md +444 -0
- package/pp-core/workflows/milestone-summary.md +224 -0
- package/pp-core/workflows/mvp-phase.md +222 -0
- package/pp-core/workflows/new-milestone.md +643 -0
- package/pp-core/workflows/new-project.md +1563 -0
- package/pp-core/workflows/new-workspace.md +240 -0
- package/pp-core/workflows/next.md +347 -0
- package/pp-core/workflows/node-repair.md +92 -0
- package/pp-core/workflows/note.md +158 -0
- package/pp-core/workflows/pause-work.md +250 -0
- package/pp-core/workflows/plan-milestone-gaps.md +281 -0
- package/pp-core/workflows/plan-phase.md +1755 -0
- package/pp-core/workflows/plan-review-convergence.md +369 -0
- package/pp-core/workflows/plant-seed.md +230 -0
- package/pp-core/workflows/pr-branch.md +159 -0
- package/pp-core/workflows/profile-user.md +455 -0
- package/pp-core/workflows/progress.md +756 -0
- package/pp-core/workflows/quick.md +1045 -0
- package/pp-core/workflows/reapply-patches.md +443 -0
- package/pp-core/workflows/remove-phase.md +156 -0
- package/pp-core/workflows/remove-workspace.md +108 -0
- package/pp-core/workflows/resume-project.md +348 -0
- package/pp-core/workflows/review.md +765 -0
- package/pp-core/workflows/scan.md +107 -0
- package/pp-core/workflows/secure-phase.md +184 -0
- package/pp-core/workflows/session-report.md +146 -0
- package/pp-core/workflows/settings-advanced.md +816 -0
- package/pp-core/workflows/settings-integrations.md +312 -0
- package/pp-core/workflows/settings.md +592 -0
- package/pp-core/workflows/ship.md +465 -0
- package/pp-core/workflows/sketch-wrap-up.md +286 -0
- package/pp-core/workflows/sketch.md +361 -0
- package/pp-core/workflows/spec-phase.md +495 -0
- package/pp-core/workflows/spike-wrap-up.md +307 -0
- package/pp-core/workflows/spike.md +453 -0
- package/pp-core/workflows/stats.md +80 -0
- package/pp-core/workflows/sync-skills.md +182 -0
- package/pp-core/workflows/thread.md +222 -0
- package/pp-core/workflows/transition.md +694 -0
- package/pp-core/workflows/ui-phase.md +328 -0
- package/pp-core/workflows/ui-review.md +193 -0
- package/pp-core/workflows/ultraplan-phase.md +199 -0
- package/pp-core/workflows/undo.md +314 -0
- package/pp-core/workflows/update.md +501 -0
- package/pp-core/workflows/validate-phase.md +183 -0
- package/pp-core/workflows/verify-phase.md +569 -0
- package/pp-core/workflows/verify-work.md +804 -0
- package/scripts/affected-tests-lib.cjs +554 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +351 -0
- package/scripts/build-hooks.js +254 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +597 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +147 -0
- package/scripts/changeset/new.cjs +151 -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 +93 -0
- package/scripts/ci-rebase-check.cjs +86 -0
- package/scripts/ci-test-scope.cjs +441 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +149 -0
- package/scripts/fix-slash-commands.cjs +161 -0
- package/scripts/gen-capability-registry.cjs +2646 -0
- package/scripts/gen-commands-reference.cjs +139 -0
- package/scripts/gen-inventory-manifest.cjs +114 -0
- package/scripts/gen-loop-host-contract.cjs +526 -0
- package/scripts/gen-research-agents.cjs +276 -0
- package/scripts/generate-package-identity.cjs +134 -0
- package/scripts/issue-dedupe.cjs +278 -0
- package/scripts/issue-version-gate.cjs +140 -0
- package/scripts/lib/allowlist-ratchet.cjs +236 -0
- package/scripts/lib/cli-exit.cjs +56 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +328 -0
- package/scripts/lint-allow-test-rule-refs.cjs +162 -0
- package/scripts/lint-command-contract.cjs +118 -0
- package/scripts/lint-descriptions.cjs +87 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-legacy-dir-name.cjs +166 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +99 -0
- package/scripts/lint-regression-test-names.allowlist.json +269 -0
- package/scripts/lint-regression-test-names.cjs +117 -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 +181 -0
- package/scripts/lint-test-file-count.cjs +246 -0
- package/scripts/lint-windows-test-portability.cjs +178 -0
- package/scripts/mutation-matrix.cjs +323 -0
- package/scripts/pr-target-policy.cjs +63 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +207 -0
- package/scripts/registry-smoke.cjs +337 -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 +763 -0
- package/scripts/research-profiles.cjs +149 -0
- package/scripts/run-affected-tests.cjs +7 -0
- package/scripts/run-tests.cjs +589 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +234 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-manifest-versions.cjs +119 -0
- package/scripts/sync-next-version.cjs +133 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +425 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/update-size-baseline.cjs +68 -0
- package/scripts/verify-npm-publish.cjs +240 -0
- package/scripts/verify-opengsd-sweep.cjs +288 -0
- package/scripts/verify-phase-02-rename.sh +258 -0
- package/scripts/verify-phase-03-rename.sh +376 -0
- package/scripts/workflow-policy.cjs +483 -0
- package/scripts/workflow-size.cjs +90 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ADR Markdown parser — parses Architecture Decision Record documents into
|
|
4
|
+
* structured objects for downstream processing (adr command, gap checker, etc.).
|
|
5
|
+
*
|
|
6
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/adr-parser.cjs collapsed
|
|
7
|
+
* to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
|
|
8
|
+
* from the prior hand-written .cjs; only types are added.
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
14
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
15
|
+
const security_cjs_1 = require("./security.cjs");
|
|
16
|
+
const STATUS_REJECT_SET = new Set(['superseded', 'rejected', 'deprecated']);
|
|
17
|
+
const CANONICAL_HEADERS = {
|
|
18
|
+
status: ['status', 'state', 'lifecycle', 'stage'],
|
|
19
|
+
goal: [
|
|
20
|
+
'context',
|
|
21
|
+
'background',
|
|
22
|
+
'problem statement',
|
|
23
|
+
'problem',
|
|
24
|
+
'situation',
|
|
25
|
+
'forces',
|
|
26
|
+
'motivation',
|
|
27
|
+
'issue',
|
|
28
|
+
'drivers',
|
|
29
|
+
'pain points',
|
|
30
|
+
'story',
|
|
31
|
+
'setting',
|
|
32
|
+
'premise',
|
|
33
|
+
'status quo',
|
|
34
|
+
'context and problem statement',
|
|
35
|
+
],
|
|
36
|
+
decisions: [
|
|
37
|
+
'decision',
|
|
38
|
+
'decisions',
|
|
39
|
+
'resolution',
|
|
40
|
+
'conclusion',
|
|
41
|
+
'choice',
|
|
42
|
+
'we decided',
|
|
43
|
+
'direction',
|
|
44
|
+
'approach',
|
|
45
|
+
'solution',
|
|
46
|
+
'outcome',
|
|
47
|
+
'selected option',
|
|
48
|
+
'recommendation',
|
|
49
|
+
'strategy',
|
|
50
|
+
'decision outcome',
|
|
51
|
+
],
|
|
52
|
+
considered_options: [
|
|
53
|
+
'considered options',
|
|
54
|
+
'alternatives',
|
|
55
|
+
'options',
|
|
56
|
+
'choices',
|
|
57
|
+
'candidates',
|
|
58
|
+
'approaches considered',
|
|
59
|
+
'variants',
|
|
60
|
+
'trade-offs',
|
|
61
|
+
'pros and cons of the options',
|
|
62
|
+
'discussion',
|
|
63
|
+
],
|
|
64
|
+
risks: [
|
|
65
|
+
'risks',
|
|
66
|
+
'trade-offs',
|
|
67
|
+
'drawbacks',
|
|
68
|
+
'cost',
|
|
69
|
+
'tensions',
|
|
70
|
+
'liabilities',
|
|
71
|
+
'negative consequences',
|
|
72
|
+
'side effects',
|
|
73
|
+
],
|
|
74
|
+
success_criteria: [
|
|
75
|
+
'success criteria',
|
|
76
|
+
'acceptance criteria',
|
|
77
|
+
'validation',
|
|
78
|
+
"how we'll know",
|
|
79
|
+
'metrics',
|
|
80
|
+
'kpis',
|
|
81
|
+
'verification',
|
|
82
|
+
'test strategy',
|
|
83
|
+
'compliance',
|
|
84
|
+
'definition of done',
|
|
85
|
+
'exit criteria',
|
|
86
|
+
'positive consequences',
|
|
87
|
+
],
|
|
88
|
+
plan_sequence: [
|
|
89
|
+
'implementation plan',
|
|
90
|
+
'implementation notes',
|
|
91
|
+
'steps',
|
|
92
|
+
'tasks',
|
|
93
|
+
'roadmap',
|
|
94
|
+
'sequence',
|
|
95
|
+
'migration plan',
|
|
96
|
+
'plan',
|
|
97
|
+
'action items',
|
|
98
|
+
'work breakdown',
|
|
99
|
+
'phases',
|
|
100
|
+
'milestones',
|
|
101
|
+
'stages',
|
|
102
|
+
],
|
|
103
|
+
key_files: [
|
|
104
|
+
'affected files',
|
|
105
|
+
'files touched',
|
|
106
|
+
'surface area',
|
|
107
|
+
'modules affected',
|
|
108
|
+
'code locations',
|
|
109
|
+
'file changes',
|
|
110
|
+
'diff summary',
|
|
111
|
+
'touched code',
|
|
112
|
+
],
|
|
113
|
+
out_of_scope: [
|
|
114
|
+
'out of scope',
|
|
115
|
+
'non-goals',
|
|
116
|
+
'excluded',
|
|
117
|
+
'not in this adr',
|
|
118
|
+
'out of bounds',
|
|
119
|
+
"won't do",
|
|
120
|
+
"won't have",
|
|
121
|
+
'beyond scope',
|
|
122
|
+
'anti-goals',
|
|
123
|
+
],
|
|
124
|
+
deferred: [
|
|
125
|
+
'future work',
|
|
126
|
+
'deferred',
|
|
127
|
+
'future',
|
|
128
|
+
'later',
|
|
129
|
+
'follow-up',
|
|
130
|
+
'next steps',
|
|
131
|
+
],
|
|
132
|
+
dependencies: [
|
|
133
|
+
'dependencies',
|
|
134
|
+
'depends on',
|
|
135
|
+
'prerequisites',
|
|
136
|
+
'sequencing',
|
|
137
|
+
'order',
|
|
138
|
+
'blocked by',
|
|
139
|
+
'cross-cuts',
|
|
140
|
+
'related adrs',
|
|
141
|
+
'links',
|
|
142
|
+
'references',
|
|
143
|
+
'see also',
|
|
144
|
+
'upstream',
|
|
145
|
+
'inbound',
|
|
146
|
+
],
|
|
147
|
+
update: [
|
|
148
|
+
'update',
|
|
149
|
+
'revision',
|
|
150
|
+
'amendment',
|
|
151
|
+
'locked design',
|
|
152
|
+
'final decision',
|
|
153
|
+
'post-grilling',
|
|
154
|
+
'addendum',
|
|
155
|
+
],
|
|
156
|
+
consequences: [
|
|
157
|
+
'consequences',
|
|
158
|
+
'implications',
|
|
159
|
+
'impact',
|
|
160
|
+
'what this means',
|
|
161
|
+
'result',
|
|
162
|
+
],
|
|
163
|
+
};
|
|
164
|
+
const CONSEQUENCE_NEGATIVE_HINTS = [
|
|
165
|
+
'negative',
|
|
166
|
+
'drawback',
|
|
167
|
+
'risk',
|
|
168
|
+
'cost',
|
|
169
|
+
'liability',
|
|
170
|
+
'trade-off',
|
|
171
|
+
'tension',
|
|
172
|
+
'side effect',
|
|
173
|
+
];
|
|
174
|
+
const CONSEQUENCE_POSITIVE_HINTS = [
|
|
175
|
+
'positive',
|
|
176
|
+
'success',
|
|
177
|
+
'metric',
|
|
178
|
+
'kpi',
|
|
179
|
+
'verification',
|
|
180
|
+
'acceptance',
|
|
181
|
+
'benefit',
|
|
182
|
+
];
|
|
183
|
+
function normalizeAdrHeader(raw) {
|
|
184
|
+
const s = typeof raw === 'string' ? raw : '';
|
|
185
|
+
return s
|
|
186
|
+
.trim()
|
|
187
|
+
.toLowerCase()
|
|
188
|
+
.replace(/[\s:._-]+/g, ' ')
|
|
189
|
+
.replace(/[^\w\s]/g, '')
|
|
190
|
+
.trim();
|
|
191
|
+
}
|
|
192
|
+
function classifyHeader(normalizedHeader) {
|
|
193
|
+
for (const [canonical, synonyms] of Object.entries(CANONICAL_HEADERS)) {
|
|
194
|
+
for (const synonym of synonyms) {
|
|
195
|
+
if (normalizedHeader === synonym)
|
|
196
|
+
return canonical;
|
|
197
|
+
if (normalizedHeader.startsWith(`${synonym} `))
|
|
198
|
+
return canonical;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
function splitEntries(blockText) {
|
|
204
|
+
return (typeof blockText === 'string' ? blockText : '')
|
|
205
|
+
.split(/\r?\n/)
|
|
206
|
+
.map((line) => line.trim())
|
|
207
|
+
.filter(Boolean)
|
|
208
|
+
.map((line) => line.replace(/^[-*+]\s+/, '').trim())
|
|
209
|
+
.filter(Boolean);
|
|
210
|
+
}
|
|
211
|
+
function parseSections(markdown) {
|
|
212
|
+
const lines = (typeof markdown === 'string' ? markdown : '').split(/\r?\n/);
|
|
213
|
+
const sections = [];
|
|
214
|
+
let current = { heading: null, body: [] };
|
|
215
|
+
for (const line of lines) {
|
|
216
|
+
const m = line.match(/^#{1,6}\s+(.*)$/);
|
|
217
|
+
if (m) {
|
|
218
|
+
if (current.heading || current.body.length)
|
|
219
|
+
sections.push(current);
|
|
220
|
+
current = { heading: m[1].trim(), body: [] };
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
current.body.push(line);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (current.heading || current.body.length)
|
|
227
|
+
sections.push(current);
|
|
228
|
+
return sections;
|
|
229
|
+
}
|
|
230
|
+
function parseStatusFromSections(sections) {
|
|
231
|
+
for (const section of sections) {
|
|
232
|
+
const canonical = classifyHeader(normalizeAdrHeader(section.heading));
|
|
233
|
+
if (canonical !== 'status')
|
|
234
|
+
continue;
|
|
235
|
+
const line = splitEntries(section.body.join('\n'))[0] || '';
|
|
236
|
+
const norm = normalizeAdrHeader(line);
|
|
237
|
+
if (!norm)
|
|
238
|
+
return '';
|
|
239
|
+
if (norm.includes('accepted'))
|
|
240
|
+
return 'accepted';
|
|
241
|
+
if (norm.includes('proposed'))
|
|
242
|
+
return 'proposed';
|
|
243
|
+
if (norm.includes('superseded'))
|
|
244
|
+
return 'superseded';
|
|
245
|
+
if (norm.includes('rejected'))
|
|
246
|
+
return 'rejected';
|
|
247
|
+
if (norm.includes('deprecated'))
|
|
248
|
+
return 'deprecated';
|
|
249
|
+
return norm;
|
|
250
|
+
}
|
|
251
|
+
return '';
|
|
252
|
+
}
|
|
253
|
+
function pushUnique(target, values) {
|
|
254
|
+
const seen = new Set(target);
|
|
255
|
+
for (const value of values) {
|
|
256
|
+
if (!seen.has(value)) {
|
|
257
|
+
target.push(value);
|
|
258
|
+
seen.add(value);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function parseConsequences(lines, out) {
|
|
263
|
+
for (const entry of lines) {
|
|
264
|
+
const lower = entry.toLowerCase();
|
|
265
|
+
if (CONSEQUENCE_NEGATIVE_HINTS.some((hint) => lower.includes(hint))) {
|
|
266
|
+
out.consequences_negative.push(entry);
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (CONSEQUENCE_POSITIVE_HINTS.some((hint) => lower.includes(hint))) {
|
|
270
|
+
out.consequences_positive.push(entry);
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
out.consequences_positive.push(entry);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function parseAdrMarkdown(markdown, { sourcePath = '', format = 'auto' } = {}) {
|
|
277
|
+
const sections = parseSections(markdown);
|
|
278
|
+
const titleLine = (typeof markdown === 'string' ? markdown : '').split(/\r?\n/).find((line) => /^#\s+/.test(line)) || '';
|
|
279
|
+
const title = titleLine.replace(/^#\s+/, '').trim();
|
|
280
|
+
const out = {
|
|
281
|
+
title,
|
|
282
|
+
status: parseStatusFromSections(sections) || 'accepted',
|
|
283
|
+
context: '',
|
|
284
|
+
decisions: [],
|
|
285
|
+
options_considered: [],
|
|
286
|
+
consequences_positive: [],
|
|
287
|
+
consequences_negative: [],
|
|
288
|
+
out_of_scope: [],
|
|
289
|
+
deferred: [],
|
|
290
|
+
dependencies: [],
|
|
291
|
+
updates: [],
|
|
292
|
+
source_path: sourcePath,
|
|
293
|
+
key_files: [],
|
|
294
|
+
plan_sequence: [],
|
|
295
|
+
format,
|
|
296
|
+
unmapped_headers: [],
|
|
297
|
+
};
|
|
298
|
+
for (const section of sections) {
|
|
299
|
+
const heading = section.heading || '';
|
|
300
|
+
if (!heading)
|
|
301
|
+
continue;
|
|
302
|
+
const canonical = classifyHeader(normalizeAdrHeader(heading));
|
|
303
|
+
const entries = splitEntries(section.body.join('\n'));
|
|
304
|
+
const prose = section.body.join('\n').trim();
|
|
305
|
+
if (!canonical) {
|
|
306
|
+
out.unmapped_headers.push(heading);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
switch (canonical) {
|
|
310
|
+
case 'goal':
|
|
311
|
+
if (!out.context && prose)
|
|
312
|
+
out.context = prose;
|
|
313
|
+
break;
|
|
314
|
+
case 'decisions':
|
|
315
|
+
pushUnique(out.decisions, entries);
|
|
316
|
+
break;
|
|
317
|
+
case 'considered_options':
|
|
318
|
+
pushUnique(out.options_considered, entries);
|
|
319
|
+
break;
|
|
320
|
+
case 'risks':
|
|
321
|
+
pushUnique(out.consequences_negative, entries);
|
|
322
|
+
break;
|
|
323
|
+
case 'success_criteria':
|
|
324
|
+
pushUnique(out.consequences_positive, entries);
|
|
325
|
+
break;
|
|
326
|
+
case 'plan_sequence':
|
|
327
|
+
pushUnique(out.plan_sequence, entries);
|
|
328
|
+
break;
|
|
329
|
+
case 'key_files':
|
|
330
|
+
pushUnique(out.key_files, entries);
|
|
331
|
+
break;
|
|
332
|
+
case 'out_of_scope':
|
|
333
|
+
pushUnique(out.out_of_scope, entries);
|
|
334
|
+
break;
|
|
335
|
+
case 'deferred':
|
|
336
|
+
pushUnique(out.deferred, entries);
|
|
337
|
+
break;
|
|
338
|
+
case 'dependencies':
|
|
339
|
+
pushUnique(out.dependencies, entries);
|
|
340
|
+
break;
|
|
341
|
+
case 'update':
|
|
342
|
+
out.updates.push({ heading, entries });
|
|
343
|
+
break;
|
|
344
|
+
case 'consequences':
|
|
345
|
+
parseConsequences(entries, out);
|
|
346
|
+
break;
|
|
347
|
+
default:
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return out;
|
|
352
|
+
}
|
|
353
|
+
function shouldRejectAdrStatus(status) {
|
|
354
|
+
return STATUS_REJECT_SET.has(normalizeAdrHeader(status));
|
|
355
|
+
}
|
|
356
|
+
function parseCliArgs(argv) {
|
|
357
|
+
const opts = { input: null, format: 'auto', projectDir: process.cwd() };
|
|
358
|
+
for (let i = 0; i < argv.length; i++) {
|
|
359
|
+
const arg = argv[i];
|
|
360
|
+
if (arg === '--input') {
|
|
361
|
+
opts.input = argv[++i] || null;
|
|
362
|
+
}
|
|
363
|
+
else if (arg === '--format') {
|
|
364
|
+
opts.format = argv[++i] || 'auto';
|
|
365
|
+
}
|
|
366
|
+
else if (arg === '--project-dir') {
|
|
367
|
+
opts.projectDir = argv[++i] || process.cwd();
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (!opts.input) {
|
|
374
|
+
throw new Error('Missing required --input <path>');
|
|
375
|
+
}
|
|
376
|
+
return opts;
|
|
377
|
+
}
|
|
378
|
+
function main(argv) {
|
|
379
|
+
const opts = parseCliArgs(argv);
|
|
380
|
+
const safePath = (0, security_cjs_1.requireSafePath)(opts.input, node_path_1.default.resolve(opts.projectDir), 'ADR input path', { allowAbsolute: true });
|
|
381
|
+
const content = node_fs_1.default.readFileSync(safePath, 'utf8');
|
|
382
|
+
const parsed = parseAdrMarkdown(content, { sourcePath: opts.input ?? undefined, format: opts.format });
|
|
383
|
+
process.stdout.write(JSON.stringify(parsed, null, 2));
|
|
384
|
+
}
|
|
385
|
+
if (require.main === module) {
|
|
386
|
+
try {
|
|
387
|
+
main(process.argv.slice(2));
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
process.stderr.write(`Error: ${error.message}\n`);
|
|
391
|
+
process.exit(1);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
module.exports = {
|
|
395
|
+
CANONICAL_HEADERS,
|
|
396
|
+
normalizeAdrHeader,
|
|
397
|
+
parseAdrMarkdown,
|
|
398
|
+
shouldRejectAdrStatus,
|
|
399
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent command router — classify-failure subcommand handler.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/agent-command-router.cjs
|
|
6
|
+
* collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
|
|
7
|
+
* from the prior hand-written .cjs; only types are added.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
10
|
+
const io = require("./io.cjs");
|
|
11
|
+
const { output, error, ERROR_REASON } = io;
|
|
12
|
+
// ─── Constants ────────────────────────────────────────────────────────────────
|
|
13
|
+
const QUOTA_SENTINELS = [
|
|
14
|
+
'429',
|
|
15
|
+
'usage_limit_reached',
|
|
16
|
+
'usage limit',
|
|
17
|
+
'rate limit',
|
|
18
|
+
'rate-limited',
|
|
19
|
+
'rate_limit',
|
|
20
|
+
'resource_exhausted',
|
|
21
|
+
'quota',
|
|
22
|
+
'too many requests',
|
|
23
|
+
'exceeded your',
|
|
24
|
+
];
|
|
25
|
+
const CLASSIFY_HANDOFF_SENTINEL = 'classifyhandoffifneeded is not defined';
|
|
26
|
+
// ─── Implementation ───────────────────────────────────────────────────────────
|
|
27
|
+
function parseRetryAfter(body) {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
29
|
+
const match = String(body ?? '').match(/\bretry[-_ ]after[:\s]+(\d+)\b/i);
|
|
30
|
+
if (!match)
|
|
31
|
+
return undefined;
|
|
32
|
+
const seconds = Number.parseInt(match[1], 10);
|
|
33
|
+
return Number.isFinite(seconds) ? seconds : undefined;
|
|
34
|
+
}
|
|
35
|
+
function classifyAgentFailure(body) {
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
|
|
37
|
+
const normalized = String(body ?? '').toLowerCase();
|
|
38
|
+
if (normalized.trim() === '') {
|
|
39
|
+
return { class: 'unknown-failure' };
|
|
40
|
+
}
|
|
41
|
+
for (const sentinel of QUOTA_SENTINELS) {
|
|
42
|
+
if (normalized.includes(sentinel)) {
|
|
43
|
+
const retryAfterSeconds = parseRetryAfter(body);
|
|
44
|
+
return retryAfterSeconds === undefined
|
|
45
|
+
? { class: 'quota-exceeded', sentinel }
|
|
46
|
+
: { class: 'quota-exceeded', sentinel, retryAfterSeconds };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (normalized.includes(CLASSIFY_HANDOFF_SENTINEL)) {
|
|
50
|
+
return {
|
|
51
|
+
class: 'classify-handoff-bug',
|
|
52
|
+
sentinel: CLASSIFY_HANDOFF_SENTINEL,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { class: 'unknown-failure' };
|
|
56
|
+
}
|
|
57
|
+
function routeAgentCommand({ args, raw }) {
|
|
58
|
+
const subcommand = args[1];
|
|
59
|
+
if (subcommand !== 'classify-failure') {
|
|
60
|
+
error('Unknown agent subcommand. Available: classify-failure', ERROR_REASON.SDK_UNKNOWN_COMMAND);
|
|
61
|
+
}
|
|
62
|
+
const bodyArgs = args.slice(2).filter((arg) => arg !== '--');
|
|
63
|
+
output(classifyAgentFailure(bodyArgs.join(' ')), raw, undefined);
|
|
64
|
+
}
|
|
65
|
+
module.exports = {
|
|
66
|
+
classifyAgentFailure,
|
|
67
|
+
routeAgentCommand,
|
|
68
|
+
};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Install Check — moved from core.cts (ADR-857 T0 #1268 phase rehome-core-squatters).
|
|
4
|
+
*
|
|
5
|
+
* Owns:
|
|
6
|
+
* - getAgentsDir(runtime?): string
|
|
7
|
+
* - checkAgentsInstalled(runtime?): AgentsInstalledResult
|
|
8
|
+
*
|
|
9
|
+
* The core.cjs re-export spine was retired in epic #1267; callers import
|
|
10
|
+
* these symbols from agent-install-check.cjs directly.
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
18
|
+
const modelProfiles = require("./model-profiles.cjs");
|
|
19
|
+
const { MODEL_PROFILES } = modelProfiles;
|
|
20
|
+
const runtime_homes_cjs_1 = require("./runtime-homes.cjs");
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the agents directory for the given runtime.
|
|
23
|
+
*
|
|
24
|
+
* Priority:
|
|
25
|
+
* 1. GSD_AGENTS_DIR env var (explicit override, any runtime)
|
|
26
|
+
* 2. For claude runtime: __dirname-relative path (agents/ sibling of gsd-core/)
|
|
27
|
+
* This is correct for both repo runs and real installs (the runtime config dir's
|
|
28
|
+
* agents/ folder) because gsd-tools.cjs lives inside gsd-core/bin/ in both cases.
|
|
29
|
+
* 3. For non-claude runtimes: getGlobalConfigDir(runtime)/agents
|
|
30
|
+
*
|
|
31
|
+
* @param runtime - the active runtime name; defaults to GSD_RUNTIME env, then 'claude'
|
|
32
|
+
*/
|
|
33
|
+
function getAgentsDir(runtime) {
|
|
34
|
+
if (process.env['GSD_AGENTS_DIR']) {
|
|
35
|
+
return process.env['GSD_AGENTS_DIR'];
|
|
36
|
+
}
|
|
37
|
+
const resolved = runtime ?? (process.env['GSD_RUNTIME'] || 'claude');
|
|
38
|
+
if (resolved === 'claude') {
|
|
39
|
+
return node_path_1.default.join(__dirname, '..', '..', '..', 'agents');
|
|
40
|
+
}
|
|
41
|
+
return node_path_1.default.join((0, runtime_homes_cjs_1.getGlobalConfigDir)(resolved), 'agents');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check which GSD agents are installed on disk.
|
|
45
|
+
*
|
|
46
|
+
* @param runtime - the active runtime name; defaults to GSD_RUNTIME env, then 'claude'
|
|
47
|
+
*/
|
|
48
|
+
function checkAgentsInstalled(runtime) {
|
|
49
|
+
const resolvedRuntime = runtime ?? (process.env['GSD_RUNTIME'] || 'claude');
|
|
50
|
+
const agentsDir = getAgentsDir(resolvedRuntime);
|
|
51
|
+
const expectedAgents = Object.keys(MODEL_PROFILES);
|
|
52
|
+
const installed = [];
|
|
53
|
+
const missing = [];
|
|
54
|
+
if (!node_fs_1.default.existsSync(agentsDir)) {
|
|
55
|
+
return {
|
|
56
|
+
agents_installed: false,
|
|
57
|
+
missing_agents: expectedAgents,
|
|
58
|
+
installed_agents: [],
|
|
59
|
+
incomplete_agents: [],
|
|
60
|
+
agents_dir: agentsDir,
|
|
61
|
+
agent_runtime: resolvedRuntime,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
for (const agent of expectedAgents) {
|
|
65
|
+
const agentFile = node_path_1.default.join(agentsDir, `${agent}.md`);
|
|
66
|
+
const agentFileCopilot = node_path_1.default.join(agentsDir, `${agent}.agent.md`);
|
|
67
|
+
const agentFileCodex = node_path_1.default.join(agentsDir, `${agent}.toml`);
|
|
68
|
+
const agentFileKimiYaml = node_path_1.default.join(agentsDir, 'subagents', `${agent}.yaml`);
|
|
69
|
+
const agentFileKimiPrompt = node_path_1.default.join(agentsDir, 'subagents', `${agent}.md`);
|
|
70
|
+
const kimiAgentInstalled = resolvedRuntime === 'kimi' &&
|
|
71
|
+
node_fs_1.default.existsSync(agentFileKimiYaml) &&
|
|
72
|
+
node_fs_1.default.existsSync(agentFileKimiPrompt);
|
|
73
|
+
if (node_fs_1.default.existsSync(agentFile) ||
|
|
74
|
+
node_fs_1.default.existsSync(agentFileCopilot) ||
|
|
75
|
+
node_fs_1.default.existsSync(agentFileCodex) ||
|
|
76
|
+
kimiAgentInstalled) {
|
|
77
|
+
installed.push(agent);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
missing.push(agent);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ── Manifest-backed completeness check ──────────────────────────────────────
|
|
84
|
+
// If a gsd-file-manifest.json exists alongside the agents dir (parent dir),
|
|
85
|
+
// verify that every manifest-tracked file for each expected agent is present
|
|
86
|
+
// on disk. Missing manifest-tracked files indicate an incomplete install even
|
|
87
|
+
// when the plain presence check above passed (e.g. .md present, .toml absent).
|
|
88
|
+
// If no manifest is found the check is a no-op (graceful for claude/bundled).
|
|
89
|
+
const incomplete = [];
|
|
90
|
+
const manifestPath = node_path_1.default.join(node_path_1.default.dirname(agentsDir), 'pp-file-manifest.json');
|
|
91
|
+
let manifestFiles = {};
|
|
92
|
+
try {
|
|
93
|
+
const raw = node_fs_1.default.readFileSync(manifestPath, 'utf8');
|
|
94
|
+
const parsed = JSON.parse(raw);
|
|
95
|
+
if (parsed !== null &&
|
|
96
|
+
typeof parsed === 'object' &&
|
|
97
|
+
'files' in parsed &&
|
|
98
|
+
typeof parsed['files'] === 'object' &&
|
|
99
|
+
parsed['files'] !== null) {
|
|
100
|
+
manifestFiles = parsed['files'];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// No manifest or unreadable — completeness check is skipped
|
|
105
|
+
}
|
|
106
|
+
if (Object.keys(manifestFiles).length > 0) {
|
|
107
|
+
for (const agent of expectedAgents) {
|
|
108
|
+
// Find all manifest keys that belong to this agent:
|
|
109
|
+
// key must be "agents/<agentName>.<ext>" with no further path segments.
|
|
110
|
+
const agentPrefix = `agents/${agent}.`;
|
|
111
|
+
const agentManifestKeys = Object.keys(manifestFiles).filter(key => {
|
|
112
|
+
if (!key.startsWith(agentPrefix))
|
|
113
|
+
return false;
|
|
114
|
+
const rest = key.slice(agentPrefix.length);
|
|
115
|
+
// rest must be a bare extension (no slashes, non-empty)
|
|
116
|
+
return rest.length > 0 && !rest.includes('/');
|
|
117
|
+
});
|
|
118
|
+
if (agentManifestKeys.length === 0) {
|
|
119
|
+
// Agent not tracked in manifest — skip completeness check for this agent
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const allPresent = agentManifestKeys.every(key => {
|
|
123
|
+
const basename = key.slice('agents/'.length);
|
|
124
|
+
return node_fs_1.default.existsSync(node_path_1.default.join(agentsDir, basename));
|
|
125
|
+
});
|
|
126
|
+
if (!allPresent) {
|
|
127
|
+
incomplete.push(agent);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
agents_installed: installed.length > 0 && missing.length === 0 && incomplete.length === 0,
|
|
133
|
+
missing_agents: missing,
|
|
134
|
+
installed_agents: installed,
|
|
135
|
+
incomplete_agents: incomplete,
|
|
136
|
+
agents_dir: agentsDir,
|
|
137
|
+
agent_runtime: resolvedRuntime,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
module.exports = {
|
|
141
|
+
getAgentsDir,
|
|
142
|
+
checkAgentsInstalled,
|
|
143
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical GSD artifact registry (ADR-457 build-at-publish: the hand-written
|
|
4
|
+
* bin/lib/artifacts.cjs collapsed to a TypeScript source of truth). Behaviour
|
|
5
|
+
* is preserved byte-for-behaviour from the prior hand-written .cjs; only types
|
|
6
|
+
* are added.
|
|
7
|
+
*
|
|
8
|
+
* Enumerates the file names that gsd workflows officially produce at the
|
|
9
|
+
* .planning/ root level. Used by gsd-health (W019) to flag unrecognized files
|
|
10
|
+
* so stale or misnamed artifacts don't silently mislead agents or reviewers.
|
|
11
|
+
*
|
|
12
|
+
* Add entries here whenever a new workflow produces a .planning/ root file.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CANONICAL_PATTERNS = exports.CANONICAL_EXACT = void 0;
|
|
16
|
+
exports.isCanonicalPlanningFile = isCanonicalPlanningFile;
|
|
17
|
+
// Exact-match canonical file names at .planning/ root
|
|
18
|
+
exports.CANONICAL_EXACT = new Set([
|
|
19
|
+
'PROJECT.md',
|
|
20
|
+
'ROADMAP.md',
|
|
21
|
+
'STATE.md',
|
|
22
|
+
'REQUIREMENTS.md',
|
|
23
|
+
'MILESTONES.md',
|
|
24
|
+
'BACKLOG.md',
|
|
25
|
+
'LEARNINGS.md',
|
|
26
|
+
'THREADS.md',
|
|
27
|
+
'config.json',
|
|
28
|
+
'CLAUDE.md',
|
|
29
|
+
'RETROSPECTIVE.md',
|
|
30
|
+
]);
|
|
31
|
+
// Pattern-match canonical file names (regex tests on the basename)
|
|
32
|
+
// Each pattern includes the name of the workflow that produces it as a comment.
|
|
33
|
+
exports.CANONICAL_PATTERNS = [
|
|
34
|
+
/^v\d+\.\d+(?:\.\d+)?-MILESTONE-AUDIT\.md$/i, // gsd-complete-milestone (pre-archive)
|
|
35
|
+
/^v\d+\.\d+(?:\.\d+)?-.*\.md$/i, // other version-stamped planning docs
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Return true if `filename` (basename only, no path) matches a canonical
|
|
39
|
+
* .planning/ root artifact — either an exact name or a known pattern.
|
|
40
|
+
*
|
|
41
|
+
* @param filename - Basename of the file (e.g. "STATE.md")
|
|
42
|
+
*/
|
|
43
|
+
function isCanonicalPlanningFile(filename) {
|
|
44
|
+
if (exports.CANONICAL_EXACT.has(filename))
|
|
45
|
+
return true;
|
|
46
|
+
for (const pattern of exports.CANONICAL_PATTERNS) {
|
|
47
|
+
if (pattern.test(filename))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|