@bonesofspring/ai-rules 0.2.28 → 0.2.30

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 (282) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -1
  3. package/docs/MAVIS-COMPATIBILITY.md +10 -6
  4. package/docs/MAVIS.md +15 -6
  5. package/docs/OPENCODE-COMPATIBILITY.md +2 -2
  6. package/docs/OPENCODE.md +1 -1
  7. package/package.json +5 -1
  8. package/presets/_shared/core/meta/preset-pr-checklist.md +2 -2
  9. package/presets/claude/android-kotlin/CLAUDE.md +3 -1
  10. package/presets/claude/android-kotlin/REPO_AGENTS.md +1 -1
  11. package/presets/claude/android-kotlin/hooks/README.md +6 -5
  12. package/presets/claude/android-kotlin/hooks/chain-team-phases.sh +18 -0
  13. package/presets/claude/android-kotlin/hooks/examples/README.md +2 -0
  14. package/presets/claude/android-kotlin/hooks/guard-shell-command.sh +32 -9
  15. package/presets/claude/android-kotlin/rules/README.md +1 -1
  16. package/presets/claude/android-kotlin/rules/tooling-and-review/ai-local-overlay.md +0 -5
  17. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  18. package/presets/claude/android-kotlin/settings.json +23 -0
  19. package/presets/claude/go/CLAUDE.md +3 -1
  20. package/presets/claude/go/REPO_AGENTS.md +1 -1
  21. package/presets/claude/go/hooks/README.md +6 -5
  22. package/presets/claude/go/hooks/chain-team-phases.sh +18 -0
  23. package/presets/claude/go/hooks/examples/README.md +2 -0
  24. package/presets/claude/go/hooks/guard-shell-command.sh +32 -9
  25. package/presets/claude/go/rules/README.md +1 -1
  26. package/presets/claude/go/rules/tooling-and-review/ai-local-overlay.md +0 -5
  27. package/presets/claude/go/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  28. package/presets/claude/go/settings.json +23 -0
  29. package/presets/claude/ios-swift/CLAUDE.md +3 -1
  30. package/presets/claude/ios-swift/REPO_AGENTS.md +1 -1
  31. package/presets/claude/ios-swift/hooks/README.md +6 -5
  32. package/presets/claude/ios-swift/hooks/chain-team-phases.sh +18 -0
  33. package/presets/claude/ios-swift/hooks/examples/README.md +2 -0
  34. package/presets/claude/ios-swift/hooks/guard-shell-command.sh +32 -9
  35. package/presets/claude/ios-swift/rules/README.md +1 -1
  36. package/presets/claude/ios-swift/rules/tooling-and-review/ai-local-overlay.md +0 -5
  37. package/presets/claude/ios-swift/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  38. package/presets/claude/ios-swift/settings.json +23 -0
  39. package/presets/claude/java/CLAUDE.md +3 -1
  40. package/presets/claude/java/REPO_AGENTS.md +1 -1
  41. package/presets/claude/java/hooks/README.md +6 -5
  42. package/presets/claude/java/hooks/chain-team-phases.sh +18 -0
  43. package/presets/claude/java/hooks/examples/README.md +2 -0
  44. package/presets/claude/java/hooks/guard-shell-command.sh +32 -9
  45. package/presets/claude/java/rules/README.md +1 -1
  46. package/presets/claude/java/rules/tooling-and-review/ai-local-overlay.md +0 -5
  47. package/presets/claude/java/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  48. package/presets/claude/java/settings.json +23 -0
  49. package/presets/claude/mcp-ts/CLAUDE.md +3 -1
  50. package/presets/claude/mcp-ts/REPO_AGENTS.md +1 -1
  51. package/presets/claude/mcp-ts/hooks/README.md +8 -3
  52. package/presets/claude/mcp-ts/hooks/chain-team-phases.sh +18 -0
  53. package/presets/claude/mcp-ts/hooks/examples/README.md +5 -0
  54. package/presets/claude/mcp-ts/hooks/guard-shell-command.sh +32 -9
  55. package/presets/claude/mcp-ts/rules/README.md +1 -1
  56. package/presets/claude/mcp-ts/rules/tooling-and-review/ai-local-overlay.md +0 -5
  57. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  58. package/presets/claude/mcp-ts/settings.json +23 -0
  59. package/presets/claude/next/CLAUDE.md +3 -1
  60. package/presets/claude/next/REPO_AGENTS.md +1 -1
  61. package/presets/claude/next/agents/code-reviewer.md +35 -0
  62. package/presets/claude/next/agents/feature-developer.md +12 -0
  63. package/presets/claude/next/agents/mockup-reviewer.md +27 -1
  64. package/presets/claude/next/hooks/README.md +10 -1
  65. package/presets/claude/next/hooks/chain-team-phases.sh +18 -0
  66. package/presets/claude/next/hooks/examples/README.md +2 -0
  67. package/presets/claude/next/hooks/guard-shell-command.sh +32 -9
  68. package/presets/claude/next/rules/README.md +3 -2
  69. package/presets/claude/next/rules/architecture/feature-delivery-workflow.md +17 -0
  70. package/presets/claude/next/rules/tooling-and-review/ai-local-overlay.md +0 -5
  71. package/presets/claude/next/rules/tooling-and-review/code-review-mr.md +10 -0
  72. package/presets/claude/next/rules/tooling-and-review/mockup-review.md +9 -0
  73. package/presets/claude/next/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  74. package/presets/claude/next/rules/ui-and-accessibility/design-tokens-binding.md +42 -0
  75. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +1 -0
  76. package/presets/claude/next/settings.json +23 -0
  77. package/presets/claude/next/skills/code-review/SKILL.md +1 -0
  78. package/presets/claude/nuxt/CLAUDE.md +3 -1
  79. package/presets/claude/nuxt/REPO_AGENTS.md +1 -1
  80. package/presets/claude/nuxt/hooks/README.md +7 -4
  81. package/presets/claude/nuxt/hooks/chain-team-phases.sh +18 -0
  82. package/presets/claude/nuxt/hooks/examples/README.md +2 -0
  83. package/presets/claude/nuxt/hooks/guard-shell-command.sh +32 -9
  84. package/presets/claude/nuxt/rules/README.md +1 -1
  85. package/presets/claude/nuxt/rules/tooling-and-review/ai-local-overlay.md +0 -5
  86. package/presets/claude/nuxt/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  87. package/presets/claude/nuxt/settings.json +23 -0
  88. package/presets/claude/php-hexagonal/CLAUDE.md +3 -1
  89. package/presets/claude/php-hexagonal/REPO_AGENTS.md +1 -1
  90. package/presets/claude/php-hexagonal/hooks/README.md +6 -5
  91. package/presets/claude/php-hexagonal/hooks/chain-team-phases.sh +18 -0
  92. package/presets/claude/php-hexagonal/hooks/examples/README.md +3 -1
  93. package/presets/claude/php-hexagonal/hooks/guard-shell-command.sh +32 -9
  94. package/presets/claude/php-hexagonal/rules/README.md +1 -1
  95. package/presets/claude/php-hexagonal/rules/tooling-and-review/ai-local-overlay.md +0 -5
  96. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  97. package/presets/claude/php-hexagonal/settings.json +23 -0
  98. package/presets/claude/php-laravel/CLAUDE.md +6 -0
  99. package/presets/claude/php-laravel/REPO_AGENTS.md +1 -1
  100. package/presets/claude/php-laravel/hooks/README.md +6 -5
  101. package/presets/claude/php-laravel/hooks/chain-team-phases.sh +18 -0
  102. package/presets/claude/php-laravel/hooks/examples/README.md +3 -1
  103. package/presets/claude/php-laravel/hooks/guard-shell-command.sh +32 -9
  104. package/presets/claude/php-laravel/rules/README.md +1 -1
  105. package/presets/claude/php-laravel/rules/tooling-and-review/ai-local-overlay.md +0 -5
  106. package/presets/claude/php-laravel/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  107. package/presets/claude/php-laravel/settings.json +23 -0
  108. package/presets/claude/svelte/CLAUDE.md +3 -1
  109. package/presets/claude/svelte/REPO_AGENTS.md +1 -1
  110. package/presets/claude/svelte/hooks/README.md +7 -4
  111. package/presets/claude/svelte/hooks/chain-team-phases.sh +18 -0
  112. package/presets/claude/svelte/hooks/examples/README.md +2 -0
  113. package/presets/claude/svelte/hooks/guard-shell-command.sh +32 -9
  114. package/presets/claude/svelte/rules/README.md +1 -1
  115. package/presets/claude/svelte/rules/tooling-and-review/ai-local-overlay.md +0 -5
  116. package/presets/claude/svelte/rules/tooling-and-review/preset-pr-checklist.md +2 -2
  117. package/presets/claude/svelte/settings.json +23 -0
  118. package/presets/cursor/android-kotlin/REPO_AGENTS.md +1 -1
  119. package/presets/cursor/android-kotlin/rules/preset-pr-checklist.mdc +2 -2
  120. package/presets/cursor/go/REPO_AGENTS.md +1 -1
  121. package/presets/cursor/go/rules/preset-pr-checklist.mdc +2 -2
  122. package/presets/cursor/ios-swift/REPO_AGENTS.md +1 -1
  123. package/presets/cursor/ios-swift/rules/preset-pr-checklist.mdc +2 -2
  124. package/presets/cursor/java/REPO_AGENTS.md +1 -1
  125. package/presets/cursor/java/rules/preset-pr-checklist.mdc +2 -2
  126. package/presets/cursor/mcp-ts/REPO_AGENTS.md +1 -1
  127. package/presets/cursor/mcp-ts/rules/preset-pr-checklist.mdc +2 -2
  128. package/presets/cursor/next/REPO_AGENTS.md +1 -1
  129. package/presets/cursor/next/agents/code-reviewer.md +35 -0
  130. package/presets/cursor/next/agents/feature-developer.md +22 -0
  131. package/presets/cursor/next/agents/mockup-reviewer.md +27 -1
  132. package/presets/cursor/next/rules/README.md +3 -1
  133. package/presets/cursor/next/rules/code-review-mr.mdc +10 -0
  134. package/presets/cursor/next/rules/design-tokens-binding.mdc +41 -0
  135. package/presets/cursor/next/rules/feature-delivery-workflow.mdc +17 -0
  136. package/presets/cursor/next/rules/mockup-review.mdc +9 -0
  137. package/presets/cursor/next/rules/preset-pr-checklist.mdc +2 -2
  138. package/presets/cursor/next/rules/react-ui.mdc +1 -0
  139. package/presets/cursor/next/skills/code-review/SKILL.md +1 -0
  140. package/presets/cursor/nuxt/REPO_AGENTS.md +1 -1
  141. package/presets/cursor/nuxt/rules/preset-pr-checklist.mdc +2 -2
  142. package/presets/cursor/php-hexagonal/REPO_AGENTS.md +1 -1
  143. package/presets/cursor/php-hexagonal/rules/preset-pr-checklist.mdc +2 -2
  144. package/presets/cursor/php-laravel/REPO_AGENTS.md +1 -1
  145. package/presets/cursor/php-laravel/rules/preset-pr-checklist.mdc +2 -2
  146. package/presets/cursor/svelte/REPO_AGENTS.md +1 -1
  147. package/presets/cursor/svelte/rules/preset-pr-checklist.mdc +2 -2
  148. package/presets/mavis/README.md +2 -0
  149. package/presets/mavis/android-kotlin/MAVIS.md +10 -1
  150. package/presets/mavis/android-kotlin/REPO_AGENTS.md +1 -1
  151. package/presets/mavis/android-kotlin/adapter-map.json +1 -1
  152. package/presets/mavis/android-kotlin/rules/preset-pr-checklist.md +2 -2
  153. package/presets/mavis/go/MAVIS.md +10 -1
  154. package/presets/mavis/go/REPO_AGENTS.md +1 -1
  155. package/presets/mavis/go/adapter-map.json +1 -1
  156. package/presets/mavis/go/rules/preset-pr-checklist.md +2 -2
  157. package/presets/mavis/ios-swift/MAVIS.md +10 -1
  158. package/presets/mavis/ios-swift/REPO_AGENTS.md +1 -1
  159. package/presets/mavis/ios-swift/adapter-map.json +1 -1
  160. package/presets/mavis/ios-swift/rules/preset-pr-checklist.md +2 -2
  161. package/presets/mavis/java/MAVIS.md +10 -1
  162. package/presets/mavis/java/REPO_AGENTS.md +1 -1
  163. package/presets/mavis/java/adapter-map.json +1 -1
  164. package/presets/mavis/java/rules/preset-pr-checklist.md +2 -2
  165. package/presets/mavis/mcp-ts/MAVIS.md +10 -1
  166. package/presets/mavis/mcp-ts/REPO_AGENTS.md +1 -1
  167. package/presets/mavis/mcp-ts/adapter-map.json +1 -1
  168. package/presets/mavis/mcp-ts/rules/preset-pr-checklist.md +2 -2
  169. package/presets/mavis/next/MAVIS.md +10 -1
  170. package/presets/mavis/next/REPO_AGENTS.md +1 -1
  171. package/presets/mavis/next/adapter-map.json +9 -1
  172. package/presets/mavis/next/agents/code-reviewer.md +35 -0
  173. package/presets/mavis/next/agents/feature-developer.md +22 -0
  174. package/presets/mavis/next/agents/mockup-reviewer.md +27 -1
  175. package/presets/mavis/next/rules/code-review-mr.md +10 -0
  176. package/presets/mavis/next/rules/design-tokens-binding.md +35 -0
  177. package/presets/mavis/next/rules/feature-delivery-workflow.md +17 -0
  178. package/presets/mavis/next/rules/mockup-review.md +9 -0
  179. package/presets/mavis/next/rules/preset-pr-checklist.md +2 -2
  180. package/presets/mavis/next/rules/react-ui.md +1 -0
  181. package/presets/mavis/next/skills/code-review/SKILL.md +1 -0
  182. package/presets/mavis/nuxt/MAVIS.md +10 -1
  183. package/presets/mavis/nuxt/REPO_AGENTS.md +1 -1
  184. package/presets/mavis/nuxt/adapter-map.json +1 -1
  185. package/presets/mavis/nuxt/rules/preset-pr-checklist.md +2 -2
  186. package/presets/mavis/php-hexagonal/MAVIS.md +10 -1
  187. package/presets/mavis/php-hexagonal/REPO_AGENTS.md +1 -1
  188. package/presets/mavis/php-hexagonal/adapter-map.json +1 -1
  189. package/presets/mavis/php-hexagonal/rules/preset-pr-checklist.md +2 -2
  190. package/presets/mavis/php-laravel/MAVIS.md +10 -1
  191. package/presets/mavis/php-laravel/REPO_AGENTS.md +1 -1
  192. package/presets/mavis/php-laravel/adapter-map.json +1 -1
  193. package/presets/mavis/php-laravel/rules/preset-pr-checklist.md +2 -2
  194. package/presets/mavis/platform-contract.json +4 -4
  195. package/presets/mavis/svelte/MAVIS.md +10 -1
  196. package/presets/mavis/svelte/REPO_AGENTS.md +1 -1
  197. package/presets/mavis/svelte/adapter-map.json +1 -1
  198. package/presets/mavis/svelte/rules/preset-pr-checklist.md +2 -2
  199. package/presets/opencode/README.md +1 -1
  200. package/presets/opencode/android-kotlin/OPENCODE.md +8 -1
  201. package/presets/opencode/android-kotlin/REPO_AGENTS.md +1 -1
  202. package/presets/opencode/android-kotlin/adapter-map.json +1 -1
  203. package/presets/opencode/android-kotlin/rules/preset-pr-checklist.md +2 -2
  204. package/presets/opencode/go/OPENCODE.md +8 -1
  205. package/presets/opencode/go/REPO_AGENTS.md +1 -1
  206. package/presets/opencode/go/adapter-map.json +1 -1
  207. package/presets/opencode/go/rules/preset-pr-checklist.md +2 -2
  208. package/presets/opencode/ios-swift/OPENCODE.md +8 -1
  209. package/presets/opencode/ios-swift/REPO_AGENTS.md +1 -1
  210. package/presets/opencode/ios-swift/adapter-map.json +1 -1
  211. package/presets/opencode/ios-swift/rules/preset-pr-checklist.md +2 -2
  212. package/presets/opencode/java/OPENCODE.md +8 -1
  213. package/presets/opencode/java/REPO_AGENTS.md +1 -1
  214. package/presets/opencode/java/adapter-map.json +1 -1
  215. package/presets/opencode/java/rules/preset-pr-checklist.md +2 -2
  216. package/presets/opencode/mcp-ts/OPENCODE.md +8 -1
  217. package/presets/opencode/mcp-ts/REPO_AGENTS.md +1 -1
  218. package/presets/opencode/mcp-ts/adapter-map.json +1 -1
  219. package/presets/opencode/mcp-ts/rules/preset-pr-checklist.md +2 -2
  220. package/presets/opencode/next/OPENCODE.md +8 -1
  221. package/presets/opencode/next/REPO_AGENTS.md +1 -1
  222. package/presets/opencode/next/adapter-map.json +9 -1
  223. package/presets/opencode/next/agents/code-reviewer.md +35 -0
  224. package/presets/opencode/next/agents/feature-developer.md +22 -0
  225. package/presets/opencode/next/agents/mockup-reviewer.md +27 -1
  226. package/presets/opencode/next/rules/code-review-mr.md +10 -0
  227. package/presets/opencode/next/rules/design-tokens-binding.md +35 -0
  228. package/presets/opencode/next/rules/feature-delivery-workflow.md +17 -0
  229. package/presets/opencode/next/rules/mockup-review.md +9 -0
  230. package/presets/opencode/next/rules/preset-pr-checklist.md +2 -2
  231. package/presets/opencode/next/rules/react-ui.md +1 -0
  232. package/presets/opencode/next/skills/code-review/SKILL.md +1 -0
  233. package/presets/opencode/nuxt/OPENCODE.md +8 -1
  234. package/presets/opencode/nuxt/REPO_AGENTS.md +1 -1
  235. package/presets/opencode/nuxt/adapter-map.json +1 -1
  236. package/presets/opencode/nuxt/rules/preset-pr-checklist.md +2 -2
  237. package/presets/opencode/php-hexagonal/OPENCODE.md +8 -1
  238. package/presets/opencode/php-hexagonal/REPO_AGENTS.md +1 -1
  239. package/presets/opencode/php-hexagonal/adapter-map.json +1 -1
  240. package/presets/opencode/php-hexagonal/rules/preset-pr-checklist.md +2 -2
  241. package/presets/opencode/php-laravel/OPENCODE.md +8 -1
  242. package/presets/opencode/php-laravel/REPO_AGENTS.md +1 -1
  243. package/presets/opencode/php-laravel/adapter-map.json +1 -1
  244. package/presets/opencode/php-laravel/rules/preset-pr-checklist.md +2 -2
  245. package/presets/opencode/platform-contract.json +1 -1
  246. package/presets/opencode/svelte/OPENCODE.md +8 -1
  247. package/presets/opencode/svelte/REPO_AGENTS.md +1 -1
  248. package/presets/opencode/svelte/adapter-map.json +1 -1
  249. package/presets/opencode/svelte/rules/preset-pr-checklist.md +2 -2
  250. package/scripts/check-local-overlay.sh +40 -4
  251. package/scripts/check-mavis-local-overlay.mjs +23 -0
  252. package/scripts/check-mavis-platform-contract.mjs +5 -2
  253. package/scripts/check-opencode-local-overlay.mjs +19 -0
  254. package/scripts/check-opencode-platform-contract.mjs +5 -2
  255. package/scripts/check-preset-token-budget.sh +7 -0
  256. package/scripts/fixtures/cli-golden/claude/next.json +19 -18
  257. package/scripts/fixtures/cli-golden/cursor/next.json +12 -11
  258. package/scripts/fixtures/cli-golden/mavis/android-kotlin.json +3 -3
  259. package/scripts/fixtures/cli-golden/mavis/go.json +3 -3
  260. package/scripts/fixtures/cli-golden/mavis/ios-swift.json +3 -3
  261. package/scripts/fixtures/cli-golden/mavis/java.json +3 -3
  262. package/scripts/fixtures/cli-golden/mavis/mcp-ts.json +3 -3
  263. package/scripts/fixtures/cli-golden/mavis/next.json +12 -11
  264. package/scripts/fixtures/cli-golden/mavis/nuxt.json +3 -3
  265. package/scripts/fixtures/cli-golden/mavis/php-hexagonal.json +3 -3
  266. package/scripts/fixtures/cli-golden/mavis/php-laravel.json +3 -3
  267. package/scripts/fixtures/cli-golden/mavis/svelte.json +3 -3
  268. package/scripts/fixtures/cli-golden/opencode/android-kotlin.json +3 -3
  269. package/scripts/fixtures/cli-golden/opencode/go.json +3 -3
  270. package/scripts/fixtures/cli-golden/opencode/ios-swift.json +3 -3
  271. package/scripts/fixtures/cli-golden/opencode/java.json +3 -3
  272. package/scripts/fixtures/cli-golden/opencode/mcp-ts.json +3 -3
  273. package/scripts/fixtures/cli-golden/opencode/next.json +12 -11
  274. package/scripts/fixtures/cli-golden/opencode/nuxt.json +3 -3
  275. package/scripts/fixtures/cli-golden/opencode/php-hexagonal.json +3 -3
  276. package/scripts/fixtures/cli-golden/opencode/php-laravel.json +3 -3
  277. package/scripts/fixtures/cli-golden/opencode/svelte.json +3 -3
  278. package/scripts/lib/generate-mavis-adapter.mjs +10 -1
  279. package/scripts/lib/generate-opencode-adapter.mjs +8 -1
  280. package/scripts/sync-claude-settings.mjs +25 -0
  281. package/scripts/sync-dogfood-claude.sh +62 -0
  282. package/scripts/test-mavis-orchestration.mjs +3 -2
@@ -21,7 +21,7 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
21
21
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
22
22
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
23
23
  - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
24
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (and `sync-dogfood-mavis.sh` / `sync-dogfood-opencode.sh` when those platforms changed), or document an intentional skip, when maintaining this monorepo
24
+ - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, and `sync-dogfood-opencode.sh` when those platforms changed, or document an intentional skip, when maintaining this monorepo
25
25
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
26
26
 
27
27
  ## Pointers
@@ -31,6 +31,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
31
31
  - Budget: `preset-token-budget`
32
32
  - Leakage: `preset-no-cross-stack-leakage`
33
33
  - Validation: stack `agents/build-verifier.md` → preset-structure section
34
- - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
34
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
35
35
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
36
36
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -90,6 +90,7 @@ For a reusable component:
90
90
  - **Forbidden** to import another component's `styles` (`../Other/styles`, `../../styles`). Allowed: `./styles`, shared primitives from `@/ui/components/...` or design-system packages.
91
91
  - CSS / `styled` order — Stylelint idiomatic-order: `css-property-order-stylelint.md` (loads on `styles.ts` / `.css`).
92
92
  - For visuals use **the style stack and tokens already in the project** (variables, theme, shared classes, design package).
93
+ - **Token binding (Figma → repo):** typography, color, spacing, radius, shadow, and imagery must bind to the project token module and the design system (`@sds/tokens-*` / `@sds/brand-colors` / DS components like `Text variant="…"`, `@sds/icon`, `next/image`). Raw `#…` / `rgb(…)` / `px` where a token exists is a finding. The full discipline — including the per-element parity checklist and the developer self-check vs Figma — is in **`design-tokens-binding.md`**. When a Figma reference exists, the `mockup-review.md` `## Design contract` section is the binding table; use it.
93
94
  - Avoid:
94
95
  - inline styles except simple cases;
95
96
  - duplicating styling already covered by shared primitives;
@@ -20,6 +20,7 @@ Use the local repository as the source of truth: `git status`, `git diff`, task
20
20
  7. **Reuse lens:** flag new helpers that duplicate existing utilities; prefer adjacent shared modules over copy-paste.
21
21
  8. **Efficiency lens:** unnecessary work, sequential ops that should be parallel, hot-path bloat, no-op store updates, overly broad reads.
22
22
  9. Report validation gaps: lint, stylelint, type-check, or relevant tests not run.
23
+ 10. **UI / Figma parity (when the diff touches UI/layout AND a Figma reference exists):** perform a detailed, pixel-accurate comparison of the implementation against the mockup across **every project viewport** (mockup-review AC-8 / Stack notes set and the repo’s Storybook viewport toolbar). Figma frames via Figma MCP `get_screenshot`; the running app via Playwright MCP / Chrome DevTools MCP at the matching width. Compare **per element** — typography, color, spacing, imagery, states, structure/responsive, auto-layout intent — bound to the `mockup-review.md` `## Design contract` and the `design-tokens-binding` discipline (`@sds/tokens-*` / DS components; raw `#…` / `px` where a token exists is a finding). Emit a `## Figma parity (UI)` section in `review.md`. **Storybook visual baselines are not a substitute.** Missing or `unable_to_compare` parity on a UI MR with a Figma reference → `REQUEST_CHANGES`. Unbound raw values → `blocker` / `important`.
23
24
 
24
25
  ## Output
25
26
 
@@ -12,7 +12,9 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
12
12
  - Other rules: lazy `Read` `.opencode/rules/<stem>.md` when the task matches.
13
13
  - Agents: native `@name` / Task from `.opencode/agents/`.
14
14
  - Commands: native `/task` from `.opencode/commands/`.
15
- - After a producer receipt, run `bash .opencode/hooks/chain-team-phases.sh`.
15
+ - After a producer receipt, run the chain by hand (`projectHooks` is `manual`; this preset ships no plugin):
16
+ `printf '%s\n' '{"status":"completed"}' | bash .opencode/hooks/chain-team-phases.sh`.
17
+ Slash commands are native (`/task` from `.opencode/commands/`). Do not assume `SubagentStop` auto-chain.
16
18
  Agents must not write lifecycle fields in `status.json` / `metrics.json`.
17
19
 
18
20
  ## Essential rules (read every turn)
@@ -22,6 +24,11 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
22
24
  - `.opencode/rules/code-quality-and-refactoring.md`
23
25
  - `.opencode/rules/ai-local-overlay.md`
24
26
 
27
+ Every turn, probe `ls -la .ai.local`, then apply `.ai.local/rules/*.md` and
28
+ `.ai.local/conventions.md`. Acknowledge `Using .ai.local: <rule-name>`.
29
+ Guide: `docs/LOCAL-OVERLAY.md`. These essential rules are a prompt contract.
30
+ `nativeProjectRules` is `no-equivalent` — do not claim engine `alwaysApply`.
31
+
25
32
  See `.opencode/rules/README.md` for the full catalog and loading strategy.
26
33
 
27
34
  ## Harness wiring
@@ -72,4 +72,4 @@ A `.ai.local/` directory MAY exist at the repo root or at any nesting depth in m
72
72
 
73
73
  Plain markdown rules under `.ai.local/rules/*.md` are read by the agent with higher priority than preset rules. Living gotchas live in `.ai.local/conventions.md`.
74
74
 
75
- Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule (always-on for Cursor, on-demand for Claude) is the mechanism; this `MANDATORY` section is the reinforcement.
75
+ On every turn, probe `ls -la .ai.local`, apply `.ai.local/rules/*.md` and `.ai.local/conventions.md`, and acknowledge `Using .ai.local: <rule-name>`. Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule is always-on on Cursor and session-start on Claude (no `paths:`). Mavis and OpenCode have no native `alwaysApply`; this section plus the platform entry's essential-rules list is the reinforcement.
@@ -3,7 +3,7 @@
3
3
  "platform": "opencode",
4
4
  "stack": "nuxt",
5
5
  "semanticSource": "cursor/nuxt",
6
- "sourceRevision": "f984f1917ef8328f0784adadc00e0224caee7ac1eb96a609e95839c769ed20d7",
6
+ "sourceRevision": "f7f0e3abbcd5d9c3a51bc16d2c1e1ed8d6cae98351f48f74fc9984e1e374675d",
7
7
  "entries": [
8
8
  {
9
9
  "source": "AGENTS.md",
@@ -21,7 +21,7 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
21
21
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
22
22
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
23
23
  - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
24
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (and `sync-dogfood-mavis.sh` / `sync-dogfood-opencode.sh` when those platforms changed), or document an intentional skip, when maintaining this monorepo
24
+ - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, and `sync-dogfood-opencode.sh` when those platforms changed, or document an intentional skip, when maintaining this monorepo
25
25
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
26
26
 
27
27
  ## Pointers
@@ -31,6 +31,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
31
31
  - Budget: `preset-token-budget`
32
32
  - Leakage: `preset-no-cross-stack-leakage`
33
33
  - Validation: stack `agents/build-verifier.md` → preset-structure section
34
- - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
34
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
35
35
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
36
36
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -12,7 +12,9 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
12
12
  - Other rules: lazy `Read` `.opencode/rules/<stem>.md` when the task matches.
13
13
  - Agents: native `@name` / Task from `.opencode/agents/`.
14
14
  - Commands: native `/task` from `.opencode/commands/`.
15
- - After a producer receipt, run `bash .opencode/hooks/chain-team-phases.sh`.
15
+ - After a producer receipt, run the chain by hand (`projectHooks` is `manual`; this preset ships no plugin):
16
+ `printf '%s\n' '{"status":"completed"}' | bash .opencode/hooks/chain-team-phases.sh`.
17
+ Slash commands are native (`/task` from `.opencode/commands/`). Do not assume `SubagentStop` auto-chain.
16
18
  Agents must not write lifecycle fields in `status.json` / `metrics.json`.
17
19
 
18
20
  ## Essential rules (read every turn)
@@ -22,6 +24,11 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
22
24
  - `.opencode/rules/code-quality-and-refactoring.md`
23
25
  - `.opencode/rules/ai-local-overlay.md`
24
26
 
27
+ Every turn, probe `ls -la .ai.local`, then apply `.ai.local/rules/*.md` and
28
+ `.ai.local/conventions.md`. Acknowledge `Using .ai.local: <rule-name>`.
29
+ Guide: `docs/LOCAL-OVERLAY.md`. These essential rules are a prompt contract.
30
+ `nativeProjectRules` is `no-equivalent` — do not claim engine `alwaysApply`.
31
+
25
32
  See `.opencode/rules/README.md` for the full catalog and loading strategy.
26
33
 
27
34
  ## Harness wiring
@@ -70,4 +70,4 @@ A `.ai.local/` directory MAY exist at the repo root or at any nesting depth in m
70
70
 
71
71
  Plain markdown rules under `.ai.local/rules/*.md` are read by the agent with higher priority than preset rules. Living gotchas live in `.ai.local/conventions.md`.
72
72
 
73
- Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule (always-on for Cursor, on-demand for Claude) is the mechanism; this `MANDATORY` section is the reinforcement.
73
+ On every turn, probe `ls -la .ai.local`, apply `.ai.local/rules/*.md` and `.ai.local/conventions.md`, and acknowledge `Using .ai.local: <rule-name>`. Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule is always-on on Cursor and session-start on Claude (no `paths:`). Mavis and OpenCode have no native `alwaysApply`; this section plus the platform entry's essential-rules list is the reinforcement.
@@ -3,7 +3,7 @@
3
3
  "platform": "opencode",
4
4
  "stack": "php-hexagonal",
5
5
  "semanticSource": "cursor/php-hexagonal",
6
- "sourceRevision": "22efe7082bbb1b37a232cfbaad1681335973894ab3878bda61f461575f69bc1e",
6
+ "sourceRevision": "024d2f6c371002d6a02c2c92d52ee17c3d9aea24991f692b1581a06ed7734f5c",
7
7
  "entries": [
8
8
  {
9
9
  "source": "AGENTS.md",
@@ -21,7 +21,7 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
21
21
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
22
22
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
23
23
  - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
24
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (and `sync-dogfood-mavis.sh` / `sync-dogfood-opencode.sh` when those platforms changed), or document an intentional skip, when maintaining this monorepo
24
+ - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, and `sync-dogfood-opencode.sh` when those platforms changed, or document an intentional skip, when maintaining this monorepo
25
25
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
26
26
 
27
27
  ## Pointers
@@ -31,6 +31,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
31
31
  - Budget: `preset-token-budget`
32
32
  - Leakage: `preset-no-cross-stack-leakage`
33
33
  - Validation: stack `agents/build-verifier.md` → preset-structure section
34
- - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
34
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
35
35
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
36
36
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -12,7 +12,9 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
12
12
  - Other rules: lazy `Read` `.opencode/rules/<stem>.md` when the task matches.
13
13
  - Agents: native `@name` / Task from `.opencode/agents/`.
14
14
  - Commands: native `/task` from `.opencode/commands/`.
15
- - After a producer receipt, run `bash .opencode/hooks/chain-team-phases.sh`.
15
+ - After a producer receipt, run the chain by hand (`projectHooks` is `manual`; this preset ships no plugin):
16
+ `printf '%s\n' '{"status":"completed"}' | bash .opencode/hooks/chain-team-phases.sh`.
17
+ Slash commands are native (`/task` from `.opencode/commands/`). Do not assume `SubagentStop` auto-chain.
16
18
  Agents must not write lifecycle fields in `status.json` / `metrics.json`.
17
19
 
18
20
  ## Essential rules (read every turn)
@@ -22,6 +24,11 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
22
24
  - `.opencode/rules/code-quality-and-refactoring.md`
23
25
  - `.opencode/rules/ai-local-overlay.md`
24
26
 
27
+ Every turn, probe `ls -la .ai.local`, then apply `.ai.local/rules/*.md` and
28
+ `.ai.local/conventions.md`. Acknowledge `Using .ai.local: <rule-name>`.
29
+ Guide: `docs/LOCAL-OVERLAY.md`. These essential rules are a prompt contract.
30
+ `nativeProjectRules` is `no-equivalent` — do not claim engine `alwaysApply`.
31
+
25
32
  See `.opencode/rules/README.md` for the full catalog and loading strategy.
26
33
 
27
34
  ## Harness wiring
@@ -71,4 +71,4 @@ A `.ai.local/` directory MAY exist at the repo root or at any nesting depth in m
71
71
 
72
72
  Plain markdown rules under `.ai.local/rules/*.md` are read by the agent with higher priority than preset rules. Living gotchas live in `.ai.local/conventions.md`.
73
73
 
74
- Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule (always-on for Cursor, on-demand for Claude) is the mechanism; this `MANDATORY` section is the reinforcement.
74
+ On every turn, probe `ls -la .ai.local`, apply `.ai.local/rules/*.md` and `.ai.local/conventions.md`, and acknowledge `Using .ai.local: <rule-name>`. Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule is always-on on Cursor and session-start on Claude (no `paths:`). Mavis and OpenCode have no native `alwaysApply`; this section plus the platform entry's essential-rules list is the reinforcement.
@@ -3,7 +3,7 @@
3
3
  "platform": "opencode",
4
4
  "stack": "php-laravel",
5
5
  "semanticSource": "cursor/php-laravel",
6
- "sourceRevision": "c9cb7fb568009a1d15b619b194f62899cd25e1b9a2349c8fb1b4d737b778414a",
6
+ "sourceRevision": "79fe8a7f094030719cb421ad283f548b993ec8d198b7e4656d0d3ef30c9c33b0",
7
7
  "entries": [
8
8
  {
9
9
  "source": "AGENTS.md",
@@ -21,7 +21,7 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
21
21
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
22
22
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
23
23
  - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
24
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (and `sync-dogfood-mavis.sh` / `sync-dogfood-opencode.sh` when those platforms changed), or document an intentional skip, when maintaining this monorepo
24
+ - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, and `sync-dogfood-opencode.sh` when those platforms changed, or document an intentional skip, when maintaining this monorepo
25
25
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
26
26
 
27
27
  ## Pointers
@@ -31,6 +31,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
31
31
  - Budget: `preset-token-budget`
32
32
  - Leakage: `preset-no-cross-stack-leakage`
33
33
  - Validation: stack `agents/build-verifier.md` → preset-structure section
34
- - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
34
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
35
35
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
36
36
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -115,7 +115,7 @@
115
115
  "nativePath": "opencode.json"
116
116
  },
117
117
  "projectHooks": {
118
- "status": "unknown",
118
+ "status": "manual",
119
119
  "evidence": "docs/OPENCODE-COMPATIBILITY.md",
120
120
  "nativePath": null
121
121
  },
@@ -12,7 +12,9 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
12
12
  - Other rules: lazy `Read` `.opencode/rules/<stem>.md` when the task matches.
13
13
  - Agents: native `@name` / Task from `.opencode/agents/`.
14
14
  - Commands: native `/task` from `.opencode/commands/`.
15
- - After a producer receipt, run `bash .opencode/hooks/chain-team-phases.sh`.
15
+ - After a producer receipt, run the chain by hand (`projectHooks` is `manual`; this preset ships no plugin):
16
+ `printf '%s\n' '{"status":"completed"}' | bash .opencode/hooks/chain-team-phases.sh`.
17
+ Slash commands are native (`/task` from `.opencode/commands/`). Do not assume `SubagentStop` auto-chain.
16
18
  Agents must not write lifecycle fields in `status.json` / `metrics.json`.
17
19
 
18
20
  ## Essential rules (read every turn)
@@ -22,6 +24,11 @@ Root `AGENTS.md` is native always-on. Read it first, then this file.
22
24
  - `.opencode/rules/code-quality-and-refactoring.md`
23
25
  - `.opencode/rules/ai-local-overlay.md`
24
26
 
27
+ Every turn, probe `ls -la .ai.local`, then apply `.ai.local/rules/*.md` and
28
+ `.ai.local/conventions.md`. Acknowledge `Using .ai.local: <rule-name>`.
29
+ Guide: `docs/LOCAL-OVERLAY.md`. These essential rules are a prompt contract.
30
+ `nativeProjectRules` is `no-equivalent` — do not claim engine `alwaysApply`.
31
+
25
32
  See `.opencode/rules/README.md` for the full catalog and loading strategy.
26
33
 
27
34
  ## Harness wiring
@@ -72,4 +72,4 @@ A `.ai.local/` directory MAY exist at the repo root or at any nesting depth in m
72
72
 
73
73
  Plain markdown rules under `.ai.local/rules/*.md` are read by the agent with higher priority than preset rules. Living gotchas live in `.ai.local/conventions.md`.
74
74
 
75
- Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule (always-on for Cursor, on-demand for Claude) is the mechanism; this `MANDATORY` section is the reinforcement.
75
+ On every turn, probe `ls -la .ai.local`, apply `.ai.local/rules/*.md` and `.ai.local/conventions.md`, and acknowledge `Using .ai.local: <rule-name>`. Authoring guide: `docs/LOCAL-OVERLAY.md` in the `@bonesofspring/ai-rules` package. The `ai-local-overlay` rule is always-on on Cursor and session-start on Claude (no `paths:`). Mavis and OpenCode have no native `alwaysApply`; this section plus the platform entry's essential-rules list is the reinforcement.
@@ -3,7 +3,7 @@
3
3
  "platform": "opencode",
4
4
  "stack": "svelte",
5
5
  "semanticSource": "cursor/svelte",
6
- "sourceRevision": "8023483a35bad6db47f68f7320fd24e31c024004d0409a105fd2f78ef249e9c0",
6
+ "sourceRevision": "e2647db5026c557c38d7dcfdc4595afac8832b3459c75ab3f663568d8dbc0289",
7
7
  "entries": [
8
8
  {
9
9
  "source": "AGENTS.md",
@@ -21,7 +21,7 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
21
21
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
22
22
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
23
23
  - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
24
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (and `sync-dogfood-mavis.sh` / `sync-dogfood-opencode.sh` when those platforms changed), or document an intentional skip, when maintaining this monorepo
24
+ - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, and `sync-dogfood-opencode.sh` when those platforms changed, or document an intentional skip, when maintaining this monorepo
25
25
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
26
26
 
27
27
  ## Pointers
@@ -31,6 +31,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
31
31
  - Budget: `preset-token-budget`
32
32
  - Leakage: `preset-no-cross-stack-leakage`
33
33
  - Validation: stack `agents/build-verifier.md` → preset-structure section
34
- - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
34
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-claude.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
35
35
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
36
36
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -95,7 +95,7 @@ for stack in STACKS:
95
95
  if sf == 0:
96
96
  print(f" OK: {cursor_path.name} (alwaysApply + MANDATORY + ack + pointer)")
97
97
 
98
- # Claude must exist (flat or topic folder) + paths: includes .ai.local + ack format + pointer.
98
+ # Claude must exist (flat or topic folder) as session-start (no paths:) + ack + pointer.
99
99
  if not claude_path.is_file():
100
100
  # Try to find a topic-folder placement (e.g. tooling-and-review/ai-local-overlay.md).
101
101
  candidates = list((presets / "claude" / stack / "rules").rglob(CLAUDE_NAME))
@@ -107,8 +107,11 @@ for stack in STACKS:
107
107
  if claude_path.is_file():
108
108
  text = claude_path.read_text(encoding="utf-8")
109
109
  fm, body = strip_frontmatter(text)
110
- if "**/.ai.local/**" not in fm:
111
- print(f"FAIL: {claude_path.name} frontmatter must include `**/.ai.local/**` in paths")
110
+ if re.search(r"(?m)^paths:\s*", fm):
111
+ print(
112
+ f"FAIL: {claude_path.relative_to(presets)} must be session-start "
113
+ "(no paths:). ai-local-overlay is the reserved 4th slot inside the 3–5 cap."
114
+ )
112
115
  sf += 1
113
116
  if FRONTMATTER_DESCRIPTION not in fm:
114
117
  print(f"FAIL: {claude_path.name} frontmatter description must include 'MANDATORY'")
@@ -120,7 +123,7 @@ for stack in STACKS:
120
123
  print(f"FAIL: {claude_path.name} body must reference `docs/LOCAL-OVERLAY.md`")
121
124
  sf += 1
122
125
  if sf == 0:
123
- print(f" OK: {claude_path.name} (paths + MANDATORY + ack + pointer)")
126
+ print(f" OK: {claude_path.name} (session-start + MANDATORY + ack + pointer)")
124
127
 
125
128
  # Twin-map coverage: the Claude twin must be listed in claude/<stack>/rules/README.md.
126
129
  claude_readme = presets / "claude" / stack / "rules" / "README.md"
@@ -129,6 +132,39 @@ for stack in STACKS:
129
132
  if CURSOR_NAME not in readme_text:
130
133
  print(f"FAIL: {claude_readme} mapping table must include `{CURSOR_NAME}`")
131
134
  sf += 1
135
+ session_lines = [
136
+ line
137
+ for line in readme_text.splitlines()
138
+ if "Session" in line and "paths" in line
139
+ ]
140
+ if not any("ai-local-overlay" in line for line in session_lines):
141
+ print(
142
+ f"FAIL: {claude_readme} session-start line must name `ai-local-overlay`"
143
+ )
144
+ sf += 1
145
+
146
+ claude_entry = presets / "claude" / stack / "CLAUDE.md"
147
+ if not claude_entry.is_file():
148
+ print(f"FAIL: missing {claude_entry}")
149
+ sf += 1
150
+ else:
151
+ entry = claude_entry.read_text(encoding="utf-8")
152
+ for needle in (
153
+ "ls -la .ai.local",
154
+ ".ai.local/rules/*.md",
155
+ ".ai.local/conventions.md",
156
+ "Using .ai.local: <rule-name>",
157
+ POINTER_DOCS,
158
+ "ai-local-overlay",
159
+ ):
160
+ if needle not in entry:
161
+ print(f"FAIL: {claude_entry.relative_to(presets)} missing `{needle}`")
162
+ sf += 1
163
+ if "exactly three" in entry or "exactly **three**" in entry:
164
+ print(
165
+ f"FAIL: {claude_entry.relative_to(presets)} still says session-start is exactly three"
166
+ )
167
+ sf += 1
132
168
 
133
169
  stack_failed[stack] = sf
134
170
  failed += sf
@@ -24,6 +24,7 @@ for (const stack of stacks) {
24
24
  const root = path.join(presetsRoot, 'mavis', stack);
25
25
  const files = [
26
26
  path.join(root, 'REPO_AGENTS.md'),
27
+ path.join(root, 'MAVIS.md'),
27
28
  path.join(root, 'rules', 'ai-local-overlay.md'),
28
29
  ];
29
30
  for (const filePath of files) {
@@ -50,6 +51,28 @@ for (const stack of stacks) {
50
51
  console.error(`FAIL ${label}: missing Local overlay section`);
51
52
  failed += 1;
52
53
  }
54
+ if (filePath.endsWith('REPO_AGENTS.md') || filePath.endsWith('MAVIS.md')) {
55
+ for (const needle of [PROBE, ACK, 'ai-local-overlay', '.ai.local/rules/*.md', '.ai.local/conventions.md']) {
56
+ if (!text.includes(needle)) {
57
+ console.error(`FAIL ${label}: missing ${needle}`);
58
+ failed += 1;
59
+ }
60
+ }
61
+ }
62
+ if (filePath.endsWith('MAVIS.md')) {
63
+ if (!text.includes('nativeProjectRules') || !text.includes('unknown')) {
64
+ console.error(`FAIL ${label}: must keep nativeProjectRules unknown (no alwaysApply claim)`);
65
+ failed += 1;
66
+ }
67
+ if (!text.includes('fallback-manual-import') || !text.includes('freshInit')) {
68
+ console.error(`FAIL ${label}: must document fallback-manual-import and freshInit`);
69
+ failed += 1;
70
+ }
71
+ if (!text.includes('projectHooks') || !text.includes('manual')) {
72
+ console.error(`FAIL ${label}: must document manual projectHooks invoke`);
73
+ failed += 1;
74
+ }
75
+ }
53
76
  }
54
77
  }
55
78
 
@@ -30,6 +30,7 @@ const ALLOWED_STATUS = new Set([
30
30
  'partial',
31
31
  'unknown',
32
32
  'no-equivalent',
33
+ 'manual',
33
34
  ]);
34
35
  const KNOWN_STACKS = new Set([
35
36
  'next',
@@ -245,7 +246,7 @@ export function validateContract(contract, options = {}) {
245
246
  }
246
247
  if (!ALLOWED_STATUS.has(capability.status)) {
247
248
  fail(
248
- `nativeCapabilities.${key}.status must be confirmed|partial|unknown|no-equivalent`,
249
+ `nativeCapabilities.${key}.status must be confirmed|partial|unknown|no-equivalent|manual`,
249
250
  );
250
251
  }
251
252
  if (
@@ -262,7 +263,9 @@ export function validateContract(contract, options = {}) {
262
263
  continue;
263
264
  }
264
265
  if (
265
- (capability.status === 'unknown' || capability.status === 'no-equivalent') &&
266
+ (capability.status === 'unknown' ||
267
+ capability.status === 'no-equivalent' ||
268
+ capability.status === 'manual') &&
266
269
  nativePath
267
270
  ) {
268
271
  fail(
@@ -24,6 +24,7 @@ for (const stack of stacks) {
24
24
  const root = path.join(presetsRoot, 'opencode', stack);
25
25
  const files = [
26
26
  path.join(root, 'REPO_AGENTS.md'),
27
+ path.join(root, 'OPENCODE.md'),
27
28
  path.join(root, 'rules', 'ai-local-overlay.md'),
28
29
  ];
29
30
  for (const filePath of files) {
@@ -50,6 +51,24 @@ for (const stack of stacks) {
50
51
  console.error(`FAIL ${label}: missing Local overlay section`);
51
52
  failed += 1;
52
53
  }
54
+ if (filePath.endsWith('REPO_AGENTS.md') || filePath.endsWith('OPENCODE.md')) {
55
+ for (const needle of [PROBE, ACK, 'ai-local-overlay', '.ai.local/rules/*.md', '.ai.local/conventions.md']) {
56
+ if (!text.includes(needle)) {
57
+ console.error(`FAIL ${label}: missing ${needle}`);
58
+ failed += 1;
59
+ }
60
+ }
61
+ }
62
+ if (filePath.endsWith('OPENCODE.md')) {
63
+ if (!text.includes('nativeProjectRules') || !text.includes('no-equivalent')) {
64
+ console.error(`FAIL ${label}: must keep nativeProjectRules no-equivalent (no alwaysApply claim)`);
65
+ failed += 1;
66
+ }
67
+ if (!text.includes('projectHooks') || !text.includes('manual')) {
68
+ console.error(`FAIL ${label}: must document manual projectHooks invoke`);
69
+ failed += 1;
70
+ }
71
+ }
53
72
  }
54
73
  }
55
74
 
@@ -30,6 +30,7 @@ const ALLOWED_STATUS = new Set([
30
30
  'partial',
31
31
  'unknown',
32
32
  'no-equivalent',
33
+ 'manual',
33
34
  ]);
34
35
  const KNOWN_STACKS = new Set([
35
36
  'next',
@@ -245,7 +246,7 @@ export function validateContract(contract, options = {}) {
245
246
  }
246
247
  if (!ALLOWED_STATUS.has(capability.status)) {
247
248
  fail(
248
- `nativeCapabilities.${key}.status must be confirmed|partial|unknown|no-equivalent`,
249
+ `nativeCapabilities.${key}.status must be confirmed|partial|unknown|no-equivalent|manual`,
249
250
  );
250
251
  }
251
252
  if (
@@ -262,7 +263,9 @@ export function validateContract(contract, options = {}) {
262
263
  continue;
263
264
  }
264
265
  if (
265
- (capability.status === 'unknown' || capability.status === 'no-equivalent') &&
266
+ (capability.status === 'unknown' ||
267
+ capability.status === 'no-equivalent' ||
268
+ capability.status === 'manual') &&
266
269
  nativePath
267
270
  ) {
268
271
  fail(
@@ -178,6 +178,13 @@ for stack in STACKS:
178
178
  f"expected {MIN_ALWAYS_ON}..{MAX_ALWAYS_ON} (Option A excludes **/README.md)"
179
179
  )
180
180
  failed += 1
181
+ elif len(session) > 3:
182
+ if not any(p.stem == "ai-local-overlay" for p in session):
183
+ print(
184
+ f"FAIL: Claude session-start={len(session)} but no ai-local-overlay; "
185
+ "extra slots are reserved for the local overlay rule"
186
+ )
187
+ failed += 1
181
188
 
182
189
  # --- Body sum of intended session-start set (Cursor alwaysApply + Claude session) ---
183
190
  # Cursor and Claude allow 3..5 always-on rules; extra slots reserved for ai-local-overlay.