@event4u/agent-config 14.23.0 → 16.0.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +144 -152
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +1 -1
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +4 -3
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/rules/user-interaction.md +31 -30
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
- package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
- package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +834 -275
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +5 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +6 -6
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +3 -3
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +54 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +25 -78
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9684 -9304
- package/dist/install/install.mjs +36 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2147 -1470
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/installed_lock.js +1 -1
- package/dist/scripts/condense.js +2 -5
- package/dist/server/io/yamlIO.js +175 -17
- package/dist/server/schemas/settings.js +18 -4
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/contracts/settings-classes.md +18 -9
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/package.json +7 -3
- package/src/config/agent-settings.template.yml +55 -8
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +11 -32
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +1 -1
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +12 -8
- package/src/config/preamble-payload-exceptions.json +28 -0
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_dispatch.bash +3 -1
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/base_ref_payload.ts +315 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_writer.ts +72 -13
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/dropped_decision.ts +142 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/release_findings_ingest.ts +324 -0
- package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
- package/src/scripts/_lib/review_baseline.ts +254 -0
- package/src/scripts/_lib/review_skipped_record.ts +61 -1
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_index_trust.ts +42 -1
- package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/turn_end_refusals.ts +51 -4
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/check_beta_review_markers.ts +35 -4
- package/src/scripts/check_finding_dispositions.ts +167 -16
- package/src/scripts/check_held_object_arrivals.ts +381 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +672 -107
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_reply_consistency.ts +86 -17
- package/src/scripts/code_graph/cli.ts +6 -0
- package/src/scripts/condense.ts +2 -6
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +74 -30
- package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
- package/src/scripts/hooks/review_baseline_hook.ts +130 -0
- package/src/scripts/hooks/session_eol_hook.ts +68 -154
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hooks_doctor.ts +4 -1
- package/src/scripts/hot_context_hook.ts +41 -401
- package/src/scripts/install.ts +1 -1
- package/src/scripts/interruption_report.ts +8 -2
- package/src/scripts/janitor.ts +8 -1
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/measure_turn_end_gate.ts +302 -5
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/release.ts +52 -64
- package/src/scripts/release_drill.ts +193 -14
- package/src/scripts/release_env.ts +1 -1
- package/src/scripts/release_publication.ts +1 -1
- package/src/scripts/report_held_object_arrivals.ts +456 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/session_memory_index.ts +5 -0
- package/src/scripts/sync_agent_settings.ts +394 -12
- package/src/server/io/yamlIO.ts +175 -17
- package/src/server/schemas/settings.ts +25 -5
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* A projected rule may not route somewhere the projection does not contain.
|
|
4
|
+
*
|
|
5
|
+
* Two halves, deliberately graded differently because the evidence differs.
|
|
6
|
+
*
|
|
7
|
+
* **A — `routes_to: guideline:<slug>` (HARD).** A rule that declares a routed
|
|
8
|
+
* body owes a body a consumer can open. Until the `docs/guidelines/` lane
|
|
9
|
+
* shipped (`_lib/guidelines_lane.ts`) every one of these was declared and dead;
|
|
10
|
+
* the measurement on the tree that shipped the lane is **22 distinct targets,
|
|
11
|
+
* 0 unresolved**, so the honest grade is a hard fail — there is no debt to
|
|
12
|
+
* ratchet down and a violation is a new one.
|
|
13
|
+
*
|
|
14
|
+
* **B — relative `.md` links (RATCHET, shrink-only).** A projected rule also
|
|
15
|
+
* carries ordinary body links, and 36 of them resolve to nothing inside
|
|
16
|
+
* `dist/agent-src/`. They are NOT a defect this gate can close: every one
|
|
17
|
+
* points at `docs/contracts/` or `agents/settings/policies/`, and neither is
|
|
18
|
+
* projected — `docs/contracts/` deliberately so (three files ship, at their
|
|
19
|
+
* own path), `agents/` because it is this repository's own workspace and does
|
|
20
|
+
* not exist in a consumer at all. Closing them means deciding to project a
|
|
21
|
+
* second tree, which is a different change with a different owner. So the
|
|
22
|
+
* count is pinned and may only fall.
|
|
23
|
+
*
|
|
24
|
+
* What the ratchet actually buys, stated because a floor of 36 looks like a
|
|
25
|
+
* shrug: the guideline half of this population is **zero**, and the gate is
|
|
26
|
+
* what keeps it zero. A regression that re-broke the lane would push 36 → 60+
|
|
27
|
+
* and red immediately.
|
|
28
|
+
*
|
|
29
|
+
* Exit codes: 0 clean · 1 an unresolved `routes_to:` target, or the relative
|
|
30
|
+
* ratchet rose · 2 misuse / unreadable input.
|
|
31
|
+
*
|
|
32
|
+
* Usage:
|
|
33
|
+
* ./scripts-run src/scripts/check_projected_rule_routes [--root <path>] [--quiet]
|
|
34
|
+
* ./scripts-run src/scripts/check_projected_rule_routes --self-test
|
|
35
|
+
*/
|
|
36
|
+
import * as fs from 'node:fs';
|
|
37
|
+
import * as os from 'node:os';
|
|
38
|
+
import * as path from 'node:path';
|
|
39
|
+
|
|
40
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
41
|
+
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
42
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
43
|
+
|
|
44
|
+
const HERE = path.dirname(new URL(import.meta.url).pathname);
|
|
45
|
+
const REPO_ROOT = path.resolve(HERE, '..', '..');
|
|
46
|
+
|
|
47
|
+
/** Where the projection puts rules and the guideline bodies they route to. */
|
|
48
|
+
const RULES_SUBDIR = path.join('dist', 'agent-src', 'rules');
|
|
49
|
+
const GUIDELINES_SUBDIR = path.join('dist', 'agent-src', 'guidelines');
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Shrink-only floor for half B. Measured 2026-09-09 on the tree that shipped
|
|
53
|
+
* the guidelines lane, by this module's own `REL_LINK_RE` over its own corpus:
|
|
54
|
+
* **262** relative links across the projected rules, **36** of them unresolved,
|
|
55
|
+
* every one under `docs/contracts/` or `agents/`. Lower it when a link is
|
|
56
|
+
* genuinely fixed; never raise it. (The denominator read 256 in a first draft —
|
|
57
|
+
* a hand count, not the gate's. A blind review caught it. The floor was right
|
|
58
|
+
* either way, which is exactly why the wrong denominator could sit there
|
|
59
|
+
* unnoticed: quote the number the code prints.)
|
|
60
|
+
*/
|
|
61
|
+
export const UNRESOLVED_RELATIVE_FLOOR = 36;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Shrink-only floor for the same half, over the GUIDELINE bodies the lane
|
|
65
|
+
* projects. A blind review of the branch that shipped the lane found this
|
|
66
|
+
* population unmeasured and 253 of 268 links dead — the projection carried 120
|
|
67
|
+
* bodies whose own cross-references resolved to nothing, including five in the
|
|
68
|
+
* one file Phase 2 existed for. Repairing the `src/` class in the rewriter took
|
|
69
|
+
* it to 60; the residue is `docs/contracts`, `docs/decisions`, `agents/` and
|
|
70
|
+
* two template placeholders, none of which is a projected tree. The floor is the
|
|
71
|
+
* gate's OWN reading, 44 — an earlier draft said 60 from a hand-written glob
|
|
72
|
+
* that counted the top-level files twice, and a floor above the measurement is
|
|
73
|
+
* a floor that cannot bite.
|
|
74
|
+
*
|
|
75
|
+
* It is a SEPARATE floor from the rules one on purpose: pooling them would let
|
|
76
|
+
* a regression in one population hide behind an improvement in the other, and
|
|
77
|
+
* the two are repaired by different changes.
|
|
78
|
+
*/
|
|
79
|
+
export const UNRESOLVED_GUIDELINE_FLOOR = 44;
|
|
80
|
+
|
|
81
|
+
// No `.` in the slug class: with it, a prose mention of the shape
|
|
82
|
+
// `guideline:foo.md` was captured as slug `foo.md` and checked against
|
|
83
|
+
// `foo.md.md`. No live instance exists, but this half is graded HARD, so the
|
|
84
|
+
// first body that spells a reference that way would red CI for a non-defect.
|
|
85
|
+
// Blind-review finding.
|
|
86
|
+
const ROUTES_TO_RE = /guideline:([A-Za-z0-9][A-Za-z0-9/_-]*)/g;
|
|
87
|
+
const REL_LINK_RE = /\]\((\.\.?\/[^)\s#]+\.md)(?:#[^)]*)?\)/g;
|
|
88
|
+
|
|
89
|
+
export interface RouteFinding {
|
|
90
|
+
file: string;
|
|
91
|
+
message: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface RouteVerdict {
|
|
95
|
+
scanned: number;
|
|
96
|
+
/** Distinct `guideline:` targets seen, resolved or not. */
|
|
97
|
+
targets: number;
|
|
98
|
+
/** Relative `.md` links seen in projected rules. */
|
|
99
|
+
relativeLinks: number;
|
|
100
|
+
unresolvedRelative: number;
|
|
101
|
+
/** The unresolved rule links themselves, so a failure can name them. */
|
|
102
|
+
unresolvedRuleLinks: Array<{ file: string; link: string }>;
|
|
103
|
+
/** The same two counts over the projected guideline bodies. */
|
|
104
|
+
guidelineLinks: number;
|
|
105
|
+
unresolvedGuideline: number;
|
|
106
|
+
findings: RouteFinding[];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Every `.md` under `dir`, recursively, name-sorted at each level. */
|
|
110
|
+
function walkMarkdown(dir: string): string[] {
|
|
111
|
+
if (!fs.existsSync(dir)) return [];
|
|
112
|
+
const out: string[] = [];
|
|
113
|
+
for (const name of fs.readdirSync(dir).sort()) {
|
|
114
|
+
const full = path.join(dir, name);
|
|
115
|
+
if (fs.statSync(full).isDirectory()) out.push(...walkMarkdown(full));
|
|
116
|
+
else if (name.endsWith('.md')) out.push(full);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Rule files, RECURSIVELY, as paths relative to `dir`.
|
|
123
|
+
*
|
|
124
|
+
* Non-recursive in a first draft, which would have silently unscanned a rule in
|
|
125
|
+
* a subdirectory — a gate that reads less than its corpus and reports green is
|
|
126
|
+
* the failure `gate-coverage.yml` exists for. Blind-review finding.
|
|
127
|
+
*/
|
|
128
|
+
function listRules(dir: string): string[] {
|
|
129
|
+
return walkMarkdown(dir).map((p) => path.relative(dir, p));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function evaluate(root: string = REPO_ROOT, ledger?: GateLedger): RouteVerdict {
|
|
133
|
+
const rulesDir = path.join(root, RULES_SUBDIR);
|
|
134
|
+
const guidelinesDir = path.join(root, GUIDELINES_SUBDIR);
|
|
135
|
+
const findings: RouteFinding[] = [];
|
|
136
|
+
const seenTargets = new Set<string>();
|
|
137
|
+
let scanned = 0;
|
|
138
|
+
let relativeLinks = 0;
|
|
139
|
+
let unresolvedRelative = 0;
|
|
140
|
+
const unresolvedRuleLinks: Array<{ file: string; link: string }> = [];
|
|
141
|
+
|
|
142
|
+
const names = listRules(rulesDir);
|
|
143
|
+
ledger?.plan(names);
|
|
144
|
+
|
|
145
|
+
for (const name of names) {
|
|
146
|
+
const file = path.join(rulesDir, name);
|
|
147
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
148
|
+
scanned += 1;
|
|
149
|
+
let failed = 0;
|
|
150
|
+
|
|
151
|
+
for (const m of text.matchAll(ROUTES_TO_RE)) {
|
|
152
|
+
const slug = m[1] as string;
|
|
153
|
+
seenTargets.add(slug);
|
|
154
|
+
if (!fs.existsSync(path.join(guidelinesDir, `${slug}.md`))) {
|
|
155
|
+
failed += 1;
|
|
156
|
+
findings.push({
|
|
157
|
+
file: path.join(RULES_SUBDIR, name),
|
|
158
|
+
message:
|
|
159
|
+
`routes to \`guideline:${slug}\`, and ` +
|
|
160
|
+
`${path.join(GUIDELINES_SUBDIR, `${slug}.md`)} does not exist. ` +
|
|
161
|
+
`A consumer install cannot open it.`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
for (const m of text.matchAll(REL_LINK_RE)) {
|
|
167
|
+
relativeLinks += 1;
|
|
168
|
+
const link = m[1] as string;
|
|
169
|
+
if (!fs.existsSync(path.resolve(path.dirname(file), link))) {
|
|
170
|
+
unresolvedRelative += 1;
|
|
171
|
+
unresolvedRuleLinks.push({ file: path.join(RULES_SUBDIR, name), link });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (failed > 0) ledger?.fail(name, `${String(failed)} unresolved guideline route(s)`);
|
|
176
|
+
else ledger?.complete(name);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// The guideline bodies themselves. Walked recursively — the lane preserves
|
|
180
|
+
// `docs/guidelines/`'s own subdirectories, so a flat readdir would miss
|
|
181
|
+
// `agent-infra/` and `php/`, which is most of the corpus.
|
|
182
|
+
let guidelineLinks = 0;
|
|
183
|
+
let unresolvedGuideline = 0;
|
|
184
|
+
for (const file of walkMarkdown(guidelinesDir)) {
|
|
185
|
+
for (const m of fs.readFileSync(file, 'utf-8').matchAll(REL_LINK_RE)) {
|
|
186
|
+
guidelineLinks += 1;
|
|
187
|
+
if (!fs.existsSync(path.resolve(path.dirname(file), m[1] as string))) {
|
|
188
|
+
unresolvedGuideline += 1;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
scanned,
|
|
195
|
+
targets: seenTargets.size,
|
|
196
|
+
relativeLinks,
|
|
197
|
+
unresolvedRelative,
|
|
198
|
+
unresolvedRuleLinks,
|
|
199
|
+
guidelineLinks,
|
|
200
|
+
unresolvedGuideline,
|
|
201
|
+
findings,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// ---------------------------------------------------------------- self-test
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Plant a minimal projection under a tmp root. `guidelineSlug` is the body that
|
|
209
|
+
* actually exists; `routesTo` is what the rule claims. Passing them equal is the
|
|
210
|
+
* accept case, differing is the reject case.
|
|
211
|
+
*/
|
|
212
|
+
function plant(
|
|
213
|
+
root: string,
|
|
214
|
+
opts: { routesTo?: string; guidelineSlug?: string; relLink?: string },
|
|
215
|
+
): void {
|
|
216
|
+
const rulesDir = path.join(root, RULES_SUBDIR);
|
|
217
|
+
const guidelinesDir = path.join(root, GUIDELINES_SUBDIR);
|
|
218
|
+
fs.mkdirSync(rulesDir, { recursive: true });
|
|
219
|
+
fs.mkdirSync(guidelinesDir, { recursive: true });
|
|
220
|
+
if (opts.guidelineSlug !== undefined) {
|
|
221
|
+
const target = path.join(guidelinesDir, `${opts.guidelineSlug}.md`);
|
|
222
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
223
|
+
fs.writeFileSync(target, '# body\n');
|
|
224
|
+
}
|
|
225
|
+
const lines = ['---', 'name: probe'];
|
|
226
|
+
if (opts.routesTo !== undefined) lines.push(`routes_to: guideline:${opts.routesTo}`);
|
|
227
|
+
lines.push('---', '', '# probe', '');
|
|
228
|
+
if (opts.relLink !== undefined) lines.push(`See [body](${opts.relLink}).`);
|
|
229
|
+
fs.writeFileSync(path.join(rulesDir, 'probe.md'), `${lines.join('\n')}\n`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function selfTestCases(): SelfTestCase[] {
|
|
233
|
+
const mk = (
|
|
234
|
+
name: string,
|
|
235
|
+
expect: 'reject' | 'accept',
|
|
236
|
+
opts: { routesTo?: string; guidelineSlug?: string; relLink?: string },
|
|
237
|
+
): SelfTestCase => ({
|
|
238
|
+
name,
|
|
239
|
+
expect,
|
|
240
|
+
run: () => {
|
|
241
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'prr-'));
|
|
242
|
+
try {
|
|
243
|
+
plant(root, opts);
|
|
244
|
+
return runGateCli(
|
|
245
|
+
REPO_ROOT,
|
|
246
|
+
'src/scripts/check_projected_rule_routes.ts',
|
|
247
|
+
['--root', root, '--quiet'],
|
|
248
|
+
REPO_ROOT,
|
|
249
|
+
);
|
|
250
|
+
} finally {
|
|
251
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
return [
|
|
256
|
+
mk('routes_to target exists → accept', 'accept', { routesTo: 'x', guidelineSlug: 'x' }),
|
|
257
|
+
mk('routes_to target missing → reject', 'reject', { routesTo: 'x' }),
|
|
258
|
+
mk('routes_to a nested target that exists → accept', 'accept', {
|
|
259
|
+
routesTo: 'agent-infra/x',
|
|
260
|
+
guidelineSlug: 'agent-infra/x',
|
|
261
|
+
}),
|
|
262
|
+
mk('routes_to a nested target that does not → reject', 'reject', {
|
|
263
|
+
routesTo: 'agent-infra/x',
|
|
264
|
+
}),
|
|
265
|
+
// The exact regression the lane exists to prevent: the slug resolves as
|
|
266
|
+
// a bare filename but not under the projected guidelines directory.
|
|
267
|
+
mk('routes_to a slug that only exists outside the projection → reject', 'reject', {
|
|
268
|
+
routesTo: 'design-fidelity-mechanics',
|
|
269
|
+
}),
|
|
270
|
+
mk('no routes_to at all → accept', 'accept', {}),
|
|
271
|
+
// Half B is a ratchet, so a single broken relative link on a tmp root
|
|
272
|
+
// (floor 36, observed 1) must NOT fail — the gate reds on a RISE only.
|
|
273
|
+
mk('one unresolved relative link, far below the floor → accept', 'accept', {
|
|
274
|
+
relLink: '../guidelines/nope.md',
|
|
275
|
+
}),
|
|
276
|
+
mk('a resolving relative link → accept', 'accept', {
|
|
277
|
+
guidelineSlug: 'y',
|
|
278
|
+
relLink: '../guidelines/y.md',
|
|
279
|
+
}),
|
|
280
|
+
mk('both halves clean → accept', 'accept', {
|
|
281
|
+
routesTo: 'y',
|
|
282
|
+
guidelineSlug: 'y',
|
|
283
|
+
relLink: '../guidelines/y.md',
|
|
284
|
+
}),
|
|
285
|
+
mk('a good route plus a bad one in the same rule → reject', 'reject', {
|
|
286
|
+
routesTo: 'missing',
|
|
287
|
+
guidelineSlug: 'present',
|
|
288
|
+
}),
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ---------------------------------------------------------------------- CLI
|
|
293
|
+
|
|
294
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
295
|
+
if (argv.includes('--self-test')) {
|
|
296
|
+
return runSelfTest({
|
|
297
|
+
gate: 'check_projected_rule_routes',
|
|
298
|
+
cases: selfTestCases(),
|
|
299
|
+
minCases: 8,
|
|
300
|
+
minRejectCases: 4,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
const quiet = argv.includes('--quiet');
|
|
304
|
+
const ri = argv.indexOf('--root');
|
|
305
|
+
const rootArg = ri !== -1 ? argv[ri + 1] : undefined;
|
|
306
|
+
const root = rootArg !== undefined ? path.resolve(rootArg) : REPO_ROOT;
|
|
307
|
+
// A tmp fixture root has its own tiny corpus, so the shrink-only floor is
|
|
308
|
+
// meaningless there and only the hard half is judged.
|
|
309
|
+
const isFixtureRoot = root !== REPO_ROOT;
|
|
310
|
+
|
|
311
|
+
const ledger = new GateLedger('check_projected_rule_routes');
|
|
312
|
+
let v: RouteVerdict;
|
|
313
|
+
try {
|
|
314
|
+
v = evaluate(root, ledger);
|
|
315
|
+
} catch (err) {
|
|
316
|
+
process.stderr.write(`❌ check_projected_rule_routes: ${(err as Error).message}\n`);
|
|
317
|
+
return 2;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
try {
|
|
321
|
+
reportScanned({
|
|
322
|
+
gate: 'check_projected_rule_routes',
|
|
323
|
+
scanned: v.scanned,
|
|
324
|
+
units: 'projected rule(s)',
|
|
325
|
+
roots: [RULES_SUBDIR],
|
|
326
|
+
allowEmpty:
|
|
327
|
+
'EMPTY_VALID: a checkout with no projection yet (pre-`task sync`) has no projected rule to judge',
|
|
328
|
+
});
|
|
329
|
+
} catch (err) {
|
|
330
|
+
if (err instanceof DeadScopeError) {
|
|
331
|
+
process.stderr.write(`❌ check_projected_rule_routes: ${err.message}\n`);
|
|
332
|
+
return 2;
|
|
333
|
+
}
|
|
334
|
+
throw err;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
ledger.report();
|
|
338
|
+
|
|
339
|
+
if (v.findings.length > 0) {
|
|
340
|
+
for (const f of v.findings) process.stderr.write(`❌ ${f.file}: ${f.message}\n`);
|
|
341
|
+
process.stderr.write(
|
|
342
|
+
`\n A projected rule routes to a body the projection does not contain.\n` +
|
|
343
|
+
` Either the guideline lane dropped it (see src/scripts/_lib/guidelines_lane.ts)\n` +
|
|
344
|
+
` or the slug is wrong. Run 'task sync' first — the lane writes on sync.\n`,
|
|
345
|
+
);
|
|
346
|
+
return 1;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
if (!isFixtureRoot && v.unresolvedGuideline > UNRESOLVED_GUIDELINE_FLOOR) {
|
|
350
|
+
process.stderr.write(
|
|
351
|
+
`❌ check_projected_rule_routes: unresolved links inside the projected ` +
|
|
352
|
+
`guidelines rose to ${String(v.unresolvedGuideline)}, floor is ` +
|
|
353
|
+
`${String(UNRESOLVED_GUIDELINE_FLOOR)}.\n` +
|
|
354
|
+
` A guideline body whose own cross-references are dead is a body a\n` +
|
|
355
|
+
` consumer cannot follow. Most of this class is repaired in\n` +
|
|
356
|
+
` condense.ts::_rewrite_body_links; the residue points at trees the\n` +
|
|
357
|
+
` projection does not carry.\n`,
|
|
358
|
+
);
|
|
359
|
+
return 1;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (!isFixtureRoot && v.unresolvedRelative > UNRESOLVED_RELATIVE_FLOOR) {
|
|
363
|
+
process.stderr.write(
|
|
364
|
+
`❌ check_projected_rule_routes: unresolved relative links rose to ` +
|
|
365
|
+
`${String(v.unresolvedRelative)}, floor is ${String(UNRESOLVED_RELATIVE_FLOOR)}.\n` +
|
|
366
|
+
` This ratchet is shrink-only. Fix the link, or — if a whole tree became\n` +
|
|
367
|
+
` projectable — lower UNRESOLVED_RELATIVE_FLOOR in the same commit.\n`,
|
|
368
|
+
);
|
|
369
|
+
// Name them. An aggregate the operator cannot act on is half a finding,
|
|
370
|
+
// and `evaluate` already holds every path — it used to count and throw
|
|
371
|
+
// them away. Blind-review finding.
|
|
372
|
+
for (const u of v.unresolvedRuleLinks) {
|
|
373
|
+
process.stderr.write(` ${u.file} → ${u.link}\n`);
|
|
374
|
+
}
|
|
375
|
+
return 1;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
if (!quiet) {
|
|
379
|
+
process.stdout.write(
|
|
380
|
+
`✅ every projected rule's guideline route resolves ` +
|
|
381
|
+
`(${String(v.scanned)} rule(s), ${String(v.targets)} distinct target(s); ` +
|
|
382
|
+
`${String(v.unresolvedRelative)}/${String(v.relativeLinks)} rule links unresolved, ` +
|
|
383
|
+
`floor ${String(UNRESOLVED_RELATIVE_FLOOR)}; ` +
|
|
384
|
+
`${String(v.unresolvedGuideline)}/${String(v.guidelineLinks)} guideline links unresolved, ` +
|
|
385
|
+
`floor ${String(UNRESOLVED_GUIDELINE_FLOOR)}).\n`,
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
return 0;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (process.env['GATE_SELF_TEST_CHILD'] !== '1' || process.argv.includes('--root')) {
|
|
392
|
+
if (process.argv[1] !== undefined && import.meta.url === `file://${process.argv[1]}`) {
|
|
393
|
+
process.exit(main());
|
|
394
|
+
}
|
|
395
|
+
}
|
|
@@ -57,7 +57,7 @@ function _package_name(): string {
|
|
|
57
57
|
*
|
|
58
58
|
* This probe used to answer local-OR-remote, and that made the gate reply
|
|
59
59
|
* "tagged, therefore published" to the exact state it exists to detect. A tag
|
|
60
|
-
* created by `release.ts` step
|
|
60
|
+
* created by `release.ts` step 9 whose push then failed sits in the local
|
|
61
61
|
* repository while nothing has shipped: `publish-npm.yml` triggers on
|
|
62
62
|
* `push: tags:`, so a tag that never reached the remote published nothing.
|
|
63
63
|
* Measured 2026-08-20 on 14.6.0 — main carried `package.json` 14.6.0, the tag
|
|
@@ -82,6 +82,10 @@ function _strip_codespans(line: string): string {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/** Split on \n / \r\n / \r, dropping a single trailing empty element. */
|
|
85
|
+
export function splitAndMask(text: string): string[] {
|
|
86
|
+
return mask_fences(_splitlines(text));
|
|
87
|
+
}
|
|
88
|
+
|
|
85
89
|
function _splitlines(text: string): string[] {
|
|
86
90
|
if (text === '') return [];
|
|
87
91
|
const parts = text.split(/\r\n|\r|\n/);
|
|
@@ -143,6 +147,64 @@ export function find_option_blocks(text: string): OptionBlock[] {
|
|
|
143
147
|
return blocks;
|
|
144
148
|
}
|
|
145
149
|
|
|
150
|
+
/** A recommendation line found in a block's adjacency window. */
|
|
151
|
+
export interface RecommendationLine {
|
|
152
|
+
/** 1-based line of the recommendation. */
|
|
153
|
+
line: number;
|
|
154
|
+
/** The number it names. Not necessarily one of the block's options. */
|
|
155
|
+
num: number;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The recommendation line(s) sitting in ONE block's adjacency window.
|
|
160
|
+
*
|
|
161
|
+
* Extracted from `check_reply` rather than copied, because it has a second
|
|
162
|
+
* caller: `turn_end_gate_hook`'s `pending-decision` detector needs the same
|
|
163
|
+
* question this answers — is this numbered block an ASK, or is it a narrative
|
|
164
|
+
* list? Iron Law 1 says the recommendation line IS the ask, so a block without
|
|
165
|
+
* one was never a decision put to the user.
|
|
166
|
+
*
|
|
167
|
+
* That distinction is not decoration. Replayed over this repository's own 592
|
|
168
|
+
* assistant turns, a detector keyed on the block alone fired 29 times and 8 of
|
|
169
|
+
* those blocks carried no recommendation line anywhere near them — plans,
|
|
170
|
+
* findings lists, ordinary enumerations. Requiring the line removes that whole
|
|
171
|
+
* class, and it removes it by applying the rule the gate already cites rather
|
|
172
|
+
* than by adding a heuristic beside it.
|
|
173
|
+
*
|
|
174
|
+
* Returns every recommendation in the window, not the first: `check_reply`
|
|
175
|
+
* treats two as its own finding, and a caller that only wanted existence can
|
|
176
|
+
* read `.length > 0`.
|
|
177
|
+
*/
|
|
178
|
+
export function recommendationsUnder(
|
|
179
|
+
text: string,
|
|
180
|
+
block: OptionBlock,
|
|
181
|
+
maskedLines?: readonly string[],
|
|
182
|
+
): RecommendationLine[] {
|
|
183
|
+
// `maskedLines` lets a caller with several blocks over one text mask once
|
|
184
|
+
// instead of once per block. It is the SAME array `check_reply` and
|
|
185
|
+
// `find_option_blocks` compute; passing anything else silently changes the
|
|
186
|
+
// line numbers this returns, which is why it is an optimisation parameter
|
|
187
|
+
// and not part of the contract.
|
|
188
|
+
const lines = maskedLines ?? mask_fences(_splitlines(text));
|
|
189
|
+
const recs: RecommendationLine[] = [];
|
|
190
|
+
let inspected = 0;
|
|
191
|
+
for (let idx = block.endLine; idx < lines.length && inspected < REC_ADJACENCY_WINDOW; idx++) {
|
|
192
|
+
const line = lines[idx]!;
|
|
193
|
+
if (line.trim() === '') {
|
|
194
|
+
continue; // blank lines do not consume the adjacency window
|
|
195
|
+
}
|
|
196
|
+
if (HEADING_RE.test(line) || OPTION_LINE_RE.test(line)) {
|
|
197
|
+
break; // a new heading or a new options block ends this block's window
|
|
198
|
+
}
|
|
199
|
+
inspected += 1;
|
|
200
|
+
const m = REC_LINE_RE.exec(line);
|
|
201
|
+
if (m) {
|
|
202
|
+
recs.push({ line: idx + 1, num: parseInt(m[1]!, 10) });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return recs;
|
|
206
|
+
}
|
|
207
|
+
|
|
146
208
|
/**
|
|
147
209
|
* Core check — the exported function tests drive. Returns all findings for
|
|
148
210
|
* one reply draft; empty array = the draft is consistent.
|
|
@@ -166,22 +228,7 @@ export function check_reply(text: string): Finding[] {
|
|
|
166
228
|
// Per-block: exactly one adjacent recommendation line, number in range.
|
|
167
229
|
const blocks = find_option_blocks(text);
|
|
168
230
|
for (const block of blocks) {
|
|
169
|
-
const recs
|
|
170
|
-
let inspected = 0;
|
|
171
|
-
for (let idx = block.endLine; idx < lines.length && inspected < REC_ADJACENCY_WINDOW; idx++) {
|
|
172
|
-
const line = lines[idx]!;
|
|
173
|
-
if (line.trim() === '') {
|
|
174
|
-
continue; // blank lines do not consume the adjacency window
|
|
175
|
-
}
|
|
176
|
-
if (HEADING_RE.test(line) || OPTION_LINE_RE.test(line)) {
|
|
177
|
-
break; // a new heading or a new options block ends this block's window
|
|
178
|
-
}
|
|
179
|
-
inspected += 1;
|
|
180
|
-
const m = REC_LINE_RE.exec(line);
|
|
181
|
-
if (m) {
|
|
182
|
-
recs.push({ line: idx + 1, num: parseInt(m[1]!, 10) });
|
|
183
|
-
}
|
|
184
|
-
}
|
|
231
|
+
const recs = recommendationsUnder(text, block);
|
|
185
232
|
if (recs.length === 0) {
|
|
186
233
|
findings.push({
|
|
187
234
|
line: block.startLine,
|
|
@@ -421,7 +468,24 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
421
468
|
return 2;
|
|
422
469
|
}
|
|
423
470
|
|
|
471
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
472
|
+
// every module shares the bundle's `import.meta.url`.
|
|
473
|
+
//
|
|
474
|
+
// This module is not a hook, and until `turn_end_gate_hook` began importing
|
|
475
|
+
// `find_option_blocks` / `recommendationsUnder` from it, it was never inside
|
|
476
|
+
// one. It is now pulled into `dist/hooks/dispatch.js`, where without this guard
|
|
477
|
+
// the `import.meta.url === argvUrl` comparison below is TRUE for every bundled
|
|
478
|
+
// module — so importing this file would call `process.exit(main())` and take the
|
|
479
|
+
// whole dispatch down at import time. The build banner's `.__direct__` argv
|
|
480
|
+
// rewrite also prevents it, and a comment in the gate says so; a guard the other
|
|
481
|
+
// bundled entries all carry is the load-bearing half, and depending on the
|
|
482
|
+
// banner alone is depending on something no test pins.
|
|
483
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
484
|
+
|
|
424
485
|
function _isCliEntry(): boolean {
|
|
486
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
425
489
|
if (process.argv[1] === undefined) {
|
|
426
490
|
return false;
|
|
427
491
|
}
|
|
@@ -442,7 +506,12 @@ function _isCliEntry(): boolean {
|
|
|
442
506
|
}
|
|
443
507
|
}
|
|
444
508
|
|
|
445
|
-
|
|
509
|
+
// The `|| process.argv[1] === _HERE` arm is the reason the bundle check lives in
|
|
510
|
+
// BOTH places: inside a bundle `_HERE` resolves to the bundle's own path and so
|
|
511
|
+
// does `process.argv[1]`, so this arm would be true and would route straight past
|
|
512
|
+
// a guard that only sat in `_isCliEntry`.
|
|
513
|
+
const _IN_BUNDLE = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
|
|
514
|
+
if (!_IN_BUNDLE && (_isCliEntry() || process.argv[1] === _HERE)) {
|
|
446
515
|
process.exit(main());
|
|
447
516
|
}
|
|
448
517
|
|
|
@@ -294,6 +294,12 @@ function budgetOf(argv: string[]): number {
|
|
|
294
294
|
* measured.
|
|
295
295
|
*/
|
|
296
296
|
export function changedFiles(root: string, ref: string): string[] | null {
|
|
297
|
+
// `execFileSync` takes an argv array, so there is no shell and `$(...)` in a
|
|
298
|
+
// rev is inert. What the `${ref}..HEAD` concatenation does NOT stop is
|
|
299
|
+
// OPTION injection: `--output=/tmp/x` becomes `--output=/tmp/x..HEAD`, a
|
|
300
|
+
// well-formed option whose value is a filename, and the file is written with
|
|
301
|
+
// exit 0 (probed 2026-09-09). A rev never begins with `-`.
|
|
302
|
+
if (ref.startsWith('-')) return null;
|
|
297
303
|
try {
|
|
298
304
|
return execFileSync('git', ['-C', root, 'diff', '--name-only', `${ref}..HEAD`], {
|
|
299
305
|
env: hardenedSpawnEnv(),
|
package/src/scripts/condense.ts
CHANGED
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
resolve_logical as _agent_src_resolve_logical,
|
|
42
42
|
strip_source_prefix,
|
|
43
43
|
} from './_lib/agent_src.js';
|
|
44
|
+
import { rewriteProjectedBodyLinks } from './_lib/guidelines_lane.js';
|
|
44
45
|
// Import-safety note: `project_thin_rules` guards its CLI entry
|
|
45
46
|
// (`_isCliEntry()` before `process.exit(main())`), so importing it here is
|
|
46
47
|
// side-effect-free. condense.ts is bundled into the installer, where a bare
|
|
@@ -797,7 +798,6 @@ const _LEGACY_PROJECTED_SRC_PREFIX = '.agent-src/';
|
|
|
797
798
|
|
|
798
799
|
const _FM_LIST_ITEM_RE = /^(\s*-\s*)(["']?)([^"'\n]+?\.md)(["']?)\s*$/;
|
|
799
800
|
const _FM_PATH_PREFIX_RE = /^(\s*(?:-\s+)?path_prefix:\s*)(["']?)([^"'\n]+?)(["']?)\s*$/;
|
|
800
|
-
const _BODY_DOCS_RE = /\.\.\/\.\.\/(docs\/(?:guidelines|contracts)\/[^)\s]+\.md)/g;
|
|
801
801
|
const _FM_PLAIN_LIST_RE = /^\s*-\s*(["']?)([^"'\n]+?)\1\s*$/;
|
|
802
802
|
|
|
803
803
|
const _HRR_BANNER_MARKER = '<!-- agent-config:human-review-banner -->';
|
|
@@ -877,10 +877,6 @@ function _rewrite_frontmatter_lines(lines: string[], prefix: string): string[] {
|
|
|
877
877
|
return out;
|
|
878
878
|
}
|
|
879
879
|
|
|
880
|
-
function _rewrite_body_links(body: string, prefix: string): string {
|
|
881
|
-
return body.replace(_BODY_DOCS_RE, (_m, tail: string) => prefix + tail);
|
|
882
|
-
}
|
|
883
|
-
|
|
884
880
|
function _parse_trust_and_owner(fm_lines: string[]): [string, boolean, string] {
|
|
885
881
|
let level = 'core';
|
|
886
882
|
let hrr = false;
|
|
@@ -934,7 +930,7 @@ function _inject_hrr_banner(body: string, level: string, owner: string): string
|
|
|
934
930
|
export function _rewrite_paths(content: string, source_relative_path: string): string {
|
|
935
931
|
const prefix = _depth_prefix(source_relative_path);
|
|
936
932
|
const [fm_lines, bodyInitial] = _split_frontmatter(content);
|
|
937
|
-
let body =
|
|
933
|
+
let body = rewriteProjectedBodyLinks(bodyInitial, prefix);
|
|
938
934
|
if (fm_lines === null) {
|
|
939
935
|
return body;
|
|
940
936
|
}
|