@bonesofspring/ai-rules 0.2.20 → 0.2.21

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 (405) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +17 -2
  3. package/bin/cli.js +83 -6
  4. package/package.json +5 -2
  5. package/presets/_shared/README.md +2 -1
  6. package/presets/_shared/assets/docs-specs/INDEX.md +4 -1
  7. package/presets/_shared/core/agent-team/agent-artifact-contracts.md +13 -0
  8. package/presets/_shared/core/agent-team/agent-task-metrics.md +1 -1
  9. package/presets/_shared/core/agent-team/agent-team-orchestrator.md +1 -3
  10. package/presets/_shared/core/meta/preset-pr-checklist.md +5 -1
  11. package/presets/_shared/core/meta/preset-token-budget.md +7 -3
  12. package/presets/_shared/core/meta/preset-twin-sync.md +2 -0
  13. package/presets/_shared/core/testing/testing-principles.md +70 -0
  14. package/presets/claude/android-kotlin/agents/README.md +2 -1
  15. package/presets/claude/android-kotlin/agents/feature-developer.md +1 -1
  16. package/presets/claude/android-kotlin/agents/openspec-author.md +163 -0
  17. package/presets/claude/android-kotlin/agents/task-analyst.md +1 -1
  18. package/presets/claude/android-kotlin/agents/task-router.md +5 -1
  19. package/presets/claude/android-kotlin/agents/tech-writer.md +4 -0
  20. package/presets/claude/android-kotlin/commands/README.md +0 -2
  21. package/presets/claude/android-kotlin/commands/task-continue.md +1 -1
  22. package/presets/claude/android-kotlin/commands/task.md +1 -5
  23. package/presets/claude/android-kotlin/commands/technical-retro.md +2 -2
  24. package/presets/claude/android-kotlin/hooks/chain-team-phases.sh +54 -2
  25. package/presets/claude/android-kotlin/rules/README.md +1 -0
  26. package/presets/claude/android-kotlin/rules/tooling-and-review/agent-team-orchestrator.md +7 -4
  27. package/presets/claude/android-kotlin/rules/tooling-and-review/ai-local-overlay.md +48 -0
  28. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  29. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-token-budget.md +7 -3
  30. package/presets/claude/android-kotlin/rules/tooling-and-review/preset-twin-sync.md +2 -0
  31. package/presets/claude/go/README.md +1 -1
  32. package/presets/claude/go/agents/README.md +3 -2
  33. package/presets/claude/go/agents/openspec-author.md +163 -0
  34. package/presets/claude/go/agents/task-router.md +5 -1
  35. package/presets/claude/go/agents/tech-writer.md +4 -0
  36. package/presets/claude/go/commands/README.md +0 -2
  37. package/presets/claude/go/commands/task-continue.md +1 -1
  38. package/presets/claude/go/commands/task.md +1 -4
  39. package/presets/claude/go/hooks/chain-team-phases.sh +54 -3
  40. package/presets/claude/go/rules/README.md +1 -0
  41. package/presets/claude/go/rules/tooling-and-review/agent-team-orchestrator.md +2 -4
  42. package/presets/claude/go/rules/tooling-and-review/ai-local-overlay.md +48 -0
  43. package/presets/claude/go/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  44. package/presets/claude/go/rules/tooling-and-review/preset-token-budget.md +7 -3
  45. package/presets/claude/go/rules/tooling-and-review/preset-twin-sync.md +2 -0
  46. package/presets/claude/ios-swift/agents/README.md +3 -2
  47. package/presets/claude/ios-swift/agents/feature-developer.md +1 -1
  48. package/presets/claude/ios-swift/agents/openspec-author.md +163 -0
  49. package/presets/claude/ios-swift/agents/task-analyst.md +1 -1
  50. package/presets/claude/ios-swift/agents/task-router.md +5 -1
  51. package/presets/claude/ios-swift/agents/tech-writer.md +4 -0
  52. package/presets/claude/ios-swift/commands/README.md +0 -2
  53. package/presets/claude/ios-swift/commands/task-continue.md +1 -1
  54. package/presets/claude/ios-swift/commands/task.md +1 -5
  55. package/presets/claude/ios-swift/commands/technical-retro.md +2 -2
  56. package/presets/claude/ios-swift/hooks/chain-team-phases.sh +54 -2
  57. package/presets/claude/ios-swift/rules/README.md +1 -0
  58. package/presets/claude/ios-swift/rules/tooling-and-review/agent-team-orchestrator.md +7 -4
  59. package/presets/claude/ios-swift/rules/tooling-and-review/ai-local-overlay.md +48 -0
  60. package/presets/claude/ios-swift/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  61. package/presets/claude/ios-swift/rules/tooling-and-review/preset-token-budget.md +7 -3
  62. package/presets/claude/ios-swift/rules/tooling-and-review/preset-twin-sync.md +2 -0
  63. package/presets/claude/java/CLAUDE.md +1 -1
  64. package/presets/claude/java/agents/README.md +3 -2
  65. package/presets/claude/java/agents/openspec-author.md +163 -0
  66. package/presets/claude/java/agents/task-router.md +5 -1
  67. package/presets/claude/java/agents/tech-writer.md +4 -0
  68. package/presets/claude/java/commands/README.md +0 -2
  69. package/presets/claude/java/commands/task-continue.md +1 -1
  70. package/presets/claude/java/commands/task.md +1 -4
  71. package/presets/claude/java/hooks/chain-team-phases.sh +54 -3
  72. package/presets/claude/java/rules/README.md +1 -0
  73. package/presets/claude/java/rules/tooling-and-review/agent-team-orchestrator.md +2 -4
  74. package/presets/claude/java/rules/tooling-and-review/ai-local-overlay.md +48 -0
  75. package/presets/claude/java/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  76. package/presets/claude/java/rules/tooling-and-review/preset-token-budget.md +7 -3
  77. package/presets/claude/java/rules/tooling-and-review/preset-twin-sync.md +2 -0
  78. package/presets/claude/mcp-ts/agents/task-analyst.md +1 -1
  79. package/presets/claude/mcp-ts/commands/README.md +0 -2
  80. package/presets/claude/mcp-ts/commands/task-continue.md +1 -1
  81. package/presets/claude/mcp-ts/commands/task.md +1 -4
  82. package/presets/claude/mcp-ts/commands/technical-retro.md +2 -2
  83. package/presets/claude/mcp-ts/hooks/chain-team-phases.sh +40 -9
  84. package/presets/claude/mcp-ts/rules/README.md +1 -0
  85. package/presets/claude/mcp-ts/rules/tooling-and-review/agent-team-orchestrator.md +2 -4
  86. package/presets/claude/mcp-ts/rules/tooling-and-review/ai-local-overlay.md +48 -0
  87. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  88. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-token-budget.md +7 -3
  89. package/presets/claude/mcp-ts/rules/tooling-and-review/preset-twin-sync.md +2 -0
  90. package/presets/claude/next/README.md +1 -0
  91. package/presets/claude/next/agents/README.md +2 -2
  92. package/presets/claude/next/agents/build-verifier.md +11 -1
  93. package/presets/claude/next/agents/feature-developer.md +1 -1
  94. package/presets/claude/next/agents/openspec-author.md +163 -0
  95. package/presets/claude/next/agents/task-analyst.md +1 -1
  96. package/presets/claude/next/agents/task-router.md +5 -1
  97. package/presets/claude/next/agents/tech-writer.md +4 -0
  98. package/presets/claude/next/commands/README.md +0 -2
  99. package/presets/claude/next/commands/task-continue.md +1 -1
  100. package/presets/claude/next/commands/task.md +1 -4
  101. package/presets/claude/next/hooks/chain-team-phases.sh +54 -2
  102. package/presets/claude/next/rules/README.md +1 -0
  103. package/presets/claude/next/rules/testing/README.md +6 -0
  104. package/presets/claude/next/rules/testing/tests-e2e-structure.md +84 -48
  105. package/presets/claude/next/rules/testing/tests-unit.md +79 -50
  106. package/presets/claude/next/rules/tooling-and-review/agent-team-orchestrator.md +3 -4
  107. package/presets/claude/next/rules/tooling-and-review/ai-local-overlay.md +48 -0
  108. package/presets/claude/next/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  109. package/presets/claude/next/rules/tooling-and-review/preset-token-budget.md +7 -3
  110. package/presets/claude/next/rules/tooling-and-review/preset-twin-sync.md +2 -0
  111. package/presets/claude/next/team/README.md +0 -3
  112. package/presets/claude/nuxt/agents/README.md +1 -1
  113. package/presets/claude/nuxt/agents/feature-developer.md +1 -1
  114. package/presets/claude/nuxt/agents/openspec-author.md +163 -0
  115. package/presets/claude/nuxt/agents/task-analyst.md +1 -1
  116. package/presets/claude/nuxt/agents/task-router.md +5 -1
  117. package/presets/claude/nuxt/agents/tech-writer.md +4 -0
  118. package/presets/claude/nuxt/commands/README.md +0 -2
  119. package/presets/claude/nuxt/commands/task-continue.md +1 -1
  120. package/presets/claude/nuxt/commands/task.md +1 -5
  121. package/presets/claude/nuxt/commands/technical-retro.md +2 -2
  122. package/presets/claude/nuxt/hooks/chain-team-phases.sh +54 -2
  123. package/presets/claude/nuxt/rules/README.md +1 -0
  124. package/presets/claude/nuxt/rules/testing/README.md +6 -0
  125. package/presets/claude/nuxt/rules/testing/tests-e2e-structure.md +86 -43
  126. package/presets/claude/nuxt/rules/testing/tests-unit.md +58 -45
  127. package/presets/claude/nuxt/rules/tooling-and-review/agent-team-orchestrator.md +8 -5
  128. package/presets/claude/nuxt/rules/tooling-and-review/ai-local-overlay.md +48 -0
  129. package/presets/claude/nuxt/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  130. package/presets/claude/nuxt/rules/tooling-and-review/preset-token-budget.md +7 -3
  131. package/presets/claude/nuxt/rules/tooling-and-review/preset-twin-sync.md +2 -0
  132. package/presets/claude/nuxt/team/README.md +0 -3
  133. package/presets/claude/php-hexagonal/CLAUDE.md +1 -1
  134. package/presets/claude/php-hexagonal/agents/README.md +3 -2
  135. package/presets/claude/php-hexagonal/agents/openspec-author.md +163 -0
  136. package/presets/claude/php-hexagonal/agents/task-router.md +5 -1
  137. package/presets/claude/php-hexagonal/agents/tech-writer.md +4 -0
  138. package/presets/claude/php-hexagonal/commands/README.md +0 -2
  139. package/presets/claude/php-hexagonal/commands/task-continue.md +1 -1
  140. package/presets/claude/php-hexagonal/commands/task.md +1 -4
  141. package/presets/claude/php-hexagonal/hooks/chain-team-phases.sh +54 -3
  142. package/presets/claude/php-hexagonal/rules/README.md +1 -0
  143. package/presets/claude/php-hexagonal/rules/tooling-and-review/agent-team-orchestrator.md +2 -4
  144. package/presets/claude/php-hexagonal/rules/tooling-and-review/ai-local-overlay.md +48 -0
  145. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  146. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-token-budget.md +7 -3
  147. package/presets/claude/php-hexagonal/rules/tooling-and-review/preset-twin-sync.md +2 -0
  148. package/presets/claude/php-laravel/agents/README.md +3 -2
  149. package/presets/claude/php-laravel/agents/openspec-author.md +163 -0
  150. package/presets/claude/php-laravel/agents/task-router.md +5 -1
  151. package/presets/claude/php-laravel/agents/tech-writer.md +4 -0
  152. package/presets/claude/php-laravel/commands/README.md +0 -2
  153. package/presets/claude/php-laravel/commands/task-continue.md +1 -1
  154. package/presets/claude/php-laravel/commands/task.md +1 -4
  155. package/presets/claude/php-laravel/hooks/chain-team-phases.sh +54 -3
  156. package/presets/claude/php-laravel/rules/README.md +1 -0
  157. package/presets/claude/php-laravel/rules/tooling-and-review/agent-team-orchestrator.md +2 -4
  158. package/presets/claude/php-laravel/rules/tooling-and-review/ai-local-overlay.md +48 -0
  159. package/presets/claude/php-laravel/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  160. package/presets/claude/php-laravel/rules/tooling-and-review/preset-token-budget.md +7 -3
  161. package/presets/claude/php-laravel/rules/tooling-and-review/preset-twin-sync.md +2 -0
  162. package/presets/claude/svelte/agents/README.md +1 -1
  163. package/presets/claude/svelte/agents/feature-developer.md +1 -1
  164. package/presets/claude/svelte/agents/openspec-author.md +163 -0
  165. package/presets/claude/svelte/agents/task-analyst.md +1 -1
  166. package/presets/claude/svelte/agents/task-router.md +5 -1
  167. package/presets/claude/svelte/agents/tech-writer.md +4 -0
  168. package/presets/claude/svelte/commands/README.md +0 -2
  169. package/presets/claude/svelte/commands/task-continue.md +1 -1
  170. package/presets/claude/svelte/commands/task.md +1 -5
  171. package/presets/claude/svelte/commands/technical-retro.md +2 -2
  172. package/presets/claude/svelte/hooks/chain-team-phases.sh +54 -2
  173. package/presets/claude/svelte/rules/README.md +1 -0
  174. package/presets/claude/svelte/rules/testing/README.md +6 -0
  175. package/presets/claude/svelte/rules/testing/tests-e2e-structure.md +87 -45
  176. package/presets/claude/svelte/rules/testing/tests-unit.md +70 -23
  177. package/presets/claude/svelte/rules/tooling-and-review/agent-team-orchestrator.md +8 -5
  178. package/presets/claude/svelte/rules/tooling-and-review/ai-local-overlay.md +48 -0
  179. package/presets/claude/svelte/rules/tooling-and-review/preset-pr-checklist.md +5 -1
  180. package/presets/claude/svelte/rules/tooling-and-review/preset-token-budget.md +7 -3
  181. package/presets/claude/svelte/rules/tooling-and-review/preset-twin-sync.md +2 -0
  182. package/presets/claude/svelte/team/README.md +0 -3
  183. package/presets/cursor/android-kotlin/agents/README.md +2 -1
  184. package/presets/cursor/android-kotlin/agents/feature-developer.md +1 -1
  185. package/presets/cursor/android-kotlin/agents/openspec-author.md +164 -0
  186. package/presets/cursor/android-kotlin/agents/task-analyst.md +1 -1
  187. package/presets/cursor/android-kotlin/agents/task-router.md +5 -1
  188. package/presets/cursor/android-kotlin/agents/tech-writer.md +4 -0
  189. package/presets/cursor/android-kotlin/commands/README.md +0 -2
  190. package/presets/cursor/android-kotlin/commands/task-continue.md +1 -1
  191. package/presets/cursor/android-kotlin/commands/task.md +1 -5
  192. package/presets/cursor/android-kotlin/commands/technical-retro.md +2 -2
  193. package/presets/cursor/android-kotlin/hooks/chain-team-phases.sh +54 -2
  194. package/presets/cursor/android-kotlin/rules/agent-team-orchestrator.mdc +7 -4
  195. package/presets/cursor/android-kotlin/rules/ai-local-overlay.mdc +43 -0
  196. package/presets/cursor/android-kotlin/rules/preset-pr-checklist.mdc +5 -1
  197. package/presets/cursor/android-kotlin/rules/preset-token-budget.mdc +7 -3
  198. package/presets/cursor/android-kotlin/rules/preset-twin-sync.mdc +2 -0
  199. package/presets/cursor/go/README.md +6 -6
  200. package/presets/cursor/go/agents/README.md +3 -2
  201. package/presets/cursor/go/agents/openspec-author.md +164 -0
  202. package/presets/cursor/go/agents/task-router.md +5 -1
  203. package/presets/cursor/go/agents/tech-writer.md +4 -0
  204. package/presets/cursor/go/commands/README.md +0 -2
  205. package/presets/cursor/go/commands/task-continue.md +1 -1
  206. package/presets/cursor/go/commands/task.md +1 -4
  207. package/presets/cursor/go/commands/technical-retro.md +2 -2
  208. package/presets/cursor/go/hooks/chain-team-phases.sh +54 -3
  209. package/presets/cursor/go/rules/agent-team-orchestrator.mdc +2 -4
  210. package/presets/cursor/go/rules/ai-local-overlay.mdc +43 -0
  211. package/presets/cursor/go/rules/preset-pr-checklist.mdc +5 -1
  212. package/presets/cursor/go/rules/preset-token-budget.mdc +7 -3
  213. package/presets/cursor/go/rules/preset-twin-sync.mdc +2 -0
  214. package/presets/cursor/ios-swift/README.md +6 -6
  215. package/presets/cursor/ios-swift/agents/README.md +3 -2
  216. package/presets/cursor/ios-swift/agents/feature-developer.md +1 -1
  217. package/presets/cursor/ios-swift/agents/openspec-author.md +164 -0
  218. package/presets/cursor/ios-swift/agents/task-analyst.md +1 -1
  219. package/presets/cursor/ios-swift/agents/task-router.md +5 -1
  220. package/presets/cursor/ios-swift/agents/tech-writer.md +4 -0
  221. package/presets/cursor/ios-swift/commands/README.md +1 -3
  222. package/presets/cursor/ios-swift/commands/task-continue.md +1 -1
  223. package/presets/cursor/ios-swift/commands/task.md +1 -5
  224. package/presets/cursor/ios-swift/commands/technical-retro.md +2 -2
  225. package/presets/cursor/ios-swift/hooks/chain-team-phases.sh +54 -2
  226. package/presets/cursor/ios-swift/rules/agent-team-orchestrator.mdc +7 -4
  227. package/presets/cursor/ios-swift/rules/ai-local-overlay.mdc +43 -0
  228. package/presets/cursor/ios-swift/rules/preset-pr-checklist.mdc +5 -1
  229. package/presets/cursor/ios-swift/rules/preset-token-budget.mdc +7 -3
  230. package/presets/cursor/ios-swift/rules/preset-twin-sync.mdc +2 -0
  231. package/presets/cursor/java/AGENTS.md +1 -1
  232. package/presets/cursor/java/agents/README.md +3 -2
  233. package/presets/cursor/java/agents/openspec-author.md +164 -0
  234. package/presets/cursor/java/agents/task-router.md +5 -1
  235. package/presets/cursor/java/agents/tech-writer.md +4 -0
  236. package/presets/cursor/java/commands/README.md +0 -2
  237. package/presets/cursor/java/commands/task-continue.md +1 -1
  238. package/presets/cursor/java/commands/task.md +1 -4
  239. package/presets/cursor/java/commands/technical-retro.md +2 -2
  240. package/presets/cursor/java/hooks/chain-team-phases.sh +54 -3
  241. package/presets/cursor/java/rules/agent-team-orchestrator.mdc +2 -4
  242. package/presets/cursor/java/rules/ai-local-overlay.mdc +43 -0
  243. package/presets/cursor/java/rules/preset-pr-checklist.mdc +5 -1
  244. package/presets/cursor/java/rules/preset-token-budget.mdc +7 -3
  245. package/presets/cursor/java/rules/preset-twin-sync.mdc +2 -0
  246. package/presets/cursor/mcp-ts/agents/task-analyst.md +1 -1
  247. package/presets/cursor/mcp-ts/commands/README.md +0 -2
  248. package/presets/cursor/mcp-ts/commands/task-continue.md +1 -1
  249. package/presets/cursor/mcp-ts/commands/task.md +1 -4
  250. package/presets/cursor/mcp-ts/commands/technical-retro.md +2 -2
  251. package/presets/cursor/mcp-ts/hooks/chain-team-phases.sh +40 -9
  252. package/presets/cursor/mcp-ts/rules/agent-team-orchestrator.mdc +2 -4
  253. package/presets/cursor/mcp-ts/rules/ai-local-overlay.mdc +43 -0
  254. package/presets/cursor/mcp-ts/rules/preset-pr-checklist.mdc +5 -1
  255. package/presets/cursor/mcp-ts/rules/preset-token-budget.mdc +7 -3
  256. package/presets/cursor/mcp-ts/rules/preset-twin-sync.mdc +2 -0
  257. package/presets/cursor/next/README.md +8 -6
  258. package/presets/cursor/next/REPO_AGENTS.md +8 -0
  259. package/presets/cursor/next/agents/README.md +2 -2
  260. package/presets/cursor/next/agents/build-verifier.md +11 -1
  261. package/presets/cursor/next/agents/feature-developer.md +1 -1
  262. package/presets/cursor/next/agents/openspec-author.md +164 -0
  263. package/presets/cursor/next/agents/task-analyst.md +1 -1
  264. package/presets/cursor/next/agents/task-router.md +5 -1
  265. package/presets/cursor/next/agents/tech-writer.md +4 -0
  266. package/presets/cursor/next/commands/README.md +0 -2
  267. package/presets/cursor/next/commands/task-continue.md +1 -1
  268. package/presets/cursor/next/commands/task.md +1 -4
  269. package/presets/cursor/next/commands/technical-retro.md +2 -2
  270. package/presets/cursor/next/hooks/chain-team-phases.sh +54 -2
  271. package/presets/cursor/next/rules/README.md +6 -3
  272. package/presets/cursor/next/rules/agent-team-orchestrator.mdc +7 -5
  273. package/presets/cursor/next/rules/ai-local-overlay.mdc +43 -0
  274. package/presets/cursor/next/rules/preset-pr-checklist.mdc +5 -1
  275. package/presets/cursor/next/rules/preset-token-budget.mdc +7 -3
  276. package/presets/cursor/next/rules/preset-twin-sync.mdc +2 -0
  277. package/presets/cursor/next/rules/tests-e2e-structure.mdc +83 -43
  278. package/presets/cursor/next/rules/tests-unit.mdc +78 -45
  279. package/presets/cursor/next/team/README.md +0 -3
  280. package/presets/cursor/nuxt/README.md +6 -6
  281. package/presets/cursor/nuxt/agents/README.md +1 -1
  282. package/presets/cursor/nuxt/agents/feature-developer.md +1 -1
  283. package/presets/cursor/nuxt/agents/openspec-author.md +164 -0
  284. package/presets/cursor/nuxt/agents/task-analyst.md +1 -1
  285. package/presets/cursor/nuxt/agents/task-router.md +5 -1
  286. package/presets/cursor/nuxt/agents/tech-writer.md +4 -0
  287. package/presets/cursor/nuxt/commands/README.md +0 -2
  288. package/presets/cursor/nuxt/commands/task-continue.md +1 -1
  289. package/presets/cursor/nuxt/commands/task.md +1 -5
  290. package/presets/cursor/nuxt/commands/technical-retro.md +2 -2
  291. package/presets/cursor/nuxt/hooks/chain-team-phases.sh +54 -2
  292. package/presets/cursor/nuxt/rules/README.md +3 -1
  293. package/presets/cursor/nuxt/rules/agent-team-orchestrator.mdc +8 -5
  294. package/presets/cursor/nuxt/rules/ai-local-overlay.mdc +43 -0
  295. package/presets/cursor/nuxt/rules/preset-pr-checklist.mdc +5 -1
  296. package/presets/cursor/nuxt/rules/preset-token-budget.mdc +7 -3
  297. package/presets/cursor/nuxt/rules/preset-twin-sync.mdc +2 -0
  298. package/presets/cursor/nuxt/rules/tests-e2e-structure.mdc +87 -43
  299. package/presets/cursor/nuxt/rules/tests-unit.mdc +62 -47
  300. package/presets/cursor/nuxt/team/README.md +0 -3
  301. package/presets/cursor/php-hexagonal/AGENTS.md +1 -1
  302. package/presets/cursor/php-hexagonal/agents/README.md +3 -2
  303. package/presets/cursor/php-hexagonal/agents/openspec-author.md +164 -0
  304. package/presets/cursor/php-hexagonal/agents/task-router.md +5 -1
  305. package/presets/cursor/php-hexagonal/agents/tech-writer.md +4 -0
  306. package/presets/cursor/php-hexagonal/commands/README.md +0 -2
  307. package/presets/cursor/php-hexagonal/commands/task-continue.md +1 -1
  308. package/presets/cursor/php-hexagonal/commands/task.md +1 -4
  309. package/presets/cursor/php-hexagonal/commands/technical-retro.md +2 -2
  310. package/presets/cursor/php-hexagonal/hooks/chain-team-phases.sh +54 -3
  311. package/presets/cursor/php-hexagonal/rules/agent-team-orchestrator.mdc +2 -4
  312. package/presets/cursor/php-hexagonal/rules/ai-local-overlay.mdc +43 -0
  313. package/presets/cursor/php-hexagonal/rules/preset-pr-checklist.mdc +5 -1
  314. package/presets/cursor/php-hexagonal/rules/preset-token-budget.mdc +7 -3
  315. package/presets/cursor/php-hexagonal/rules/preset-twin-sync.mdc +2 -0
  316. package/presets/cursor/php-laravel/AGENTS.md +1 -1
  317. package/presets/cursor/php-laravel/agents/README.md +3 -2
  318. package/presets/cursor/php-laravel/agents/openspec-author.md +164 -0
  319. package/presets/cursor/php-laravel/agents/task-router.md +5 -1
  320. package/presets/cursor/php-laravel/agents/tech-writer.md +4 -0
  321. package/presets/cursor/php-laravel/commands/README.md +0 -2
  322. package/presets/cursor/php-laravel/commands/task-continue.md +1 -1
  323. package/presets/cursor/php-laravel/commands/task.md +1 -4
  324. package/presets/cursor/php-laravel/commands/technical-retro.md +2 -2
  325. package/presets/cursor/php-laravel/hooks/chain-team-phases.sh +54 -3
  326. package/presets/cursor/php-laravel/rules/agent-team-orchestrator.mdc +2 -4
  327. package/presets/cursor/php-laravel/rules/ai-local-overlay.mdc +43 -0
  328. package/presets/cursor/php-laravel/rules/preset-pr-checklist.mdc +5 -1
  329. package/presets/cursor/php-laravel/rules/preset-token-budget.mdc +7 -3
  330. package/presets/cursor/php-laravel/rules/preset-twin-sync.mdc +2 -0
  331. package/presets/cursor/svelte/README.md +6 -6
  332. package/presets/cursor/svelte/agents/README.md +1 -1
  333. package/presets/cursor/svelte/agents/feature-developer.md +1 -1
  334. package/presets/cursor/svelte/agents/openspec-author.md +164 -0
  335. package/presets/cursor/svelte/agents/task-analyst.md +1 -1
  336. package/presets/cursor/svelte/agents/task-router.md +5 -1
  337. package/presets/cursor/svelte/agents/tech-writer.md +4 -0
  338. package/presets/cursor/svelte/commands/README.md +0 -2
  339. package/presets/cursor/svelte/commands/task-continue.md +1 -1
  340. package/presets/cursor/svelte/commands/task.md +1 -5
  341. package/presets/cursor/svelte/commands/technical-retro.md +2 -2
  342. package/presets/cursor/svelte/hooks/chain-team-phases.sh +54 -2
  343. package/presets/cursor/svelte/rules/README.md +3 -1
  344. package/presets/cursor/svelte/rules/agent-team-orchestrator.mdc +8 -5
  345. package/presets/cursor/svelte/rules/ai-local-overlay.mdc +43 -0
  346. package/presets/cursor/svelte/rules/preset-pr-checklist.mdc +5 -1
  347. package/presets/cursor/svelte/rules/preset-token-budget.mdc +7 -3
  348. package/presets/cursor/svelte/rules/preset-twin-sync.mdc +2 -0
  349. package/presets/cursor/svelte/rules/tests-e2e-structure.mdc +87 -43
  350. package/presets/cursor/svelte/rules/tests-unit.mdc +72 -23
  351. package/presets/cursor/svelte/team/README.md +0 -3
  352. package/scripts/_lib/embed-stems.json +31 -0
  353. package/scripts/aggregate-agent-task-metrics.mjs +23 -0
  354. package/scripts/check-chain-hook-coverage.sh +109 -0
  355. package/scripts/check-local-overlay.sh +136 -0
  356. package/scripts/check-preset-i18n.sh +2 -2
  357. package/scripts/check-preset-leakage.sh +4 -1
  358. package/scripts/check-preset-structure.sh +21 -1
  359. package/scripts/check-preset-token-budget.sh +20 -10
  360. package/scripts/check-rule-eval.mjs +16 -0
  361. package/scripts/check-shared-core-drift.sh +10 -32
  362. package/scripts/close-agent-task-human-gate.mjs +22 -5
  363. package/scripts/sync-shared-core-embeds.sh +9 -20
  364. package/scripts/test-agent-task-metrics-hooks.mjs +1 -1
  365. package/scripts/test-chain-team-phases-coverage.mjs +411 -0
  366. package/presets/claude/android-kotlin/commands/feature-continue.md +0 -23
  367. package/presets/claude/android-kotlin/commands/feature-start.md +0 -41
  368. package/presets/claude/go/commands/feature-continue.md +0 -23
  369. package/presets/claude/go/commands/feature-start.md +0 -38
  370. package/presets/claude/ios-swift/commands/feature-continue.md +0 -23
  371. package/presets/claude/ios-swift/commands/feature-start.md +0 -41
  372. package/presets/claude/java/commands/feature-continue.md +0 -23
  373. package/presets/claude/java/commands/feature-start.md +0 -38
  374. package/presets/claude/mcp-ts/commands/feature-continue.md +0 -23
  375. package/presets/claude/mcp-ts/commands/feature-start.md +0 -41
  376. package/presets/claude/next/commands/feature-continue.md +0 -23
  377. package/presets/claude/next/commands/feature-start.md +0 -38
  378. package/presets/claude/nuxt/commands/feature-continue.md +0 -23
  379. package/presets/claude/nuxt/commands/feature-start.md +0 -41
  380. package/presets/claude/php-hexagonal/commands/feature-continue.md +0 -23
  381. package/presets/claude/php-hexagonal/commands/feature-start.md +0 -38
  382. package/presets/claude/php-laravel/commands/feature-continue.md +0 -23
  383. package/presets/claude/php-laravel/commands/feature-start.md +0 -38
  384. package/presets/claude/svelte/commands/feature-continue.md +0 -23
  385. package/presets/claude/svelte/commands/feature-start.md +0 -41
  386. package/presets/cursor/android-kotlin/commands/feature-continue.md +0 -23
  387. package/presets/cursor/android-kotlin/commands/feature-start.md +0 -41
  388. package/presets/cursor/go/commands/feature-continue.md +0 -23
  389. package/presets/cursor/go/commands/feature-start.md +0 -41
  390. package/presets/cursor/ios-swift/commands/feature-continue.md +0 -23
  391. package/presets/cursor/ios-swift/commands/feature-start.md +0 -41
  392. package/presets/cursor/java/commands/feature-continue.md +0 -23
  393. package/presets/cursor/java/commands/feature-start.md +0 -41
  394. package/presets/cursor/mcp-ts/commands/feature-continue.md +0 -23
  395. package/presets/cursor/mcp-ts/commands/feature-start.md +0 -41
  396. package/presets/cursor/next/commands/feature-continue.md +0 -23
  397. package/presets/cursor/next/commands/feature-start.md +0 -41
  398. package/presets/cursor/nuxt/commands/feature-continue.md +0 -23
  399. package/presets/cursor/nuxt/commands/feature-start.md +0 -41
  400. package/presets/cursor/php-hexagonal/commands/feature-continue.md +0 -23
  401. package/presets/cursor/php-hexagonal/commands/feature-start.md +0 -41
  402. package/presets/cursor/php-laravel/commands/feature-continue.md +0 -23
  403. package/presets/cursor/php-laravel/commands/feature-start.md +0 -41
  404. package/presets/cursor/svelte/commands/feature-continue.md +0 -23
  405. package/presets/cursor/svelte/commands/feature-start.md +0 -41
package/CHANGELOG.md CHANGED
@@ -2,6 +2,34 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ### Chain-team-phases hook coverage + pipeline race fixes
6
+
7
+ - `chain-team-phases.sh` (all 20 stack × platform hooks) now covers every agent that ships in its stack's `agents/` directory:
8
+ - `DEFAULT_ARTIFACT_OUTPUT_IDS` and `AGENT_HANDOFF` are kept symmetric via a new hard gate **`scripts/check-chain-hook-coverage.sh`** (wired into `check:preset-structure`).
9
+ - Missing entries that previously caused pipelines to silently stall in `awaiting_artifact_receipt` are now filled in: `openspec-author` (`openspec-change`), `qa-tester` (`qa`), `unit-test-{planner,generator,healer}` (`unit-test-{plan,spec,heal}`), `playwright-test-*` (`e2e-{plan,spec,heal}`), `instrumentation-test-*` (`instr-test-*`), `integration-test-*` (`integration-test-*`), `xcuitest-test-*` (`xcuitest-*`), and `debugger` (`debug`).
10
+ - Dead `accessibility-reviewer` / `mockup-reviewer` entries removed from backend stacks (`go`, `java`, `php-hexagonal`, `php-laravel`, `mcp-ts`) per `preset-no-cross-stack-leakage`.
11
+ - The 20 `chain-team-phases.sh` files (10 stacks × 2 platforms) are byte-wise unique — MD5 verified — per `preset-no-cross-stack-leakage.mdc:97-99` (Chain fork).
12
+ - `writeStatus()` now opens the temp file, writes, `fsyncSync()`s, then renames. Closes the race where a `subagentStop` could let the orchestrator read stale `status.json` and bypass a `humanGates` transition.
13
+ - A malformed `pipeline.json` carrying a modern `intent` field no longer falls through to `legacyFlow()` (which silently dropped `openspec-author`, `qa-tester`, and the test trio). The hook now writes `state: blocked`, emits a `pipeline_parse_error` metric event, and surfaces a `followup_message` naming the parse error and instructing `/task-continue <slug>`.
14
+ - Shared core: `_shared/core/agent-team/agent-artifact-contracts.md` and `agent-task-metrics.md` updated with the new default producer → entry rows and the `pipeline_parse_error` event type.
15
+ - New test harness **`scripts/test-chain-team-phases-coverage.mjs`** (and `test:agent-task-metrics-hooks.mjs` count fix from 14 → 20 hooks): drives `openspec-author`, `qa-tester`, pipeline misparse, legacy fallback, and writeStatus durability across all 20 hooks. Wired into `check:preset-structure`.
16
+ - Dogfooded `.cursor/hooks/chain-team-phases.sh` synced from the next preset via `sync-dogfood-cursor.sh`.
17
+ - Consumers: re-run `npx @bonesofspring/ai-rules init cursor|claude --preset <stack>` after publish to pick up the hook updates; if you maintain a custom `chain-team-phases.sh`, run `bash scripts/check-chain-hook-coverage.sh` after editing.
18
+
19
+ ### New `openspec-author` agent — openspec/** lifecycle
20
+
21
+ - New dedicated agent **`openspec-author`** for the OpenSpec (Fission AI `@fission-ai/openspec`) file tree: `openspec/changes/**` (proposal/design/tasks/spec deltas) and `openspec/specs/**` refresh. Owns the full lifecycle `explore → propose → apply → archive` against `openspec/config.yaml`. Reads `app/**` for evidence, never edits production code. Readonly role on `docs/specs/**` — that tree still belongs to `tech-writer`.
22
+ - New router intent **`openspec-change`** in `task-router` (Cursor + Claude, all 9 installable stacks with `docs-only` intent: `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `php-hexagonal`, `php-laravel`). Default step: `task-analyst → solution-architect (skipIf no architecture delta) → openspec-author (scope: "openspec:<change-id>")`. Human gate `["after:task-analyst"]`.
23
+ - `tech-writer` carries a redirect note: when a handoff brief or pipeline step mentions `/opsx:propose`, `/opsx:apply`, `/opsx:archive`, `openspec/changes/`, or `openspec/specs/`, hand off to `openspec-author`. The legacy pipeline scope `openspec-propose` is retained as a backward-compatible alias and routes through the new agent.
24
+ - Consumer migration: `emedcard-web` pipelines (`online-consultation-spec`, `openspec-sync-medcard-11762`) updated to `openspec-author` + `scope: "openspec:<change-id>"`.
25
+ - Consumers: re-run `npx @bonesofspring/ai-rules init cursor|claude --preset <stack>` after publish to install the new agent and router intent.
26
+
27
+ ### Remove deprecated `/feature-start` and `/feature-continue`
28
+
29
+ - Remove deprecated `/feature-start` and `/feature-continue` commands across all stack presets; use `/task` and `/task-continue` instead.
30
+ - 40 preset command files deleted from this monorepo (`packages/ai-rules/presets/{claude,cursor}/<stack>/commands/{feature-start,feature-continue}.md`, 10 stacks × 2 platforms × 2 commands). The equivalent deletions in three sub-repo dogfood mirrors (`dogfood/go-hexagonal`, `dogfood/java-spring-hexagonal`, `dogfood/mcp-ts-sample`) are part of the same change set but live in separate git trees. Cross-references in `commands/README.md`, `agents/README.md`, `team/README.md`, `rules/README.md`, `AGENTS.md` / `CLAUDE.md`, `agent-team-orchestrator`, and `commands/{task,task-continue,technical-retro}.md` updated.
31
+ - Consumers: re-run `npx @bonesofspring/ai-rules init cursor|claude --preset <stack>` after publish; both legacy commands are no longer installed.
32
+
5
33
  ### Superpowers B1–B5 (all installable stacks)
6
34
 
7
35
  - All 10 stacks (Cursor + Claude): **verification-before-completion** lineage snippet on `build-verifier` / `feature-developer` only. `debugger` keeps inline 3-fix + `fixApplied` re-run (skill cross-ref) — not the verification stem. **receiving-code-review** embed on `code-review` skill; implementer one-liner on `feature-developer`, `debugger`, and `ci-investigator` (where those agents exist). Debug skill 4-phase + 3-fix architecture gate; task-analyst/router classify spike / bounded / architectural onto **existing** pipeline profiles.
package/README.md CHANGED
@@ -72,7 +72,21 @@ Presets support **behavior specs** under `docs/specs/**` (INDEX, frontmatter v1,
72
72
 
73
73
  **Optional validation** (from `packages/ai-rules/`): `yarn check:product-specs <repo-root>` (WARN) or `--strict` (FAIL). Monorepo dogfood example: `dogfood/mcp-ts-sample/docs/specs/`.
74
74
 
75
- The package ships presets including **`next`** (Next.js stack), **`nuxt`** (Nuxt 3 / Vue 3 / Pinia), **`svelte`** (SvelteKit / Svelte 5 / TypeScript / `store-svelte`), **`ios-swift`** (iOS apps on Swift / SwiftUI), **`android-kotlin`** (Android multimodule Kotlin / Compose / Gradle), **`go`** (Go backends with hexagonal architecture), **`java`** (Java / Spring Boot hexagonal backends), **`mcp-ts`** (TypeScript MCP servers with `@modelcontextprotocol/sdk`), **`php-hexagonal`** (PHP / Composer hexagonal backends), and **`php-laravel`** (Laravel backend/API with Eloquent, Form Requests, Policies, Actions/Services). Other preset names: see `presets/` in the [repo](https://github.com/bonesofspring/ai-rules). Name is a single path segment, no `/` or `.`.
75
+ ## OpenSpec (`openspec/**`)
76
+
77
+ OpenSpec (Fission AI `@fission-ai/openspec`) is a **separate spec-driven tree** that lives alongside `docs/specs/`:
78
+
79
+ | Tree | Owned by | Where |
80
+ |------|----------|-------|
81
+ | `docs/specs/**` | `tech-writer` (product specs) | Generated/consumed by `task-analyst` + `tech-writer` |
82
+ | `openspec/changes/**` | **`openspec-author`** (new agent) | `proposal.md` / `design.md` / `tasks.md` / `specs/**` deltas per `openspec/config.yaml` schema |
83
+ | `openspec/specs/**` | **`openspec-author`** (new agent) | Applied capabilities; refreshed when a change is archived |
84
+
85
+ The dedicated agent **`openspec-author`** owns the full lifecycle: `explore → propose → apply → archive`. It is reachable from the new router intent `openspec-change` (`/opsx:propose`, `/opsx:apply`, `/opsx:archive`, `openspec/changes`, `openspec/specs`, "OpenSpec change", "обнови openspec"). Default pipeline: `task-analyst → solution-architect (skipIf no architecture delta) → openspec-author (scope: "openspec:<change-id>")`. Scope is always `openspec:<change-id>` — the legacy `scope: openspec-propose` alias is kept on `tech-writer` for backward compatibility.
86
+
87
+ `openspec-author` is installed for **all 9 installable stacks that ship a `docs-only` intent** (everything except `mcp-ts`): `next`, `nuxt`, `svelte`, `ios-swift`, `android-kotlin`, `go`, `java`, `php-hexagonal`, `php-laravel`. Read-only against `app/**` and `docs/specs/**` — the agent only emits the openspec tree and reads production code for evidence.
88
+
89
+ The package ships presets including **`next`** (Next.js stack), **`nuxt`** (Nuxt 3 / Vue 3 / Pinia), **`svelte`** (SvelteKit / Svelte 5 / TypeScript / `store-svelte`), **`ios-swift`** (iOS apps on Swift / SwiftUI), **`android-kotlin`** (Android multimodule Kotlin / Compose / Gradle), **`go`** (Go backends with hexagonal architecture), **`java`** (Java / Spring Boot hexagonal backends), **`mcp-ts`** (TypeScript MCP servers with `@modelcontextprotocol/sdk`), **`php-hexagonal`** (PHP / Composer hexagonal backends), and **`php-laravel`** (Laravel backend/API with Eloquent, Form Requests, Policies, Actions/Services). Other preset names: see `presets/` in the [repo](https://github.com/bonesofspring/ai-rules). Preset name is a single path segment (letters, digits, `.`, `_`, `-`); `..` is rejected.
76
90
 
77
91
  ```bash
78
92
  npx @bonesofspring/ai-rules init cursor --preset nuxt
@@ -102,7 +116,8 @@ Help: `ai-rules --help`.
102
116
  Presets are developed in this monorepo under `presets/`. If you add or change rules, agents, or platform artifacts:
103
117
 
104
118
  - **Taxonomy & layers:** [`presets/_shared/README.md`](presets/_shared/README.md) — shared core (`_shared/core`), stack adapters, platform packaging (includes requestable embed stem `architecture/product-specs` for consumer `docs/specs` INDEX discovery)
105
- - **Contribution guide:** [`docs/PRESET-CONTRIBUTION.md`](docs/PRESET-CONTRIBUTION.md) — SoT, twin sync, embed vs lineage, token budget (≤3 always-on), PR checklist, new stack preset, platform-only files (`BUGBOT.md`, `CLAUDE.md`)
119
+ - **Contribution guide:** [`docs/PRESET-CONTRIBUTION.md`](docs/PRESET-CONTRIBUTION.md) — SoT, twin sync, embed vs lineage, token budget (Cursor 4 / Claude exactly 3 always-on), PR checklist, new stack preset, platform-only files (`BUGBOT.md`, `CLAUDE.md`)
120
+ - **Local overlay (`.ai.local/`):** [`docs/LOCAL-OVERLAY.md`](docs/LOCAL-OVERLAY.md) — consumer-owned rules with priority over preset rules; works for Cursor and Claude Code from the same files
106
121
  - **Dogfood / drift scripts:** [`scripts/sync-dogfood-cursor.sh`](scripts/sync-dogfood-cursor.sh) (also syncs root `AGENTS.md` from `REPO_AGENTS.md`; seeds `team/conventions.md` if absent), [`scripts/check-shared-core-drift.sh`](scripts/check-shared-core-drift.sh). Published npm `files` include `scripts/` so consumers can run `check-product-specs.sh` from the package.
107
122
  - **Preset structure CI gates** (exit non-zero on FAIL): `yarn check:preset-structure` (or `bash scripts/check-preset-structure.sh`) — twin map, session-start budget (Option A), leakage, shared-core drift (`AI_RULES_DRIFT_FAIL=1`)
108
123
  - **Opt-in rule eval:** `yarn check:rule-eval` + `.github/workflows/rule-eval.yml` (`workflow_dispatch` + paths-scoped PR) — **not** wired into `check:preset-structure`
package/bin/cli.js CHANGED
@@ -428,6 +428,12 @@ function presetHasAnySource(base, cfg) {
428
428
  }
429
429
 
430
430
  function resolveTargetCwd(cwdOption) {
431
+ // Reject empty string explicitly: `path.resolve('')` silently returns cwd,
432
+ // turning `--cwd ""` into a footgun that mutates the wrong directory.
433
+ if (cwdOption !== undefined && cwdOption === '') {
434
+ console.error('--cwd requires a non-empty path (use --cwd <dir> or omit for current directory)');
435
+ process.exit(1);
436
+ }
431
437
  const cwd = cwdOption ? path.resolve(cwdOption) : process.cwd();
432
438
  if (!fs.existsSync(cwd)) {
433
439
  console.error(`Target directory does not exist: ${cwd}`);
@@ -496,24 +502,41 @@ function cmdInit(tool, preset, cwdOption) {
496
502
  fs.mkdirSync(toolRootAbs, { recursive: true });
497
503
 
498
504
  let copiedSteps = 0;
505
+ // Track newly created paths so we can roll back on partial failure.
506
+ // Only deletes paths that did not exist before this run — never consumer files.
507
+ const toolRootExisted = fs.existsSync(toolRootAbs);
508
+ const createdPaths = new Set();
509
+ const docsSpecsDir = path.join(cwd, 'docs', 'specs');
510
+ const docsSpecsExisted = fs.existsSync(docsSpecsDir);
511
+
512
+ const trackDir = (dir) => {
513
+ if (!fs.existsSync(dir)) return;
514
+ createdPaths.add(dir);
515
+ };
499
516
 
500
517
  try {
501
518
  if (tool === 'claude' && cfg.claudeMdSrc) {
502
519
  const mdFrom = path.join(base, cfg.claudeMdSrc);
503
520
  if (fs.existsSync(mdFrom)) {
504
- fs.copyFileSync(mdFrom, path.join(toolRootAbs, 'CLAUDE.md'));
521
+ const destAbs = path.join(toolRootAbs, 'CLAUDE.md');
522
+ fs.copyFileSync(mdFrom, destAbs);
523
+ createdPaths.add(destAbs);
505
524
  console.log(`Copied CLAUDE.md → ${path.join(toolRoot, 'CLAUDE.md')}`);
506
525
  copiedSteps++;
507
526
  }
508
527
  }
509
528
 
510
529
  if (fs.existsSync(rulesSrc)) {
511
- copyDir(rulesSrc, path.join(cwd, cfg.rulesDir));
530
+ const dest = path.join(cwd, cfg.rulesDir);
531
+ trackDir(dest);
532
+ copyDir(rulesSrc, dest);
512
533
  console.log(`Copied rules → ${cfg.rulesDir}`);
513
534
  copiedSteps++;
514
535
  }
515
536
  if (fs.existsSync(commandsSrc)) {
516
- copyDir(commandsSrc, path.join(cwd, cfg.commandsDir));
537
+ const dest = path.join(cwd, cfg.commandsDir);
538
+ trackDir(dest);
539
+ copyDir(commandsSrc, dest);
517
540
  console.log(`Copied commands → ${cfg.commandsDir}`);
518
541
  copiedSteps++;
519
542
  }
@@ -521,7 +544,9 @@ function cmdInit(tool, preset, cwdOption) {
521
544
  for (const name of getOptionalDirs(cfg)) {
522
545
  const src = path.join(base, name);
523
546
  if (fs.existsSync(src)) {
524
- copyDir(src, path.join(toolRootAbs, name));
547
+ const dest = path.join(toolRootAbs, name);
548
+ trackDir(dest);
549
+ copyDir(src, dest);
525
550
  console.log(`Copied ${name}/ → ${toolRoot}/${name}/`);
526
551
  copiedSteps++;
527
552
  }
@@ -530,7 +555,9 @@ function cmdInit(tool, preset, cwdOption) {
530
555
  if (tool === 'cursor' && cfg.hooksJsonSrc) {
531
556
  const hooksFrom = path.join(base, cfg.hooksJsonSrc);
532
557
  if (fs.existsSync(hooksFrom)) {
533
- fs.copyFileSync(hooksFrom, path.join(toolRootAbs, 'hooks.json'));
558
+ const destAbs = path.join(toolRootAbs, 'hooks.json');
559
+ fs.copyFileSync(hooksFrom, destAbs);
560
+ createdPaths.add(destAbs);
534
561
  console.log(`Copied hooks.json → ${toolRoot}/hooks.json`);
535
562
  copiedSteps++;
536
563
  }
@@ -540,6 +567,11 @@ function cmdInit(tool, preset, cwdOption) {
540
567
  const mcpFrom = path.join(base, cfg.mcpJsonSrc);
541
568
  if (fs.existsSync(mcpFrom)) {
542
569
  const mcpDestAbs = path.join(cwd, cfg.mcpJsonDest);
570
+ // installMcpJson may write or merge; only track newly created destinations
571
+ // so we do not delete user-edited mcp.json on rollback.
572
+ if (!fs.existsSync(mcpDestAbs)) {
573
+ createdPaths.add(mcpDestAbs);
574
+ }
543
575
  installMcpJson(mcpFrom, mcpDestAbs, cfg.mcpJsonDest);
544
576
  copiedSteps++;
545
577
  }
@@ -548,7 +580,9 @@ function cmdInit(tool, preset, cwdOption) {
548
580
  for (const name of cfg.toolRootFiles || []) {
549
581
  const from = path.join(base, name);
550
582
  if (fs.existsSync(from)) {
551
- fs.copyFileSync(from, path.join(toolRootAbs, name));
583
+ const destAbs = path.join(toolRootAbs, name);
584
+ fs.copyFileSync(from, destAbs);
585
+ createdPaths.add(destAbs);
552
586
  console.log(`Copied ${name} → ${toolRoot}/${name}`);
553
587
  copiedSteps++;
554
588
  }
@@ -558,6 +592,9 @@ function cmdInit(tool, preset, cwdOption) {
558
592
  const from = path.join(base, srcName);
559
593
  if (fs.existsSync(from)) {
560
594
  const destAbs = path.join(cwd, destRel);
595
+ if (!fs.existsSync(destAbs)) {
596
+ createdPaths.add(destAbs);
597
+ }
561
598
  fs.mkdirSync(path.dirname(destAbs), { recursive: true });
562
599
  fs.copyFileSync(from, destAbs);
563
600
  console.log(`Copied ${srcName} → ${destRel}`);
@@ -566,10 +603,15 @@ function cmdInit(tool, preset, cwdOption) {
566
603
  }
567
604
 
568
605
  if (seedDocsSpecsIfAbsent(packageRoot, cwd)) {
606
+ // Track docs/specs seed only if the directory did not exist before this run.
607
+ if (!docsSpecsExisted) {
608
+ createdPaths.add(docsSpecsDir);
609
+ }
569
610
  copiedSteps++;
570
611
  }
571
612
  } catch (err) {
572
613
  const msg = err instanceof Error ? err.message : String(err);
614
+ rollbackInit(createdPaths, toolRootExisted, toolRootAbs);
573
615
  console.error(`init failed: ${msg}`);
574
616
  process.exit(1);
575
617
  }
@@ -587,6 +629,41 @@ function cmdInit(tool, preset, cwdOption) {
587
629
  console.log(`Done. ${toolRoot} installed at ${toolRootAbs} (preset: ${presetName})`);
588
630
  }
589
631
 
632
+ /**
633
+ * Remove files and directories created by cmdInit. Only deletes paths we know
634
+ * we created (or that did not exist before the run); never touches consumer files.
635
+ */
636
+ function rollbackInit(createdPaths, toolRootExisted, toolRootAbs) {
637
+ // Sort deepest-first so files inside a directory are removed before the directory itself.
638
+ const paths = [...createdPaths].sort((a, b) => b.length - a.length);
639
+ const removed = [];
640
+ for (const p of paths) {
641
+ try {
642
+ if (!fs.existsSync(p)) continue;
643
+ const stat = fs.lstatSync(p);
644
+ if (stat.isDirectory()) {
645
+ fs.rmSync(p, { recursive: true, force: true });
646
+ } else {
647
+ fs.unlinkSync(p);
648
+ }
649
+ removed.push(p);
650
+ } catch {
651
+ // Best-effort: log nothing in rollback path, the caller already reported the failure.
652
+ }
653
+ }
654
+ // Only remove the tool root directory itself if we created it (i.e. it did not exist before).
655
+ if (!toolRootExisted && fs.existsSync(toolRootAbs)) {
656
+ try {
657
+ fs.rmSync(toolRootAbs, { recursive: true, force: true });
658
+ } catch {
659
+ // Ignore — the caller already reported the failure.
660
+ }
661
+ }
662
+ if (removed.length > 0) {
663
+ console.error(`Rolled back ${removed.length} path(s) created before failure.`);
664
+ }
665
+ }
666
+
590
667
  function cmdClean(tool, cwdOption) {
591
668
  const cfg = PRESETS[tool];
592
669
  if (!cfg) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonesofspring/ai-rules",
3
- "version": "0.2.20",
3
+ "version": "0.2.21",
4
4
  "description": "Presets of Cursor and Claude rules/commands for Revy Ross personal use",
5
5
  "license": "MIT",
6
6
  "author": "Revy Ross",
@@ -31,12 +31,15 @@
31
31
  "check:preset-token-budget": "bash scripts/check-preset-token-budget.sh",
32
32
  "check:preset-leakage": "bash scripts/check-preset-leakage.sh",
33
33
  "check:hook-only-lifecycle": "bash scripts/check-hook-only-lifecycle.sh",
34
+ "check:local-overlay": "bash scripts/check-local-overlay.sh",
34
35
  "check:preset-i18n": "AI_RULES_I18N_FAIL=1 AI_RULES_I18N_SOFT=0 bash scripts/check-preset-i18n.sh",
35
36
  "check:shared-core-drift": "bash scripts/check-shared-core-drift.sh",
36
37
  "check:product-specs": "bash scripts/check-product-specs.sh",
37
38
  "check:product-specs:dogfood": "bash scripts/check-product-specs.sh ../../dogfood/mcp-ts-sample",
38
39
  "check:rule-eval": "node scripts/check-rule-eval.mjs",
39
- "test:cli-mcp-merge": "node scripts/test-cli-mcp-merge.mjs"
40
+ "test:cli-mcp-merge": "node scripts/test-cli-mcp-merge.mjs",
41
+ "test:chain-coverage": "node scripts/test-chain-team-phases-coverage.mjs",
42
+ "test:agent-task-metrics-hooks": "node scripts/test-agent-task-metrics-hooks.mjs"
40
43
  },
41
44
  "engines": {
42
45
  "node": ">=18"
@@ -36,10 +36,11 @@ Do **not** expect lineage adapters to byte-match core. Embed adapters should mat
36
36
 
37
37
  | Dir | Contents |
38
38
  |-----|----------|
39
- | `core/quality/` | Boy-scout + Principles (always-on slim); requestable `anti-sycophancy-discipline` (~17 rules); requestable `design-guidance` (smells ≤12 + GoF ≤8); requestable `mcp-usage`; embed `debug-investigation`; lineage `verification-before-completion` |
39
+ | `core/quality/` | Boy-scout + Principles (always-on slim); requestable `anti-sycophancy-discipline` (~17 rules); requestable `design-guidance` (smells ≤12 + GoF ≤8); requestable `mcp-usage`; embed `debug-investigation`; inline-embed `verification-before-completion` (no standalone adapter — shipped via `agents/feature-developer.md` + `agents/build-verifier.md` + `skills/debug-investigation/SKILL.md`) |
40
40
  | `core/agent-team/` | Orchestrator + intake (pipeline language); lineage `task-classification` |
41
41
  | `core/architecture/` | Feature-delivery abstract + reference-features template + product-specs (+ product-specs-authoring) + assets/docs-specs templates |
42
42
  | `core/review/` | Code-review MR + technical-retro alias + mockup-review checklist + ux-design checklist; lineage `receiving-code-review` |
43
+ | `core/testing/` | Test principles: behavior vs. implementation, locale-aware titles, isolation/mocks, fixture reuse, e2e scenario ↔ test traceability, page objects, PREFIX-XXX identifiers, selector priority |
43
44
  | `core/meta/` | Author-facing preset meta-rules |
44
45
 
45
46
  ## CLI note
@@ -4,6 +4,9 @@ Discovery table for `docs/specs/**`. Agents start here when the file exists.
4
4
 
5
5
  | id | type | domain | title | path | routes | aliases | status |
6
6
  |----|------|--------|-------|------|--------|---------|--------|
7
- | <!-- example-row: example-page | page | example | Example page | docs/specs/domains/example/example-page.md | /example | ExamplePage | draft --> |
7
+
8
+ ```text
9
+ <!-- example-row: example-page | page | example | Example page | docs/specs/domains/example/example-page.md | /example | ExamplePage | draft -->
10
+ ```
8
11
 
9
12
  <!-- Add one row per page/feature spec. Keep `id` and `path` in sync with frontmatter. -->
@@ -107,9 +107,22 @@ A producer finishes its step by upserting only its owned artifact entry and term
107
107
  | `api-contract-reviewer` | `api-contract-review` | `api-contract-review.md` |
108
108
  | `qa-tester` / unit or e2e planners | stack-native test IDs | plan/spec paths named in the agent prompt |
109
109
  | `tech-writer` | `documentation` | `documentation.md` |
110
+ | `openspec-author` | `openspec-change` | `openspec/changes/<change-id>/**`, optional `.cursor/team/tasks/<slug>/openspec-change.md` |
111
+ | `qa-tester` | `qa` | stack-native (e.g. `qa-report.md`, `qa-screenshot.png`) |
112
+ | `unit-test-planner` | `unit-test-plan` | `unit-test-plan.md` |
113
+ | `unit-test-generator` | `unit-test-spec` | `*.spec.ts` / `*.test.ts` / `*Tests.swift` |
114
+ | `unit-test-healer` | `unit-test-heal` | same as `unit-test-generator` |
115
+ | `playwright-test-planner` | `e2e-plan` | `app/__tests__/e2e/**/*.cases.md` |
116
+ | `playwright-test-generator` | `e2e-spec` | `app/__tests__/e2e/**/*.spec.ts` |
117
+ | `playwright-test-healer` | `e2e-heal` | same as `playwright-test-generator` |
118
+ | `instrumentation-test-*` | `instr-test-plan` / `instr-test-spec` / `instr-test-heal` | Android instrumentation tests |
119
+ | `integration-test-*` | `integration-test-plan` / `integration-test-spec` / `integration-test-heal` | backend integration tests |
120
+ | `xcuitest-test-*` | `xcuitest-plan` / `xcuitest-spec` / `xcuitest-heal` | iOS XCUITest plans/specs |
110
121
 
111
122
  Use these defaults unless a step's `artifactOutputId` / `artifactOutputIds` assigns a distinct owned ID (parallel reviewers must not share one `id`). `artifactInputIds` defaults to the applicable authoritative entries already present in the manifest.
112
123
 
124
+ > **Leakage note:** `openspec-author` ships only in presets that bundle an `openspec-author.md` agent. `mcp-ts` (no UI/contracts author) does **not** ship the agent file or the default entry — do not backfill it into mcp-ts hooks. UI-only agents (`accessibility-reviewer`, `mockup-reviewer`) must **not** appear in `DEFAULT_ARTIFACT_OUTPUT_IDS` for backend stacks (`go`, `java`, `php-*`, `mcp-ts`) even as dead ids — drop them when copying a hook from a UI preset.
125
+
113
126
  **v1 UX artifact:** when `task-analyst` produces `ux-design.md`, append it to the **`analysis`** entry `authoritativePaths` and `evidencePaths`. Do **not** add a default producer row for `ux-designer` in v1.
114
127
 
115
128
  ## specMode
@@ -16,7 +16,7 @@ Each pipeline run owns `<team>/tasks/<slug>/metrics.json`:
16
16
 
17
17
  `events` is append-only. A task is one `runId`; a subtask is one invocation of `pipeline.steps[i]`. Every invocation has an `attemptId`, including each member of a parallel step. Events inherit the immutable task dimensions rather than duplicating them.
18
18
 
19
- Allowed event types are `task_started`, `attempt_started`, `attempt_finished`, `retry_scheduled`, `attempt_skipped`, `human_gate_started`, `human_gate_ended`, and `task_completed`. Terminal outcomes are `completed`, `changes_requested`, `validation_failed`, `skipped`, `cancelled`, or `unknown`.
19
+ Allowed event types are `task_started`, `attempt_started`, `attempt_finished`, `retry_scheduled`, `attempt_skipped`, `human_gate_started`, `human_gate_ended`, `pipeline_parse_error`, and `task_completed`. Terminal outcomes are `completed`, `changes_requested`, `validation_failed`, `skipped`, `cancelled`, or `unknown`.
20
20
 
21
21
  ## Collection policy
22
22
 
@@ -10,8 +10,6 @@ Work request without `/task` — see **agent-team-intake** (when to suggest the
10
10
  |---------|------|
11
11
  | **`/task <desc>`** | **Preferred** — router → dynamic pipeline → first agent |
12
12
  | `/task-continue <slug>` | After human gate or pause |
13
- | `/feature-start <desc>` | Legacy: analyst-only start (no router) |
14
- | `/feature-continue <slug>` | Alias of task-continue |
15
13
  | `/spec-start [desc]` | Generate/bootstrap `docs/specs` — router intent `spec-gen` → analyst author mode → human gate |
16
14
  | `/technical-retro [slug]` | Retro with agent team block |
17
15
 
@@ -188,7 +186,7 @@ After each agent completes, verify its terminal manifest receipt, then let the o
188
186
 
189
187
  ## Legacy mode
190
188
 
191
- If `pipeline.json` is missing (old `/feature-start` tasks), fall back to fixed phases: analysis → development → review → testing. Hook supports both.
189
+ If `pipeline.json` is missing, fall back to fixed phases: analysis → development → review → testing. Hook supports both.
192
190
 
193
191
  ## Skip pipeline when
194
192
 
@@ -8,11 +8,15 @@ Checklist for PRs that touch `packages/ai-rules/presets/**` (and dogfood `.curso
8
8
  - [ ] **Core:** if `_shared/core/**` changed — all `<!-- shared-core: … -->` consumers updated (or documented intentional fork)
9
9
  - [ ] **Twin:** Cursor change → Claude twin **same PR** (**FAIL** if missing on next, nuxt, svelte, ios-swift, android-kotlin, go, java, mcp-ts, php-hexagonal, and php-laravel — see `preset-twin-sync`)
10
10
  - [ ] **Mapping:** `claude/<stack>/rules/README.md` mapping table is current
11
- - [ ] **Token budget:** alwaysApply / session-start 3; meta rules not always-on
11
+ - [ ] **Token budget:** Cursor `alwaysApply` 4 (4th slot reserved for `ai-local-overlay`); Claude session-start exactly 3; meta rules not always-on
12
+ - [ ] **Local overlay coverage:** every installable stack ships `ai-local-overlay.mdc` (Cursor) and `ai-local-overlay.md` (Claude) with `MANDATORY` + acknowledgement format + `docs/LOCAL-OVERLAY.md` pointer; Claude twin listed in `claude/<stack>/rules/README.md` mapping table. Run `packages/ai-rules/scripts/check-local-overlay.sh`.
12
13
  - [ ] **Leakage:** no foreign stack agent stems / handoff strings (`preset-no-cross-stack-leakage`)
14
+ - [ ] **Hook-only lifecycle:** `status.json` / `metrics.json` writes happen only inside `hooks/`; agents read but never rewrite lifecycle fields. Run `packages/ai-rules/scripts/check-hook-only-lifecycle.sh`.
15
+ - [ ] **Chain fork:** the byte-wise MD5 uniqueness of `chain-team-phases.sh` across the 10 stacks × 2 platforms (20 hooks) holds. Run `packages/ai-rules/scripts/check-chain-hook-coverage.sh` and `packages/ai-rules/scripts/test-chain-team-phases-coverage.mjs`.
13
16
  - [ ] **Twin depth:** domain ≥15 lines; thin aliases documented
14
17
  - [ ] **README:** stack `rules/README.md` core→stack mapping / catalog updated if stems added
15
18
  - [ ] **CHANGELOG / package README:** note when public preset paths or install surface change
19
+ - [ ] **i18n anchors:** kept-marked Cyrillic fragments in `tests-unit.md(c)` stay consistent with their English counterparts. Run `packages/ai-rules/scripts/check-preset-i18n.sh`.
16
20
  - [ ] **Dogfood:** run `packages/ai-rules/scripts/sync-dogfood-cursor.sh` (or document intentional skip) when maintaining this monorepo
17
21
  - [ ] **shared-core drift:** for embed-mode stems, run `packages/ai-rules/scripts/check-shared-core-drift.sh` (or document intentional fork)
18
22
 
@@ -6,12 +6,16 @@ Invariants for rule loading in an **installed** preset (consumer app).
6
6
 
7
7
  | Platform | Always-on | Cap |
8
8
  |----------|-----------|-----|
9
- | Cursor | `alwaysApply: true` | **≤ 3** |
9
+ | Cursor | `alwaysApply: true` | **≤ 4** |
10
10
  | Claude | rules **without** `paths:` | **exactly 3** |
11
11
 
12
+ **Cursor 4th slot is reserved for `ai-local-overlay`** (consumer-owned `.ai.local/` rules). If you do not need local overlay, demote that rule to `globs: ["**/.ai.local/**"]` and revert to ≤3.
13
+
12
14
  **Claude Option A (README exclusion):** when counting Claude rules without `paths:` / session-start, **exclude `**/README.md`** (topic indexes are not session-start rules). The intended session-start trio remains **exactly 3**; body budget sums **only those 3** rules.
13
15
 
14
- Session-start body budget (where documented): ≤140 lines total (stretch ≤120).
16
+ Session-start body budget:
17
+ - Claude trio: ≤140 lines total (stretch ≤120).
18
+ - Cursor 4-set: ≤170 lines total (4 rules including `ai-local-overlay`).
15
19
 
16
20
  ## Meta / author rules
17
21
 
@@ -27,4 +31,4 @@ Orchestrator, feature-delivery, code-review, post-change gates, domain globs —
27
31
 
28
32
  ## Verifier
29
33
 
30
- build-verifier **FAIL** if alwaysApply / session-start count exceeds 3 (Claude count **excludes `**/README.md`**), or if a `preset-*` meta rule is marked always-on.
34
+ build-verifier **FAIL** if Cursor `alwaysApply` count exceeds 4, Claude session-start count exceeds 3 (Claude count **excludes `**/README.md`**), or if a `preset-*` meta rule is marked always-on.
@@ -28,6 +28,8 @@ Cursor `.mdc` — **SoT per stack**. Claude topic `.md` — derived twin.
28
28
 
29
29
  - **Domain** rules: ≥15 body lines (FAIL if thin without documented alias reason).
30
30
  - **Thin aliases** (`agent-team-intake`, `technical-retro`): may be shorter (soft) if they only point to a command/skill.
31
+ - **Slim-companion rules** (UI-edit bundle, slim app-cores, slim tooling): may be shorter than 15 lines **if and only if** the body is a pointer into shared-core / stack-prose (no standalone prose). Examples live in stack `rules/README.md` (e.g. `cursor/next/rules/README.md` "UI-edit bundle" intent).
32
+ - **Mechanical enforcement is pending.** Today build-verifier excludes only `agent-team-intake` / `technical-retro` / `preset-layering`; slim-companion rules currently pass under the same human-judgement path as thin aliases. Follow-up: add `allow_slim_stems` to `packages/ai-rules/scripts/check-preset-token-budget.sh` analogous to `trio_stems_allowlist`.
31
33
 
32
34
  ## Severity (build-verifier)
33
35
 
@@ -0,0 +1,70 @@
1
+ # Testing principles
2
+
3
+ Stack-agnostic; concrete paths, runners, and selectors live in the stack adapter (`## Stack notes`).
4
+
5
+ ## Behavior vs. implementation
6
+
7
+ - Verify **behavior and business rules**, not implementation or internal details.
8
+
9
+ ## File naming
10
+
11
+ - For **new** tests use `*.spec.ts` / `*.spec.tsx`. Do not rename existing `*.test.ts` / `*.test.tsx` without a separate task (legacy).
12
+
13
+ ## Runner and matchers
14
+
15
+ - Use the project's runner (Jest or Vitest are common); components — the project's Testing Library integration. Reuse existing matchers — no new micro-framework.
16
+
17
+ ## Test title locale
18
+
19
+ - Consumer apps **may use the project locale** (often Russian) — clear business phrases stating what is checked and the expected outcome.
20
+ - When ESLint enforces the locale (e.g. `jest/valid-title`): each sentence must start with a **capital letter** (including after `.`, `!`, `?`); a space after `.` followed by a lowercase letter is forbidden ("capital after period" violation).
21
+
22
+ Good (Russian locale in consumer app):
23
+
24
+ - `it('Возвращает пустой список. Пользователь не авторизован', () => {})` <!-- i18n-keep: E5 --> (Returns empty list. User is not authorized)
25
+
26
+ Bad (no capital after period; or wrong locale for configured ESLint):
27
+
28
+ - `it('Возвращает пустой список. пользователь не авторизован', () => {})` <!-- i18n-keep: E5 -->
29
+ - `it('Returns empty list when user is guest', () => {})` (wrong locale if ESLint enforces Russian)
30
+
31
+ ## Isolation and mocks
32
+
33
+ - Mock at the **public-contract boundary**; use the project's accepted HTTP/API/store mock approach. Do not mock what is part of the feature's public contract if that breaks the test's meaning.
34
+
35
+ ## Coverage of cross-cutting modules
36
+
37
+ - When changing a **shared cross-cutting module** (e.g. HTTP client body parsing, headers, error / auth handling) — **update or add behavior tests** covering success, error, and edge branches relevant to the module under change.
38
+
39
+ ## Data transformation coverage
40
+
41
+ - Data transformation functions with computed fields and branches must have unit tests covering edge cases (boundary values, missing fields, unexpected value combinations).
42
+
43
+ ## Reuse fixtures over ad-hoc random data
44
+
45
+ - Prefer shared fixtures / handlers from the project's accepted mocks module; do not duplicate interfaces in tests. Use the API response types (DTO types) and the **target domain types** from the project's public type surface.
46
+
47
+ ## E2E: one canonical scenario plan per feature
48
+
49
+ - For each feature keep a **single canonical scenario plan** (distinct from implementation specs; the stack adapter names the file — typically `*.cases.md`).
50
+
51
+ ## E2E: scenario ↔ test traceability
52
+
53
+ - Every scenario has a corresponding test. **Do not weaken** assertions to match an outdated implementation — tests must reflect business expectations from the plan. Colocate plan and executable tests in the same directory.
54
+
55
+ ## E2E: page objects / shared helpers
56
+
57
+ - Prefer page objects and shared helpers over scattered selectors and per-test setup duplication.
58
+
59
+ ## E2E: stable identifiers (PREFIX-XXX)
60
+
61
+ - When scenarios need stable IDs, prefix the title with `PREFIX-XXX`: `PREFIX` = first letters of words in the entity under test (Latin uppercase); `XXX` = sequential number with three digits and leading zeros. Within one `PREFIX`, numbers must form a consistent sequence with no duplicates.
62
+ - Example: `test('OH-001 Отображается список заказов', async ({ page }) => { ... })` <!-- i18n-keep: E5 --> (Order list is displayed)
63
+
64
+ ## E2E: selector priority
65
+
66
+ - Prefer role/label selectors for accessibility and forms; fall back to `data-testid` for stable elements. Use a **hierarchical naming convention** on page roots and key interactive elements (stack adapter defines the scheme — typically `{parent}__{element}`).
67
+
68
+ ## E2E: keep plans and selectors in sync with UI
69
+
70
+ - When changing UI: update selectors in page objects and cross-check with the scenario plan. When adding/changing tests: read the matching plan and sync scenario titles first.
@@ -30,13 +30,14 @@ When copying next pipeline templates: put Playwright / XCUITest / integration-te
30
30
  | code-reviewer, accessibility-reviewer, security-reviewer, performance-auditor, mockup-reviewer | team only |
31
31
  | qa-tester, unit-test-*, instrumentation-test-* | tests only |
32
32
  | tech-writer | docs only |
33
+ | openspec-author | `openspec/**` only — used only when the consumer repo has `openspec/` initialized |
33
34
 
34
35
  ## Model tiers (mirror ios-swift)
35
36
 
36
37
  | Tier | Model hint | Typical agents |
37
38
  |------|------------|----------------|
38
39
  | **cheap** | `fast` / cheap | build-verifier, some generators/healers |
39
- | **standard** | `inherit` | feature-developer, debugger, ci-investigator, a11y, qa, unit-*, instrumentation-* |
40
+ | **standard** | `inherit` | feature-developer, debugger, ci-investigator, a11y, qa, unit-*, instrumentation-*, openspec-author |
40
41
  | **strong** | `strong` | solution-architect, security-reviewer, mockup-reviewer (when scheduled) |
41
42
 
42
43
  ## Pipeline schema
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: feature-developer
3
- description: Feature implementation specialist for Android Kotlin/Jetpack Compose. Implements tasks from decomposition.md following feature-delivery workflow. Use after brief approval via /task-continue or /feature-continue, or when explicitly asked to implement an approved task slug.
3
+ description: Feature implementation specialist for Android Kotlin/Jetpack Compose. Implements tasks from decomposition.md following feature-delivery workflow. Use after brief approval via /task-continue, or when explicitly asked to implement an approved task slug.
4
4
  readonly: false
5
5
  model: inherit
6
6
  ---