@event4u/agent-config 16.3.0 → 16.5.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 (532) 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 +178 -78
  5. package/README.md +2 -2
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +10 -7
  8. package/dist/agent-src/commands/bug/investigate.md +1 -1
  9. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  10. package/dist/agent-src/commands/commit.md +72 -33
  11. package/dist/agent-src/commands/condense.md +2 -8
  12. package/dist/agent-src/commands/council/debate.md +11 -7
  13. package/dist/agent-src/commands/council/default.md +10 -9
  14. package/dist/agent-src/commands/council.md +1 -1
  15. package/dist/agent-src/commands/design.md +1 -1
  16. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  17. package/dist/agent-src/commands/feature/explore.md +3 -3
  18. package/dist/agent-src/commands/feature/plan.md +1 -1
  19. package/dist/agent-src/commands/fix/ci.md +17 -3
  20. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  21. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  22. package/dist/agent-src/commands/implement-ticket.md +3 -3
  23. package/dist/agent-src/commands/memory/add.md +4 -16
  24. package/dist/agent-src/commands/memory/load.md +5 -6
  25. package/dist/agent-src/commands/memory/promote.md +3 -16
  26. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  27. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  28. package/dist/agent-src/commands/optimize/deep.md +4 -2
  29. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  30. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  31. package/dist/agent-src/commands/pr/create.md +42 -34
  32. package/dist/agent-src/commands/pr/merge.md +136 -9
  33. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  34. package/dist/agent-src/commands/project/analyze.md +7 -35
  35. package/dist/agent-src/commands/refine-ticket.md +1 -1
  36. package/dist/agent-src/commands/review/changes.md +14 -19
  37. package/dist/agent-src/commands/roadmap/next.md +10 -1
  38. package/dist/agent-src/commands/roadmap/process-full.md +52 -38
  39. package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
  40. package/dist/agent-src/commands/worktree/create.md +7 -3
  41. package/dist/agent-src/commands/worktree/verify.md +2 -1
  42. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  43. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  44. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  45. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  46. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  47. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  49. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  50. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  51. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  52. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
  53. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  54. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  55. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  56. package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
  57. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  58. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  59. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  60. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  61. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  62. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  63. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  64. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  65. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  66. package/dist/agent-src/guidelines/design-antipatterns.md +1 -1
  67. package/dist/agent-src/guidelines/php/git.md +15 -2
  68. package/dist/agent-src/rules/active-remediation.md +0 -1
  69. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  70. package/dist/agent-src/rules/architecture.md +0 -1
  71. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  72. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  73. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  74. package/dist/agent-src/rules/autonomous-execution.md +0 -1
  75. package/dist/agent-src/rules/brand-consistency.md +0 -1
  76. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  77. package/dist/agent-src/rules/broken-access-control.md +0 -1
  78. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  79. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  80. package/dist/agent-src/rules/code-provenance.md +0 -1
  81. package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
  82. package/dist/agent-src/rules/commit-conventions.md +1 -2
  83. package/dist/agent-src/rules/communication-through-line.md +1 -2
  84. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  85. package/dist/agent-src/rules/context-hygiene.md +5 -5
  86. package/dist/agent-src/rules/copilot-routing.md +1 -2
  87. package/dist/agent-src/rules/council-availability.md +4 -4
  88. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  89. package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
  90. package/dist/agent-src/rules/delegation-policy.md +2 -3
  91. package/dist/agent-src/rules/design-fidelity.md +0 -1
  92. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  93. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  94. package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
  95. package/dist/agent-src/rules/docker-commands.md +0 -1
  96. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  97. package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
  98. package/dist/agent-src/rules/domain-safety-pii.md +0 -1
  99. package/dist/agent-src/rules/domain-safety-retention.md +0 -1
  100. package/dist/agent-src/rules/downstream-changes.md +0 -1
  101. package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
  102. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  103. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  104. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
  105. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  106. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  107. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  108. package/dist/agent-src/rules/git-history-discipline.md +1 -2
  109. package/dist/agent-src/rules/guidelines.md +0 -1
  110. package/dist/agent-src/rules/history-discipline.md +0 -1
  111. package/dist/agent-src/rules/icon-consistency.md +0 -1
  112. package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
  113. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  114. package/dist/agent-src/rules/invite-challenge.md +0 -1
  115. package/dist/agent-src/rules/laravel-routing.md +1 -2
  116. package/dist/agent-src/rules/laravel-translations.md +0 -1
  117. package/dist/agent-src/rules/legal-safety-floor.md +0 -1
  118. package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
  119. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  120. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
  121. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  122. package/dist/agent-src/rules/media-governance-routing.md +1 -2
  123. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  124. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  125. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  126. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  127. package/dist/agent-src/rules/model-recommendation.md +0 -1
  128. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  129. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  130. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  131. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  132. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  133. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  134. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  135. package/dist/agent-src/rules/output-discipline.md +0 -1
  136. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  137. package/dist/agent-src/rules/persona-governance.md +2 -3
  138. package/dist/agent-src/rules/php-coding.md +0 -1
  139. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  140. package/dist/agent-src/rules/preservation-guard.md +0 -1
  141. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
  142. package/dist/agent-src/rules/question-not-instruction.md +0 -1
  143. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  144. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  145. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
  146. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  147. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  148. package/dist/agent-src/rules/runtime-safety.md +0 -1
  149. package/dist/agent-src/rules/scale-discipline.md +0 -1
  150. package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
  151. package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
  152. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  153. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  154. package/dist/agent-src/rules/session-canary.md +0 -1
  155. package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
  156. package/dist/agent-src/rules/size-enforcement.md +0 -1
  157. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  158. package/dist/agent-src/rules/skill-quality.md +0 -1
  159. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  160. package/dist/agent-src/rules/source-confidentiality.md +0 -1
  161. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  162. package/dist/agent-src/rules/source-of-truth.md +0 -1
  163. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  164. package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
  165. package/dist/agent-src/rules/symfony-routing.md +1 -2
  166. package/dist/agent-src/rules/think-before-action.md +0 -1
  167. package/dist/agent-src/rules/token-budget-discipline.md +14 -48
  168. package/dist/agent-src/rules/token-efficiency.md +0 -1
  169. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  170. package/dist/agent-src/rules/tool-safety.md +0 -1
  171. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  172. package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
  173. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  174. package/dist/agent-src/rules/user-interaction.md +0 -1
  175. package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
  176. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  177. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  178. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
  179. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  180. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  181. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  182. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  183. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  184. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  185. package/dist/agent-src/skills/canvas-design/SKILL.md +4 -2
  186. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  187. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  188. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  189. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  190. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  191. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  192. package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +13 -10
  193. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  194. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  195. package/dist/agent-src/skills/fe-design/references/design-patterns.md +49 -2
  196. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  197. package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
  198. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  199. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  200. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  201. package/dist/agent-src/skills/iconography/SKILL.md +4 -2
  202. package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
  203. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  204. package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
  205. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  206. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  207. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  208. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  209. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
  210. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  211. package/dist/agent-src/skills/svg-authoring/SKILL.md +318 -0
  212. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
  213. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  214. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  215. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  216. package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
  217. package/dist/agent-src/templates/AGENTS.md +1 -1
  218. package/dist/agent-src/templates/agent-settings.md +46 -129
  219. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  220. package/dist/agent-src/templates/command.md +2 -2
  221. package/dist/agent-src/templates/roadmaps.md +6 -1
  222. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  223. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  224. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  225. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  226. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  227. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  228. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  229. package/dist/agent-src/templates/skill.md +1 -1
  230. package/dist/cli/commands/uiRender.js +201 -4
  231. package/dist/cli/commands/uiRenderAsset.js +1308 -0
  232. package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
  233. package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
  234. package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
  235. package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
  236. package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
  237. package/dist/cli/main.js +47 -1
  238. package/dist/cli/registry.js +2 -1
  239. package/dist/cli-delegate/check_update_banner.js +195 -119
  240. package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
  241. package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
  242. package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
  243. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  244. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  245. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  246. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  247. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  248. package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
  249. package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
  250. package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
  251. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  252. package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
  253. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  254. package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
  255. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  256. package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
  257. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  258. package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
  259. package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
  260. package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
  261. package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
  262. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  263. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  264. package/dist/cli-delegate/cmd_conformance.js +489 -238
  265. package/dist/cli-delegate/cmd_converge.js +3 -3
  266. package/dist/cli-delegate/cmd_doctor.js +15 -12
  267. package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
  268. package/dist/cli-delegate/cmd_explain.js +43 -19
  269. package/dist/cli-delegate/cmd_export.js +10 -10
  270. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  271. package/dist/cli-delegate/cmd_handoff.js +40 -21
  272. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  273. package/dist/cli-delegate/cmd_migrate.js +3 -3
  274. package/dist/cli-delegate/cmd_packs_active.js +4 -3
  275. package/dist/cli-delegate/cmd_prune.js +10 -10
  276. package/dist/cli-delegate/cmd_route_audit.js +7 -7
  277. package/dist/cli-delegate/cmd_route_explain.js +5 -5
  278. package/dist/cli-delegate/cmd_session_recycle.js +9 -7
  279. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  280. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  281. package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
  282. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  283. package/dist/cli-delegate/cmd_sync.js +10 -10
  284. package/dist/cli-delegate/cmd_uninstall.js +10 -10
  285. package/dist/cli-delegate/cmd_update.js +7 -7
  286. package/dist/cli-delegate/cmd_upgrade.js +7 -7
  287. package/dist/cli-delegate/cmd_validate.js +10 -10
  288. package/dist/cli-delegate/cmd_versions.js +5 -5
  289. package/dist/cli-delegate/gate_budget.js +1 -1
  290. package/dist/cli-delegate/gate_execute.js +2 -2
  291. package/dist/cli-delegate/roadmap_gates.js +2 -2
  292. package/dist/discovery/deprecation-report.md +1 -1
  293. package/dist/discovery/discovery-manifest.json +171 -107
  294. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  295. package/dist/discovery/discovery-manifest.summary.md +7 -7
  296. package/dist/discovery/dormancy-report.md +1 -1
  297. package/dist/discovery/orphan-report.md +1 -1
  298. package/dist/discovery/packs.json +41 -22
  299. package/dist/discovery/trust-report.md +3 -3
  300. package/dist/discovery/workspaces.json +16 -11
  301. package/dist/hooks/dispatch.js +2520 -1924
  302. package/dist/hooks/dispatch.sha256 +1 -1
  303. package/dist/hooks/svg_rules.chunk.cjs +1626 -0
  304. package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
  305. package/dist/install/install.mjs +462 -431
  306. package/dist/install/installThinLayer.js +40 -12
  307. package/dist/install/installedRuleLinks.js +105 -19
  308. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  309. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  310. package/dist/mcp/registry-manifest.json +5 -5
  311. package/dist/mcp/server.json +2 -2
  312. package/dist/mcp/server.mjs +3063 -2160
  313. package/dist/router.json +1 -1
  314. package/dist/scripts/_lib/agent_settings.js +15 -120
  315. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  316. package/dist/scripts/_lib/git_convention.js +232 -0
  317. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  318. package/dist/scripts/_lib/installed_layer.js +344 -18
  319. package/dist/scripts/_lib/package_root.js +68 -0
  320. package/dist/scripts/_lib/rule_law_section.js +1 -1
  321. package/dist/scripts/_lib/scan_scope.js +105 -0
  322. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  323. package/dist/scripts/_lib/svg_dom.js +284 -0
  324. package/dist/scripts/_lib/svg_geometry.js +477 -0
  325. package/dist/scripts/_lib/svg_motion.js +179 -0
  326. package/dist/scripts/_lib/svg_rules.js +1337 -0
  327. package/dist/scripts/_lib/svg_urls.js +67 -0
  328. package/dist/scripts/_lib/thin_rules.js +80 -3
  329. package/dist/scripts/lint_svg_asset.js +324 -0
  330. package/dist/server/app.js +2 -1
  331. package/dist/server/gitKeysGate.js +105 -0
  332. package/dist/server/routes/settings.js +67 -8
  333. package/dist/server/routes/wizard.js +4 -0
  334. package/dist/server/schemas/settings.js +23 -81
  335. package/dist/shared/skillRanking.js +30 -4
  336. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  337. package/dist/ui/index.html +1 -1
  338. package/docs/MIGRATION.md +72 -1
  339. package/docs/contracts/settings-classes.md +35 -65
  340. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  341. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  342. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  343. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  344. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  345. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  346. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  347. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  348. package/docs/guidelines/design-antipatterns.md +1 -1
  349. package/docs/guidelines/php/git.md +15 -2
  350. package/package.json +4 -3
  351. package/src/agent-src/scripts/gate_budget.ts +47 -23
  352. package/src/agent-src/scripts/gate_execute.ts +12 -4
  353. package/src/agent-src/templates/AGENTS.md +1 -1
  354. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  355. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  356. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  357. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  358. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  359. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  360. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  361. package/src/config/agent-settings.template.yml +79 -312
  362. package/src/config/agents-paths.yml +16 -0
  363. package/src/config/assurance-capability-registry.json +7 -3
  364. package/src/config/ci-local-parity.yml +3 -0
  365. package/src/config/continuity-surface.json +3 -3
  366. package/src/config/discovery/packs.yml +17 -1
  367. package/src/config/evaluator-budgets.json +19 -6
  368. package/src/config/gate-coverage.yml +65 -23
  369. package/src/config/gate-violation-baselines.json +56 -16
  370. package/src/config/gitignore-block.txt +19 -0
  371. package/src/config/hook-bundle-budget.json +1 -1
  372. package/src/config/release-gate-locality.yml +2 -1
  373. package/src/config/routing-coverage-seed.json +55 -6
  374. package/src/config/rule-law-ceilings.json +12 -6
  375. package/src/config/rule-obligations.json +833 -0
  376. package/src/install/installThinLayer.ts +76 -10
  377. package/src/install/installedRuleLinks.ts +105 -17
  378. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  379. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  380. package/src/scripts/_cli/cmd_doctor.ts +10 -10
  381. package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
  382. package/src/scripts/_cli/cmd_explain.ts +72 -14
  383. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  384. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  385. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  386. package/src/scripts/_cli/doctor_execution.ts +72 -1
  387. package/src/scripts/_dispatch.bash +37 -2
  388. package/src/scripts/_lib/agent_settings.ts +15 -124
  389. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  390. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  391. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  392. package/src/scripts/_lib/git_base_ref.ts +92 -0
  393. package/src/scripts/_lib/git_convention.ts +291 -0
  394. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  395. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  396. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  397. package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
  398. package/src/scripts/_lib/graph_feeder_record.ts +236 -13
  399. package/src/scripts/_lib/installed_layer.ts +448 -23
  400. package/src/scripts/_lib/knowledge_global.ts +14 -1
  401. package/src/scripts/_lib/module_reach.ts +456 -0
  402. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  403. package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
  404. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  405. package/src/scripts/_lib/ratification_subject.ts +92 -0
  406. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  407. package/src/scripts/_lib/release_highlights.ts +5 -0
  408. package/src/scripts/_lib/rule_law_section.ts +1 -1
  409. package/src/scripts/_lib/rule_obligations.ts +205 -0
  410. package/src/scripts/_lib/self_repair.ts +1 -1
  411. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  412. package/src/scripts/_lib/svg_dom.ts +318 -0
  413. package/src/scripts/_lib/svg_geometry.ts +480 -0
  414. package/src/scripts/_lib/svg_motion.ts +208 -0
  415. package/src/scripts/_lib/svg_rules.ts +1453 -0
  416. package/src/scripts/_lib/svg_urls.ts +72 -0
  417. package/src/scripts/_lib/test_red_state.ts +5 -0
  418. package/src/scripts/_lib/thin_rules.ts +83 -3
  419. package/src/scripts/_lib/touched_file_quality.ts +142 -6
  420. package/src/scripts/_lib/verification_command.ts +59 -0
  421. package/src/scripts/_lib/verify_clause.ts +27 -17
  422. package/src/scripts/_lib/worker_budget.ts +1 -1
  423. package/src/scripts/adr/regenerate_index.ts +16 -1
  424. package/src/scripts/ai_council/config.ts +7 -7
  425. package/src/scripts/ai_council/modification_review.ts +100 -0
  426. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  427. package/src/scripts/ai_council/orchestrator.ts +5 -5
  428. package/src/scripts/ai_council/spend_gate.ts +18 -7
  429. package/src/scripts/ai_team/config.ts +11 -16
  430. package/src/scripts/audit_user_type_axis.ts +20 -8
  431. package/src/scripts/bench_ab_clone.ts +1 -2
  432. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  433. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  434. package/src/scripts/check_agent_artifact_location.ts +36 -0
  435. package/src/scripts/check_branch_freshness.ts +147 -24
  436. package/src/scripts/check_enforcement_coverage.ts +130 -0
  437. package/src/scripts/check_evaluator_budgets.ts +4 -0
  438. package/src/scripts/check_finding_dispositions.ts +88 -25
  439. package/src/scripts/check_gate_coverage.ts +4 -3
  440. package/src/scripts/check_gate_reachability.ts +48 -1
  441. package/src/scripts/check_generator_sync.ts +48 -0
  442. package/src/scripts/check_hook_bundle_composition.ts +107 -0
  443. package/src/scripts/check_kernel_edit_ratified.ts +86 -6
  444. package/src/scripts/check_pack_size.ts +1 -1
  445. package/src/scripts/check_release_manifest_content.ts +189 -0
  446. package/src/scripts/check_standing_rule_delivery.ts +96 -0
  447. package/src/scripts/check_suppression_hygiene.ts +2 -5
  448. package/src/scripts/ci_settle.ts +42 -5
  449. package/src/scripts/classify_merge_risk.ts +320 -0
  450. package/src/scripts/closure_scan.ts +91 -1
  451. package/src/scripts/command_suggester/settings.ts +8 -108
  452. package/src/scripts/command_suggester/types.ts +4 -5
  453. package/src/scripts/consumer_matrix.ts +102 -0
  454. package/src/scripts/context_hygiene_hook.ts +13 -23
  455. package/src/scripts/cost/preflight.mjs +12 -1
  456. package/src/scripts/council_cli.ts +7 -7
  457. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  458. package/src/scripts/explain_run.ts +8 -13
  459. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  460. package/src/scripts/generate_host_cost_table.ts +20 -3
  461. package/src/scripts/handoff_context_hook.ts +86 -37
  462. package/src/scripts/hook_manifest.json +1 -1
  463. package/src/scripts/hook_manifest.yaml +25 -6
  464. package/src/scripts/hooks/block_config_weakening.ts +48 -5
  465. package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
  466. package/src/scripts/hooks/block_speaking_inbox_dir.ts +16 -1
  467. package/src/scripts/hooks/concern_registry.ts +2 -0
  468. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  469. package/src/scripts/hooks/design_pass_hook.ts +157 -3
  470. package/src/scripts/hooks/evidence_independence.ts +12 -4
  471. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  472. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  473. package/src/scripts/hooks/rule_inject_hook.ts +44 -3
  474. package/src/scripts/hooks/state_io.ts +8 -4
  475. package/src/scripts/hooks/svg_obligation.ts +497 -0
  476. package/src/scripts/hooks/svg_rules_loader.ts +133 -0
  477. package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
  478. package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
  479. package/src/scripts/install-hooks.sh +42 -14
  480. package/src/scripts/install.ts +7 -31
  481. package/src/scripts/lint_blocker_citations.ts +198 -0
  482. package/src/scripts/lint_consolidation_lineage.ts +6 -3
  483. package/src/scripts/lint_design_quality.ts +60 -12
  484. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  485. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  486. package/src/scripts/lint_motion_authority_drift.ts +27 -0
  487. package/src/scripts/lint_pack_boundaries.ts +406 -28
  488. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  489. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  490. package/src/scripts/lint_rule_law_section.ts +151 -21
  491. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  492. package/src/scripts/lint_settings_classes.ts +1 -1
  493. package/src/scripts/lint_svg_asset.ts +365 -0
  494. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  495. package/src/scripts/lint_workflow_security.ts +12 -1
  496. package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
  497. package/src/scripts/model_rule_injection.ts +3 -3
  498. package/src/scripts/onboarding_gate_hook.ts +7 -6
  499. package/src/scripts/print_required_checks.ts +15 -3
  500. package/src/scripts/probe_host_compliance.ts +33 -5
  501. package/src/scripts/probe_turnaround.ts +183 -3
  502. package/src/scripts/ratification_header.ts +77 -0
  503. package/src/scripts/refusal_envelope.ts +138 -0
  504. package/src/scripts/release_publication.ts +29 -3
  505. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  506. package/src/scripts/report_installed_rule_links.ts +118 -1
  507. package/src/scripts/report_module_reach.ts +212 -0
  508. package/src/scripts/report_obligation_mechanism.ts +16 -18
  509. package/src/scripts/report_parked_blockers.ts +222 -0
  510. package/src/scripts/report_required_checks_drift.ts +196 -0
  511. package/src/scripts/report_skill_ranker_confusion.ts +103 -2
  512. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  513. package/src/scripts/routing_doctor.ts +2 -2
  514. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  515. package/src/scripts/schemas/command.schema.json +1 -1
  516. package/src/scripts/schemas/skill.schema.json +1 -1
  517. package/src/scripts/self_review_gate.ts +39 -2
  518. package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
  519. package/src/scripts/sync_pr_branch.ts +403 -132
  520. package/src/scripts/trigger_eval_grandfather.json +0 -16
  521. package/src/server/schemas/settings.ts +33 -177
  522. package/src/shared/skillRanking.ts +53 -4
  523. package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
  524. package/src/scripts/_lib/config_chain.ts +0 -477
  525. package/src/scripts/_lib/conformance_report.ts +0 -403
  526. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  527. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  528. package/src/scripts/_lib/file_slicer.ts +0 -117
  529. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  530. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  531. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  532. package/src/scripts/_lib/role_split.ts +0 -338
@@ -0,0 +1,730 @@
1
+ /**
2
+ * Per-tool inventory of files written by global deploys — and stale reaping.
3
+ *
4
+ * Ported from the retired Python `src/scripts/_lib/global_deploy_inventory.py` (ADR-200 —
5
+ * Python→TS migration, Phase 2 / Wave 2a). Public API mirrors the Python
6
+ * module exactly (snake_case kept deliberately), including the JSON
7
+ * serialization shape (`indent=2, sort_keys=True` + trailing newline) and the
8
+ * inventory-walk / orphan-reap semantics.
9
+ *
10
+ * Sidecar at `~/.event4u/agent-config/deployed-files.json`. Records, per tool,
11
+ * the anchor directory and the relative paths of every file the most recent
12
+ * global deploy maintains there. On the next deploy the previous inventory is
13
+ * diffed against the current expected file set and **only** previously-recorded,
14
+ * now-orphaned files are deleted.
15
+ *
16
+ * Why this exists (2026-06 Zed fix follow-up): deploy anchors are SHARED
17
+ * directories — `~/.agents/skills/` holds the user's own Zed skills next to
18
+ * agent-config's deployed bundle, `~/.claude/commands/` holds user-authored
19
+ * commands. A naive "delete everything not in the source" sync would destroy
20
+ * user files, so the installer historically deleted nothing — and renamed or
21
+ * removed package skills rotted in place. The inventory provides the ownership
22
+ * proof that makes reaping safe: a path is deleted only if a previous
23
+ * agent-config deploy recorded writing it AND the current deploy no longer
24
+ * ships it.
25
+ *
26
+ * Safety properties:
27
+ *
28
+ * - Never deletes a path that was not recorded by a previous deploy.
29
+ * - Never deletes outside the recorded anchor (resolved containment check).
30
+ * - Never deletes directories — only files/symlinks, then prunes empty dirs.
31
+ * - Anchor moved between installs → no reaping (the old tree is unknown
32
+ * territory; the new inventory simply replaces the record).
33
+ * - Missing / corrupt inventory → no reaping (first run records only).
34
+ *
35
+ * Schema (JSON):
36
+ *
37
+ * {
38
+ * "schema_version": 1,
39
+ * "tools": {
40
+ * "<tool_id>": {
41
+ * "anchor": "/abs/path/to/anchor",
42
+ * "files": ["skills/foo/SKILL.md", ...] // anchor-relative, sorted
43
+ * }
44
+ * }
45
+ * }
46
+ */
47
+ import { randomBytes } from "node:crypto";
48
+ import * as fs from "node:fs";
49
+ import * as os from "node:os";
50
+ import * as path from "node:path";
51
+ import * as user_global_paths from "./user_global_paths.js";
52
+ export const SCHEMA_VERSION = 1;
53
+ export const INVENTORY_BASENAME = "deployed-files.json";
54
+ export const INVENTORY_ENV = "AGENT_CONFIG_DEPLOY_INVENTORY";
55
+ /** Expand a leading `~` like Python's `Path.expanduser()`. */
56
+ function expanduser(p) {
57
+ if (p === "~") {
58
+ return os.homedir();
59
+ }
60
+ if (p.startsWith("~/") || (process.platform === "win32" && p.startsWith("~\\"))) {
61
+ return path.join(os.homedir(), p.slice(2));
62
+ }
63
+ return p;
64
+ }
65
+ /**
66
+ * `expanduser`, against a STATED home rather than the process's own.
67
+ *
68
+ * `home` omitted or empty falls back to {@link expanduser}, so every existing
69
+ * caller is unchanged.
70
+ */
71
+ function expanduser_at(p, home) {
72
+ if (home === undefined || home === null || home === "")
73
+ return expanduser(p);
74
+ if (p === "~")
75
+ return home;
76
+ if (p.startsWith("~/") || (process.platform === "win32" && p.startsWith("~\\"))) {
77
+ return path.join(home, p.slice(2));
78
+ }
79
+ return p;
80
+ }
81
+ /**
82
+ * Resolve a path the way `Path.resolve()` does: expand-free `realpath`-style
83
+ * resolution that follows existing symlinks and normalises `..`, but does not
84
+ * fail when the path does not exist (the trailing non-existent components are
85
+ * resolved lexically). Used for containment checks and anchor comparison.
86
+ */
87
+ function resolve_path(p) {
88
+ try {
89
+ return fs.realpathSync(p);
90
+ }
91
+ catch {
92
+ // Path (or a parent) does not exist — resolve lexically against the
93
+ // longest existing prefix, mirroring Python's strict=False resolve.
94
+ const abs = path.resolve(p);
95
+ const parts = abs.split(path.sep);
96
+ // Find the longest existing ancestor, realpath it, then re-append the
97
+ // remaining (non-existent) components.
98
+ for (let i = parts.length; i > 0; i -= 1) {
99
+ const prefix = parts.slice(0, i).join(path.sep) || path.sep;
100
+ try {
101
+ const real = fs.realpathSync(prefix);
102
+ const rest = parts.slice(i);
103
+ return rest.length > 0 ? path.join(real, ...rest) : real;
104
+ }
105
+ catch {
106
+ continue;
107
+ }
108
+ }
109
+ return abs;
110
+ }
111
+ }
112
+ /** Python `Path.exists()` — follows symlinks; False for a dangling symlink. */
113
+ function path_exists(p) {
114
+ try {
115
+ fs.statSync(p);
116
+ return true;
117
+ }
118
+ catch {
119
+ return false;
120
+ }
121
+ }
122
+ /** Canonical inventory location, honoring the test/env override. */
123
+ export function inventory_path(env) {
124
+ const env_map = env ?? process.env;
125
+ const override = env_map[INVENTORY_ENV];
126
+ if (override) {
127
+ return expanduser(override);
128
+ }
129
+ return user_global_paths.write_target(INVENTORY_BASENAME, { env: env ?? null });
130
+ }
131
+ /** Read the inventory; missing or malformed files yield an empty shell. */
132
+ export function load_inventory(p) {
133
+ const target = p ?? inventory_path();
134
+ let data;
135
+ try {
136
+ data = JSON.parse(fs.readFileSync(target, { encoding: "utf-8" }));
137
+ }
138
+ catch {
139
+ return { schema_version: SCHEMA_VERSION, tools: {} };
140
+ }
141
+ if (typeof data !== "object" ||
142
+ data === null ||
143
+ Array.isArray(data) ||
144
+ typeof data["tools"] !== "object" ||
145
+ data["tools"] === null ||
146
+ Array.isArray(data["tools"])) {
147
+ return { schema_version: SCHEMA_VERSION, tools: {} };
148
+ }
149
+ return data;
150
+ }
151
+ /** Atomically write the inventory (tempfile + rename). */
152
+ export function save_inventory(data, p) {
153
+ const target = p ?? inventory_path();
154
+ fs.mkdirSync(path.dirname(target), { recursive: true });
155
+ const payload = json_dumps_sorted(data, 2) + "\n";
156
+ const parent = path.dirname(target);
157
+ let fd = null;
158
+ let tmp_name = "";
159
+ for (let attempt = 0; attempt < 32; attempt += 1) {
160
+ tmp_name = path.join(parent, `${path.basename(target)}.${randomBytes(6).toString("hex")}`);
161
+ try {
162
+ fd = fs.openSync(tmp_name, "wx", 0o600);
163
+ break;
164
+ }
165
+ catch (err) {
166
+ if (err.code === "EEXIST") {
167
+ continue;
168
+ }
169
+ throw err;
170
+ }
171
+ }
172
+ if (fd === null) {
173
+ throw new Error("save_inventory: could not create a unique temp file");
174
+ }
175
+ try {
176
+ fs.writeFileSync(fd, payload, { encoding: "utf-8" });
177
+ fs.closeSync(fd);
178
+ fs.renameSync(tmp_name, target);
179
+ }
180
+ catch (err) {
181
+ try {
182
+ fs.closeSync(fd);
183
+ }
184
+ catch {
185
+ // fd may already be closed.
186
+ }
187
+ try {
188
+ fs.unlinkSync(tmp_name);
189
+ }
190
+ catch {
191
+ // Best-effort cleanup.
192
+ }
193
+ throw err;
194
+ }
195
+ return target;
196
+ }
197
+ /**
198
+ * Serialize like Python's `json.dumps(data, indent=2, sort_keys=True)`.
199
+ * Object keys are emitted in sorted order; arrays keep their order; non-ASCII
200
+ * characters are `\uXXXX`-escaped (Python's `ensure_ascii=True` default).
201
+ * Mirrors Python's separators for `indent` mode (`","` line separator, `": "`
202
+ * key separator).
203
+ */
204
+ function json_dumps_sorted(value, indent) {
205
+ return render_json(value, indent, 0);
206
+ }
207
+ function render_json(value, indent, depth) {
208
+ if (value === null) {
209
+ return "null";
210
+ }
211
+ if (typeof value === "boolean" || typeof value === "number") {
212
+ return JSON.stringify(value);
213
+ }
214
+ if (typeof value === "string") {
215
+ return json_string_ascii(value);
216
+ }
217
+ const pad = " ".repeat(indent * (depth + 1));
218
+ const close_pad = " ".repeat(indent * depth);
219
+ if (Array.isArray(value)) {
220
+ if (value.length === 0) {
221
+ return "[]";
222
+ }
223
+ const items = value.map((v) => pad + render_json(v, indent, depth + 1));
224
+ return "[\n" + items.join(",\n") + "\n" + close_pad + "]";
225
+ }
226
+ if (typeof value === "object") {
227
+ const obj = value;
228
+ const keys = Object.keys(obj).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
229
+ if (keys.length === 0) {
230
+ return "{}";
231
+ }
232
+ const items = keys.map((k) => pad + json_string_ascii(k) + ": " + render_json(obj[k], indent, depth + 1));
233
+ return "{\n" + items.join(",\n") + "\n" + close_pad + "}";
234
+ }
235
+ // Fallback for unsupported types (undefined, function) — Python would raise;
236
+ // here we coerce to null to avoid producing invalid JSON.
237
+ return "null";
238
+ }
239
+ /**
240
+ * JSON-encode a string the way Python's `json.dumps(s, ensure_ascii=True)`
241
+ * does: standard escapes plus `\uXXXX` for any codepoint > 0x7e. Astral
242
+ * codepoints are emitted as UTF-16 surrogate pairs, matching CPython.
243
+ */
244
+ function json_string_ascii(s) {
245
+ // JSON.stringify handles the standard escapes (\", \\, \n, \t, control
246
+ // chars) and surrogate-pair structure; we then escape any remaining
247
+ // non-ASCII code units to \uXXXX, which is exactly Python's ensure_ascii.
248
+ const base = JSON.stringify(s);
249
+ let out = "";
250
+ for (let i = 0; i < base.length; i += 1) {
251
+ const code = base.charCodeAt(i);
252
+ if (code > 0x7e) {
253
+ out += "\\u" + code.toString(16).padStart(4, "0");
254
+ }
255
+ else {
256
+ out += base[i];
257
+ }
258
+ }
259
+ return out;
260
+ }
261
+ /**
262
+ * Anchor-relative paths the deploy of `src` → `<anchor>/<dest_rel>` maintains
263
+ * — written OR skipped-as-identical.
264
+ *
265
+ * Mirrors the traversal of `install._copy_dir_dereferencing_symlinks`:
266
+ * symlinked files resolve to file entries, symlinked subdirectories are walked
267
+ * through their resolved targets. `dest_rel` may be empty (`""`) for plan
268
+ * entries that deploy into the anchor root.
269
+ *
270
+ * `file_filter` MUST be the same predicate the copy was given. This set is what
271
+ * the reaper treats as "should exist"; a file the copy skipped but this set
272
+ * still lists is never reaped, and a file this set omits while the copy wrote it
273
+ * is deleted on the next deploy. Passing the filter to one and not the other is
274
+ * the failure mode the rule-scoping work exists to avoid — see
275
+ * `install._deploy_global_content`, which derives one filter and hands it to
276
+ * both.
277
+ */
278
+ export function expected_deploy_files(src, dest_rel, file_filter = null) {
279
+ const out = new Set();
280
+ let src_stat;
281
+ try {
282
+ src_stat = fs.statSync(src);
283
+ }
284
+ catch {
285
+ // Source does not exist (or a broken symlink) → empty set.
286
+ return out;
287
+ }
288
+ if (!src_stat.isDirectory()) {
289
+ if (file_filter !== null && !file_filter(src)) {
290
+ return out;
291
+ }
292
+ out.add(as_posix(dest_rel));
293
+ return out;
294
+ }
295
+ const _walk = (node, prefix) => {
296
+ const entries = fs.readdirSync(node).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
297
+ for (const name of entries) {
298
+ const entry = path.join(node, name);
299
+ const rel = join_rel(prefix, name);
300
+ const lst = fs.lstatSync(entry);
301
+ if (lst.isDirectory() && !lst.isSymbolicLink()) {
302
+ _walk(entry, rel);
303
+ continue;
304
+ }
305
+ // Resolve the entry; symlinked dirs are walked through their target.
306
+ let resolved_is_dir = false;
307
+ try {
308
+ resolved_is_dir = fs.statSync(entry).isDirectory();
309
+ }
310
+ catch {
311
+ resolved_is_dir = false;
312
+ }
313
+ if (resolved_is_dir) {
314
+ _walk(fs.realpathSync(entry), rel);
315
+ continue;
316
+ }
317
+ // The predicate sees the SOURCE path, never `rel`: the rule-scope
318
+ // predicate reads the file's own frontmatter tags, so a dest-relative
319
+ // path would not resolve. Same contract as the copy twin.
320
+ if (file_filter !== null && !file_filter(entry)) {
321
+ continue;
322
+ }
323
+ out.add(as_posix(rel));
324
+ }
325
+ };
326
+ _walk(src, dest_rel);
327
+ return out;
328
+ }
329
+ /** Join a prefix path fragment with a child name, tolerating an empty prefix. */
330
+ function join_rel(prefix, name) {
331
+ return prefix ? path.join(prefix, name) : name;
332
+ }
333
+ /** Convert a path to POSIX (forward-slash) form, like `PurePath.as_posix()`. */
334
+ function as_posix(p) {
335
+ if (p === "") {
336
+ // Python's `Path('').as_posix()` is `"."`.
337
+ return ".";
338
+ }
339
+ return p.split(path.sep).join("/");
340
+ }
341
+ /**
342
+ * Delete previously-deployed files that the current deploy dropped.
343
+ *
344
+ * Returns the absolute paths actually deleted. Mutates nothing in `inventory`
345
+ * — callers record the new state via {@link record_deploy}.
346
+ *
347
+ * `dry_run=true` computes and returns the would-delete set (only paths that
348
+ * currently exist on disk) WITHOUT unlinking anything or pruning empty
349
+ * directories — the preview surface for `agent-config install --dry-run`. The selection
350
+ * logic (orphan diff, containment proof, directory guard) is identical to the
351
+ * live path, so the preview is exact.
352
+ */
353
+ export function reap_stale(tool_id, anchor, current_files, inventory, dry_run = false) {
354
+ const tools = inventory["tools"] ?? {};
355
+ const entry = tools[tool_id];
356
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
357
+ return [];
358
+ }
359
+ const e = entry;
360
+ const recorded_anchor = e["anchor"];
361
+ const prev_files = e["files"];
362
+ if (typeof recorded_anchor !== "string" || !Array.isArray(prev_files)) {
363
+ return [];
364
+ }
365
+ const anchor_resolved = resolve_path(expanduser(anchor));
366
+ if (resolve_path(expanduser(recorded_anchor)) !== anchor_resolved) {
367
+ // Anchor moved between installs — the old tree is not provably ours
368
+ // anymore; record-only, never delete.
369
+ return [];
370
+ }
371
+ const deleted = [];
372
+ const prune_candidates = new Set();
373
+ const orphans = difference(prev_files, current_files);
374
+ for (const rel of sorted_strings(orphans)) {
375
+ if (typeof rel !== "string" || !rel || rel.startsWith("/") || rel.startsWith("..")) {
376
+ continue;
377
+ }
378
+ const target = path.join(anchor_resolved, rel);
379
+ try {
380
+ // Containment proof: the path (sans final component, which may be a
381
+ // dangling symlink) must stay inside the anchor.
382
+ relative_to(resolve_path(path.dirname(target)), anchor_resolved);
383
+ }
384
+ catch {
385
+ continue;
386
+ }
387
+ let lst = null;
388
+ try {
389
+ lst = fs.lstatSync(target);
390
+ }
391
+ catch {
392
+ lst = null;
393
+ }
394
+ if (lst && lst.isDirectory() && !lst.isSymbolicLink()) {
395
+ continue; // never delete directories
396
+ }
397
+ if (dry_run) {
398
+ // Preview: report only what is actually on disk and would go.
399
+ if (path_exists(target) || (lst !== null && lst.isSymbolicLink())) {
400
+ deleted.push(target);
401
+ }
402
+ continue;
403
+ }
404
+ try {
405
+ fs.unlinkSync(target);
406
+ }
407
+ catch {
408
+ continue;
409
+ }
410
+ deleted.push(target);
411
+ prune_candidates.add(path.dirname(target));
412
+ }
413
+ prune_empty_dirs(prune_candidates, anchor_resolved);
414
+ return deleted;
415
+ }
416
+ /**
417
+ * Marker-based reaping of package-tagged orphans — runs EVERY deploy.
418
+ *
419
+ * This is the self-healing reaping path, complementary to {@link reap_stale}
420
+ * (which can only diff against the *previous* inventory). It is the **only**
421
+ * path with ownership proof independent of inventory history: every deployed
422
+ * `.md` carries the injected `package:` frontmatter tag (install P5.1), so a
423
+ * tagged file absent from the current bundle is provably our orphan regardless
424
+ * of whether any inventory ever recorded it.
425
+ *
426
+ * Why it must run every deploy, not just on first-run: an install that
427
+ * predates the inventory sidecar never recorded its files, so once a tool
428
+ * *does* get an inventory entry, {@link reap_stale} has no record of those
429
+ * legacy files to diff against — they would rot forever (the renamed skills,
430
+ * retired command-as-skill entries, 2026-05-13 colon-named shapes, and
431
+ * post-6.0.0 command renames like `create-pr` → `pr/create`). Running this
432
+ * sweep unconditionally closes that gap; it is idempotent (a clean tree yields
433
+ * no deletions).
434
+ *
435
+ * Deletes `.md` files under `<anchor>/<dest_sub>` that (a) carry
436
+ * `package: <package_tag>` in their frontmatter and (b) are not in the current
437
+ * expected file set; then prunes empty directories. Untagged files
438
+ * (user-authored skills in shared anchors) are never touched. Returns the
439
+ * absolute paths deleted.
440
+ *
441
+ * `dry_run=true` returns the would-delete set (tagged orphans actually present
442
+ * on disk) WITHOUT unlinking or pruning — the preview surface for
443
+ * `agent-config install --dry-run`. Selection logic is identical to the live path.
444
+ */
445
+ export function reap_tagged_orphans(anchor, dest_subs, current_files, package_tag, dry_run = false) {
446
+ const anchor_resolved = resolve_path(expanduser(anchor));
447
+ const deleted = [];
448
+ const prune_candidates = new Set();
449
+ const needle = `package: ${package_tag}`;
450
+ for (const dest_sub of dest_subs) {
451
+ const root = dest_sub ? path.join(anchor_resolved, dest_sub) : anchor_resolved;
452
+ let root_stat;
453
+ try {
454
+ root_stat = fs.statSync(root);
455
+ }
456
+ catch {
457
+ continue;
458
+ }
459
+ if (!root_stat.isDirectory()) {
460
+ continue;
461
+ }
462
+ for (const md of rglob_md(root)) {
463
+ let md_lst;
464
+ try {
465
+ md_lst = fs.lstatSync(md);
466
+ }
467
+ catch {
468
+ continue;
469
+ }
470
+ if (md_lst.isDirectory()) {
471
+ continue;
472
+ }
473
+ const rel = relative_to_posix(md, anchor_resolved);
474
+ if (current_files.has(rel)) {
475
+ continue;
476
+ }
477
+ try {
478
+ relative_to(resolve_path(path.dirname(md)), anchor_resolved);
479
+ }
480
+ catch {
481
+ continue;
482
+ }
483
+ let head;
484
+ try {
485
+ head = fs.readFileSync(md, { encoding: "utf-8" });
486
+ }
487
+ catch {
488
+ continue;
489
+ }
490
+ if (!head.startsWith("---")) {
491
+ continue;
492
+ }
493
+ const end = head.indexOf("\n---", 3);
494
+ const block = head.slice(0, end !== -1 ? end : head.length);
495
+ const hit = splitlines(block).some((line) => line.trim() === needle);
496
+ if (!hit) {
497
+ continue;
498
+ }
499
+ if (dry_run) {
500
+ deleted.push(md);
501
+ continue;
502
+ }
503
+ try {
504
+ fs.unlinkSync(md);
505
+ }
506
+ catch {
507
+ continue;
508
+ }
509
+ deleted.push(md);
510
+ prune_candidates.add(path.dirname(md));
511
+ }
512
+ }
513
+ prune_empty_dirs(prune_candidates, anchor_resolved);
514
+ return deleted;
515
+ }
516
+ /**
517
+ * Upsert the tool's inventory entry; returns the mutated inventory.
518
+ *
519
+ * `anchor` is stored AS GIVEN — pass the unexpanded form (`~/.agents/`) so the
520
+ * inventory content stays identical across machines/homes (GUI/CLI parity) and
521
+ * survives a home relocation. {@link reap_stale} expands the recorded value at
522
+ * comparison time.
523
+ */
524
+ export function record_deploy(tool_id, anchor, current_files, inventory) {
525
+ if (typeof inventory["tools"] !== "object" ||
526
+ inventory["tools"] === null ||
527
+ Array.isArray(inventory["tools"])) {
528
+ inventory["tools"] = {};
529
+ }
530
+ const tools = inventory["tools"];
531
+ tools[tool_id] = {
532
+ anchor: String(anchor),
533
+ files: sorted_strings([...current_files]),
534
+ };
535
+ inventory["schema_version"] = SCHEMA_VERSION;
536
+ return inventory;
537
+ }
538
+ // --- helpers ---------------------------------------------------------------
539
+ /** Prune now-empty directories up to (exclusive) the anchor. */
540
+ function prune_empty_dirs(prune_candidates, anchor_resolved) {
541
+ const ordered = [...prune_candidates].sort((a, b) => b.split(path.sep).length - a.split(path.sep).length);
542
+ for (const start of ordered) {
543
+ let node = start;
544
+ while (node !== anchor_resolved && is_ancestor(anchor_resolved, node)) {
545
+ try {
546
+ fs.rmdirSync(node); // only succeeds when empty
547
+ }
548
+ catch {
549
+ break;
550
+ }
551
+ node = path.dirname(node);
552
+ }
553
+ }
554
+ }
555
+ /** `anchor in node.parents` — is `anchor` a strict ancestor of `node`? */
556
+ /**
557
+ * Is `node` strictly inside `anchor`? Pure path arithmetic, no I/O — callers
558
+ * pass already-resolved (realpath'd) paths when symlink escape matters.
559
+ *
560
+ * Exported for `install._copy_dir_dereferencing_symlinks`, which must reject a
561
+ * symlink whose target leaves the package root. One definition rather than a
562
+ * second copy of the `path.relative` idiom.
563
+ */
564
+ export function is_ancestor(anchor, node) {
565
+ const rel = path.relative(anchor, node);
566
+ return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel);
567
+ }
568
+ /** `child.relative_to(parent)` — throws if `child` is not inside `parent`. */
569
+ function relative_to(child, parent) {
570
+ if (child === parent) {
571
+ return "";
572
+ }
573
+ const rel = path.relative(parent, child);
574
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
575
+ throw new Error(`'${child}' is not in the subpath of '${parent}'`);
576
+ }
577
+ return rel;
578
+ }
579
+ /** Anchor-relative POSIX path of `child` under `parent`. */
580
+ function relative_to_posix(child, parent) {
581
+ return path.relative(parent, child).split(path.sep).join("/");
582
+ }
583
+ /** Recursively collect all `*.md` files under `root` (deterministic order). */
584
+ function rglob_md(root) {
585
+ const out = [];
586
+ const walk = (dir) => {
587
+ let names;
588
+ try {
589
+ names = fs.readdirSync(dir).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
590
+ }
591
+ catch {
592
+ return;
593
+ }
594
+ for (const name of names) {
595
+ const full = path.join(dir, name);
596
+ let lst;
597
+ try {
598
+ lst = fs.lstatSync(full);
599
+ }
600
+ catch {
601
+ continue;
602
+ }
603
+ if (lst.isDirectory() && !lst.isSymbolicLink()) {
604
+ walk(full);
605
+ }
606
+ else if (name.endsWith(".md")) {
607
+ out.push(full);
608
+ }
609
+ }
610
+ };
611
+ walk(root);
612
+ return out;
613
+ }
614
+ /** `set(prev) - current` over string members. */
615
+ function difference(prev, current) {
616
+ const seen = new Set();
617
+ const out = [];
618
+ for (const item of prev) {
619
+ if (typeof item === "string" && current.has(item)) {
620
+ continue;
621
+ }
622
+ if (seen.has(item)) {
623
+ continue;
624
+ }
625
+ seen.add(item);
626
+ out.push(item);
627
+ }
628
+ return out;
629
+ }
630
+ /**
631
+ * The anchor-relative paths a previous deploy of `tool_id` recorded.
632
+ *
633
+ * Empty whenever the inventory has no entry, the recorded anchor differs from
634
+ * `anchor`, or the entry is malformed — the same "not provably ours anymore"
635
+ * discipline `reap_stale` applies before it deletes anything. Callers use it
636
+ * to answer "did this package write that file" for a file the CURRENT run did
637
+ * not write.
638
+ */
639
+ export function recorded_rel_files(tool_id, anchor, inventory) {
640
+ const inv = inventory ?? load_inventory();
641
+ const tools = inv["tools"] ?? {};
642
+ const entry = tools[tool_id];
643
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
644
+ return new Set();
645
+ }
646
+ const e = entry;
647
+ const recorded_anchor = e["anchor"];
648
+ const files = e["files"];
649
+ if (typeof recorded_anchor !== "string" || !Array.isArray(files)) {
650
+ return new Set();
651
+ }
652
+ if (resolve_path(expanduser(recorded_anchor)) !== resolve_path(expanduser(anchor))) {
653
+ return new Set();
654
+ }
655
+ return new Set(files.filter((f) => typeof f === "string"));
656
+ }
657
+ /**
658
+ * Every file a previous deploy recorded, as ABSOLUTE paths, across all tools.
659
+ *
660
+ * `recorded_rel_files` answers "did this package write that file" for one tool
661
+ * whose anchor the caller already knows. This answers the ownership question a
662
+ * READER has — the installed-layer report and the install receipt both walk
663
+ * host rule directories and hold absolute paths, with no tool id and no anchor
664
+ * in hand — so asking the inventory per tool would mean the reader guessing
665
+ * anchors it never recorded.
666
+ *
667
+ * `home` IS A PARAMETER, AND NOT A CONVENIENCE. The installer records the
668
+ * anchor TILDE-RELATIVE — the real inventory reads `"anchor": "~/.claude/"` —
669
+ * so the recorded path is only meaningful against a stated home. Expanding it
670
+ * against `os.homedir()` makes the answer depend on which process is asking,
671
+ * which is exactly how a reader measuring a staged install under a temporary
672
+ * HOME gets back a set naming the maintainer's own machine and claims nothing.
673
+ * Omitted, it falls back to `os.homedir()`, which is right for a caller asking
674
+ * about the install it is itself running under.
675
+ *
676
+ * BOTH SPELLINGS OF EVERY PATH ARE EMITTED — the symlink-resolved one and the
677
+ * merely-normalised one. Callers compare by set membership against a path they
678
+ * built with `path.join(dir, name)` while walking a directory, which is
679
+ * lexical; the inventory's anchor is resolved with `realpath` the way
680
+ * `recorded_rel_files` resolves its anchor comparison. On macOS those two
681
+ * differ for anything under `/var`, which realpaths to `/private/var`, and a
682
+ * one-spelling set silently claimed nothing there — the reader asked about
683
+ * `/var/...`, the set held `/private/var/...`, and every file read foreign.
684
+ * Emitting both is the cheap direction: a set is a membership test, so a second
685
+ * spelling can only make a true answer reachable, never a false one.
686
+ *
687
+ * A malformed tool entry contributes nothing rather than throwing: a corrupt
688
+ * inventory is "no evidence", never a finding, which is the same discipline
689
+ * `reap_stale` applies before it deletes anything.
690
+ */
691
+ export function recorded_absolute_files(inventory, home) {
692
+ const inv = inventory ?? load_inventory();
693
+ const tools = inv["tools"] ?? {};
694
+ const out = new Set();
695
+ if (typeof tools !== "object" || tools === null || Array.isArray(tools))
696
+ return out;
697
+ for (const entry of Object.values(tools)) {
698
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry))
699
+ continue;
700
+ const e = entry;
701
+ const anchor = e["anchor"];
702
+ const files = e["files"];
703
+ if (typeof anchor !== "string" || !Array.isArray(files))
704
+ continue;
705
+ const expanded = expanduser_at(anchor, home);
706
+ for (const rel of files) {
707
+ if (typeof rel !== "string")
708
+ continue;
709
+ const lexical = path.resolve(expanded, rel);
710
+ out.add(lexical);
711
+ out.add(resolve_path(lexical));
712
+ }
713
+ }
714
+ return out;
715
+ }
716
+ /** Sort string members ascending by codepoint (non-strings filtered out). */
717
+ function sorted_strings(items) {
718
+ return items
719
+ .filter((i) => typeof i === "string")
720
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
721
+ }
722
+ /** `str.splitlines()` — split on `\n`, dropping a trailing empty segment. */
723
+ function splitlines(text) {
724
+ const parts = text.split("\n");
725
+ if (parts.length > 0 && parts[parts.length - 1] === "") {
726
+ parts.pop();
727
+ }
728
+ return parts;
729
+ }
730
+ //# sourceMappingURL=global_deploy_inventory.js.map