@bonesofspring/ai-rules 0.2.21 → 0.2.23

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 (363) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +6 -2
  3. package/bin/cli.js +32 -8
  4. package/bin/mavis-install.js +441 -0
  5. package/package.json +9 -2
  6. package/presets/_shared/core/agent-team/agent-artifact-contracts.md +2 -0
  7. package/presets/_shared/core/meta/preset-pr-checklist.md +1 -0
  8. package/presets/_shared/core/meta/preset-twin-sync.md +17 -1
  9. package/presets/claude/android-kotlin/agents/build-verifier.md +2 -0
  10. package/presets/claude/android-kotlin/agents/code-reviewer.md +2 -0
  11. package/presets/claude/android-kotlin/agents/debugger.md +1 -0
  12. package/presets/claude/android-kotlin/agents/feature-developer.md +3 -0
  13. package/presets/claude/android-kotlin/agents/qa-tester.md +2 -0
  14. package/presets/claude/android-kotlin/agents/task-router.md +4 -0
  15. package/presets/claude/android-kotlin/hooks/chain-team-phases.sh +51 -11
  16. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  17. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-twin-sync.md +17 -1
  18. package/presets/claude/go/agents/build-verifier.md +4 -0
  19. package/presets/claude/go/agents/code-reviewer.md +4 -0
  20. package/presets/claude/go/agents/debugger.md +4 -0
  21. package/presets/claude/go/agents/feature-developer.md +5 -0
  22. package/presets/claude/go/agents/qa-tester.md +4 -0
  23. package/presets/claude/go/agents/task-router.md +4 -0
  24. package/presets/claude/go/hooks/chain-team-phases.sh +51 -11
  25. package/presets/claude/go/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  26. package/presets/claude/go/rules/tooling-and-review/preset-twin-sync.md +17 -1
  27. package/presets/claude/ios-swift/agents/build-verifier.md +2 -0
  28. package/presets/claude/ios-swift/agents/code-reviewer.md +2 -0
  29. package/presets/claude/ios-swift/agents/debugger.md +1 -0
  30. package/presets/claude/ios-swift/agents/feature-developer.md +3 -0
  31. package/presets/claude/ios-swift/agents/qa-tester.md +2 -0
  32. package/presets/claude/ios-swift/agents/task-router.md +4 -0
  33. package/presets/claude/ios-swift/hooks/chain-team-phases.sh +51 -11
  34. package/presets/claude/ios-swift/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  35. package/presets/claude/ios-swift/rules/tooling-and-review/preset-twin-sync.md +17 -1
  36. package/presets/claude/java/agents/build-verifier.md +4 -0
  37. package/presets/claude/java/agents/code-reviewer.md +4 -0
  38. package/presets/claude/java/agents/debugger.md +4 -0
  39. package/presets/claude/java/agents/feature-developer.md +5 -0
  40. package/presets/claude/java/agents/qa-tester.md +4 -0
  41. package/presets/claude/java/agents/task-router.md +4 -0
  42. package/presets/claude/java/hooks/chain-team-phases.sh +51 -11
  43. package/presets/claude/java/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  44. package/presets/claude/java/rules/tooling-and-review/preset-twin-sync.md +17 -1
  45. package/presets/claude/mcp-ts/agents/build-verifier.md +4 -0
  46. package/presets/claude/mcp-ts/agents/feature-developer.md +5 -0
  47. package/presets/claude/mcp-ts/agents/task-router.md +1 -1
  48. package/presets/claude/mcp-ts/hooks/chain-team-phases.sh +51 -11
  49. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  50. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-twin-sync.md +17 -1
  51. package/presets/claude/next/agents/build-verifier.md +2 -0
  52. package/presets/claude/next/agents/code-reviewer.md +2 -0
  53. package/presets/claude/next/agents/debugger.md +4 -0
  54. package/presets/claude/next/agents/feature-developer.md +3 -0
  55. package/presets/claude/next/agents/qa-tester.md +4 -0
  56. package/presets/claude/next/agents/unit-test-generator.md +1 -1
  57. package/presets/claude/next/agents/unit-test-planner.md +1 -1
  58. package/presets/claude/next/hooks/chain-team-phases.sh +51 -11
  59. package/presets/claude/next/rules/api-and-data/http-client.md +1 -1
  60. package/presets/claude/next/rules/architecture/reference-features.md +1 -1
  61. package/presets/claude/next/rules/testing/README.md +1 -1
  62. package/presets/claude/next/rules/testing/tests-e2e-structure.md +2 -0
  63. package/presets/claude/next/rules/testing/tests-unit.md +3 -5
  64. package/presets/claude/next/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  65. package/presets/claude/next/rules/tooling-and-review/preset-twin-sync.md +17 -1
  66. package/presets/claude/next/rules/ui-and-accessibility/react-ui.md +1 -1
  67. package/presets/claude/next/skills/playwright-e2e/SKILL.md +5 -3
  68. package/presets/claude/next/skills/unit-testing/SKILL.md +6 -4
  69. package/presets/claude/nuxt/agents/build-verifier.md +2 -0
  70. package/presets/claude/nuxt/agents/code-reviewer.md +2 -0
  71. package/presets/claude/nuxt/agents/debugger.md +4 -0
  72. package/presets/claude/nuxt/agents/feature-developer.md +3 -0
  73. package/presets/claude/nuxt/agents/qa-tester.md +4 -0
  74. package/presets/claude/nuxt/hooks/chain-team-phases.sh +51 -11
  75. package/presets/claude/nuxt/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  76. package/presets/claude/nuxt/rules/tooling-and-review/preset-twin-sync.md +17 -1
  77. package/presets/claude/php-hexagonal/agents/build-verifier.md +4 -0
  78. package/presets/claude/php-hexagonal/agents/code-reviewer.md +4 -0
  79. package/presets/claude/php-hexagonal/agents/debugger.md +4 -0
  80. package/presets/claude/php-hexagonal/agents/feature-developer.md +5 -0
  81. package/presets/claude/php-hexagonal/agents/qa-tester.md +4 -0
  82. package/presets/claude/php-hexagonal/agents/task-router.md +4 -0
  83. package/presets/claude/php-hexagonal/hooks/chain-team-phases.sh +51 -11
  84. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  85. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-twin-sync.md +17 -1
  86. package/presets/claude/php-laravel/agents/build-verifier.md +4 -0
  87. package/presets/claude/php-laravel/agents/code-reviewer.md +4 -0
  88. package/presets/claude/php-laravel/agents/debugger.md +4 -0
  89. package/presets/claude/php-laravel/agents/feature-developer.md +5 -0
  90. package/presets/claude/php-laravel/agents/qa-tester.md +4 -0
  91. package/presets/claude/php-laravel/agents/task-router.md +1 -0
  92. package/presets/claude/php-laravel/hooks/chain-team-phases.sh +51 -11
  93. package/presets/claude/php-laravel/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  94. package/presets/claude/php-laravel/rules/tooling-and-review/preset-twin-sync.md +17 -1
  95. package/presets/claude/svelte/agents/build-verifier.md +2 -0
  96. package/presets/claude/svelte/agents/code-reviewer.md +2 -0
  97. package/presets/claude/svelte/agents/debugger.md +4 -0
  98. package/presets/claude/svelte/agents/feature-developer.md +3 -0
  99. package/presets/claude/svelte/agents/qa-tester.md +4 -0
  100. package/presets/claude/svelte/hooks/chain-team-phases.sh +51 -11
  101. package/presets/claude/svelte/rules/tooling-and-review/preset-pr-checklist.md +1 -0
  102. package/presets/claude/svelte/rules/tooling-and-review/preset-twin-sync.md +17 -1
  103. package/presets/cursor/android-kotlin/agents/build-verifier.md +2 -0
  104. package/presets/cursor/android-kotlin/agents/code-reviewer.md +2 -0
  105. package/presets/cursor/android-kotlin/agents/debugger.md +1 -0
  106. package/presets/cursor/android-kotlin/agents/feature-developer.md +3 -0
  107. package/presets/cursor/android-kotlin/agents/qa-tester.md +2 -0
  108. package/presets/cursor/android-kotlin/agents/task-router.md +4 -0
  109. package/presets/cursor/android-kotlin/hooks/chain-team-phases.sh +51 -11
  110. package/presets/cursor/android-kotlin/rules/preset-pr-checklist.mdc +1 -0
  111. package/presets/cursor/android-kotlin/rules/preset-twin-sync.mdc +17 -1
  112. package/presets/cursor/go/agents/build-verifier.md +4 -0
  113. package/presets/cursor/go/agents/code-reviewer.md +4 -0
  114. package/presets/cursor/go/agents/debugger.md +4 -0
  115. package/presets/cursor/go/agents/feature-developer.md +5 -0
  116. package/presets/cursor/go/agents/qa-tester.md +4 -0
  117. package/presets/cursor/go/agents/task-router.md +4 -0
  118. package/presets/cursor/go/hooks/chain-team-phases.sh +51 -11
  119. package/presets/cursor/go/rules/preset-pr-checklist.mdc +1 -0
  120. package/presets/cursor/go/rules/preset-twin-sync.mdc +17 -1
  121. package/presets/cursor/ios-swift/agents/build-verifier.md +2 -0
  122. package/presets/cursor/ios-swift/agents/code-reviewer.md +2 -0
  123. package/presets/cursor/ios-swift/agents/debugger.md +1 -0
  124. package/presets/cursor/ios-swift/agents/feature-developer.md +3 -0
  125. package/presets/cursor/ios-swift/agents/qa-tester.md +2 -0
  126. package/presets/cursor/ios-swift/agents/task-router.md +4 -0
  127. package/presets/cursor/ios-swift/hooks/chain-team-phases.sh +51 -11
  128. package/presets/cursor/ios-swift/rules/preset-pr-checklist.mdc +1 -0
  129. package/presets/cursor/ios-swift/rules/preset-twin-sync.mdc +17 -1
  130. package/presets/cursor/java/agents/build-verifier.md +4 -0
  131. package/presets/cursor/java/agents/code-reviewer.md +4 -0
  132. package/presets/cursor/java/agents/debugger.md +4 -0
  133. package/presets/cursor/java/agents/feature-developer.md +5 -0
  134. package/presets/cursor/java/agents/qa-tester.md +4 -0
  135. package/presets/cursor/java/agents/task-router.md +4 -0
  136. package/presets/cursor/java/hooks/chain-team-phases.sh +51 -11
  137. package/presets/cursor/java/rules/preset-pr-checklist.mdc +1 -0
  138. package/presets/cursor/java/rules/preset-twin-sync.mdc +17 -1
  139. package/presets/cursor/mcp-ts/agents/build-verifier.md +4 -0
  140. package/presets/cursor/mcp-ts/agents/feature-developer.md +5 -0
  141. package/presets/cursor/mcp-ts/agents/task-router.md +1 -1
  142. package/presets/cursor/mcp-ts/hooks/chain-team-phases.sh +51 -11
  143. package/presets/cursor/mcp-ts/rules/preset-pr-checklist.mdc +1 -0
  144. package/presets/cursor/mcp-ts/rules/preset-twin-sync.mdc +17 -1
  145. package/presets/cursor/next/agents/build-verifier.md +2 -0
  146. package/presets/cursor/next/agents/code-reviewer.md +2 -0
  147. package/presets/cursor/next/agents/debugger.md +4 -0
  148. package/presets/cursor/next/agents/feature-developer.md +3 -0
  149. package/presets/cursor/next/agents/qa-tester.md +4 -0
  150. package/presets/cursor/next/agents/unit-test-generator.md +1 -1
  151. package/presets/cursor/next/agents/unit-test-planner.md +1 -1
  152. package/presets/cursor/next/hooks/chain-team-phases.sh +51 -11
  153. package/presets/cursor/next/rules/http-client.mdc +1 -1
  154. package/presets/cursor/next/rules/preset-pr-checklist.mdc +1 -0
  155. package/presets/cursor/next/rules/preset-twin-sync.mdc +17 -1
  156. package/presets/cursor/next/rules/react-ui.mdc +1 -1
  157. package/presets/cursor/next/rules/reference-features.mdc +1 -1
  158. package/presets/cursor/next/rules/tests-e2e-structure.mdc +2 -0
  159. package/presets/cursor/next/rules/tests-unit.mdc +3 -5
  160. package/presets/cursor/next/skills/playwright-e2e/SKILL.md +5 -3
  161. package/presets/cursor/next/skills/unit-testing/SKILL.md +6 -4
  162. package/presets/cursor/nuxt/agents/build-verifier.md +2 -0
  163. package/presets/cursor/nuxt/agents/code-reviewer.md +2 -0
  164. package/presets/cursor/nuxt/agents/debugger.md +4 -0
  165. package/presets/cursor/nuxt/agents/feature-developer.md +3 -0
  166. package/presets/cursor/nuxt/agents/qa-tester.md +4 -0
  167. package/presets/cursor/nuxt/hooks/chain-team-phases.sh +51 -11
  168. package/presets/cursor/nuxt/rules/preset-pr-checklist.mdc +1 -0
  169. package/presets/cursor/nuxt/rules/preset-twin-sync.mdc +17 -1
  170. package/presets/cursor/php-hexagonal/agents/build-verifier.md +4 -0
  171. package/presets/cursor/php-hexagonal/agents/code-reviewer.md +4 -0
  172. package/presets/cursor/php-hexagonal/agents/debugger.md +4 -0
  173. package/presets/cursor/php-hexagonal/agents/feature-developer.md +5 -0
  174. package/presets/cursor/php-hexagonal/agents/qa-tester.md +4 -0
  175. package/presets/cursor/php-hexagonal/agents/task-router.md +4 -0
  176. package/presets/cursor/php-hexagonal/hooks/chain-team-phases.sh +51 -11
  177. package/presets/cursor/php-hexagonal/rules/preset-pr-checklist.mdc +1 -0
  178. package/presets/cursor/php-hexagonal/rules/preset-twin-sync.mdc +17 -1
  179. package/presets/cursor/php-laravel/agents/build-verifier.md +4 -0
  180. package/presets/cursor/php-laravel/agents/code-reviewer.md +4 -0
  181. package/presets/cursor/php-laravel/agents/debugger.md +4 -0
  182. package/presets/cursor/php-laravel/agents/feature-developer.md +5 -0
  183. package/presets/cursor/php-laravel/agents/qa-tester.md +4 -0
  184. package/presets/cursor/php-laravel/agents/task-router.md +1 -0
  185. package/presets/cursor/php-laravel/hooks/chain-team-phases.sh +51 -11
  186. package/presets/cursor/php-laravel/rules/preset-pr-checklist.mdc +1 -0
  187. package/presets/cursor/php-laravel/rules/preset-twin-sync.mdc +17 -1
  188. package/presets/cursor/svelte/agents/build-verifier.md +2 -0
  189. package/presets/cursor/svelte/agents/code-reviewer.md +2 -0
  190. package/presets/cursor/svelte/agents/debugger.md +4 -0
  191. package/presets/cursor/svelte/agents/feature-developer.md +3 -0
  192. package/presets/cursor/svelte/agents/qa-tester.md +4 -0
  193. package/presets/cursor/svelte/hooks/chain-team-phases.sh +51 -11
  194. package/presets/cursor/svelte/rules/preset-pr-checklist.mdc +1 -0
  195. package/presets/cursor/svelte/rules/preset-twin-sync.mdc +17 -1
  196. package/presets/mavis/README.md +60 -0
  197. package/presets/mavis/next/MAVIS.md +67 -0
  198. package/presets/mavis/next/MCP.md +36 -0
  199. package/presets/mavis/next/README.md +15 -0
  200. package/presets/mavis/next/REPO_AGENTS.md +94 -0
  201. package/presets/mavis/next/adapter-map.json +959 -0
  202. package/presets/mavis/next/agents/README.md +206 -0
  203. package/presets/mavis/next/agents/accessibility-reviewer.md +61 -0
  204. package/presets/mavis/next/agents/api-contract-reviewer.md +57 -0
  205. package/presets/mavis/next/agents/build-verifier.md +110 -0
  206. package/presets/mavis/next/agents/ci-investigator.md +63 -0
  207. package/presets/mavis/next/agents/code-reviewer.md +61 -0
  208. package/presets/mavis/next/agents/codebase-analyzer.md +21 -0
  209. package/presets/mavis/next/agents/debugger.md +80 -0
  210. package/presets/mavis/next/agents/feature-developer.md +101 -0
  211. package/presets/mavis/next/agents/migration-specialist.md +67 -0
  212. package/presets/mavis/next/agents/mockup-reviewer.md +53 -0
  213. package/presets/mavis/next/agents/openspec-author.md +157 -0
  214. package/presets/mavis/next/agents/performance-auditor.md +68 -0
  215. package/presets/mavis/next/agents/playwright-test-generator.md +28 -0
  216. package/presets/mavis/next/agents/playwright-test-healer.md +28 -0
  217. package/presets/mavis/next/agents/playwright-test-planner.md +21 -0
  218. package/presets/mavis/next/agents/qa-tester.md +52 -0
  219. package/presets/mavis/next/agents/security-reviewer.md +54 -0
  220. package/presets/mavis/next/agents/solution-architect.md +68 -0
  221. package/presets/mavis/next/agents/task-analyst.md +166 -0
  222. package/presets/mavis/next/agents/task-router.md +178 -0
  223. package/presets/mavis/next/agents/tech-writer.md +57 -0
  224. package/presets/mavis/next/agents/unit-test-generator.md +31 -0
  225. package/presets/mavis/next/agents/unit-test-healer.md +32 -0
  226. package/presets/mavis/next/agents/unit-test-planner.md +54 -0
  227. package/presets/mavis/next/commands/README.md +49 -0
  228. package/presets/mavis/next/commands/spec-start.md +24 -0
  229. package/presets/mavis/next/commands/task-continue.md +50 -0
  230. package/presets/mavis/next/commands/task.md +50 -0
  231. package/presets/mavis/next/commands/technical-retro.md +80 -0
  232. package/presets/mavis/next/hooks/README.md +22 -0
  233. package/presets/mavis/next/hooks/chain-team-phases.sh +845 -0
  234. package/presets/mavis/next/mcp.json +19 -0
  235. package/presets/mavis/next/rules/README.md +16 -0
  236. package/presets/mavis/next/rules/agent-team-intake.md +11 -0
  237. package/presets/mavis/next/rules/agent-team-orchestrator.md +210 -0
  238. package/presets/mavis/next/rules/ai-local-overlay.md +37 -0
  239. package/presets/mavis/next/rules/anti-sycophancy-discipline.md +23 -0
  240. package/presets/mavis/next/rules/api-services.md +72 -0
  241. package/presets/mavis/next/rules/architecture-boundaries-ui.md +9 -0
  242. package/presets/mavis/next/rules/architecture-boundaries.md +86 -0
  243. package/presets/mavis/next/rules/arrow-functions.md +25 -0
  244. package/presets/mavis/next/rules/code-quality-and-refactoring.md +40 -0
  245. package/presets/mavis/next/rules/code-review-mr.md +40 -0
  246. package/presets/mavis/next/rules/css-property-order-stylelint.md +5 -0
  247. package/presets/mavis/next/rules/design-guidance.md +99 -0
  248. package/presets/mavis/next/rules/feature-delivery-workflow.md +49 -0
  249. package/presets/mavis/next/rules/http-client.md +55 -0
  250. package/presets/mavis/next/rules/layer-barrel-exports.md +68 -0
  251. package/presets/mavis/next/rules/mcp-usage.md +86 -0
  252. package/presets/mavis/next/rules/mockup-review.md +107 -0
  253. package/presets/mavis/next/rules/navigation-router-stack.md +56 -0
  254. package/presets/mavis/next/rules/navigation-router-ui.md +10 -0
  255. package/presets/mavis/next/rules/next-app-core.md +29 -0
  256. package/presets/mavis/next/rules/next-app-router.md +44 -0
  257. package/presets/mavis/next/rules/no-props-spread.md +56 -0
  258. package/presets/mavis/next/rules/no-type-assertion-as-import-export.md +51 -0
  259. package/presets/mavis/next/rules/package-manager.md +11 -0
  260. package/presets/mavis/next/rules/playwright-agents.md +67 -0
  261. package/presets/mavis/next/rules/post-change-lint.md +35 -0
  262. package/presets/mavis/next/rules/preset-layering.md +27 -0
  263. package/presets/mavis/next/rules/preset-no-cross-stack-leakage.md +90 -0
  264. package/presets/mavis/next/rules/preset-pr-checklist.md +35 -0
  265. package/presets/mavis/next/rules/preset-token-budget.md +36 -0
  266. package/presets/mavis/next/rules/preset-twin-sync.md +65 -0
  267. package/presets/mavis/next/rules/product-specs-authoring.md +112 -0
  268. package/presets/mavis/next/rules/product-specs.md +56 -0
  269. package/presets/mavis/next/rules/public-imports.md +50 -0
  270. package/presets/mavis/next/rules/react-a11y-coding.md +31 -0
  271. package/presets/mavis/next/rules/react-next-anti-hallucination.md +60 -0
  272. package/presets/mavis/next/rules/react-ui.md +105 -0
  273. package/presets/mavis/next/rules/reference-features.md +45 -0
  274. package/presets/mavis/next/rules/security-next.md +45 -0
  275. package/presets/mavis/next/rules/store-rtk.md +78 -0
  276. package/presets/mavis/next/rules/technical-retro.md +11 -0
  277. package/presets/mavis/next/rules/tests-e2e-structure.md +72 -0
  278. package/presets/mavis/next/rules/tests-unit.md +72 -0
  279. package/presets/mavis/next/rules/types-jsdoc.md +43 -0
  280. package/presets/mavis/next/rules/ux-design.md +99 -0
  281. package/presets/mavis/next/skills/README.md +21 -0
  282. package/presets/mavis/next/skills/ci-investigation/SKILL.md +39 -0
  283. package/presets/mavis/next/skills/code-review/SKILL.md +39 -0
  284. package/presets/mavis/next/skills/debug-investigation/SKILL.md +26 -0
  285. package/presets/mavis/next/skills/feature-delivery/SKILL.md +34 -0
  286. package/presets/mavis/next/skills/mockup-review/SKILL.md +24 -0
  287. package/presets/mavis/next/skills/playwright-e2e/SKILL.md +28 -0
  288. package/presets/mavis/next/skills/react-performance/SKILL.md +39 -0
  289. package/presets/mavis/next/skills/spec-authoring/SKILL.md +21 -0
  290. package/presets/mavis/next/skills/spec-discovery/SKILL.md +53 -0
  291. package/presets/mavis/next/skills/technical-retro/SKILL.md +49 -0
  292. package/presets/mavis/next/skills/unit-testing/SKILL.md +29 -0
  293. package/presets/mavis/next/skills/ux-design/SKILL.md +31 -0
  294. package/presets/mavis/next/skills/write-adr/SKILL.md +36 -0
  295. package/presets/mavis/next/team/README.md +148 -0
  296. package/presets/mavis/next/team/conventions.md +21 -0
  297. package/presets/mavis/next/team/fixtures/artifact-manifest.example.json +79 -0
  298. package/presets/mavis/next/team/fixtures/bugfix-standard.json +25 -0
  299. package/presets/mavis/next/team/fixtures/feature-full.json +29 -0
  300. package/presets/mavis/next/team/fixtures/feature-light.json +27 -0
  301. package/presets/mavis/next/team/fixtures/feature-with-figma-url.json +17 -0
  302. package/presets/mavis/next/team/fixtures/feature-with-ux-no-figma.json +17 -0
  303. package/presets/mavis/next/team/fixtures/memlog.example.md +9 -0
  304. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/human-gate/metrics.json +69 -0
  305. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/missing-ledger/status.json +5 -0
  306. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/parallel-receipts/metrics.json +79 -0
  307. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/serial-retry/metrics.json +124 -0
  308. package/presets/mavis/next/team/fixtures/metrics-scenarios/tasks/validation-failed/metrics.json +124 -0
  309. package/presets/mavis/next/team/fixtures/metrics.example.json +54 -0
  310. package/presets/mavis/next/team/fixtures/mockup-review-fail-embedded-status.json +8 -0
  311. package/presets/mavis/next/team/fixtures/mockup-review-standalone.json +14 -0
  312. package/presets/mavis/next/team/fixtures/ux-design-standalone.json +15 -0
  313. package/presets/mavis/next/team/tasks/.gitkeep +0 -0
  314. package/presets/mavis/platform-contract.json +131 -0
  315. package/scripts/capture-cli-golden.mjs +44 -0
  316. package/scripts/check-chain-hook-coverage.sh +1 -0
  317. package/scripts/check-mavis-adapter-map.mjs +294 -0
  318. package/scripts/check-mavis-local-overlay.mjs +56 -0
  319. package/scripts/check-mavis-platform-contract.mjs +388 -0
  320. package/scripts/check-mavis-token-budget.mjs +48 -0
  321. package/scripts/check-preset-leakage.sh +35 -3
  322. package/scripts/check-preset-structure.sh +73 -0
  323. package/scripts/check-preset-token-budget.sh +100 -0
  324. package/scripts/check-shared-core-drift.sh +18 -0
  325. package/scripts/check-task-router-intents.sh +154 -0
  326. package/scripts/fixtures/cli-golden/claude/next.json +130 -0
  327. package/scripts/fixtures/cli-golden/cursor/next.json +132 -0
  328. package/scripts/fixtures/cli-golden/mavis/next.json +125 -0
  329. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/AGENTS.md +1 -0
  330. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/rules/extra.mdc +1 -0
  331. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/cursor/rules/sample.mdc +2 -0
  332. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/MAVIS.md +1 -0
  333. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/adapter-map.json +26 -0
  334. package/scripts/fixtures/mavis-adapter-map/invalid-unmapped/mavis/rules/sample.md +2 -0
  335. package/scripts/fixtures/mavis-adapter-map/valid/cursor/AGENTS.md +1 -0
  336. package/scripts/fixtures/mavis-adapter-map/valid/cursor/rules/sample.mdc +2 -0
  337. package/scripts/fixtures/mavis-adapter-map/valid/mavis/MAVIS.md +1 -0
  338. package/scripts/fixtures/mavis-adapter-map/valid/mavis/adapter-map.json +26 -0
  339. package/scripts/fixtures/mavis-adapter-map/valid/mavis/rules/sample.md +2 -0
  340. package/scripts/fixtures/mavis-platform-contract/invalid-minimax-destination.json +131 -0
  341. package/scripts/fixtures/mavis-platform-contract/invalid-missing-capability.json +126 -0
  342. package/scripts/fixtures/mavis-platform-contract/invalid-released-unknown-stack.json +133 -0
  343. package/scripts/fixtures/mavis-platform-contract/invalid-unknown-native-path.json +131 -0
  344. package/scripts/fixtures/mavis-platform-contract/invalid-version-pin.json +132 -0
  345. package/scripts/fixtures/mavis-platform-contract/valid.json +131 -0
  346. package/scripts/fixtures/mavis-probe/AGENTS.md +6 -0
  347. package/scripts/fixtures/mavis-probe/agents/probe-agent.md +6 -0
  348. package/scripts/fixtures/mavis-probe/fake-mcode.mjs +98 -0
  349. package/scripts/fixtures/mavis-probe/output.schema.json +28 -0
  350. package/scripts/fixtures/mavis-probe/rules/probe.md +5 -0
  351. package/scripts/fixtures/mavis-probe/skills/probe/SKILL.md +11 -0
  352. package/scripts/generate-mavis-next.mjs +704 -0
  353. package/scripts/lib/cli-golden.mjs +50 -0
  354. package/scripts/lib/discover-hooks.mjs +72 -0
  355. package/scripts/probe-mavis-capabilities.mjs +480 -0
  356. package/scripts/test-agent-task-metrics-hooks.mjs +120 -16
  357. package/scripts/test-chain-team-phases-coverage.mjs +110 -8
  358. package/scripts/test-cli-init-clean.mjs +256 -0
  359. package/scripts/test-cli-mcp-merge.mjs +23 -0
  360. package/scripts/test-mavis-context-budget.mjs +55 -0
  361. package/scripts/test-mavis-orchestration.mjs +649 -0
  362. package/scripts/test-probe-mavis-capabilities.mjs +205 -0
  363. package/scripts/test-task-router-intents-fixtures.mjs +109 -0
@@ -0,0 +1,205 @@
1
+ #!/usr/bin/env node
2
+ import assert from 'node:assert/strict';
3
+ import { execFileSync } from 'node:child_process';
4
+ import fs from 'node:fs';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const scriptDirectory = path.dirname(fileURLToPath(import.meta.url));
10
+ const probeScript = path.join(scriptDirectory, 'probe-mavis-capabilities.mjs');
11
+ const fixtureDirectory = path.join(scriptDirectory, 'fixtures', 'mavis-probe');
12
+ const fakeMcodeSource = path.join(fixtureDirectory, 'fake-mcode.mjs');
13
+
14
+ assert.equal(fs.existsSync(probeScript), true, 'probe script must exist');
15
+
16
+ function installFakeMcode(tempRoot) {
17
+ const fakeMcode = path.join(tempRoot, 'mcode');
18
+ fs.copyFileSync(fakeMcodeSource, fakeMcode);
19
+ fs.chmodSync(fakeMcode, 0o755);
20
+ return fakeMcode;
21
+ }
22
+
23
+ function runProbe({ mcode, workdir, home, mode }) {
24
+ try {
25
+ const stdout = execFileSync(
26
+ process.execPath,
27
+ [probeScript, '--mcode', mcode, '--workdir', workdir],
28
+ {
29
+ encoding: 'utf8',
30
+ env: {
31
+ ...process.env,
32
+ HOME: home,
33
+ FAKE_MCODE_MODE: mode ?? 'supported',
34
+ },
35
+ },
36
+ );
37
+ return { exitCode: 0, evidence: JSON.parse(stdout) };
38
+ } catch (error) {
39
+ return {
40
+ exitCode: error.status ?? 1,
41
+ evidence: JSON.parse(error.stdout),
42
+ };
43
+ }
44
+ }
45
+
46
+ function assertCapabilityShape(capability) {
47
+ assert.match(capability.status, /^(confirmed|partial|unknown|no-equivalent)$/);
48
+ assert.ok(Object.hasOwn(capability, 'command'));
49
+ assert.ok(Object.hasOwn(capability, 'exitCode'));
50
+ assert.ok(Object.hasOwn(capability, 'executed'));
51
+ assert.equal(typeof capability.observation, 'string');
52
+ }
53
+
54
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'mavis-probe-test-'));
55
+
56
+ try {
57
+ const home = path.join(tempRoot, 'home');
58
+ fs.mkdirSync(home);
59
+ const fakeMcode = installFakeMcode(tempRoot);
60
+
61
+ const freshWorkdir = path.join(tempRoot, 'fresh-workdir');
62
+ const fresh = runProbe({ mcode: fakeMcode, workdir: freshWorkdir, home });
63
+ assert.equal(fresh.exitCode, 0);
64
+ assert.equal(fresh.evidence.schemaVersion, 1);
65
+ assert.equal(fresh.evidence.probeStatus, 'completed');
66
+ assert.deepEqual(fresh.evidence.cli, {
67
+ executable: '<MCODE>',
68
+ version: 'mcode 9.8.7',
69
+ });
70
+ assert.ok(fresh.evidence.os.platform);
71
+ assert.ok(fresh.evidence.os.release);
72
+ assert.ok(fresh.evidence.os.arch);
73
+ assert.equal(fresh.evidence.workdir, '<WORKDIR>');
74
+
75
+ const requiredCapabilities = [
76
+ 'cliVersion',
77
+ 'cliHelp',
78
+ 'freshInit',
79
+ 'rootAgents',
80
+ 'referencedRule',
81
+ 'referencedSkill',
82
+ 'explicitAgentFile',
83
+ 'structuredOutput',
84
+ 'nativeProjectRules',
85
+ 'nativeWorkspaceSkills',
86
+ 'nativeWorkspaceAgents',
87
+ 'projectMcp',
88
+ 'projectHooks',
89
+ 'slashCommands',
90
+ 'pluginSkillMcp',
91
+ 'nativeTeam',
92
+ ];
93
+ assert.deepEqual(Object.keys(fresh.evidence.capabilities), requiredCapabilities);
94
+ for (const capability of Object.values(fresh.evidence.capabilities)) {
95
+ assertCapabilityShape(capability);
96
+ }
97
+
98
+ assert.equal(fresh.evidence.capabilities.rootAgents.status, 'confirmed');
99
+ assert.equal(fresh.evidence.capabilities.referencedRule.status, 'confirmed');
100
+ assert.equal(fresh.evidence.capabilities.referencedSkill.status, 'confirmed');
101
+ assert.equal(fresh.evidence.capabilities.explicitAgentFile.status, 'confirmed');
102
+ assert.equal(fresh.evidence.capabilities.structuredOutput.status, 'confirmed');
103
+ assert.equal(fresh.evidence.capabilities.nativeProjectRules.status, 'unknown');
104
+ assert.equal(fresh.evidence.capabilities.nativeWorkspaceSkills.status, 'unknown');
105
+ assert.equal(fresh.evidence.capabilities.nativeWorkspaceAgents.status, 'unknown');
106
+ assert.equal(fresh.evidence.capabilities.nativeProjectRules.executed, true);
107
+ assert.equal(fresh.evidence.capabilities.nativeWorkspaceSkills.executed, true);
108
+ assert.equal(fresh.evidence.capabilities.nativeWorkspaceAgents.executed, true);
109
+ assert.deepEqual(
110
+ fresh.evidence.capabilities.explicitAgentFile.command.slice(0, 3),
111
+ ['<MCODE>', 'exec', '--cwd'],
112
+ );
113
+ assert.ok(fresh.evidence.capabilities.explicitAgentFile.command.includes('--file'));
114
+ assert.ok(fresh.evidence.capabilities.structuredOutput.command.includes('--output-format'));
115
+ assert.ok(fresh.evidence.capabilities.structuredOutput.command.includes('--permission'));
116
+ assert.ok(fresh.evidence.capabilities.structuredOutput.command.includes('off'));
117
+ assert.ok(fresh.evidence.capabilities.structuredOutput.command.includes('--timeout'));
118
+ assert.deepEqual(fresh.evidence.authSeed, { seeded: false, entries: [] });
119
+ assert.equal(fresh.evidence.capabilities.projectMcp.status, 'unknown');
120
+ assert.equal(fresh.evidence.capabilities.projectMcp.exitCode, null);
121
+ assert.equal(fresh.evidence.capabilities.projectMcp.executed, false);
122
+ assert.match(fresh.evidence.capabilities.projectMcp.observation, /not executed/i);
123
+ assert.equal(fresh.evidence.capabilities.projectHooks.status, 'unknown');
124
+ assert.equal(fresh.evidence.capabilities.slashCommands.status, 'unknown');
125
+ assert.equal(fresh.evidence.capabilities.pluginSkillMcp.status, 'confirmed');
126
+ assert.equal(fresh.evidence.capabilities.pluginSkillMcp.executed, false);
127
+ assert.equal(fresh.evidence.capabilities.nativeTeam.status, 'partial');
128
+ assert.equal(fresh.evidence.capabilities.nativeTeam.executed, false);
129
+
130
+ assert.equal(fs.existsSync(path.join(freshWorkdir, 'AGENTS.md')), true);
131
+ assert.equal(fs.existsSync(path.join(freshWorkdir, 'rules', 'probe.md')), true);
132
+ assert.equal(fs.existsSync(path.join(freshWorkdir, 'agents', 'probe-agent.md')), true);
133
+ assert.equal(fs.existsSync(path.join(freshWorkdir, 'skills', 'probe', 'SKILL.md')), true);
134
+ assert.equal(fs.existsSync(path.join(freshWorkdir, 'output.schema.json')), true);
135
+ assert.equal(fs.existsSync(path.join(home, '.minimax')), false);
136
+
137
+ const serialized = JSON.stringify(fresh.evidence);
138
+ assert.doesNotMatch(serialized, /fixture-secret|fake-secret/);
139
+ assert.doesNotMatch(serialized, /\/Users\/tester/);
140
+ assert.doesNotMatch(serialized, new RegExp(tempRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
141
+ assert.doesNotMatch(serialized, /mavis-probe-home-/);
142
+ assert.doesNotMatch(serialized, /<PROBE_HOME>/);
143
+ assert.match(serialized, /<REDACTED>|<HOME>/);
144
+
145
+ const emptyWorkdir = path.join(tempRoot, 'empty-workdir');
146
+ fs.mkdirSync(emptyWorkdir);
147
+ const empty = runProbe({ mcode: fakeMcode, workdir: emptyWorkdir, home });
148
+ assert.equal(empty.exitCode, 0);
149
+ assert.deepEqual(empty.evidence, fresh.evidence);
150
+ assert.equal(fs.existsSync(path.join(home, '.minimax')), false);
151
+
152
+ const nonemptyWorkdir = path.join(tempRoot, 'nonempty-workdir');
153
+ fs.mkdirSync(nonemptyWorkdir);
154
+ fs.writeFileSync(path.join(nonemptyWorkdir, 'keep.txt'), 'preserve-me');
155
+ const nonempty = runProbe({ mcode: fakeMcode, workdir: nonemptyWorkdir, home });
156
+ assert.equal(nonempty.exitCode, 2);
157
+ assert.equal(nonempty.evidence.probeStatus, 'blocked');
158
+ assert.equal(nonempty.evidence.capabilities.cliVersion.executed, false);
159
+ assert.match(nonempty.evidence.capabilities.freshInit.observation, /empty/i);
160
+ assert.equal(fs.readFileSync(path.join(nonemptyWorkdir, 'keep.txt'), 'utf8'), 'preserve-me');
161
+ assert.equal(fs.existsSync(path.join(home, '.minimax')), false);
162
+
163
+ const seededHome = path.join(tempRoot, 'seeded-home');
164
+ fs.mkdirSync(path.join(seededHome, '.minimax', 'cli-auth'), { recursive: true });
165
+ fs.writeFileSync(path.join(seededHome, '.minimax', 'cli-auth', 'session'), 'seed-only');
166
+ fs.writeFileSync(path.join(seededHome, '.minimax', 'config.yaml'), 'region: test\n');
167
+ const seeded = runProbe({
168
+ mcode: fakeMcode,
169
+ workdir: path.join(tempRoot, 'seeded-workdir'),
170
+ home: seededHome,
171
+ });
172
+ assert.equal(seeded.exitCode, 0);
173
+ assert.equal(seeded.evidence.authSeed.seeded, true);
174
+ assert.deepEqual(seeded.evidence.authSeed.entries, ['cli-auth', 'config.yaml']);
175
+ assert.equal(fs.existsSync(path.join(seededHome, '.minimax', 'probe-touch')), false);
176
+
177
+ const missing = runProbe({
178
+ mcode: path.join(tempRoot, 'missing-mcode'),
179
+ workdir: path.join(tempRoot, 'missing-executable-workdir'),
180
+ home,
181
+ });
182
+ assert.equal(missing.exitCode, 2);
183
+ assert.equal(missing.evidence.probeStatus, 'blocked');
184
+ assert.equal(missing.evidence.cli.version, null);
185
+ assert.equal(missing.evidence.capabilities.cliVersion.status, 'unknown');
186
+ assert.match(missing.evidence.capabilities.cliVersion.observation, /not found/i);
187
+ assert.equal(fs.existsSync(path.join(home, '.minimax')), false);
188
+
189
+ const unsupported = runProbe({
190
+ mcode: fakeMcode,
191
+ workdir: path.join(tempRoot, 'unsupported-workdir'),
192
+ home,
193
+ mode: 'unsupported',
194
+ });
195
+ assert.equal(unsupported.exitCode, 2);
196
+ assert.equal(unsupported.evidence.probeStatus, 'blocked');
197
+ assert.equal(unsupported.evidence.cli.version, null);
198
+ assert.equal(unsupported.evidence.capabilities.cliVersion.exitCode, 64);
199
+ assert.match(unsupported.evidence.capabilities.cliVersion.observation, /unsupported/i);
200
+ assert.equal(fs.existsSync(path.join(home, '.minimax')), false);
201
+
202
+ console.log('test-probe-mavis-capabilities: ok');
203
+ } finally {
204
+ fs.rmSync(tempRoot, { recursive: true, force: true });
205
+ }
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ // Fixtures for check-task-router-intents.sh.
3
+ //
4
+ // Scenario: rename the frontmatter `name:` of an existing shipped agent
5
+ // (cursor/next/agents/build-verifier.md → `build-verifier-renamed`) and
6
+ // confirm the check FAILS. Then revert and confirm it PASSES.
7
+ //
8
+ // Why a separate fixture file: the check is a shell + Python script under
9
+ // `scripts/`, not an in-process module, so we exercise it end-to-end via
10
+ // `execFileSync` against a temp copy of `agents/` (mirroring the pattern in
11
+ // `test-chain-team-phases-coverage.mjs` and `test-cli-mcp-merge.mjs`).
12
+ //
13
+ // The fixture operates on a *copy* of `presets/cursor/next/agents/` so the
14
+ // real preset tree is never mutated, even on assertion failure.
15
+
16
+ import assert from 'node:assert/strict';
17
+ import { execFileSync } from 'node:child_process';
18
+ import fs from 'node:fs';
19
+ import os from 'node:os';
20
+ import path from 'node:path';
21
+ import { fileURLToPath } from 'node:url';
22
+
23
+ const scriptDirectory = path.dirname(fileURLToPath(import.meta.url));
24
+ const packageDirectory = path.resolve(scriptDirectory, '..');
25
+ const checkScript = path.join(scriptDirectory, 'check-task-router-intents.sh');
26
+
27
+ function runCheck(env) {
28
+ try {
29
+ return {
30
+ exitCode: 0,
31
+ stdout: execFileSync('bash', [checkScript], { env, encoding: 'utf8' }),
32
+ };
33
+ } catch (error) {
34
+ return {
35
+ exitCode: error.status ?? 1,
36
+ stdout: `${error.stdout ?? ''}${error.stderr ?? ''}`,
37
+ };
38
+ }
39
+ }
40
+
41
+ function copyAgentsDir(sourceAgentsDir) {
42
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'task-router-intents-'));
43
+ // Mirror full preset tree so the Python script's iteration works.
44
+ const sourcePresetsDir = path.join(packageDirectory, 'presets');
45
+ const targetPresetsDir = path.join(tempRoot, 'packages', 'ai-rules', 'presets');
46
+ fs.mkdirSync(targetPresetsDir, { recursive: true });
47
+ copyTree(sourcePresetsDir, targetPresetsDir);
48
+ return tempRoot;
49
+ }
50
+
51
+ function copyTree(source, destination) {
52
+ for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
53
+ const src = path.join(source, entry.name);
54
+ const dest = path.join(destination, entry.name);
55
+ if (entry.isDirectory()) {
56
+ fs.mkdirSync(dest, { recursive: true });
57
+ copyTree(src, dest);
58
+ } else if (entry.isFile()) {
59
+ fs.copyFileSync(src, dest);
60
+ }
61
+ }
62
+ }
63
+
64
+ function setEnvPresetRoot(tempRoot) {
65
+ return { ...process.env, AI_RULES_PRESETS_ROOT: path.join(tempRoot, 'packages', 'ai-rules', 'presets') };
66
+ }
67
+
68
+ // Test 1 — rename frontmatter `name:` and assert the script returns non-zero.
69
+ {
70
+ const tempRoot = copyAgentsDir(path.join(packageDirectory, 'presets', 'cursor', 'next', 'agents'));
71
+ try {
72
+ const agentFile = path.join(tempRoot, 'packages', 'ai-rules', 'presets', 'cursor', 'next', 'agents', 'build-verifier.md');
73
+ const original = fs.readFileSync(agentFile, 'utf8');
74
+ const renamed = original.replace(/^name:\s*build-verifier\s*$/m, 'name: build-verifier-renamed');
75
+ assert.notStrictEqual(renamed, original, 'rename pattern must match exactly one line');
76
+ fs.writeFileSync(agentFile, renamed);
77
+
78
+ const result = runCheck(setEnvPresetRoot(tempRoot));
79
+ assert.notStrictEqual(
80
+ result.exitCode,
81
+ 0,
82
+ `expected FAIL when name frontmatter does not match stem; got exit=${result.exitCode}\n${result.stdout}`,
83
+ );
84
+ assert.match(
85
+ result.stdout,
86
+ /task-router vs agents drift/,
87
+ 'expected drift failure message in output',
88
+ );
89
+ } finally {
90
+ fs.rmSync(tempRoot, { recursive: true, force: true });
91
+ }
92
+ }
93
+
94
+ // Test 2 — revert and assert the script returns zero.
95
+ {
96
+ const tempRoot = copyAgentsDir(path.join(packageDirectory, 'presets', 'cursor', 'next', 'agents'));
97
+ try {
98
+ const result = runCheck(setEnvPresetRoot(tempRoot));
99
+ assert.strictEqual(
100
+ result.exitCode,
101
+ 0,
102
+ `expected PASS on unmodified copy; got exit=${result.exitCode}\n${result.stdout}`,
103
+ );
104
+ } finally {
105
+ fs.rmSync(tempRoot, { recursive: true, force: true });
106
+ }
107
+ }
108
+
109
+ console.log('OK: check-task-router-intents.sh fixture tests passed');