@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
@@ -1,99 +0,0 @@
1
- import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
2
- import {
3
- atomicAppendLine
4
- } from "./chunk-S4YWNRKO.js";
5
-
6
- // src/install/txlog.ts
7
- import { createGzip } from "node:zlib";
8
- import { createReadStream, createWriteStream, existsSync, readFileSync, renameSync, statSync, unlinkSync } from "node:fs";
9
- import { pipeline } from "node:stream/promises";
10
- var ROTATION_MAX_BYTES = 10 * 1024 * 1024;
11
- var ROTATION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1e3;
12
- var RECOVERY_DEPTH_CAP = 500;
13
- function appendTxLog(logPath, entry) {
14
- if (shouldRotate(logPath)) {
15
- rotateLogSync(logPath);
16
- }
17
- atomicAppendLine(logPath, JSON.stringify(entry));
18
- }
19
- function readRecentEntries(logPath) {
20
- if (!existsSync(logPath)) {
21
- return [];
22
- }
23
- const raw = readFileSync(logPath, "utf8");
24
- const lines = raw.split("\n").filter((l) => l.length > 0);
25
- const tail = lines.slice(-RECOVERY_DEPTH_CAP);
26
- const out = [];
27
- for (const line of tail) {
28
- const parsed = tryParseEntry(line);
29
- if (parsed !== null) {
30
- out.push(parsed);
31
- }
32
- }
33
- return out;
34
- }
35
- function shouldRotate(logPath, now = /* @__PURE__ */ new Date()) {
36
- if (!existsSync(logPath)) {
37
- return false;
38
- }
39
- let size = 0;
40
- try {
41
- size = statSync(logPath).size;
42
- } catch {
43
- return false;
44
- }
45
- if (size >= ROTATION_MAX_BYTES) {
46
- return true;
47
- }
48
- const firstTs = readFirstTimestamp(logPath);
49
- if (firstTs === null) {
50
- return false;
51
- }
52
- return now.getTime() - firstTs >= ROTATION_MAX_AGE_MS;
53
- }
54
- function rotateLogSync(logPath) {
55
- if (!existsSync(logPath)) {
56
- return;
57
- }
58
- const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
59
- const rotated = logPath.replace(/\.jsonl$/, `.${stamp}.jsonl`);
60
- renameSync(logPath, rotated);
61
- void gzipInPlace(rotated).catch(() => {
62
- });
63
- }
64
- async function gzipInPlace(source) {
65
- const target = `${source}.gz`;
66
- await pipeline(createReadStream(source), createGzip(), createWriteStream(target));
67
- try {
68
- unlinkSync(source);
69
- } catch {
70
- }
71
- }
72
- function readFirstTimestamp(logPath) {
73
- try {
74
- const raw = readFileSync(logPath, "utf8");
75
- const firstLine = raw.split("\n", 1)[0] ?? "";
76
- const parsed = tryParseEntry(firstLine);
77
- if (parsed === null) return null;
78
- const t = Date.parse(parsed.ts);
79
- return Number.isFinite(t) ? t : null;
80
- } catch {
81
- return null;
82
- }
83
- }
84
- function tryParseEntry(line) {
85
- try {
86
- const obj = JSON.parse(line);
87
- if (typeof obj.ts !== "string" || typeof obj.kind !== "string" || typeof obj.path !== "string") {
88
- return null;
89
- }
90
- return obj;
91
- } catch {
92
- return null;
93
- }
94
- }
95
-
96
- export {
97
- appendTxLog,
98
- readRecentEntries
99
- };
@@ -1,477 +0,0 @@
1
- /**
2
- * Resolve a configuration file's `extends` / `includes` chain, and answer which
3
- * config governs a given path, before anything digests either one.
4
- *
5
- * WHY THIS EXISTS
6
- * ---------------
7
- * `standards-from-config` derives a project's enforced standards from its real
8
- * tooling config. Read literally — one file, one parse — that produces a null on
9
- * a repository whose root config is a single directive pointing somewhere else.
10
- * A fourteen-line linter config whose only load-bearing line is an `extends` into
11
- * a package in the same workspace is not a project without standards; it is a
12
- * project whose standards are one hop away. Reporting "no enforced standard
13
- * found" there is a false negative that reads exactly like a true one.
14
- *
15
- * `extends` is a specified directive in TypeScript, ESLint, Biome and Stylelint;
16
- * `includes` plays the same role in PHPStan's NEON. `workspace:`-linked packages
17
- * are a documented protocol in npm, yarn, pnpm and bun. Those are published
18
- * mechanisms, which is why chain-following is a general capability rather than
19
- * one repository's convention.
20
- *
21
- * AN EXTERNAL HOP IS LABELLED, NEVER MERGED
22
- * -----------------------------------------
23
- * A chain can leave the repository — into `node_modules`, into a vendor
24
- * directory, or above the repository root entirely. Presenting a third-party
25
- * preset as *the project's own* standard is worse than reporting nothing: the
26
- * reader cannot tell which rules the project chose. So every hop carries its
27
- * origin, and only `project` and `workspace-package` hops appear in
28
- * `digestible`. An `external` hop is reported, with its path, and excluded from
29
- * the digest.
30
- *
31
- * AN UNRESOLVABLE HOP IS A NAMED GAP, NEVER AN ABSENCE
32
- * ---------------------------------------------------
33
- * Three failures are indistinguishable to a caller that only sees "nothing came
34
- * back": the file is missing, the file is there but unparsable, and the
35
- * directive is expressed in a language this reader does not evaluate (a Rector
36
- * config building its set list from PHP expressions). All three are recorded as
37
- * a hop with `origin: 'unresolved'` and a `reason`, and any one of them sets
38
- * `complete: false`. A partial digest that says which hop it could not follow is
39
- * usable; a null is not, and a null that looks like "no standards" is a lie.
40
- * This is the same three-outcome posture the install diagnostic takes: present,
41
- * dangling, and unresolvable-for-a-stated-reason — never a silent absence.
42
- *
43
- * WHY A LOCAL JSONC READER
44
- * ------------------------
45
- * `linked_projects.ts` carries a private tolerant JSON reader that returns
46
- * `null` on both "absent" and "malformed". That collapse is correct for its
47
- * input domain and wrong here for the reason above: this module has to attribute
48
- * a parse failure to itself rather than report it as a missing config. So
49
- * `readConfigObject` returns a discriminated result instead of a nullable one.
50
- */
51
- import * as fs from 'node:fs';
52
- import * as path from 'node:path';
53
- import * as yaml from 'yaml';
54
-
55
- /** Where a hop's file lives relative to the repository — the digest gate. */
56
- export type HopOrigin = 'project' | 'workspace-package' | 'external' | 'unresolved';
57
-
58
- export interface ConfigHop {
59
- /** The directive text as written. `''` for the chain's starting file. */
60
- specifier: string;
61
- /** Repository-relative path when resolved, `null` when not. */
62
- path: string | null;
63
- origin: HopOrigin;
64
- /**
65
- * Present on every non-`project` hop. On `unresolved` it names WHY, which is
66
- * the whole point — an unnamed gap is an absence wearing a label.
67
- */
68
- reason?: string;
69
- }
70
-
71
- export interface ChainResolution {
72
- /** Every hop, in resolution order, starting with the file asked about. */
73
- hops: ConfigHop[];
74
- /** `false` when any hop is `unresolved`. A partial digest, never a null. */
75
- complete: boolean;
76
- /** The hops a digest may read: `project` + `workspace-package` only. */
77
- digestible: ConfigHop[];
78
- /** Hops outside the repository. Reported, never merged into the digest. */
79
- externals: ConfigHop[];
80
- /** The named gaps. Non-empty exactly when `complete` is `false`. */
81
- unresolved: ConfigHop[];
82
- }
83
-
84
- export interface WorkspacePackage {
85
- /** Repository-relative directory. */
86
- dir: string;
87
- /** The manifest's `name` — the key a bare specifier matches on. */
88
- name: string;
89
- }
90
-
91
- /** Bounds the walk. A chain this long is a finding, not a configuration. */
92
- const MAX_HOPS = 16;
93
-
94
- /** Directory names a chain crosses only to leave the repository. */
95
- const EXTERNAL_DIRS = new Set(['node_modules', 'vendor']);
96
-
97
- /** Extensions tried when a specifier names no file extension of its own. */
98
- const EXT_CANDIDATES = ['', '.json', '.jsonc', '.neon', '.yaml', '.yml'];
99
-
100
- /** Filenames tried when a specifier resolves to a directory. */
101
- const DIR_CANDIDATES = [
102
- 'tsconfig.json',
103
- 'biome.json',
104
- 'eslint.config.js',
105
- '.eslintrc.json',
106
- '.stylelintrc.json',
107
- 'phpstan.neon',
108
- 'index.json',
109
- ];
110
-
111
- type ReadResult =
112
- | { kind: 'ok'; value: Record<string, unknown> }
113
- | { kind: 'absent' }
114
- | { kind: 'unparsable'; reason: string }
115
- | { kind: 'opaque'; reason: string };
116
-
117
- /**
118
- * Read one config file into an object, keeping the four outcomes distinct.
119
- *
120
- * `opaque` is the case a null would hide: a `.php` config states its directives
121
- * as executable expressions, so a static reader cannot follow them and must say
122
- * so rather than report the file as carrying none.
123
- */
124
- export function readConfigObject(absPath: string): ReadResult {
125
- if (!fs.existsSync(absPath)) return { kind: 'absent' };
126
- const ext = path.extname(absPath).toLowerCase();
127
- if (ext === '.php' || ext === '.js' || ext === '.cjs' || ext === '.mjs' || ext === '.ts') {
128
- return {
129
- kind: 'opaque',
130
- reason: `${ext} config: directives are expressed as executable code and are not statically resolvable`,
131
- };
132
- }
133
- let text: string;
134
- try {
135
- text = fs.readFileSync(absPath, 'utf-8');
136
- } catch (err) {
137
- return { kind: 'unparsable', reason: `unreadable: ${(err as Error).message}` };
138
- }
139
- if (ext === '.neon' || ext === '.yaml' || ext === '.yml') {
140
- // NEON's `includes:` list and YAML's `extends:` are both a top-level key
141
- // holding a scalar or a sequence, which YAML parses for both formats.
142
- try {
143
- const parsed = yaml.parse(text) as unknown;
144
- if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
145
- return { kind: 'unparsable', reason: 'top level is not a mapping' };
146
- }
147
- return { kind: 'ok', value: parsed as Record<string, unknown> };
148
- } catch (err) {
149
- return { kind: 'unparsable', reason: `parse error: ${(err as Error).message}` };
150
- }
151
- }
152
- const strict = tryJson(text);
153
- if (strict) return { kind: 'ok', value: strict };
154
- // tsconfig.json and its family carry `//` comments and trailing commas by
155
- // convention, so a strict parse failure is not yet a finding.
156
- const tolerant = tryJson(text.replace(/^\s*\/\/.*$/gm, '').replace(/,(\s*[}\]])/g, '$1'));
157
- if (tolerant) return { kind: 'ok', value: tolerant };
158
- return { kind: 'unparsable', reason: 'not valid JSON, even allowing comments and trailing commas' };
159
- }
160
-
161
- function tryJson(text: string): Record<string, unknown> | null {
162
- try {
163
- const parsed = JSON.parse(text) as unknown;
164
- if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
165
- return parsed as Record<string, unknown>;
166
- } catch {
167
- return null;
168
- }
169
- }
170
-
171
- /** Pull the chain directives out of a parsed config, in declaration order. */
172
- function directives(config: Record<string, unknown>): string[] {
173
- const out: string[] = [];
174
- for (const key of ['extends', 'includes']) {
175
- const raw = config[key];
176
- if (typeof raw === 'string') out.push(raw);
177
- else if (Array.isArray(raw)) {
178
- for (const item of raw) if (typeof item === 'string') out.push(item);
179
- }
180
- }
181
- return out;
182
- }
183
-
184
- /**
185
- * Enumerate the repository's workspace packages from its declarative source.
186
- *
187
- * `pnpm-workspace.yaml` wins when present because it is the more specific
188
- * declaration; otherwise `package.json#workspaces`. Conventional directories are
189
- * never used as a substitute — a declaration and a convention can disagree, and
190
- * the declaration is what the package manager obeys.
191
- */
192
- export function listWorkspacePackages(repoRoot: string): WorkspacePackage[] {
193
- const patterns = workspacePatterns(repoRoot);
194
- const seen = new Set<string>();
195
- const out: WorkspacePackage[] = [];
196
- for (const pattern of patterns) {
197
- for (const dir of expandPattern(repoRoot, pattern)) {
198
- if (seen.has(dir)) continue;
199
- seen.add(dir);
200
- const manifest = readConfigObject(path.join(repoRoot, dir, 'package.json'));
201
- if (manifest.kind !== 'ok') continue;
202
- const name = manifest.value.name;
203
- if (typeof name === 'string' && name.length > 0) out.push({ dir, name });
204
- }
205
- }
206
- return out;
207
- }
208
-
209
- function workspacePatterns(repoRoot: string): string[] {
210
- const pnpm = path.join(repoRoot, 'pnpm-workspace.yaml');
211
- if (fs.existsSync(pnpm)) {
212
- const parsed = readConfigObject(pnpm);
213
- if (parsed.kind === 'ok' && Array.isArray(parsed.value.packages)) {
214
- return (parsed.value.packages as unknown[]).filter((p): p is string => typeof p === 'string');
215
- }
216
- }
217
- const rootManifest = readConfigObject(path.join(repoRoot, 'package.json'));
218
- if (rootManifest.kind === 'ok') {
219
- const ws = rootManifest.value.workspaces;
220
- if (Array.isArray(ws)) return ws.filter((p): p is string => typeof p === 'string');
221
- if (ws && typeof ws === 'object' && Array.isArray((ws as Record<string, unknown>).packages)) {
222
- return ((ws as Record<string, unknown>).packages as unknown[]).filter(
223
- (p): p is string => typeof p === 'string',
224
- );
225
- }
226
- }
227
- return [];
228
- }
229
-
230
- /**
231
- * Expand one workspace glob to the directories that actually carry a manifest.
232
- *
233
- * Only `*` and `**` as whole path segments are supported, which is what every
234
- * workspace declaration in the wild uses. A pattern this cannot express returns
235
- * nothing rather than a guess — a wrong workspace list would misclassify an
236
- * external hop as the project's own, which is the one error this module exists
237
- * to prevent.
238
- */
239
- function expandPattern(repoRoot: string, pattern: string): string[] {
240
- const segments = pattern.replace(/^\.\//, '').split('/').filter((s) => s.length > 0);
241
- let frontier: string[] = [''];
242
- for (const segment of segments) {
243
- const next: string[] = [];
244
- for (const base of frontier) {
245
- if (segment === '*') next.push(...childDirs(repoRoot, base));
246
- else if (segment === '**') next.push(base, ...recursiveDirs(repoRoot, base, 4));
247
- else {
248
- const candidate = base ? `${base}/${segment}` : segment;
249
- if (isDir(path.join(repoRoot, candidate))) next.push(candidate);
250
- }
251
- }
252
- frontier = next;
253
- }
254
- return frontier.filter((d) => d.length > 0);
255
- }
256
-
257
- function childDirs(repoRoot: string, base: string): string[] {
258
- const abs = path.join(repoRoot, base);
259
- if (!isDir(abs)) return [];
260
- return fs
261
- .readdirSync(abs, { withFileTypes: true })
262
- .filter((e) => e.isDirectory() && !e.name.startsWith('.') && !EXTERNAL_DIRS.has(e.name))
263
- .map((e) => (base ? `${base}/${e.name}` : e.name));
264
- }
265
-
266
- function recursiveDirs(repoRoot: string, base: string, depth: number): string[] {
267
- if (depth <= 0) return [];
268
- const out: string[] = [];
269
- for (const child of childDirs(repoRoot, base)) {
270
- out.push(child, ...recursiveDirs(repoRoot, child, depth - 1));
271
- }
272
- return out;
273
- }
274
-
275
- function isDir(abs: string): boolean {
276
- try {
277
- return fs.statSync(abs).isDirectory();
278
- } catch {
279
- return false;
280
- }
281
- }
282
-
283
- /** Classify a resolved absolute path by where it sits relative to the repo. */
284
- function classify(repoRoot: string, abs: string): { origin: HopOrigin; reason?: string } {
285
- const rel = path.relative(repoRoot, abs);
286
- if (rel.startsWith('..') || path.isAbsolute(rel)) {
287
- return { origin: 'external', reason: 'resolves above the repository root' };
288
- }
289
- const crossed = rel.split(path.sep).find((seg) => EXTERNAL_DIRS.has(seg));
290
- if (crossed) return { origin: 'external', reason: `resolves inside \`${crossed}/\`` };
291
- return { origin: 'project' };
292
- }
293
-
294
- /** Try a specifier as a file, then with each extension, then as a directory. */
295
- function firstExistingFile(base: string): string | null {
296
- for (const ext of EXT_CANDIDATES) {
297
- const candidate = base + ext;
298
- if (fs.existsSync(candidate) && !isDir(candidate)) return candidate;
299
- }
300
- if (isDir(base)) {
301
- for (const name of DIR_CANDIDATES) {
302
- const candidate = path.join(base, name);
303
- if (fs.existsSync(candidate)) return candidate;
304
- }
305
- }
306
- return null;
307
- }
308
-
309
- function resolveSpecifier(
310
- repoRoot: string,
311
- fromDir: string,
312
- specifier: string,
313
- workspaces: WorkspacePackage[],
314
- ): ConfigHop {
315
- const hop = (patch: Partial<ConfigHop>): ConfigHop => ({ specifier, path: null, origin: 'unresolved', ...patch });
316
-
317
- if (specifier.startsWith('.') || path.isAbsolute(specifier)) {
318
- const base = path.isAbsolute(specifier) ? specifier : path.resolve(fromDir, specifier);
319
- const found = firstExistingFile(base);
320
- if (!found) return hop({ reason: 'relative target does not exist' });
321
- const { origin, reason } = classify(repoRoot, found);
322
- return hop({ path: path.relative(repoRoot, found), origin, ...(reason === undefined ? {} : { reason }) });
323
- }
324
-
325
- // A bare specifier is a workspace package before it is a dependency: a
326
- // `workspace:`-linked config package is INSIDE the repository, so its rules
327
- // are the project's own and belong in the digest.
328
- const match = workspaces
329
- .filter((ws) => specifier === ws.name || specifier.startsWith(`${ws.name}/`))
330
- .sort((a, b) => b.name.length - a.name.length)[0];
331
- if (match) {
332
- const subpath = specifier.slice(match.name.length).replace(/^\//, '');
333
- const wsDir = path.join(repoRoot, match.dir);
334
- const found = subpath ? firstExistingFile(path.join(wsDir, subpath)) : workspaceEntry(wsDir);
335
- if (!found) {
336
- return hop({ reason: `workspace package \`${match.name}\` has no config at \`${subpath || 'its entry point'}\`` });
337
- }
338
- return hop({ path: path.relative(repoRoot, found), origin: 'workspace-package', reason: `workspace package \`${match.name}\`` });
339
- }
340
-
341
- const installed = firstExistingFile(path.join(repoRoot, 'node_modules', specifier));
342
- if (installed) {
343
- return hop({ path: path.relative(repoRoot, installed), origin: 'external', reason: 'resolves inside `node_modules/`' });
344
- }
345
- return hop({ reason: 'bare specifier matches no workspace package and is not installed' });
346
- }
347
-
348
- /** A config package's entry: its manifest `main`, else a conventional filename. */
349
- function workspaceEntry(wsDir: string): string | null {
350
- const manifest = readConfigObject(path.join(wsDir, 'package.json'));
351
- if (manifest.kind === 'ok' && typeof manifest.value.main === 'string') {
352
- const viaMain = firstExistingFile(path.join(wsDir, manifest.value.main));
353
- if (viaMain) return viaMain;
354
- }
355
- return firstExistingFile(wsDir);
356
- }
357
-
358
- /**
359
- * Follow `extends` / `includes` from one config file and report the whole chain.
360
- *
361
- * The returned `hops` always contain at least the starting file, so a caller
362
- * that finds `digestible` empty can still say WHICH file it read and why nothing
363
- * came of it. `startPath` is repository-relative.
364
- */
365
- export function resolveConfigChain(repoRoot: string, startPath: string): ChainResolution {
366
- const workspaces = listWorkspacePackages(repoRoot);
367
- const hops: ConfigHop[] = [];
368
- const seen = new Set<string>();
369
- const queue: ConfigHop[] = [];
370
-
371
- const startAbs = path.resolve(repoRoot, startPath);
372
- if (!fs.existsSync(startAbs)) {
373
- hops.push({ specifier: '', path: startPath, origin: 'unresolved', reason: 'starting config does not exist' });
374
- } else {
375
- const { origin, reason } = classify(repoRoot, startAbs);
376
- queue.push({
377
- specifier: '',
378
- path: path.relative(repoRoot, startAbs),
379
- origin,
380
- ...(reason === undefined ? {} : { reason }),
381
- });
382
- }
383
-
384
- while (queue.length > 0) {
385
- const hop = queue.shift() as ConfigHop;
386
- if (hops.length >= MAX_HOPS) {
387
- hops.push({ ...hop, origin: 'unresolved', reason: `chain exceeds ${MAX_HOPS} hops` });
388
- break;
389
- }
390
- const abs = path.resolve(repoRoot, hop.path as string); // non-null: unresolved hops are never queued
391
- if (seen.has(abs)) {
392
- hops.push({ ...hop, origin: 'unresolved', reason: 'cycle: this file is already in the chain' });
393
- continue;
394
- }
395
- seen.add(abs);
396
-
397
- const read = readConfigObject(abs);
398
- if (read.kind !== 'ok') {
399
- const reason = read.kind === 'absent' ? 'file disappeared between resolution and read' : read.reason;
400
- hops.push({ ...hop, origin: 'unresolved', reason });
401
- continue;
402
- }
403
- hops.push(hop);
404
- // An external hop's own directives are not followed. Its rules are
405
- // already excluded from the digest, so walking deeper would only grow
406
- // the report with paths the project does not own.
407
- if (hop.origin === 'external') continue;
408
- for (const specifier of directives(read.value)) {
409
- const next = resolveSpecifier(repoRoot, path.dirname(abs), specifier, workspaces);
410
- // A hop the specifier resolver could not place has no path to read,
411
- // so it is RECORDED and not queued. Queueing it walked into
412
- // `path.resolve(root, null)` and threw — which turned a partial
413
- // digest, the whole point of this module, into a crash on exactly
414
- // the input it exists to handle gracefully.
415
- if (next.path === null) {
416
- hops.push(next);
417
- continue;
418
- }
419
- queue.push(next);
420
- }
421
- }
422
-
423
- const unresolved = hops.filter((h) => h.origin === 'unresolved');
424
- return {
425
- hops,
426
- complete: unresolved.length === 0,
427
- digestible: hops.filter((h) => h.origin === 'project' || h.origin === 'workspace-package'),
428
- externals: hops.filter((h) => h.origin === 'external'),
429
- unresolved,
430
- };
431
- }
432
-
433
- export interface NearestConfigResult {
434
- /** The config that governs `editPath`, repository-relative. `null` = none. */
435
- governing: string | null;
436
- /** Every candidate found walking up, nearest first. The precedence order. */
437
- candidates: string[];
438
- /** Which rule decided: nearest-wins, root-only, or none-found. */
439
- basis: 'nearest-wins' | 'root-only' | 'none-found';
440
- }
441
-
442
- /**
443
- * Answer which config governs an edit, given the config filenames to look for.
444
- *
445
- * Precedence is **nearest-first**: the file in the edited path's own directory
446
- * governs, then its parent, up to the repository root. This is not a preference
447
- * — it is what the tools do. A per-package `tsconfig.json`, `.eslintrc`, `.env`
448
- * or deployment manifest is the one its own package's build reads, and a root
449
- * file it does not extend has no effect on it. Reading the root config for an
450
- * edit inside a package that carries its own is a wrong answer, not a coarse one.
451
- *
452
- * `candidates` is the full walk rather than just the winner, because a reader
453
- * needs to see that a root config was found and outranked before they trust the
454
- * per-package answer.
455
- */
456
- export function nearestConfig(repoRoot: string, editPath: string, filenames: string[]): NearestConfigResult {
457
- const candidates: string[] = [];
458
- const startAbs = path.resolve(repoRoot, editPath);
459
- let dir = isDir(startAbs) ? startAbs : path.dirname(startAbs);
460
- const rootAbs = path.resolve(repoRoot);
461
-
462
- for (;;) {
463
- for (const name of filenames) {
464
- const candidate = path.join(dir, name);
465
- if (fs.existsSync(candidate) && !isDir(candidate)) candidates.push(path.relative(rootAbs, candidate));
466
- }
467
- if (dir === rootAbs) break;
468
- const parent = path.dirname(dir);
469
- if (parent === dir || !parent.startsWith(rootAbs)) break;
470
- dir = parent;
471
- }
472
-
473
- if (candidates.length === 0) return { governing: null, candidates, basis: 'none-found' };
474
- const governing = candidates[0] as string;
475
- const basis = candidates.length === 1 && !governing.includes('/') ? 'root-only' : 'nearest-wins';
476
- return { governing, candidates, basis };
477
- }