@atlashub/smartstack-cli 4.80.0 → 5.0.0

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 (1008) hide show
  1. package/.documentation/agents.html +124 -585
  2. package/.documentation/ba-develop.html +852 -0
  3. package/.documentation/ba-skills.html +465 -0
  4. package/.documentation/business-analyse.html +385 -1570
  5. package/.documentation/cli-commands.html +162 -799
  6. package/.documentation/commands.html +902 -1338
  7. package/.documentation/css/styles.css +34 -1
  8. package/.documentation/efcore.html +161 -2599
  9. package/.documentation/gitflow.html +62 -105
  10. package/.documentation/hooks.html +94 -343
  11. package/.documentation/index.html +116 -385
  12. package/.documentation/init.html +217 -1566
  13. package/.documentation/installation.html +121 -1470
  14. package/.documentation/license.html +90 -450
  15. package/.documentation/ralph-loop.html +105 -602
  16. package/dist/index.js +9421 -79036
  17. package/dist/index.js.map +1 -1
  18. package/package.json +5 -20
  19. package/scripts/generate-docs/README.md +87 -0
  20. package/scripts/generate-docs/index.ts +175 -0
  21. package/scripts/generate-docs/lib/context-builder.ts +81 -0
  22. package/scripts/generate-docs/lib/handlebars-setup.ts +162 -0
  23. package/scripts/generate-docs/lib/markdown-parser.ts +86 -0
  24. package/scripts/generate-docs/lib/sidebar-builder.ts +80 -0
  25. package/scripts/generate-docs/lib/skill-parser.ts +171 -0
  26. package/scripts/generate-docs/lib/stats.ts +32 -0
  27. package/scripts/generate-docs/lib/version.ts +17 -0
  28. package/scripts/generate-docs/templates/layout.hbs +33 -0
  29. package/scripts/generate-docs/templates/pages/_generic.hbs +12 -0
  30. package/scripts/generate-docs/templates/pages/ba-develop.hbs +10 -0
  31. package/scripts/generate-docs/templates/pages/ba-skills.hbs +8 -0
  32. package/scripts/generate-docs/templates/pages/business-analyse.hbs +1 -0
  33. package/scripts/generate-docs/templates/pages/commands.hbs +13 -0
  34. package/scripts/generate-docs/templates/pages/gitflow.hbs +2164 -0
  35. package/scripts/generate-docs/templates/pages/index.hbs +5 -0
  36. package/scripts/generate-docs/templates/partials/breadcrumb.hbs +6 -0
  37. package/scripts/generate-docs/templates/partials/header.hbs +22 -0
  38. package/scripts/generate-docs/templates/partials/sidebar.hbs +32 -0
  39. package/scripts/generate-docs/templates/partials/skill-card.hbs +22 -0
  40. package/scripts/generate-docs/templates/partials/skill-grid.hbs +5 -0
  41. package/scripts/generate-docs/templates/partials/skill-table.hbs +18 -0
  42. package/scripts/generate-docs/templates/partials/stats-bar.hbs +20 -0
  43. package/scripts/test-migration-program-cs.mts +94 -0
  44. package/templates/agents/explore-codebase.md +2 -3
  45. package/templates/agents/explore-docs.md +5 -5
  46. package/templates/hooks/hooks.json +0 -9
  47. package/templates/project/Program.cs.template +17 -5
  48. package/templates/project/appsettings.json.template +208 -195
  49. package/templates/project/claude-md/api.CLAUDE.md.template +27 -2
  50. package/templates/project/patch-smartstack-theme.cjs.template +42 -0
  51. package/templates/scripts/statusline/README.md +47 -0
  52. package/templates/scripts/statusline/index.js +224 -0
  53. package/templates/skills/CLAUDE.md +235 -0
  54. package/templates/skills/ba-develop/SKILL.md +310 -0
  55. package/templates/skills/ba-develop/cli/compute-page-diff/__tests__/compute-page-diff.test.ts +177 -0
  56. package/templates/skills/ba-develop/cli/compute-page-diff/compute-diff.ts +51 -0
  57. package/templates/skills/ba-develop/cli/compute-page-diff/disk-drift.ts +55 -0
  58. package/templates/skills/ba-develop/cli/compute-page-diff/index.ts +89 -0
  59. package/templates/skills/ba-develop/cli/compute-page-diff/scan-pagespecs.ts +115 -0
  60. package/templates/skills/ba-develop/cli/compute-page-diff/types.ts +63 -0
  61. package/templates/skills/ba-develop/cli/compute-page-diff/validate.ts +20 -0
  62. package/templates/skills/ba-develop/cli/update-snapshot/__tests__/update-snapshot.test.ts +73 -0
  63. package/templates/skills/ba-develop/cli/update-snapshot/execute.ts +24 -0
  64. package/templates/skills/ba-develop/cli/update-snapshot/index.ts +61 -0
  65. package/templates/skills/ba-develop/cli/update-snapshot/types.ts +40 -0
  66. package/templates/skills/ba-develop/cli/update-snapshot/validate.ts +17 -0
  67. package/templates/skills/ba-develop/references/anti-patterns.md +101 -0
  68. package/templates/skills/ba-develop/references/auto-healing.md +191 -0
  69. package/templates/skills/ba-develop/references/commit-checkpoints.md +79 -0
  70. package/templates/skills/ba-develop/references/gates.md +380 -0
  71. package/templates/skills/ba-develop/references/output-contract.md +95 -0
  72. package/templates/skills/ba-develop/references/phases-detail.md +592 -0
  73. package/templates/skills/ba-develop-plan/SKILL.md +239 -0
  74. package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/__tests__/validate.test.ts +225 -0
  75. package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/index.ts +102 -0
  76. package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/types.ts +121 -0
  77. package/templates/skills/ba-develop-plan/cli/preflight-develop-plan/validate.ts +261 -0
  78. package/templates/skills/business-analyse/_workflow/README.md +34 -0
  79. package/templates/skills/business-analyse/_workflow/ba-files.md +174 -0
  80. package/templates/skills/business-analyse/_workflow/code-discipline.md +104 -0
  81. package/templates/skills/business-analyse/_workflow/communication.md +63 -0
  82. package/templates/skills/business-analyse/_workflow/completeAuto-discipline.md +79 -0
  83. package/templates/skills/business-analyse/_workflow/context-documents.md +45 -0
  84. package/templates/skills/business-analyse/_workflow/doc-templates.md +318 -0
  85. package/templates/skills/business-analyse/audit-actors/SKILL.md +97 -0
  86. package/templates/skills/business-analyse/audit-cross-dimension/SKILL.md +127 -0
  87. package/templates/skills/business-analyse/audit-cross-ref-code/SKILL.md +119 -0
  88. package/templates/skills/business-analyse/audit-data-model/SKILL.md +343 -0
  89. package/templates/skills/business-analyse/audit-menu/SKILL.md +97 -0
  90. package/templates/skills/business-analyse/audit-prd/SKILL.md +479 -0
  91. package/templates/skills/business-analyse/audit-pre-dev/SKILL.md +135 -0
  92. package/templates/skills/business-analyse/audit-rbac/SKILL.md +93 -0
  93. package/templates/skills/business-analyse/audit-rules/SKILL.md +182 -0
  94. package/templates/skills/business-analyse/audit-screens/SKILL.md +169 -0
  95. package/templates/skills/business-analyse/audit-sections/SKILL.md +174 -0
  96. package/templates/skills/business-analyse/audit-use-cases/SKILL.md +245 -0
  97. package/templates/skills/business-analyse/create-actors/SKILL.md +129 -0
  98. package/templates/skills/business-analyse/create-ba-order/SKILL.md +182 -0
  99. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/__tests__/generate.test.ts +151 -0
  100. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/__tests__/graph.test.ts +173 -0
  101. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/generate.ts +273 -0
  102. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/graph.ts +193 -0
  103. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/index.ts +108 -0
  104. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/types.ts +106 -0
  105. package/templates/skills/business-analyse/create-ba-order/cli/create-ba-order/validate.ts +79 -0
  106. package/templates/skills/business-analyse/create-business-rules/SKILL.md +302 -0
  107. package/templates/skills/business-analyse/create-business-rules/levels/access-rules.md +105 -0
  108. package/templates/skills/business-analyse/create-business-rules/levels/elaborate.md +193 -0
  109. package/templates/skills/business-analyse/create-business-rules/levels/identify.md +157 -0
  110. package/templates/skills/business-analyse/create-business-rules/levels/link.md +86 -0
  111. package/templates/skills/business-analyse/create-data-model/SKILL.md +319 -0
  112. package/templates/skills/business-analyse/create-data-model/levels/attributes.md +130 -0
  113. package/templates/skills/business-analyse/create-data-model/levels/identify.md +100 -0
  114. package/templates/skills/business-analyse/create-data-model/levels/relationships.md +97 -0
  115. package/templates/skills/business-analyse/create-menu/SKILL.md +191 -0
  116. package/templates/skills/business-analyse/create-menu/levels/applications.md +85 -0
  117. package/templates/skills/business-analyse/create-menu/levels/modules.md +81 -0
  118. package/templates/skills/business-analyse/create-menu/levels/resources.md +75 -0
  119. package/templates/skills/business-analyse/create-menu/levels/sections.md +82 -0
  120. package/templates/skills/business-analyse/create-plan-development/SKILL.md +93 -0
  121. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/__tests__/graph.test.ts +271 -0
  122. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/__tests__/parse.test.ts +177 -0
  123. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/generate.ts +317 -0
  124. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/graph.ts +233 -0
  125. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/index.ts +106 -0
  126. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/parse.ts +346 -0
  127. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/types.ts +160 -0
  128. package/templates/skills/business-analyse/create-plan-development/cli/create-plan-development/validate.ts +118 -0
  129. package/templates/skills/business-analyse/create-prd/SKILL.md +228 -0
  130. package/templates/skills/business-analyse/create-rbac/SKILL.md +255 -0
  131. package/templates/skills/business-analyse/create-rbac/levels/detail.md +86 -0
  132. package/templates/skills/business-analyse/create-rbac/levels/discovery.md +63 -0
  133. package/templates/skills/business-analyse/create-rbac/levels/review.md +66 -0
  134. package/templates/skills/business-analyse/create-screen/SKILL.md +386 -0
  135. package/templates/skills/business-analyse/create-screen/levels/dashboard-screens.md +94 -0
  136. package/templates/skills/business-analyse/create-screen/levels/form-screens.md +142 -0
  137. package/templates/skills/business-analyse/create-screen/levels/home-screens.md +151 -0
  138. package/templates/skills/business-analyse/create-screen/levels/kanban-screens.md +86 -0
  139. package/templates/skills/business-analyse/create-screen/levels/list-screens.md +134 -0
  140. package/templates/skills/business-analyse/create-screen/references/post-check.md +101 -0
  141. package/templates/skills/business-analyse/create-screen/references/react-templates.md +252 -0
  142. package/templates/skills/business-analyse/create-screen/references/smartcomponents.md +419 -0
  143. package/templates/skills/business-analyse/create-screen/references/type-mapping.md +150 -0
  144. package/templates/skills/business-analyse/create-use-case/SKILL.md +347 -0
  145. package/templates/skills/business-analyse/create-use-case/levels/detail.md +136 -0
  146. package/templates/skills/business-analyse/create-use-case/levels/discovery.md +110 -0
  147. package/templates/skills/business-analyse/loop/SKILL.md +401 -0
  148. package/templates/skills/business-analyse/modeling-detail/SKILL.md +241 -0
  149. package/templates/skills/business-analyse/modeling-inventory/SKILL.md +174 -0
  150. package/templates/skills/business-analyse/reconcile-menu/SKILL.md +180 -0
  151. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/clean.test.ts +266 -0
  152. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/detect.test.ts +231 -0
  153. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/__tests__/scan.test.ts +154 -0
  154. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/clean.ts +319 -0
  155. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/detect.ts +256 -0
  156. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/index.ts +126 -0
  157. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/scan.ts +175 -0
  158. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/types.ts +136 -0
  159. package/templates/skills/business-analyse/reconcile-menu/cli/reconcile-menu/validate.ts +32 -0
  160. package/templates/skills/check-version/SKILL.md +196 -196
  161. package/templates/skills/cli-app-sync/SKILL.md +9 -9
  162. package/templates/skills/cli-app-sync/references/comparison-map.md +4 -4
  163. package/templates/skills/cli-app-sync/references/diff-entities.md +6 -6
  164. package/templates/skills/conventions/SKILL.md +64 -0
  165. package/templates/skills/dev-start/SKILL.md +190 -237
  166. package/templates/skills/development/SKILL.md +87 -0
  167. package/templates/skills/development/audit/SKILL.md +156 -0
  168. package/templates/skills/development/audit/routing-dynamic/SKILL.md +196 -0
  169. package/templates/skills/development/audit-dev-api/SKILL.md +331 -0
  170. package/templates/skills/development/audit-dev-api/cli/audit-dev-api/__tests__/end-to-end.test.ts +364 -0
  171. package/templates/skills/development/audit-dev-api/cli/audit-dev-api/audit.ts +646 -0
  172. package/templates/skills/development/audit-dev-api/cli/audit-dev-api/index.ts +140 -0
  173. package/templates/skills/development/audit-dev-api/cli/audit-dev-api/types.ts +158 -0
  174. package/templates/skills/development/audit-dev-api/cli/audit-dev-api/validate.ts +45 -0
  175. package/templates/skills/development/audit-dev-core/SKILL.md +182 -0
  176. package/templates/skills/development/audit-dev-data/SKILL.md +195 -0
  177. package/templates/skills/development/audit-dev-domain/SKILL.md +184 -0
  178. package/templates/skills/development/audit-dev-frontend/SKILL.md +530 -0
  179. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/__tests__/end-to-end.test.ts +202 -0
  180. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/apply.ts +31 -0
  181. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/audit.ts +734 -0
  182. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/index.ts +125 -0
  183. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/types.ts +165 -0
  184. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/validate.ts +36 -0
  185. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/__tests__/dev-ui-022.test.ts +193 -0
  186. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/apply.ts +374 -0
  187. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/audit.ts +1126 -0
  188. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/index.ts +141 -0
  189. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/types.ts +218 -0
  190. package/templates/skills/development/audit-dev-frontend/cli/audit-dev-frontend/validate.ts +80 -0
  191. package/templates/skills/development/audit-dev-tests/SKILL.md +82 -0
  192. package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/__tests__/audit.test.ts +220 -0
  193. package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/audit.ts +185 -0
  194. package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/index.ts +84 -0
  195. package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/types.ts +48 -0
  196. package/templates/skills/development/audit-dev-tests/cli/audit-dev-tests/validate.ts +36 -0
  197. package/templates/skills/development/audit-dev-wire/SKILL.md +144 -0
  198. package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/__tests__/audit.test.ts +171 -0
  199. package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/audit.ts +307 -0
  200. package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/index.ts +139 -0
  201. package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/types.ts +110 -0
  202. package/templates/skills/development/audit-dev-wire/cli/audit-dev-wire/validate.ts +16 -0
  203. package/templates/skills/development/backend/business-layer/SKILL.md +255 -0
  204. package/templates/skills/development/backend/business-layer/cli/scaffold-business/__tests__/generate.test.ts +254 -0
  205. package/templates/skills/development/backend/business-layer/cli/scaffold-business/generate.ts +842 -0
  206. package/templates/skills/development/backend/business-layer/cli/scaffold-business/index.ts +56 -0
  207. package/templates/skills/development/backend/business-layer/cli/scaffold-business/types.ts +112 -0
  208. package/templates/skills/development/backend/business-layer/cli/scaffold-business/validate.ts +24 -0
  209. package/templates/skills/development/backend/controller/SKILL.md +154 -0
  210. package/templates/skills/development/backend/controller/cli/scaffold-controller/__tests__/generate.test.ts +345 -0
  211. package/templates/skills/development/backend/controller/cli/scaffold-controller/generate.ts +280 -0
  212. package/templates/skills/development/backend/controller/cli/scaffold-controller/index.ts +49 -0
  213. package/templates/skills/development/backend/controller/cli/scaffold-controller/types.ts +72 -0
  214. package/templates/skills/development/backend/controller/cli/scaffold-controller/validate.ts +14 -0
  215. package/templates/skills/development/backend/core-seed/SKILL.md +177 -0
  216. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/build-spec.test.ts +163 -0
  217. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/generate.test.ts +330 -0
  218. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/__tests__/validate.test.ts +126 -0
  219. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/build-spec.ts +287 -0
  220. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/generate.ts +826 -0
  221. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/index.ts +188 -0
  222. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/types.ts +163 -0
  223. package/templates/skills/development/backend/core-seed/cli/scaffold-core-seed/validate.ts +129 -0
  224. package/templates/skills/development/backend/data-layer/SKILL.md +163 -0
  225. package/templates/skills/development/backend/data-layer/cli/scaffold-entity/__tests__/generate.test.ts +155 -0
  226. package/templates/skills/development/backend/data-layer/cli/scaffold-entity/generate.ts +232 -0
  227. package/templates/skills/development/backend/data-layer/cli/scaffold-entity/index.ts +34 -0
  228. package/templates/skills/development/backend/data-layer/cli/scaffold-entity/types.ts +60 -0
  229. package/templates/skills/development/backend/data-layer/cli/scaffold-entity/validate.ts +42 -0
  230. package/templates/skills/development/backend/data-layer/cli/scaffold-migration/execute.ts +13 -0
  231. package/templates/skills/development/backend/data-layer/cli/scaffold-migration/index.ts +25 -0
  232. package/templates/skills/development/backend/data-layer/cli/scaffold-migration/types.ts +11 -0
  233. package/templates/skills/development/backend/data-layer/cli/scaffold-migration/validate.ts +9 -0
  234. package/templates/skills/development/backend/screen-controller/SKILL.md +169 -0
  235. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/generate.test.ts +329 -0
  236. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/hub-views.test.ts +105 -0
  237. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/__tests__/parse-pagespec.test.ts +137 -0
  238. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/generate.ts +437 -0
  239. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/index.ts +108 -0
  240. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/parse-pagespec.ts +104 -0
  241. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/types.ts +101 -0
  242. package/templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/validate.ts +26 -0
  243. package/templates/skills/development/backend/seed-data/SKILL.md +91 -0
  244. package/templates/skills/development/backend/seed-data/cli/scaffold-seed/generate.ts +471 -0
  245. package/templates/skills/development/backend/seed-data/cli/scaffold-seed/index.ts +74 -0
  246. package/templates/skills/development/backend/seed-data/cli/scaffold-seed/types.ts +104 -0
  247. package/templates/skills/development/backend/seed-data/cli/scaffold-seed/validate.ts +63 -0
  248. package/templates/skills/development/backend/structure/SKILL.md +47 -0
  249. package/templates/skills/development/debug/SKILL.md +62 -0
  250. package/templates/skills/development/debug/audit-bug/SKILL.md +185 -0
  251. package/templates/skills/development/debug/backend/SKILL.md +114 -0
  252. package/templates/skills/development/debug/discuss-bug/SKILL.md +193 -0
  253. package/templates/skills/development/debug/fix-bug/SKILL.md +172 -0
  254. package/templates/skills/development/debug/frontend/SKILL.md +215 -0
  255. package/templates/skills/development/frontend/api-client/SKILL.md +158 -0
  256. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/generate.test.ts +1180 -0
  257. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/screen-strata-contract.test.ts +261 -0
  258. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/__tests__/url-parity.test.ts +201 -0
  259. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/generate.ts +875 -0
  260. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/index.ts +36 -0
  261. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/types.ts +251 -0
  262. package/templates/skills/development/frontend/api-client/cli/scaffold-api-client/validate.ts +10 -0
  263. package/templates/skills/development/frontend/auth/SKILL.md +77 -0
  264. package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/generate.ts +306 -0
  265. package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/index.ts +179 -0
  266. package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/types.ts +22 -0
  267. package/templates/skills/development/frontend/auth/cli/scaffold-frontend-auth/validate.ts +37 -0
  268. package/templates/skills/development/frontend/component/SKILL.md +347 -0
  269. package/templates/skills/development/frontend/component/cli/scaffold-component/__tests__/generate.test.ts +1237 -0
  270. package/templates/skills/development/frontend/component/cli/scaffold-component/generate.ts +1923 -0
  271. package/templates/skills/development/frontend/component/cli/scaffold-component/index.ts +155 -0
  272. package/templates/skills/development/frontend/component/cli/scaffold-component/types.ts +290 -0
  273. package/templates/skills/development/frontend/component/cli/scaffold-component/validate.ts +16 -0
  274. package/templates/skills/development/frontend/component/cli/validate-page/__tests__/execute.test.ts +231 -0
  275. package/templates/skills/development/frontend/component/cli/validate-page/execute.ts +598 -0
  276. package/templates/skills/development/frontend/component/cli/validate-page/index.ts +88 -0
  277. package/templates/skills/development/frontend/component/cli/validate-page/types.ts +58 -0
  278. package/templates/skills/development/frontend/component/cli/validate-page/validate.ts +28 -0
  279. package/templates/skills/development/frontend/component/patterns/README.md +42 -0
  280. package/templates/skills/development/frontend/component/patterns/detail-page.md +133 -0
  281. package/templates/skills/development/frontend/component/patterns/entity-card.md +148 -0
  282. package/templates/skills/development/frontend/component/patterns/form-page.md +191 -0
  283. package/templates/skills/development/frontend/component/patterns/kanban-board.md +195 -0
  284. package/templates/skills/development/frontend/component/patterns/list-page.md +175 -0
  285. package/templates/skills/development/frontend/extension-config/SKILL.md +108 -0
  286. package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/generate.ts +64 -0
  287. package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/index.ts +70 -0
  288. package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/types.ts +27 -0
  289. package/templates/skills/development/frontend/extension-config/cli/scaffold-extension-config/validate.ts +16 -0
  290. package/templates/skills/development/frontend/layout/SKILL.md +52 -0
  291. package/templates/skills/development/frontend/layout/cli/scaffold-layout/__tests__/generate.test.ts +66 -0
  292. package/templates/skills/development/frontend/layout/cli/scaffold-layout/generate.ts +175 -0
  293. package/templates/skills/development/frontend/layout/cli/scaffold-layout/index.ts +104 -0
  294. package/templates/skills/development/frontend/layout/cli/scaffold-layout/types.ts +17 -0
  295. package/templates/skills/development/frontend/layout/cli/scaffold-layout/validate.ts +37 -0
  296. package/templates/skills/development/frontend/routes/SKILL.md +152 -0
  297. package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/generate.ts +216 -0
  298. package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/index.ts +121 -0
  299. package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/types.ts +69 -0
  300. package/templates/skills/development/frontend/routes/cli/aggregate-component-registry/validate.ts +23 -0
  301. package/templates/skills/development/frontend/routes/cli/scaffold-routes/__tests__/generate.test.ts +292 -0
  302. package/templates/skills/development/frontend/routes/cli/scaffold-routes/generate.ts +270 -0
  303. package/templates/skills/development/frontend/routes/cli/scaffold-routes/index.ts +42 -0
  304. package/templates/skills/development/frontend/routes/cli/scaffold-routes/types.ts +114 -0
  305. package/templates/skills/development/frontend/routes/cli/scaffold-routes/validate.ts +68 -0
  306. package/templates/skills/development/frontend/structure/SKILL.md +119 -0
  307. package/templates/skills/development/frontend/theme/SKILL.md +48 -0
  308. package/templates/skills/development/frontend/theme/cli/scaffold-theme/__tests__/generate.test.ts +53 -0
  309. package/templates/skills/development/frontend/theme/cli/scaffold-theme/generate.ts +129 -0
  310. package/templates/skills/development/frontend/theme/cli/scaffold-theme/index.ts +102 -0
  311. package/templates/skills/development/frontend/theme/cli/scaffold-theme/types.ts +48 -0
  312. package/templates/skills/development/frontend/theme/cli/scaffold-theme/validate.ts +37 -0
  313. package/templates/skills/development/frontend/ui-polish/SKILL.md +192 -0
  314. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r18.test.ts +153 -0
  315. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r19.test.ts +307 -0
  316. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/r20.test.ts +167 -0
  317. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/__tests__/shared-scan.test.ts +262 -0
  318. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/apply.ts +580 -0
  319. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/audit.ts +825 -0
  320. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/index.ts +133 -0
  321. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/types.ts +121 -0
  322. package/templates/skills/development/frontend/ui-polish/cli/ui-polish/validate.ts +73 -0
  323. package/templates/skills/development/frontend/ui-polish/tokens.json +292 -0
  324. package/templates/skills/development/frontend/ui-primitives/SKILL.md +88 -0
  325. package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/__tests__/generate.test.ts +158 -0
  326. package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/generate.ts +345 -0
  327. package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/index.ts +142 -0
  328. package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/types.ts +27 -0
  329. package/templates/skills/development/frontend/ui-primitives/cli/scaffold-ui-primitives/validate.ts +37 -0
  330. package/templates/skills/development/run/SKILL.md +61 -0
  331. package/templates/skills/development/run/backend/SKILL.md +106 -0
  332. package/templates/skills/development/run/frontend/SKILL.md +116 -0
  333. package/templates/skills/development/smoke-test/SKILL.md +99 -0
  334. package/templates/skills/development/smoke-test/cli/run-smoke/execute.ts +424 -0
  335. package/templates/skills/development/smoke-test/cli/run-smoke/index.ts +75 -0
  336. package/templates/skills/development/smoke-test/cli/run-smoke/types.ts +100 -0
  337. package/templates/skills/development/testing/SKILL.md +148 -0
  338. package/templates/skills/development/testing/cli/scaffold-tests/generate.ts +530 -0
  339. package/templates/skills/development/testing/cli/scaffold-tests/index.ts +83 -0
  340. package/templates/skills/development/testing/cli/scaffold-tests/types.ts +51 -0
  341. package/templates/skills/development/testing/cli/scaffold-tests/validate.ts +33 -0
  342. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/__tests__/generate.test.ts +188 -0
  343. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/__tests__/parse-ac.test.ts +191 -0
  344. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/generate.ts +190 -0
  345. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/index.ts +138 -0
  346. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/parse-ac.ts +172 -0
  347. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/types.ts +104 -0
  348. package/templates/skills/development/testing/cli/scaffold-tests-from-ac/validate.ts +57 -0
  349. package/templates/skills/development/testing/cli/test-report/execute.ts +140 -0
  350. package/templates/skills/development/testing/cli/test-report/index.ts +96 -0
  351. package/templates/skills/development/testing/cli/test-report/types.ts +52 -0
  352. package/templates/skills/development/testing/cli/test-report/validate.ts +26 -0
  353. package/templates/skills/development/testing/fix-build/SKILL.md +81 -0
  354. package/templates/skills/development/testing/smoke-http/SKILL.md +123 -0
  355. package/templates/skills/development/testing/smoke-http/cli/smoke-http/execute.ts +129 -0
  356. package/templates/skills/development/testing/smoke-http/cli/smoke-http/index.ts +113 -0
  357. package/templates/skills/development/testing/smoke-http/cli/smoke-http/types.ts +62 -0
  358. package/templates/skills/development/testing/smoke-http/cli/smoke-http/validate.ts +36 -0
  359. package/templates/skills/development/testing/ui-test/SKILL.md +128 -0
  360. package/templates/skills/development/testing/ui-test/cli/build-manifest/generate.ts +129 -0
  361. package/templates/skills/development/testing/ui-test/cli/build-manifest/index.ts +80 -0
  362. package/templates/skills/development/testing/ui-test/cli/build-manifest/types.ts +72 -0
  363. package/templates/skills/development/testing/ui-test/cli/build-manifest/validate.ts +44 -0
  364. package/templates/skills/development/testing/ui-test/cli/run-ui-test/execute.ts +136 -0
  365. package/templates/skills/development/testing/ui-test/cli/run-ui-test/index.ts +75 -0
  366. package/templates/skills/development/testing/ui-test/cli/run-ui-test/lib/dev-browser-driver.ts +250 -0
  367. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/delete.js.hbs +83 -0
  368. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/detail.js.hbs +87 -0
  369. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/edit.js.hbs +91 -0
  370. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/form-submit.js.hbs +82 -0
  371. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/list.js.hbs +125 -0
  372. package/templates/skills/development/testing/ui-test/cli/run-ui-test/templates/permission-negative.js.hbs +65 -0
  373. package/templates/skills/development/testing/ui-test/cli/run-ui-test/types.ts +57 -0
  374. package/templates/skills/development/testing/ui-test/cli/run-ui-test/validate.ts +56 -0
  375. package/templates/skills/documentation/SKILL.md +168 -139
  376. package/templates/skills/documentation/cli/extract-doc/__tests__/forbidden.test.ts +136 -0
  377. package/templates/skills/documentation/cli/extract-doc/__tests__/overflow.test.ts +76 -0
  378. package/templates/skills/documentation/cli/extract-doc/__tests__/required.test.ts +147 -0
  379. package/templates/skills/documentation/cli/extract-doc/extract.ts +657 -0
  380. package/templates/skills/documentation/cli/extract-doc/index.ts +102 -0
  381. package/templates/skills/documentation/cli/extract-doc/types.ts +133 -0
  382. package/templates/skills/documentation/cli/extract-doc/validate.ts +35 -0
  383. package/templates/skills/documentation/cli/scaffold-doc/generate.ts +198 -0
  384. package/templates/skills/documentation/cli/scaffold-doc/index.ts +61 -0
  385. package/templates/skills/documentation/cli/scaffold-doc/types.ts +72 -0
  386. package/templates/skills/documentation/cli/scaffold-doc/validate.ts +33 -0
  387. package/templates/skills/documentation/data-schema.md +18 -38
  388. package/templates/skills/documentation/steps/step-01-scan.md +59 -113
  389. package/templates/skills/documentation/steps/step-02-generate.md +158 -231
  390. package/templates/skills/documentation/steps/step-03-validate.md +101 -280
  391. package/templates/skills/documentation/templates.md +403 -92
  392. package/templates/skills/efcore/SKILL.md +88 -308
  393. package/templates/skills/efcore/_shared.md +140 -0
  394. package/templates/skills/efcore/agents/create.md +69 -0
  395. package/templates/skills/efcore/agents/db-update.md +58 -0
  396. package/templates/skills/efcore/agents/list.md +35 -0
  397. package/templates/skills/efcore/agents/rebase-snapshot.md +50 -0
  398. package/templates/skills/efcore/agents/recreate-db.md +78 -0
  399. package/templates/skills/efcore/agents/squash.md +78 -0
  400. package/templates/skills/efcore/agents/status.md +35 -0
  401. package/templates/skills/efcore/cli/create/execute.ts +164 -0
  402. package/templates/skills/efcore/cli/create/index.ts +51 -0
  403. package/templates/skills/efcore/cli/create/types.ts +35 -0
  404. package/templates/skills/efcore/cli/create/validate.ts +29 -0
  405. package/templates/skills/efcore/cli/lib/detect-dbcontexts.ts +195 -0
  406. package/templates/skills/efcore/cli/lib/ef-runner.ts +144 -0
  407. package/templates/skills/efcore/cli/lib/migration-name.ts +56 -0
  408. package/templates/skills/efcore/cli/lib/parse-csproj-version.ts +45 -0
  409. package/templates/skills/efcore/cli/list/execute.ts +83 -0
  410. package/templates/skills/efcore/cli/list/index.ts +60 -0
  411. package/templates/skills/efcore/cli/list/types.ts +46 -0
  412. package/templates/skills/efcore/cli/list/validate.ts +20 -0
  413. package/templates/skills/efcore/cli/rebase-snapshot/execute.ts +21 -0
  414. package/templates/skills/efcore/cli/rebase-snapshot/index.ts +53 -0
  415. package/templates/skills/efcore/cli/rebase-snapshot/types.ts +20 -0
  416. package/templates/skills/efcore/cli/rebase-snapshot/validate.ts +25 -0
  417. package/templates/skills/efcore/cli/squash/execute.ts +298 -0
  418. package/templates/skills/efcore/cli/squash/index.ts +57 -0
  419. package/templates/skills/efcore/cli/squash/types.ts +38 -0
  420. package/templates/skills/efcore/cli/squash/validate.ts +30 -0
  421. package/templates/skills/efcore/cli/status/execute.ts +152 -0
  422. package/templates/skills/efcore/cli/status/index.ts +45 -0
  423. package/templates/skills/efcore/cli/status/types.ts +32 -0
  424. package/templates/skills/efcore/cli/status/validate.ts +20 -0
  425. package/templates/skills/external/context7/SKILL.md +121 -0
  426. package/templates/skills/external/dev-browser/SKILL.md +134 -0
  427. package/templates/skills/gitflow/SKILL.md +139 -392
  428. package/templates/skills/gitflow/_shared.md +24 -620
  429. package/templates/skills/gitflow/agents/abort.md +47 -0
  430. package/templates/skills/gitflow/agents/cleanup.md +50 -0
  431. package/templates/skills/gitflow/agents/commit.md +41 -0
  432. package/templates/skills/gitflow/agents/finish.md +47 -0
  433. package/templates/skills/gitflow/agents/init.md +41 -0
  434. package/templates/skills/gitflow/agents/merge.md +44 -0
  435. package/templates/skills/gitflow/agents/pr.md +39 -0
  436. package/templates/skills/gitflow/agents/start.md +42 -0
  437. package/templates/skills/gitflow/agents/status.md +39 -0
  438. package/templates/skills/gitflow/agents/sync.md +38 -0
  439. package/templates/skills/gitflow/cli/abort/execute.ts +61 -0
  440. package/templates/skills/gitflow/cli/abort/index.ts +116 -0
  441. package/templates/skills/gitflow/cli/abort/types.ts +21 -0
  442. package/templates/skills/gitflow/cli/abort/validate.ts +38 -0
  443. package/templates/skills/gitflow/cli/cleanup/execute.ts +107 -0
  444. package/templates/skills/gitflow/cli/cleanup/index.ts +122 -0
  445. package/templates/skills/gitflow/cli/cleanup/types.ts +26 -0
  446. package/templates/skills/gitflow/cli/cleanup/validate.ts +33 -0
  447. package/templates/skills/gitflow/cli/commit/execute.ts +146 -0
  448. package/templates/skills/gitflow/cli/commit/index.ts +77 -0
  449. package/templates/skills/gitflow/cli/commit/types.ts +36 -0
  450. package/templates/skills/gitflow/cli/commit/validate.ts +38 -0
  451. package/templates/skills/gitflow/cli/finish/execute.ts +127 -0
  452. package/templates/skills/gitflow/cli/finish/index.ts +106 -0
  453. package/templates/skills/gitflow/cli/finish/types.ts +25 -0
  454. package/templates/skills/gitflow/cli/finish/validate.ts +44 -0
  455. package/templates/skills/gitflow/cli/generate-msg/execute.ts +51 -0
  456. package/templates/skills/gitflow/cli/generate-msg/index.ts +73 -0
  457. package/templates/skills/gitflow/cli/generate-msg/types.ts +37 -0
  458. package/templates/skills/gitflow/cli/generate-msg/validate.ts +42 -0
  459. package/templates/skills/gitflow/cli/init/execute.ts +186 -0
  460. package/templates/skills/gitflow/cli/init/index.ts +127 -0
  461. package/templates/skills/gitflow/cli/init/types.ts +63 -0
  462. package/templates/skills/gitflow/cli/init/validate.ts +56 -0
  463. package/templates/skills/gitflow/cli/lib/branch.ts +83 -0
  464. package/templates/skills/gitflow/cli/lib/config.ts +149 -0
  465. package/templates/skills/gitflow/cli/lib/efcore.ts +136 -0
  466. package/templates/skills/gitflow/cli/lib/git.ts +212 -0
  467. package/templates/skills/gitflow/cli/lib/output.ts +49 -0
  468. package/templates/skills/gitflow/cli/lib/paths.ts +54 -0
  469. package/templates/skills/gitflow/cli/lib/platform.ts +44 -0
  470. package/templates/skills/gitflow/cli/lib/provider.ts +147 -0
  471. package/templates/skills/gitflow/cli/lib/types.ts +189 -0
  472. package/templates/skills/gitflow/cli/lib/version.ts +152 -0
  473. package/templates/skills/gitflow/cli/lib/worktree.ts +170 -0
  474. package/templates/skills/gitflow/cli/merge/execute.ts +93 -0
  475. package/templates/skills/gitflow/cli/merge/index.ts +109 -0
  476. package/templates/skills/gitflow/cli/merge/types.ts +24 -0
  477. package/templates/skills/gitflow/cli/merge/validate.ts +33 -0
  478. package/templates/skills/gitflow/cli/pr/execute.ts +131 -0
  479. package/templates/skills/gitflow/cli/pr/index.ts +115 -0
  480. package/templates/skills/gitflow/cli/pr/types.ts +27 -0
  481. package/templates/skills/gitflow/cli/pr/validate.ts +27 -0
  482. package/templates/skills/gitflow/cli/start/execute.ts +98 -0
  483. package/templates/skills/gitflow/cli/start/index.ts +75 -0
  484. package/templates/skills/gitflow/cli/start/types.ts +26 -0
  485. package/templates/skills/gitflow/cli/start/validate.ts +47 -0
  486. package/templates/skills/gitflow/cli/status/execute.ts +251 -0
  487. package/templates/skills/gitflow/cli/status/index.ts +154 -0
  488. package/templates/skills/gitflow/cli/status/types.ts +75 -0
  489. package/templates/skills/gitflow/cli/status/validate.ts +38 -0
  490. package/templates/skills/gitflow/cli/sync/execute.ts +84 -0
  491. package/templates/skills/gitflow/cli/sync/index.ts +75 -0
  492. package/templates/skills/gitflow/cli/sync/types.ts +25 -0
  493. package/templates/skills/gitflow/cli/sync/validate.ts +34 -0
  494. package/templates/skills/gitflow/commit-message.md +46 -0
  495. package/templates/skills/init/SKILL.md +54 -0
  496. package/templates/skills/lib/__tests__/canonical-hash.test.ts +45 -0
  497. package/templates/skills/lib/__tests__/page-spec-actions.test.ts +232 -0
  498. package/templates/skills/lib/canonical-hash.ts +40 -0
  499. package/templates/skills/lib/detector.ts +243 -0
  500. package/templates/skills/lib/dotnet.ts +238 -0
  501. package/templates/skills/lib/frontend-fixers.ts +151 -0
  502. package/templates/skills/lib/fs.ts +238 -0
  503. package/templates/skills/lib/git.ts +134 -0
  504. package/templates/skills/lib/graph.ts +138 -0
  505. package/templates/skills/lib/navroute-parser.ts +51 -0
  506. package/templates/skills/lib/output.ts +117 -0
  507. package/templates/skills/lib/page-spec-actions.ts +350 -0
  508. package/templates/skills/lib/skill-slug.ts +121 -0
  509. package/templates/skills/lib/string-utils.ts +140 -0
  510. package/templates/skills/lib/template-loader.ts +115 -0
  511. package/templates/skills/lib/url-conventions.ts +151 -0
  512. package/templates/skills/package.json +5 -0
  513. package/templates/skills/quick-search/SKILL.md +99 -99
  514. package/templates/skills/review/SKILL.md +56 -0
  515. package/templates/skills/smoke-generation/SKILL.md +18 -16
  516. package/templates/skills/ui-components/SKILL.md +136 -457
  517. package/templates/skills/upgrade/SKILL.md +36 -0
  518. package/templates/skills/utils/SKILL.md +45 -44
  519. package/templates/skills/utils/subcommands/test-web-config.md +152 -152
  520. package/templates/skills/utils/subcommands/test-web.md +123 -123
  521. package/templates/skills/validate-feature/SKILL.md +102 -101
  522. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
  523. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
  524. package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
  525. package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
  526. package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
  527. package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
  528. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
  529. package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
  530. package/templates/skills/validation/conventions/SKILL.md +193 -0
  531. package/templates/skills/validation/conventions/cli/validate-conventions/execute.ts +368 -0
  532. package/templates/skills/validation/conventions/cli/validate-conventions/index.ts +67 -0
  533. package/templates/skills/validation/conventions/cli/validate-conventions/types.ts +91 -0
  534. package/templates/skills/validation/conventions/cli/validate-conventions/validate.ts +36 -0
  535. package/templates/skills/validation/cross-validate/SKILL.md +83 -0
  536. package/templates/skills/validation/cross-validate/cli/execute.ts +576 -0
  537. package/templates/skills/validation/cross-validate/cli/index.ts +87 -0
  538. package/templates/skills/validation/cross-validate/cli/types.ts +85 -0
  539. package/templates/skills/validation/cross-validate/cli/validate.ts +54 -0
  540. package/templates/skills/validation/eslint/SKILL.md +65 -0
  541. package/templates/skills/validation/eslint/cli/execute.ts +413 -0
  542. package/templates/skills/validation/eslint/cli/index.ts +102 -0
  543. package/templates/skills/validation/eslint/cli/types.ts +48 -0
  544. package/templates/skills/validation/eslint/cli/validate.ts +43 -0
  545. package/templates/skills/validation/project-inventory/SKILL.md +166 -0
  546. package/templates/skills/validation/project-inventory/cli/project-inventory/execute.ts +397 -0
  547. package/templates/skills/validation/project-inventory/cli/project-inventory/index.ts +80 -0
  548. package/templates/skills/validation/project-inventory/cli/project-inventory/types.ts +89 -0
  549. package/templates/skills/validation/project-inventory/cli/project-inventory/validate.ts +35 -0
  550. package/templates/skills/validation/readiness-report/SKILL.md +109 -0
  551. package/templates/skills/validation/readiness-report/cli/execute.ts +236 -0
  552. package/templates/skills/validation/readiness-report/cli/index.ts +234 -0
  553. package/templates/skills/validation/readiness-report/cli/types.ts +61 -0
  554. package/templates/skills/validation/readiness-report/cli/validate.ts +54 -0
  555. package/templates/skills/validation/roslyn/SKILL.md +103 -0
  556. package/templates/skills/validation/roslyn/cli/execute.ts +616 -0
  557. package/templates/skills/validation/roslyn/cli/index.ts +86 -0
  558. package/templates/skills/validation/roslyn/cli/types.ts +50 -0
  559. package/templates/skills/validation/roslyn/cli/validate.ts +43 -0
  560. package/.documentation/apex.html +0 -649
  561. package/dist/mcp-entry.mjs +0 -68888
  562. package/dist/mcp-entry.mjs.map +0 -1
  563. package/scripts/extract-api-endpoints.ts +0 -325
  564. package/scripts/extract-business-rules.ts +0 -440
  565. package/scripts/generate-doc-with-mock-ui.ts +0 -804
  566. package/templates/agents/ba-reader.md +0 -386
  567. package/templates/agents/ba-writer.md +0 -810
  568. package/templates/agents/efcore/migration.md +0 -204
  569. package/templates/agents/efcore/rebase-snapshot.md +0 -202
  570. package/templates/agents/efcore/squash.md +0 -269
  571. package/templates/agents/gitflow/abort.md +0 -45
  572. package/templates/agents/gitflow/cleanup.md +0 -107
  573. package/templates/agents/gitflow/commit.md +0 -236
  574. package/templates/agents/gitflow/exec.md +0 -48
  575. package/templates/agents/gitflow/finish.md +0 -146
  576. package/templates/agents/gitflow/init-clone.md +0 -199
  577. package/templates/agents/gitflow/init-detect.md +0 -137
  578. package/templates/agents/gitflow/init-validate.md +0 -225
  579. package/templates/agents/gitflow/init.md +0 -509
  580. package/templates/agents/gitflow/merge.md +0 -145
  581. package/templates/agents/gitflow/plan.md +0 -42
  582. package/templates/agents/gitflow/pr.md +0 -191
  583. package/templates/agents/gitflow/review.md +0 -49
  584. package/templates/agents/gitflow/start.md +0 -147
  585. package/templates/agents/gitflow/status.md +0 -95
  586. package/templates/agents/mcp-healthcheck.md +0 -163
  587. package/templates/hooks/docs-drift-check.md +0 -96
  588. package/templates/hooks/ef-migration-check.md +0 -139
  589. package/templates/hooks/mcp-check.md +0 -64
  590. package/templates/hooks/ralph-mcp-logger.sh +0 -46
  591. package/templates/mcp-scaffolding/component.tsx.hbs +0 -318
  592. package/templates/mcp-scaffolding/controller.cs.hbs +0 -118
  593. package/templates/mcp-scaffolding/entity-extension.cs.hbs +0 -239
  594. package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +0 -117
  595. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +0 -133
  596. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +0 -261
  597. package/templates/mcp-scaffolding/service-extension.cs.hbs +0 -53
  598. package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +0 -436
  599. package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +0 -239
  600. package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +0 -441
  601. package/templates/mcp-scaffolding/tests/security.test.cs.hbs +0 -442
  602. package/templates/mcp-scaffolding/tests/service.test.cs.hbs +0 -402
  603. package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +0 -428
  604. package/templates/skills/_resources/config-safety.md +0 -61
  605. package/templates/skills/_resources/context-digest-template.md +0 -53
  606. package/templates/skills/_resources/doc-context-cache.md +0 -60
  607. package/templates/skills/_resources/docs-manifest-schema.md +0 -155
  608. package/templates/skills/_resources/formatting-guide.md +0 -124
  609. package/templates/skills/_resources/mcp-validate-documentation-spec.md +0 -181
  610. package/templates/skills/_shared.md +0 -228
  611. package/templates/skills/admin/SKILL.md +0 -48
  612. package/templates/skills/ai-prompt/SKILL.md +0 -171
  613. package/templates/skills/ai-prompt/references/ai-agent-modes.md +0 -89
  614. package/templates/skills/ai-prompt/references/eval-framework.md +0 -129
  615. package/templates/skills/ai-prompt/steps/step-00-init.md +0 -47
  616. package/templates/skills/ai-prompt/steps/step-01-implementation.md +0 -122
  617. package/templates/skills/apex/SKILL.md +0 -234
  618. package/templates/skills/apex/_shared.md +0 -197
  619. package/templates/skills/apex/references/analysis-methods.md +0 -178
  620. package/templates/skills/apex/references/challenge-questions.md +0 -359
  621. package/templates/skills/apex/references/checks/architecture-checks.sh +0 -154
  622. package/templates/skills/apex/references/checks/backend-checks.sh +0 -208
  623. package/templates/skills/apex/references/checks/frontend-checks.sh +0 -560
  624. package/templates/skills/apex/references/checks/infrastructure-checks.sh +0 -292
  625. package/templates/skills/apex/references/checks/security-checks.sh +0 -153
  626. package/templates/skills/apex/references/checks/seed-checks.sh +0 -610
  627. package/templates/skills/apex/references/code-generation.md +0 -412
  628. package/templates/skills/apex/references/core-seed-data.md +0 -1502
  629. package/templates/skills/apex/references/domain-events-pattern.md +0 -45
  630. package/templates/skills/apex/references/entity-hooks-pattern.md +0 -68
  631. package/templates/skills/apex/references/error-classification.md +0 -168
  632. package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +0 -91
  633. package/templates/skills/apex/references/licensing-enforcement.md +0 -52
  634. package/templates/skills/apex/references/parallel-execution.md +0 -187
  635. package/templates/skills/apex/references/person-extension-pattern.md +0 -619
  636. package/templates/skills/apex/references/post-checks.md +0 -162
  637. package/templates/skills/apex/references/smartstack-api.md +0 -591
  638. package/templates/skills/apex/references/smartstack-frontend-compliance.md +0 -616
  639. package/templates/skills/apex/references/smartstack-frontend.md +0 -442
  640. package/templates/skills/apex/references/smartstack-layers.md +0 -551
  641. package/templates/skills/apex/steps/step-00-init.md +0 -405
  642. package/templates/skills/apex/steps/step-01-analyze.md +0 -210
  643. package/templates/skills/apex/steps/step-02-plan.md +0 -303
  644. package/templates/skills/apex/steps/step-03-execute.md +0 -194
  645. package/templates/skills/apex/steps/step-03a-layer0-domain.md +0 -144
  646. package/templates/skills/apex/steps/step-03b-layer1-seed.md +0 -339
  647. package/templates/skills/apex/steps/step-03c-layer2-backend.md +0 -401
  648. package/templates/skills/apex/steps/step-03d-layer3-frontend.md +0 -562
  649. package/templates/skills/apex/steps/step-03e-layer4-devdata.md +0 -46
  650. package/templates/skills/apex/steps/step-04-examine.md +0 -404
  651. package/templates/skills/apex/steps/step-05-deep-review.md +0 -140
  652. package/templates/skills/apex/steps/step-06-resolve.md +0 -120
  653. package/templates/skills/apex/steps/step-07-tests.md +0 -271
  654. package/templates/skills/apex/steps/step-08-run-tests.md +0 -135
  655. package/templates/skills/apex-verify/SKILL.md +0 -110
  656. package/templates/skills/apex-verify/references/audit-rules.md +0 -50
  657. package/templates/skills/apex-verify/steps/step-00-init.md +0 -119
  658. package/templates/skills/apex-verify/steps/step-01-nav-audit.md +0 -96
  659. package/templates/skills/apex-verify/steps/step-02-crud-audit.md +0 -127
  660. package/templates/skills/apex-verify/steps/step-03-perm-audit.md +0 -119
  661. package/templates/skills/apex-verify/steps/step-04-route-audit.md +0 -98
  662. package/templates/skills/apex-verify/steps/step-05-report.md +0 -110
  663. package/templates/skills/application/SKILL.md +0 -241
  664. package/templates/skills/application/references/application-roles-template.md +0 -228
  665. package/templates/skills/application/references/backend-controller-hierarchy.md +0 -68
  666. package/templates/skills/application/references/backend-entity-seeding.md +0 -73
  667. package/templates/skills/application/references/backend-seeding-and-dto-output.md +0 -83
  668. package/templates/skills/application/references/backend-table-prefix-mapping.md +0 -80
  669. package/templates/skills/application/references/backend-verification.md +0 -88
  670. package/templates/skills/application/references/contexts-cheatsheet.md +0 -86
  671. package/templates/skills/application/references/extensions-system.md +0 -158
  672. package/templates/skills/application/references/frontend-i18n-and-output.md +0 -67
  673. package/templates/skills/application/references/frontend-route-naming.md +0 -123
  674. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +0 -91
  675. package/templates/skills/application/references/frontend-verification.md +0 -158
  676. package/templates/skills/application/references/init-parameter-detection.md +0 -121
  677. package/templates/skills/application/references/migration-checklist-troubleshooting.md +0 -88
  678. package/templates/skills/application/references/nav-fallback-procedure.md +0 -198
  679. package/templates/skills/application/references/provider-template.md +0 -191
  680. package/templates/skills/application/references/roles-client-project-handling.md +0 -55
  681. package/templates/skills/application/references/roles-fallback-procedure.md +0 -144
  682. package/templates/skills/application/references/smartstack-provider.md +0 -118
  683. package/templates/skills/application/references/test-coverage-requirements.md +0 -213
  684. package/templates/skills/application/references/test-frontend.md +0 -73
  685. package/templates/skills/application/references/test-prerequisites.md +0 -72
  686. package/templates/skills/application/references/themes-db-driven.md +0 -484
  687. package/templates/skills/application/steps/step-00-init.md +0 -130
  688. package/templates/skills/application/steps/step-01-navigation.md +0 -170
  689. package/templates/skills/application/steps/step-02-permissions.md +0 -196
  690. package/templates/skills/application/steps/step-03-roles.md +0 -182
  691. package/templates/skills/application/steps/step-03b-provider.md +0 -134
  692. package/templates/skills/application/steps/step-04-backend.md +0 -174
  693. package/templates/skills/application/steps/step-05-frontend.md +0 -189
  694. package/templates/skills/application/steps/step-06-migration.md +0 -189
  695. package/templates/skills/application/steps/step-07-tests.md +0 -356
  696. package/templates/skills/application/steps/step-08-documentation.md +0 -137
  697. package/templates/skills/application/templates-backend.md +0 -463
  698. package/templates/skills/application/templates-frontend.md +0 -950
  699. package/templates/skills/application/templates-i18n.md +0 -520
  700. package/templates/skills/application/templates-seed.md +0 -1110
  701. package/templates/skills/audit-route/SKILL.md +0 -107
  702. package/templates/skills/audit-route/references/routing-pattern.md +0 -131
  703. package/templates/skills/audit-route/steps/step-00-init.md +0 -128
  704. package/templates/skills/audit-route/steps/step-01-inventory.md +0 -157
  705. package/templates/skills/audit-route/steps/step-02-conformity.md +0 -193
  706. package/templates/skills/audit-route/steps/step-03-report.md +0 -201
  707. package/templates/skills/business-analyse/SKILL.md +0 -252
  708. package/templates/skills/business-analyse/_shared.md +0 -276
  709. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +0 -560
  710. package/templates/skills/business-analyse/questionnaire/01-context.md +0 -43
  711. package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +0 -111
  712. package/templates/skills/business-analyse/questionnaire/03-data-ui.md +0 -125
  713. package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +0 -6
  714. package/templates/skills/business-analyse/questionnaire/05-cross-module.md +0 -69
  715. package/templates/skills/business-analyse/questionnaire.md +0 -156
  716. package/templates/skills/business-analyse/react/application-viewer.md +0 -242
  717. package/templates/skills/business-analyse/react/components.md +0 -532
  718. package/templates/skills/business-analyse/react/i18n-template.md +0 -306
  719. package/templates/skills/business-analyse/react/schema.md +0 -831
  720. package/templates/skills/business-analyse/references/03-json-schemas.md +0 -221
  721. package/templates/skills/business-analyse/references/03-post-check-validation.md +0 -208
  722. package/templates/skills/business-analyse/references/03-smartstack-entity-guards.md +0 -32
  723. package/templates/skills/business-analyse/references/04-cross-module-validation.md +0 -95
  724. package/templates/skills/business-analyse/references/04-file-allocation.md +0 -162
  725. package/templates/skills/business-analyse/references/04-naming-audit-checks.md +0 -174
  726. package/templates/skills/business-analyse/references/04-semantic-validation-matrix.md +0 -118
  727. package/templates/skills/business-analyse/references/acceptance-criteria.md +0 -164
  728. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +0 -190
  729. package/templates/skills/business-analyse/references/canonical-json-formats.md +0 -204
  730. package/templates/skills/business-analyse/references/compilation-structure-cards.md +0 -297
  731. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +0 -124
  732. package/templates/skills/business-analyse/references/detection-strategies.md +0 -424
  733. package/templates/skills/business-analyse/references/domain-research-playbook.md +0 -234
  734. package/templates/skills/business-analyse/references/entity-architecture-decision.md +0 -240
  735. package/templates/skills/business-analyse/references/entity-sourcing-presentation.md +0 -166
  736. package/templates/skills/business-analyse/references/init-resume-logic.md +0 -70
  737. package/templates/skills/business-analyse/references/init-schema-deployment.md +0 -65
  738. package/templates/skills/business-analyse/references/module-completeness-challenge.md +0 -174
  739. package/templates/skills/business-analyse/references/multi-app-detection.md +0 -149
  740. package/templates/skills/business-analyse/references/naming-conventions.md +0 -253
  741. package/templates/skills/business-analyse/references/portal-classification.md +0 -52
  742. package/templates/skills/business-analyse/references/robustness-checks.md +0 -426
  743. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +0 -85
  744. package/templates/skills/business-analyse/references/ui-resource-cards.md +0 -259
  745. package/templates/skills/business-analyse/references/validation-checklist.md +0 -378
  746. package/templates/skills/business-analyse/schemas/application-schema.json +0 -481
  747. package/templates/skills/business-analyse/schemas/feature-schema.json +0 -53
  748. package/templates/skills/business-analyse/schemas/index-schema.json +0 -47
  749. package/templates/skills/business-analyse/schemas/project-schema.json +0 -481
  750. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +0 -245
  751. package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +0 -80
  752. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +0 -82
  753. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +0 -70
  754. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +0 -567
  755. package/templates/skills/business-analyse/schemas/sections/validation-schema.json +0 -93
  756. package/templates/skills/business-analyse/schemas/shared/common-defs.json +0 -227
  757. package/templates/skills/business-analyse/steps/step-00-init.md +0 -463
  758. package/templates/skills/business-analyse/steps/step-01-cadrage.md +0 -901
  759. package/templates/skills/business-analyse/steps/step-02-structure.md +0 -315
  760. package/templates/skills/business-analyse/steps/step-03-specify.md +0 -986
  761. package/templates/skills/business-analyse/steps/step-04-consolidate.md +0 -928
  762. package/templates/skills/business-analyse/templates/tpl-frd.md +0 -168
  763. package/templates/skills/business-analyse/templates/tpl-handoff.md +0 -189
  764. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +0 -59
  765. package/templates/skills/business-analyse/templates-frd.md +0 -476
  766. package/templates/skills/business-analyse/templates-react.md +0 -574
  767. package/templates/skills/business-analyse-design/SKILL.md +0 -101
  768. package/templates/skills/business-analyse-design/references/screens-post-check.md +0 -221
  769. package/templates/skills/business-analyse-design/references/screens-type-mapping.md +0 -138
  770. package/templates/skills/business-analyse-design/references/smartcomponents-templates.md +0 -225
  771. package/templates/skills/business-analyse-design/references/spec-auto-inference.md +0 -117
  772. package/templates/skills/business-analyse-design/steps/step-01-screens.md +0 -108
  773. package/templates/skills/business-analyse-design/steps/step-02-wireframes.md +0 -155
  774. package/templates/skills/business-analyse-design/steps/step-03-navigation.md +0 -189
  775. package/templates/skills/business-analyse-develop/SKILL.md +0 -250
  776. package/templates/skills/business-analyse-develop/references/category-completeness.md +0 -326
  777. package/templates/skills/business-analyse-develop/references/category-rules.md +0 -109
  778. package/templates/skills/business-analyse-develop/references/compact-loop.md +0 -478
  779. package/templates/skills/business-analyse-develop/references/handoff-quality-gate.md +0 -132
  780. package/templates/skills/business-analyse-develop/references/init-resume-recovery.md +0 -183
  781. package/templates/skills/business-analyse-develop/references/module-transition.md +0 -246
  782. package/templates/skills/business-analyse-develop/references/multi-module-queue.md +0 -171
  783. package/templates/skills/business-analyse-develop/references/parallel-execution.md +0 -246
  784. package/templates/skills/business-analyse-develop/references/prd-v3-transformation.md +0 -326
  785. package/templates/skills/business-analyse-develop/references/quality-gates.md +0 -160
  786. package/templates/skills/business-analyse-develop/references/report-reconciliation.md +0 -140
  787. package/templates/skills/business-analyse-develop/references/report-template.md +0 -142
  788. package/templates/skills/business-analyse-develop/references/section-splitting.md +0 -439
  789. package/templates/skills/business-analyse-develop/references/task-transform-legacy.md +0 -256
  790. package/templates/skills/business-analyse-develop/references/team-orchestration.md +0 -547
  791. package/templates/skills/business-analyse-develop/steps/step-00-init.md +0 -242
  792. package/templates/skills/business-analyse-develop/steps/step-01-task.md +0 -182
  793. package/templates/skills/business-analyse-develop/steps/step-01-v4-execute.md +0 -139
  794. package/templates/skills/business-analyse-develop/steps/step-02-execute.md +0 -216
  795. package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +0 -176
  796. package/templates/skills/business-analyse-develop/steps/step-03-commit.md +0 -107
  797. package/templates/skills/business-analyse-develop/steps/step-04-check.md +0 -419
  798. package/templates/skills/business-analyse-develop/steps/step-05-report.md +0 -137
  799. package/templates/skills/business-analyse-handoff/SKILL.md +0 -101
  800. package/templates/skills/business-analyse-handoff/references/acceptance-criteria.md +0 -318
  801. package/templates/skills/business-analyse-handoff/references/agent-handoff-transform-prompt.md +0 -211
  802. package/templates/skills/business-analyse-handoff/references/context-isolation-pattern.md +0 -47
  803. package/templates/skills/business-analyse-handoff/references/entity-canonicalization.md +0 -158
  804. package/templates/skills/business-analyse-handoff/references/entity-domain-mapping.md +0 -115
  805. package/templates/skills/business-analyse-handoff/references/handoff-file-inventory.md +0 -49
  806. package/templates/skills/business-analyse-handoff/references/handoff-file-templates.md +0 -197
  807. package/templates/skills/business-analyse-handoff/references/handoff-global-validation.md +0 -142
  808. package/templates/skills/business-analyse-handoff/references/handoff-mappings.md +0 -108
  809. package/templates/skills/business-analyse-handoff/references/handoff-seeddata-generation.md +0 -314
  810. package/templates/skills/business-analyse-handoff/references/prd-generation.md +0 -362
  811. package/templates/skills/business-analyse-handoff/references/prd-validation-checks.md +0 -125
  812. package/templates/skills/business-analyse-handoff/references/project-index-update.md +0 -98
  813. package/templates/skills/business-analyse-handoff/references/readiness-scoring.md +0 -95
  814. package/templates/skills/business-analyse-handoff/schemas/handoff-schema.json +0 -95
  815. package/templates/skills/business-analyse-handoff/steps/step-00-validate.md +0 -158
  816. package/templates/skills/business-analyse-handoff/steps/step-01-transform.md +0 -85
  817. package/templates/skills/business-analyse-handoff/steps/step-02-export.md +0 -169
  818. package/templates/skills/business-analyse-handoff/templates/tpl-progress.md +0 -172
  819. package/templates/skills/business-analyse-html/SKILL.md +0 -89
  820. package/templates/skills/business-analyse-html/html/ba-interactive.html +0 -6134
  821. package/templates/skills/business-analyse-html/html/build-html.js +0 -137
  822. package/templates/skills/business-analyse-html/html/src/partials/cadrage-context.html +0 -34
  823. package/templates/skills/business-analyse-html/html/src/partials/cadrage-scope.html +0 -27
  824. package/templates/skills/business-analyse-html/html/src/partials/cadrage-stakeholders.html +0 -55
  825. package/templates/skills/business-analyse-html/html/src/partials/cadrage-success.html +0 -34
  826. package/templates/skills/business-analyse-html/html/src/partials/consol-datamodel.html +0 -8
  827. package/templates/skills/business-analyse-html/html/src/partials/consol-flows.html +0 -29
  828. package/templates/skills/business-analyse-html/html/src/partials/consol-interactions.html +0 -8
  829. package/templates/skills/business-analyse-html/html/src/partials/consol-permissions.html +0 -8
  830. package/templates/skills/business-analyse-html/html/src/partials/decomp-dependencies.html +0 -38
  831. package/templates/skills/business-analyse-html/html/src/partials/decomp-modules.html +0 -43
  832. package/templates/skills/business-analyse-html/html/src/partials/handoff-summary.html +0 -24
  833. package/templates/skills/business-analyse-html/html/src/partials/module-spec-container.html +0 -4
  834. package/templates/skills/business-analyse-html/html/src/scripts/01-data-init.js +0 -313
  835. package/templates/skills/business-analyse-html/html/src/scripts/02-navigation.js +0 -316
  836. package/templates/skills/business-analyse-html/html/src/scripts/03-render-cadrage.js +0 -162
  837. package/templates/skills/business-analyse-html/html/src/scripts/04-render-modules.js +0 -203
  838. package/templates/skills/business-analyse-html/html/src/scripts/05-render-specs.js +0 -866
  839. package/templates/skills/business-analyse-html/html/src/scripts/06-render-consolidation.js +0 -196
  840. package/templates/skills/business-analyse-html/html/src/scripts/06-render-mockups.js +0 -564
  841. package/templates/skills/business-analyse-html/html/src/scripts/07-render-handoff.js +0 -108
  842. package/templates/skills/business-analyse-html/html/src/scripts/08-editing.js +0 -137
  843. package/templates/skills/business-analyse-html/html/src/scripts/09-export.js +0 -138
  844. package/templates/skills/business-analyse-html/html/src/scripts/10-comments.js +0 -221
  845. package/templates/skills/business-analyse-html/html/src/scripts/11-review-panel.js +0 -167
  846. package/templates/skills/business-analyse-html/html/src/scripts/12-render-diagrams.js +0 -162
  847. package/templates/skills/business-analyse-html/html/src/styles/01-variables.css +0 -38
  848. package/templates/skills/business-analyse-html/html/src/styles/02-layout.css +0 -216
  849. package/templates/skills/business-analyse-html/html/src/styles/03-navigation.css +0 -120
  850. package/templates/skills/business-analyse-html/html/src/styles/04-cards.css +0 -194
  851. package/templates/skills/business-analyse-html/html/src/styles/05-modules.css +0 -518
  852. package/templates/skills/business-analyse-html/html/src/styles/06-wireframes.css +0 -263
  853. package/templates/skills/business-analyse-html/html/src/styles/07-comments.css +0 -184
  854. package/templates/skills/business-analyse-html/html/src/styles/08-review-panel.css +0 -241
  855. package/templates/skills/business-analyse-html/html/src/styles/09-mockups-html.css +0 -220
  856. package/templates/skills/business-analyse-html/html/src/styles/10-diagrams.css +0 -73
  857. package/templates/skills/business-analyse-html/html/src/template.html +0 -449
  858. package/templates/skills/business-analyse-html/references/02-embedded-artifacts-building.md +0 -144
  859. package/templates/skills/business-analyse-html/references/02-feature-data-building.md +0 -143
  860. package/templates/skills/business-analyse-html/references/02-mapping-tables.md +0 -442
  861. package/templates/skills/business-analyse-html/references/02-normalization-helpers.md +0 -139
  862. package/templates/skills/business-analyse-html/references/02-screen-format-detection.md +0 -283
  863. package/templates/skills/business-analyse-html/references/02-self-check-validation.md +0 -199
  864. package/templates/skills/business-analyse-html/references/data-build.md +0 -215
  865. package/templates/skills/business-analyse-html/references/data-mapping.md +0 -452
  866. package/templates/skills/business-analyse-html/references/output-modes.md +0 -119
  867. package/templates/skills/business-analyse-html/references/wireframe-svg-style-guide.md +0 -335
  868. package/templates/skills/business-analyse-html/steps/step-01-collect.md +0 -140
  869. package/templates/skills/business-analyse-html/steps/step-02-build-data.md +0 -76
  870. package/templates/skills/business-analyse-html/steps/step-03-render.md +0 -95
  871. package/templates/skills/business-analyse-html/steps/step-04-verify.md +0 -224
  872. package/templates/skills/business-analyse-quick/SKILL.md +0 -807
  873. package/templates/skills/business-analyse-quick/references/domain-heuristics.md +0 -172
  874. package/templates/skills/business-analyse-quick/references/prd-schema.md +0 -268
  875. package/templates/skills/business-analyse-review/SKILL.md +0 -71
  876. package/templates/skills/business-analyse-review/references/review-data-mapping.md +0 -367
  877. package/templates/skills/business-analyse-review/steps/step-00-init.md +0 -111
  878. package/templates/skills/business-analyse-review/steps/step-01-apply.md +0 -304
  879. package/templates/skills/business-analyse-status/SKILL.md +0 -136
  880. package/templates/skills/cc-agent/SKILL.md +0 -129
  881. package/templates/skills/cc-agent/references/agent-behavior-patterns.md +0 -95
  882. package/templates/skills/cc-agent/references/agent-frontmatter.md +0 -213
  883. package/templates/skills/cc-agent/references/permission-modes.md +0 -102
  884. package/templates/skills/cc-agent/references/tools-reference.md +0 -144
  885. package/templates/skills/cc-agent/steps/step-00-init.md +0 -134
  886. package/templates/skills/cc-agent/steps/step-01-design.md +0 -186
  887. package/templates/skills/cc-agent/steps/step-02-generate.md +0 -131
  888. package/templates/skills/cc-agent/steps/step-03-validate.md +0 -130
  889. package/templates/skills/cc-agent/templates/agent-categorized.md +0 -67
  890. package/templates/skills/cc-agent/templates/agent-standalone.md +0 -56
  891. package/templates/skills/cc-agent/templates/agent-with-skills.md +0 -94
  892. package/templates/skills/cc-audit/SKILL.md +0 -108
  893. package/templates/skills/cc-audit/references/agent-checklist.md +0 -91
  894. package/templates/skills/cc-audit/references/hook-checklist.md +0 -110
  895. package/templates/skills/cc-audit/references/skill-checklist.md +0 -70
  896. package/templates/skills/cc-audit/steps/step-00-init.md +0 -98
  897. package/templates/skills/cc-audit/steps/step-01-scan.md +0 -142
  898. package/templates/skills/cc-audit/steps/step-02-analyze.md +0 -158
  899. package/templates/skills/cc-audit/steps/step-03-report.md +0 -142
  900. package/templates/skills/cc-skill/SKILL.md +0 -134
  901. package/templates/skills/cc-skill/references/best-practices.md +0 -167
  902. package/templates/skills/cc-skill/references/frontmatter-reference.md +0 -182
  903. package/templates/skills/cc-skill/references/skill-patterns.md +0 -199
  904. package/templates/skills/cc-skill/steps/step-00-init.md +0 -119
  905. package/templates/skills/cc-skill/steps/step-01-design.md +0 -199
  906. package/templates/skills/cc-skill/steps/step-02-generate.md +0 -145
  907. package/templates/skills/cc-skill/steps/step-03-steps.md +0 -151
  908. package/templates/skills/cc-skill/steps/step-04-validate.md +0 -124
  909. package/templates/skills/cc-skill/templates/skill-forked.md +0 -85
  910. package/templates/skills/cc-skill/templates/skill-progressive.md +0 -102
  911. package/templates/skills/cc-skill/templates/skill-simple.md +0 -75
  912. package/templates/skills/cc-skill/templates/step-template.md +0 -82
  913. package/templates/skills/controller/SKILL.md +0 -162
  914. package/templates/skills/controller/postman-templates.md +0 -614
  915. package/templates/skills/controller/references/controller-code-templates.md +0 -162
  916. package/templates/skills/controller/references/mcp-scaffold-workflow.md +0 -237
  917. package/templates/skills/controller/references/permission-sync-templates.md +0 -149
  918. package/templates/skills/controller/steps/step-00-init.md +0 -193
  919. package/templates/skills/controller/steps/step-01-analyze.md +0 -152
  920. package/templates/skills/controller/steps/step-02-plan.md +0 -176
  921. package/templates/skills/controller/steps/step-03-generate.md +0 -189
  922. package/templates/skills/controller/steps/step-04-perms.md +0 -80
  923. package/templates/skills/controller/steps/step-05-validate.md +0 -107
  924. package/templates/skills/controller/templates.md +0 -1556
  925. package/templates/skills/debug/SKILL.md +0 -70
  926. package/templates/skills/debug/references/team-protocol.md +0 -232
  927. package/templates/skills/debug/steps/step-00-init.md +0 -57
  928. package/templates/skills/debug/steps/step-01-analyze.md +0 -219
  929. package/templates/skills/debug/steps/step-02-resolve.md +0 -85
  930. package/templates/skills/efcore/references/database-operations.md +0 -66
  931. package/templates/skills/efcore/references/reset-operations.md +0 -81
  932. package/templates/skills/efcore/references/seed-methods.md +0 -86
  933. package/templates/skills/efcore/references/shared-init-functions.md +0 -250
  934. package/templates/skills/efcore/references/sql-objects-injection.md +0 -19
  935. package/templates/skills/efcore/references/troubleshooting.md +0 -81
  936. package/templates/skills/efcore/references/zero-downtime-patterns.md +0 -229
  937. package/templates/skills/explore/SKILL.md +0 -98
  938. package/templates/skills/feature-full/SKILL.md +0 -111
  939. package/templates/skills/feature-full/steps/step-00-init.md +0 -57
  940. package/templates/skills/feature-full/steps/step-01-implementation.md +0 -133
  941. package/templates/skills/gitflow/phases/abort.md +0 -189
  942. package/templates/skills/gitflow/phases/cleanup.md +0 -264
  943. package/templates/skills/gitflow/phases/status.md +0 -192
  944. package/templates/skills/gitflow/references/commit-message-generation.md +0 -58
  945. package/templates/skills/gitflow/references/commit-migration-validation.md +0 -53
  946. package/templates/skills/gitflow/references/finish-cleanup.md +0 -55
  947. package/templates/skills/gitflow/references/finish-version-bumping.md +0 -45
  948. package/templates/skills/gitflow/references/init-config-template.md +0 -143
  949. package/templates/skills/gitflow/references/init-environment-detection.md +0 -41
  950. package/templates/skills/gitflow/references/init-name-normalization.md +0 -118
  951. package/templates/skills/gitflow/references/init-questions.md +0 -193
  952. package/templates/skills/gitflow/references/init-structure-creation.md +0 -75
  953. package/templates/skills/gitflow/references/init-version-detection.md +0 -23
  954. package/templates/skills/gitflow/references/init-workspace-detection.md +0 -43
  955. package/templates/skills/gitflow/references/merge-ci-status.md +0 -36
  956. package/templates/skills/gitflow/references/merge-execution.md +0 -62
  957. package/templates/skills/gitflow/references/merge-pr-context.md +0 -76
  958. package/templates/skills/gitflow/references/plan-template.md +0 -69
  959. package/templates/skills/gitflow/references/pr-build-checks.md +0 -60
  960. package/templates/skills/gitflow/references/pr-generation.md +0 -58
  961. package/templates/skills/gitflow/references/start-branch-normalization.md +0 -28
  962. package/templates/skills/gitflow/references/start-efcore-preflight.md +0 -70
  963. package/templates/skills/gitflow/references/start-local-config.md +0 -113
  964. package/templates/skills/gitflow/references/start-worktree-creation.md +0 -50
  965. package/templates/skills/gitflow/references/sync-push-verify.md +0 -44
  966. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +0 -38
  967. package/templates/skills/gitflow/steps/step-commit.md +0 -199
  968. package/templates/skills/gitflow/steps/step-finish.md +0 -147
  969. package/templates/skills/gitflow/steps/step-init.md +0 -230
  970. package/templates/skills/gitflow/steps/step-merge.md +0 -85
  971. package/templates/skills/gitflow/steps/step-plan.md +0 -151
  972. package/templates/skills/gitflow/steps/step-pr.md +0 -247
  973. package/templates/skills/gitflow/steps/step-start.md +0 -195
  974. package/templates/skills/gitflow/steps/step-sync.md +0 -161
  975. package/templates/skills/gitflow/templates/config.json +0 -72
  976. package/templates/skills/mcp/SKILL.md +0 -62
  977. package/templates/skills/mcp/steps/step-01-healthcheck.md +0 -108
  978. package/templates/skills/mcp/steps/step-02-tools.md +0 -73
  979. package/templates/skills/migrate/SKILL.md +0 -312
  980. package/templates/skills/migrate/references/v3.34-to-v3.46.md +0 -289
  981. package/templates/skills/notification/SKILL.md +0 -173
  982. package/templates/skills/refactor/SKILL.md +0 -56
  983. package/templates/skills/refactor/steps/step-01-discover.md +0 -60
  984. package/templates/skills/refactor/steps/step-02-execute.md +0 -67
  985. package/templates/skills/review-code/SKILL.md +0 -95
  986. package/templates/skills/review-code/references/clean-code-principles.md +0 -292
  987. package/templates/skills/review-code/references/code-quality-metrics.md +0 -174
  988. package/templates/skills/review-code/references/feedback-patterns.md +0 -149
  989. package/templates/skills/review-code/references/owasp-api-top10.md +0 -243
  990. package/templates/skills/review-code/references/security-checklist.md +0 -212
  991. package/templates/skills/review-code/references/smartstack-conventions.md +0 -568
  992. package/templates/skills/review-code/steps/step-01-smartstack.md +0 -96
  993. package/templates/skills/review-code/steps/step-02-detailed-review.md +0 -80
  994. package/templates/skills/review-code/steps/step-03-react.md +0 -44
  995. package/templates/skills/sketch/SKILL.md +0 -34
  996. package/templates/skills/ui-components/accessibility.md +0 -170
  997. package/templates/skills/ui-components/patterns/dashboard-chart.md +0 -327
  998. package/templates/skills/ui-components/patterns/data-table.md +0 -175
  999. package/templates/skills/ui-components/patterns/entity-card.md +0 -77
  1000. package/templates/skills/ui-components/patterns/grid-layout.md +0 -91
  1001. package/templates/skills/ui-components/patterns/kanban.md +0 -43
  1002. package/templates/skills/ui-components/references/component-catalog.md +0 -82
  1003. package/templates/skills/ui-components/responsive-guidelines.md +0 -278
  1004. package/templates/skills/ui-components/style-guide.md +0 -113
  1005. package/templates/skills/validate/SKILL.md +0 -181
  1006. package/templates/skills/workflow/SKILL.md +0 -196
  1007. package/templates/skills/workflow/steps/step-00-init.md +0 -57
  1008. package/templates/skills/workflow/steps/step-01-implementation.md +0 -84
@@ -0,0 +1,842 @@
1
+ /**
2
+ * cli:scaffold-business — generate.ts
3
+ * Generates CQRS stack: Commands, Queries, Handlers, DTOs, Validators, Service.
4
+ *
5
+ * Generated code consumes NuGet packages:
6
+ * - MediatR (IRequest, IRequestHandler)
7
+ * - FluentValidation (AbstractValidator)
8
+ * - SmartStack.Application.Common.Interfaces.ICoreDbContext
9
+ * - SmartStack.Application.Common.Exceptions.NotFoundException
10
+ * - SmartStack.Application.Common.Models.PaginatedResult
11
+ *
12
+ * Compilation contract: every Command/Query records here has a matching Handler
13
+ * class so MediatR can resolve `IRequestHandler<TRequest, TResponse>` at runtime.
14
+ */
15
+ import type {
16
+ ScaffoldBusinessInput,
17
+ GeneratedFile,
18
+ Field,
19
+ BusinessRule,
20
+ BusinessCustomAction,
21
+ } from './types.js'
22
+
23
+ export function generate(spec: ScaffoldBusinessInput): GeneratedFile[] {
24
+ const ns = spec.namespace ?? spec.appCode
25
+ const mod = capitalize(spec.module)
26
+ const e = spec.name
27
+ const plural = spec.pluralName ?? e + 's'
28
+ const appNs = `${ns}.Application.${mod}`
29
+ const reserved = new Set(['Id', 'CreatedAt', 'UpdatedAt', 'DeletedAt', 'TenantId'])
30
+ // userFields includes computed fields — they appear in read DTOs (List/Detail)
31
+ // but NOT in Create/Update Commands, Dtos, Validators or factory calls.
32
+ const userFields = spec.fields.filter(f => !reserved.has(f.name))
33
+ const storedFields = userFields.filter(f => !f.formula)
34
+ const requiredFields = storedFields.filter(f => f.required)
35
+ const updatableFields = storedFields.filter(f => !f.isKey)
36
+ const storedNames = new Set(storedFields.map(f => f.name))
37
+ // Lookup projection: SQL-translatable display field for {Entity}RefDto.
38
+ // Falls back to Id.ToString() when no string field is available.
39
+ const displayField = pickDisplayField(spec.displayNameExpr, storedFields)
40
+
41
+ const files: GeneratedFile[] = []
42
+
43
+ // 1. DTOs
44
+ files.push({
45
+ path: `src/${ns}.Application/${mod}/DTOs/${e}Dtos.cs`,
46
+ content: `namespace ${appNs}.DTOs;
47
+
48
+ public record ${e}ListDto(
49
+ Guid Id,
50
+ ${userFields.slice(0, 5).map(f => ` ${mapType(f)} ${f.name},`).join('\n')}
51
+ DateTime CreatedAt
52
+ );
53
+
54
+ public record ${e}DetailDto(
55
+ Guid Id,
56
+ ${userFields.map(f => ` ${mapType(f)} ${f.name},`).join('\n')}
57
+ DateTime CreatedAt,
58
+ DateTime UpdatedAt
59
+ );
60
+
61
+ public record Create${e}Dto(
62
+ ${requiredFields.map(f => ` ${mapType(f)} ${f.name}`).join(',\n')}
63
+ );
64
+
65
+ public record Update${e}Dto(
66
+ ${updatableFields.map(f => ` ${mapType(f)} ${f.name}`).join(',\n')}
67
+ );
68
+
69
+ /// <summary>
70
+ /// Lightweight reference DTO returned by GET /api/{module}/{plural}/lookup.
71
+ /// Consumed by the frontend EntityLookup combobox to render FK selectors
72
+ /// (Id is the FK value to persist; DisplayName is the human label).
73
+ /// </summary>
74
+ public record ${e}RefDto(Guid Id, string DisplayName);
75
+ `,
76
+ })
77
+
78
+ // 2. Commands
79
+ files.push({
80
+ path: `src/${ns}.Application/${mod}/Commands/Create${e}Command.cs`,
81
+ content: `using MediatR;
82
+
83
+ namespace ${appNs}.Commands;
84
+
85
+ public record Create${e}Command(${requiredFields.map(f => `${mapType(f)} ${f.name}`).join(', ')}) : IRequest<Guid>;
86
+ `,
87
+ })
88
+
89
+ files.push({
90
+ path: `src/${ns}.Application/${mod}/Commands/Update${e}Command.cs`,
91
+ content: `using MediatR;
92
+
93
+ namespace ${appNs}.Commands;
94
+
95
+ public record Update${e}Command(Guid Id${updatableFields.length > 0 ? ', ' : ''}${updatableFields.map(f => `${mapType(f)} ${f.name}`).join(', ')}) : IRequest<Unit>;
96
+ `,
97
+ })
98
+
99
+ files.push({
100
+ path: `src/${ns}.Application/${mod}/Commands/Delete${e}Command.cs`,
101
+ content: `using MediatR;
102
+
103
+ namespace ${appNs}.Commands;
104
+
105
+ public record Delete${e}Command(Guid Id) : IRequest<Unit>;
106
+ `,
107
+ })
108
+
109
+ // 3. Queries
110
+ files.push({
111
+ path: `src/${ns}.Application/${mod}/Queries/Get${e}Query.cs`,
112
+ content: `using MediatR;
113
+ using SmartStack.Application.Common.Models;
114
+ using ${appNs}.DTOs;
115
+
116
+ namespace ${appNs}.Queries;
117
+
118
+ public record Get${e}Query(Guid Id) : IRequest<${e}DetailDto?>;
119
+ public record Get${plural}Query(int Page = 1, int PageSize = 20, string? Search = null) : IRequest<PaginatedResult<${e}ListDto>>;
120
+
121
+ /// <summary>
122
+ /// Paginated lookup query feeding the frontend EntityLookup combobox.
123
+ /// Search is case-insensitive LIKE on the display field (see ${e}Service.GetLookupAsync).
124
+ /// </summary>
125
+ public record Get${plural}LookupQuery(string? Search = null, int Page = 1, int PageSize = 20) : IRequest<PaginatedResult<${e}RefDto>>;
126
+ `,
127
+ })
128
+
129
+ // 4. Handlers — MANDATORY: MediatR cannot resolve a request without a matching handler.
130
+ files.push({
131
+ path: `src/${ns}.Application/${mod}/Handlers/Create${e}CommandHandler.cs`,
132
+ content: `using MediatR;
133
+ using ${appNs}.Commands;
134
+ using ${appNs}.Interfaces;
135
+
136
+ namespace ${appNs}.Handlers;
137
+
138
+ public class Create${e}CommandHandler : IRequestHandler<Create${e}Command, Guid>
139
+ {
140
+ private readonly I${e}Service _service;
141
+
142
+ public Create${e}CommandHandler(I${e}Service service) => _service = service;
143
+
144
+ public Task<Guid> Handle(Create${e}Command request, CancellationToken cancellationToken)
145
+ => _service.CreateAsync(request, cancellationToken);
146
+ }
147
+ `,
148
+ })
149
+
150
+ files.push({
151
+ path: `src/${ns}.Application/${mod}/Handlers/Update${e}CommandHandler.cs`,
152
+ content: `using MediatR;
153
+ using ${appNs}.Commands;
154
+ using ${appNs}.Interfaces;
155
+
156
+ namespace ${appNs}.Handlers;
157
+
158
+ public class Update${e}CommandHandler : IRequestHandler<Update${e}Command, Unit>
159
+ {
160
+ private readonly I${e}Service _service;
161
+
162
+ public Update${e}CommandHandler(I${e}Service service) => _service = service;
163
+
164
+ public async Task<Unit> Handle(Update${e}Command request, CancellationToken cancellationToken)
165
+ {
166
+ await _service.UpdateAsync(request, cancellationToken);
167
+ return Unit.Value;
168
+ }
169
+ }
170
+ `,
171
+ })
172
+
173
+ files.push({
174
+ path: `src/${ns}.Application/${mod}/Handlers/Delete${e}CommandHandler.cs`,
175
+ content: `using MediatR;
176
+ using ${appNs}.Commands;
177
+ using ${appNs}.Interfaces;
178
+
179
+ namespace ${appNs}.Handlers;
180
+
181
+ public class Delete${e}CommandHandler : IRequestHandler<Delete${e}Command, Unit>
182
+ {
183
+ private readonly I${e}Service _service;
184
+
185
+ public Delete${e}CommandHandler(I${e}Service service) => _service = service;
186
+
187
+ public async Task<Unit> Handle(Delete${e}Command request, CancellationToken cancellationToken)
188
+ {
189
+ await _service.DeleteAsync(request.Id, cancellationToken);
190
+ return Unit.Value;
191
+ }
192
+ }
193
+ `,
194
+ })
195
+
196
+ files.push({
197
+ path: `src/${ns}.Application/${mod}/Handlers/Get${e}QueryHandler.cs`,
198
+ content: `using MediatR;
199
+ using ${appNs}.DTOs;
200
+ using ${appNs}.Interfaces;
201
+ using ${appNs}.Queries;
202
+
203
+ namespace ${appNs}.Handlers;
204
+
205
+ public class Get${e}QueryHandler : IRequestHandler<Get${e}Query, ${e}DetailDto?>
206
+ {
207
+ private readonly I${e}Service _service;
208
+
209
+ public Get${e}QueryHandler(I${e}Service service) => _service = service;
210
+
211
+ public Task<${e}DetailDto?> Handle(Get${e}Query request, CancellationToken cancellationToken)
212
+ => _service.GetByIdAsync(request.Id, cancellationToken);
213
+ }
214
+ `,
215
+ })
216
+
217
+ files.push({
218
+ path: `src/${ns}.Application/${mod}/Handlers/Get${plural}QueryHandler.cs`,
219
+ content: `using MediatR;
220
+ using SmartStack.Application.Common.Models;
221
+ using ${appNs}.DTOs;
222
+ using ${appNs}.Interfaces;
223
+ using ${appNs}.Queries;
224
+
225
+ namespace ${appNs}.Handlers;
226
+
227
+ public class Get${plural}QueryHandler : IRequestHandler<Get${plural}Query, PaginatedResult<${e}ListDto>>
228
+ {
229
+ private readonly I${e}Service _service;
230
+
231
+ public Get${plural}QueryHandler(I${e}Service service) => _service = service;
232
+
233
+ public Task<PaginatedResult<${e}ListDto>> Handle(Get${plural}Query request, CancellationToken cancellationToken)
234
+ => _service.GetAllAsync(request, cancellationToken);
235
+ }
236
+ `,
237
+ })
238
+
239
+ // Lookup handler — paginated reference list for the frontend EntityLookup combobox.
240
+ files.push({
241
+ path: `src/${ns}.Application/${mod}/Handlers/Get${plural}LookupQueryHandler.cs`,
242
+ content: `using MediatR;
243
+ using SmartStack.Application.Common.Models;
244
+ using ${appNs}.DTOs;
245
+ using ${appNs}.Interfaces;
246
+ using ${appNs}.Queries;
247
+
248
+ namespace ${appNs}.Handlers;
249
+
250
+ public class Get${plural}LookupQueryHandler : IRequestHandler<Get${plural}LookupQuery, PaginatedResult<${e}RefDto>>
251
+ {
252
+ private readonly I${e}Service _service;
253
+
254
+ public Get${plural}LookupQueryHandler(I${e}Service service) => _service = service;
255
+
256
+ public Task<PaginatedResult<${e}RefDto>> Handle(Get${plural}LookupQuery request, CancellationToken cancellationToken)
257
+ => _service.GetLookupAsync(request, cancellationToken);
258
+ }
259
+ `,
260
+ })
261
+
262
+ // 5. Validators
263
+ const validationRules = spec.businessRules.map(r => renderBusinessRule(r, userFields)).join('\n\n')
264
+
265
+ files.push({
266
+ path: `src/${ns}.Application/${mod}/Validators/Create${e}CommandValidator.cs`,
267
+ content: `using FluentValidation;
268
+ using ${appNs}.Commands;
269
+
270
+ namespace ${appNs}.Validators;
271
+
272
+ public class Create${e}CommandValidator : AbstractValidator<Create${e}Command>
273
+ {
274
+ public Create${e}CommandValidator()
275
+ {
276
+ ${requiredFields.filter(f => f.type === 'string').map(f =>
277
+ ` RuleFor(x => x.${f.name}).NotEmpty()${f.maxLength ? `.MaximumLength(${f.maxLength})` : ''};`
278
+ ).join('\n')}
279
+ ${validationRules}
280
+ }
281
+ }
282
+ `,
283
+ })
284
+
285
+ // 5 (cont.) — Update validator. Business rules are entity invariants: they must
286
+ // hold on modification too, not only on creation. Mirrors the Create validator
287
+ // over updatableFields (primary key + computed fields excluded). Any rule that
288
+ // fell back to a `// TODO[BR-…]` comment is refined by the agent's post-scaffold
289
+ // business-logic pass (see business-layer/SKILL.md § Post-scaffold pass).
290
+ files.push({
291
+ path: `src/${ns}.Application/${mod}/Validators/Update${e}CommandValidator.cs`,
292
+ content: `using FluentValidation;
293
+ using ${appNs}.Commands;
294
+
295
+ namespace ${appNs}.Validators;
296
+
297
+ public class Update${e}CommandValidator : AbstractValidator<Update${e}Command>
298
+ {
299
+ public Update${e}CommandValidator()
300
+ {
301
+ RuleFor(x => x.Id).NotEmpty();
302
+ ${updatableFields.filter(f => f.required && f.type === 'string').map(f =>
303
+ ` RuleFor(x => x.${f.name}).NotEmpty()${f.maxLength ? `.MaximumLength(${f.maxLength})` : ''};`
304
+ ).join('\n')}
305
+ ${validationRules}
306
+ }
307
+ }
308
+ `,
309
+ })
310
+
311
+ // 5b. Custom action artefacts (per-page mode) — Commands + Handlers per action.
312
+ // Service interface + impl methods are emitted alongside the CRUD ones below.
313
+ for (const action of spec.customActions) {
314
+ const cmdName = `${pascalizeCode(action.code)}${e}Command`
315
+ const handlerName = `${cmdName}Handler`
316
+ const cmdParams = buildCustomActionCommandParams(action)
317
+ const cmdResponse = action.responseDto === 'NoContent' ? 'Unit' : action.responseDto
318
+ files.push({
319
+ path: `src/${ns}.Application/${mod}/Commands/${cmdName}.cs`,
320
+ content: `using MediatR;
321
+ ${action.payloadDto ? `using ${appNs}.DTOs;\n` : ''}
322
+ namespace ${appNs}.Commands;
323
+
324
+ public record ${cmdName}(${cmdParams}) : IRequest<${cmdResponse}>;
325
+ `,
326
+ })
327
+
328
+ const serviceCallArgs = customActionServiceCallArgs(action)
329
+ const handlerBody = action.responseDto === 'NoContent'
330
+ ? ` await _service.${pascalizeCode(action.code)}Async(${serviceCallArgs});
331
+ return Unit.Value;`
332
+ : ` return await _service.${pascalizeCode(action.code)}Async(${serviceCallArgs});`
333
+
334
+ files.push({
335
+ path: `src/${ns}.Application/${mod}/Handlers/${handlerName}.cs`,
336
+ content: `using MediatR;
337
+ using ${appNs}.Commands;
338
+ using ${appNs}.Interfaces;
339
+
340
+ namespace ${appNs}.Handlers;
341
+
342
+ public class ${handlerName} : IRequestHandler<${cmdName}, ${cmdResponse}>
343
+ {
344
+ private readonly I${e}Service _service;
345
+
346
+ public ${handlerName}(I${e}Service service) => _service = service;
347
+
348
+ public async Task<${cmdResponse}> Handle(${cmdName} request, CancellationToken cancellationToken)
349
+ {
350
+ ${handlerBody}
351
+ }
352
+ }
353
+ `,
354
+ })
355
+ }
356
+
357
+ // 6. Service Interface
358
+ const customInterfaceMethods = spec.customActions.map(a => {
359
+ const sig = customActionServiceMethodSignature(a)
360
+ return ` ${sig};`
361
+ }).join('\n')
362
+
363
+ files.push({
364
+ path: `src/${ns}.Application/${mod}/Interfaces/I${e}Service.cs`,
365
+ content: `using SmartStack.Application.Common.Models;
366
+ using ${appNs}.Commands;
367
+ using ${appNs}.DTOs;
368
+ using ${appNs}.Queries;
369
+
370
+ namespace ${appNs}.Interfaces;
371
+
372
+ public interface I${e}Service
373
+ {
374
+ Task<Guid> CreateAsync(Create${e}Command command, CancellationToken ct = default);
375
+ Task UpdateAsync(Update${e}Command command, CancellationToken ct = default);
376
+ Task DeleteAsync(Guid id, CancellationToken ct = default);
377
+ Task<${e}DetailDto?> GetByIdAsync(Guid id, CancellationToken ct = default);
378
+ Task<PaginatedResult<${e}ListDto>> GetAllAsync(Get${plural}Query query, CancellationToken ct = default);
379
+ Task<PaginatedResult<${e}RefDto>> GetLookupAsync(Get${plural}LookupQuery query, CancellationToken ct = default);
380
+ ${customInterfaceMethods}
381
+ }
382
+ `,
383
+ })
384
+
385
+ // 7. Service Implementation — uses ICoreDbContext (SmartStack convention)
386
+ files.push({
387
+ path: `src/${ns}.Infrastructure/Services/${mod}/${e}Service.cs`,
388
+ content: `using Microsoft.EntityFrameworkCore;
389
+ using SmartStack.Application.Common.Exceptions;
390
+ using SmartStack.Application.Common.Interfaces;
391
+ using SmartStack.Application.Common.Models;
392
+ using ${ns}.Domain.Entities;
393
+ using ${appNs}.Commands;
394
+ using ${appNs}.DTOs;
395
+ using ${appNs}.Interfaces;
396
+ using ${appNs}.Queries;
397
+
398
+ namespace ${ns}.Infrastructure.Services.${mod};
399
+
400
+ public class ${e}Service : I${e}Service
401
+ {
402
+ private readonly ICoreDbContext _context;
403
+
404
+ public ${e}Service(ICoreDbContext context) => _context = context;
405
+
406
+ public async Task<Guid> CreateAsync(Create${e}Command command, CancellationToken ct = default)
407
+ {
408
+ var entity = ${e}.Create(${requiredFields.map(f => `command.${f.name}`).join(', ')});
409
+ _context.Set<${e}>().Add(entity);
410
+ await _context.SaveChangesAsync(ct);
411
+ return entity.Id;
412
+ }
413
+
414
+ public async Task UpdateAsync(Update${e}Command command, CancellationToken ct = default)
415
+ {
416
+ var entity = await _context.Set<${e}>().FindAsync(new object[] { command.Id }, ct)
417
+ ?? throw new NotFoundException(nameof(${e}), command.Id);
418
+ entity.Update(${updatableFields.map(f => `command.${f.name}`).join(', ')});
419
+ await _context.SaveChangesAsync(ct);
420
+ }
421
+
422
+ public async Task DeleteAsync(Guid id, CancellationToken ct = default)
423
+ {
424
+ var entity = await _context.Set<${e}>().FindAsync(new object[] { id }, ct)
425
+ ?? throw new NotFoundException(nameof(${e}), id);
426
+ _context.Set<${e}>().Remove(entity);
427
+ await _context.SaveChangesAsync(ct);
428
+ }
429
+
430
+ public async Task<${e}DetailDto?> GetByIdAsync(Guid id, CancellationToken ct = default)
431
+ {
432
+ return await _context.Set<${e}>()
433
+ .Where(x => x.Id == id)
434
+ .Select(x => new ${e}DetailDto(x.Id, ${userFields.map(f => projectField(f, storedNames)).join(', ')}, x.CreatedAt, x.UpdatedAt))
435
+ .FirstOrDefaultAsync(ct);
436
+ }
437
+
438
+ public async Task<PaginatedResult<${e}ListDto>> GetAllAsync(Get${plural}Query query, CancellationToken ct = default)
439
+ {
440
+ var q = _context.Set<${e}>().AsQueryable();
441
+ if (!string.IsNullOrEmpty(query.Search))
442
+ {
443
+ q = q.Where(x => EF.Functions.Like(x.${storedFields[0]?.name ?? 'Id'}.ToString(), $"%{query.Search}%"));
444
+ }
445
+ var total = await q.CountAsync(ct);
446
+ var items = await q.OrderByDescending(x => x.CreatedAt)
447
+ .Skip((query.Page - 1) * query.PageSize).Take(query.PageSize)
448
+ .Select(x => new ${e}ListDto(x.Id, ${userFields.slice(0, 5).map(f => projectField(f, storedNames)).join(', ')}, x.CreatedAt))
449
+ .ToListAsync(ct);
450
+ return new PaginatedResult<${e}ListDto>(items, total, query.Page, query.PageSize);
451
+ }
452
+
453
+ public async Task<PaginatedResult<${e}RefDto>> GetLookupAsync(Get${plural}LookupQuery query, CancellationToken ct = default)
454
+ {
455
+ // Display field is resolved at scaffold time (see pickDisplayField) so the
456
+ // projection stays SQL-translatable. Search is case-insensitive LIKE on the
457
+ // same field — same column read, single round-trip, EF.Functions.Like only.
458
+ var q = _context.Set<${e}>().AsQueryable();
459
+ if (!string.IsNullOrEmpty(query.Search))
460
+ {
461
+ q = q.Where(x => EF.Functions.Like(${displayField.searchExpr}, $"%{query.Search}%"));
462
+ }
463
+ var total = await q.CountAsync(ct);
464
+ var items = await q.OrderBy(x => ${displayField.orderExpr})
465
+ .Skip((query.Page - 1) * query.PageSize).Take(query.PageSize)
466
+ .Select(x => new ${e}RefDto(x.Id, ${displayField.projectExpr}))
467
+ .ToListAsync(ct);
468
+ return new PaginatedResult<${e}RefDto>(items, total, query.Page, query.PageSize);
469
+ }
470
+ ${spec.customActions.map(a => emitCustomActionServiceMethod(a, e)).join('\n')}
471
+ }
472
+ `,
473
+ })
474
+
475
+ return files
476
+ }
477
+
478
+ /**
479
+ * Resolve the display projection for `{Entity}RefDto.DisplayName` used by
480
+ * GET /lookup. The frontend EntityLookup combobox renders this string.
481
+ *
482
+ * Priority:
483
+ * 1. `displayNameExpr` — caller-provided PascalCase property name (e.g.
484
+ * `Name`, `Label`). Trusted verbatim; must be a stored string field of
485
+ * the same entity. ba-develop Phase 2 derives it from `entité.md`.
486
+ * 2. First stored string field matching `Name` / `Label` / `Code` / `Title`.
487
+ * 3. Any remaining stored string field.
488
+ * 4. Fallback `Id.ToString()` — only when the entity has zero string fields.
489
+ *
490
+ * The three returned expressions are interpolated into the EF Core LINQ
491
+ * pipeline of `GetLookupAsync`:
492
+ * - `searchExpr` — column read passed to `EF.Functions.Like`. For string
493
+ * columns it's just `x.Name`. For the Id fallback we coerce via `.ToString()`.
494
+ * - `orderExpr` — column used in `OrderBy`. Same as searchExpr modulo casts.
495
+ * - `projectExpr`— the final string passed to the `${e}RefDto` ctor.
496
+ */
497
+ function pickDisplayField(
498
+ displayNameExpr: string | undefined,
499
+ storedFields: Field[],
500
+ ): { searchExpr: string; orderExpr: string; projectExpr: string } {
501
+ const stringFields = storedFields.filter(f => f.type.toLowerCase() === 'string')
502
+
503
+ let chosen: string | null = null
504
+ if (displayNameExpr && storedFields.some(f => f.name === displayNameExpr)) {
505
+ chosen = displayNameExpr
506
+ } else {
507
+ for (const preferred of ['Name', 'Label', 'Code', 'Title']) {
508
+ if (stringFields.some(f => f.name === preferred)) { chosen = preferred; break }
509
+ }
510
+ if (!chosen && stringFields.length > 0) chosen = stringFields[0]!.name
511
+ }
512
+
513
+ if (!chosen) {
514
+ return { searchExpr: 'x.Id.ToString()', orderExpr: 'x.Id', projectExpr: 'x.Id.ToString()' }
515
+ }
516
+ return { searchExpr: `x.${chosen}`, orderExpr: `x.${chosen}`, projectExpr: `x.${chosen}` }
517
+ }
518
+
519
+ function mapType(f: Field): string {
520
+ const map: Record<string, string> = {
521
+ 'string': 'string',
522
+ 'int': 'int',
523
+ 'integer': 'int',
524
+ 'number': 'decimal',
525
+ 'decimal': 'decimal',
526
+ 'bool': 'bool',
527
+ 'boolean': 'bool',
528
+ 'datetime': 'DateTime',
529
+ 'date': 'DateOnly',
530
+ 'guid': 'Guid',
531
+ }
532
+ const base = map[f.type.toLowerCase()] ?? f.type
533
+ return !f.required && base !== 'string' ? `${base}?` : base
534
+ }
535
+
536
+ /**
537
+ * Render a field accessor inside a `.Select(x => new Dto(...))` projection.
538
+ * - Stored fields → `x.FieldName` (regular column read).
539
+ * - Computed fields (with `formula`) → the formula, with each stored property
540
+ * reference prefixed by `x.` so EF Core can translate it to SQL. Tokens that
541
+ * don't match a stored field name (Math.Round, literals, …) are left intact.
542
+ *
543
+ * Wrapped in parentheses so binary expressions (e.g. `(A - B) / A`) compose
544
+ * cleanly inside the comma-separated argument list of the DTO record ctor.
545
+ */
546
+ function projectField(f: Field, storedNames: Set<string>): string {
547
+ if (!f.formula) return `x.${f.name}`
548
+ const projected = f.formula.replace(/\b([A-Z][A-Za-z0-9]*)\b/g, (token) =>
549
+ storedNames.has(token) ? `x.${token}` : token,
550
+ )
551
+ return `(${projected})`
552
+ }
553
+
554
+ function capitalize(s: string): string { return s.charAt(0).toUpperCase() + s.slice(1) }
555
+
556
+ /** Convert a kebab-case action code (`bulk-archive`) to PascalCase (`BulkArchive`)
557
+ * for C# class / method names. */
558
+ function pascalizeCode(code: string): string {
559
+ return code.split('-').map(part => capitalize(part)).join('')
560
+ }
561
+
562
+ // ─── Custom action emission ────────────────────────────────────────────
563
+
564
+ /**
565
+ * Build the parameter list for a custom action MediatR Command record.
566
+ * - row scope → `(Guid Id)` or `(Guid Id, <Payload> Payload)`
567
+ * - bulk scope → `(<Payload> Payload)` or `(IReadOnlyList<Guid> Ids)` (no payload fallback)
568
+ * - header scope → `(<Payload> Payload)` or `()` (no payload fallback)
569
+ */
570
+ function buildCustomActionCommandParams(action: BusinessCustomAction): string {
571
+ if (action.scope === 'row') {
572
+ return action.payloadDto ? `Guid Id, ${action.payloadDto} Payload` : 'Guid Id'
573
+ }
574
+ if (action.scope === 'bulk') {
575
+ return action.payloadDto ? `${action.payloadDto} Payload` : 'IReadOnlyList<Guid> Ids'
576
+ }
577
+ // header scope
578
+ return action.payloadDto ? `${action.payloadDto} Payload` : ''
579
+ }
580
+
581
+ /**
582
+ * Build the argument list for the service call inside a Handler. Mirrors
583
+ * `buildCustomActionCommandParams`'s field names ("Id" / "Payload" / "Ids").
584
+ * Always appends `cancellationToken` at the end.
585
+ */
586
+ function customActionServiceCallArgs(action: BusinessCustomAction): string {
587
+ const parts: string[] = []
588
+ if (action.scope === 'row') {
589
+ parts.push('request.Id')
590
+ if (action.payloadDto) parts.push('request.Payload')
591
+ } else if (action.scope === 'bulk') {
592
+ parts.push(action.payloadDto ? 'request.Payload' : 'request.Ids')
593
+ } else {
594
+ if (action.payloadDto) parts.push('request.Payload')
595
+ }
596
+ parts.push('cancellationToken')
597
+ return parts.join(', ')
598
+ }
599
+
600
+ /**
601
+ * Build the C# method signature on `I${e}Service` for a custom action.
602
+ * - `archive` row no-payload → `Task ArchiveAsync(Guid id, CancellationToken ct = default)`
603
+ * - `approve` row + payload → `Task<BudgetDto> ApproveAsync(Guid id, ApproveRequest payload, CancellationToken ct = default)`
604
+ * - bulk-archive bulk no-pl → `Task ArchiveAsync(IReadOnlyList<Guid> ids, CancellationToken ct = default)`
605
+ */
606
+ function customActionServiceMethodSignature(action: BusinessCustomAction): string {
607
+ const methodName = `${pascalizeCode(action.code)}Async`
608
+ const returnType = action.responseDto === 'NoContent' ? 'Task' : `Task<${action.responseDto}>`
609
+ const params: string[] = []
610
+ if (action.scope === 'row') {
611
+ params.push('Guid id')
612
+ if (action.payloadDto) params.push(`${action.payloadDto} payload`)
613
+ } else if (action.scope === 'bulk') {
614
+ params.push(action.payloadDto ? `${action.payloadDto} payload` : 'IReadOnlyList<Guid> ids')
615
+ } else {
616
+ if (action.payloadDto) params.push(`${action.payloadDto} payload`)
617
+ }
618
+ params.push('CancellationToken ct = default')
619
+ return `${returnType} ${methodName}(${params.join(', ')})`
620
+ }
621
+
622
+ /**
623
+ * Emit the C# implementation block for a custom action service method.
624
+ * Canonical recipes for known state-mutation codes; NotImplementedException
625
+ * stub (with UC reference) for unknown codes — flags the body for manual
626
+ * implementation while keeping the project compilable.
627
+ */
628
+ function emitCustomActionServiceMethod(action: BusinessCustomAction, entity: string): string {
629
+ const methodName = `${pascalizeCode(action.code)}Async`
630
+ const returnType = action.responseDto === 'NoContent' ? 'Task' : `Task<${action.responseDto}>`
631
+
632
+ const params: string[] = []
633
+ if (action.scope === 'row') {
634
+ params.push('Guid id')
635
+ if (action.payloadDto) params.push(`${action.payloadDto} payload`)
636
+ } else if (action.scope === 'bulk') {
637
+ params.push(action.payloadDto ? `${action.payloadDto} payload` : 'IReadOnlyList<Guid> ids')
638
+ } else {
639
+ if (action.payloadDto) params.push(`${action.payloadDto} payload`)
640
+ }
641
+ params.push('CancellationToken ct = default')
642
+ const signature = `public async ${returnType} ${methodName}(${params.join(', ')})`
643
+
644
+ // Canonical recipes for state-mutation codes. Only fire when scope='row',
645
+ // payloadDto is null, responseDto is NoContent — the simplest baseline.
646
+ // More complex variants (scope=bulk, custom payload) fall through to the
647
+ // generic stub regardless of code (the BA must specify the semantics).
648
+ const isCanonicalRow =
649
+ action.scope === 'row' &&
650
+ !action.payloadDto &&
651
+ action.responseDto === 'NoContent'
652
+
653
+ let body: string
654
+ if (isCanonicalRow && action.code === 'archive') {
655
+ body = ` var entity = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)
656
+ ?? throw new NotFoundException(nameof(${entity}), id);
657
+ // Canonical archive recipe — set Status='archived'. If the entity
658
+ // does not carry a Status property, replace this body manually.
659
+ entity.GetType().GetProperty("Status")?.SetValue(entity, "archived");
660
+ await _context.SaveChangesAsync(ct);`
661
+ } else if (isCanonicalRow && action.code === 'restore') {
662
+ body = ` var entity = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)
663
+ ?? throw new NotFoundException(nameof(${entity}), id);
664
+ // Canonical restore recipe — flip Status back to 'active'.
665
+ entity.GetType().GetProperty("Status")?.SetValue(entity, "active");
666
+ await _context.SaveChangesAsync(ct);`
667
+ } else if (isCanonicalRow && action.code === 'activate') {
668
+ body = ` var entity = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)
669
+ ?? throw new NotFoundException(nameof(${entity}), id);
670
+ // Canonical activate recipe — IsActive=true.
671
+ entity.GetType().GetProperty("IsActive")?.SetValue(entity, true);
672
+ await _context.SaveChangesAsync(ct);`
673
+ } else if (isCanonicalRow && action.code === 'deactivate') {
674
+ body = ` var entity = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)
675
+ ?? throw new NotFoundException(nameof(${entity}), id);
676
+ // Canonical deactivate recipe — IsActive=false.
677
+ entity.GetType().GetProperty("IsActive")?.SetValue(entity, false);
678
+ await _context.SaveChangesAsync(ct);`
679
+ } else if (
680
+ action.scope === 'row' &&
681
+ !action.payloadDto &&
682
+ action.responseDto !== 'NoContent' &&
683
+ action.code === 'duplicate'
684
+ ) {
685
+ body = ` var source = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)
686
+ ?? throw new NotFoundException(nameof(${entity}), id);
687
+ // Canonical duplicate recipe — reflection-based deep clone with new Id.
688
+ // Replace with an explicit copy if you need to alter specific fields
689
+ // (e.g. label += " (copy)").
690
+ var clone = (${entity})source.GetType().GetMethod("Clone")?.Invoke(source, null)!;
691
+ clone.GetType().GetProperty("Id")?.SetValue(clone, Guid.NewGuid());
692
+ _context.Set<${entity}>().Add(clone);
693
+ await _context.SaveChangesAsync(ct);
694
+ return await GetByIdAsync(clone.Id, ct) ?? throw new InvalidOperationException("Duplicated entity vanished");`
695
+ } else if (action.fromStatus || action.toStatus) {
696
+ // ─── Workflow state-transition recipe (SK-001) ─────────────────────
697
+ // When fromStatus/toStatus metadata is supplied, generate a real
698
+ // state-transition body instead of NotImplementedException.
699
+ const lines: string[] = []
700
+ const ucTag = action.ucReference ? `[${action.ucReference}]` : ''
701
+
702
+ // Cross-module dependency warning (SK-004)
703
+ if (action.crossModuleDeps && action.crossModuleDeps.length > 0) {
704
+ for (const dep of action.crossModuleDeps) {
705
+ lines.push(` // BLOCKED: depends on module '${dep}' — stub until delivered.`)
706
+ }
707
+ }
708
+
709
+ lines.push(` var entity = await _context.Set<${entity}>().FindAsync(new object[] { id }, ct)`)
710
+ lines.push(` ?? throw new NotFoundException(nameof(${entity}), id);`)
711
+
712
+ // Guard: check current status
713
+ if (action.fromStatus) {
714
+ lines.push(``)
715
+ lines.push(` // Guard: entity must be in '${action.fromStatus}' state ${ucTag}`)
716
+ lines.push(` if (entity.Status != "${action.fromStatus}")`)
717
+ lines.push(` throw new BusinessRuleException($"Cannot '${action.code}': entity is in '{entity.Status}', expected '${action.fromStatus}'.");`)
718
+ }
719
+
720
+ // Guard rules as comments
721
+ if (action.guardRules && action.guardRules.length > 0) {
722
+ lines.push(``)
723
+ for (const rule of action.guardRules) {
724
+ lines.push(` // Guard ${rule} — TODO: implement rule check`)
725
+ }
726
+ }
727
+
728
+ // Flow parameters: apply payload fields (SK-002)
729
+ if (action.flowParameters && action.flowParameters.length > 0) {
730
+ lines.push(``)
731
+ for (const param of action.flowParameters) {
732
+ const pascal = param.charAt(0).toUpperCase() + param.slice(1)
733
+ lines.push(` entity.${pascal} = payload.${pascal};`)
734
+ }
735
+ }
736
+
737
+ // Transition: set new status
738
+ if (action.toStatus) {
739
+ lines.push(``)
740
+ lines.push(` // Transition → '${action.toStatus}' ${ucTag}`)
741
+ lines.push(` entity.Status = "${action.toStatus}";`)
742
+ }
743
+
744
+ lines.push(` await _context.SaveChangesAsync(ct);`)
745
+
746
+ body = lines.join('\n')
747
+ } else {
748
+ // Unknown / non-canonical code — stub with UC reference comment.
749
+ const ucComment = action.ucReference
750
+ ? ` // TODO[${action.ucReference}]: implement '${action.code}' per the linked use case.`
751
+ : ` // TODO: implement '${action.code}' — no canonical recipe and no UC reference provided.`
752
+
753
+ // Cross-module dependency warning (SK-004)
754
+ const depComments = (action.crossModuleDeps ?? [])
755
+ .map(dep => ` // BLOCKED: depends on module '${dep}' — stub until delivered.`)
756
+ .join('\n')
757
+
758
+ const stubReturn = action.responseDto === 'NoContent'
759
+ ? ' throw new NotImplementedException();'
760
+ : ` throw new NotImplementedException();
761
+ // return default!;`
762
+ body = `${depComments ? depComments + '\n' : ''}${ucComment}
763
+ ${stubReturn}`
764
+ }
765
+
766
+ return `
767
+ ${signature}
768
+ {
769
+ ${body}
770
+ }
771
+ `
772
+ }
773
+
774
+ /**
775
+ * Convert a PRD business rule into a FluentValidation rule block.
776
+ * Order of precedence:
777
+ * 1. Explicit `expression` field (raw FluentValidation code).
778
+ * 2. Description heuristics (required / range / pattern / comparison).
779
+ * 3. TODO comment (fallback — flagged for manual rewrite).
780
+ */
781
+ function renderBusinessRule(rule: BusinessRule, fields: Field[]): string {
782
+ const header = ` // ${rule.id}: ${rule.description}`
783
+ if (rule.expression) {
784
+ const body = rule.expression.trim()
785
+ const statement = body.endsWith(';') ? body : `${body};`
786
+ return `${header}\n ${statement}`
787
+ }
788
+ const heuristic = deriveHeuristic(rule.description, fields)
789
+ if (heuristic) {
790
+ return `${header}\n${heuristic}`
791
+ }
792
+ return `${header}\n // TODO[${rule.id}]: No expression and no heuristic matched — translate this rule manually.`
793
+ }
794
+
795
+ function deriveHeuristic(description: string, fields: Field[]): string | null {
796
+ const text = description.toLowerCase()
797
+
798
+ // "X is required" / "X must not be empty" / "X cannot be null"
799
+ const requiredField = fields.find(f => {
800
+ const lower = f.name.toLowerCase()
801
+ return text.includes(lower) && (text.includes('required') || text.includes('not be empty') || text.includes('cannot be null') || text.includes('must not be empty'))
802
+ })
803
+ if (requiredField) {
804
+ return ` RuleFor(x => x.${requiredField.name}).NotEmpty().WithMessage("${requiredField.name} is required");`
805
+ }
806
+
807
+ // "X must be positive" / "X must be greater than 0"
808
+ const positiveField = fields.find(f => text.includes(f.name.toLowerCase()) && (text.includes('positive') || text.includes('greater than 0')))
809
+ if (positiveField) {
810
+ return ` RuleFor(x => x.${positiveField.name}).GreaterThan(0).WithMessage("${positiveField.name} must be positive");`
811
+ }
812
+
813
+ // "X must be before Y" / "X must be less than Y"
814
+ const beforeMatch = /(\w+)\s+(?:must be )?(?:before|less than)\s+(\w+)/.exec(text)
815
+ if (beforeMatch) {
816
+ const left = fields.find(f => f.name.toLowerCase() === beforeMatch[1])
817
+ const right = fields.find(f => f.name.toLowerCase() === beforeMatch[2])
818
+ if (left && right) {
819
+ return ` RuleFor(x => x.${left.name}).LessThan(x => x.${right.name}).WithMessage("${left.name} must be before ${right.name}");`
820
+ }
821
+ }
822
+
823
+ // "X must match pattern /regex/" — naive
824
+ const patternMatch = /(\w+)\s+must\s+match\s+([^\s]+)/.exec(text)
825
+ if (patternMatch) {
826
+ const field = fields.find(f => f.name.toLowerCase() === patternMatch[1])
827
+ if (field) {
828
+ return ` RuleFor(x => x.${field.name}).Matches(@"${patternMatch[2]}").WithMessage("${field.name} has invalid format");`
829
+ }
830
+ }
831
+
832
+ // "X must be between A and B"
833
+ const rangeMatch = /(\w+)\s+must\s+be\s+between\s+(-?\d+(?:\.\d+)?)\s+and\s+(-?\d+(?:\.\d+)?)/.exec(text)
834
+ if (rangeMatch) {
835
+ const field = fields.find(f => f.name.toLowerCase() === rangeMatch[1])
836
+ if (field) {
837
+ return ` RuleFor(x => x.${field.name}).InclusiveBetween(${rangeMatch[2]}, ${rangeMatch[3]}).WithMessage("${field.name} must be between ${rangeMatch[2]} and ${rangeMatch[3]}");`
838
+ }
839
+ }
840
+
841
+ return null
842
+ }