@event4u/agent-config 16.1.0 → 16.3.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.
Files changed (467) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Thin an INSTALLED Claude Code rule layer, in place, after the copy.
3
+ *
4
+ * `road-to-an-installed-layer-that-is-thinned` step 1.1. The global install step
5
+ * copies `dist/agent-src/rules` verbatim into `~/.claude/rules`
6
+ * (`install.ts::_copy_dir_dereferencing_symlinks`), so a consumer receives every
7
+ * rule body whether or not any trigger ever fires. The round that opened that
8
+ * roadmap measured a fresh install at 102 unconditional files and 338,225
9
+ * characters against a host that reports a 150,000 budget. Thinning existed —
10
+ * `project_thin_rules::build_thin` — but ran only on the maintainer projection,
11
+ * which no consumer receives.
12
+ *
13
+ * Three properties, each a defect this would otherwise reintroduce.
14
+ *
15
+ * **The stub is built from the SOURCE tree, never from the installed file.**
16
+ * `claudeRuleRewrite` runs immediately before this and reduces each installed
17
+ * rule to the host's activation vocabulary — `paths:` plus the ownership keys —
18
+ * dropping `description:` and the `triggers:` block. Those two are exactly what
19
+ * `thin_entry` reads to write the stub's matching signal, so a stub built from
20
+ * the rewritten file would carry an empty description and no `Fires on:` hint.
21
+ * Reading `<packageRoot>/dist/agent-src/rules/<name>` keeps the signal intact.
22
+ *
23
+ * **The installed frontmatter is kept verbatim.** The roadmap's step 1.1 ends
24
+ * "Ownership keys survive", and it is not decoration: `reap_tagged_orphans`
25
+ * calls the literal `package:` line "the only path with ownership proof
26
+ * independent of inventory history", and doctor's stale-orphan check reads the
27
+ * same tag. A stub that replaced the whole file would delete the reaper's only
28
+ * evidence for every thinned rule. So only the BODY is replaced; the header the
29
+ * copy and the rewrite produced is written back unchanged, which also preserves
30
+ * any `paths:` block — harmless, since a path-only rule is never thinned.
31
+ *
32
+ * **A user-modified file is skipped, not overwritten.** The preserved set comes
33
+ * from the conflict tracker, the same one the copy consulted. Step 1.3 requires
34
+ * an upgrade to preserve and report those files; thinning one would destroy an
35
+ * edit the copy had just declined to destroy.
36
+ *
37
+ * The rollback of step 1.2 needs nothing here, and the reason is the ordering.
38
+ *
39
+ * The install manifest records each deployed file's digest from the bytes ON
40
+ * DISK at manifest-write time, which is after this pass. So the next run sees
41
+ * `recorded-unchanged` for a thinned file, `decideDeployWrite` returns `write`,
42
+ * and the verbatim copy restores the full body. Switching the mode back to
43
+ * `eager-all` therefore un-thins by simply not running this pass — no inverse
44
+ * operation, and no stub left behind. The property that carries it is the
45
+ * ordering, which `tests/scripts/install_thin_layer.test.ts` pins directly.
46
+ *
47
+ * Side-effect-free apart from the writes it is asked to make. No CLI entry, no
48
+ * `process.exit` — this module is reachable from the `build:install-bundle`
49
+ * entry and `check_installer_import_purity` forbids both.
50
+ */
51
+ import * as fs from 'node:fs';
52
+ import * as path from 'node:path';
53
+ import * as os from 'node:os';
54
+ import { buildHostLimitRows, loadHostInstructionLimits, readLayer, renderHostLimitRows, } from '../scripts/_lib/installed_layer.js';
55
+ import { GLOBAL_RULE_DIRS, globalRuleLayerPath } from './globalRuleLayers.js';
56
+ import { manifest_path } from '../scripts/_lib/installed_tools.js';
57
+ import { NO_RECORDED_HASHES, readRecordedHashes } from './recordedOwnership.js';
58
+ import { absoluteBodyLinkPrefix, build_thin, split_frontmatter, } from '../scripts/_lib/thin_rules.js';
59
+ /**
60
+ * Replace the body of every thinnable rule in `rulesDir` with its stub.
61
+ *
62
+ * Idempotent: a layer already thinned is rewritten to byte-identical content,
63
+ * so a repeated install neither grows nor drifts.
64
+ */
65
+ export function thinInstalledRuleLayer(opts) {
66
+ const packageRoot = path.resolve(opts.packageRoot);
67
+ const bodySourceDir = path.join(packageRoot, 'dist', 'agent-src', 'rules');
68
+ const bodyLinkPrefix = absoluteBodyLinkPrefix(packageRoot);
69
+ const preserved = opts.preserved ?? new Set();
70
+ // Scope is `null` on purpose. The copy already applied the install's rule
71
+ // scope, so the files that EXIST in `rulesDir` are the scoped set; asking
72
+ // `build_thin` to resolve the scope a second time would be a second reader
73
+ // of the same decision, and the two could disagree. Anything the stub map
74
+ // names that is not on disk is simply out of scope and is reported as such.
75
+ const stubs = build_thin(bodySourceDir, null, null, null, { packageRoot, bodyLinkPrefix });
76
+ let thinned = 0;
77
+ let rewritten = 0;
78
+ let kept = 0;
79
+ let charsBefore = 0;
80
+ let charsAfter = 0;
81
+ const preservedHits = [];
82
+ const absent = [];
83
+ const failed = [];
84
+ for (const [name, stubText] of stubs) {
85
+ const target = path.join(opts.rulesDir, name);
86
+ let installed;
87
+ try {
88
+ installed = fs.readFileSync(target, 'utf-8');
89
+ }
90
+ catch (e) {
91
+ // ENOENT is the documented meaning of `absent` — the copy's rule
92
+ // scope did not place this rule here. Anything else (EACCES, EISDIR,
93
+ // EIO) is a FAILURE wearing a scoping outcome's clothes, and the
94
+ // receipt prints failures and does not print absences, so the two
95
+ // must not share a bucket.
96
+ if (e.code === 'ENOENT')
97
+ absent.push(name);
98
+ else
99
+ failed.push({ rule: name, reason: String(e) });
100
+ continue;
101
+ }
102
+ // KEPT-VS-THINNED IS DECIDED BY IDENTITY, NOT BY A CONTENT SNIFF.
103
+ // `build_thin` returns either a stub or the SOURCE TEXT VERBATIM, so
104
+ // the full-bodied branch is exactly "the map value equals the source
105
+ // file". Testing `is_thin_entry(stubText)` instead would misread a
106
+ // source rule whose own body happened to contain the marker — and that
107
+ // rule would then be written as `installedFrontmatter + fullSourceText`,
108
+ // duplicating the frontmatter block. Zero such rules ship today, which
109
+ // makes it latent rather than live, and `THIN_ENTRY_MARKER`'s own
110
+ // docstring argues against exactly this kind of inferred detection.
111
+ let sourceText;
112
+ try {
113
+ sourceText = fs.readFileSync(path.join(bodySourceDir, name), 'utf-8');
114
+ }
115
+ catch {
116
+ sourceText = null;
117
+ }
118
+ if (stubText === sourceText) {
119
+ // Kept full-bodied by `build_thin`'s own predicate — kernel,
120
+ // trigger-less, path-only, or a declared `no_stub` member. The
121
+ // installed copy is already the right shape; touching it would be
122
+ // this pass inventing a decision the projector did not make.
123
+ kept += 1;
124
+ charsBefore += installed.length;
125
+ charsAfter += installed.length;
126
+ continue;
127
+ }
128
+ if (preserved.has(path.resolve(target))) {
129
+ preservedHits.push(name);
130
+ charsBefore += installed.length;
131
+ charsAfter += installed.length;
132
+ continue;
133
+ }
134
+ const [frontmatter] = split_frontmatter(installed);
135
+ charsBefore += installed.length;
136
+ // `split_frontmatter` answers `['', text]` for a file that OPENS a
137
+ // frontmatter block and never closes it — a truncated write, a file
138
+ // ending exactly on the closing fence with no trailing newline, CRLF.
139
+ // Writing `'' + stub` there would delete the `package:` line this
140
+ // module's header calls the reaper's only evidence, which is the one
141
+ // corruption this pass could cause. A file that claims a block it does
142
+ // not have is left exactly as found and reported.
143
+ //
144
+ // The test is a REGEX rather than `startsWith('---')` because the
145
+ // claim can be preceded by a BOM or by leading whitespace, and either
146
+ // one took the prefix check's "no block here" branch straight into the
147
+ // write it exists to prevent.
148
+ if (frontmatter === '' && /^\uFEFF?[\s]*---/.test(installed)) {
149
+ failed.push({
150
+ rule: name,
151
+ reason: 'opens a frontmatter block that never closes — left untouched so its ' +
152
+ 'ownership keys survive',
153
+ });
154
+ charsAfter += installed.length;
155
+ continue;
156
+ }
157
+ const next = `${frontmatter}${stubText}`;
158
+ try {
159
+ if (next !== installed) {
160
+ fs.writeFileSync(target, next, 'utf-8');
161
+ rewritten += 1;
162
+ }
163
+ thinned += 1;
164
+ charsAfter += next.length;
165
+ }
166
+ catch (e) {
167
+ failed.push({ rule: name, reason: String(e) });
168
+ charsAfter += installed.length;
169
+ }
170
+ }
171
+ if (stubs.size === 0) {
172
+ // A ZERO-STUB MAP AND A ZERO-THINNABLE LAYER PRINT THE SAME RECEIPT, so
173
+ // the one that is a failure has to say so. `_globSortedMd` swallows an
174
+ // unreadable directory and answers `[]`, which is what a wrongly
175
+ // resolved package root produces — the hazard `ThinRoots` exists for.
176
+ // Without this the feature would be silently not applied behind a
177
+ // success-shaped line, and the installer's try/catch sees only throws.
178
+ failed.push({
179
+ rule: bodySourceDir,
180
+ reason: 'no rule bodies found to build stubs from — the layer was left full-bodied',
181
+ });
182
+ }
183
+ return {
184
+ thinned,
185
+ rewritten,
186
+ kept,
187
+ preserved: preservedHits,
188
+ absent,
189
+ failed,
190
+ bodyLinkPrefix,
191
+ charsBefore,
192
+ charsAfter,
193
+ };
194
+ }
195
+ /**
196
+ * One receipt line per outcome, for a caller that prints.
197
+ *
198
+ * Returns the lines rather than writing them, so the installer's `--quiet` and
199
+ * its progress-event emitter stay the only things deciding what a consumer sees.
200
+ */
201
+ export function describeThinInstalledLayer(res) {
202
+ const out = [];
203
+ out.push(res.rewritten === 0 && res.thinned > 0
204
+ ? ` claude-code: ${String(res.thinned)} rule(s) already thinned, ` +
205
+ `${String(res.kept)} kept full-bodied; ` +
206
+ `${String(res.charsAfter)} chars — nothing to rewrite`
207
+ : ` claude-code: thinned ${String(res.rewritten)} rule(s) to stubs, ` +
208
+ `${String(res.kept)} kept full-bodied; ` +
209
+ `${String(res.charsBefore)} -> ${String(res.charsAfter)} chars`);
210
+ if (res.preserved.length > 0) {
211
+ out.push(` claude-code: ${String(res.preserved.length)} rule(s) left full — you edited them ` +
212
+ `and they are preserved, never overwritten (${res.preserved.join(', ')})`);
213
+ }
214
+ for (const f of res.failed) {
215
+ out.push(` claude-code: ${f.rule}: could not write stub — ${f.reason}`);
216
+ }
217
+ return out;
218
+ }
219
+ /**
220
+ * The install receipt's instruction-budget block — step 1.4's "at install".
221
+ *
222
+ * The step asks for the limit, the split and the 80 % warning AT INSTALL, and
223
+ * the measurement existed only behind the standalone `installed_layer_report`
224
+ * CLI: `buildHostLimitRows`'s own docstring named "the install receipt" as the
225
+ * caller it was exported for, and that caller did not exist. A consumer whose
226
+ * layer is over budget learned it from the host, which is the notice the
227
+ * roadmap exists to remove.
228
+ *
229
+ * Global layers only, deliberately. The install writes `~/.claude/rules` and
230
+ * its siblings; a project layer is not what this run just changed, and folding
231
+ * one in would make the receipt's number disagree with the thing it is a
232
+ * receipt FOR.
233
+ *
234
+ * Never throws. A receipt that cannot be measured is silent rather than fatal —
235
+ * the deploy it describes has already happened correctly.
236
+ */
237
+ export function installReceiptBudgetLines(packageRoot, home = os.homedir()) {
238
+ try {
239
+ const recorded = (() => {
240
+ try {
241
+ return readRecordedHashes(manifest_path(packageRoot), packageRoot);
242
+ }
243
+ catch {
244
+ return NO_RECORDED_HASHES;
245
+ }
246
+ })();
247
+ const layers = [];
248
+ for (const host of Object.keys(GLOBAL_RULE_DIRS).sort()) {
249
+ const dir = globalRuleLayerPath(host, home);
250
+ if (dir === null)
251
+ continue;
252
+ layers.push(readLayer(host, 'global', dir, recorded));
253
+ }
254
+ const rows = buildHostLimitRows(layers, loadHostInstructionLimits());
255
+ return rows.length === 0 ? [] : renderHostLimitRows(rows).map((l) => ` ${l}`);
256
+ }
257
+ catch {
258
+ return [];
259
+ }
260
+ }
261
+ //# sourceMappingURL=installThinLayer.js.map
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Do the links inside an installed rule file resolve from where the install
3
+ * puts it?
4
+ *
5
+ * A rule body is authored in `src/rules/` and projected to
6
+ * `dist/agent-src/rules/`, where `](../guidelines/x.md)` resolves because the
7
+ * sibling directory is right there. The installer then copies a SUBSET of
8
+ * those sibling directories into the host's rule directory, so the same link
9
+ * resolves or does not depending on a list in `install.ts` that the rule
10
+ * author never sees. Nothing checked the two against each other.
11
+ *
12
+ * This module answers one question per link — resolved, or why not — against a
13
+ * deploy plan rather than against a materialised tree, so the audit costs a
14
+ * `statSync` per distinct target instead of a copy of 299 skills.
15
+ *
16
+ * Side-effect-free, no CLI entry, no `process.exit`.
17
+ */
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ /**
21
+ * Build a plan from `GLOBAL_DEPLOY_SOURCES`-shaped pairs.
22
+ *
23
+ * The empty destination (`cline` maps rules to the root) is deliberately kept:
24
+ * a rule installed at the root resolves `../x` differently, and silently
25
+ * dropping the entry would make this module answer a question about a layout
26
+ * that is not the one being installed.
27
+ */
28
+ export function deployPlanFrom(pairs) {
29
+ const plan = new Map();
30
+ for (const [source, dest] of pairs)
31
+ plan.set(dest, source);
32
+ return plan;
33
+ }
34
+ /** Markdown inline links, minus the ones that are not a path into the tree. */
35
+ export function relativeLinkTargets(markdown) {
36
+ const out = [];
37
+ for (const m of markdown.matchAll(/\]\(([^)\s]+)\)/g)) {
38
+ const target = m[1];
39
+ if (/^[a-z][a-z0-9+.-]*:/i.test(target))
40
+ continue; // http:, mailto:, etc.
41
+ if (target.startsWith('#'))
42
+ continue; // same-file anchor
43
+ if (target.startsWith('/'))
44
+ continue; // absolute — not ours to resolve
45
+ out.push(target);
46
+ }
47
+ return out;
48
+ }
49
+ /** Strip a trailing `#anchor`; a bare directory link keeps its trailing slash. */
50
+ function withoutAnchor(target) {
51
+ const hash = target.indexOf('#');
52
+ return hash === -1 ? target : target.slice(0, hash);
53
+ }
54
+ /**
55
+ * Audit one link written in a rule that the install places at
56
+ * `<install-root>/<rulesDest>/<rule>.md`.
57
+ */
58
+ export function auditLink(rule, target, rulesDest, plan, packageRoot) {
59
+ const bare = withoutAnchor(target);
60
+ // Resolve the link the way a reader does: from the installed file's own
61
+ // DIRECTORY — `rulesDest` is that directory, not the file — as a POSIX
62
+ // path relative to the install root. A sibling link (`[x](other.md)`, no
63
+ // `../`) therefore stays inside the rules directory, which is where the
64
+ // installer puts its sibling.
65
+ const fromDir = rulesDest === '' ? '.' : rulesDest;
66
+ const resolved = path.posix.normalize(path.posix.join(fromDir, bare));
67
+ if (resolved.startsWith('..')) {
68
+ return { rule, target, resolved_to: null, verdict: 'outside-install-root' };
69
+ }
70
+ const segments = resolved.split('/');
71
+ // Which deployed directory does this land in? Normally the first segment
72
+ // names it. When rules install at the install ROOT (`cline` maps them to
73
+ // `''`), there is no such segment: a sibling link like `](scope-control.md)`
74
+ // resolves to `scope-control.md`, whose first segment is a FILE NAME. Read
75
+ // literally that is `directory-not-deployed` for a file the install writes
76
+ // right beside the rule — 275 of cline's 523 links, every one of them fine.
77
+ // The `''` key exists in the plan precisely for this and could never be
78
+ // reached by a first-segment lookup.
79
+ const rootSource = plan.get('');
80
+ // The root entry answers for a BARE filename only. A link with a directory
81
+ // segment the plan does not carry is `directory-not-deployed`, the same as
82
+ // anywhere else — resolving it against the rules source would probe a path
83
+ // the install never writes and report `file-missing`, whose documented
84
+ // meaning ("the directory IS deployed") would then be false.
85
+ const useRoot = rootSource !== undefined && segments.length === 1;
86
+ const source = useRoot ? rootSource : plan.get(segments[0]);
87
+ const rest = useRoot ? segments : segments.slice(1);
88
+ if (source === undefined) {
89
+ return { rule, target, resolved_to: resolved, verdict: 'directory-not-deployed' };
90
+ }
91
+ // An empty `rest` means the link points at the deployed directory itself.
92
+ const onDisk = path.join(packageRoot, source, ...rest);
93
+ const exists = fs.existsSync(onDisk);
94
+ return {
95
+ rule,
96
+ target,
97
+ resolved_to: resolved,
98
+ verdict: exists ? 'resolved' : 'file-missing',
99
+ };
100
+ }
101
+ const EMPTY_COUNTS = () => ({
102
+ resolved: 0,
103
+ 'outside-install-root': 0,
104
+ 'directory-not-deployed': 0,
105
+ 'file-missing': 0,
106
+ });
107
+ /**
108
+ * Audit every link in every rule the plan installs.
109
+ *
110
+ * `packageRoot` is the package checkout the installer copies FROM; the rule
111
+ * bodies are read from the plan's own rules source, so the audit cannot drift
112
+ * from what is shipped.
113
+ */
114
+ export function auditInstalledRuleLinks(plan, packageRoot) {
115
+ const audits = [];
116
+ for (const [dest, source] of plan) {
117
+ if (!source.endsWith('/rules'))
118
+ continue;
119
+ const dir = path.join(packageRoot, source);
120
+ if (!fs.existsSync(dir))
121
+ continue;
122
+ const files = fs
123
+ .readdirSync(dir, { withFileTypes: true })
124
+ .filter((e) => !e.isDirectory() && e.name.endsWith('.md'))
125
+ .map((e) => e.name)
126
+ .sort();
127
+ for (const file of files) {
128
+ const rule = file.replace(/\.md$/, '');
129
+ const body = fs.readFileSync(path.join(dir, file), 'utf8');
130
+ for (const target of relativeLinkTargets(body)) {
131
+ audits.push(auditLink(rule, target, dest, plan, packageRoot));
132
+ }
133
+ }
134
+ }
135
+ const counts = EMPTY_COUNTS();
136
+ for (const a of audits)
137
+ counts[a.verdict] += 1;
138
+ const grouped = new Map();
139
+ for (const a of audits) {
140
+ if (a.verdict === 'resolved')
141
+ continue;
142
+ const key = a.resolved_to === null ? a.target.replace(/[^/]*$/, '') : a.resolved_to.split('/')[0];
143
+ const row = grouped.get(key);
144
+ if (row)
145
+ row.count += 1;
146
+ else
147
+ grouped.set(key, { count: 1, verdict: a.verdict });
148
+ }
149
+ const by_directory = [...grouped.entries()]
150
+ .map(([directory, v]) => ({ directory, count: v.count, verdict: v.verdict }))
151
+ .sort((a, b) => b.count - a.count || a.directory.localeCompare(b.directory));
152
+ return { audits, counts, by_directory };
153
+ }
154
+ /**
155
+ * Standing-text cost of the rewrite option, in characters.
156
+ *
157
+ * Option A of this roadmap's step 1.2: leave the install plan alone and
158
+ * rewrite every link to an absolute package path. Each unresolved link then
159
+ * grows by the absolute prefix minus the `../` it replaces — and it grows
160
+ * INSIDE a rule body, which is the text the host loads as instructions.
161
+ *
162
+ * `prefixChars` is the installed package root's own length, which is a
163
+ * property of the machine, so the caller supplies it and the report says which
164
+ * value it used.
165
+ */
166
+ export function rewriteOptionCost(report, prefixChars) {
167
+ const unresolved = report.audits.filter((a) => a.verdict !== 'resolved');
168
+ let total = 0;
169
+ for (const a of unresolved) {
170
+ // `../x` and `../../x` both become `<abs>/x`: the climb is replaced.
171
+ const climb = (a.target.match(/\.\.\//g) ?? []).length * 3;
172
+ total += prefixChars + 1 - climb;
173
+ }
174
+ return total;
175
+ }
176
+ //# sourceMappingURL=installedRuleLinks.js.map
@@ -59,6 +59,30 @@ export const USER_SCOPE_PATHS = {
59
59
  /**
60
60
  * Universal Anthropic-shaped skill bundle deployed to markdown-skills
61
61
  * tools. Mirrors `_CLAUDE_SKILL_BUNDLE` in the retired Python installer (ADR-200).
62
+ *
63
+ * NOT deploying `contexts/` and `guidelines/` here is a held decision, not an
64
+ * oversight — see the `rule-link-targets-change-the-frozen-install-abi` blocker
65
+ * on `road-to-rule-triggers-and-links-that-hold`.
66
+ *
67
+ * A rule is authored against the package tree and projected verbatim, so
68
+ * `](../guidelines/x.md)` resolves in `dist/agent-src/rules/` and then does
69
+ * not resolve in the install, because this table does not carry those two
70
+ * directories. Measured by `report_installed_rule_links` on 2026-10-03: 136 of
71
+ * 523 links in an installed Claude rule directory point nowhere, 112 of them
72
+ * into exactly those two. Adding them is the cheaper of the two repairs on the
73
+ * budget that is scarce — 0 standing characters against **5,152** for rewriting
74
+ * those same 112 links to absolute package paths, at a 48-character install
75
+ * prefix (the report prints the prefix it used; the figure scales with it).
76
+ *
77
+ * The totals were 160 of 550 when this was first measured and 158 of 545 on
78
+ * 2026-10-02; what fell since is the OTHER population — repo-tree link forms no
79
+ * install ever held — so the 112 this paragraph is about has not moved.
80
+ *
81
+ * It is held because this table is part of the FROZEN install ABI
82
+ * (`docs/contracts/install-layout.md`), and any change to it owes an
83
+ * `install_layout_version` bump plus a deprecation window: old and new shape
84
+ * side by side for a minor cycle, with in-place migration. That is a release
85
+ * commitment, not an implementation detail, so it is the owner's to make.
62
86
  */
63
87
  const CLAUDE_SKILL_BUNDLE = [
64
88
  ['dist/agent-src/rules', 'rules'],
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "discovery": {
3
- "artefact_count": 625,
3
+ "artefact_count": 627,
4
4
  "scanner_version": "de0a22b4ac4c"
5
5
  },
6
- "generated_at": "2026-09-28",
6
+ "generated_at": "2026-10-05",
7
7
  "package": {
8
8
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) \u2014 every claim machine-checked, including the counts in these badges.",
9
9
  "homepage": "https://event4u-app.github.io/agent-config",
10
10
  "name": "@event4u/agent-config",
11
11
  "repository": "https://github.com/event4u-app/agent-config",
12
- "version": "16.1.0"
12
+ "version": "16.3.0"
13
13
  },
14
14
  "registries": [
15
15
  {
@@ -9,12 +9,12 @@
9
9
  "transport": {
10
10
  "type": "stdio"
11
11
  },
12
- "version": "16.1.0"
12
+ "version": "16.3.0"
13
13
  }
14
14
  ],
15
15
  "repository": {
16
16
  "source": "github",
17
17
  "url": "https://github.com/event4u-app/agent-config"
18
18
  },
19
- "version": "16.1.0"
19
+ "version": "16.3.0"
20
20
  }