@event4u/agent-config 16.2.0 → 16.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +337 -234
- package/README.md +15 -13
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +11 -8
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +18 -4
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +4 -4
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +56 -42
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +1 -2
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +1 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +6 -6
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +12 -16
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/domain-safety-retention.md +1 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +2 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +3 -3
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +13 -17
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +4 -5
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +7 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +1 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +12 -46
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +1 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +207 -120
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +1252 -249
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +19 -9
- package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
- package/dist/cli-delegate/cmd_explain.js +45 -21
- package/dist/cli-delegate/cmd_export.js +13 -10
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +44 -22
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +5 -4
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +14 -11
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +10 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +10 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +14 -11
- package/dist/cli-delegate/cmd_uninstall.js +15 -12
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +9 -8
- package/dist/cli-delegate/cmd_validate.js +15 -12
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +3 -3
- package/dist/cli-delegate/roadmap_gates.js +6 -6
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +232 -141
- 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 +26 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +7 -4
- package/dist/hooks/dispatch.js +5655 -6623
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2336 -1249
- package/dist/install/installThinLayer.js +289 -0
- package/dist/install/installedRuleLinks.js +262 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +36504 -30986
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +26 -120
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +704 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +535 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +29 -81
- package/dist/shared/skillRanking.js +103 -16
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +39 -67
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +141 -334
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +10 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +23 -10
- package/src/config/gate-coverage.yml +138 -3
- package/src/config/gate-violation-baselines.json +64 -16
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +67 -4
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +105 -0
- package/src/config/rule-obligations.json +833 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +378 -0
- package/src/install/installedRuleLinks.ts +308 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +33 -81
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +53 -4
- package/src/scripts/_lib/agent_settings.ts +26 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
- package/src/scripts/_lib/graph_feeder_record.ts +437 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +963 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +620 -0
- package/src/scripts/_lib/touched_file_quality.ts +570 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +8 -8
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +196 -21
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +477 -0
- package/src/scripts/check_kernel_edit_ratified.ts +132 -14
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +129 -13
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +21 -4
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +175 -15
- package/src/scripts/hooks/block_config_weakening.ts +115 -7
- package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +795 -60
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
- package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +78 -215
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +465 -29
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +647 -0
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +173 -6
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +55 -8
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +274 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +228 -0
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +543 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +101 -9
- package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -21
- package/src/server/schemas/settings.ts +42 -176
- package/src/shared/skillRanking.ts +169 -14
- package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -1,20 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `lean_projection.mode` — ONE definition of what the three modes mean
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
2
|
+
* `lean_projection.mode` — ONE definition of what the three modes mean, and
|
|
3
|
+
* since step 1.2 of `road-to-a-rule-carrier-that-works-outside-the-repo`, ONE
|
|
4
|
+
* reader that produces it.
|
|
5
|
+
*
|
|
6
|
+
* ── What this module used to be, and why that was not enough ──
|
|
7
|
+
*
|
|
8
|
+
* It owned the NORMALISATION and left each caller its own READER: the projector
|
|
9
|
+
* (`condense.ts`) resolved the value with a real YAML parse over the full
|
|
10
|
+
* settings cascade; the delivery concern (`hooks/rule_inject_hook.ts`) resolved
|
|
11
|
+
* it with an indentation-shaped read of `<cwd>/.agent-settings.yml` alone. The
|
|
12
|
+
* header argued that two readers were unavoidable and that two *normalisations*
|
|
13
|
+
* were the only thing worth preventing.
|
|
14
|
+
*
|
|
15
|
+
* Measured on 2026-10-02, that split was not a stylistic difference — it was a
|
|
16
|
+
* disagreement about WHICH FILE. The installer writes settings to
|
|
17
|
+
* `<root>/agents/settings/.agent-settings.yml` (`agent_settings.ts`'s canonical
|
|
18
|
+
* write target; `install.ts:4108`). The concern read `<root>/.agent-settings.yml`,
|
|
19
|
+
* the LEGACY location, and nothing else. On a normal install the concern
|
|
20
|
+
* therefore read a file that does not exist, got `''`, normalised it to
|
|
21
|
+
* `eager-all`, and closed its own gate — while the projector, reading the
|
|
22
|
+
* canonical file, had written thin stubs. That is the pointer arm the delivery
|
|
23
|
+
* mode exists to replace, reached by configuration rather than by choice, and
|
|
24
|
+
* it is a SECOND independent cause of the silence step 1.1 repaired: a consumer
|
|
25
|
+
* that fixed the package root alone would still have received nothing.
|
|
26
|
+
*
|
|
27
|
+
* The user-global layer was invisible to the concern for the same reason, which
|
|
28
|
+
* matters more than it sounds: ADR-020 installs are global-only, so for those
|
|
29
|
+
* consumers the ONLY layer carrying a mode is one the concern never opened.
|
|
30
|
+
*
|
|
31
|
+
* ── D3: one resolver, not a parity test between three ──
|
|
32
|
+
*
|
|
33
|
+
* The roadmap's D3 records the choice and the reason — a parity test keeps
|
|
34
|
+
* three readers that can drift again, and this module already existed to be the
|
|
35
|
+
* one. `resolveLeanProjection` below is that resolver. It reads the layers in
|
|
36
|
+
* the order `load_agent_settings` defines (template base, user-global,
|
|
37
|
+
* project), through `project_settings_path`, which prefers the canonical file
|
|
38
|
+
* and falls back to the legacy one, so a hand-edited root file still works.
|
|
39
|
+
*
|
|
40
|
+
* ── Why the template path is passed in rather than resolved ──
|
|
41
|
+
*
|
|
42
|
+
* `agent_settings.default_template_path()` derives the package root from
|
|
43
|
+
* `import.meta.url` three directories up. That is correct for a module at
|
|
44
|
+
* `<pkg>/src/scripts/_lib/`; inside the composed hook bundle `import.meta.url`
|
|
45
|
+
* is `<pkg>/dist/hooks/dispatch.js`, so the same arithmetic yields the PARENT
|
|
46
|
+
* of the package and the template read misses. Verified in the built bundle,
|
|
47
|
+
* not inferred. With no template the base layer is `{}` and an unconfigured
|
|
48
|
+
* consumer resolves to `eager-all` — the silence again, one layer lower. So a
|
|
49
|
+
* caller that knows the real package root (the carrier does: the dispatcher
|
|
50
|
+
* passes it) hands it over, and the resolver reads the template from there.
|
|
51
|
+
*
|
|
52
|
+
* ── What has NOT changed ──
|
|
53
|
+
*
|
|
54
|
+
* Anything unrecognised — absent key, typo, `null`, a non-string — is still
|
|
55
|
+
* `eager-all`: the parser fallback, which is NOT the value the template ships
|
|
56
|
+
* (see the type below), because a mode nobody can spell must never silently
|
|
57
|
+
* thin the standing corpus. That fallback now fires only when no layer carried
|
|
58
|
+
* a value at all, rather than whenever the concern looked in the wrong place.
|
|
17
59
|
*/
|
|
60
|
+
import * as path from 'node:path';
|
|
61
|
+
import { load_agent_settings } from './agent_settings.js';
|
|
18
62
|
export const DEFAULT_LEAN_PROJECTION_MODE = 'eager-all';
|
|
19
63
|
/** Map a raw settings value onto a mode. Unrecognised → `eager-all`. */
|
|
20
64
|
export function normalizeLeanProjectionMode(raw) {
|
|
@@ -146,4 +190,163 @@ export function describeDroppedHosts(res) {
|
|
|
146
190
|
export function thinsHost(mode, hosts, hostId) {
|
|
147
191
|
return writesThinFiles(mode) && hosts.includes(hostId);
|
|
148
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* THE resolver. Every surface that asks "which delivery mode" calls this.
|
|
195
|
+
*
|
|
196
|
+
* Tolerant like everything else on a hook path: `load_agent_settings` answers
|
|
197
|
+
* with defaults on an unreadable or malformed file and never throws, and the
|
|
198
|
+
* normalisers above turn anything unrecognised into the safe value. A caller
|
|
199
|
+
* on a hot path pays ONE cascade read per prompt; `modeExplicit` is a lazy
|
|
200
|
+
* getter, so the second, template-isolated read happens only for a caller that
|
|
201
|
+
* actually reads provenance — which today is the installer and nothing else.
|
|
202
|
+
*/
|
|
203
|
+
export function resolveLeanProjection(opts = {}) {
|
|
204
|
+
// The LEGACY root path, deliberately, and not `project_settings_path`'s
|
|
205
|
+
// either-or pick. `load_agent_settings` expands whatever it is given into
|
|
206
|
+
// `[the file, <its dir>/agents/settings/.agent-settings.yml, <its dir>/
|
|
207
|
+
// agents/settings/.agent-settings.local.yml]` and merges them deepest-wins,
|
|
208
|
+
// so handing it the root path reads BOTH the legacy and the canonical file
|
|
209
|
+
// — which is strictly more than picking one, and is what a tree carrying
|
|
210
|
+
// both should resolve to. It also keeps one export out of this module's
|
|
211
|
+
// import list, which is runtime bytes in the composed hook bundle.
|
|
212
|
+
const file = opts.settingsPath ?? path.join(opts.projectRoot ?? process.cwd(), '.agent-settings.yml');
|
|
213
|
+
const tpl = opts.packageRoot == null
|
|
214
|
+
? null
|
|
215
|
+
: path.join(opts.packageRoot, 'src', 'config', 'agent-settings.template.yml');
|
|
216
|
+
let lean;
|
|
217
|
+
try {
|
|
218
|
+
lean = load_agent_settings(tpl === null ? { project_path: file } : { project_path: file, template_path: tpl })['lean_projection'];
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
/* a settings layer nothing can read must never fail a turn */
|
|
222
|
+
}
|
|
223
|
+
const obj = typeof lean === 'object' && lean !== null && !Array.isArray(lean) ? lean : {};
|
|
224
|
+
const o = obj;
|
|
225
|
+
return {
|
|
226
|
+
mode: normalizeLeanProjectionMode(o['mode'] ?? ''),
|
|
227
|
+
hosts: resolveLeanProjectionHosts(o['hosts']),
|
|
228
|
+
// LAZY, and the hot path is the reason. Provenance needs a SECOND,
|
|
229
|
+
// template-isolated cascade, and only the installer reads it — the
|
|
230
|
+
// delivery concern on `user_prompt_submit` destructures `{ mode, hosts }`
|
|
231
|
+
// and discards this field, so computing it eagerly doubled the per-prompt
|
|
232
|
+
// settings read for an answer nobody asked for. A getter keeps the
|
|
233
|
+
// field's shape (`readonly modeExplicit: boolean`) and charges only the
|
|
234
|
+
// caller that touches it.
|
|
235
|
+
get modeExplicit() {
|
|
236
|
+
return rawExplicitLeanProjectionMode(opts) !== '';
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* A path no tree contains, so `template_defaults` contributes nothing.
|
|
242
|
+
*
|
|
243
|
+
* This is the mechanism `load_agent_settings` documents for the purpose —
|
|
244
|
+
* "a test or tool that pins every other input can pin the defaults base too,
|
|
245
|
+
* and point it at a nonexistent file to isolate the cascade" — used here for a
|
|
246
|
+
* tool rather than a test. It is a reserved device filename on every platform
|
|
247
|
+
* this package runs on and is never created, so the read fails and the loader's
|
|
248
|
+
* own tolerance turns it into `{}`.
|
|
249
|
+
*
|
|
250
|
+
* The alternative — re-reading the YAML layers by hand — was rejected because
|
|
251
|
+
* it would be a SECOND reader of the same key, which is the precise defect step
|
|
252
|
+
* 1.2 of the carrier roadmap existed to remove. Isolating the base keeps one
|
|
253
|
+
* reader and changes only which layers it is given.
|
|
254
|
+
*/
|
|
255
|
+
const NO_TEMPLATE_LAYER = path.join(path.sep, 'dev', 'null', 'agent-config-absent-template.yml');
|
|
256
|
+
/**
|
|
257
|
+
* The RAW `lean_projection.mode` string from the user-controlled layers only,
|
|
258
|
+
* or `''` when no such layer carries it.
|
|
259
|
+
*
|
|
260
|
+
* Raw and un-normalised on purpose: {@link normalizeLeanProjectionMode} maps
|
|
261
|
+
* everything unrecognised — `''` included — onto `eager-all`, so a normalised
|
|
262
|
+
* answer cannot tell "the user chose eager-all" from "the user chose nothing".
|
|
263
|
+
* Provenance needs exactly that distinction, so it has to be read before the
|
|
264
|
+
* normaliser runs.
|
|
265
|
+
*/
|
|
266
|
+
export function rawExplicitLeanProjectionMode(opts = {}) {
|
|
267
|
+
const file = opts.settingsPath ?? path.join(opts.projectRoot ?? process.cwd(), '.agent-settings.yml');
|
|
268
|
+
let lean;
|
|
269
|
+
try {
|
|
270
|
+
lean = load_agent_settings({ project_path: file, template_path: NO_TEMPLATE_LAYER })['lean_projection'];
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return ''; // a layer nothing can read states no preference
|
|
274
|
+
}
|
|
275
|
+
if (typeof lean !== 'object' || lean === null || Array.isArray(lean))
|
|
276
|
+
return '';
|
|
277
|
+
const m = lean['mode'];
|
|
278
|
+
return typeof m === 'string' ? m.trim() : '';
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Did a human ask for this mode, and is it the one the caller is gated on?
|
|
282
|
+
*
|
|
283
|
+
* The question an installer actually has. `modeExplicit` alone is not enough —
|
|
284
|
+
* a consumer who explicitly set `eager-all` has set the key explicitly and must
|
|
285
|
+
* NOT be thinned — so the two conditions are folded here rather than left to
|
|
286
|
+
* every caller to remember to combine.
|
|
287
|
+
*/
|
|
288
|
+
export function leanProjectionModeChosen(mode, opts = {}) {
|
|
289
|
+
const raw = rawExplicitLeanProjectionMode(opts);
|
|
290
|
+
return raw !== '' && normalizeLeanProjectionMode(raw) === mode;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* May the INSTALLER thin this host's rule tree?
|
|
294
|
+
*
|
|
295
|
+
* The host-aware sibling of {@link leanProjectionModeChosen}, and the predicate
|
|
296
|
+
* `road-to-an-installed-layer-that-is-thinned` step 1.1 keys on. It folds the
|
|
297
|
+
* three conditions that must hold together, once, so no caller has to remember
|
|
298
|
+
* to combine them:
|
|
299
|
+
*
|
|
300
|
+
* 1. **A human asked.** `modeExplicit` — false whenever the only layer carrying
|
|
301
|
+
* the key is the shipped template, which already says `delivery`. Reading the
|
|
302
|
+
* template as consent would thin every consumer's `~/.claude/rules` as a side
|
|
303
|
+
* effect of wiring a reader, which is the owner-reserved default flip (that
|
|
304
|
+
* roadmap's blocker, decision D4).
|
|
305
|
+
* 2. **The chosen mode actually writes stubs.** A consumer who explicitly chose
|
|
306
|
+
* `eager-all` has set the key and must NOT be thinned on the strength of
|
|
307
|
+
* having an opinion.
|
|
308
|
+
* 3. **This host is in scope.** The same `hosts:` list the projector honours, so
|
|
309
|
+
* installer and projector cannot disagree about which trees are thinned.
|
|
310
|
+
*
|
|
311
|
+
* ONE `resolveLeanProjection` call, which is why this is not two
|
|
312
|
+
* {@link leanProjectionModeChosen} calls: that one answers "is the chosen mode
|
|
313
|
+
* exactly X" and knows nothing about `hosts`, so a caller combining it with a
|
|
314
|
+
* host check by hand would re-create the fold this function exists to own.
|
|
315
|
+
*
|
|
316
|
+
* That is one CALL and two cascade READS here, because reading `modeExplicit`
|
|
317
|
+
* triggers its lazy getter and a second, template-isolated load. The installer
|
|
318
|
+
* runs once per deploy and does not care; the cost is named rather than rounded
|
|
319
|
+
* down because the same resolver serves the per-prompt delivery concern, which
|
|
320
|
+
* does NOT read provenance and therefore does not pay it.
|
|
321
|
+
*/
|
|
322
|
+
export function installerThinsHost(hostId, opts = {}) {
|
|
323
|
+
const { mode, hosts, modeExplicit } = resolveLeanProjection({
|
|
324
|
+
...opts,
|
|
325
|
+
settingsPath: opts.settingsPath ?? NO_PROJECT_LAYER,
|
|
326
|
+
});
|
|
327
|
+
return modeExplicit && thinsHost(mode, hosts.hosts, hostId);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* A path no tree contains, so the PROJECT cascade contributes nothing.
|
|
331
|
+
*
|
|
332
|
+
* The same device {@link NO_TEMPLATE_LAYER} uses, pointed at the other end of
|
|
333
|
+
* the cascade, and the reason is scope rather than isolation: the thing
|
|
334
|
+
* {@link installerThinsHost} gates is a mutation of `~/.claude/rules`, which
|
|
335
|
+
* belongs to the MACHINE. A per-checkout value must not decide it, in either
|
|
336
|
+
* direction — a project saying `delivery` would thin the layer every other
|
|
337
|
+
* project on that machine reads, and a project saying `eager-all` would
|
|
338
|
+
* suppress an opt-in the user wrote user-globally, because the project cascade
|
|
339
|
+
* merges last and wins.
|
|
340
|
+
*
|
|
341
|
+
* `load_agent_settings` reads `user_global_settings_paths()` regardless of what
|
|
342
|
+
* `project_path` it is given, so pointing the project layer at nothing leaves
|
|
343
|
+
* exactly the machine-global layers — which is the scope the installer's
|
|
344
|
+
* sibling `_resolve_global_rule_scope` already resolves for the same deploy.
|
|
345
|
+
* A caller may still pass an explicit `settingsPath` (tests pin one). A
|
|
346
|
+
* `projectRoot` handed to {@link installerThinsHost} is DISCARDED — the `??`
|
|
347
|
+
* chain terminates at `settingsPath` before `projectRoot` is consulted — which
|
|
348
|
+
* is the intended behaviour and is stated here because a caller passing it and
|
|
349
|
+
* expecting it honoured would otherwise get no signal.
|
|
350
|
+
*/
|
|
351
|
+
const NO_PROJECT_LAYER = path.join(path.sep, 'dev', 'null', 'agent-config-absent-project-settings.yml');
|
|
149
352
|
//# sourceMappingURL=lean_projection_mode.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout-independent package-root resolution for the `_cli` delegate commands.
|
|
3
|
+
*
|
|
4
|
+
* `src/scripts/_cli/*.ts` sits three levels below the package root, so every
|
|
5
|
+
* delegate command derived the root with three hard-coded parent hops. Then the
|
|
6
|
+
* delegate precompile (`fa51c5a54`) started bundling those same modules into
|
|
7
|
+
* `dist/cli-delegate/*.js` — **two** levels below the root. Fixed hop counts are
|
|
8
|
+
* correct in exactly one of the two layouts, and nothing failed loudly: three
|
|
9
|
+
* hops from the bundle lands on `<pkg>/..`, which for a scoped install is
|
|
10
|
+
* `node_modules/@event4u`. `conformance` then reported `dist/router.json` and
|
|
11
|
+
* `src/scripts/hook_manifest.yaml` as missing — files that ship fine — and the
|
|
12
|
+
* 9.11.0 release PR's `tarball E2E` went red on both Node majors.
|
|
13
|
+
*
|
|
14
|
+
* The fix is to stop counting hops. Anchor on the marker that actually defines
|
|
15
|
+
* the root: the `package.json` whose `name` is this package. That answer holds
|
|
16
|
+
* for the source tree, for any bundle depth, for npm-global, npx, and
|
|
17
|
+
* vendor/bin symlink invocations — and it keeps holding if either directory
|
|
18
|
+
* ever moves.
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { fileURLToPath } from 'node:url';
|
|
23
|
+
/** `name` in this package's own package.json — the root marker. */
|
|
24
|
+
export const PACKAGE_NAME = '@event4u/agent-config';
|
|
25
|
+
/**
|
|
26
|
+
* Bound on the upward walk. Deep enough for any real install path, finite so a
|
|
27
|
+
* malformed start value can never spin.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_ASCENT = 16;
|
|
30
|
+
/**
|
|
31
|
+
* Absolute package root for the module at `fromUrlOrPath` (pass
|
|
32
|
+
* `import.meta.url`).
|
|
33
|
+
*
|
|
34
|
+
* Walks up looking for the package.json whose `name` is {@link PACKAGE_NAME}.
|
|
35
|
+
* A consumer's own package.json encountered on the way is skipped by that name
|
|
36
|
+
* check, so an install nested under another project resolves correctly.
|
|
37
|
+
*
|
|
38
|
+
* `legacyHops` is the pre-existing hop count for the *source* layout and is
|
|
39
|
+
* used only if no marker is found. Falling back beats throwing during CLI
|
|
40
|
+
* startup: a wrong path yields one actionable "missing file" message, while an
|
|
41
|
+
* exception takes down every command in the delegate.
|
|
42
|
+
*/
|
|
43
|
+
export function resolvePackageRoot(fromUrlOrPath, legacyHops = 3) {
|
|
44
|
+
const start = fromUrlOrPath.startsWith('file:') ? fileURLToPath(fromUrlOrPath) : fromUrlOrPath;
|
|
45
|
+
const startDir = path.dirname(start);
|
|
46
|
+
let dir = startDir;
|
|
47
|
+
for (let i = 0; i < MAX_ASCENT; i++) {
|
|
48
|
+
const manifest = path.join(dir, 'package.json');
|
|
49
|
+
if (fs.existsSync(manifest)) {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(fs.readFileSync(manifest, 'utf8'));
|
|
52
|
+
if (parsed.name === PACKAGE_NAME) {
|
|
53
|
+
return dir;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Unreadable / unparseable manifest — not our marker; keep ascending.
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const parent = path.dirname(dir);
|
|
61
|
+
if (parent === dir) {
|
|
62
|
+
break; // filesystem root
|
|
63
|
+
}
|
|
64
|
+
dir = parent;
|
|
65
|
+
}
|
|
66
|
+
return path.resolve(startDir, ...Array.from({ length: legacyHops }, () => '..'));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=package_root.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The high-consequence rule class — one reader for the config, the projector
|
|
3
|
+
* and the test.
|
|
4
|
+
*
|
|
5
|
+
* The criterion itself is prose and lives where an author meets it: the
|
|
6
|
+
* `consequence_class` property of `src/scripts/schemas/rule.schema.json`. This
|
|
7
|
+
* module does not restate it. It reads the list the criterion produced
|
|
8
|
+
* (`src/config/rule-consequence-class.json`), joins it to what each rule file
|
|
9
|
+
* actually declares, and answers the one question `project_thin_rules` asks:
|
|
10
|
+
* may this rule's stub carry its own law, and if not, has that been declared?
|
|
11
|
+
*
|
|
12
|
+
* WHY A DECLARED `no_stub` SUBSET RATHER THAN A SHORTER CLASS. A member whose
|
|
13
|
+
* law section is missing or over the ceiling cannot ship as stub-plus-law —
|
|
14
|
+
* there is nothing short enough to copy. Two ways to handle that: drop it from
|
|
15
|
+
* the class, or keep it in the class and record why it cannot stand. Dropping
|
|
16
|
+
* it makes the class shrinkable by NOT writing a law, which is the incentive a
|
|
17
|
+
* criterion must not create. Keeping it leaves the obligation visible and costs
|
|
18
|
+
* only a full-bodied projection, which is what those rules get today anyway.
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
export const CLASS_CONFIG_REL = 'src/config/rule-consequence-class.json';
|
|
23
|
+
export const CLAUSES = ['irreversible-external', 'security-boundary', 'authority-bypass'];
|
|
24
|
+
export function readConsequenceClass(repoRoot) {
|
|
25
|
+
const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, CLASS_CONFIG_REL), 'utf-8'));
|
|
26
|
+
return {
|
|
27
|
+
criterion_ref: raw.criterion_ref ?? '',
|
|
28
|
+
members: raw.members ?? {},
|
|
29
|
+
no_stub: raw.no_stub ?? {},
|
|
30
|
+
excluded: raw.excluded ?? {},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Ids whose stub carries their law — members minus the declared `no_stub` set. */
|
|
34
|
+
export function stubLawIds(cfg) {
|
|
35
|
+
return new Set(Object.keys(cfg.members).filter((id) => cfg.no_stub[id] === undefined));
|
|
36
|
+
}
|
|
37
|
+
/** The `consequence_class:` value a rule file declares, or `null`. */
|
|
38
|
+
export function declaredClause(ruleText) {
|
|
39
|
+
const m = /^consequence_class:\s*"?([a-z-]+)"?\s*$/m.exec(ruleText);
|
|
40
|
+
if (m === null)
|
|
41
|
+
return null;
|
|
42
|
+
const v = m[1];
|
|
43
|
+
return CLAUSES.includes(v) ? v : null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=rule_consequence_class.js.map
|
|
@@ -55,8 +55,51 @@ import * as path from 'node:path';
|
|
|
55
55
|
import { match_prompt } from './router_match.js';
|
|
56
56
|
/** Kinds of trigger a prompt alone can never fire. */
|
|
57
57
|
export const PATH_TRIGGER_KINDS = ['path_prefix', 'file_pattern'];
|
|
58
|
+
/**
|
|
59
|
+
* Set by `dispatch_hook` to its own resolved package root. Read here rather
|
|
60
|
+
* than threaded through every caller — see `ruleSourceDirs`.
|
|
61
|
+
*/
|
|
62
|
+
export const PACKAGE_ROOT_ENV = 'AGENT_CONFIG_PACKAGE_ROOT';
|
|
63
|
+
function statKind(p) {
|
|
64
|
+
try {
|
|
65
|
+
const s = fs.statSync(p);
|
|
66
|
+
return s.isDirectory() ? 'dir' : s.isFile() ? 'file' : null;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Resolve the body dirs, the router and the gap wording in ONE filesystem pass. */
|
|
73
|
+
export function ruleSources(repoRoot) {
|
|
74
|
+
const env = (process.env[PACKAGE_ROOT_ENV] ?? '').trim();
|
|
75
|
+
const pkg = env ? path.resolve(env) : null;
|
|
76
|
+
const dirs = [];
|
|
77
|
+
const add = (d) => {
|
|
78
|
+
if (statKind(d) === 'dir' && !dirs.includes(d))
|
|
79
|
+
dirs.push(d);
|
|
80
|
+
};
|
|
81
|
+
add(path.join(repoRoot, 'agents', 'overrides'));
|
|
82
|
+
add(path.join(repoRoot, 'dist', 'agent-src', 'rules'));
|
|
83
|
+
if (pkg !== null)
|
|
84
|
+
add(path.join(pkg, 'dist', 'agent-src', 'rules'));
|
|
85
|
+
const local = path.join(repoRoot, 'dist', 'router.json');
|
|
86
|
+
let router = statKind(local) === 'file' ? local : null;
|
|
87
|
+
if (router === null && pkg !== null) {
|
|
88
|
+
const shipped = path.join(pkg, 'dist', 'router.json');
|
|
89
|
+
if (statKind(shipped) === 'file')
|
|
90
|
+
router = shipped;
|
|
91
|
+
}
|
|
92
|
+
let gap = null;
|
|
93
|
+
if (router === null || dirs.length === 0) {
|
|
94
|
+
const miss = pkg === null
|
|
95
|
+
? `${PACKAGE_ROOT_ENV} unset`
|
|
96
|
+
: `no ${router === null ? 'dist/router.json' : 'dist/agent-src/rules'} under ${repoRoot} or ${pkg}`;
|
|
97
|
+
gap = `rule-inject: no rule source — ${miss}`;
|
|
98
|
+
}
|
|
99
|
+
return { dirs, pkg, router, gap };
|
|
100
|
+
}
|
|
58
101
|
export function loadRouter(repoRoot) {
|
|
59
|
-
const p = path.join(repoRoot, 'dist', 'router.json');
|
|
102
|
+
const p = ruleSources(repoRoot).router ?? path.join(repoRoot, 'dist', 'router.json');
|
|
60
103
|
return JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
61
104
|
}
|
|
62
105
|
/** Kernel rule ids, as declared by the router. */
|
|
@@ -137,16 +180,30 @@ export function matchTierRules(router, prompt, openFiles, command) {
|
|
|
137
180
|
}
|
|
138
181
|
return out;
|
|
139
182
|
}
|
|
140
|
-
/**
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
183
|
+
/**
|
|
184
|
+
* The projected body from the highest-precedence tree carrying it, or `null`.
|
|
185
|
+
*
|
|
186
|
+
* `ruleBodyPath` used to sit in front of this and is gone: it returned the
|
|
187
|
+
* single-root path unconditionally, this diff changed its contract to "the
|
|
188
|
+
* first tree that has the file", and nothing outside this module ever called
|
|
189
|
+
* it. An exported helper whose last caller disappeared in the same diff is an
|
|
190
|
+
* own-orphan, and the composed hook bundle charges for it on every dispatch
|
|
191
|
+
* (`src/config/hook-bundle-budget.json`), so it is removed rather than left as
|
|
192
|
+
* a wrapper nobody uses.
|
|
193
|
+
*/
|
|
145
194
|
export function loadRuleBody(repoRoot, id) {
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
195
|
+
for (const dir of ruleSources(repoRoot).dirs) {
|
|
196
|
+
const p = path.join(dir, `${id}.md`);
|
|
197
|
+
if (statKind(p) === 'file') {
|
|
198
|
+
try {
|
|
199
|
+
return fs.readFileSync(p, 'utf8');
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
150
207
|
}
|
|
151
208
|
/**
|
|
152
209
|
* UTF-8 byte length — the runtime measure, dependency-free by design.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One spelling of "a rule's law section" — the unit three gates and one
|
|
3
|
+
* projector all price.
|
|
4
|
+
*
|
|
5
|
+
* A **law section** is a heading whose title matches `\biron\s+laws?\b` plus
|
|
6
|
+
* everything under it up to the next heading of the same or a shallower depth.
|
|
7
|
+
* A rule may carry several (`direct-answers` has three, `no-cheap-questions`
|
|
8
|
+
* six); the rule's law is all of them, joined by a blank line, because each one
|
|
9
|
+
* states an obligation and a stub carrying only the first would ship a rule
|
|
10
|
+
* whose other laws silently vanished.
|
|
11
|
+
*
|
|
12
|
+
* WHY A SHARED MODULE RATHER THAN A REGEX PER CALLER. The projector
|
|
13
|
+
* (`project_thin_rules.ts`) byte-copies this text into a stub and digests it;
|
|
14
|
+
* the lint (`lint_rule_law_section.ts`) holds it under a ceiling. If those two
|
|
15
|
+
* disagreed about where a section ends, the lint would certify a length the
|
|
16
|
+
* projection does not carry — the exact drift `THIN_ENTRY_MARKER`'s own comment
|
|
17
|
+
* argues against one file over.
|
|
18
|
+
*
|
|
19
|
+
* The heading regex is deliberately the SAME one `check_iron_law_prominence.ts`
|
|
20
|
+
* uses, so "has a law section" here and "is an Iron Law heading" there cannot
|
|
21
|
+
* diverge. That gate owns prominence (H2, near the top); this module owns
|
|
22
|
+
* extent and size.
|
|
23
|
+
*
|
|
24
|
+
* WHAT THIS DOES NOT CLAIM. Not that the extracted text IS the rule's obligation. A rule can state its
|
|
25
|
+
* law in bold prose or a bare fence under no heading at all — several of the 35
|
|
26
|
+
* routed rules without a heading match do exactly that. A heading match is a
|
|
27
|
+
* STRUCTURAL property, checkable; "this sentence is the obligation" is not, and
|
|
28
|
+
* `report_obligation_carriers` plus the ids in `src/config/rule-obligations.json` is where
|
|
29
|
+
* that question already lives.
|
|
30
|
+
*/
|
|
31
|
+
import * as fs from 'node:fs';
|
|
32
|
+
/** Same literal as `check_iron_law_prominence.ts` — one definition, two readers. */
|
|
33
|
+
export const IRON_LAW_RE = /\biron\s+laws?\b/i;
|
|
34
|
+
const HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
|
|
35
|
+
const FENCE_RE = /^\s*```/;
|
|
36
|
+
/** Return `[frontmatter_including_fences, body]`. Empty frontmatter if none. */
|
|
37
|
+
export function splitFrontmatter(text) {
|
|
38
|
+
if (text.startsWith('---\n')) {
|
|
39
|
+
const end = text.indexOf('\n---\n', 4);
|
|
40
|
+
if (end !== -1) {
|
|
41
|
+
return [text.slice(0, end + 5), text.slice(end + 5)];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return ['', text];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The body a runtime delivery carries: frontmatter removed, HTML comments
|
|
48
|
+
* removed, trimmed.
|
|
49
|
+
*
|
|
50
|
+
* Comments are stripped because they are authoring scaffolding
|
|
51
|
+
* (`<!-- risk-review: … -->`, `<!-- harvest:… -->`, `ref-ignore` markers) that
|
|
52
|
+
* no host renders to a model, so charging a rule for them would price the wrong
|
|
53
|
+
* thing. Frontmatter is excluded for the reason `check_rule_stub_ceiling` gives
|
|
54
|
+
* for the same exclusion: it is the routing surface, and a rule that gains a
|
|
55
|
+
* trigger must not trip a ceiling whose message tells the author to move prose.
|
|
56
|
+
*/
|
|
57
|
+
export function ruleBody(text) {
|
|
58
|
+
const [, body] = splitFrontmatter(text);
|
|
59
|
+
return body.replace(/<!--[\s\S]*?-->/g, '').trim();
|
|
60
|
+
}
|
|
61
|
+
/** Every law section in a rule body, in document order. */
|
|
62
|
+
export function lawSections(body) {
|
|
63
|
+
const lines = body.split('\n');
|
|
64
|
+
let inFence = false;
|
|
65
|
+
const headings = [];
|
|
66
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
67
|
+
const raw = lines[i];
|
|
68
|
+
if (FENCE_RE.test(raw)) {
|
|
69
|
+
inFence = !inFence;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (inFence)
|
|
73
|
+
continue;
|
|
74
|
+
const m = HEADING_RE.exec(raw);
|
|
75
|
+
if (m)
|
|
76
|
+
headings.push({ i, depth: m[1].length, title: m[2].trim() });
|
|
77
|
+
}
|
|
78
|
+
const out = [];
|
|
79
|
+
for (let k = 0; k < headings.length; k += 1) {
|
|
80
|
+
const h = headings[k];
|
|
81
|
+
if (!IRON_LAW_RE.test(h.title))
|
|
82
|
+
continue;
|
|
83
|
+
let end = lines.length;
|
|
84
|
+
for (let j = k + 1; j < headings.length; j += 1) {
|
|
85
|
+
const n = headings[j];
|
|
86
|
+
if (n.depth <= h.depth) {
|
|
87
|
+
end = n.i;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
out.push({
|
|
92
|
+
title: h.title,
|
|
93
|
+
depth: h.depth,
|
|
94
|
+
line: h.i + 1,
|
|
95
|
+
text: lines.slice(h.i, end).join('\n').trim(),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The rule's law, as one byte string — all sections joined by a blank line.
|
|
102
|
+
* `null` when the rule has none, which is a different answer from `''`.
|
|
103
|
+
*/
|
|
104
|
+
export function lawText(body) {
|
|
105
|
+
const sections = lawSections(body);
|
|
106
|
+
if (sections.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
return sections.map((s) => s.text).join('\n\n');
|
|
109
|
+
}
|
|
110
|
+
/** Measure one rule file. */
|
|
111
|
+
export function measureRuleFile(id, filePath) {
|
|
112
|
+
const body = ruleBody(fs.readFileSync(filePath, 'utf-8'));
|
|
113
|
+
const law = lawText(body);
|
|
114
|
+
return {
|
|
115
|
+
id,
|
|
116
|
+
lawChars: law === null ? 0 : law.length,
|
|
117
|
+
sections: lawSections(body).length,
|
|
118
|
+
bodyChars: body.length,
|
|
119
|
+
law,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=rule_law_section.js.map
|