@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
@@ -0,0 +1,706 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Derive presets/mavis/next/** and adapter-map.json from cursor/next.
4
+ * Maintainer tool for WP-C; not a consumer CLI command.
5
+ */
6
+ import crypto from 'node:crypto';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+
11
+ const scriptDirectory = path.dirname(fileURLToPath(import.meta.url));
12
+ const packageRoot = path.join(scriptDirectory, '..');
13
+ const cursorRoot = path.join(packageRoot, 'presets', 'cursor', 'next');
14
+ const mavisRoot = path.join(packageRoot, 'presets', 'mavis', 'next');
15
+
16
+ const ALWAYS_ON_RULES = new Set([
17
+ 'next-app-core',
18
+ 'package-manager',
19
+ 'code-quality-and-refactoring',
20
+ 'ai-local-overlay',
21
+ ]);
22
+
23
+ const OMIT = new Map([
24
+ [
25
+ 'BUGBOT.md',
26
+ 'no-equivalent: Bugbot is Cursor-only; review stays a Verifier skill/role',
27
+ ],
28
+ [
29
+ 'hooks.json',
30
+ 'omit until a documented MiniMax hook schema exists',
31
+ ],
32
+ [
33
+ 'hooks/guard-shell-command.sh',
34
+ 'omit from active wiring; safety policy stays in entry prose, not enforcement',
35
+ ],
36
+ [
37
+ 'hooks/examples/format-edited.example.sh',
38
+ 'omit until a Mavis hook event API is confirmed',
39
+ ],
40
+ [
41
+ 'hooks/examples/secret-guard.example.sh',
42
+ 'omit until a Mavis hook event API is confirmed',
43
+ ],
44
+ [
45
+ 'hooks/examples/test-on-save.example.sh',
46
+ 'omit until a Mavis hook event API is confirmed',
47
+ ],
48
+ ]);
49
+
50
+ function walkFiles(root) {
51
+ const files = [];
52
+ const visit = (dir) => {
53
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
54
+ const full = path.join(dir, entry.name);
55
+ if (entry.isDirectory()) {
56
+ visit(full);
57
+ } else if (entry.isFile()) {
58
+ files.push(path.relative(root, full).split(path.sep).join('/'));
59
+ }
60
+ }
61
+ };
62
+ visit(root);
63
+ return files.sort();
64
+ }
65
+
66
+ function stripFrontmatter(text) {
67
+ if (!text.startsWith('---\n')) {
68
+ return { frontmatter: '', body: text };
69
+ }
70
+ const end = text.indexOf('\n---\n', 4);
71
+ if (end < 0) {
72
+ return { frontmatter: '', body: text };
73
+ }
74
+ return {
75
+ frontmatter: text.slice(4, end),
76
+ body: text.slice(end + 5).replace(/^\n/, ''),
77
+ };
78
+ }
79
+
80
+ const sharedCoreRoot = path.join(packageRoot, 'presets', '_shared', 'core');
81
+
82
+ function rewriteConsumerPaths(text) {
83
+ return text
84
+ .replaceAll('.cursor/team', '.mavis/team')
85
+ .replaceAll('.cursor/rules', '.mavis/rules')
86
+ .replaceAll('.cursor/skills', '.mavis/skills')
87
+ .replaceAll('.cursor/agents', '.mavis/agents')
88
+ .replaceAll('.cursor/commands', '.mavis/commands')
89
+ .replaceAll('.cursor/hooks', '.mavis/hooks')
90
+ .replaceAll('.cursor/AGENTS.md', '.mavis/AGENTS.md')
91
+ .replaceAll("'.cursor'", "'.mavis'")
92
+ .replaceAll('".cursor"', '".mavis"');
93
+ }
94
+
95
+ function rewriteProse(text) {
96
+ return finalizeMavisProse(text);
97
+ }
98
+
99
+ function finalizeMavisProse(text) {
100
+ return rewriteConsumerPaths(text)
101
+ .replace(/`([^`\n]+)\.mdc`/g, '`$1.md`')
102
+ .replace(/(?<![\w./-])([\w-]+)\.mdc\b/g, '$1.md')
103
+ .replaceAll('init cursor --preset', 'init mavis --preset')
104
+ .replaceAll('# MCP (preset `next`, Cursor)', '# MCP (preset `next`, Mavis)')
105
+ .replaceAll('(preset `next`, Cursor)', '(preset `next`, Mavis)')
106
+ .replaceAll('Copied to `.cursor/mcp.json`', 'Staged at `.mavis/mcp.json`')
107
+ .replaceAll('OAuth in Cursor', 'OAuth in MiniMax Code (manual import)');
108
+ }
109
+
110
+ function sha256(content) {
111
+ return crypto.createHash('sha256').update(content).digest('hex');
112
+ }
113
+
114
+ function writeFile(relPath, content) {
115
+ const dest = path.join(mavisRoot, relPath);
116
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
117
+ fs.writeFileSync(dest, content);
118
+ }
119
+
120
+ function sharedCoreStem(text) {
121
+ const match = text.match(/<!--\s*shared-core:\s*([^\s>]+)\s*-->/);
122
+ return match ? match[1] : undefined;
123
+ }
124
+
125
+ function entry({
126
+ source,
127
+ target,
128
+ category,
129
+ disposition,
130
+ loadMode,
131
+ reason,
132
+ sourceText,
133
+ }) {
134
+ const item = {
135
+ source,
136
+ target,
137
+ category,
138
+ disposition,
139
+ loadMode,
140
+ reason,
141
+ };
142
+ const stem = sourceText ? sharedCoreStem(sourceText) : undefined;
143
+ if (stem) {
144
+ item.sharedCoreStem = stem;
145
+ }
146
+ return item;
147
+ }
148
+
149
+ function isEmbedEntryBody(body) {
150
+ const first = body
151
+ .split('\n')
152
+ .map((line) => line.trim())
153
+ .find((line) => line.length > 0);
154
+ return Boolean(first && /^<!--\s*shared-core:\s*[^\s>]+\s*-->\s*$/.test(first));
155
+ }
156
+
157
+ function transformMarkdown(sourceText, { command = false, allowEmbedEntry = true } = {}) {
158
+ const { body } = stripFrontmatter(sourceText);
159
+ const stem =
160
+ allowEmbedEntry && isEmbedEntryBody(body) ? sharedCoreStem(body) : undefined;
161
+ let next;
162
+ if (stem) {
163
+ const corePath = path.join(sharedCoreRoot, stem);
164
+ if (fs.existsSync(corePath)) {
165
+ const coreBody = fs.readFileSync(corePath, 'utf8').trimEnd();
166
+ const marker = `<!-- shared-core: ${stem} -->`;
167
+ next = `${marker}\n\n${coreBody}\n`;
168
+ next = rewriteConsumerPaths(next);
169
+ } else {
170
+ next = rewriteProse(body);
171
+ }
172
+ } else {
173
+ next = rewriteProse(body);
174
+ }
175
+ if (command) {
176
+ next = next
177
+ .replaceAll('`/task-continue <slug>`', 'continue `<slug>` using `.mavis/commands/task-continue.md`')
178
+ .replaceAll('`/task-continue`', 'the task-continue procedure in `.mavis/commands/task-continue.md`')
179
+ .replaceAll('`/technical-retro`', 'the technical-retro procedure in `.mavis/commands/technical-retro.md`')
180
+ .replaceAll('`/spec-start`', 'the spec-start procedure in `.mavis/commands/spec-start.md`')
181
+ .replaceAll('`/task`', 'the task procedure in `.mavis/commands/task.md`');
182
+ }
183
+ return next.endsWith('\n') ? next : `${next}\n`;
184
+ }
185
+
186
+ function main() {
187
+ fs.rmSync(mavisRoot, { recursive: true, force: true });
188
+ fs.mkdirSync(mavisRoot, { recursive: true });
189
+
190
+ const cursorFiles = walkFiles(cursorRoot);
191
+ const mappedSources = cursorFiles.filter((rel) => path.basename(rel) !== 'README.md');
192
+ const entries = [];
193
+ const digestParts = [];
194
+
195
+ for (const source of mappedSources) {
196
+ const abs = path.join(cursorRoot, source);
197
+ const sourceText = fs.readFileSync(abs, 'utf8');
198
+ digestParts.push(`${source}\t${sha256(sourceText)}`);
199
+
200
+ if (OMIT.has(source)) {
201
+ entries.push(
202
+ entry({
203
+ source,
204
+ target: null,
205
+ category: source.startsWith('hooks') ? 'hooks' : 'platform',
206
+ disposition: 'omit',
207
+ loadMode: 'not-installed',
208
+ reason: OMIT.get(source),
209
+ sourceText,
210
+ }),
211
+ );
212
+ continue;
213
+ }
214
+
215
+ if (source === 'AGENTS.md') {
216
+ const target = 'MAVIS.md';
217
+ writeFile(target, buildMavisEntry(sourceText));
218
+ entries.push(
219
+ entry({
220
+ source,
221
+ target,
222
+ category: 'entry',
223
+ disposition: 'embed-entry',
224
+ loadMode: 'root-entry',
225
+ reason: 'Cursor AGENTS.md semantics feed .mavis/AGENTS.md; not a MiniMax-reserved name',
226
+ sourceText,
227
+ }),
228
+ );
229
+ continue;
230
+ }
231
+
232
+ if (source === 'REPO_AGENTS.md') {
233
+ const target = 'REPO_AGENTS.md';
234
+ writeFile(target, buildRepoAgents(sourceText));
235
+ entries.push(
236
+ entry({
237
+ source,
238
+ target,
239
+ category: 'entry',
240
+ disposition: 'transform',
241
+ loadMode: 'root-entry',
242
+ reason: 'Root AGENTS.md compatibility floor plus explicit .mavis/AGENTS.md pointer',
243
+ sourceText,
244
+ }),
245
+ );
246
+ continue;
247
+ }
248
+
249
+ if (source.startsWith('rules/') && source.endsWith('.mdc')) {
250
+ const stem = path.basename(source, '.mdc');
251
+ const target = `rules/${stem}.md`;
252
+ const alwaysOn = ALWAYS_ON_RULES.has(stem);
253
+ writeFile(target, transformMarkdown(sourceText));
254
+ entries.push(
255
+ entry({
256
+ source,
257
+ target,
258
+ category: 'rules',
259
+ disposition: 'transform',
260
+ loadMode: alwaysOn ? 'root-entry' : 'referenced',
261
+ reason: alwaysOn
262
+ ? 'Essential always-on Cursor rule: summary in entry files; full body referenced from .mavis/rules'
263
+ : 'Requestable Cursor rule: referenced from entry files; not claimed as MiniMax auto-load',
264
+ sourceText,
265
+ }),
266
+ );
267
+ continue;
268
+ }
269
+
270
+ if (source.startsWith('agents/') && source.endsWith('.md')) {
271
+ const target = source;
272
+ writeFile(target, transformMarkdown(sourceText, { allowEmbedEntry: false }));
273
+ entries.push(
274
+ entry({
275
+ source,
276
+ target,
277
+ category: 'agents',
278
+ disposition: 'transform',
279
+ loadMode: 'manual',
280
+ reason: 'Native workspace agent discovery is unknown; attach with mcode exec --file',
281
+ sourceText,
282
+ }),
283
+ );
284
+ continue;
285
+ }
286
+
287
+ if (source.startsWith('skills/') && source.endsWith('/SKILL.md')) {
288
+ const target = source;
289
+ writeFile(target, transformMarkdown(sourceText));
290
+ entries.push(
291
+ entry({
292
+ source,
293
+ target,
294
+ category: 'skills',
295
+ disposition: 'transform',
296
+ loadMode: 'referenced',
297
+ reason: 'Workspace skill discovery without a root reference is unknown',
298
+ sourceText,
299
+ }),
300
+ );
301
+ continue;
302
+ }
303
+
304
+ if (source.startsWith('commands/') && source.endsWith('.md')) {
305
+ const target = source;
306
+ writeFile(target, transformMarkdown(sourceText, { command: true }));
307
+ entries.push(
308
+ entry({
309
+ source,
310
+ target,
311
+ category: 'commands',
312
+ disposition: 'transform',
313
+ loadMode: 'manual',
314
+ reason: 'No file-defined slash command API; keep as an explicit procedure plus exec --file',
315
+ sourceText,
316
+ }),
317
+ );
318
+ continue;
319
+ }
320
+
321
+ if (source === 'hooks/chain-team-phases.sh') {
322
+ const target = source;
323
+ writeFile(target, rewriteProse(sourceText));
324
+ entries.push(
325
+ entry({
326
+ source,
327
+ target,
328
+ category: 'hooks',
329
+ disposition: 'transform',
330
+ loadMode: 'manual',
331
+ reason: 'Manual/semi-auto chain runner under .mavis/hooks; not auto-registered',
332
+ sourceText,
333
+ }),
334
+ );
335
+ continue;
336
+ }
337
+
338
+ if (source === 'mcp.json' || source === 'MCP.md') {
339
+ const target = source;
340
+ writeFile(target, source === 'MCP.md' ? rewriteProse(sourceText) : sourceText);
341
+ entries.push(
342
+ entry({
343
+ source,
344
+ target,
345
+ category: 'mcp',
346
+ disposition: source === 'MCP.md' ? 'transform' : 'copy',
347
+ loadMode: 'manual',
348
+ reason: 'Fallback merge into .mavis/mcp.json plus manual MiniMax UI import',
349
+ sourceText,
350
+ }),
351
+ );
352
+ continue;
353
+ }
354
+
355
+ if (source.startsWith('team/')) {
356
+ const target = source;
357
+ const transformed = source.endsWith('.md') ? rewriteProse(sourceText) : sourceText;
358
+ writeFile(target, transformed.endsWith('\n') || !source.endsWith('.md') ? transformed : `${transformed}\n`);
359
+ entries.push(
360
+ entry({
361
+ source,
362
+ target,
363
+ category: 'team',
364
+ disposition: source.endsWith('.md') ? 'transform' : 'copy',
365
+ loadMode: 'manual',
366
+ reason: 'File pipeline remains audit SoT under .mavis/team',
367
+ sourceText,
368
+ }),
369
+ );
370
+ continue;
371
+ }
372
+
373
+ throw new Error(`unmapped cursor source: ${source}`);
374
+ }
375
+
376
+ writeFile('README.md', buildStackReadme());
377
+ writeFile('rules/README.md', buildRulesReadme());
378
+ writeFile('agents/README.md', buildAgentsReadme());
379
+ writeFile('skills/README.md', rewriteProse(readSiblingReadme('skills/README.md')));
380
+ writeFile('commands/README.md', buildCommandsReadme());
381
+ writeFile('hooks/README.md', buildHooksReadme());
382
+ writeFile('team/README.md', rewriteProse(readSiblingReadme('team/README.md')));
383
+
384
+ digestParts.sort();
385
+ const adapterMap = {
386
+ schemaVersion: 1,
387
+ platform: 'mavis',
388
+ stack: 'next',
389
+ semanticSource: 'cursor/next',
390
+ sourceRevision: sha256(digestParts.join('\n')),
391
+ entries,
392
+ };
393
+ writeFile('adapter-map.json', `${JSON.stringify(adapterMap, null, 2)}\n`);
394
+ console.log(
395
+ `generated presets/mavis/next (${entries.length} mapped sources, revision ${adapterMap.sourceRevision.slice(0, 12)})`,
396
+ );
397
+ }
398
+
399
+ function readSiblingReadme(rel) {
400
+ const filePath = path.join(cursorRoot, rel);
401
+ return fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : `# ${rel}\n`;
402
+ }
403
+
404
+ function dropLeadingHeading(text) {
405
+ return text
406
+ .replace(/^# [^\n]+\n+/, '')
407
+ .replace(/^Short Cursor entry point\.[^\n]*\n+/, '');
408
+ }
409
+
410
+ function buildRepoAgents(_sourceText) {
411
+ return `# Next.js — agent instructions
412
+
413
+ Cross-tool repo-root guide. Tool-specific maps stay under \`.cursor/AGENTS.md\`,
414
+ \`.claude/CLAUDE.md\`, \`.mavis/AGENTS.md\`, and \`.opencode/AGENTS.md\`.
415
+
416
+ **.mavis/** is an ai-rules-owned namespace, not a MiniMax-native discovery path.
417
+ When this Mavis preset is installed, read \`.mavis/AGENTS.md\` on every turn.
418
+ Do not write \`~/.minimax/**\`. Do not mutate
419
+ \`.mavis/team/tasks/<slug>/status.json\` or \`metrics.json\` — the chain runner
420
+ owns those files.
421
+
422
+ ## Cross-tool setup
423
+
424
+ - Treat this file as the **shared** entry for any agent (Cursor, Claude Code,
425
+ Mavis / MiniMax Code, OpenCode, or other).
426
+ - Install:
427
+
428
+ \`\`\`bash
429
+ npx @bonesofspring/ai-rules init cursor --preset next
430
+ npx @bonesofspring/ai-rules init claude --preset next
431
+ npx @bonesofspring/ai-rules init mavis --preset next
432
+ npx @bonesofspring/ai-rules init opencode --preset next
433
+ \`\`\`
434
+
435
+ \`init\` overwrites this file from the preset (\`REPO_AGENTS.md\` → \`AGENTS.md\`).
436
+ Living gotchas belong in \`team/conventions.md\`, not here.
437
+
438
+ ## Mavis compatibility entry
439
+
440
+ After install, also read:
441
+
442
+ - \`.mavis/AGENTS.md\` — Mavis load map, roles, and procedures
443
+ - \`.mavis/rules/next-app-core.md\`
444
+ - \`.mavis/rules/package-manager.md\`
445
+ - \`.mavis/rules/code-quality-and-refactoring.md\`
446
+ - \`.mavis/rules/ai-local-overlay.md\`
447
+
448
+ Launch roles with \`mcode exec --file .mavis/agents/<role>.md\`. Start work with
449
+ the task procedure in \`.mavis/commands/task.md\`.
450
+
451
+ ## Commands (test / lint / build)
452
+
453
+ Working directory for app scripts: **\`app/\`**. Detect the package manager from
454
+ lockfile / \`packageManager\` (\`package-manager\` rule).
455
+
456
+ | Gate | Typical command |
457
+ |------|-----------------|
458
+ | Lint JS | \`yarn lint:js\` (or project equivalent) from \`app/\` |
459
+ | Lint CSS | \`yarn lint:css\` from \`app/\` |
460
+ | Unit tests | project unit script under \`app/\` |
461
+ | Build | project \`build\` under \`app/\` |
462
+
463
+ After code edits: invoke **\`post-change-lint\`** (requestable). Full gate: agent
464
+ \`build-verifier\`.
465
+
466
+ ## Security basics
467
+
468
+ - Do not commit secrets (\`.env\`, tokens, credentials).
469
+ - Review destructive git (\`reset --hard\`, force-push) before running; respect
470
+ shell hooks.
471
+ - Do not weaken CI or skip hooks unless the user explicitly asks.
472
+
473
+ ## Tool entry points
474
+
475
+ | Tool | Map |
476
+ |------|-----|
477
+ | Cursor | \`.cursor/AGENTS.md\` (optional if Cursor not installed) |
478
+ | Claude Code | \`.claude/CLAUDE.md\` (optional if Claude Code not installed) |
479
+ | Mavis | \`.mavis/AGENTS.md\` (optional if Mavis not installed) |
480
+ | OpenCode | \`.opencode/AGENTS.md\` (optional if OpenCode not installed) |
481
+
482
+ Rules: \`.cursor/rules/\`, \`.claude/rules/\`, \`.mavis/rules/\`, or \`.opencode/rules/\`.
483
+ Skills: \`.cursor/skills/\`, \`.claude/skills/\`, \`.mavis/skills/\`, or \`.opencode/skills/\`.
484
+
485
+ ## Living conventions
486
+
487
+ Gotchas, local patterns, and team decisions:
488
+ **\`.cursor/team/conventions.md\`**, **\`.claude/team/conventions.md\`**,
489
+ **\`.mavis/team/conventions.md\`**, and/or **\`.opencode/team/conventions.md\`**
490
+ (fill after init; not overwritten on every dogfood sync when already present).
491
+
492
+ ## Local overlay (\`.ai.local/\`) — MANDATORY
493
+
494
+ A \`.ai.local/\` directory MAY exist at the repo root or at any nesting depth in
495
+ monorepos. **All agents MUST read and apply it on every turn.** Rules there
496
+ override preset rules; in conflicts, the local rule wins.
497
+ \`override: kill <preset-rule-name>\` drops the named preset rule from the
498
+ agent's context entirely.
499
+
500
+ Plain markdown rules under \`.ai.local/rules/*.md\` are read by the agent with
501
+ higher priority than preset rules. Living gotchas live in
502
+ \`.ai.local/conventions.md\`.
503
+
504
+ Authoring guide: \`docs/LOCAL-OVERLAY.md\` in the \`@bonesofspring/ai-rules\`
505
+ package. The \`ai-local-overlay\` rule is the mechanism; this \`MANDATORY\`
506
+ section is the reinforcement.
507
+ `;
508
+ }
509
+
510
+ function stripInstallSection(body) {
511
+ const index = body.search(/^## Install\r?\n/m);
512
+ if (index < 0) {
513
+ return body.trimEnd();
514
+ }
515
+ return body.slice(0, index).trimEnd();
516
+ }
517
+
518
+ function stripEmbeddedCatalogLine(body) {
519
+ return body.replace(
520
+ /^See `\.mavis\/rules\/README\.md` for the full catalog[^\n]*\n+/m,
521
+ '',
522
+ );
523
+ }
524
+
525
+ function buildMavisEntry(sourceText) {
526
+ const body = stripEmbeddedCatalogLine(
527
+ stripInstallSection(
528
+ dropLeadingHeading(rewriteProse(stripFrontmatter(sourceText).body)),
529
+ ),
530
+ );
531
+ return `# Next.js stack — Mavis agent team
532
+
533
+ Short Mavis entry. Detailed rules live under \`.mavis/rules/*.md\`; procedures
534
+ under \`.mavis/skills/**\`. This file is ai-rules-owned (\`.mavis/AGENTS.md\`),
535
+ not a MiniMax-reserved filename.
536
+
537
+ Root \`AGENTS.md\` is the compatibility floor. Read it first, then this file.
538
+
539
+ ## How to load
540
+
541
+ - Rules and skills: follow the explicit paths in this file and root \`AGENTS.md\`.
542
+ Native project discovery without a reference is unconfirmed.
543
+ - Roles: \`mcode exec --file .mavis/agents/<role>.md --output-format json\`.
544
+ - Commands: natural-language procedures in \`.mavis/commands/\`, or
545
+ \`mcode exec --file .mavis/commands/task.md "<task>"\`.
546
+ - After a producer receipt, run \`bash .mavis/hooks/chain-team-phases.sh\`.
547
+ Agents must not write lifecycle fields in \`status.json\` / \`metrics.json\`.
548
+
549
+ ## Essential rules (read every turn)
550
+
551
+ - \`.mavis/rules/next-app-core.md\`
552
+ - \`.mavis/rules/package-manager.md\`
553
+ - \`.mavis/rules/code-quality-and-refactoring.md\`
554
+ - \`.mavis/rules/ai-local-overlay.md\`
555
+
556
+ See \`.mavis/rules/README.md\` for the full catalog and loading strategy.
557
+
558
+ **Platform docs:** capability matrix and install guide — [\`docs/MAVIS.md\`](../../docs/MAVIS.md) and
559
+ [\`docs/MAVIS-COMPATIBILITY.md\`](../../docs/MAVIS-COMPATIBILITY.md) in the
560
+ \`@bonesofspring/ai-rules\` package (typically under \`node_modules/\` after install).
561
+
562
+ ${body}
563
+
564
+ ## Install
565
+
566
+ \`\`\`bash
567
+ npx @bonesofspring/ai-rules init mavis --preset next
568
+ \`\`\`
569
+
570
+ Copies rules, commands, agents, hooks, skills, team, \`MAVIS.md\` → \`.mavis/AGENTS.md\`,
571
+ \`MCP.md\`, \`mcp.json\` → \`.mavis/mcp.json\`, plus \`REPO_AGENTS.md\` → root \`AGENTS.md\`.
572
+ Skills: \`write-adr\`, \`react-performance\` (on-demand). Import MCP from \`.mavis/mcp.json\`
573
+ in the MiniMax Code UI.
574
+ `;
575
+ }
576
+
577
+ function buildCommandsReadme() {
578
+ let text = rewriteProse(readSiblingReadme('commands/README.md'));
579
+ text = text.replace(
580
+ '# Cursor commands (next preset)',
581
+ '# Mavis commands (next preset)',
582
+ );
583
+ text = text.replace(
584
+ 'Slash commands are copied to `.mavis/commands/` on `ai-rules init mavis --preset next`.',
585
+ 'Procedure files are copied to `.mavis/commands/` on `ai-rules init mavis --preset next`. Invoke via `mcode exec --file .mavis/commands/<name>.md` or natural-language procedures in the MiniMax UI.',
586
+ );
587
+ text = text.replace(
588
+ '- Subagents: `../agents/` (**22** roles, including `task-router.md`, `codebase-analyzer.md`)',
589
+ '- Subagents: `../agents/` (**24** roles, including `task-router.md`, `codebase-analyzer.md`)',
590
+ );
591
+ text = text.replace(
592
+ '- Orchestrator: `../rules/agent-team-orchestrator.mdc`',
593
+ '- Orchestrator: `../rules/agent-team-orchestrator.md`',
594
+ );
595
+ text = text.replace(
596
+ '- Hooks: `../hooks.json`, `../hooks/chain-team-phases.sh`',
597
+ '- Hooks: `../hooks/chain-team-phases.sh` only (semi-auto runner; no `hooks.json` in mavis)',
598
+ );
599
+ text = text.replace(
600
+ 'Create and edit commands via `/commands` in Cursor or directly in this preset folder.',
601
+ 'Edit procedure files in this preset folder or in the installed `.mavis/commands/` copy after `init`.',
602
+ );
603
+ return text.endsWith('\n') ? text : `${text}\n`;
604
+ }
605
+
606
+ function buildAgentsReadme() {
607
+ let text = rewriteProse(readSiblingReadme('agents/README.md'));
608
+ text = text.replace(
609
+ 'Role-based subagents for the Cursor team pipeline.',
610
+ 'Role-based subagents for the Mavis team pipeline (`mcode exec --file`).',
611
+ );
612
+ text = text.replace(
613
+ /## Frontmatter `readonly`[\s\S]*?(?=## Orchestration)/,
614
+ `## Mavis packaging (no YAML frontmatter)
615
+
616
+ Mavis agents ship as **plain Markdown** without Cursor-style YAML frontmatter (\`name\`, \`readonly\`, \`model\`). Adapter-map marks every agent \`loadMode: manual\`; attach with:
617
+
618
+ \`\`\`bash
619
+ mcode exec --file .mavis/agents/<role>.md --output-format json
620
+ \`\`\`
621
+
622
+ **Team artifacts:** agents write \`.mavis/team/**\` deliverables (\`pipeline.json\`, \`brief.md\`, \`review.md\`, \`artifact-manifest.json\`, …). They must **not** mutate lifecycle fields in \`status.json\` or \`metrics.json\` — \`bash .mavis/hooks/chain-team-phases.sh\` owns those after each producer receipt.
623
+
624
+ Production-code restrictions live in each agent's **prompt body**, not in frontmatter flags.
625
+
626
+ ## Model tiers (advisory)
627
+
628
+ Model routing is **prose-only** in this preset (no YAML \`model\` frontmatter). Optional \`steps[].model\` in \`pipeline.json\` (\`cheap\` | \`standard\` | \`strong\`) is advisory for \`mcode\` operators — see \`task-router.md\` and \`agent-team-orchestrator.md\`.
629
+
630
+ | Tier | Agents |
631
+ |------|--------|
632
+ | **cheap** | \`task-router\`, \`task-analyst\`, \`build-verifier\`, \`code-reviewer\`, \`tech-writer\`, \`codebase-analyzer\` |
633
+ | **standard** | \`feature-developer\`, \`debugger\`, \`ci-investigator\`, \`api-contract-reviewer\`, \`accessibility-reviewer\`, \`qa-tester\`, \`unit-test-*\`, \`playwright-test-*\`, \`openspec-author\` |
634
+ | **strong** | \`solution-architect\`, \`migration-specialist\`, \`security-reviewer\`, \`performance-auditor\`, \`mockup-reviewer\` |
635
+
636
+ `,
637
+ );
638
+ return text.endsWith('\n') ? text : `${text}\n`;
639
+ }
640
+
641
+ function buildStackReadme() {
642
+ return `# Next.js preset (Mavis)
643
+
644
+ Sibling adapter derived from \`presets/cursor/next\`. Platform id \`mavis\`;
645
+ runtime \`mcode\`. Consumer install root is \`.mavis/\` (ai-rules-owned).
646
+
647
+ Mapping: \`adapter-map.json\`. Do not derive this tree from Claude.
648
+
649
+ \`\`\`bash
650
+ npx @bonesofspring/ai-rules init mavis --preset next
651
+ \`\`\`
652
+
653
+ \`releasedStacks\` currently lists **\`next\`** only. Other stacks ship in WP-F after the Next pilot human gate.
654
+
655
+ Omitted from this pilot: \`BUGBOT.md\`, \`hooks.json\`, hook examples, and
656
+ unwired \`guard-shell-command.sh\`.
657
+ `;
658
+ }
659
+
660
+ function buildRulesReadme() {
661
+ return `# Mavis Next rules
662
+
663
+ Plain Markdown. MiniMax does not auto-load these files; root \`AGENTS.md\` and
664
+ \`.mavis/AGENTS.md\` reference them explicitly.
665
+
666
+ ## Essential (entry-critical)
667
+
668
+ \`next-app-core\`, \`package-manager\`, \`code-quality-and-refactoring\`,
669
+ \`ai-local-overlay\`.
670
+
671
+ ## Requestable
672
+
673
+ All other \`*.md\` files in this directory. Read when the task matches the
674
+ catalog in the Cursor source \`rules/README.md\` (same stems).
675
+
676
+ Shared-core markers (\`<!-- shared-core: … -->\`) are preserved from Cursor.
677
+ `;
678
+ }
679
+
680
+ function buildHooksReadme() {
681
+ return `# Mavis hooks
682
+
683
+ No documented MiniMax project hook API is assumed.
684
+
685
+ ## Shipped
686
+
687
+ \`chain-team-phases.sh\` — manual/semi-auto runner. After a producer receipt:
688
+
689
+ \`\`\`bash
690
+ printf '%s\\n' '{"status":"completed","attemptId":"<runtime-attempt-id>"}' \\
691
+ | bash .mavis/hooks/chain-team-phases.sh
692
+ \`\`\`
693
+
694
+ \`<runtime-attempt-id>\` comes from \`.mavis/team/tasks/<slug>/status.json\`.
695
+ Do not invent it. Agents never write lifecycle fields in \`status.json\` or
696
+ \`metrics.json\`.
697
+
698
+ ## Omitted
699
+
700
+ - \`hooks.json\` — no native registration schema
701
+ - \`guard-shell-command.sh\` — not wired; do not describe it as enforcement
702
+ - \`hooks/examples/**\` — no confirmed Mavis event API
703
+ `;
704
+ }
705
+
706
+ main();