@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
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent-config doctor neighbours` — render the neighbour census.
|
|
3
|
+
*
|
|
4
|
+
* A separate entry point rather than another branch inside `cmd_doctor.ts`,
|
|
5
|
+
* which sits 2,000 lines above the source-size ceiling: a verb this size does
|
|
6
|
+
* not belong in a file that already cannot grow. The census itself is
|
|
7
|
+
* `_lib/neighbour_census.ts`; everything here is presentation and the one
|
|
8
|
+
* summary line the full `doctor` run links to.
|
|
9
|
+
*
|
|
10
|
+
* Refuses nothing. No label here removes, blocks, or rewrites a neighbour's
|
|
11
|
+
* artifact — a label is a report, never a gate.
|
|
12
|
+
*
|
|
13
|
+
* It is no longer read-ONLY, and the two writes are named rather than implied.
|
|
14
|
+
* Both land under `agents/reports/` and both are caches of this run's own
|
|
15
|
+
* findings: `neighbour-scan.json`, the shape-scan verdicts the ranker reads on
|
|
16
|
+
* the hook path, and `neighbour-overlap.json`, the cross-root pairs keyed by the
|
|
17
|
+
* census digest. Nothing outside that directory is touched, and a failed write
|
|
18
|
+
* is not a failed census.
|
|
19
|
+
*
|
|
20
|
+
* `--contradictions` (step 2.2) writes neither cache. It forms candidate pairs
|
|
21
|
+
* and hands them to ONE council seat, whose question and transcript land under
|
|
22
|
+
* gitignored `agents/runtime/council/`; with no council configured it prints
|
|
23
|
+
* `n/a` and asks nobody.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { spawnSync } from 'node:child_process';
|
|
27
|
+
import * as fs from 'node:fs';
|
|
28
|
+
import * as path from 'node:path';
|
|
29
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
30
|
+
|
|
31
|
+
import * as YAML from 'yaml';
|
|
32
|
+
|
|
33
|
+
import {
|
|
34
|
+
census,
|
|
35
|
+
fileDigest,
|
|
36
|
+
gatedEventsFrom,
|
|
37
|
+
scanCachePath,
|
|
38
|
+
type NeighbourCensus,
|
|
39
|
+
} from '../_lib/neighbour_census.js';
|
|
40
|
+
import { scanNeighbourBody, writeScanCache } from '../_lib/neighbour_scan.js';
|
|
41
|
+
import {
|
|
42
|
+
RANK_NEIGHBOUR_ALWAYS_ON,
|
|
43
|
+
RANK_NEIGHBOUR_SKILL,
|
|
44
|
+
RANK_PROJECT,
|
|
45
|
+
collisionPair,
|
|
46
|
+
extractInstructions,
|
|
47
|
+
modalityPairs,
|
|
48
|
+
parseVerdicts,
|
|
49
|
+
renderReview,
|
|
50
|
+
reviewRows,
|
|
51
|
+
seatPrompt,
|
|
52
|
+
type CandidatePair,
|
|
53
|
+
type InstructionSource,
|
|
54
|
+
type ReviewRow,
|
|
55
|
+
} from '../_lib/neighbour_contradictions.js';
|
|
56
|
+
import { resolveAvailability } from '../council_availability_hook.js';
|
|
57
|
+
import { resolvePackageRoot } from '../_lib/package_root.js';
|
|
58
|
+
import {
|
|
59
|
+
OVERLAP_THRESHOLD,
|
|
60
|
+
CROSS_CACHE_NAME,
|
|
61
|
+
cachedCrossRootPairs,
|
|
62
|
+
crossRootOverlapMap,
|
|
63
|
+
} from '../audit_skill_overlap.js';
|
|
64
|
+
|
|
65
|
+
interface ManifestShape {
|
|
66
|
+
concerns?: Record<string, { effect?: string }>;
|
|
67
|
+
platforms?: Record<string, Record<string, unknown>>;
|
|
68
|
+
native_event_aliases?: Record<string, Record<string, string>>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Read the hook manifest for the events a `permission` concern of ours sits on. */
|
|
72
|
+
function gatedEvents(packageRoot: string): Set<string> {
|
|
73
|
+
try {
|
|
74
|
+
// A missing or unreadable manifest yields an empty gate set, which
|
|
75
|
+
// downgrades `degraded` to `coordinated` rather than inventing a gate
|
|
76
|
+
// that is not there.
|
|
77
|
+
const file = path.join(packageRoot, 'src', 'scripts', 'hook_manifest.yaml');
|
|
78
|
+
const doc = YAML.parse(fs.readFileSync(file, 'utf-8')) as ManifestShape;
|
|
79
|
+
return gatedEventsFrom(doc, doc.native_event_aliases ?? {});
|
|
80
|
+
} catch {
|
|
81
|
+
return new Set<string>();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** This package's own skill names, for the `shadowed` warning. */
|
|
86
|
+
function ourSkillNames(packageRoot: string): Set<string> {
|
|
87
|
+
try {
|
|
88
|
+
return new Set(
|
|
89
|
+
fs
|
|
90
|
+
.readdirSync(path.join(packageRoot, 'src', 'skills'), { withFileTypes: true })
|
|
91
|
+
.filter((e) => e.isDirectory())
|
|
92
|
+
.map((e) => e.name),
|
|
93
|
+
);
|
|
94
|
+
} catch {
|
|
95
|
+
return new Set<string>();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The census, in two passes, and the second one is not an accident.
|
|
101
|
+
*
|
|
102
|
+
* The cross-root overlap can only be computed over the neighbour skills the
|
|
103
|
+
* census FOUND — the unclaimed entries of two roots that also hold claimed ones,
|
|
104
|
+
* since `agent-config install` writes this package's own skills into
|
|
105
|
+
* `~/.claude/skills`. Pairing whole roots instead would compare our installed
|
|
106
|
+
* copies against our own source tree and publish the install as an overlap. So
|
|
107
|
+
* pass one finds them, the overlap runs over exactly those files, and pass two
|
|
108
|
+
* labels them.
|
|
109
|
+
*
|
|
110
|
+
* The shape scan is memoized across both passes, so the four linters run once
|
|
111
|
+
* per neighbour body rather than twice. The scan verdicts are then WRITTEN to
|
|
112
|
+
* the cache the ranker reads on the hook path — this verb is the only producer,
|
|
113
|
+
* which is why its absence reads there as `no-scan-record` rather than as a pass.
|
|
114
|
+
*/
|
|
115
|
+
export function runCensus(
|
|
116
|
+
projectRoot: string,
|
|
117
|
+
packageRoot: string,
|
|
118
|
+
homeRoot?: string,
|
|
119
|
+
): NeighbourCensus {
|
|
120
|
+
const scanned = new Map<string, string | null>();
|
|
121
|
+
const scan = (p: string): string | null => {
|
|
122
|
+
const hit = scanned.get(p);
|
|
123
|
+
if (hit !== undefined) return hit;
|
|
124
|
+
const kind = scanNeighbourBody(p).kind;
|
|
125
|
+
scanned.set(p, kind);
|
|
126
|
+
return kind;
|
|
127
|
+
};
|
|
128
|
+
const base = {
|
|
129
|
+
gatedEvents: gatedEvents(packageRoot),
|
|
130
|
+
templatesRoot: path.join(packageRoot, 'src', 'agent-src', 'templates'),
|
|
131
|
+
ourSkillNames: ourSkillNames(packageRoot),
|
|
132
|
+
packageRoot,
|
|
133
|
+
scan,
|
|
134
|
+
...(homeRoot === undefined ? {} : { homeRoot }),
|
|
135
|
+
};
|
|
136
|
+
const first = census(projectRoot, base);
|
|
137
|
+
const ourRoot = path.join(packageRoot, 'src', 'skills');
|
|
138
|
+
let overlaps = new Map<string, { names: string[]; similarity: number }>();
|
|
139
|
+
if (first.skills.length > 0 && fs.existsSync(ourRoot)) {
|
|
140
|
+
try {
|
|
141
|
+
const { pairs } = cachedCrossRootPairs(
|
|
142
|
+
first.skills.map((s) => s.source),
|
|
143
|
+
ourRoot,
|
|
144
|
+
path.join(projectRoot, 'agents', 'reports', CROSS_CACHE_NAME),
|
|
145
|
+
OVERLAP_THRESHOLD,
|
|
146
|
+
);
|
|
147
|
+
overlaps = crossRootOverlapMap(pairs);
|
|
148
|
+
} catch {
|
|
149
|
+
// An overlap pass that cannot run leaves every entry unlabelled by
|
|
150
|
+
// it, which reads as `unclassified` — the absence of a signal — and
|
|
151
|
+
// never as a claim that the pair is disjoint.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const full = census(projectRoot, { ...base, overlaps });
|
|
155
|
+
writeScanCache(
|
|
156
|
+
scanCachePath(projectRoot),
|
|
157
|
+
// `fileDigest`, not the census's own `digest`: the ranker re-digests the
|
|
158
|
+
// file bytes it is about to index, and a cache written under a different
|
|
159
|
+
// digest function would read as `digest-changed` on every prompt.
|
|
160
|
+
full.skills.map((s) => ({
|
|
161
|
+
qualified: s.qualified,
|
|
162
|
+
digest: fileDigest(s.source) ?? '',
|
|
163
|
+
unscanned: s.unscanned,
|
|
164
|
+
})),
|
|
165
|
+
);
|
|
166
|
+
return full;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Candidate pairs for `--contradictions` (step 2.2), READ-ONLY.
|
|
171
|
+
*
|
|
172
|
+
* Calls `census()` directly rather than `runCensus()`, because the latter
|
|
173
|
+
* writes the scan and overlap caches and this mode promises to change no file.
|
|
174
|
+
* The shape scan still runs, and a refused neighbour body contributes no line.
|
|
175
|
+
*/
|
|
176
|
+
export function contradictionCandidates(
|
|
177
|
+
projectRoot: string,
|
|
178
|
+
packageRoot: string,
|
|
179
|
+
homeRoot?: string,
|
|
180
|
+
): CandidatePair[] {
|
|
181
|
+
const ours = ourSkillNames(packageRoot);
|
|
182
|
+
const c = census(projectRoot, {
|
|
183
|
+
gatedEvents: gatedEvents(packageRoot),
|
|
184
|
+
templatesRoot: path.join(packageRoot, 'src', 'agent-src', 'templates'),
|
|
185
|
+
ourSkillNames: ours,
|
|
186
|
+
packageRoot,
|
|
187
|
+
scan: (p) => scanNeighbourBody(p).kind,
|
|
188
|
+
...(homeRoot === undefined ? {} : { homeRoot }),
|
|
189
|
+
});
|
|
190
|
+
const sources: InstructionSource[] = [];
|
|
191
|
+
for (const name of ['CLAUDE.md', 'AGENTS.md']) {
|
|
192
|
+
const file = path.join(projectRoot, name);
|
|
193
|
+
if (fs.existsSync(file)) sources.push({ label: name, file, rank: RANK_PROJECT });
|
|
194
|
+
}
|
|
195
|
+
for (const r of c.rule_files) {
|
|
196
|
+
if (scanNeighbourBody(r.source).kind === null) {
|
|
197
|
+
sources.push({ label: r.id, file: r.source, rank: RANK_NEIGHBOUR_ALWAYS_ON });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const s of c.skills) {
|
|
201
|
+
if (s.unscanned === null) sources.push({ label: s.qualified, file: s.source, rank: RANK_NEIGHBOUR_SKILL });
|
|
202
|
+
}
|
|
203
|
+
const pairs = modalityPairs(sources.flatMap((src) => extractInstructions(src)));
|
|
204
|
+
for (const s of c.skills) {
|
|
205
|
+
const name = s.qualified.split(':').slice(1).join(':') || s.qualified;
|
|
206
|
+
if (ours.has(name)) pairs.push(collisionPair(s.qualified, name));
|
|
207
|
+
}
|
|
208
|
+
return pairs;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** One council seat, run through the council CLI; `null` when it cannot answer. */
|
|
212
|
+
export type Seat = (prompt: string) => string | null;
|
|
213
|
+
|
|
214
|
+
function councilSeat(projectRoot: string): Seat {
|
|
215
|
+
return (prompt) => {
|
|
216
|
+
const stamp = new Date().toISOString().replace(/[:.]/gu, '-');
|
|
217
|
+
const q = path.join(projectRoot, 'agents', 'runtime', 'council', 'questions', `neighbour-contradictions-${stamp}.md`);
|
|
218
|
+
const out = path.join(projectRoot, 'agents', 'runtime', 'council', 'responses', `neighbour-contradictions-${stamp}.md`);
|
|
219
|
+
try {
|
|
220
|
+
fs.mkdirSync(path.dirname(q), { recursive: true });
|
|
221
|
+
fs.writeFileSync(q, prompt, 'utf-8');
|
|
222
|
+
const args = ['council', 'run', q, '--single', '--prompt-mode', 'analysis', '--output', out, '--confirm', '--invocation', 'user_explicit'];
|
|
223
|
+
const res = spawnSync('agent-config', args, { cwd: projectRoot, encoding: 'utf-8' });
|
|
224
|
+
if (res.status !== 0) return null;
|
|
225
|
+
const doc = JSON.parse(fs.readFileSync(out, 'utf-8')) as { responses?: { text?: string }[] };
|
|
226
|
+
return doc.responses?.map((r) => r.text ?? '').join('\n') ?? null;
|
|
227
|
+
} catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* `--contradictions`: a verdict table, or `n/a` when no council is configured.
|
|
235
|
+
*
|
|
236
|
+
* Report-only — it edits nothing and gates nothing. The council transcript the
|
|
237
|
+
* seat writes lands under gitignored `agents/runtime/council/`; no tracked file
|
|
238
|
+
* changes.
|
|
239
|
+
*/
|
|
240
|
+
export function runContradictions(
|
|
241
|
+
projectRoot: string,
|
|
242
|
+
packageRoot: string,
|
|
243
|
+
opts: { homeRoot?: string; seat?: Seat; configured?: boolean } = {},
|
|
244
|
+
): { lines: string[]; rows: ReviewRow[] | null } {
|
|
245
|
+
const configured =
|
|
246
|
+
opts.configured ?? resolveAvailability(projectRoot, process.env)?.configured ?? false;
|
|
247
|
+
const pairs = contradictionCandidates(projectRoot, packageRoot, opts.homeRoot);
|
|
248
|
+
if (!configured) {
|
|
249
|
+
return {
|
|
250
|
+
lines: [` contradictions: n/a — no council configured (${pairs.length} candidate pair(s) formed, none reviewed)`],
|
|
251
|
+
rows: null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (pairs.length === 0) return { lines: renderReview([]), rows: [] };
|
|
255
|
+
let rubric = '';
|
|
256
|
+
for (const rel of [['dist', 'agent-src', 'rules'], ['src', 'rules']]) {
|
|
257
|
+
try {
|
|
258
|
+
rubric = fs.readFileSync(path.join(packageRoot, ...rel, 'neighbour-precedence.md'), 'utf-8');
|
|
259
|
+
break;
|
|
260
|
+
} catch {
|
|
261
|
+
// Try the next layout.
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const answer = (opts.seat ?? councilSeat(projectRoot))(seatPrompt(pairs, rubric));
|
|
265
|
+
if (answer === null) {
|
|
266
|
+
return { lines: [` contradictions: n/a — the council seat did not answer (${pairs.length} candidate pair(s) formed)`], rows: null };
|
|
267
|
+
}
|
|
268
|
+
const rows = reviewRows(pairs, parseVerdicts(answer, pairs.length));
|
|
269
|
+
return { lines: renderReview(rows), rows };
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** The one line the full `doctor` run prints, linking to this verb. */
|
|
273
|
+
export function summaryLine(c: NeighbourCensus): string {
|
|
274
|
+
const counts = [
|
|
275
|
+
`${c.hook_groups.length} hook group(s)`,
|
|
276
|
+
`${c.skills.length} skill(s)`,
|
|
277
|
+
`${c.commands.length} command(s)`,
|
|
278
|
+
`${c.agents.length} agent(s)`,
|
|
279
|
+
`${c.mcp_servers.length} mcp server(s)`,
|
|
280
|
+
`${c.rule_files.length} rule file(s)`,
|
|
281
|
+
`${c.instruction_sections.length} instruction section(s)`,
|
|
282
|
+
].join(', ');
|
|
283
|
+
const labels = c.hosts.map((h) => `${h.host}=${h.label}`).join(' ');
|
|
284
|
+
return ` 🏘️ neighbours: ${counts}${labels === '' ? '' : ` · ${labels}`} (run \`doctor neighbours\` for the census)`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export function renderText(c: NeighbourCensus): string[] {
|
|
288
|
+
const out: string[] = [];
|
|
289
|
+
out.push(` 📍 project_root: ${c.project_root}`);
|
|
290
|
+
out.push('');
|
|
291
|
+
for (const h of c.hosts) {
|
|
292
|
+
out.push(` ${h.host}: ${h.label} — ${h.label_reason}`);
|
|
293
|
+
for (const e of h.hook_groups) {
|
|
294
|
+
const matcher = e.matcher === null ? '' : ` matcher=${e.matcher}`;
|
|
295
|
+
const timeout = e.timeout === null ? '' : ` timeout=${e.timeout}`;
|
|
296
|
+
out.push(` ${e.event}: ${e.command_head}${matcher}${timeout} effect=${e.effect}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const section = (title: string, rows: ReadonlyArray<{ id: string }>): void => {
|
|
300
|
+
if (rows.length === 0) return;
|
|
301
|
+
out.push('');
|
|
302
|
+
out.push(` ${title} (${rows.length})`);
|
|
303
|
+
for (const r of rows) out.push(` ${r.id}`);
|
|
304
|
+
};
|
|
305
|
+
if (c.skills.length > 0) {
|
|
306
|
+
out.push('');
|
|
307
|
+
out.push(` skills (${c.skills.length})`);
|
|
308
|
+
for (const s of c.skills) {
|
|
309
|
+
const also = s.also.length === 0 ? '' : ` also: ${s.also.join(', ')}`;
|
|
310
|
+
const why = s.unscanned === null ? '' : ` unscanned: ${s.unscanned}`;
|
|
311
|
+
out.push(` ${s.qualified} compat: ${s.compat}${also}${why}`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
section('commands', c.commands);
|
|
315
|
+
section('agents', c.agents);
|
|
316
|
+
if (c.mcp_servers.length > 0) {
|
|
317
|
+
out.push('');
|
|
318
|
+
out.push(` mcp servers (${c.mcp_servers.length})`);
|
|
319
|
+
for (const m of c.mcp_servers) {
|
|
320
|
+
// `used` and `advertised` are printed side by side so the reader
|
|
321
|
+
// never takes the first for a coverage ratio: the denominator is
|
|
322
|
+
// not missing by accident, it is not obtainable without launching
|
|
323
|
+
// the neighbour's process, which this census does not do.
|
|
324
|
+
out.push(
|
|
325
|
+
` ${m.id} tools used (${m.tools_window_days}d): ${m.tools_used_30d}` +
|
|
326
|
+
` advertised: ${m.tools_advertised}`,
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
section('rule files', c.rule_files);
|
|
331
|
+
section('instruction sections', c.instruction_sections);
|
|
332
|
+
if (c.warnings.length > 0) {
|
|
333
|
+
out.push('');
|
|
334
|
+
for (const w of c.warnings) out.push(` ⚠️ ${w.kind}: ${w.detail}`);
|
|
335
|
+
}
|
|
336
|
+
out.push('');
|
|
337
|
+
out.push(
|
|
338
|
+
' The host owns load order. This census says what is there and what each entry would do;',
|
|
339
|
+
);
|
|
340
|
+
out.push(' it cannot say what ran first, and no label here refuses anything.');
|
|
341
|
+
return out;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
345
|
+
let json = false;
|
|
346
|
+
let contradictions = false;
|
|
347
|
+
let root = process.cwd();
|
|
348
|
+
let home: string | undefined;
|
|
349
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
350
|
+
if (argv[i] === '--json') json = true;
|
|
351
|
+
else if (argv[i] === '--contradictions') contradictions = true;
|
|
352
|
+
else if (argv[i] === '--project') {
|
|
353
|
+
root = argv[i + 1] ?? root;
|
|
354
|
+
i += 1;
|
|
355
|
+
} else if (argv[i] === '--home') {
|
|
356
|
+
// Fixture-only: the user-scope half of the census is real `$HOME`
|
|
357
|
+
// in production, and a test must be able to plant one.
|
|
358
|
+
home = argv[i + 1];
|
|
359
|
+
i += 1;
|
|
360
|
+
} else if (argv[i] === 'neighbours') {
|
|
361
|
+
continue;
|
|
362
|
+
} else {
|
|
363
|
+
process.stderr.write(`doctor neighbours: unknown argument: ${argv[i]}\n`);
|
|
364
|
+
return 2;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (contradictions) {
|
|
368
|
+
const r = runContradictions(path.resolve(root), resolvePackageRoot(import.meta.url), home === undefined ? {} : { homeRoot: home });
|
|
369
|
+
if (json) process.stdout.write(`${JSON.stringify({ contradictions: r.rows })}\n`);
|
|
370
|
+
else for (const line of r.lines) process.stdout.write(`${line}\n`);
|
|
371
|
+
return 0;
|
|
372
|
+
}
|
|
373
|
+
const c = runCensus(path.resolve(root), resolvePackageRoot(import.meta.url), home);
|
|
374
|
+
if (json) {
|
|
375
|
+
// Compact, not pretty-printed: this is the machine contract, and the
|
|
376
|
+
// gate that reads it matches on adjacency rather than on indentation.
|
|
377
|
+
process.stdout.write(`${JSON.stringify(c)}\n`);
|
|
378
|
+
} else {
|
|
379
|
+
for (const line of renderText(c)) process.stdout.write(`${line}\n`);
|
|
380
|
+
}
|
|
381
|
+
return 0;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Same entry guard the sibling CLIs use — including the delegate branch, which
|
|
386
|
+
* an earlier version of this file left out and which the delegate smoke test
|
|
387
|
+
* caught: `no bundle is a silent no-op` reported `cmd_doctor_neighbours.js (no
|
|
388
|
+
* output, exit 0)`, the exact shape the paragraph below describes.
|
|
389
|
+
*
|
|
390
|
+
* Inside the cli-delegate bundle `--splitting` moves this module's body into a
|
|
391
|
+
* shared chunk, so the URL comparison weighs the CHUNK against `argv[1]` and
|
|
392
|
+
* never matches. `agent-config doctor` shipped that way once already — a
|
|
393
|
+
* diagnostic reporting success while saying nothing. The invoked file name is
|
|
394
|
+
* the reliable signal there; a miss falls THROUGH to the realpath comparison
|
|
395
|
+
* rather than returning false, so a symlinked or renamed invocation still
|
|
396
|
+
* resolves. Inlined into the installer / hook / MCP bundle instead, it must
|
|
397
|
+
* never auto-run, which is why one "am I bundled" flag cannot answer "may I
|
|
398
|
+
* run" and both flags are read.
|
|
399
|
+
*/
|
|
400
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
401
|
+
declare const __AGENT_CONFIG_CLI_DELEGATE__: boolean | undefined;
|
|
402
|
+
|
|
403
|
+
function _isCliEntry(): boolean {
|
|
404
|
+
const bundled = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
|
|
405
|
+
const cliDelegate =
|
|
406
|
+
typeof __AGENT_CONFIG_CLI_DELEGATE__ !== 'undefined' && __AGENT_CONFIG_CLI_DELEGATE__;
|
|
407
|
+
if (bundled && !cliDelegate) return false;
|
|
408
|
+
if (process.argv[1] === undefined) return false;
|
|
409
|
+
if (cliDelegate && path.basename(process.argv[1], '.js') === 'cmd_doctor_neighbours') {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
413
|
+
if (import.meta.url === argvUrl) return true;
|
|
414
|
+
try {
|
|
415
|
+
return (
|
|
416
|
+
fs.realpathSync(fileURLToPath(import.meta.url)) ===
|
|
417
|
+
fs.realpathSync(path.resolve(process.argv[1]))
|
|
418
|
+
);
|
|
419
|
+
} catch {
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (_isCliEntry()) {
|
|
425
|
+
process.exit(main());
|
|
426
|
+
}
|
|
@@ -310,13 +310,32 @@ function _explain_config(project_root: string, as_json: boolean): number {
|
|
|
310
310
|
}
|
|
311
311
|
const knobs = resolved_preset.knobs as Dict;
|
|
312
312
|
const cost = isPlainObject(knobs['cost']) ? (knobs['cost'] as Dict) : {};
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
313
|
+
const mcp = isPlainObject(knobs['mcp']) ? (knobs['mcp'] as Dict) : {};
|
|
314
|
+
if (Object.keys(cost).length > 0 || Object.keys(mcp).length > 0) {
|
|
315
|
+
// These are preset FIGURES, not caps. No reader compares spend with
|
|
316
|
+
// any of them: `presets.ts` maps the preset to an environment name and
|
|
317
|
+
// nothing else reads these keys. Calling them "cost caps" told a
|
|
318
|
+
// reader they bounded something, which is why the label says what they
|
|
319
|
+
// are — ADR-279 removed the ceilings nobody set, and a figure nobody
|
|
320
|
+
// enforces is the same error one layer up.
|
|
321
|
+
print(' preset cost figures (shown, NOT enforced — nothing compares spend with these):');
|
|
322
|
+
if (Object.keys(cost).length > 0) {
|
|
323
|
+
print(
|
|
324
|
+
` preset: daily $${fmt(cost['daily_max_usd'])} · ` +
|
|
325
|
+
`weekly $${fmt(cost['weekly_max_usd'])} · ` +
|
|
326
|
+
`monthly $${fmt(cost['monthly_max_usd'])}`,
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
if (Object.keys(mcp).length > 0) {
|
|
330
|
+
print(
|
|
331
|
+
` mcp: per-call $${fmt(mcp['per_call_max_usd'])} · ` +
|
|
332
|
+
`per-session $${fmt(mcp['per_session_max_usd'])}`,
|
|
333
|
+
);
|
|
334
|
+
}
|
|
319
335
|
}
|
|
336
|
+
// The figures that DO bound, beside the ones that do not, so the
|
|
337
|
+
// difference is visible in one screen rather than inferred.
|
|
338
|
+
printConfiguredBudgets(print, settings);
|
|
320
339
|
const autonomy = isPlainObject(knobs['autonomy']) ? (knobs['autonomy'] as Dict) : {};
|
|
321
340
|
if (Object.keys(autonomy).length > 0) {
|
|
322
341
|
print(` autonomy: default=${fmt(autonomy['default'])}`);
|
|
@@ -324,6 +343,52 @@ function _explain_config(project_root: string, as_json: boolean): number {
|
|
|
324
343
|
return 0;
|
|
325
344
|
}
|
|
326
345
|
|
|
346
|
+
/**
|
|
347
|
+
* Print the `cost.budgets` windows that actually bound, and their mode.
|
|
348
|
+
*
|
|
349
|
+
* Separate from the preset figures above because the two look alike and mean
|
|
350
|
+
* opposite things: a preset figure is printed and never read, while a
|
|
351
|
+
* configured budget is what `scripts/cost/budget.mjs` compares spend against
|
|
352
|
+
* and what `cost.enforcement: hard-stop` can refuse on. Printing them in one
|
|
353
|
+
* screen is the point of step 3.5 — a reader who sees only one of the two
|
|
354
|
+
* cannot tell which kind they are looking at.
|
|
355
|
+
*
|
|
356
|
+
* Takes the SAME resolved `settings` the profile/preset lines above already
|
|
357
|
+
* used (`_explain_config`'s `_load_user_settings(project_root)`), rather than
|
|
358
|
+
* an independent `load_agent_settings({ cwd: project_root })` call — tried and
|
|
359
|
+
* reverted: that second call enables the full project-root-to-cwd cascade
|
|
360
|
+
* (merged with the user-global layer), a DIFFERENT resolution view from the
|
|
361
|
+
* single project file the profile/preset lines read and from what the actual
|
|
362
|
+
* enforcing path (`scripts/cost/budget.mjs`, a plain CWD-relative single-file
|
|
363
|
+
* read with no cascade) compares spend against. Two independent reads of the
|
|
364
|
+
* same nominal setting can diverge; one shared value cannot.
|
|
365
|
+
*
|
|
366
|
+
* `0` and absent both mean unbounded (ADR-279), and the line says so rather
|
|
367
|
+
* than printing a bare zero that reads like a cap of nothing.
|
|
368
|
+
*/
|
|
369
|
+
export function printConfiguredBudgets(print: (s?: string) => void, settings: unknown): void {
|
|
370
|
+
const cost = isPlainObject(settings) && isPlainObject((settings as Dict)['cost'])
|
|
371
|
+
? ((settings as Dict)['cost'] as Dict)
|
|
372
|
+
: {};
|
|
373
|
+
const budgets = isPlainObject(cost['budgets']) ? (cost['budgets'] as Dict) : {};
|
|
374
|
+
const win = (k: string): string => {
|
|
375
|
+
const v = budgets[k];
|
|
376
|
+
return typeof v === 'number' && v > 0 ? `$${String(v)}` : 'unset';
|
|
377
|
+
};
|
|
378
|
+
const mode = typeof cost['enforcement'] === 'string' ? cost['enforcement'] : 'advisory';
|
|
379
|
+
const anySet = ['daily', 'weekly', 'monthly'].some((k) => win(k) !== 'unset');
|
|
380
|
+
print(
|
|
381
|
+
` configured cost.budgets (ENFORCED by the cost preflight when mode is hard-stop):`,
|
|
382
|
+
);
|
|
383
|
+
print(
|
|
384
|
+
` windows: daily ${win('daily')} · weekly ${win('weekly')} · ` +
|
|
385
|
+
`monthly ${win('monthly')} (mode: ${mode})`,
|
|
386
|
+
);
|
|
387
|
+
if (!anySet) {
|
|
388
|
+
print(' no window is set, so no ceiling on money applies (ADR-279).');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
327
392
|
/** Python `dict.get(k)` → value or None; renders as `str(value)` / `None`. */
|
|
328
393
|
function fmt(value: unknown): string {
|
|
329
394
|
if (value === null || value === undefined) return 'None';
|
|
@@ -487,13 +552,6 @@ function _explain_last(
|
|
|
487
552
|
as_json: boolean,
|
|
488
553
|
quiet: boolean,
|
|
489
554
|
): number {
|
|
490
|
-
const settings = _load_user_settings(project_root);
|
|
491
|
-
const explain_raw = settings['explain'];
|
|
492
|
-
const explain_cfg = isPlainObject(explain_raw) ? (explain_raw as Dict) : {};
|
|
493
|
-
if (explain_cfg['enable_last'] === false) {
|
|
494
|
-
print('explain last disabled by settings (explain.enable_last)');
|
|
495
|
-
return 0;
|
|
496
|
-
}
|
|
497
555
|
const target_state = state_file || path.join(project_root, '.work-state.json');
|
|
498
556
|
let trace: Dict;
|
|
499
557
|
try {
|
|
@@ -568,7 +626,7 @@ options:
|
|
|
568
626
|
--quiet suppress the trailing tip footer
|
|
569
627
|
|
|
570
628
|
exit codes:
|
|
571
|
-
0 trace rendered
|
|
629
|
+
0 trace rendered
|
|
572
630
|
1 no recent run found (state file missing or unreadable)
|
|
573
631
|
2 invocation error (bad project root, bad --state-file path)
|
|
574
632
|
`;
|