@bonesofspring/ai-rules 0.2.22 → 0.2.24

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 (429) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +10 -2
  3. package/bin/cli.js +56 -9
  4. package/bin/mavis-install.js +441 -0
  5. package/bin/opencode-install.js +531 -0
  6. package/package.json +17 -3
  7. package/presets/_shared/core/agent-team/agent-team-orchestrator.md +2 -2
  8. package/presets/_shared/core/meta/preset-layering.md +3 -3
  9. package/presets/_shared/core/meta/preset-no-cross-stack-leakage.md +1 -1
  10. package/presets/_shared/core/meta/preset-pr-checklist.md +5 -3
  11. package/presets/_shared/core/meta/preset-token-budget.md +3 -0
  12. package/presets/_shared/core/meta/preset-twin-sync.md +32 -0
  13. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-layering.md +3 -3
  14. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  15. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  16. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-token-budget.md +3 -0
  17. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-twin-sync.md +32 -0
  18. package/presets/claude/go/rules/tooling-and-review/preset-layering.md +3 -3
  19. package/presets/claude/go/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  20. package/presets/claude/go/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  21. package/presets/claude/go/rules/tooling-and-review/preset-token-budget.md +3 -0
  22. package/presets/claude/go/rules/tooling-and-review/preset-twin-sync.md +32 -0
  23. package/presets/claude/ios-swift/rules/tooling-and-review/preset-layering.md +3 -3
  24. package/presets/claude/ios-swift/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  25. package/presets/claude/ios-swift/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  26. package/presets/claude/ios-swift/rules/tooling-and-review/preset-token-budget.md +3 -0
  27. package/presets/claude/ios-swift/rules/tooling-and-review/preset-twin-sync.md +32 -0
  28. package/presets/claude/java/rules/tooling-and-review/preset-layering.md +3 -3
  29. package/presets/claude/java/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  30. package/presets/claude/java/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  31. package/presets/claude/java/rules/tooling-and-review/preset-token-budget.md +3 -0
  32. package/presets/claude/java/rules/tooling-and-review/preset-twin-sync.md +32 -0
  33. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-layering.md +3 -3
  34. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  35. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  36. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-token-budget.md +3 -0
  37. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-twin-sync.md +32 -0
  38. package/presets/claude/next/REPO_AGENTS.md +10 -5
  39. package/presets/claude/next/agents/build-verifier.md +3 -1
  40. package/presets/claude/next/rules/tooling-and-review/ai-local-overlay.md +1 -1
  41. package/presets/claude/next/rules/tooling-and-review/preset-layering.md +3 -3
  42. package/presets/claude/next/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  43. package/presets/claude/next/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  44. package/presets/claude/next/rules/tooling-and-review/preset-token-budget.md +3 -0
  45. package/presets/claude/next/rules/tooling-and-review/preset-twin-sync.md +32 -0
  46. package/presets/claude/nuxt/rules/tooling-and-review/preset-layering.md +3 -3
  47. package/presets/claude/nuxt/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  48. package/presets/claude/nuxt/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  49. package/presets/claude/nuxt/rules/tooling-and-review/preset-token-budget.md +3 -0
  50. package/presets/claude/nuxt/rules/tooling-and-review/preset-twin-sync.md +32 -0
  51. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-layering.md +3 -3
  52. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  53. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  54. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-token-budget.md +3 -0
  55. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-twin-sync.md +32 -0
  56. package/presets/claude/php-laravel/rules/tooling-and-review/preset-layering.md +3 -3
  57. package/presets/claude/php-laravel/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  58. package/presets/claude/php-laravel/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  59. package/presets/claude/php-laravel/rules/tooling-and-review/preset-token-budget.md +3 -0
  60. package/presets/claude/php-laravel/rules/tooling-and-review/preset-twin-sync.md +32 -0
  61. package/presets/claude/svelte/rules/tooling-and-review/preset-layering.md +3 -3
  62. package/presets/claude/svelte/rules/tooling-and-review/preset-no-cross-stack-leakage.md +1 -1
  63. package/presets/claude/svelte/rules/tooling-and-review/preset-pr-checklist.md +5 -3
  64. package/presets/claude/svelte/rules/tooling-and-review/preset-token-budget.md +3 -0
  65. package/presets/claude/svelte/rules/tooling-and-review/preset-twin-sync.md +32 -0
  66. package/presets/cursor/android-kotlin/rules/preset-layering.mdc +3 -3
  67. package/presets/cursor/android-kotlin/rules/preset-no-cross-stack-leakage.mdc +1 -1
  68. package/presets/cursor/android-kotlin/rules/preset-pr-checklist.mdc +5 -3
  69. package/presets/cursor/android-kotlin/rules/preset-token-budget.mdc +3 -0
  70. package/presets/cursor/android-kotlin/rules/preset-twin-sync.mdc +32 -0
  71. package/presets/cursor/go/rules/preset-layering.mdc +3 -3
  72. package/presets/cursor/go/rules/preset-no-cross-stack-leakage.mdc +1 -1
  73. package/presets/cursor/go/rules/preset-pr-checklist.mdc +5 -3
  74. package/presets/cursor/go/rules/preset-token-budget.mdc +3 -0
  75. package/presets/cursor/go/rules/preset-twin-sync.mdc +32 -0
  76. package/presets/cursor/ios-swift/rules/preset-layering.mdc +3 -3
  77. package/presets/cursor/ios-swift/rules/preset-no-cross-stack-leakage.mdc +1 -1
  78. package/presets/cursor/ios-swift/rules/preset-pr-checklist.mdc +5 -3
  79. package/presets/cursor/ios-swift/rules/preset-token-budget.mdc +3 -0
  80. package/presets/cursor/ios-swift/rules/preset-twin-sync.mdc +32 -0
  81. package/presets/cursor/java/rules/preset-layering.mdc +3 -3
  82. package/presets/cursor/java/rules/preset-no-cross-stack-leakage.mdc +1 -1
  83. package/presets/cursor/java/rules/preset-pr-checklist.mdc +5 -3
  84. package/presets/cursor/java/rules/preset-token-budget.mdc +3 -0
  85. package/presets/cursor/java/rules/preset-twin-sync.mdc +32 -0
  86. package/presets/cursor/mcp-ts/rules/preset-layering.mdc +3 -3
  87. package/presets/cursor/mcp-ts/rules/preset-no-cross-stack-leakage.mdc +1 -1
  88. package/presets/cursor/mcp-ts/rules/preset-pr-checklist.mdc +5 -3
  89. package/presets/cursor/mcp-ts/rules/preset-token-budget.mdc +3 -0
  90. package/presets/cursor/mcp-ts/rules/preset-twin-sync.mdc +32 -0
  91. package/presets/cursor/next/REPO_AGENTS.md +10 -5
  92. package/presets/cursor/next/agents/build-verifier.md +3 -1
  93. package/presets/cursor/next/rules/ai-local-overlay.mdc +1 -1
  94. package/presets/cursor/next/rules/preset-layering.mdc +3 -3
  95. package/presets/cursor/next/rules/preset-no-cross-stack-leakage.mdc +1 -1
  96. package/presets/cursor/next/rules/preset-pr-checklist.mdc +5 -3
  97. package/presets/cursor/next/rules/preset-token-budget.mdc +3 -0
  98. package/presets/cursor/next/rules/preset-twin-sync.mdc +32 -0
  99. package/presets/cursor/nuxt/rules/preset-layering.mdc +3 -3
  100. package/presets/cursor/nuxt/rules/preset-no-cross-stack-leakage.mdc +1 -1
  101. package/presets/cursor/nuxt/rules/preset-pr-checklist.mdc +5 -3
  102. package/presets/cursor/nuxt/rules/preset-token-budget.mdc +3 -0
  103. package/presets/cursor/nuxt/rules/preset-twin-sync.mdc +32 -0
  104. package/presets/cursor/php-hexagonal/rules/preset-layering.mdc +3 -3
  105. package/presets/cursor/php-hexagonal/rules/preset-no-cross-stack-leakage.mdc +1 -1
  106. package/presets/cursor/php-hexagonal/rules/preset-pr-checklist.mdc +5 -3
  107. package/presets/cursor/php-hexagonal/rules/preset-token-budget.mdc +3 -0
  108. package/presets/cursor/php-hexagonal/rules/preset-twin-sync.mdc +32 -0
  109. package/presets/cursor/php-laravel/rules/preset-layering.mdc +3 -3
  110. package/presets/cursor/php-laravel/rules/preset-no-cross-stack-leakage.mdc +1 -1
  111. package/presets/cursor/php-laravel/rules/preset-pr-checklist.mdc +5 -3
  112. package/presets/cursor/php-laravel/rules/preset-token-budget.mdc +3 -0
  113. package/presets/cursor/php-laravel/rules/preset-twin-sync.mdc +32 -0
  114. package/presets/cursor/svelte/rules/preset-layering.mdc +3 -3
  115. package/presets/cursor/svelte/rules/preset-no-cross-stack-leakage.mdc +1 -1
  116. package/presets/cursor/svelte/rules/preset-pr-checklist.mdc +5 -3
  117. package/presets/cursor/svelte/rules/preset-token-budget.mdc +3 -0
  118. package/presets/cursor/svelte/rules/preset-twin-sync.mdc +32 -0
  119. package/presets/mavis/README.md +60 -0
  120. package/presets/mavis/next/MAVIS.md +67 -0
  121. package/presets/mavis/next/MCP.md +36 -0
  122. package/presets/mavis/next/README.md +15 -0
  123. package/presets/mavis/next/REPO_AGENTS.md +96 -0
  124. package/presets/mavis/next/adapter-map.json +959 -0
  125. package/presets/mavis/next/agents/README.md +206 -0
  126. package/presets/mavis/next/agents/accessibility-reviewer.md +61 -0
  127. package/presets/mavis/next/agents/api-contract-reviewer.md +57 -0
  128. package/presets/mavis/next/agents/build-verifier.md +112 -0
  129. package/presets/mavis/next/agents/ci-investigator.md +63 -0
  130. package/presets/mavis/next/agents/code-reviewer.md +61 -0
  131. package/presets/mavis/next/agents/codebase-analyzer.md +21 -0
  132. package/presets/mavis/next/agents/debugger.md +80 -0
  133. package/presets/mavis/next/agents/feature-developer.md +101 -0
  134. package/presets/mavis/next/agents/migration-specialist.md +67 -0
  135. package/presets/mavis/next/agents/mockup-reviewer.md +53 -0
  136. package/presets/mavis/next/agents/openspec-author.md +157 -0
  137. package/presets/mavis/next/agents/performance-auditor.md +68 -0
  138. package/presets/mavis/next/agents/playwright-test-generator.md +28 -0
  139. package/presets/mavis/next/agents/playwright-test-healer.md +28 -0
  140. package/presets/mavis/next/agents/playwright-test-planner.md +21 -0
  141. package/presets/mavis/next/agents/qa-tester.md +52 -0
  142. package/presets/mavis/next/agents/security-reviewer.md +54 -0
  143. package/presets/mavis/next/agents/solution-architect.md +68 -0
  144. package/presets/mavis/next/agents/task-analyst.md +166 -0
  145. package/presets/mavis/next/agents/task-router.md +178 -0
  146. package/presets/mavis/next/agents/tech-writer.md +57 -0
  147. package/presets/mavis/next/agents/unit-test-generator.md +31 -0
  148. package/presets/mavis/next/agents/unit-test-healer.md +32 -0
  149. package/presets/mavis/next/agents/unit-test-planner.md +54 -0
  150. package/presets/mavis/next/commands/README.md +49 -0
  151. package/presets/mavis/next/commands/spec-start.md +24 -0
  152. package/presets/mavis/next/commands/task-continue.md +50 -0
  153. package/presets/mavis/next/commands/task.md +50 -0
  154. package/presets/mavis/next/commands/technical-retro.md +80 -0
  155. package/presets/mavis/next/hooks/README.md +22 -0
  156. package/presets/mavis/next/hooks/chain-team-phases.sh +845 -0
  157. package/presets/mavis/next/mcp.json +19 -0
  158. package/presets/mavis/next/rules/README.md +16 -0
  159. package/presets/mavis/next/rules/agent-team-intake.md +11 -0
  160. package/presets/mavis/next/rules/agent-team-orchestrator.md +210 -0
  161. package/presets/mavis/next/rules/ai-local-overlay.md +37 -0
  162. package/presets/mavis/next/rules/anti-sycophancy-discipline.md +23 -0
  163. package/presets/mavis/next/rules/api-services.md +72 -0
  164. package/presets/mavis/next/rules/architecture-boundaries-ui.md +9 -0
  165. package/presets/mavis/next/rules/architecture-boundaries.md +86 -0
  166. package/presets/mavis/next/rules/arrow-functions.md +25 -0
  167. package/presets/mavis/next/rules/code-quality-and-refactoring.md +40 -0
  168. package/presets/mavis/next/rules/code-review-mr.md +40 -0
  169. package/presets/mavis/next/rules/css-property-order-stylelint.md +5 -0
  170. package/presets/mavis/next/rules/design-guidance.md +99 -0
  171. package/presets/mavis/next/rules/feature-delivery-workflow.md +49 -0
  172. package/presets/mavis/next/rules/http-client.md +55 -0
  173. package/presets/mavis/next/rules/layer-barrel-exports.md +68 -0
  174. package/presets/mavis/next/rules/mcp-usage.md +86 -0
  175. package/presets/mavis/next/rules/mockup-review.md +107 -0
  176. package/presets/mavis/next/rules/navigation-router-stack.md +56 -0
  177. package/presets/mavis/next/rules/navigation-router-ui.md +10 -0
  178. package/presets/mavis/next/rules/next-app-core.md +29 -0
  179. package/presets/mavis/next/rules/next-app-router.md +44 -0
  180. package/presets/mavis/next/rules/no-props-spread.md +56 -0
  181. package/presets/mavis/next/rules/no-type-assertion-as-import-export.md +51 -0
  182. package/presets/mavis/next/rules/package-manager.md +11 -0
  183. package/presets/mavis/next/rules/playwright-agents.md +67 -0
  184. package/presets/mavis/next/rules/post-change-lint.md +35 -0
  185. package/presets/mavis/next/rules/preset-layering.md +27 -0
  186. package/presets/mavis/next/rules/preset-no-cross-stack-leakage.md +90 -0
  187. package/presets/mavis/next/rules/preset-pr-checklist.md +36 -0
  188. package/presets/mavis/next/rules/preset-token-budget.md +39 -0
  189. package/presets/mavis/next/rules/preset-twin-sync.md +81 -0
  190. package/presets/mavis/next/rules/product-specs-authoring.md +112 -0
  191. package/presets/mavis/next/rules/product-specs.md +56 -0
  192. package/presets/mavis/next/rules/public-imports.md +50 -0
  193. package/presets/mavis/next/rules/react-a11y-coding.md +31 -0
  194. package/presets/mavis/next/rules/react-next-anti-hallucination.md +60 -0
  195. package/presets/mavis/next/rules/react-ui.md +105 -0
  196. package/presets/mavis/next/rules/reference-features.md +45 -0
  197. package/presets/mavis/next/rules/security-next.md +45 -0
  198. package/presets/mavis/next/rules/store-rtk.md +78 -0
  199. package/presets/mavis/next/rules/technical-retro.md +11 -0
  200. package/presets/mavis/next/rules/tests-e2e-structure.md +72 -0
  201. package/presets/mavis/next/rules/tests-unit.md +72 -0
  202. package/presets/mavis/next/rules/types-jsdoc.md +43 -0
  203. package/presets/mavis/next/rules/ux-design.md +99 -0
  204. package/presets/mavis/next/skills/README.md +21 -0
  205. package/presets/mavis/next/skills/ci-investigation/SKILL.md +39 -0
  206. package/presets/mavis/next/skills/code-review/SKILL.md +39 -0
  207. package/presets/mavis/next/skills/debug-investigation/SKILL.md +26 -0
  208. package/presets/mavis/next/skills/feature-delivery/SKILL.md +34 -0
  209. package/presets/mavis/next/skills/mockup-review/SKILL.md +24 -0
  210. package/presets/mavis/next/skills/playwright-e2e/SKILL.md +28 -0
  211. package/presets/mavis/next/skills/react-performance/SKILL.md +39 -0
  212. package/presets/mavis/next/skills/spec-authoring/SKILL.md +21 -0
  213. package/presets/mavis/next/skills/spec-discovery/SKILL.md +53 -0
  214. package/presets/mavis/next/skills/technical-retro/SKILL.md +49 -0
  215. package/presets/mavis/next/skills/unit-testing/SKILL.md +29 -0
  216. package/presets/mavis/next/skills/ux-design/SKILL.md +31 -0
  217. package/presets/mavis/next/skills/write-adr/SKILL.md +36 -0
  218. package/presets/mavis/next/team/README.md +148 -0
  219. package/presets/mavis/next/team/conventions.md +21 -0
  220. package/presets/mavis/next/team/fixtures/artifact-manifest.example.json +79 -0
  221. package/presets/mavis/next/team/fixtures/bugfix-standard.json +25 -0
  222. package/presets/mavis/next/team/fixtures/feature-full.json +29 -0
  223. package/presets/mavis/next/team/fixtures/feature-light.json +27 -0
  224. package/presets/mavis/next/team/fixtures/feature-with-figma-url.json +17 -0
  225. package/presets/mavis/next/team/fixtures/feature-with-ux-no-figma.json +17 -0
  226. package/presets/mavis/next/team/fixtures/memlog.example.md +9 -0
  227. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/human-gate/metrics.json +69 -0
  228. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/missing-ledger/status.json +5 -0
  229. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/parallel-receipts/metrics.json +79 -0
  230. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/serial-retry/metrics.json +124 -0
  231. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/validation-failed/metrics.json +124 -0
  232. package/presets/mavis/next/team/fixtures/metrics.example.json +54 -0
  233. package/presets/mavis/next/team/fixtures/mockup-review-fail-embedded-status.json +8 -0
  234. package/presets/mavis/next/team/fixtures/mockup-review-standalone.json +14 -0
  235. package/presets/mavis/next/team/fixtures/ux-design-standalone.json +15 -0
  236. package/presets/mavis/next/team/tasks/.gitkeep +0 -0
  237. package/presets/mavis/platform-contract.json +131 -0
  238. package/presets/opencode/README.md +61 -0
  239. package/presets/opencode/next/MCP.md +36 -0
  240. package/presets/opencode/next/OPENCODE.md +65 -0
  241. package/presets/opencode/next/README.md +16 -0
  242. package/presets/opencode/next/REPO_AGENTS.md +97 -0
  243. package/presets/opencode/next/adapter-map.json +959 -0
  244. package/presets/opencode/next/agents/README.md +201 -0
  245. package/presets/opencode/next/agents/accessibility-reviewer.md +73 -0
  246. package/presets/opencode/next/agents/api-contract-reviewer.md +69 -0
  247. package/presets/opencode/next/agents/build-verifier.md +124 -0
  248. package/presets/opencode/next/agents/ci-investigator.md +71 -0
  249. package/presets/opencode/next/agents/code-reviewer.md +73 -0
  250. package/presets/opencode/next/agents/codebase-analyzer.md +33 -0
  251. package/presets/opencode/next/agents/debugger.md +88 -0
  252. package/presets/opencode/next/agents/feature-developer.md +109 -0
  253. package/presets/opencode/next/agents/migration-specialist.md +79 -0
  254. package/presets/opencode/next/agents/mockup-reviewer.md +65 -0
  255. package/presets/opencode/next/agents/openspec-author.md +169 -0
  256. package/presets/opencode/next/agents/performance-auditor.md +80 -0
  257. package/presets/opencode/next/agents/playwright-test-generator.md +36 -0
  258. package/presets/opencode/next/agents/playwright-test-healer.md +36 -0
  259. package/presets/opencode/next/agents/playwright-test-planner.md +33 -0
  260. package/presets/opencode/next/agents/qa-tester.md +60 -0
  261. package/presets/opencode/next/agents/security-reviewer.md +66 -0
  262. package/presets/opencode/next/agents/solution-architect.md +80 -0
  263. package/presets/opencode/next/agents/task-analyst.md +178 -0
  264. package/presets/opencode/next/agents/task-router.md +190 -0
  265. package/presets/opencode/next/agents/tech-writer.md +69 -0
  266. package/presets/opencode/next/agents/unit-test-generator.md +39 -0
  267. package/presets/opencode/next/agents/unit-test-healer.md +40 -0
  268. package/presets/opencode/next/agents/unit-test-planner.md +66 -0
  269. package/presets/opencode/next/commands/README.md +49 -0
  270. package/presets/opencode/next/commands/spec-start.md +32 -0
  271. package/presets/opencode/next/commands/task-continue.md +58 -0
  272. package/presets/opencode/next/commands/task.md +58 -0
  273. package/presets/opencode/next/commands/technical-retro.md +88 -0
  274. package/presets/opencode/next/hooks/README.md +22 -0
  275. package/presets/opencode/next/hooks/chain-team-phases.sh +845 -0
  276. package/presets/opencode/next/opencode.json +33 -0
  277. package/presets/opencode/next/rules/README.md +20 -0
  278. package/presets/opencode/next/rules/agent-team-intake.md +11 -0
  279. package/presets/opencode/next/rules/agent-team-orchestrator.md +214 -0
  280. package/presets/opencode/next/rules/ai-local-overlay.md +37 -0
  281. package/presets/opencode/next/rules/anti-sycophancy-discipline.md +23 -0
  282. package/presets/opencode/next/rules/api-services.md +72 -0
  283. package/presets/opencode/next/rules/architecture-boundaries-ui.md +9 -0
  284. package/presets/opencode/next/rules/architecture-boundaries.md +86 -0
  285. package/presets/opencode/next/rules/arrow-functions.md +25 -0
  286. package/presets/opencode/next/rules/code-quality-and-refactoring.md +40 -0
  287. package/presets/opencode/next/rules/code-review-mr.md +40 -0
  288. package/presets/opencode/next/rules/css-property-order-stylelint.md +5 -0
  289. package/presets/opencode/next/rules/design-guidance.md +99 -0
  290. package/presets/opencode/next/rules/feature-delivery-workflow.md +49 -0
  291. package/presets/opencode/next/rules/http-client.md +55 -0
  292. package/presets/opencode/next/rules/layer-barrel-exports.md +68 -0
  293. package/presets/opencode/next/rules/mcp-usage.md +86 -0
  294. package/presets/opencode/next/rules/mockup-review.md +107 -0
  295. package/presets/opencode/next/rules/navigation-router-stack.md +56 -0
  296. package/presets/opencode/next/rules/navigation-router-ui.md +10 -0
  297. package/presets/opencode/next/rules/next-app-core.md +29 -0
  298. package/presets/opencode/next/rules/next-app-router.md +44 -0
  299. package/presets/opencode/next/rules/no-props-spread.md +56 -0
  300. package/presets/opencode/next/rules/no-type-assertion-as-import-export.md +51 -0
  301. package/presets/opencode/next/rules/package-manager.md +11 -0
  302. package/presets/opencode/next/rules/playwright-agents.md +67 -0
  303. package/presets/opencode/next/rules/post-change-lint.md +35 -0
  304. package/presets/opencode/next/rules/preset-layering.md +27 -0
  305. package/presets/opencode/next/rules/preset-no-cross-stack-leakage.md +90 -0
  306. package/presets/opencode/next/rules/preset-pr-checklist.md +36 -0
  307. package/presets/opencode/next/rules/preset-token-budget.md +39 -0
  308. package/presets/opencode/next/rules/preset-twin-sync.md +81 -0
  309. package/presets/opencode/next/rules/product-specs-authoring.md +112 -0
  310. package/presets/opencode/next/rules/product-specs.md +56 -0
  311. package/presets/opencode/next/rules/public-imports.md +50 -0
  312. package/presets/opencode/next/rules/react-a11y-coding.md +31 -0
  313. package/presets/opencode/next/rules/react-next-anti-hallucination.md +60 -0
  314. package/presets/opencode/next/rules/react-ui.md +105 -0
  315. package/presets/opencode/next/rules/reference-features.md +45 -0
  316. package/presets/opencode/next/rules/security-next.md +45 -0
  317. package/presets/opencode/next/rules/store-rtk.md +78 -0
  318. package/presets/opencode/next/rules/technical-retro.md +11 -0
  319. package/presets/opencode/next/rules/tests-e2e-structure.md +72 -0
  320. package/presets/opencode/next/rules/tests-unit.md +72 -0
  321. package/presets/opencode/next/rules/types-jsdoc.md +43 -0
  322. package/presets/opencode/next/rules/ux-design.md +99 -0
  323. package/presets/opencode/next/skills/README.md +21 -0
  324. package/presets/opencode/next/skills/ci-investigation/SKILL.md +44 -0
  325. package/presets/opencode/next/skills/code-review/SKILL.md +44 -0
  326. package/presets/opencode/next/skills/debug-investigation/SKILL.md +59 -0
  327. package/presets/opencode/next/skills/feature-delivery/SKILL.md +39 -0
  328. package/presets/opencode/next/skills/mockup-review/SKILL.md +29 -0
  329. package/presets/opencode/next/skills/playwright-e2e/SKILL.md +33 -0
  330. package/presets/opencode/next/skills/react-performance/SKILL.md +44 -0
  331. package/presets/opencode/next/skills/spec-authoring/SKILL.md +26 -0
  332. package/presets/opencode/next/skills/spec-discovery/SKILL.md +58 -0
  333. package/presets/opencode/next/skills/technical-retro/SKILL.md +54 -0
  334. package/presets/opencode/next/skills/unit-testing/SKILL.md +34 -0
  335. package/presets/opencode/next/skills/ux-design/SKILL.md +36 -0
  336. package/presets/opencode/next/skills/write-adr/SKILL.md +41 -0
  337. package/presets/opencode/next/team/README.md +148 -0
  338. package/presets/opencode/next/team/conventions.md +21 -0
  339. package/presets/opencode/next/team/fixtures/artifact-manifest.example.json +79 -0
  340. package/presets/opencode/next/team/fixtures/bugfix-standard.json +25 -0
  341. package/presets/opencode/next/team/fixtures/feature-full.json +29 -0
  342. package/presets/opencode/next/team/fixtures/feature-light.json +27 -0
  343. package/presets/opencode/next/team/fixtures/feature-with-figma-url.json +17 -0
  344. package/presets/opencode/next/team/fixtures/feature-with-ux-no-figma.json +17 -0
  345. package/presets/opencode/next/team/fixtures/memlog.example.md +9 -0
  346. package/presets/opencode/next/team/fixtures/metrics-scenarios/tasks/human-gate/metrics.json +69 -0
  347. package/presets/opencode/next/team/fixtures/metrics-scenarios/tasks/missing-ledger/status.json +5 -0
  348. package/presets/opencode/next/team/fixtures/metrics-scenarios/tasks/parallel-receipts/metrics.json +79 -0
  349. package/presets/opencode/next/team/fixtures/metrics-scenarios/tasks/serial-retry/metrics.json +124 -0
  350. package/presets/opencode/next/team/fixtures/metrics-scenarios/tasks/validation-failed/metrics.json +124 -0
  351. package/presets/opencode/next/team/fixtures/metrics.example.json +54 -0
  352. package/presets/opencode/next/team/fixtures/mockup-review-fail-embedded-status.json +8 -0
  353. package/presets/opencode/next/team/fixtures/mockup-review-standalone.json +14 -0
  354. package/presets/opencode/next/team/fixtures/ux-design-standalone.json +15 -0
  355. package/presets/opencode/next/team/tasks/.gitkeep +0 -0
  356. package/presets/opencode/platform-contract.json +131 -0
  357. package/scripts/capture-cli-golden.mjs +48 -0
  358. package/scripts/check-chain-hook-coverage.sh +2 -0
  359. package/scripts/check-mavis-adapter-map.mjs +294 -0
  360. package/scripts/check-mavis-local-overlay.mjs +56 -0
  361. package/scripts/check-mavis-platform-contract.mjs +388 -0
  362. package/scripts/check-mavis-token-budget.mjs +48 -0
  363. package/scripts/check-opencode-adapter-map.mjs +294 -0
  364. package/scripts/check-opencode-local-overlay.mjs +56 -0
  365. package/scripts/check-opencode-platform-contract.mjs +388 -0
  366. package/scripts/check-opencode-token-budget.mjs +48 -0
  367. package/scripts/check-preset-leakage.sh +64 -3
  368. package/scripts/check-preset-structure.sh +108 -0
  369. package/scripts/check-shared-core-drift.sh +18 -0
  370. package/scripts/check-task-router-intents.sh +15 -2
  371. package/scripts/fixtures/cli-golden/claude/next.json +130 -0
  372. package/scripts/fixtures/cli-golden/cursor/next.json +132 -0
  373. package/scripts/fixtures/cli-golden/mavis/next.json +125 -0
  374. package/scripts/fixtures/cli-golden/opencode/next.json +125 -0
  375. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/AGENTS.md +1 -0
  376. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/rules/extra.mdc +1 -0
  377. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/rules/sample.mdc +2 -0
  378. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/MAVIS.md +1 -0
  379. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/adapter-map.json +26 -0
  380. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/rules/sample.md +2 -0
  381. package/scripts/fixtures/mavis-adapter-map/valid/cursor/AGENTS.md +1 -0
  382. package/scripts/fixtures/mavis-adapter-map/valid/cursor/rules/sample.mdc +2 -0
  383. package/scripts/fixtures/mavis-adapter-map/valid/mavis/MAVIS.md +1 -0
  384. package/scripts/fixtures/mavis-adapter-map/valid/mavis/adapter-map.json +26 -0
  385. package/scripts/fixtures/mavis-adapter-map/valid/mavis/rules/sample.md +2 -0
  386. package/scripts/fixtures/mavis-platform-contract/invalid-minimax-destination.json +131 -0
  387. package/scripts/fixtures/mavis-platform-contract/invalid-missing-capability.json +126 -0
  388. package/scripts/fixtures/mavis-platform-contract/invalid-released-unknown-stack.json +133 -0
  389. package/scripts/fixtures/mavis-platform-contract/invalid-unknown-native-path.json +131 -0
  390. package/scripts/fixtures/mavis-platform-contract/invalid-version-pin.json +132 -0
  391. package/scripts/fixtures/mavis-platform-contract/valid.json +131 -0
  392. package/scripts/fixtures/mavis-probe/AGENTS.md +6 -0
  393. package/scripts/fixtures/mavis-probe/agents/probe-agent.md +6 -0
  394. package/scripts/fixtures/mavis-probe/fake-mcode.mjs +98 -0
  395. package/scripts/fixtures/mavis-probe/output.schema.json +28 -0
  396. package/scripts/fixtures/mavis-probe/rules/probe.md +5 -0
  397. package/scripts/fixtures/mavis-probe/skills/probe/SKILL.md +11 -0
  398. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/cursor/AGENTS.md +1 -0
  399. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/cursor/rules/extra.mdc +1 -0
  400. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/cursor/rules/sample.mdc +2 -0
  401. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/opencode/OPENCODE.md +1 -0
  402. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/opencode/adapter-map.json +26 -0
  403. package/scripts/fixtures/opencode-adapter-map/invalid-unmapped/opencode/rules/sample.md +2 -0
  404. package/scripts/fixtures/opencode-adapter-map/valid/cursor/AGENTS.md +1 -0
  405. package/scripts/fixtures/opencode-adapter-map/valid/cursor/rules/sample.mdc +2 -0
  406. package/scripts/fixtures/opencode-adapter-map/valid/opencode/OPENCODE.md +1 -0
  407. package/scripts/fixtures/opencode-adapter-map/valid/opencode/adapter-map.json +26 -0
  408. package/scripts/fixtures/opencode-adapter-map/valid/opencode/rules/sample.md +2 -0
  409. package/scripts/fixtures/opencode-platform-contract/invalid-home-destination.json +131 -0
  410. package/scripts/fixtures/opencode-platform-contract/invalid-missing-capability.json +126 -0
  411. package/scripts/fixtures/opencode-platform-contract/invalid-released-unknown-stack.json +133 -0
  412. package/scripts/fixtures/opencode-platform-contract/invalid-unknown-native-path.json +131 -0
  413. package/scripts/fixtures/opencode-platform-contract/invalid-version-pin.json +132 -0
  414. package/scripts/fixtures/opencode-platform-contract/valid.json +131 -0
  415. package/scripts/generate-mavis-next.mjs +706 -0
  416. package/scripts/generate-opencode-next.mjs +831 -0
  417. package/scripts/lib/cli-golden.mjs +50 -0
  418. package/scripts/lib/discover-hooks.mjs +94 -0
  419. package/scripts/probe-mavis-capabilities.mjs +480 -0
  420. package/scripts/sync-dogfood-mavis.sh +90 -0
  421. package/scripts/sync-dogfood-opencode.sh +85 -0
  422. package/scripts/test-agent-task-metrics-hooks.mjs +25 -16
  423. package/scripts/test-chain-team-phases-coverage.mjs +15 -7
  424. package/scripts/test-cli-init-clean.mjs +367 -0
  425. package/scripts/test-cli-mcp-merge.mjs +23 -0
  426. package/scripts/test-mavis-context-budget.mjs +55 -0
  427. package/scripts/test-mavis-orchestration.mjs +649 -0
  428. package/scripts/test-opencode-context-budget.mjs +53 -0
  429. package/scripts/test-probe-mavis-capabilities.mjs +205 -0
@@ -28,12 +28,42 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
28
28
  | `php-laravel` | `presets/cursor/php-laravel/rules/*.mdc` | `presets/claude/php-laravel/rules/<topic>/` | Keep in `claude/php-laravel/rules/README.md` |
29
29
  | `android-kotlin` | `presets/cursor/android-kotlin/rules/*.mdc` | `presets/claude/android-kotlin/rules/<topic>/` | Keep in `claude/android-kotlin/rules/README.md` |
30
30
 
31
+ ## Mavis derivation (not a Claude twin)
32
+
33
+ | Stack | Cursor SoT | Mavis derive | Manifest |
34
+ |-------|------------|--------------|----------|
35
+ | `next` | `presets/cursor/next/**` | `presets/mavis/next/**` via `generate-mavis-next.mjs` | **Required** `adapter-map.json` |
36
+
37
+ Mavis is a **third platform adapter**, not a Claude-style topic twin:
38
+
39
+ ```text
40
+ _shared/core → cursor/<stack> → mavis/<stack>
41
+ ```
42
+
43
+ Regenerate with `node packages/ai-rules/scripts/generate-mavis-next.mjs`; validate with `node packages/ai-rules/scripts/check-mavis-adapter-map.mjs`.
44
+
45
+ ## OpenCode derivation (not a Claude twin)
46
+
47
+ | Stack | Cursor SoT | OpenCode derive | Manifest |
48
+ |-------|------------|-----------------|----------|
49
+ | `next` | `presets/cursor/next/**` | `presets/opencode/next/**` via `generate-opencode-next.mjs` | **Required** `adapter-map.json` |
50
+
51
+ OpenCode is a **fourth platform adapter** with a **native** install root (`.opencode/`), not a Claude-style topic twin and not an owned overlay like `.mavis/`:
52
+
53
+ ```text
54
+ _shared/core → cursor/<stack> → opencode/<stack>
55
+ ```
56
+
57
+ Regenerate with `node packages/ai-rules/scripts/generate-opencode-next.mjs`; validate with `node packages/ai-rules/scripts/check-opencode-adapter-map.mjs`. Do not derive OpenCode sources from Claude.
58
+
31
59
  ## Same-PR checklist
32
60
 
33
61
  1. Edit Cursor rule first (body + frontmatter).
34
62
  2. Update Claude twin: body + `paths:` (from Cursor `globs:` / requestable triggers); drop `alwaysApply`.
35
63
  3. Update mapping table row if stem/path changed.
36
64
  4. If body embeds core (`<!-- shared-core: … -->`), sync core consumers across stacks when core changed.
65
+ 5. When mapped `cursor/<stack>/` sources change, regenerate `mavis/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`).
66
+ 6. When mapped `cursor/<stack>/` sources change, regenerate `opencode/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`).
37
67
 
38
68
  ## Twin depth
39
69
 
@@ -54,5 +84,7 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
54
84
  - **php-hexagonal:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts; mapping table required).
55
85
  - **php-laravel:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-hexagonal; mapping table required).
56
86
  - **android-kotlin:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-*; mapping table required).
87
+ - **mavis/next:** `cursor/next` mapped source changed without mavis regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-mavis-adapter-map.mjs`).
88
+ - **opencode/next:** `cursor/next` mapped source changed without opencode regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-opencode-adapter-map.mjs`).
57
89
 
58
90
  Dogfood: sync packages → root `.cursor/` after Cursor SoT changes (not the reverse). Use `packages/ai-rules/scripts/sync-dogfood-cursor.sh`.
@@ -18,14 +18,14 @@ Rules for **preset authors** (`packages/ai-rules/presets/**`). Not always-on in
18
18
  | Layer | Where | What to put |
19
19
  |-------|-------|-------------|
20
20
  | **Core** | `presets/_shared/core/**` | Stack-agnostic prose + checklists; no frontmatter; no paths `app/**`, `Features/**`, Playwright, xcodebuild |
21
- | **Stack** | `presets/{cursor\|claude}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
- | **Platform** | Cursor `.mdc` / Claude `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
21
+ | **Stack** | `presets/{cursor\|claude\|mavis\|opencode}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
+ | **Platform** | Cursor `.mdc` / Claude `.md` / Mavis `.md` / OpenCode `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:` vs OpenCode `mode`/`permission`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
23
23
 
24
24
  ## Where to put a new rule
25
25
 
26
26
  1. Shared principles for all stacks → **core** + adapters with `<!-- shared-core: … -->`.
27
27
  2. Only one of the installable stacks (`next` / `nuxt` / `svelte` / `ios-swift` / `android-kotlin` / `go` / `java` / `mcp-ts` / `php-hexagonal` / `php-laravel`) → **stack-specific** (not in `_shared`).
28
- 3. Only Cursor or only Claude packaging → platform artifact / frontmatter; do not duplicate semantics.
28
+ 3. Only Cursor, Claude, Mavis, or OpenCode packaging → platform artifact / frontmatter; do not duplicate semantics.
29
29
 
30
30
  ## SoT
31
31
 
@@ -96,4 +96,4 @@ Required instead: package-manager–discovered typecheck/test (`mcp-ts-tooling`,
96
96
 
97
97
  ## Chain fork
98
98
 
99
- `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform).
99
+ `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform). Released Mavis/OpenCode stacks must also differ from the Cursor and Claude twins of the same stack.
@@ -18,17 +18,19 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
18
18
  - [ ] **SoT:** edits in `packages/…` (not only root `.cursor/`)
19
19
  - [ ] **Core:** if `_shared/core/**` changed — all `<!-- shared-core: … -->` consumers updated (or documented intentional fork)
20
20
  - [ ] **Twin:** Cursor change → Claude twin **same PR** (**FAIL** if missing on next, nuxt, svelte, ios-swift, android-kotlin, go, java, mcp-ts, php-hexagonal, and php-laravel — see `preset-twin-sync`)
21
+ - [ ] **Mavis derive:** mapped `cursor/<stack>/` change → `mavis/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`; see `preset-twin-sync` § Mavis derivation)
22
+ - [ ] **OpenCode derive:** mapped `cursor/<stack>/` change → `opencode/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`; see `preset-twin-sync` § OpenCode derivation)
21
23
  - [ ] **Mapping:** `claude/<stack>/rules/README.md` mapping table is current
22
24
  - [ ] **Token budget:** Cursor `alwaysApply` ≤ 4 (4th slot reserved for `ai-local-overlay`); Claude session-start exactly 3; meta rules not always-on
23
25
  - [ ] **Local overlay coverage:** every installable stack ships `ai-local-overlay.mdc` (Cursor) and `ai-local-overlay.md` (Claude) with `MANDATORY` + acknowledgement format + `docs/LOCAL-OVERLAY.md` pointer; Claude twin listed in `claude/<stack>/rules/README.md` mapping table. Run `packages/ai-rules/scripts/check-local-overlay.sh`.
24
26
  - [ ] **Leakage:** no foreign stack agent stems / handoff strings (`preset-no-cross-stack-leakage`)
25
27
  - [ ] **Hook-only lifecycle:** `status.json` / `metrics.json` writes happen only inside `hooks/`; agents read but never rewrite lifecycle fields. Run `packages/ai-rules/scripts/check-hook-only-lifecycle.sh`.
26
- - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` across the 10 stacks × 2 platforms (20 hooks) holds. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
28
+ - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` holds pairwise among the 10 stacks × Cursor/Claude platforms, and each released Mavis/OpenCode stack hook must also differ from the Cursor and Claude twins of the same stack. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
27
29
  - [ ] **Twin depth:** domain ≥15 lines; thin aliases documented
28
30
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
29
31
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
30
32
  - [ ] **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`.
31
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (or document intentional skip) when maintaining this monorepo
33
+ - [ ] **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
32
34
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
33
35
 
34
36
  ## Pointers
@@ -38,6 +40,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
38
40
  - Budget: `preset-token-budget`
39
41
  - Leakage: `preset-no-cross-stack-leakage`
40
42
  - Validation: stack `agents/build-verifier.md` → preset-structure section
41
- - Dogfood script: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`
43
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
42
44
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
43
45
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -19,6 +19,8 @@ Invariants for rule loading in an **installed** preset (consumer app).
19
19
  |----------|-----------|-----|
20
20
  | Cursor | `alwaysApply: true` | **≤ 4** |
21
21
  | Claude | rules **without** `paths:` | **exactly 3** |
22
+ | Mavis | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
23
+ | OpenCode | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
22
24
 
23
25
  **Cursor 4th slot is reserved for `ai-local-overlay`** (consumer-owned `.ai.local/` rules). If you do not need local overlay, demote that rule to `globs: ["**/.ai.local/**"]` and revert to ≤3.
24
26
 
@@ -27,6 +29,7 @@ Invariants for rule loading in an **installed** preset (consumer app).
27
29
  Session-start body budget:
28
30
  - Claude trio: ≤140 lines total (stretch ≤120).
29
31
  - Cursor 4-set: ≤170 lines total (4 rules including `ai-local-overlay`).
32
+ - Mavis / OpenCode: ≤4 root-entry rule files; combined root `AGENTS.md` + platform entry ≤170 nonempty lines. Do not dump the full rule catalog into `AGENTS.md`.
30
33
 
31
34
  ## Meta / author rules
32
35
 
@@ -28,12 +28,42 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
28
28
  | `php-laravel` | `presets/cursor/php-laravel/rules/*.mdc` | `presets/claude/php-laravel/rules/<topic>/` | Keep in `claude/php-laravel/rules/README.md` |
29
29
  | `android-kotlin` | `presets/cursor/android-kotlin/rules/*.mdc` | `presets/claude/android-kotlin/rules/<topic>/` | Keep in `claude/android-kotlin/rules/README.md` |
30
30
 
31
+ ## Mavis derivation (not a Claude twin)
32
+
33
+ | Stack | Cursor SoT | Mavis derive | Manifest |
34
+ |-------|------------|--------------|----------|
35
+ | `next` | `presets/cursor/next/**` | `presets/mavis/next/**` via `generate-mavis-next.mjs` | **Required** `adapter-map.json` |
36
+
37
+ Mavis is a **third platform adapter**, not a Claude-style topic twin:
38
+
39
+ ```text
40
+ _shared/core → cursor/<stack> → mavis/<stack>
41
+ ```
42
+
43
+ Regenerate with `node packages/ai-rules/scripts/generate-mavis-next.mjs`; validate with `node packages/ai-rules/scripts/check-mavis-adapter-map.mjs`.
44
+
45
+ ## OpenCode derivation (not a Claude twin)
46
+
47
+ | Stack | Cursor SoT | OpenCode derive | Manifest |
48
+ |-------|------------|-----------------|----------|
49
+ | `next` | `presets/cursor/next/**` | `presets/opencode/next/**` via `generate-opencode-next.mjs` | **Required** `adapter-map.json` |
50
+
51
+ OpenCode is a **fourth platform adapter** with a **native** install root (`.opencode/`), not a Claude-style topic twin and not an owned overlay like `.mavis/`:
52
+
53
+ ```text
54
+ _shared/core → cursor/<stack> → opencode/<stack>
55
+ ```
56
+
57
+ Regenerate with `node packages/ai-rules/scripts/generate-opencode-next.mjs`; validate with `node packages/ai-rules/scripts/check-opencode-adapter-map.mjs`. Do not derive OpenCode sources from Claude.
58
+
31
59
  ## Same-PR checklist
32
60
 
33
61
  1. Edit Cursor rule first (body + frontmatter).
34
62
  2. Update Claude twin: body + `paths:` (from Cursor `globs:` / requestable triggers); drop `alwaysApply`.
35
63
  3. Update mapping table row if stem/path changed.
36
64
  4. If body embeds core (`<!-- shared-core: … -->`), sync core consumers across stacks when core changed.
65
+ 5. When mapped `cursor/<stack>/` sources change, regenerate `mavis/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`).
66
+ 6. When mapped `cursor/<stack>/` sources change, regenerate `opencode/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`).
37
67
 
38
68
  ## Twin depth
39
69
 
@@ -54,5 +84,7 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
54
84
  - **php-hexagonal:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts; mapping table required).
55
85
  - **php-laravel:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-hexagonal; mapping table required).
56
86
  - **android-kotlin:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-*; mapping table required).
87
+ - **mavis/next:** `cursor/next` mapped source changed without mavis regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-mavis-adapter-map.mjs`).
88
+ - **opencode/next:** `cursor/next` mapped source changed without opencode regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-opencode-adapter-map.mjs`).
57
89
 
58
90
  Dogfood: sync packages → root `.cursor/` after Cursor SoT changes (not the reverse). Use `packages/ai-rules/scripts/sync-dogfood-cursor.sh`.
@@ -18,14 +18,14 @@ Rules for **preset authors** (`packages/ai-rules/presets/**`). Not always-on in
18
18
  | Layer | Where | What to put |
19
19
  |-------|-------|-------------|
20
20
  | **Core** | `presets/_shared/core/**` | Stack-agnostic prose + checklists; no frontmatter; no paths `app/**`, `Features/**`, Playwright, xcodebuild |
21
- | **Stack** | `presets/{cursor\|claude}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
- | **Platform** | Cursor `.mdc` / Claude `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
21
+ | **Stack** | `presets/{cursor\|claude\|mavis\|opencode}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
+ | **Platform** | Cursor `.mdc` / Claude `.md` / Mavis `.md` / OpenCode `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:` vs OpenCode `mode`/`permission`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
23
23
 
24
24
  ## Where to put a new rule
25
25
 
26
26
  1. Shared principles for all stacks → **core** + adapters with `<!-- shared-core: … -->`.
27
27
  2. Only one of the installable stacks (`next` / `nuxt` / `svelte` / `ios-swift` / `android-kotlin` / `go` / `java` / `mcp-ts` / `php-hexagonal` / `php-laravel`) → **stack-specific** (not in `_shared`).
28
- 3. Only Cursor or only Claude packaging → platform artifact / frontmatter; do not duplicate semantics.
28
+ 3. Only Cursor, Claude, Mavis, or OpenCode packaging → platform artifact / frontmatter; do not duplicate semantics.
29
29
 
30
30
  ## SoT
31
31
 
@@ -96,4 +96,4 @@ Required instead: package-manager–discovered typecheck/test (`mcp-ts-tooling`,
96
96
 
97
97
  ## Chain fork
98
98
 
99
- `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform).
99
+ `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform). Released Mavis/OpenCode stacks must also differ from the Cursor and Claude twins of the same stack.
@@ -18,17 +18,19 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
18
18
  - [ ] **SoT:** edits in `packages/…` (not only root `.cursor/`)
19
19
  - [ ] **Core:** if `_shared/core/**` changed — all `<!-- shared-core: … -->` consumers updated (or documented intentional fork)
20
20
  - [ ] **Twin:** Cursor change → Claude twin **same PR** (**FAIL** if missing on next, nuxt, svelte, ios-swift, android-kotlin, go, java, mcp-ts, php-hexagonal, and php-laravel — see `preset-twin-sync`)
21
+ - [ ] **Mavis derive:** mapped `cursor/<stack>/` change → `mavis/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`; see `preset-twin-sync` § Mavis derivation)
22
+ - [ ] **OpenCode derive:** mapped `cursor/<stack>/` change → `opencode/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`; see `preset-twin-sync` § OpenCode derivation)
21
23
  - [ ] **Mapping:** `claude/<stack>/rules/README.md` mapping table is current
22
24
  - [ ] **Token budget:** Cursor `alwaysApply` ≤ 4 (4th slot reserved for `ai-local-overlay`); Claude session-start exactly 3; meta rules not always-on
23
25
  - [ ] **Local overlay coverage:** every installable stack ships `ai-local-overlay.mdc` (Cursor) and `ai-local-overlay.md` (Claude) with `MANDATORY` + acknowledgement format + `docs/LOCAL-OVERLAY.md` pointer; Claude twin listed in `claude/<stack>/rules/README.md` mapping table. Run `packages/ai-rules/scripts/check-local-overlay.sh`.
24
26
  - [ ] **Leakage:** no foreign stack agent stems / handoff strings (`preset-no-cross-stack-leakage`)
25
27
  - [ ] **Hook-only lifecycle:** `status.json` / `metrics.json` writes happen only inside `hooks/`; agents read but never rewrite lifecycle fields. Run `packages/ai-rules/scripts/check-hook-only-lifecycle.sh`.
26
- - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` across the 10 stacks × 2 platforms (20 hooks) holds. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
28
+ - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` holds pairwise among the 10 stacks × Cursor/Claude platforms, and each released Mavis/OpenCode stack hook must also differ from the Cursor and Claude twins of the same stack. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
27
29
  - [ ] **Twin depth:** domain ≥15 lines; thin aliases documented
28
30
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
29
31
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
30
32
  - [ ] **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`.
31
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (or document intentional skip) when maintaining this monorepo
33
+ - [ ] **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
32
34
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
33
35
 
34
36
  ## Pointers
@@ -38,6 +40,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
38
40
  - Budget: `preset-token-budget`
39
41
  - Leakage: `preset-no-cross-stack-leakage`
40
42
  - Validation: stack `agents/build-verifier.md` → preset-structure section
41
- - Dogfood script: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`
43
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
42
44
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
43
45
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -19,6 +19,8 @@ Invariants for rule loading in an **installed** preset (consumer app).
19
19
  |----------|-----------|-----|
20
20
  | Cursor | `alwaysApply: true` | **≤ 4** |
21
21
  | Claude | rules **without** `paths:` | **exactly 3** |
22
+ | Mavis | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
23
+ | OpenCode | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
22
24
 
23
25
  **Cursor 4th slot is reserved for `ai-local-overlay`** (consumer-owned `.ai.local/` rules). If you do not need local overlay, demote that rule to `globs: ["**/.ai.local/**"]` and revert to ≤3.
24
26
 
@@ -27,6 +29,7 @@ Invariants for rule loading in an **installed** preset (consumer app).
27
29
  Session-start body budget:
28
30
  - Claude trio: ≤140 lines total (stretch ≤120).
29
31
  - Cursor 4-set: ≤170 lines total (4 rules including `ai-local-overlay`).
32
+ - Mavis / OpenCode: ≤4 root-entry rule files; combined root `AGENTS.md` + platform entry ≤170 nonempty lines. Do not dump the full rule catalog into `AGENTS.md`.
30
33
 
31
34
  ## Meta / author rules
32
35
 
@@ -28,12 +28,42 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
28
28
  | `php-laravel` | `presets/cursor/php-laravel/rules/*.mdc` | `presets/claude/php-laravel/rules/<topic>/` | Keep in `claude/php-laravel/rules/README.md` |
29
29
  | `android-kotlin` | `presets/cursor/android-kotlin/rules/*.mdc` | `presets/claude/android-kotlin/rules/<topic>/` | Keep in `claude/android-kotlin/rules/README.md` |
30
30
 
31
+ ## Mavis derivation (not a Claude twin)
32
+
33
+ | Stack | Cursor SoT | Mavis derive | Manifest |
34
+ |-------|------------|--------------|----------|
35
+ | `next` | `presets/cursor/next/**` | `presets/mavis/next/**` via `generate-mavis-next.mjs` | **Required** `adapter-map.json` |
36
+
37
+ Mavis is a **third platform adapter**, not a Claude-style topic twin:
38
+
39
+ ```text
40
+ _shared/core → cursor/<stack> → mavis/<stack>
41
+ ```
42
+
43
+ Regenerate with `node packages/ai-rules/scripts/generate-mavis-next.mjs`; validate with `node packages/ai-rules/scripts/check-mavis-adapter-map.mjs`.
44
+
45
+ ## OpenCode derivation (not a Claude twin)
46
+
47
+ | Stack | Cursor SoT | OpenCode derive | Manifest |
48
+ |-------|------------|-----------------|----------|
49
+ | `next` | `presets/cursor/next/**` | `presets/opencode/next/**` via `generate-opencode-next.mjs` | **Required** `adapter-map.json` |
50
+
51
+ OpenCode is a **fourth platform adapter** with a **native** install root (`.opencode/`), not a Claude-style topic twin and not an owned overlay like `.mavis/`:
52
+
53
+ ```text
54
+ _shared/core → cursor/<stack> → opencode/<stack>
55
+ ```
56
+
57
+ Regenerate with `node packages/ai-rules/scripts/generate-opencode-next.mjs`; validate with `node packages/ai-rules/scripts/check-opencode-adapter-map.mjs`. Do not derive OpenCode sources from Claude.
58
+
31
59
  ## Same-PR checklist
32
60
 
33
61
  1. Edit Cursor rule first (body + frontmatter).
34
62
  2. Update Claude twin: body + `paths:` (from Cursor `globs:` / requestable triggers); drop `alwaysApply`.
35
63
  3. Update mapping table row if stem/path changed.
36
64
  4. If body embeds core (`<!-- shared-core: … -->`), sync core consumers across stacks when core changed.
65
+ 5. When mapped `cursor/<stack>/` sources change, regenerate `mavis/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`).
66
+ 6. When mapped `cursor/<stack>/` sources change, regenerate `opencode/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`).
37
67
 
38
68
  ## Twin depth
39
69
 
@@ -54,5 +84,7 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
54
84
  - **php-hexagonal:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts; mapping table required).
55
85
  - **php-laravel:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-hexagonal; mapping table required).
56
86
  - **android-kotlin:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-*; mapping table required).
87
+ - **mavis/next:** `cursor/next` mapped source changed without mavis regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-mavis-adapter-map.mjs`).
88
+ - **opencode/next:** `cursor/next` mapped source changed without opencode regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-opencode-adapter-map.mjs`).
57
89
 
58
90
  Dogfood: sync packages → root `.cursor/` after Cursor SoT changes (not the reverse). Use `packages/ai-rules/scripts/sync-dogfood-cursor.sh`.
@@ -18,14 +18,14 @@ Rules for **preset authors** (`packages/ai-rules/presets/**`). Not always-on in
18
18
  | Layer | Where | What to put |
19
19
  |-------|-------|-------------|
20
20
  | **Core** | `presets/_shared/core/**` | Stack-agnostic prose + checklists; no frontmatter; no paths `app/**`, `Features/**`, Playwright, xcodebuild |
21
- | **Stack** | `presets/{cursor\|claude}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
- | **Platform** | Cursor `.mdc` / Claude `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
21
+ | **Stack** | `presets/{cursor\|claude\|mavis\|opencode}/<stack>/` | Domain/tooling, stack always-on trio, stack examples in **Stack notes** |
22
+ | **Platform** | Cursor `.mdc` / Claude `.md` / Mavis `.md` / OpenCode `.md` | Frontmatter (`alwaysApply`/`globs` vs `paths:` vs OpenCode `mode`/`permission`), platform-only (`BUGBOT.md`, `CLAUDE.md`) |
23
23
 
24
24
  ## Where to put a new rule
25
25
 
26
26
  1. Shared principles for all stacks → **core** + adapters with `<!-- shared-core: … -->`.
27
27
  2. Only one of the installable stacks (`next` / `nuxt` / `svelte` / `ios-swift` / `android-kotlin` / `go` / `java` / `mcp-ts` / `php-hexagonal` / `php-laravel`) → **stack-specific** (not in `_shared`).
28
- 3. Only Cursor or only Claude packaging → platform artifact / frontmatter; do not duplicate semantics.
28
+ 3. Only Cursor, Claude, Mavis, or OpenCode packaging → platform artifact / frontmatter; do not duplicate semantics.
29
29
 
30
30
  ## SoT
31
31
 
@@ -96,4 +96,4 @@ Required instead: package-manager–discovered typecheck/test (`mcp-ts-tooling`,
96
96
 
97
97
  ## Chain fork
98
98
 
99
- `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform).
99
+ `hooks/chain-team-phases.sh` must differ **byte-wise** pairwise among `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `mcp-ts`, `php-hexagonal`, and `php-laravel` (per platform). Released Mavis/OpenCode stacks must also differ from the Cursor and Claude twins of the same stack.
@@ -18,17 +18,19 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
18
18
  - [ ] **SoT:** edits in `packages/…` (not only root `.cursor/`)
19
19
  - [ ] **Core:** if `_shared/core/**` changed — all `<!-- shared-core: … -->` consumers updated (or documented intentional fork)
20
20
  - [ ] **Twin:** Cursor change → Claude twin **same PR** (**FAIL** if missing on next, nuxt, svelte, ios-swift, android-kotlin, go, java, mcp-ts, php-hexagonal, and php-laravel — see `preset-twin-sync`)
21
+ - [ ] **Mavis derive:** mapped `cursor/<stack>/` change → `mavis/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`; see `preset-twin-sync` § Mavis derivation)
22
+ - [ ] **OpenCode derive:** mapped `cursor/<stack>/` change → `opencode/<stack>/` + `adapter-map.json` **same PR** when the stack is in `releasedStacks` (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`; see `preset-twin-sync` § OpenCode derivation)
21
23
  - [ ] **Mapping:** `claude/<stack>/rules/README.md` mapping table is current
22
24
  - [ ] **Token budget:** Cursor `alwaysApply` ≤ 4 (4th slot reserved for `ai-local-overlay`); Claude session-start exactly 3; meta rules not always-on
23
25
  - [ ] **Local overlay coverage:** every installable stack ships `ai-local-overlay.mdc` (Cursor) and `ai-local-overlay.md` (Claude) with `MANDATORY` + acknowledgement format + `docs/LOCAL-OVERLAY.md` pointer; Claude twin listed in `claude/<stack>/rules/README.md` mapping table. Run `packages/ai-rules/scripts/check-local-overlay.sh`.
24
26
  - [ ] **Leakage:** no foreign stack agent stems / handoff strings (`preset-no-cross-stack-leakage`)
25
27
  - [ ] **Hook-only lifecycle:** `status.json` / `metrics.json` writes happen only inside `hooks/`; agents read but never rewrite lifecycle fields. Run `packages/ai-rules/scripts/check-hook-only-lifecycle.sh`.
26
- - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` across the 10 stacks × 2 platforms (20 hooks) holds. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
28
+ - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` holds pairwise among the 10 stacks × Cursor/Claude platforms, and each released Mavis/OpenCode stack hook must also differ from the Cursor and Claude twins of the same stack. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
27
29
  - [ ] **Twin depth:** domain ≥15 lines; thin aliases documented
28
30
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
29
31
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
30
32
  - [ ] **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`.
31
- - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (or document intentional skip) when maintaining this monorepo
33
+ - [ ] **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
32
34
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
33
35
 
34
36
  ## Pointers
@@ -38,6 +40,6 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
38
40
  - Budget: `preset-token-budget`
39
41
  - Leakage: `preset-no-cross-stack-leakage`
40
42
  - Validation: stack `agents/build-verifier.md` → preset-structure section
41
- - Dogfood script: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`
43
+ - Dogfood scripts: `packages/ai-rules/scripts/sync-dogfood-cursor.sh`, `sync-dogfood-mavis.sh`, `sync-dogfood-opencode.sh`
42
44
  - Drift script: `packages/ai-rules/scripts/check-shared-core-drift.sh`
43
45
  - Orchestrator: when editing presets, load this checklist + twin-sync
@@ -19,6 +19,8 @@ Invariants for rule loading in an **installed** preset (consumer app).
19
19
  |----------|-----------|-----|
20
20
  | Cursor | `alwaysApply: true` | **≤ 4** |
21
21
  | Claude | rules **without** `paths:` | **exactly 3** |
22
+ | Mavis | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
23
+ | OpenCode | `adapter-map` rules with `loadMode: root-entry` | **≤ 4** |
22
24
 
23
25
  **Cursor 4th slot is reserved for `ai-local-overlay`** (consumer-owned `.ai.local/` rules). If you do not need local overlay, demote that rule to `globs: ["**/.ai.local/**"]` and revert to ≤3.
24
26
 
@@ -27,6 +29,7 @@ Invariants for rule loading in an **installed** preset (consumer app).
27
29
  Session-start body budget:
28
30
  - Claude trio: ≤140 lines total (stretch ≤120).
29
31
  - Cursor 4-set: ≤170 lines total (4 rules including `ai-local-overlay`).
32
+ - Mavis / OpenCode: ≤4 root-entry rule files; combined root `AGENTS.md` + platform entry ≤170 nonempty lines. Do not dump the full rule catalog into `AGENTS.md`.
30
33
 
31
34
  ## Meta / author rules
32
35
 
@@ -28,12 +28,42 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
28
28
  | `php-laravel` | `presets/cursor/php-laravel/rules/*.mdc` | `presets/claude/php-laravel/rules/<topic>/` | Keep in `claude/php-laravel/rules/README.md` |
29
29
  | `android-kotlin` | `presets/cursor/android-kotlin/rules/*.mdc` | `presets/claude/android-kotlin/rules/<topic>/` | Keep in `claude/android-kotlin/rules/README.md` |
30
30
 
31
+ ## Mavis derivation (not a Claude twin)
32
+
33
+ | Stack | Cursor SoT | Mavis derive | Manifest |
34
+ |-------|------------|--------------|----------|
35
+ | `next` | `presets/cursor/next/**` | `presets/mavis/next/**` via `generate-mavis-next.mjs` | **Required** `adapter-map.json` |
36
+
37
+ Mavis is a **third platform adapter**, not a Claude-style topic twin:
38
+
39
+ ```text
40
+ _shared/core → cursor/<stack> → mavis/<stack>
41
+ ```
42
+
43
+ Regenerate with `node packages/ai-rules/scripts/generate-mavis-next.mjs`; validate with `node packages/ai-rules/scripts/check-mavis-adapter-map.mjs`.
44
+
45
+ ## OpenCode derivation (not a Claude twin)
46
+
47
+ | Stack | Cursor SoT | OpenCode derive | Manifest |
48
+ |-------|------------|-----------------|----------|
49
+ | `next` | `presets/cursor/next/**` | `presets/opencode/next/**` via `generate-opencode-next.mjs` | **Required** `adapter-map.json` |
50
+
51
+ OpenCode is a **fourth platform adapter** with a **native** install root (`.opencode/`), not a Claude-style topic twin and not an owned overlay like `.mavis/`:
52
+
53
+ ```text
54
+ _shared/core → cursor/<stack> → opencode/<stack>
55
+ ```
56
+
57
+ Regenerate with `node packages/ai-rules/scripts/generate-opencode-next.mjs`; validate with `node packages/ai-rules/scripts/check-opencode-adapter-map.mjs`. Do not derive OpenCode sources from Claude.
58
+
31
59
  ## Same-PR checklist
32
60
 
33
61
  1. Edit Cursor rule first (body + frontmatter).
34
62
  2. Update Claude twin: body + `paths:` (from Cursor `globs:` / requestable triggers); drop `alwaysApply`.
35
63
  3. Update mapping table row if stem/path changed.
36
64
  4. If body embeds core (`<!-- shared-core: … -->`), sync core consumers across stacks when core changed.
65
+ 5. When mapped `cursor/<stack>/` sources change, regenerate `mavis/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-mavis-next.mjs` + `check-mavis-adapter-map.mjs` for `next`).
66
+ 6. When mapped `cursor/<stack>/` sources change, regenerate `opencode/<stack>/` and refresh `adapter-map.json` `sourceRevision` in the **same PR** (run `generate-opencode-next.mjs` + `check-opencode-adapter-map.mjs` for `next`).
37
67
 
38
68
  ## Twin depth
39
69
 
@@ -54,5 +84,7 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
54
84
  - **php-hexagonal:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts; mapping table required).
55
85
  - **php-laravel:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-hexagonal; mapping table required).
56
86
  - **android-kotlin:** missing Claude twin for a changed Cursor rule → **FAIL** (same as next / ios-swift / go / java / mcp-ts / php-*; mapping table required).
87
+ - **mavis/next:** `cursor/next` mapped source changed without mavis regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-mavis-adapter-map.mjs`).
88
+ - **opencode/next:** `cursor/next` mapped source changed without opencode regeneration / `adapter-map.json` `sourceRevision` drift → **FAIL** (`check-opencode-adapter-map.mjs`).
57
89
 
58
90
  Dogfood: sync packages → root `.cursor/` after Cursor SoT changes (not the reverse). Use `packages/ai-rules/scripts/sync-dogfood-cursor.sh`.
@@ -0,0 +1,60 @@
1
+ # Mavis platform adapter
2
+
3
+ Sibling of `presets/cursor/` and `presets/claude/`. Platform id is **`mavis`**.
4
+ The external runtime executable is **`mcode`**. Do not add `mcode` or
5
+ `minimax` as `ai-rules` tool aliases.
6
+
7
+ This directory is the **source** tree. Consumer installs land under
8
+ **`.mavis/`**, an ai-rules-owned namespace. `.mavis/**` is not a MiniMax-native
9
+ discovery path. Do not write `~/.minimax/**` from init, clean, or probes.
10
+
11
+ ## Status
12
+
13
+ `platform-contract.json` `releasedStacks` lists installable stacks. As of WP-E,
14
+ **`next`** is released (`npx @bonesofspring/ai-rules init mavis --preset next`).
15
+ Additional stacks ship in WP-F after the Next pilot human gate.
16
+
17
+ Derivation (approved architecture):
18
+
19
+ ```text
20
+ _shared/core → cursor/<stack> → mavis/<stack>
21
+ cursor/<stack> → claude/<stack> (unchanged twin)
22
+ ```
23
+
24
+ Mavis sources are **not** derived from Claude. Cursor remains the semantic
25
+ source of truth.
26
+
27
+ ## Compatibility floor (WP-A)
28
+
29
+ See [`docs/MAVIS.md`](../../docs/MAVIS.md) (consumer guide) and [`docs/MAVIS-COMPATIBILITY.md`](../../docs/MAVIS-COMPATIBILITY.md). Gate on
30
+ capabilities, not desktop/CLI patch numbers.
31
+
32
+ Confirmed on an isolated logged-in probe:
33
+
34
+ - root `AGENTS.md` consumption
35
+ - explicit `mcode exec --file` for role prompts
36
+ - referenced rules and skills from root `AGENTS.md`
37
+ - parseable `exec --output-format json` wrapper
38
+
39
+ Required fallbacks (do not claim native discovery):
40
+
41
+ - project rules / skills / agents without an explicit root reference
42
+ - project MCP → `.mavis/mcp.json` + manual UI import
43
+ - hooks → shipped `chain-team-phases.sh` as a manual/semi-auto runner
44
+ - slash commands → natural-language procedures + `exec --file`
45
+ - `mcode init` → ship `REPO_AGENTS.md` (TTY required on current CLI)
46
+
47
+ ## Files
48
+
49
+ | Path | Role |
50
+ |------|------|
51
+ | `platform-contract.json` | Machine-readable adapter declaration (schema §3.4) |
52
+ | `next/` | Released Next.js stack (`releasedStacks: ["next"]`) |
53
+ | `<other-stack>/` | Deferred until WP-F human gate (not in `releasedStacks`) |
54
+
55
+ Validate:
56
+
57
+ ```bash
58
+ node scripts/check-mavis-platform-contract.mjs
59
+ node scripts/check-mavis-platform-contract.mjs --self-test
60
+ ```
@@ -0,0 +1,67 @@
1
+ # Next.js stack — Mavis agent team
2
+
3
+ Short Mavis entry. Detailed rules live under `.mavis/rules/*.md`; procedures
4
+ under `.mavis/skills/**`. This file is ai-rules-owned (`.mavis/AGENTS.md`),
5
+ not a MiniMax-reserved filename.
6
+
7
+ Root `AGENTS.md` is the compatibility floor. Read it first, then this file.
8
+
9
+ ## How to load
10
+
11
+ - Rules and skills: follow the explicit paths in this file and root `AGENTS.md`.
12
+ Native project discovery without a reference is unconfirmed.
13
+ - Roles: `mcode exec --file .mavis/agents/<role>.md --output-format json`.
14
+ - Commands: natural-language procedures in `.mavis/commands/`, or
15
+ `mcode exec --file .mavis/commands/task.md "<task>"`.
16
+ - After a producer receipt, run `bash .mavis/hooks/chain-team-phases.sh`.
17
+ Agents must not write lifecycle fields in `status.json` / `metrics.json`.
18
+
19
+ ## Essential rules (read every turn)
20
+
21
+ - `.mavis/rules/next-app-core.md`
22
+ - `.mavis/rules/package-manager.md`
23
+ - `.mavis/rules/code-quality-and-refactoring.md`
24
+ - `.mavis/rules/ai-local-overlay.md`
25
+
26
+ See `.mavis/rules/README.md` for the full catalog and loading strategy.
27
+
28
+ **Platform docs:** capability matrix and install guide — [`docs/MAVIS.md`](../../docs/MAVIS.md) and
29
+ [`docs/MAVIS-COMPATIBILITY.md`](../../docs/MAVIS-COMPATIBILITY.md) in the
30
+ `@bonesofspring/ai-rules` package (typically under `node_modules/` after install).
31
+
32
+ **Repo-root agents:** see [`AGENTS.md`](../../AGENTS.md) at the project root (cross-tool setup, commands, security, living conventions pointers).
33
+
34
+ ## Quick start
35
+
36
+ | Task | Where to look |
37
+ |------|----------------|
38
+ | Any new work task | `/task` → `commands/task.md` + `agent-team-orchestrator.md` (+ `agent-team-intake.md` on-demand) |
39
+ | New end-to-end feature | skill `feature-delivery` + `feature-delivery-workflow.md` |
40
+ | Stack and layers | `next-app-core.md` |
41
+ | Reference features | `reference-features.md` (fill paths in the repo) |
42
+ | After code edits | `post-change-lint.md` (**requestable**, but required after edits; full gate — `build-verifier`) |
43
+ | Code review MR | skill `code-review` + `code-review-mr.md` |
44
+ | Security (auth/forms/env) | `security-next.md` + agent `security-reviewer` |
45
+ | Validation before review | agent `build-verifier` |
46
+ | Technical retro | `/technical-retro` + skill `technical-retro` |
47
+
48
+ ## When to use `/task`
49
+
50
+ - Implementation, bugfix, migration, tests, MR review, CI fix — **prefer `/task`**.
51
+ - Simple one-liner without architectural risk — may skip the pipeline if the user explicitly asks.
52
+ - Questions «как работает X» (how does X work) — agent `codebase-analyzer` (explain-as-is) or answer without `/task`. <!-- i18n-keep: E4 -->
53
+
54
+ ## Pipeline routing
55
+
56
+ Intent detection, profiles (`full` / `standard` / `light`), and default steps — **only** in `agents/task-router.md`. Schema and examples — `agents/README.md`.
57
+
58
+ ## Install
59
+
60
+ ```bash
61
+ npx @bonesofspring/ai-rules init mavis --preset next
62
+ ```
63
+
64
+ Copies rules, commands, agents, hooks, skills, team, `MAVIS.md` → `.mavis/AGENTS.md`,
65
+ `MCP.md`, `mcp.json` → `.mavis/mcp.json`, plus `REPO_AGENTS.md` → root `AGENTS.md`.
66
+ Skills: `write-adr`, `react-performance` (on-demand). Import MCP from `.mavis/mcp.json`
67
+ in the MiniMax Code UI.
@@ -0,0 +1,36 @@
1
+ # MCP (preset `next`, Mavis)
2
+
3
+ Staged at `.mavis/mcp.json` on `ai-rules init mavis --preset next`.
4
+
5
+ ## Servers
6
+
7
+ | Name | Package | Purpose |
8
+ |------|---------|---------|
9
+ | `context7` | `@upstash/context7-mcp` | Up-to-date Next/React/TS and library docs (fewer stale APIs in agent answers) |
10
+ | `playwright` | `@playwright/mcp` | Browser automation for e2e agents (`playwright-test-*`) and selector checks |
11
+ | `chrome-devtools` | `chrome-devtools-mcp` | Live DOM/network/performance when debugging UI |
12
+ | `figma` | remote `https://mcp.figma.com/mcp` | Design context → code (layouts, tokens, Code Connect); OAuth in MiniMax Code (manual import) |
13
+
14
+ Do not put secrets in the file. Optional: `CONTEXT7_API_KEY` in the environment — higher Context7 rate limits. Figma — OAuth on first connect (do not write the token into config).
15
+
16
+
17
+ ## Agent usage
18
+
19
+ Load requestable rule `mcp-usage`. The **session MCP catalog** is source of truth (this file and `mcp.json` are hints). Discover tool schemas before calling; never invent them.
20
+
21
+ **Context7 (shipped):** query docs when a third-party API is not confirmed by lockfile + sibling files. Use the installed major. Cap ≤3 doc queries per question. If Context7 is down, mark `// VERIFY` and continue — do not block.
22
+
23
+ ## Local overlay (not shipped)
24
+
25
+ `init` **merges** `mcpServers`: preset keys are updated; extra local servers are kept. User-level MCP is never touched. Prefer user-level MCP if you do not want overlay servers in the project file.
26
+
27
+ Use an overlay only when it is **ready** (`serverStatus` not `error` / `needsAuth` / `loading`) **and** the task fits. Absence is not a blocker unless the user required that MCP as source of truth.
28
+
29
+ | Kind | Typical aliases | When |
30
+ |------|-----------------|------|
31
+ | Observability | `sentry`, `datadog`, `plugin-datadog-*` | production error, event/trace id, APM |
32
+ | Tickets | `linear`, `jira`, `notion`, `plugin-notion-*` | ticket/page URL; read-only; task-folder artifacts remain SoT |
33
+ | GitHub MCP | `github` | optional; native `gh` remains SoT for PRs and checks |
34
+ | Storybook | `storybook`, `user-storybook`, `plugin-storybook`, `storybook-mcp-addon` | component docs/stories/controls; needs Storybook running; not shipped |
35
+
36
+ **Browser split (this preset):** Playwright MCP → e2e agents and selectors. Chrome DevTools MCP → `debugger` / `performance-auditor` against a running app. Not interchangeable.