@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
|
@@ -50,6 +50,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
50
50
|
import * as path from 'node:path';
|
|
51
51
|
|
|
52
52
|
import { parse as _rtParse } from '../sync_yaml_rt.js';
|
|
53
|
+
import { GIT_CONVENTION_KEYS, fileSource, readGitConventionKey } from '../_lib/git_convention.js';
|
|
53
54
|
|
|
54
55
|
const DEFAULT_PATH = '.agent-settings.yml';
|
|
55
56
|
|
|
@@ -203,7 +204,8 @@ const _PRESCAN_RULES: readonly PrescanRule[] = [
|
|
|
203
204
|
];
|
|
204
205
|
|
|
205
206
|
interface Finding {
|
|
206
|
-
line
|
|
207
|
+
/** null when no single line can be named, printed as `line:-`. */
|
|
208
|
+
line: number | null;
|
|
207
209
|
kind: string;
|
|
208
210
|
verdict: string;
|
|
209
211
|
hint: string;
|
|
@@ -254,9 +256,53 @@ function _scan_text(text: string): Finding[] {
|
|
|
254
256
|
return findings;
|
|
255
257
|
}
|
|
256
258
|
|
|
259
|
+
/**
|
|
260
|
+
* The schema enum and the branch-pattern alphabet, through the same reader
|
|
261
|
+
* `git:convention show` and `sync_pr_branch` use, so a value those refuse
|
|
262
|
+
* fails here first.
|
|
263
|
+
*/
|
|
264
|
+
function _git_convention_findings(target: string, text: string): Finding[] {
|
|
265
|
+
const findings: Finding[] = [];
|
|
266
|
+
const lines = _splitlines(text);
|
|
267
|
+
for (const key of GIT_CONVENTION_KEYS) {
|
|
268
|
+
const reading = readGitConventionKey(key, fileSource({ developer: [target] }), {});
|
|
269
|
+
if (reading.state !== 'invalid' && reading.state !== 'malformed') continue;
|
|
270
|
+
// `malformed` is a fact about the whole file, so it is one finding, not one per key.
|
|
271
|
+
if (reading.state === 'malformed') {
|
|
272
|
+
if (!findings.some((f) => f.verdict === 'malformed')) {
|
|
273
|
+
findings.push({ line: null, kind: 'git.*', verdict: 'malformed', hint: reading.detail ?? reading.state });
|
|
274
|
+
}
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
findings.push({
|
|
278
|
+
line: _gitKeyLine(lines, key),
|
|
279
|
+
kind: `git.${key}`,
|
|
280
|
+
verdict: reading.state,
|
|
281
|
+
hint: reading.detail ?? reading.state,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
return findings;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The 1-based line of `key` inside a block-style `git:` section, or null: a
|
|
289
|
+
* same-named key elsewhere is not it, and an inline `git:` value has no line
|
|
290
|
+
* of its own to name.
|
|
291
|
+
*/
|
|
292
|
+
function _gitKeyLine(lines: readonly string[], key: string): number | null {
|
|
293
|
+
const start = lines.findIndex((l) => /^git\s*:\s*(#.*)?$/.test(l));
|
|
294
|
+
if (start === -1) return null;
|
|
295
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
296
|
+
const l = lines[i] as string;
|
|
297
|
+
if (/^\S/.test(l) && !l.startsWith('#')) return null;
|
|
298
|
+
if (new RegExp(`^\\s+${key}\\s*:`).test(l)) return i + 1;
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
|
|
257
303
|
function _format(finding: Finding): string {
|
|
258
304
|
return (
|
|
259
|
-
` ❌ line:${_ljust(String(finding.line), 4)} ` +
|
|
305
|
+
` ❌ line:${_ljust(finding.line === null ? '-' : String(finding.line), 4)} ` +
|
|
260
306
|
`${_ljust(finding.kind, 22)} ${_ljust(finding.verdict, 14)} ${finding.hint}`
|
|
261
307
|
);
|
|
262
308
|
}
|
|
@@ -370,7 +416,13 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
|
|
|
370
416
|
}
|
|
371
417
|
}
|
|
372
418
|
|
|
373
|
-
|
|
419
|
+
// A parser finding already reports a file that does not parse; a `malformed`
|
|
420
|
+
// git reading would only repeat it. A pre-scan finding is not a parse
|
|
421
|
+
// failure, so it hides nothing.
|
|
422
|
+
const unparsed = findings.some((f) => f.kind === 'parser');
|
|
423
|
+
const git = _git_convention_findings(target, text).filter((f) => !(unparsed && f.verdict === 'malformed'));
|
|
424
|
+
|
|
425
|
+
if (findings.length === 0 && git.length === 0) {
|
|
374
426
|
if (!opts.quiet) {
|
|
375
427
|
_print(
|
|
376
428
|
out,
|
|
@@ -380,12 +432,18 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
|
|
|
380
432
|
}
|
|
381
433
|
return 0;
|
|
382
434
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
_print(err, _format(finding));
|
|
435
|
+
if (findings.length > 0) {
|
|
436
|
+
_print(err, `❌ ${target}: ${findings.length} finding(s) outside the supported subset.`);
|
|
437
|
+
for (const finding of findings) _print(err, _format(finding));
|
|
438
|
+
_print(err, '');
|
|
439
|
+
_print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
|
|
440
|
+
}
|
|
441
|
+
if (git.length > 0) {
|
|
442
|
+
_print(err, `❌ ${target}: ${git.length} git.* value(s) the convention refuses.`);
|
|
443
|
+
for (const finding of git) _print(err, _format(finding));
|
|
444
|
+
_print(err, '');
|
|
445
|
+
_print(err, ' Contract: docs/decisions/ADR-283-git-convention-carrier.md (the git section of agent-settings.schema.json)');
|
|
386
446
|
}
|
|
387
|
-
_print(err, '');
|
|
388
|
-
_print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
|
|
389
447
|
return 1;
|
|
390
448
|
}
|
|
391
449
|
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
iter_setting_overrides,
|
|
49
49
|
load_agent_settings,
|
|
50
50
|
MERGEABLE_KEYS,
|
|
51
|
+
settings_layer_states,
|
|
51
52
|
user_global_settings_paths,
|
|
52
53
|
USER_GLOBAL_FILENAME,
|
|
53
54
|
} from '../_lib/agent_settings.js';
|
|
@@ -179,7 +180,7 @@ export function missionResolutionFor(
|
|
|
179
180
|
* file the user actually edited — telling somebody their value was dropped
|
|
180
181
|
* without telling them which file it was dropped from is half an answer.
|
|
181
182
|
*/
|
|
182
|
-
export function userGlobalDrop(key: string): { dropped: boolean; file: string } {
|
|
183
|
+
export function userGlobalDrop(key: string, templateDefault?: unknown): { dropped: boolean; file: string } {
|
|
183
184
|
// Probe EVERY user-global layer the loader reads, not just the flat file.
|
|
184
185
|
// `user_global_settings_paths()` returns the flat `agent-settings.yml` AND
|
|
185
186
|
// the canonical `settings/.agent-settings.yml` the setup wizard writes, and
|
|
@@ -200,7 +201,13 @@ export function userGlobalDrop(key: string): { dropped: boolean; file: string }
|
|
|
200
201
|
} catch {
|
|
201
202
|
continue;
|
|
202
203
|
}
|
|
203
|
-
|
|
204
|
+
const value = getSettingsLeaf(raw, key);
|
|
205
|
+
if (value === undefined) continue;
|
|
206
|
+
// `upgrade` inserts template defaults into the user-global file, so a
|
|
207
|
+
// dropped default is not something the user set and loses nothing. A
|
|
208
|
+
// lower layer can still hold a value the user did set.
|
|
209
|
+
if (templateDefault !== undefined && JSON.stringify(value) === JSON.stringify(templateDefault)) continue;
|
|
210
|
+
return { dropped: true, file: candidate };
|
|
204
211
|
}
|
|
205
212
|
return { dropped: false, file };
|
|
206
213
|
}
|
|
@@ -234,8 +241,16 @@ export function runSettingsGet(opts: SettingsGetOptions): SettingsGetResult {
|
|
|
234
241
|
const cls = _classFor(opts.packageRoot, opts.key);
|
|
235
242
|
const fallback = templateDefault(opts.packageRoot, opts.key);
|
|
236
243
|
const carveOut = carveOutFor(opts.key);
|
|
237
|
-
const drop = userGlobalDrop(opts.key);
|
|
244
|
+
const drop = userGlobalDrop(opts.key, fallback);
|
|
238
245
|
const mission = missionResolutionFor(opts.key, merged);
|
|
246
|
+
// The loader reads a layer that does not parse as absent, so "not set" can
|
|
247
|
+
// be false; the exit code stays 0 because the read itself still answered.
|
|
248
|
+
const malformed = settings_layer_states({ cwd: opts.cwd }).filter((l) => l.state === 'malformed');
|
|
249
|
+
if (malformed.length > 0) {
|
|
250
|
+
err.push(
|
|
251
|
+
`⚠️ settings:get: ${malformed.map((l) => l.path).join(', ')} does not parse; every value it sets is read as absent.`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
239
254
|
|
|
240
255
|
if (opts.json) {
|
|
241
256
|
out.push(
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
resolveExecutionPosture,
|
|
20
20
|
} from '../../shared/missionExecution.js';
|
|
21
21
|
import {
|
|
22
|
+
UNREAD_FORGE,
|
|
22
23
|
forgeProtectionRows,
|
|
23
24
|
protectionActions,
|
|
24
25
|
type ForgeReading,
|
|
@@ -81,7 +82,11 @@ export function executionJson(overrides: () => OverrideStream): Dict {
|
|
|
81
82
|
* `actions` carries the human ACTION lines — the step's own words are that a
|
|
82
83
|
* missing row is a blocker entry and NOT a halt, so this reports and returns.
|
|
83
84
|
*/
|
|
84
|
-
export function forgeProtectionJson(
|
|
85
|
+
export function forgeProtectionJson(
|
|
86
|
+
reading: ForgeReading,
|
|
87
|
+
repo: string | null = null,
|
|
88
|
+
not_checked: NotCheckedReason = null,
|
|
89
|
+
): Dict {
|
|
85
90
|
const rows = forgeProtectionRows(reading);
|
|
86
91
|
const readFromForge = rows.some((r) => r.state !== 'unread');
|
|
87
92
|
// **The slug is reported only when something was actually read, and that
|
|
@@ -107,6 +112,11 @@ export function forgeProtectionJson(reading: ForgeReading, repo: string | null =
|
|
|
107
112
|
})),
|
|
108
113
|
actions: protectionActions(rows).map(name),
|
|
109
114
|
read_from_forge: readFromForge,
|
|
115
|
+
// Present on every run, `null` when the read happened. A key that
|
|
116
|
+
// appeared only on the skipped path would make its absence carry the
|
|
117
|
+
// meaning, and absence is exactly what a schema-validating consumer
|
|
118
|
+
// reads as "this build does not report it".
|
|
119
|
+
not_checked,
|
|
110
120
|
};
|
|
111
121
|
}
|
|
112
122
|
|
|
@@ -147,6 +157,64 @@ export interface ForgeDeps {
|
|
|
147
157
|
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
148
158
|
/** The subprocess runner for both `git` and `gh`. */
|
|
149
159
|
readonly run?: Runner;
|
|
160
|
+
/**
|
|
161
|
+
* Skip the read before anything spawns. The block keeps its shape: five
|
|
162
|
+
* `unread` rows, exactly what a failed read produces.
|
|
163
|
+
*/
|
|
164
|
+
readonly offline?: boolean;
|
|
165
|
+
/**
|
|
166
|
+
* WHY the read was skipped, or `null` when it happened.
|
|
167
|
+
*
|
|
168
|
+
* Five `unread` rows and no failures is what "everything is fine" looks
|
|
169
|
+
* like to a consumer summing row states, so `read_from_forge: false` alone
|
|
170
|
+
* did not carry the distinction. This names it, which is the condition the
|
|
171
|
+
* council attached to making offline the default.
|
|
172
|
+
*/
|
|
173
|
+
readonly not_checked?: NotCheckedReason;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Why a `doctor` run did not read the forge. `null` means it did.
|
|
178
|
+
*
|
|
179
|
+
* Three reasons rather than a boolean, because the repairs differ: pass
|
|
180
|
+
* `--online`, drop `--no-forge`, or run without `--check`.
|
|
181
|
+
*/
|
|
182
|
+
export type NotCheckedReason = 'online_not_requested' | 'offline_flag' | 'single_check' | null;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Whether a `doctor` run reads the forge — and why not, when it does not.
|
|
186
|
+
*
|
|
187
|
+
* **OFFLINE IS THE DEFAULT since 2026-10-09.** Blocker
|
|
188
|
+
* `doctor-network-default` of `road-to-findings-that-get-a-disposition`,
|
|
189
|
+
* option (a): AI council 2026-10-07 (anthropic + openai, 2/2), adopted
|
|
190
|
+
* 2026-10-08 under the owner's delegation of council-decidable questions. The
|
|
191
|
+
* recorded reasoning is that a health command reaching the network on every
|
|
192
|
+
* run — including a single-check run — is the surprising default, and that
|
|
193
|
+
* `--online` costs one word to anyone who wants the read.
|
|
194
|
+
*
|
|
195
|
+
* Phase 3.1 shipped the opt-OUT and this function's earlier header said the
|
|
196
|
+
* default "is an owner decision, so this function does not decide it". That is
|
|
197
|
+
* now decided, and the header says so rather than leaving the next reader to
|
|
198
|
+
* infer it from the expression.
|
|
199
|
+
*
|
|
200
|
+
* Precedence is narrowest-first, so the reason names the repair: a `--check`
|
|
201
|
+
* run reads no forge row at all, an explicit `--no-forge` beats `--online`
|
|
202
|
+
* because it is the more specific instruction, and the bare default is last.
|
|
203
|
+
*/
|
|
204
|
+
export function forgeDepsFor(opts: {
|
|
205
|
+
readonly online?: boolean;
|
|
206
|
+
readonly no_forge?: boolean;
|
|
207
|
+
readonly check: string | null;
|
|
208
|
+
}): ForgeDeps {
|
|
209
|
+
const not_checked: NotCheckedReason =
|
|
210
|
+
opts.check !== null
|
|
211
|
+
? 'single_check'
|
|
212
|
+
: opts.no_forge === true
|
|
213
|
+
? 'offline_flag'
|
|
214
|
+
: opts.online === true
|
|
215
|
+
? null
|
|
216
|
+
: 'online_not_requested';
|
|
217
|
+
return { offline: not_checked !== null, not_checked };
|
|
150
218
|
}
|
|
151
219
|
|
|
152
220
|
export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict {
|
|
@@ -155,6 +223,9 @@ export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict
|
|
|
155
223
|
// binding were asserted one layer down against fakes while a regression in
|
|
156
224
|
// the real wiring stayed invisible. `deps` is that seam; production passes
|
|
157
225
|
// nothing and gets `process.env` plus the real spawn.
|
|
226
|
+
if (deps.offline === true) {
|
|
227
|
+
return forgeProtectionJson(UNREAD_FORGE, null, deps.not_checked ?? null);
|
|
228
|
+
}
|
|
158
229
|
const env = deps.env ?? process.env;
|
|
159
230
|
const run = deps.run;
|
|
160
231
|
const remaining = budgetOf(FORGE_TOTAL_BUDGET_MS);
|
|
@@ -238,7 +238,11 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
238
238
|
roadmap:set-step Flip ONE checkbox glyph safely (lock + line anchor +
|
|
239
239
|
live invariant + survival check)
|
|
240
240
|
roadmap:archive Archive completed roadmaps (branch-touched by default;
|
|
241
|
-
--all for every complete one; --dry-run to preview
|
|
241
|
+
--all for every complete one; --dry-run to preview;
|
|
242
|
+
bare [~] steps are carried to a follow-up first,
|
|
243
|
+
--no-carry to leave them blocking; owner-blocked
|
|
244
|
+
steps ask first; --owner-decision later --only <x>
|
|
245
|
+
parks that one roadmap)
|
|
242
246
|
stubs:due Read-only: roadmap stubs past their `review_by:`
|
|
243
247
|
date, plus the decisions routed to the owner.
|
|
244
248
|
Writes nothing. Flags: --json, --counts,
|
|
@@ -279,6 +283,36 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
279
283
|
settings:get Read one setting: its value, the file it came from, its
|
|
280
284
|
class, and whether "absent" differs from the default.
|
|
281
285
|
Usage: settings:get <key> [--json]
|
|
286
|
+
git:convention The git convention (git.commit_format, git.branch_pattern,
|
|
287
|
+
git.update_strategy): value in force, source and state
|
|
288
|
+
(valid|absent|malformed|invalid|discarded|unresolvable),
|
|
289
|
+
read from a committed .git-convention.yml over the
|
|
290
|
+
settings files; this checkout's differing value is shown
|
|
291
|
+
as a candidate, and any repository commit-message
|
|
292
|
+
validator that also runs at commit. Exit 1 when a key in
|
|
293
|
+
force is malformed, invalid, discarded or unresolvable;
|
|
294
|
+
a candidate in one of these states is a warning, exit 0.
|
|
295
|
+
--key limits show to the named keys (repeatable).
|
|
296
|
+
update_strategy is read at --base, else the default
|
|
297
|
+
branch: a pull request passes --base origin/<its base>.
|
|
298
|
+
subject checks subjects on stdin against the convention in
|
|
299
|
+
force; ticket reads the ticket out of a branch name; branch
|
|
300
|
+
renders a name from git.branch_pattern; measure proposes
|
|
301
|
+
a convention from the history (subject family, branch
|
|
302
|
+
pattern, observed update style) and writes nothing;
|
|
303
|
+
init --yes creates .git-convention.yml once on the
|
|
304
|
+
user's yes (never over one, never committed);
|
|
305
|
+
show and subject print "no convention established" when
|
|
306
|
+
no declaration, approved card or commitlint config exists; sync brings the
|
|
307
|
+
branch up to --base (else the default branch) per
|
|
308
|
+
git.update_strategy (exit 1 base unresolved, 3 behind
|
|
309
|
+
under rebase, 4 strategy unreadable).
|
|
310
|
+
Usage: git:convention show [--json] [--base REF] [--key K]
|
|
311
|
+
git:convention subject [--format F|--family F]
|
|
312
|
+
git:convention ticket [BRANCH] [--keys K]
|
|
313
|
+
git:convention branch --slug S [--type T] [--ticket K]
|
|
314
|
+
git:convention measure [--limit N] [--family F]
|
|
315
|
+
git:convention sync [--base REF] [--dry-run]
|
|
282
316
|
settings:set Set one setting in the global file. Refuses every class-C
|
|
283
317
|
(guarded) key from docs/contracts/settings-classes.md, and
|
|
284
318
|
refuses everything when that contract is unreadable.
|
|
@@ -342,7 +376,9 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
342
376
|
memory:check-proposal Run the admission gate on a memory proposal
|
|
343
377
|
memory:learn Aggregate memory intake signals into the local learning
|
|
344
378
|
sidecar (read-only; --write to emit). Usage: memory:learn [--intake-dir DIR]
|
|
345
|
-
[--out-dir DIR] [--now ISO] [--write] [--format text|json]
|
|
379
|
+
[--out-dir DIR] [--now ISO] [--write] [--format text|json|status]
|
|
380
|
+
--format status prints the one-screen human view (verdict counts,
|
|
381
|
+
top preferred lessons, the hand-off); it refuses --write.
|
|
346
382
|
analytics Local-only workspace analytics (emit|show|prune|migrate).
|
|
347
383
|
Usage: analytics show [--window 30d|7d|24h] · analytics prune
|
|
348
384
|
knowledge Global knowledge-card store (list|show|trace|forget|promote|
|
|
@@ -356,9 +392,9 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
|
|
|
356
392
|
roadmap-progress:hook PostToolUse hook entry point (read JSON from stdin)
|
|
357
393
|
Regenerates roadmaps-progress.md when a tool wrote under agents/roadmaps/
|
|
358
394
|
onboarding-gate:hook Hook entry point (drains stdin)
|
|
359
|
-
Writes
|
|
395
|
+
Writes agents/state/onboarding-gate.json from .agent-settings.yml
|
|
360
396
|
context-hygiene:hook PostToolUse hook entry point (read JSON from stdin)
|
|
361
|
-
Maintains
|
|
397
|
+
Maintains agents/state/context-hygiene.json (turn count, loop, freshness)
|
|
362
398
|
dispatch:hook Universal hook dispatcher (Phase 7, hook-architecture-v1.md)
|
|
363
399
|
Usage: dispatch:hook --platform <name> --event <event> [--native-event <native>]
|
|
364
400
|
Reads scripts/hook_manifest.yaml and runs the resolved concern chain.
|
|
@@ -790,6 +826,10 @@ cmd_settings_get() {
|
|
|
790
826
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_settings_get.ts" "$@"
|
|
791
827
|
}
|
|
792
828
|
|
|
829
|
+
cmd_git_convention() {
|
|
830
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_git_convention.ts" "$@"
|
|
831
|
+
}
|
|
832
|
+
|
|
793
833
|
cmd_mcp_available() {
|
|
794
834
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_mcp_available.ts" "$@"
|
|
795
835
|
}
|
|
@@ -1456,7 +1496,15 @@ cmd_prune() {
|
|
|
1456
1496
|
# `agent-config doctor` — read-only drift report against the manifest.
|
|
1457
1497
|
# Surfaces missing / modified / foreign files. Exit 0 clean, 1 drift,
|
|
1458
1498
|
# 2 manifest-absent. See scripts/_cli/cmd_doctor.ts.
|
|
1499
|
+
# `doctor neighbours` routes to its own entry point rather than a branch inside
|
|
1500
|
+
# cmd_doctor.ts, which is 2,000 lines over the source-size ceiling and cannot
|
|
1501
|
+
# grow. Routed here because the dispatcher is where verbs are already resolved.
|
|
1459
1502
|
cmd_doctor() {
|
|
1503
|
+
if [[ "${1:-}" == "neighbours" ]]; then
|
|
1504
|
+
shift
|
|
1505
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_doctor_neighbours.ts" "$@"
|
|
1506
|
+
return
|
|
1507
|
+
fi
|
|
1460
1508
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_doctor.ts" "$@"
|
|
1461
1509
|
}
|
|
1462
1510
|
|
|
@@ -1547,6 +1595,7 @@ main() {
|
|
|
1547
1595
|
session:recycle) cmd_session_recycle "$@" ;;
|
|
1548
1596
|
packs:active) cmd_packs_active "$@" ;;
|
|
1549
1597
|
settings:get) cmd_settings_get "$@" ;;
|
|
1598
|
+
git:convention) cmd_git_convention "$@" ;;
|
|
1550
1599
|
mcp:available) cmd_mcp_available "$@" ;;
|
|
1551
1600
|
brand:status) cmd_brand_status "$@" ;;
|
|
1552
1601
|
roadmap:context) cmd_roadmap_context "$@" ;;
|
|
@@ -49,11 +49,13 @@ import { createRequire } from 'node:module';
|
|
|
49
49
|
import * as fs from 'node:fs';
|
|
50
50
|
import * as os from 'node:os';
|
|
51
51
|
import * as path from 'node:path';
|
|
52
|
-
import {
|
|
52
|
+
import { resolvePackageRoot } from './package_root.js';
|
|
53
53
|
|
|
54
54
|
import * as user_global_paths from './user_global_paths.js';
|
|
55
55
|
import { carveOutKeys } from '../../shared/settingsCarveOut.js';
|
|
56
56
|
import { applyRenamedKeys } from './settings_renamed_keys.js';
|
|
57
|
+
import { warnRemovedKeys } from './settings_removed_keys.js';
|
|
58
|
+
export { REMOVED_KEYS } from './settings_removed_keys.js';
|
|
57
59
|
import type * as YamlModule from 'yaml';
|
|
58
60
|
|
|
59
61
|
// ESM has no `require`; `createRequire(import.meta.url)` restores it so the
|
|
@@ -264,13 +266,13 @@ function _resolve_user_global_file(): string {
|
|
|
264
266
|
* the user-global file. Adding a key requires an ADR.
|
|
265
267
|
*/
|
|
266
268
|
export const MERGEABLE_KEYS: readonly string[] = [
|
|
267
|
-
// `name
|
|
268
|
-
// `
|
|
269
|
-
//
|
|
270
|
-
//
|
|
271
|
-
//
|
|
272
|
-
//
|
|
273
|
-
//
|
|
269
|
+
// `name` and `ide` are the PRE-MIGRATION spellings. `install.ts` migrates
|
|
270
|
+
// `ide` → `personal.ide`, and this list was never moved with it — so the
|
|
271
|
+
// whitelist named a key the template does not have while the key it does
|
|
272
|
+
// have was filtered out silently (road-to-capability-answerability 4.3,
|
|
273
|
+
// ADR-219). `personal.bot_icon` / `personal.pr_comment_bot_icon` left with
|
|
274
|
+
// the key itself (2026-10-09): a whitelisted key nothing reads would carry a
|
|
275
|
+
// user-global value into a tree that ignores it.
|
|
274
276
|
//
|
|
275
277
|
// Both spellings are listed rather than replaced: a legacy file that still
|
|
276
278
|
// uses the old name keeps working, and nothing that resolved before
|
|
@@ -280,20 +282,12 @@ export const MERGEABLE_KEYS: readonly string[] = [
|
|
|
280
282
|
'ide',
|
|
281
283
|
'personal.ide',
|
|
282
284
|
'rule_loading_tier',
|
|
283
|
-
'memory.cadence',
|
|
284
|
-
'personal.bot_icon',
|
|
285
|
-
'personal.pr_comment_bot_icon',
|
|
286
285
|
'personal.autonomy',
|
|
287
286
|
// Knowledge-card global cross-project sharing is a USER-GLOBAL setting
|
|
288
287
|
// (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
|
|
289
288
|
// ~/.event4u/agent-config/agent-settings.yml values are honoured.
|
|
290
289
|
'knowledge.global_sharing.enabled',
|
|
291
290
|
'knowledge.global_sharing.allowed_tiers',
|
|
292
|
-
'knowledge.global_sharing.redaction.enabled',
|
|
293
|
-
'knowledge.global_sharing.redaction.halt_on_trigger',
|
|
294
|
-
'knowledge.global_sharing.auto_promote_threshold',
|
|
295
|
-
'knowledge.global_sharing.freshness.hypothesis_after_days',
|
|
296
|
-
'knowledge.global_sharing.freshness.stale_after_days',
|
|
297
291
|
// `design.fidelity_mode` is a per-DEVELOPER working preference, not a
|
|
298
292
|
// per-project one: whether an agent may deviate from a handed-over design
|
|
299
293
|
// is a property of how that person works, and a designer who sets it once
|
|
@@ -305,17 +299,28 @@ export const MERGEABLE_KEYS: readonly string[] = [
|
|
|
305
299
|
// GUI; whitelisting decides only whether the value SURVIVES the merge
|
|
306
300
|
// (ADR-271, road-to-design-intent-conformance 2.3).
|
|
307
301
|
'design.fidelity_mode',
|
|
302
|
+
// `lean_projection.*` is a per-MACHINE setting and the install it governs is
|
|
303
|
+
// a user-scope one: the layer being thinned is `~/.claude/rules`, which
|
|
304
|
+
// belongs to the machine and not to any checkout. Without these two rows a
|
|
305
|
+
// consumer who wrote the opt-in into the user-global file got no error, no
|
|
306
|
+
// warning and no effect — the same silent-filter defect the two entries
|
|
307
|
+
// above repair, reaching a third key, and unsatisfiable-by-construction on
|
|
308
|
+
// an ADR-020 global-only install, where no project layer exists to carry it.
|
|
309
|
+
// Whitelisting decides only whether a value SURVIVES the merge: it sets
|
|
310
|
+
// nothing, and `installerThinsHost` still refuses a template-only value.
|
|
311
|
+
'lean_projection.mode',
|
|
312
|
+
'lean_projection.hosts',
|
|
308
313
|
];
|
|
309
314
|
|
|
310
315
|
/** The shipped template, relative to the package root. */
|
|
311
316
|
const TEMPLATE_RELATIVE = path.join('src', 'config', 'agent-settings.template.yml');
|
|
312
317
|
|
|
313
318
|
/**
|
|
314
|
-
* Package root
|
|
315
|
-
*
|
|
316
|
-
*
|
|
319
|
+
* Package root, anchored on the package marker rather than on hop counts: this
|
|
320
|
+
* module is also inlined into `dist/cli-delegate/`, two levels below the root,
|
|
321
|
+
* where three hops land outside the package and every default is lost.
|
|
317
322
|
*/
|
|
318
|
-
const _PACKAGE_ROOT =
|
|
323
|
+
const _PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
|
|
319
324
|
|
|
320
325
|
/** Default template path — overridable per call for tests. */
|
|
321
326
|
export function default_template_path(): string {
|
|
@@ -964,114 +969,11 @@ export function load_agent_settings(
|
|
|
964
969
|
_deep_merge(merged, layer);
|
|
965
970
|
}
|
|
966
971
|
}
|
|
967
|
-
|
|
972
|
+
warnRemovedKeys(merged);
|
|
968
973
|
return merged;
|
|
969
974
|
}
|
|
970
975
|
|
|
971
976
|
|
|
972
|
-
/**
|
|
973
|
-
* Settings keys this package has DELETED. A leftover value from an older
|
|
974
|
-
* install is ignored — never applied by any reader — and surfaced with ONE
|
|
975
|
-
* deprecation line per key per process run (stderr; the exit code never
|
|
976
|
-
* changes).
|
|
977
|
-
*
|
|
978
|
-
* The map carries a per-key REASON rather than one shared sentence, because
|
|
979
|
-
* the list now spans more than one deletion doctrine and a single blanket
|
|
980
|
-
* phrase would mis-attribute every future entry. A reader who hits the line
|
|
981
|
-
* should learn why the key went, not just that it did.
|
|
982
|
-
*
|
|
983
|
-
* `subagents.*` — the always-on-orchestration doctrine
|
|
984
|
-
* (road-to-always-on-orchestration Phase 1): the layer has no per-layer
|
|
985
|
-
* on/off setting any more. `ai_team.enabled` joined in Step 1.3 — the
|
|
986
|
-
* `/team` family's availability is a codex-CLI/auth FACT
|
|
987
|
-
* (`src/scripts/ai_team/availability.ts`), not a flag; the `ai_team` config
|
|
988
|
-
* loader (`src/scripts/ai_team/config.ts`) separately accepts a leftover
|
|
989
|
-
* `enabled` key without failing closed, so this warning is the only surfaced
|
|
990
|
-
* signal of that deletion.
|
|
991
|
-
*
|
|
992
|
-
* `hooks.turn_end_gate.*` — the turn-end gate is always armed (2026-08-12).
|
|
993
|
-
* A default-off safety gate cannot soak, so the switch protecting the soak
|
|
994
|
-
* made the soak impossible; whether the gate fires is now decided by each
|
|
995
|
-
* detector's own trigger conditions. See `turn_end_gate_hook.ts` § "Always
|
|
996
|
-
* armed".
|
|
997
|
-
*
|
|
998
|
-
* The five `derivable` leaves below (2026-08-12, road-to-zero-settings Phase
|
|
999
|
-
* 2.1) are a different case from every entry above them, and the difference is
|
|
1000
|
-
* the whole safety argument: no code path ever *consulted* them. Each appeared
|
|
1001
|
-
* in the template, the schema and the reference page, and several in the setup
|
|
1002
|
-
* wizard, while the decision they looked like they governed was taken
|
|
1003
|
-
* elsewhere. A key nothing reads cannot change a default by leaving — so this
|
|
1004
|
-
* is the one deletion batch that needs no replacement mechanism, only the
|
|
1005
|
-
* per-key statement of what already decides.
|
|
1006
|
-
*
|
|
1007
|
-
* A sixth unread key, `screenshots.data_bearing_gate`, was found in the same
|
|
1008
|
-
* pass and deliberately NOT deleted — it is `consent`, and the open question is
|
|
1009
|
-
* whether the repair is to build its missing reader or to delete a promise a
|
|
1010
|
-
* Hard Floor can never honour. See `settings-classes.md` § The six unread keys.
|
|
1011
|
-
*
|
|
1012
|
-
* `worktrees.mode` (2026-08-13, ADR-229) is a third doctrine again: not
|
|
1013
|
-
* always-on, not unread. It WAS read, and the reader honoured all three values —
|
|
1014
|
-
* the deletion says the decision was never the agent's to make. `ask` bought a
|
|
1015
|
-
* round trip per spawn, `on` let the agent start parallel work unprompted, and
|
|
1016
|
-
* `off` described the wanted behaviour, so `off` became the hardcoded rule and
|
|
1017
|
-
* the switch went. What decides instead is the user's own sentence in the chat.
|
|
1018
|
-
*
|
|
1019
|
-
* Every reason string must name what decides INSTEAD, never just "removed".
|
|
1020
|
-
* Exported so `lint_settings_classes` can check the deletion side of the
|
|
1021
|
-
* surface: a reason that names no replacement, or an entry whose key is live in
|
|
1022
|
-
* the template again, is a contradiction the loader itself cannot notice.
|
|
1023
|
-
*/
|
|
1024
|
-
export const REMOVED_KEYS: ReadonlyMap<string, string> = new Map([
|
|
1025
|
-
['subagents.enabled', 'always-on orchestration'],
|
|
1026
|
-
['subagents.auto', 'always-on orchestration'],
|
|
1027
|
-
['subagents.host_capabilities', 'always-on orchestration'],
|
|
1028
|
-
['subagents.budget_routing', 'always-on orchestration'],
|
|
1029
|
-
['ai_team.enabled', 'always-on orchestration'],
|
|
1030
|
-
['hooks.turn_end_gate.enabled', 'the turn-end gate is always armed'],
|
|
1031
|
-
['hooks.turn_end_gate.promissory', 'the turn-end gate is always armed'],
|
|
1032
|
-
['hooks.turn_end_gate.language', 'the turn-end gate is always armed'],
|
|
1033
|
-
['hooks.turn_end_gate.verification', 'the turn-end gate is always armed'],
|
|
1034
|
-
['telegraph.speak_scope', 'the rule body states its own scope; compile_router gates on telegraph.speak alone'],
|
|
1035
|
-
['chat_history.max_size_kb', 'the rotate command takes --max-kb from argv; session-count pruning bounds the file'],
|
|
1036
|
-
['chat_history.on_overflow', 'the overflow mode comes from the rotate command --mode argv'],
|
|
1037
|
-
['quality.wait_for_remote_ci', 'whether to poll follows from the push plus a detectable remote pipeline'],
|
|
1038
|
-
['legal_review_prep.consented_at', 'the provenance sidecar settings:set writes and consentVerdict reads'],
|
|
1039
|
-
['worktrees.mode', 'the user asking for a worktree in the chat; creation is instruction-only and hardcoded'],
|
|
1040
|
-
]);
|
|
1041
|
-
|
|
1042
|
-
/** Keys already warned about in THIS process — the "once per run" dedupe. */
|
|
1043
|
-
const _warnedRemovedKeys = new Set<string>();
|
|
1044
|
-
|
|
1045
|
-
/** Read one dotted path out of a merged settings tree; `undefined` when absent. */
|
|
1046
|
-
function _readDottedSettingsPath(root: SettingsDict, dotted: string): SettingsValue {
|
|
1047
|
-
let node: SettingsValue = root;
|
|
1048
|
-
for (const part of dotted.split('.')) {
|
|
1049
|
-
if (typeof node !== 'object' || node === null || Array.isArray(node)) {
|
|
1050
|
-
return undefined;
|
|
1051
|
-
}
|
|
1052
|
-
node = (node as SettingsDict)[part];
|
|
1053
|
-
}
|
|
1054
|
-
return node;
|
|
1055
|
-
}
|
|
1056
|
-
|
|
1057
|
-
/**
|
|
1058
|
-
* Warn once per process, on stderr, for every {@link REMOVED_KEYS} entry still
|
|
1059
|
-
* present in a resolved settings tree. Never throws, never changes what the
|
|
1060
|
-
* caller does with `merged` — a pure notification side effect.
|
|
1061
|
-
*/
|
|
1062
|
-
function _warn_removed_always_on_keys(merged: SettingsDict): void {
|
|
1063
|
-
for (const [key, reason] of REMOVED_KEYS) {
|
|
1064
|
-
if (_warnedRemovedKeys.has(key)) {
|
|
1065
|
-
continue;
|
|
1066
|
-
}
|
|
1067
|
-
if (_readDottedSettingsPath(merged, key) === undefined) {
|
|
1068
|
-
continue;
|
|
1069
|
-
}
|
|
1070
|
-
_warnedRemovedKeys.add(key);
|
|
1071
|
-
process.stderr.write(`${key} was removed (${reason}); ignored.\n`);
|
|
1072
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
977
|
/**
|
|
1076
978
|
* Return the merged `modules:` configuration with defaults applied.
|
|
1077
979
|
*
|
|
@@ -50,7 +50,7 @@ export interface BlockedByMarker {
|
|
|
50
50
|
* unreadable, which is a migration, not a fix.
|
|
51
51
|
*/
|
|
52
52
|
export const BLOCKED_BY_MARKER_RE =
|
|
53
|
-
/<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
|
|
53
|
+
/<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+(?:#[a-z0-9-]+)?)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
|
|
54
54
|
|
|
55
55
|
/** Parse one marker, or `null` when the text carries none. */
|
|
56
56
|
export function parseBlockedByMarker(text: string): BlockedByMarker | null {
|
|
@@ -98,16 +98,18 @@ export function build_claude_hook_matrix(manifest_path: string): ClaudeHookMatri
|
|
|
98
98
|
const aliasesAll = (manifest['native_event_aliases'] ?? {}) as Record<string, unknown>;
|
|
99
99
|
const aliases = ((aliasesAll['claude'] ?? {}) as Record<string, unknown>) || {};
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
// Iterating the ALIAS map, not the event map, because the relation is
|
|
102
|
+
// many-natives-to-one-event and the inversion this replaced silently lost
|
|
103
|
+
// every native but the last. `PostToolUse` and `PostToolUseFailure` both
|
|
104
|
+
// lower to `post_tool_use`; building `ac_to_native` would have kept one of
|
|
105
|
+
// them and UNBOUND the other, turning a routing fix into a routing
|
|
106
|
+
// regression that no existing test could see. Pinned by
|
|
107
|
+
// `before_complete_failure_envelope.test.ts` ("both natives stay bound").
|
|
106
108
|
const matrix: ClaudeHookMatrix = {};
|
|
107
|
-
for (const [
|
|
109
|
+
for (const [native, ac_raw] of Object.entries(aliases)) {
|
|
110
|
+
const ac_event = String(ac_raw);
|
|
111
|
+
const concerns = claude_events[ac_event];
|
|
108
112
|
if (!concerns || (Array.isArray(concerns) && concerns.length === 0)) continue;
|
|
109
|
-
const native = ac_to_native[ac_event];
|
|
110
|
-
if (native === undefined) continue;
|
|
111
113
|
// Bundle fast path (road-to-hook-latency-repair Phase 2): invoke the
|
|
112
114
|
// precompiled dispatcher bundle directly — no bash shim, no CLI boot
|
|
113
115
|
// (measured ~450-500 ms CLI vs ~110 ms bundle per event on a 1-vCPU
|