@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 @@
1
+ 4db51136b6f98bb8779752e29d0a0db9309176727875ec7bf3aba82e4466c686 dispatch.js
@@ -180,6 +180,19 @@ export function _expanded_pattern_count(pattern) {
180
180
  }
181
181
  /** Host-documented budget for one rule's whole `paths:` list. */
182
182
  export const CLAUDE_PATHS_PATTERN_BUDGET = 1000;
183
+ /**
184
+ * The two trigger keys `derive_trigger_globs` turns into a host glob. Kept
185
+ * beside it deliberately: the day a third path-shaped key is added there, this
186
+ * set is the other half of the same edit, and a reader looking at either one
187
+ * sees the pair.
188
+ */
189
+ const PATH_SHAPED_TRIGGER_KEYS = new Set(['file_pattern', 'path_prefix']);
190
+ /**
191
+ * Keys on a trigger object that match nothing. `reason:` documents why the
192
+ * trigger exists; counting it would make every annotated path trigger look
193
+ * mixed and scope nothing at all.
194
+ */
195
+ const NON_MATCHING_TRIGGER_KEYS = new Set(['reason']);
183
196
  /**
184
197
  * Does this rule declare any trigger that is NOT path-shaped?
185
198
  *
@@ -191,6 +204,18 @@ export const CLAUDE_PATHS_PATTERN_BUDGET = 1000;
191
204
  * rule loads unconditionally. The emitter fed both semantics from one list, so
192
205
  * a rule that declared keywords *and* one path glob silently became
193
206
  * path-gated-only on Claude.
207
+ *
208
+ * **The test is a negation, not a list of non-path kinds**, and the difference
209
+ * is not stylistic. The predicate used to enumerate `keyword` and `phrase`,
210
+ * which left `command` — a prompt route like any other — uncounted:
211
+ * `roadmap-progress-sync` declares one `path_prefix` and three `command`
212
+ * triggers, so it was emitted with an exclusive `paths:` and its three command
213
+ * routes never fired on this host. A list can only ever be as current as its
214
+ * last edit; the schema's `additionalProperties: false` means a new match key
215
+ * arrives as a deliberate schema change, and until someone teaches
216
+ * `derive_trigger_globs` to make a glob from it, treating it as promptable is
217
+ * the fail-safe reading — the rule stays unconditional rather than silently
218
+ * narrowing to a path it does not have.
194
219
  */
195
220
  export function _has_non_path_trigger(meta) {
196
221
  const triggers = meta['triggers'];
@@ -200,10 +225,24 @@ export function _has_non_path_trigger(meta) {
200
225
  if (t === null || typeof t !== 'object' || Array.isArray(t))
201
226
  continue;
202
227
  const obj = t;
203
- if (typeof obj['keyword'] === 'string' && obj['keyword'])
204
- return true;
205
- if (typeof obj['phrase'] === 'string' && obj['phrase'])
206
- return true;
228
+ for (const [key, value] of Object.entries(obj)) {
229
+ if (PATH_SHAPED_TRIGGER_KEYS.has(key) || NON_MATCHING_TRIGGER_KEYS.has(key))
230
+ continue;
231
+ // A string that is not blank, or ANY non-string value. The schema
232
+ // types all five match keys as strings today, so the second half is
233
+ // for the key that arrives later: a `keyword: ["a","b"]` read as
234
+ // "not a string, so not a trigger" would silently narrow the rule
235
+ // to a path it does not have, which is the exact failure the
236
+ // negation above exists to prevent. Undefined and null are the one
237
+ // shape that means "absent".
238
+ if (typeof value === 'string') {
239
+ if (value.trim() !== '')
240
+ return true;
241
+ }
242
+ else if (value !== undefined && value !== null) {
243
+ return true;
244
+ }
245
+ }
207
246
  }
208
247
  return false;
209
248
  }
@@ -224,8 +263,10 @@ export function _claude_paths_plan(meta) {
224
263
  }
225
264
  const globs = [];
226
265
  const dropped = [];
227
- // A rule that ALSO declares keyword / phrase triggers gets no `paths:` at
228
- // all, and therefore keeps loading unconditionally on Claude Code.
266
+ // A rule that ALSO declares a non-path trigger — keyword, phrase, command,
267
+ // or a match key added to the schema later — gets no `paths:` at all, and
268
+ // therefore keeps loading unconditionally on Claude Code. The predicate is
269
+ // a negation of the two path-shaped keys, deliberately: see its docblock.
229
270
  //
230
271
  // Emitting `paths:` here would narrow the rule to a path match and discard
231
272
  // every keyword the author wrote, because this host reads the list as the
@@ -128,6 +128,13 @@ export function rewriteAndReport(rulesDir, quiet, info, warn, wrappers, preserve
128
128
  `Claude Code built-in (${wrappers.reserved.join(', ')}); nested /cluster:sub ` +
129
129
  'commands remain available');
130
130
  }
131
+ if (wrappers.foreign !== undefined && wrappers.foreign.length > 0) {
132
+ // Reported, never removed. The name shadows a host built-in, but
133
+ // this package did not write the file, so deleting it would be
134
+ // taking a neighbour's command away without saying so.
135
+ info(` claude-code: kept ${wrappers.foreign.length} neighbour command file(s) whose ` +
136
+ `name is a Claude Code built-in (${wrappers.foreign.join(', ')}); not ours to remove`);
137
+ }
131
138
  }
132
139
  if (result.rewritten > 0 && !quiet) {
133
140
  info(` claude-code: ${result.rewritten} rule(s) rewritten to host form; ` +
@@ -39,6 +39,7 @@ import * as path from 'node:path';
39
39
  import process from 'node:process';
40
40
  import { fileURLToPath, pathToFileURL } from 'node:url';
41
41
  import { _emit_cursor_mdc, _emit_windsurf_rule, strip_frontmatter, } from '../scripts/condense.js';
42
+ import { WINDSURFRULES_HEADER, cleanOwnedOnly, keptLine, mayWriteRuleFile, mayWriteWindsurfRules, ownedPaths, } from './host_rule_ownership.js';
42
43
  function _ruleFiles(rulesDir) {
43
44
  return fs
44
45
  .readdirSync(rulesDir)
@@ -54,63 +55,65 @@ function _ruleFiles(rulesDir) {
54
55
  }
55
56
  });
56
57
  }
57
- /** Remove entries not in `valid` (mirror of condense's `_clean_modern_dir`). */
58
- function _cleanDir(dir, valid) {
59
- let entries;
60
- try {
61
- entries = fs.readdirSync(dir);
62
- }
63
- catch {
64
- return;
65
- }
66
- for (const name of entries) {
67
- if (name === 'README.md' || valid.has(name)) {
68
- continue;
69
- }
70
- const full = path.join(dir, name);
71
- try {
72
- if (fs.lstatSync(full).isDirectory()) {
73
- fs.rmSync(full, { recursive: true, force: true });
74
- }
75
- else {
76
- fs.unlinkSync(full);
77
- }
78
- }
79
- catch {
80
- /* best-effort clean */
81
- }
82
- }
83
- }
84
58
  export function emitCursor(rulesDir, projectRoot) {
85
59
  const targetDir = path.join(projectRoot, '.cursor', 'rules');
86
60
  const files = _ruleFiles(rulesDir);
61
+ const owned = ownedPaths(projectRoot);
87
62
  const valid = new Set();
63
+ let blocked = 0;
88
64
  for (const src of files) {
89
65
  const name = `${path.basename(src, '.md')}.mdc`;
90
- _emit_cursor_mdc(src, path.join(targetDir, name));
66
+ const target = path.join(targetDir, name);
67
+ // Ownership BEFORE the write: a neighbour's file under one of our
68
+ // names would otherwise be destroyed and then skipped by the cleanup
69
+ // pass, which only looks at names this run did not emit.
70
+ if (!mayWriteRuleFile(target, owned)) {
71
+ blocked += 1;
72
+ continue;
73
+ }
74
+ _emit_cursor_mdc(src, target);
91
75
  valid.add(name);
92
76
  }
93
- _cleanDir(targetDir, valid);
77
+ const { kept } = cleanOwnedOnly(targetDir, valid, owned);
78
+ const line = keptLine(kept + blocked);
79
+ if (line !== null)
80
+ process.stdout.write(`cursor: ${line}\n`);
94
81
  return files.length;
95
82
  }
96
83
  export function emitWindsurf(rulesDir, projectRoot) {
97
84
  const perRuleDir = path.join(projectRoot, '.windsurf', 'rules');
98
85
  const files = _ruleFiles(rulesDir);
86
+ const owned = ownedPaths(projectRoot);
99
87
  const valid = new Set();
88
+ let blocked = 0;
100
89
  for (const src of files) {
101
90
  const name = path.basename(src);
102
- _emit_windsurf_rule(src, path.join(perRuleDir, name));
91
+ const target = path.join(perRuleDir, name);
92
+ if (!mayWriteRuleFile(target, owned)) {
93
+ blocked += 1;
94
+ continue;
95
+ }
96
+ _emit_windsurf_rule(src, target);
103
97
  valid.add(name);
104
98
  }
105
- _cleanDir(perRuleDir, valid);
99
+ const { kept } = cleanOwnedOnly(perRuleDir, valid, owned);
100
+ const line = keptLine(kept + blocked);
101
+ if (line !== null)
102
+ process.stdout.write(`windsurf: ${line}\n`);
106
103
  // Concatenated legacy surface — same format as the projection-path
107
104
  // generator (condense.generate_windsurfrules), consumer-sourced header.
108
- const parts = ['# Auto-generated from .augment/rules/ — do not edit directly\n'];
109
- for (const src of files) {
110
- const content = strip_frontmatter(fs.readFileSync(src, 'utf-8'));
111
- parts.push(`---\n\n${content.trim()}\n`);
105
+ const target = path.join(projectRoot, '.windsurfrules');
106
+ if (mayWriteWindsurfRules(target, owned)) {
107
+ const parts = [`${WINDSURFRULES_HEADER}\n`];
108
+ for (const src of files) {
109
+ const content = strip_frontmatter(fs.readFileSync(src, 'utf-8'));
110
+ parts.push(`---\n\n${content.trim()}\n`);
111
+ }
112
+ fs.writeFileSync(target, parts.join('\n') + '\n', 'utf-8');
113
+ }
114
+ else {
115
+ process.stdout.write('windsurf: kept: 1 neighbour file(s) (.windsurfrules)\n');
112
116
  }
113
- fs.writeFileSync(path.join(projectRoot, '.windsurfrules'), parts.join('\n') + '\n', 'utf-8');
114
117
  return files.length;
115
118
  }
116
119
  export function main(argv = process.argv.slice(2)) {
@@ -0,0 +1,87 @@
1
+ /**
2
+ * The rule scope governing a GLOBAL deploy.
3
+ *
4
+ * Moved out of `src/scripts/install.ts` by
5
+ * `road-to-an-installed-layer-that-is-thinned` step 1.1, which adds the thinning
6
+ * call to the same deploy loop. `check_source_size_budget` is a one-way ratchet
7
+ * with no per-change headroom, and this repository's stated convention is that
8
+ * the total falls through EXTRACTION and never rises through a baseline edit —
9
+ * the same reason `claudeRuleRewrite` holds the claude-code post-copy reporting
10
+ * rather than the installer. This function is the nearest self-contained block
11
+ * to the change: it is the predicate the deploy loop resolves once per run, it
12
+ * reaches nothing else in the installer, and its four environment touches are
13
+ * already parameters in all but name.
14
+ *
15
+ * BEHAVIOUR IS UNCHANGED, DELIBERATELY. The body is the installer's, verbatim
16
+ * apart from the four injected seams below; `install.ts` keeps a wrapper of the
17
+ * same name and signature, so its re-export and every caller and test see what
18
+ * they saw before. A behaviour change smuggled into an extraction is the one
19
+ * thing that would make the line saving not worth having.
20
+ *
21
+ * The seams are injected rather than imported because each one is an
22
+ * install-time decision the installer owns: where the global settings doc lives,
23
+ * how this build reads and parses YAML, what the packaged template says, and
24
+ * where a warning goes.
25
+ */
26
+ import { LEGACY_ALL, ruleScopeFromSettings } from './rule_scope.js';
27
+ function isPlainObject(v) {
28
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
29
+ }
30
+ /**
31
+ * Resolve the rule scope governing THIS global deploy — the same way the wizard
32
+ * does (`src/server/routes/install.ts::_resolveRuleScope`), so the two global
33
+ * paths cannot ship different rule sets for the same settings.
34
+ *
35
+ * Settings resolution mirrors `_resolve_scoped_projection` above: an existing
36
+ * global settings doc is authoritative, and only a genuinely fresh machine falls
37
+ * through to the packaged template. Any read or parse failure resolves to
38
+ * `LEGACY_ALL` — over-shipping is the safe direction, and the compat exclusion
39
+ * (`source-of-truth.md`) still applies even then.
40
+ */
41
+ export function resolveGlobalRuleScope(inputs) {
42
+ const { packageRoot, warn } = inputs;
43
+ const settings_path = inputs.settingsPath;
44
+ // No global settings artefact at all — a genuinely fresh machine. Fall
45
+ // through to the packaged template silently: there is no user decision to
46
+ // contradict, and this is the documented upgrade-compat path.
47
+ if (settings_path === null) {
48
+ try {
49
+ return ruleScopeFromSettings(inputs.loadDefaults(), packageRoot);
50
+ }
51
+ catch {
52
+ return LEGACY_ALL;
53
+ }
54
+ }
55
+ // A doc EXISTS, so the user has expressed a configuration. Failing to read
56
+ // it is not the same as not having one: falling back to legacy-all here
57
+ // ships the maintainer-only rules the user may have deliberately scoped out,
58
+ // and `_load_yaml_doc` would report that as an indistinguishable `{}`. So
59
+ // parse it explicitly and be LOUD when it does not parse — over-shipping
60
+ // stays the safe direction, but it must not be a silent one.
61
+ let text;
62
+ try {
63
+ text = inputs.readText(settings_path);
64
+ }
65
+ catch (e) {
66
+ warn(`could not read ${settings_path} (${String(e)}) — rule scoping falls back ` +
67
+ 'to legacy-all, so ALL rules including maintainer-only ones will be ' +
68
+ 'installed. Fix the file to restore scoping.');
69
+ return LEGACY_ALL;
70
+ }
71
+ const parsed = inputs.parseYaml(text);
72
+ if (!isPlainObject(parsed)) {
73
+ warn(`${settings_path} is not a YAML mapping — rule scoping falls back to ` +
74
+ 'legacy-all, so ALL rules including maintainer-only ones will be ' +
75
+ 'installed. Fix the file to restore scoping.');
76
+ return LEGACY_ALL;
77
+ }
78
+ try {
79
+ return ruleScopeFromSettings(parsed, packageRoot);
80
+ }
81
+ catch (e) {
82
+ warn(`could not derive rule scope from ${settings_path} (${String(e)}) — ` +
83
+ 'falling back to legacy-all; ALL rules will be installed.');
84
+ return LEGACY_ALL;
85
+ }
86
+ }
87
+ //# sourceMappingURL=globalRuleScope.js.map
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Which host-rule files this package may delete or overwrite.
3
+ *
4
+ * The defect this closes: `_cleanDir` removed every entry under
5
+ * `.cursor/rules` and `.windsurf/rules` whose NAME was not one this run had
6
+ * just emitted, and `.windsurfrules` was overwritten unconditionally. A rule
7
+ * file another agent package wrote — or one the consumer wrote by hand — was
8
+ * destroyed on every install, which is the opposite of what the uninstall
9
+ * claim promises.
10
+ *
11
+ * Ownership is read from the installed-tools manifest's `files[]` inventory,
12
+ * never from a marker inside the file. The `.mdc` emitter writes no package
13
+ * tag (`condense.ts` `_emit_cursor_mdc`), so a tag-based gate would classify
14
+ * every file this package ever wrote as foreign and therefore never remove a
15
+ * stale one — it would read as conservative and in fact be inert. The manifest
16
+ * is the record of what this installer actually put on disk, so it is the
17
+ * thing that can answer the question.
18
+ *
19
+ * This module only READS that manifest. It never rewrites it: the available
20
+ * reader (`installed_tools.read_manifest`) drops nested `files[]` by design,
21
+ * so a read-modify-write through it would erase every other tool's inventory —
22
+ * the failure `manifestFiles.ts` documents at length.
23
+ *
24
+ * The consequence, stated rather than implied: a consumer whose manifest does
25
+ * not claim a path gets that path KEPT. Unproven means kept, never deleted.
26
+ * That is the safe direction for this lane and it is also a real limit — a
27
+ * stale file of ours sitting under an unclaimed path stays until something
28
+ * claims it.
29
+ */
30
+ import * as fs from 'node:fs';
31
+ import * as path from 'node:path';
32
+ import { sha256OfFile } from './fsPrimitives.js';
33
+ import { classifyOwnership, recordedHashesForRoot } from './recordedOwnership.js';
34
+ /** The first line every `.windsurfrules` this package generates carries. */
35
+ export const WINDSURFRULES_HEADER = '# Auto-generated from .augment/rules/ — do not edit directly';
36
+ /** Every file path beneath `full`, or `[full]` when it is a file. */
37
+ function filesUnder(full) {
38
+ let stat;
39
+ try {
40
+ stat = fs.lstatSync(full);
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ if (!stat.isDirectory())
46
+ return [full];
47
+ const out = [];
48
+ for (const name of fs.readdirSync(full)) {
49
+ out.push(...filesUnder(path.join(full, name)));
50
+ }
51
+ return out;
52
+ }
53
+ /**
54
+ * Is this exact file ours AND still carrying the bytes we wrote?
55
+ *
56
+ * The recorded digest is the point, not the path. A path-membership test
57
+ * answers "did we ever write here", which merges two materially different
58
+ * trees: a generated file still as we left it, and one the consumer has since
59
+ * edited. Deleting the second loses their work, and `recordedOwnership` exists
60
+ * to tell them apart — importing its map and then ignoring its hashes was the
61
+ * defect an independent review named here.
62
+ */
63
+ function isUnchangedOurs(file, owned) {
64
+ const target = path.resolve(file);
65
+ if (!owned.has(target))
66
+ return false;
67
+ return classifyOwnership(owned.get(target), sha256OfFile(target)) === 'recorded-unchanged';
68
+ }
69
+ /**
70
+ * Remove the stale entries of ours from `dir`, keeping everything else.
71
+ *
72
+ * An entry is removable only when every file it contains is ours AND
73
+ * unmodified: one unclaimed or edited file inside a directory keeps the whole
74
+ * directory, because removing it would take that file with it.
75
+ */
76
+ export function cleanOwnedOnly(dir, valid, owned) {
77
+ let entries;
78
+ try {
79
+ entries = fs.readdirSync(dir);
80
+ }
81
+ catch {
82
+ return { removed: [], kept: 0 };
83
+ }
84
+ const removed = [];
85
+ let kept = 0;
86
+ for (const name of entries) {
87
+ if (name === 'README.md' || valid.has(name))
88
+ continue;
89
+ const full = path.join(dir, name);
90
+ const contained = filesUnder(full);
91
+ const ours = contained.length > 0 && contained.every((f) => isUnchangedOurs(f, owned));
92
+ if (!ours) {
93
+ kept += 1;
94
+ continue;
95
+ }
96
+ try {
97
+ fs.rmSync(full, { recursive: true, force: true });
98
+ removed.push(name);
99
+ }
100
+ catch {
101
+ kept += 1;
102
+ }
103
+ }
104
+ return { removed, kept };
105
+ }
106
+ /**
107
+ * May this package write `.windsurfrules` at `target`?
108
+ *
109
+ * Yes when the file is absent, or when it still carries the header this
110
+ * package generates. Nothing else.
111
+ *
112
+ * A manifest claim is deliberately NOT a second route in. The file is
113
+ * generated and overwritten on every install, so the header IS the ownership
114
+ * signal and it is content-derived: if the header is gone, something replaced
115
+ * the file, and "the manifest says we wrote here once" is exactly the stale
116
+ * fact that would let us overwrite a neighbour's replacement. An independent
117
+ * review caught that route open, with a fixture asserting it.
118
+ */
119
+ export function mayWriteWindsurfRules(target, owned) {
120
+ void owned;
121
+ if (!fs.existsSync(target))
122
+ return true;
123
+ let head;
124
+ try {
125
+ head = fs.readFileSync(target, 'utf-8').split('\n', 1)[0] ?? '';
126
+ }
127
+ catch {
128
+ // Unreadable is unproven, and unproven means do not touch it.
129
+ return false;
130
+ }
131
+ return head.trim() === WINDSURFRULES_HEADER;
132
+ }
133
+ /**
134
+ * May this package write a rule file at `target`?
135
+ *
136
+ * The cleanup pass is not enough on its own, and an independent review found
137
+ * the hole: `_cleanDir` skips every name this run just emitted, so a
138
+ * neighbour's `foo.mdc` that happens to share a basename with one of our
139
+ * rules was already OVERWRITTEN by the time ownership was consulted. The
140
+ * check has to run BEFORE the write, which is what this is for.
141
+ *
142
+ * Absent, or ours and unmodified → write. Anything else is someone's file or
143
+ * someone's edit, and is left exactly as it is.
144
+ */
145
+ export function mayWriteRuleFile(target, owned) {
146
+ if (!fs.existsSync(target))
147
+ return true;
148
+ return isUnchangedOurs(target, owned);
149
+ }
150
+ /** The manifest's claimed paths for a consumer root; empty when none resolves. */
151
+ export function ownedPaths(projectRoot) {
152
+ return recordedHashesForRoot(projectRoot);
153
+ }
154
+ /** The one line the emitter prints when it kept a neighbour's files. */
155
+ export function keptLine(kept) {
156
+ if (kept <= 0)
157
+ return null;
158
+ return `kept: ${kept} neighbour file(s)`;
159
+ }
160
+ //# sourceMappingURL=host_rule_ownership.js.map