@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
|
@@ -31,9 +31,10 @@
|
|
|
31
31
|
* 1. `ai_team` absent → defaults. Non-mapping → error.
|
|
32
32
|
* 2. Unknown keys under `ai_team` are rejected — a typo must never
|
|
33
33
|
* silently disable a gate (`allow_delegate` misspelled = delegation
|
|
34
|
-
* stays off AND the load fails loudly). `enabled`
|
|
35
|
-
* deliberate
|
|
36
|
-
*
|
|
34
|
+
* stays off AND the load fails loudly). `enabled` and
|
|
35
|
+
* `suppress_setup_hint` are the deliberate exceptions: retired keys,
|
|
36
|
+
* accepted, untyped, ignored, so a leftover line never fails `/team`.
|
|
37
|
+
* 3. `allow_delegate` is a boolean.
|
|
37
38
|
* 4. `model` is a non-empty string. `'auto'` = pass no `--model` flag
|
|
38
39
|
* (the codex CLI default applies); any other value passes through
|
|
39
40
|
* verbatim.
|
|
@@ -63,7 +64,6 @@ export interface AiTeamConfig {
|
|
|
63
64
|
readonly model: string;
|
|
64
65
|
readonly allow_delegate: boolean;
|
|
65
66
|
readonly max_calls_per_day: number;
|
|
66
|
-
readonly suppress_setup_hint: boolean;
|
|
67
67
|
readonly review_gate: AiTeamReviewGateConfig;
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -78,7 +78,6 @@ export const AI_TEAM_DEFAULTS: AiTeamConfig = Object.freeze({
|
|
|
78
78
|
model: 'auto',
|
|
79
79
|
allow_delegate: false,
|
|
80
80
|
max_calls_per_day: 50,
|
|
81
|
-
suppress_setup_hint: false,
|
|
82
81
|
review_gate: AI_TEAM_REVIEW_GATE_DEFAULTS,
|
|
83
82
|
});
|
|
84
83
|
|
|
@@ -93,17 +92,18 @@ const _KNOWN_KEYS: ReadonlySet<string> = new Set([
|
|
|
93
92
|
'model',
|
|
94
93
|
'allow_delegate',
|
|
95
94
|
'max_calls_per_day',
|
|
96
|
-
'suppress_setup_hint',
|
|
97
95
|
'review_gate',
|
|
98
96
|
]);
|
|
99
97
|
|
|
100
98
|
/**
|
|
101
|
-
* Deleted
|
|
102
|
-
* Never added to `_KNOWN_KEYS` —
|
|
103
|
-
* read into `AiTeamConfig`;
|
|
99
|
+
* Deleted keys accepted-and-ignored for migration grace (see module docstring).
|
|
100
|
+
* Never added to `_KNOWN_KEYS` — they carry no validated type and are never
|
|
101
|
+
* read into `AiTeamConfig`; they exist in this set only so the unknown-key
|
|
104
102
|
* loop below does not fail-closed an existing project's leftover value.
|
|
103
|
+
* `suppress_setup_hint` is the shipped template's own line, so every install
|
|
104
|
+
* that ran the wizard carries it.
|
|
105
105
|
*/
|
|
106
|
-
const _DELETED_KEYS: ReadonlySet<string> = new Set(['enabled']);
|
|
106
|
+
const _DELETED_KEYS: ReadonlySet<string> = new Set(['enabled', 'suppress_setup_hint']);
|
|
107
107
|
|
|
108
108
|
const _KNOWN_REVIEW_GATE_KEYS: ReadonlySet<string> = new Set([
|
|
109
109
|
'managed',
|
|
@@ -205,11 +205,6 @@ export function build_ai_team_config(raw: unknown): AiTeamConfig {
|
|
|
205
205
|
}
|
|
206
206
|
|
|
207
207
|
const allow_delegate = _requireBool(raw, 'allow_delegate', AI_TEAM_DEFAULTS.allow_delegate);
|
|
208
|
-
const suppress_setup_hint = _requireBool(
|
|
209
|
-
raw,
|
|
210
|
-
'suppress_setup_hint',
|
|
211
|
-
AI_TEAM_DEFAULTS.suppress_setup_hint,
|
|
212
|
-
);
|
|
213
208
|
|
|
214
209
|
let model = AI_TEAM_DEFAULTS.model;
|
|
215
210
|
if ('model' in raw) {
|
|
@@ -236,7 +231,7 @@ export function build_ai_team_config(raw: unknown): AiTeamConfig {
|
|
|
236
231
|
|
|
237
232
|
const review_gate = _build_review_gate('review_gate' in raw ? raw['review_gate'] : undefined);
|
|
238
233
|
|
|
239
|
-
return { model, allow_delegate, max_calls_per_day,
|
|
234
|
+
return { model, allow_delegate, max_calls_per_day, review_gate };
|
|
240
235
|
}
|
|
241
236
|
|
|
242
237
|
/**
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* quietly until the gate means nothing. Cross-pack pairs never block — a
|
|
31
31
|
* cross-pack merge changes install shape and is a different decision.
|
|
32
32
|
*/
|
|
33
|
+
import { createHash } from 'node:crypto';
|
|
33
34
|
import * as fs from 'node:fs';
|
|
34
35
|
import * as path from 'node:path';
|
|
35
36
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
@@ -47,6 +48,7 @@ export const OUT_MD_NAME = 'skill-overlap.md';
|
|
|
47
48
|
export const OUT_JSON = path.join(REPORT_DIR, OUT_JSON_NAME);
|
|
48
49
|
export const OUT_MD = path.join(REPORT_DIR, OUT_MD_NAME);
|
|
49
50
|
export const ALLOWLIST = path.join(ROOT, 'src', 'scripts', 'audit_skill_overlap_allowlist.json');
|
|
51
|
+
export const CROSS_CACHE_NAME = 'neighbour-overlap.json';
|
|
50
52
|
export const ALLOWLIST_CAP = 20;
|
|
51
53
|
// re.compile(r"^---\n(.*?)\n---", re.DOTALL) — used with .search (anywhere).
|
|
52
54
|
const FM_RE = /^---\n([\s\S]*?)\n---/m;
|
|
@@ -68,6 +70,8 @@ type Json = any;
|
|
|
68
70
|
interface Skill {
|
|
69
71
|
name: string;
|
|
70
72
|
relpath: string;
|
|
73
|
+
/** Absolute `SKILL.md` path — the key a cross-root result is returned under. */
|
|
74
|
+
abspath: string;
|
|
71
75
|
packs: Set<string>;
|
|
72
76
|
vector: Map<string, number>;
|
|
73
77
|
}
|
|
@@ -178,6 +182,7 @@ export function _parse(md: string, field: Field = 'body'): Skill {
|
|
|
178
182
|
return {
|
|
179
183
|
name: name ? String(name) : path.basename(path.dirname(md)),
|
|
180
184
|
relpath: _relPosix(md, ROOT),
|
|
185
|
+
abspath: path.resolve(md),
|
|
181
186
|
packs: Array.isArray(packsVal) ? new Set(packsVal.map((x) => String(x))) : new Set(),
|
|
182
187
|
vector: _keyword_vector(source),
|
|
183
188
|
};
|
|
@@ -322,6 +327,193 @@ export function find_pairs(skills: Skill[], threshold: number): Pair[] {
|
|
|
322
327
|
return stableSort(pairs, (p) => [p.same_domain ? 0 : 1, -p.similarity]);
|
|
323
328
|
}
|
|
324
329
|
|
|
330
|
+
/**
|
|
331
|
+
* One neighbour skill against one of ours, at or above the threshold.
|
|
332
|
+
*
|
|
333
|
+
* `neighbour_path` is absolute, because the two sides live under different roots
|
|
334
|
+
* and a repo-relative path would be a `../..` string that no caller can key on.
|
|
335
|
+
*/
|
|
336
|
+
export interface CrossPair {
|
|
337
|
+
neighbour: string;
|
|
338
|
+
neighbour_path: string;
|
|
339
|
+
ours: string;
|
|
340
|
+
similarity: number;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Cross-root pairs: every NEIGHBOUR skill against every one of OURS.
|
|
345
|
+
*
|
|
346
|
+
* NOT `find_pairs` over a merged list, and the difference is the whole point of
|
|
347
|
+
* the mode. `find_pairs` is `combinations(skills, 2)` over one corpus, so a
|
|
348
|
+
* merged list would also compare our skills against each other — re-deriving the
|
|
349
|
+
* same-corpus report under a different name, at the cost of the pairs the caller
|
|
350
|
+
* actually asked for being buried in it. This emits exactly the cross product,
|
|
351
|
+
* which is also the cheaper half: |neighbours| × |ours| rather than C(n+m, 2).
|
|
352
|
+
*
|
|
353
|
+
* The THRESHOLD is the caller's and defaults to {@link OVERLAP_THRESHOLD} — the
|
|
354
|
+
* same 0.70 every historical same-corpus report is calibrated against. Reusing it
|
|
355
|
+
* is deliberate: a second, softer bar invented for neighbours would make
|
|
356
|
+
* `compat: overlapping` mean something no existing number can be compared to.
|
|
357
|
+
*/
|
|
358
|
+
export function crossRootPairs(
|
|
359
|
+
neighbourRoot: string,
|
|
360
|
+
ourRoot: string,
|
|
361
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
362
|
+
field: Field = 'body',
|
|
363
|
+
): CrossPair[] {
|
|
364
|
+
return crossPairsForFiles(skillMdsUnder(neighbourRoot), ourRoot, threshold, field);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Non-archived `SKILL.md` paths under a root, in the collector's own order. */
|
|
368
|
+
export function skillMdsUnder(root: string): string[] {
|
|
369
|
+
return _rglobSkillMd(root).filter((md) => !md.split(path.sep).includes('_archive'));
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* The same cross product, over an EXPLICIT neighbour file list.
|
|
374
|
+
*
|
|
375
|
+
* This is the shape the census actually needs, and the root-taking wrapper above
|
|
376
|
+
* is the convenience layer rather than the other way round. A census's neighbour
|
|
377
|
+
* skills are the UNCLAIMED entries of two roots that also hold claimed ones —
|
|
378
|
+
* `agent-config install` writes our own skills into `~/.claude/skills` — so
|
|
379
|
+
* pairing a whole root would compare this package's installed copies against its
|
|
380
|
+
* own source tree and report the install as an overlap.
|
|
381
|
+
*/
|
|
382
|
+
export function crossPairsForFiles(
|
|
383
|
+
neighbourFiles: readonly string[],
|
|
384
|
+
ourRoot: string,
|
|
385
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
386
|
+
field: Field = 'body',
|
|
387
|
+
): CrossPair[] {
|
|
388
|
+
const theirs: Skill[] = [];
|
|
389
|
+
for (const md of neighbourFiles) {
|
|
390
|
+
try {
|
|
391
|
+
theirs.push(_parse(md, field));
|
|
392
|
+
} catch {
|
|
393
|
+
// Unreadable neighbour file: not a pair, and not a crash.
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const ours = collect(ourRoot, field);
|
|
397
|
+
const out: CrossPair[] = [];
|
|
398
|
+
for (const n of theirs) {
|
|
399
|
+
for (const o of ours) {
|
|
400
|
+
const sim = _cosine(n.vector, o.vector);
|
|
401
|
+
if (sim < threshold) continue;
|
|
402
|
+
out.push({
|
|
403
|
+
neighbour: n.name,
|
|
404
|
+
neighbour_path: n.abspath,
|
|
405
|
+
ours: o.name,
|
|
406
|
+
similarity: pyRound(sim, 3),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return stableSort(out, (p) => [-p.similarity]);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Cross-root pairs folded the way the census reads them: highest-scoring hit per
|
|
415
|
+
* neighbour `SKILL.md`, with every our-skill name that crossed the bar.
|
|
416
|
+
*/
|
|
417
|
+
export function crossRootOverlapMap(
|
|
418
|
+
pairs: readonly CrossPair[],
|
|
419
|
+
): Map<string, { names: string[]; similarity: number }> {
|
|
420
|
+
const out = new Map<string, { names: string[]; similarity: number }>();
|
|
421
|
+
for (const p of pairs) {
|
|
422
|
+
const hit = out.get(p.neighbour_path);
|
|
423
|
+
if (hit === undefined) {
|
|
424
|
+
out.set(p.neighbour_path, { names: [p.ours], similarity: p.similarity });
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
if (!hit.names.includes(p.ours)) hit.names.push(p.ours);
|
|
428
|
+
if (p.similarity > hit.similarity) hit.similarity = p.similarity;
|
|
429
|
+
}
|
|
430
|
+
for (const hit of out.values()) hit.names.sort();
|
|
431
|
+
return out;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* The census digest the cross-root cache is keyed by.
|
|
436
|
+
*
|
|
437
|
+
* Over the INPUTS and nothing else: every skill's absolute path and the sha256
|
|
438
|
+
* of its bytes, on both sides, plus the threshold and the field. Risk-register
|
|
439
|
+
* row 3 is why a cache exists at all — a pairwise pass per prompt is not a
|
|
440
|
+
* hook-budget shape — and keying it on the bytes is what makes "a changed digest
|
|
441
|
+
* rescans first" true rather than aspirational. A key over NAMES alone would
|
|
442
|
+
* hand a stale score to a body that was rewritten underneath it.
|
|
443
|
+
*/
|
|
444
|
+
export function censusDigest(
|
|
445
|
+
neighbourFiles: readonly string[],
|
|
446
|
+
ourRoot: string,
|
|
447
|
+
threshold: number,
|
|
448
|
+
field: Field = 'body',
|
|
449
|
+
): string {
|
|
450
|
+
const h = createHash('sha256');
|
|
451
|
+
h.update(`${String(threshold)}\n${field}\n`);
|
|
452
|
+
const sides: ReadonlyArray<readonly string[]> = [
|
|
453
|
+
[...neighbourFiles].sort(),
|
|
454
|
+
skillMdsUnder(ourRoot),
|
|
455
|
+
];
|
|
456
|
+
for (const side of sides) {
|
|
457
|
+
h.update('side\n');
|
|
458
|
+
for (const md of side) {
|
|
459
|
+
let bytes: Buffer;
|
|
460
|
+
try {
|
|
461
|
+
bytes = fs.readFileSync(md);
|
|
462
|
+
} catch {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
h.update(path.resolve(md));
|
|
466
|
+
h.update('\0');
|
|
467
|
+
h.update(createHash('sha256').update(bytes).digest('hex'));
|
|
468
|
+
h.update('\n');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return h.digest('hex');
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export interface CrossCache {
|
|
475
|
+
schema_version: 1;
|
|
476
|
+
digest: string;
|
|
477
|
+
threshold: number;
|
|
478
|
+
pairs: CrossPair[];
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Cross-root pairs, recomputed only when the census digest moved.
|
|
483
|
+
*
|
|
484
|
+
* A cache miss is never silent: the result says `cached: false`, so a caller
|
|
485
|
+
* reporting "this came from the cache" cannot be reporting it about a pass that
|
|
486
|
+
* actually ran. A write failure is not fatal — the pairs are correct either way,
|
|
487
|
+
* and refusing to answer because a report directory is read-only would turn a
|
|
488
|
+
* cache into a dependency.
|
|
489
|
+
*/
|
|
490
|
+
export function cachedCrossRootPairs(
|
|
491
|
+
neighbourFiles: readonly string[],
|
|
492
|
+
ourRoot: string,
|
|
493
|
+
cacheFile: string,
|
|
494
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
495
|
+
field: Field = 'body',
|
|
496
|
+
): { pairs: CrossPair[]; digest: string; cached: boolean } {
|
|
497
|
+
const digest = censusDigest(neighbourFiles, ourRoot, threshold, field);
|
|
498
|
+
try {
|
|
499
|
+
const parsed = JSON.parse(fs.readFileSync(cacheFile, 'utf-8')) as Partial<CrossCache>;
|
|
500
|
+
if (parsed.digest === digest && Array.isArray(parsed.pairs)) {
|
|
501
|
+
return { pairs: parsed.pairs as CrossPair[], digest, cached: true };
|
|
502
|
+
}
|
|
503
|
+
} catch {
|
|
504
|
+
// No cache, or an unreadable one: compute.
|
|
505
|
+
}
|
|
506
|
+
const pairs = crossPairsForFiles(neighbourFiles, ourRoot, threshold, field);
|
|
507
|
+
const payload: CrossCache = { schema_version: 1, digest, threshold, pairs };
|
|
508
|
+
try {
|
|
509
|
+
fs.mkdirSync(path.dirname(cacheFile), { recursive: true });
|
|
510
|
+
fs.writeFileSync(cacheFile, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
511
|
+
} catch {
|
|
512
|
+
// A cache that cannot be written is still a correct answer.
|
|
513
|
+
}
|
|
514
|
+
return { pairs, digest, cached: false };
|
|
515
|
+
}
|
|
516
|
+
|
|
325
517
|
/** Stable sort by a tuple-of-numbers key (Python tuple compare). */
|
|
326
518
|
function stableSort<T>(arr: T[], key: (x: T) => number[]): T[] {
|
|
327
519
|
return arr
|
|
@@ -484,6 +676,9 @@ class FloatTag {
|
|
|
484
676
|
export function main(argv: string[] | null = null): number {
|
|
485
677
|
const args = parse_args(argv ?? process.argv.slice(2));
|
|
486
678
|
const root = args.root ?? _default_skill_root();
|
|
679
|
+
if (args.neighbourRoot !== undefined) {
|
|
680
|
+
return _mainCrossRoot(args, root);
|
|
681
|
+
}
|
|
487
682
|
const skills = collect(root, args.field);
|
|
488
683
|
try {
|
|
489
684
|
assertScanned({
|
|
@@ -570,6 +765,55 @@ export function main(argv: string[] | null = null): number {
|
|
|
570
765
|
return 1;
|
|
571
766
|
}
|
|
572
767
|
|
|
768
|
+
/**
|
|
769
|
+
* `--neighbour-root` — the cross-root pair mode.
|
|
770
|
+
*
|
|
771
|
+
* A SECOND QUESTION, not a second answer to the first. The same-corpus report
|
|
772
|
+
* asks "are two of our skills so alike that one should absorb the other", and a
|
|
773
|
+
* merge is the action it leads to. This asks "is a skill another package
|
|
774
|
+
* installed close enough to one of ours that a reader of the route line needs to
|
|
775
|
+
* know", and NOTHING is merged, removed or suppressed on the answer — the
|
|
776
|
+
* neighbour is not ours to merge. So it writes its own artifact and leaves
|
|
777
|
+
* `skill-overlap.json` alone.
|
|
778
|
+
*
|
|
779
|
+
* Exit 0 always. A finding here is a report; `--strict` belongs to the
|
|
780
|
+
* same-corpus mode, where the pair is between two files this package owns.
|
|
781
|
+
*/
|
|
782
|
+
function _mainCrossRoot(args: Args, ourRoot: string): number {
|
|
783
|
+
const neighbourRoot = args.neighbourRoot as string;
|
|
784
|
+
const outDir = args.outDir ?? REPORT_DIR;
|
|
785
|
+
const cacheFile = args.crossCache ?? path.join(outDir, CROSS_CACHE_NAME);
|
|
786
|
+
const { pairs, digest, cached } = cachedCrossRootPairs(
|
|
787
|
+
skillMdsUnder(neighbourRoot),
|
|
788
|
+
ourRoot,
|
|
789
|
+
cacheFile,
|
|
790
|
+
args.threshold,
|
|
791
|
+
args.field,
|
|
792
|
+
);
|
|
793
|
+
const theirs = collect(neighbourRoot, args.field);
|
|
794
|
+
// The counts line the gate-coverage contract asks for, on stderr like its
|
|
795
|
+
// sibling, so the report body on stdout stays machine-readable.
|
|
796
|
+
process.stderr.write(`scanned: ${String(theirs.length)}\n`);
|
|
797
|
+
if (!args.quiet) {
|
|
798
|
+
process.stdout.write(
|
|
799
|
+
`\u2705 Neighbour overlap: ${theirs.length} neighbour skill(s) \u00d7 ` +
|
|
800
|
+
`${collect(ourRoot, args.field).length} of ours, ${pairs.length} pair(s) ` +
|
|
801
|
+
`\u2265 ${_pct(args.threshold)} (${cached ? 'from cache' : 'recomputed'}).\n`,
|
|
802
|
+
);
|
|
803
|
+
process.stdout.write(` census digest: ${digest.slice(0, 12)}\n`);
|
|
804
|
+
process.stdout.write(` cache: ${_relPosix(cacheFile, ROOT)}\n`);
|
|
805
|
+
}
|
|
806
|
+
const byPath = crossRootOverlapMap(pairs);
|
|
807
|
+
for (const skill of theirs) {
|
|
808
|
+
const hit = byPath.get(skill.abspath);
|
|
809
|
+
if (hit === undefined) continue;
|
|
810
|
+
process.stdout.write(
|
|
811
|
+
` ${hit.similarity.toFixed(3)} ${skill.name} also: ${hit.names.join(', ')}\n`,
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
return 0;
|
|
815
|
+
}
|
|
816
|
+
|
|
573
817
|
/** Order-independent key for an unordered pair. */
|
|
574
818
|
export function _pairKey(a: string, b: string): string {
|
|
575
819
|
return a < b ? `${a}::${b}` : `${b}::${a}`;
|
|
@@ -662,6 +906,10 @@ interface Args {
|
|
|
662
906
|
strict: boolean;
|
|
663
907
|
/** Allowlist path override (tests); `undefined` = the shipped file. */
|
|
664
908
|
allowlist?: string;
|
|
909
|
+
/** Cross-root mode: the NEIGHBOUR tree to pair against `--root`. */
|
|
910
|
+
neighbourRoot?: string;
|
|
911
|
+
/** Cross-root cache path; `undefined` = `<out-dir>/neighbour-overlap.json`. */
|
|
912
|
+
crossCache?: string;
|
|
665
913
|
/** Which text the vector is built from. `description` is NON-canonical. */
|
|
666
914
|
field: Field;
|
|
667
915
|
}
|
|
@@ -698,6 +946,19 @@ export function parse_args(argv: string[]): Args {
|
|
|
698
946
|
} else if (a === '--threshold' || a.startsWith('--threshold=')) {
|
|
699
947
|
const inline = a.startsWith('--threshold=') ? a.slice('--threshold='.length) : undefined;
|
|
700
948
|
args.threshold = Number(takeValue('--threshold', inline, () => argv[++i]));
|
|
949
|
+
} else if (a === '--neighbour-root' || a.startsWith('--neighbour-root=')) {
|
|
950
|
+
const inline = a.startsWith('--neighbour-root=')
|
|
951
|
+
? a.slice('--neighbour-root='.length)
|
|
952
|
+
: undefined;
|
|
953
|
+
args.neighbourRoot = path.resolve(
|
|
954
|
+
ROOT,
|
|
955
|
+
takeValue('--neighbour-root', inline, () => argv[++i]),
|
|
956
|
+
);
|
|
957
|
+
} else if (a === '--cross-cache' || a.startsWith('--cross-cache=')) {
|
|
958
|
+
const inline = a.startsWith('--cross-cache=')
|
|
959
|
+
? a.slice('--cross-cache='.length)
|
|
960
|
+
: undefined;
|
|
961
|
+
args.crossCache = path.resolve(ROOT, takeValue('--cross-cache', inline, () => argv[++i]));
|
|
701
962
|
} else if (a === '--root' || a.startsWith('--root=')) {
|
|
702
963
|
const inline = a.startsWith('--root=') ? a.slice('--root='.length) : undefined;
|
|
703
964
|
args.root = path.resolve(ROOT, takeValue('--root', inline, () => argv[++i]));
|
|
@@ -3,10 +3,15 @@
|
|
|
3
3
|
* Audit the user-type axis frontmatter coverage (step-9 Phase 4).
|
|
4
4
|
*
|
|
5
5
|
* Ported from the retired Python `src/scripts/audit_user_type_axis.py` (ADR-200,
|
|
6
|
-
* Phase 8 / Wave 8a). The CLI contract is pinned —
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Phase 8 / Wave 8a). The CLI contract is pinned — `--quiet`, exit code (1
|
|
7
|
+
* when orphans exist, else 0), the stdout split, byte-identical stdout
|
|
8
|
+
* summary, AND byte-identical generated Markdown report. Stdlib-only — no YAML
|
|
9
|
+
* dependency.
|
|
10
|
+
*
|
|
11
|
+
* `--write` (2026-10-07) is the one deliberate addition: the report is written
|
|
12
|
+
* ONLY under it. Every run used to rewrite the tracked report, so the
|
|
13
|
+
* `lint-user-type-axis` task — a read — dirtied the working tree. The lint
|
|
14
|
+
* reads; `task regen-user-type-axis-report` writes.
|
|
10
15
|
*
|
|
11
16
|
* Two checks across `src/skills/`:
|
|
12
17
|
*
|
|
@@ -242,6 +247,7 @@ export function _render_report(
|
|
|
242
247
|
|
|
243
248
|
export function main(argv: string[]): number {
|
|
244
249
|
const quiet = argv.includes('--quiet');
|
|
250
|
+
const write = argv.includes('--write');
|
|
245
251
|
// Scope assertion: the orphan/unused verdict is a set difference against
|
|
246
252
|
// the skills corpus, so an unreadable corpus does not yield "no orphans",
|
|
247
253
|
// it yields a vacuous answer that looks identical to a clean one.
|
|
@@ -267,9 +273,11 @@ export function main(argv: string[]): number {
|
|
|
267
273
|
const orphans = new Set<string>([...used].filter((v) => !declared.has(v)));
|
|
268
274
|
const unused = new Set<string>([...declared].filter((v) => !used.has(v)));
|
|
269
275
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
276
|
+
if (write) {
|
|
277
|
+
const report = _render_report(declared, byValue, orphans, unused);
|
|
278
|
+
fs.mkdirSync(path.dirname(REPORT_PATH), { recursive: true });
|
|
279
|
+
fs.writeFileSync(REPORT_PATH, report, 'utf-8');
|
|
280
|
+
}
|
|
273
281
|
|
|
274
282
|
if (!quiet) {
|
|
275
283
|
process.stdout.write(
|
|
@@ -283,7 +291,11 @@ export function main(argv: string[]): number {
|
|
|
283
291
|
if (unused.size > 0) {
|
|
284
292
|
process.stdout.write(' warn unused: ' + _sorted(unused).join(', ') + '\n');
|
|
285
293
|
}
|
|
286
|
-
process.stdout.write(
|
|
294
|
+
process.stdout.write(
|
|
295
|
+
write
|
|
296
|
+
? ` report: ${_relativeToPosix(REPORT_PATH, REPO_ROOT)}\n`
|
|
297
|
+
: ' report: not written (pass --write to regenerate it)\n',
|
|
298
|
+
);
|
|
287
299
|
}
|
|
288
300
|
|
|
289
301
|
if (orphans.size === 0) {
|