@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,1180 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { generate } from '../generate.js'
3
+ import type { ScaffoldApiClientInput } from '../types.js'
4
+
5
+ function fixture(overrides: Partial<ScaffoldApiClientInput> = {}): ScaffoldApiClientInput {
6
+ return {
7
+ module: 'crm',
8
+ appCode: 'TestV2',
9
+ entities: [
10
+ {
11
+ name: 'Contact',
12
+ section: 'directory',
13
+ hasDashboard: false,
14
+ fields: [
15
+ { name: 'firstName', type: 'string', required: true },
16
+ { name: 'lastName', type: 'string', required: true },
17
+ ],
18
+ },
19
+ ],
20
+ projectPath: '/web',
21
+ ...overrides,
22
+ }
23
+ }
24
+
25
+ describe('scaffold-api-client / generate', () => {
26
+ it('every api.get / post call assigns result via const data = … (api already unwraps)', () => {
27
+ const files = generate(fixture())
28
+ const service = files.find((f) => f.path.endsWith('contactService.ts'))
29
+ expect(service).toBeDefined()
30
+ const lines = service!.content.split(/\r?\n/)
31
+ for (let i = 0; i < lines.length; i++) {
32
+ const line = lines[i]
33
+ if (/await\s+api\.(get|post)\b/.test(line)) {
34
+ expect(line).toMatch(/const\s+data\s*=\s*await\s+api/)
35
+ }
36
+ }
37
+ })
38
+
39
+ it('never returns the raw AxiosResponse — services return T (or void)', () => {
40
+ const files = generate(fixture())
41
+ const service = files.find((f) => f.path.endsWith('contactService.ts'))!
42
+ // Forbid the raw-response anti-pattern. Hooks rely on T-shaped returns.
43
+ expect(service.content).not.toMatch(/return\s+(?:res|response|axiosResponse)\b/)
44
+ // Positive assertion: GET / POST return data.
45
+ const dataReturns = service.content.match(/return\s+data\s*;/g) ?? []
46
+ expect(dataReturns.length).toBeGreaterThanOrEqual(3) // list + detail + create
47
+ })
48
+
49
+ it('emits hooks under src/features/{module}/{entityLower}/hooks/', () => {
50
+ const files = generate(fixture())
51
+ expect(files.some((f) => f.path === 'src/features/crm/contact/hooks/useContact.ts')).toBe(true)
52
+ expect(files.some((f) => f.path === 'src/features/crm/contact/services/contactService.ts')).toBe(true)
53
+ expect(files.some((f) => f.path === 'src/features/crm/contact/types/index.ts')).toBe(true)
54
+ })
55
+
56
+ it('emits dashboard hook + service methods only when hasDashboard:true', () => {
57
+ const noDash = generate(fixture()).find((f) => f.path.endsWith('contactService.ts'))!
58
+ expect(noDash.content).not.toMatch(/getDashboardConsolidated/)
59
+
60
+ const withDash = generate(
61
+ fixture({ entities: [{ ...fixture().entities[0], hasDashboard: true, customActions: [] }] }),
62
+ ).find((f) => f.path.endsWith('contactService.ts'))!
63
+ expect(withDash.content).toMatch(/getDashboardConsolidated/)
64
+ expect(withDash.content).toMatch(/getDashboardAlerts/)
65
+ })
66
+ })
67
+
68
+ describe('scaffold-api-client / generate — custom actions (per-page mode)', () => {
69
+ function entityWithActions(customActions: NonNullable<ScaffoldApiClientInput['entities'][0]['customActions']>) {
70
+ return {
71
+ name: 'Budget',
72
+ section: 'budgets',
73
+ hasDashboard: false,
74
+ fields: [
75
+ { name: 'code', type: 'string', required: true },
76
+ { name: 'label', type: 'string', required: true },
77
+ ],
78
+ customActions,
79
+ }
80
+ }
81
+
82
+ it('emits a service member per row-scope custom action with no payload', () => {
83
+ const files = generate({
84
+ module: 'budgets',
85
+ appCode: 'TestV2',
86
+ entities: [entityWithActions([
87
+ { code: 'archive', scope: 'row', payloadType: null, responseType: 'void' },
88
+ ])],
89
+ projectPath: '/web',
90
+ })
91
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
92
+ // Row-scope no-payload member: archive: async (id: string): Promise<void>
93
+ expect(service.content).toMatch(/archive: async \(id: string\): Promise<void>/)
94
+ expect(service.content).toMatch(/await api\.post\(`\${API_PATH}\/\${id}\/archive`\);/)
95
+ })
96
+
97
+ it('emits a hook per custom action using useState/isPending pattern', () => {
98
+ const files = generate({
99
+ module: 'budgets',
100
+ appCode: 'TestV2',
101
+ entities: [entityWithActions([
102
+ { code: 'archive', scope: 'row', payloadType: null, responseType: 'void' },
103
+ ])],
104
+ projectPath: '/web',
105
+ })
106
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
107
+ expect(hook.content).toMatch(/export function useArchiveBudget\(\)/)
108
+ expect(hook.content).toMatch(/isPending/)
109
+ expect(hook.content).toMatch(/mutateAsync/)
110
+ })
111
+
112
+ it('emits Promise<T> return type when responseType is non-void', () => {
113
+ const files = generate({
114
+ module: 'budgets',
115
+ appCode: 'TestV2',
116
+ entities: [entityWithActions([
117
+ { code: 'duplicate', scope: 'row', payloadType: null, responseType: 'BudgetDetailDto' },
118
+ ])],
119
+ projectPath: '/web',
120
+ })
121
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
122
+ expect(service.content).toMatch(/duplicate: async \(id: string\): Promise<BudgetDetailDto>/)
123
+ expect(service.content).toMatch(/const data = await api\.post<BudgetDetailDto>\(`\${API_PATH}\/\${id}\/duplicate`\);/)
124
+ expect(service.content).toMatch(/return data;/)
125
+ })
126
+
127
+ it('emits row-scope action with payload as useState hook', () => {
128
+ const files = generate({
129
+ module: 'budgets',
130
+ appCode: 'TestV2',
131
+ entities: [entityWithActions([
132
+ { code: 'approve', scope: 'row', payloadType: 'ApproveRequest', responseType: 'BudgetDto' },
133
+ ])],
134
+ projectPath: '/web',
135
+ })
136
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
137
+ expect(hook.content).toMatch(/export function useApproveBudget\(\)/)
138
+ expect(hook.content).toMatch(/isPending/)
139
+ expect(hook.content).toMatch(/mutateAsync/)
140
+ })
141
+
142
+ it('emits bulk-scope action with ids[] when no payloadType, posts to /bulk/<code>', () => {
143
+ const files = generate({
144
+ module: 'budgets',
145
+ appCode: 'TestV2',
146
+ entities: [entityWithActions([
147
+ { code: 'archive', scope: 'bulk', payloadType: null, responseType: 'void' },
148
+ ])],
149
+ projectPath: '/web',
150
+ })
151
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
152
+ expect(service.content).toMatch(/archive: async \(ids: string\[\]\)/)
153
+ expect(service.content).toMatch(/`\${API_PATH}\/bulk\/archive`, \{ ids \}/)
154
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
155
+ expect(hook.content).toMatch(/export function useArchiveBudget\(\)/)
156
+ })
157
+
158
+ it('emits header-scope action without id parameter', () => {
159
+ const files = generate({
160
+ module: 'budgets',
161
+ appCode: 'TestV2',
162
+ entities: [entityWithActions([
163
+ { code: 'export', scope: 'header', payloadType: null, responseType: 'void' },
164
+ ])],
165
+ projectPath: '/web',
166
+ })
167
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
168
+ expect(service.content).toMatch(/export: async \(\): Promise<void>/)
169
+ expect(service.content).toMatch(/`\${API_PATH}\/export`/)
170
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
171
+ expect(hook.content).toMatch(/export function useExportBudget\(\)/)
172
+ })
173
+
174
+ it('pascalizes kebab-case codes (`bulk-archive` → useBulkArchiveBudget)', () => {
175
+ const files = generate({
176
+ module: 'budgets',
177
+ appCode: 'TestV2',
178
+ entities: [entityWithActions([
179
+ { code: 'bulk-archive', scope: 'bulk', payloadType: null, responseType: 'void' },
180
+ ])],
181
+ projectPath: '/web',
182
+ })
183
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
184
+ expect(hook.content).toMatch(/export function useBulkArchiveBudget\(\)/)
185
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
186
+ // Service member uses camelCase
187
+ expect(service.content).toMatch(/bulkArchive: async/)
188
+ // URL keeps kebab-case
189
+ expect(service.content).toMatch(/`\${API_PATH}\/bulk\/bulk-archive`/)
190
+ })
191
+
192
+ it('emits no custom hooks/members when customActions is empty (legacy default)', () => {
193
+ const files = generate({
194
+ module: 'budgets',
195
+ appCode: 'TestV2',
196
+ entities: [entityWithActions([])],
197
+ projectPath: '/web',
198
+ })
199
+ const service = files.find((f) => f.path.endsWith('budgetService.ts'))!
200
+ expect(service.content).not.toMatch(/archive:/)
201
+ expect(service.content).not.toMatch(/duplicate:/)
202
+ const hook = files.find((f) => f.path.endsWith('useBudget.ts'))!
203
+ expect(hook.content).not.toMatch(/useArchive/)
204
+ expect(hook.content).not.toMatch(/useDuplicate/)
205
+ })
206
+
207
+ it('uses endpoint field for URL when provided, code for naming', () => {
208
+ // Closes the historical REFERENTIELS class of 404s where the pagespec
209
+ // `code: 'toggle-actif'` was emitted into the URL while the controller
210
+ // route was `[HttpPost("activate")]`. With `endpoint` set, the URL
211
+ // matches the controller; `code` continues to drive the TS identifier.
212
+ const files = generate({
213
+ module: 'crm',
214
+ appCode: 'app',
215
+ entities: [{
216
+ name: 'Contact',
217
+ section: 'contacts',
218
+ hasDashboard: false,
219
+ fields: [{ name: 'Name', type: 'string', required: true }],
220
+ customActions: [{
221
+ code: 'toggle-actif',
222
+ endpoint: 'activate',
223
+ scope: 'row',
224
+ httpMethod: 'post',
225
+ responseType: 'void',
226
+ }],
227
+ }],
228
+ projectPath: '/test',
229
+ routeMode: 'direct',
230
+ })
231
+
232
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
233
+ // Member name derived from code (camelCase)
234
+ expect(service.content).toMatch(/toggleActif: async \(id: string\)/)
235
+ // URL derived from endpoint — NOT from code
236
+ expect(service.content).toMatch(/`\$\{API_PATH\}\/\$\{id\}\/activate`/)
237
+ expect(service.content).not.toMatch(/\/toggle-actif/)
238
+ // Hook name still derived from code (PascalCase)
239
+ const hook = files.find(f => f.path.endsWith('useContact.ts'))!
240
+ expect(hook.content).toMatch(/export function useToggleActifContact\(\)/)
241
+ })
242
+
243
+ it('falls back to code for URL when endpoint is absent (backward compat)', () => {
244
+ const files = generate({
245
+ module: 'crm',
246
+ appCode: 'app',
247
+ entities: [{
248
+ name: 'Contact',
249
+ section: 'contacts',
250
+ hasDashboard: false,
251
+ fields: [{ name: 'Name', type: 'string', required: true }],
252
+ customActions: [{
253
+ code: 'archive',
254
+ scope: 'row',
255
+ httpMethod: 'post',
256
+ responseType: 'void',
257
+ }],
258
+ }],
259
+ projectPath: '/test',
260
+ routeMode: 'direct',
261
+ })
262
+
263
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
264
+ expect(service.content).toMatch(/`\$\{API_PATH\}\/\$\{id\}\/archive`/)
265
+ })
266
+
267
+ it('respects httpMethod for GET actions with endpoint override', () => {
268
+ // Mirrors the REFERENTIELS `analyze-impact` / `detect-anomalies` pattern
269
+ // where the BA code stays verbose but the controller exposes a short
270
+ // GET route (no body, query-only).
271
+ const files = generate({
272
+ module: 'crm',
273
+ appCode: 'app',
274
+ entities: [{
275
+ name: 'Contact',
276
+ section: 'contacts',
277
+ hasDashboard: false,
278
+ fields: [{ name: 'Name', type: 'string', required: true }],
279
+ customActions: [{
280
+ code: 'analyze-impact',
281
+ endpoint: 'impact',
282
+ scope: 'row',
283
+ httpMethod: 'get',
284
+ responseType: 'ImpactResult',
285
+ }],
286
+ }],
287
+ projectPath: '/test',
288
+ routeMode: 'direct',
289
+ })
290
+
291
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
292
+ expect(service.content).toMatch(/api\.get<ImpactResult>/)
293
+ expect(service.content).toMatch(/`\$\{API_PATH\}\/\$\{id\}\/impact`/)
294
+ expect(service.content).not.toMatch(/\/analyze-impact/)
295
+ })
296
+
297
+ it('header-scope action with endpoint override (sync-from-pce → sync-from-proconcept)', () => {
298
+ // Closes the REFERENTIELS `sync-from-pce` → controller `sync-from-proconcept` mismatch.
299
+ const files = generate({
300
+ module: 'crm',
301
+ appCode: 'app',
302
+ entities: [{
303
+ name: 'Employe',
304
+ section: 'employes',
305
+ hasDashboard: false,
306
+ fields: [{ name: 'Name', type: 'string', required: true }],
307
+ customActions: [{
308
+ code: 'sync-from-pce',
309
+ endpoint: 'sync-from-proconcept',
310
+ scope: 'header',
311
+ httpMethod: 'post',
312
+ responseType: 'void',
313
+ }],
314
+ }],
315
+ projectPath: '/test',
316
+ routeMode: 'direct',
317
+ })
318
+
319
+ const service = files.find(f => f.path.endsWith('employeService.ts'))!
320
+ // Header-scope: no /{id}/ prefix. URL = API_PATH + endpoint.
321
+ expect(service.content).toMatch(/`\$\{API_PATH\}\/sync-from-proconcept`/)
322
+ expect(service.content).not.toMatch(/\/sync-from-pce/)
323
+ // TS member name uses code → syncFromPce
324
+ expect(service.content).toMatch(/syncFromPce: async \(\)/)
325
+ })
326
+
327
+ it('skips kind:"navigate" actions — no service member emitted', () => {
328
+ // The REFERENTIELS post-mortem: BA pagespecs declared `open` actions
329
+ // (kind:"navigate", targetScreen:SCR-…-DETAIL) which propagated through
330
+ // ba-develop into 6 phantom `POST /{id}/open` endpoints — none of which
331
+ // exist on the backend controllers. With the filter, scaffold-api-client
332
+ // emits nothing for these; scaffold-component still renders the button
333
+ // as an inline `navigate(targetRoute)`.
334
+ const files = generate({
335
+ module: 'crm',
336
+ appCode: 'app',
337
+ entities: [{
338
+ name: 'Contact',
339
+ section: 'contacts',
340
+ hasDashboard: false,
341
+ fields: [{ name: 'Name', type: 'string', required: true }],
342
+ customActions: [
343
+ { code: 'open', kind: 'navigate', scope: 'row', responseType: 'void' },
344
+ // A legit API action survives the filter side-by-side.
345
+ { code: 'archive', kind: 'api', scope: 'row', httpMethod: 'post', responseType: 'void' },
346
+ ],
347
+ }],
348
+ projectPath: '/test',
349
+ routeMode: 'direct',
350
+ })
351
+
352
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
353
+ // The navigate action MUST NOT produce a service member.
354
+ expect(service.content).not.toMatch(/open:\s*async/)
355
+ expect(service.content).not.toMatch(/\${API_PATH}\/\${id}\/open/)
356
+ // The legit api action still appears.
357
+ expect(service.content).toMatch(/archive: async \(id: string\)/)
358
+ })
359
+
360
+ it('skips kind:"navigate" actions — no React hook emitted', () => {
361
+ const files = generate({
362
+ module: 'crm',
363
+ appCode: 'app',
364
+ entities: [{
365
+ name: 'Contact',
366
+ section: 'contacts',
367
+ hasDashboard: false,
368
+ fields: [{ name: 'Name', type: 'string', required: true }],
369
+ customActions: [
370
+ { code: 'open', kind: 'navigate', scope: 'row', responseType: 'void' },
371
+ ],
372
+ }],
373
+ projectPath: '/test',
374
+ routeMode: 'direct',
375
+ })
376
+
377
+ const hook = files.find(f => f.path.endsWith('useContact.ts'))!
378
+ // No `useOpenContact()` hook anywhere.
379
+ expect(hook.content).not.toMatch(/useOpenContact/)
380
+ })
381
+
382
+ it('defaults kind to "api" (backward compat — actions without kind still emit)', () => {
383
+ const files = generate({
384
+ module: 'crm',
385
+ appCode: 'app',
386
+ entities: [{
387
+ name: 'Contact',
388
+ section: 'contacts',
389
+ hasDashboard: false,
390
+ fields: [{ name: 'Name', type: 'string', required: true }],
391
+ customActions: [
392
+ // No `kind` field — must default to 'api' per Zod schema.
393
+ { code: 'archive', scope: 'row', responseType: 'void' },
394
+ ],
395
+ }],
396
+ projectPath: '/test',
397
+ routeMode: 'direct',
398
+ })
399
+
400
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
401
+ expect(service.content).toMatch(/archive: async \(id: string\)/)
402
+ })
403
+ })
404
+
405
+ describe('scaffold-api-client / generate — lookup hook (feeds <EntityLookup>)', () => {
406
+ it('emits {Entity}RefDto in the types file', () => {
407
+ const files = generate(fixture())
408
+ const types = files.find((f) => f.path.endsWith('types/index.ts'))!
409
+ expect(types.content).toMatch(/export interface ContactRefDto \{\s+id: string;\s+displayName: string;\s+\}/)
410
+ })
411
+
412
+ it('imports {Entity}RefDto into the service', () => {
413
+ const files = generate(fixture())
414
+ const service = files.find((f) => f.path.endsWith('contactService.ts'))!
415
+ expect(service.content).toMatch(/import type \{[^}]*ContactRefDto[^}]*\} from '\.\.\/types'/)
416
+ })
417
+
418
+ it('emits getLookup service method hitting GET ${API_PATH}/lookup with search/page/pageSize params', () => {
419
+ const files = generate(fixture())
420
+ const service = files.find((f) => f.path.endsWith('contactService.ts'))!
421
+ expect(service.content).toMatch(/getLookup: async \(params\?: \{ search\?: string; page\?: number; pageSize\?: number \}\)/)
422
+ expect(service.content).toMatch(/api\.get<PaginatedResult<ContactRefDto>>\(`\$\{API_PATH\}\/lookup`, \{ params \}\)/)
423
+ expect(service.content).toMatch(/return data;/)
424
+ })
425
+
426
+ it('emits use{Entity}Lookup hook with useState pattern', () => {
427
+ const files = generate(fixture())
428
+ const hook = files.find((f) => f.path.endsWith('useContact.ts'))!
429
+ expect(hook.content).toMatch(/export function useContactLookup\(params\?: \{ search\?: string; page\?: number; pageSize\?: number \}\)/)
430
+ expect(hook.content).toMatch(/contactService\.getLookup\(params\)/)
431
+ expect(hook.content).toMatch(/useState/)
432
+ })
433
+ })
434
+
435
+ describe('scaffold-api-client / generate — Wave E (useScreens=true, screen-driven mode)', () => {
436
+ it('sets API_PATH to /api/screens/{plural-kebab} when useScreens=true', () => {
437
+ const files = generate(fixture({ useScreens: true }))
438
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
439
+ expect(service.content).toMatch(/const API_PATH = '\/api\/screens\/contacts';/)
440
+ expect(service.content).not.toMatch(/const API_PATH = '\/api\/crm\/contacts';/)
441
+ })
442
+
443
+ it('declares INTEGRATION_PATH for delete + getLookup fallback', () => {
444
+ const files = generate(fixture({ useScreens: true }))
445
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
446
+ expect(service.content).toMatch(/const INTEGRATION_PATH = '\/api\/v1\/integration\/contacts';/)
447
+ })
448
+
449
+ it('default routeMode (direct) → /api/{appCode}/{module}/{section}', () => {
450
+ const files = generate(fixture()) // default routeMode = 'direct'
451
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
452
+ expect(service.content).toMatch(/const API_PATH = '\/api\/testv2\/crm\/directory';/)
453
+ expect(service.content).not.toMatch(/INTEGRATION_PATH/)
454
+ })
455
+
456
+ it('routeMode integration → /api/v1/integration/{plural}', () => {
457
+ const files = generate(fixture({ routeMode: 'integration' }))
458
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
459
+ expect(service.content).toMatch(/const API_PATH = '\/api\/v1\/integration\/contacts';/)
460
+ expect(service.content).not.toMatch(/INTEGRATION_PATH/)
461
+ })
462
+
463
+ it('getAll hits /list and getById hits /detail/{id} in screen-driven mode', () => {
464
+ const files = generate(fixture({ useScreens: true }))
465
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
466
+ expect(service.content).toMatch(/api\.get<PaginatedResult<ContactListDto>>\(`\$\{API_PATH\}\/list`/)
467
+ expect(service.content).toMatch(/api\.get<ContactDetailDto>\(`\$\{API_PATH\}\/detail\/\$\{id\}`/)
468
+ })
469
+
470
+ it('create POSTs to /form and update PUTs to /form/{id} in screen-driven mode', () => {
471
+ const files = generate(fixture({ useScreens: true }))
472
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
473
+ expect(service.content).toMatch(/api\.post<string>\(`\$\{API_PATH\}\/form`,/)
474
+ expect(service.content).toMatch(/api\.put\(`\$\{API_PATH\}\/form\/\$\{id\}`,/)
475
+ })
476
+
477
+ it('delete falls back to INTEGRATION_PATH in screen-driven mode', () => {
478
+ const files = generate(fixture({ useScreens: true }))
479
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
480
+ expect(service.content).toMatch(/api\.delete\(`\$\{INTEGRATION_PATH\}\/\$\{id\}`\)/)
481
+ })
482
+
483
+ it('getLookup falls back to INTEGRATION_PATH in screen-driven mode', () => {
484
+ const files = generate(fixture({ useScreens: true }))
485
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
486
+ expect(service.content).toMatch(/api\.get<PaginatedResult<ContactRefDto>>\(`\$\{INTEGRATION_PATH\}\/lookup`,/)
487
+ })
488
+ })
489
+
490
+ describe('scaffold-api-client / generate — Wave F1 (screen-driven DTOs shaped from pagespec columns)', () => {
491
+ function entityWithScreenColumns() {
492
+ return {
493
+ name: 'Contact',
494
+ section: 'directory',
495
+ hasDashboard: false,
496
+ fields: [
497
+ // Random domain fields the BA does NOT want exposed on the list view.
498
+ // Phase 3a should NOT pick the first 5 of these — it should follow
499
+ // the pagespec columns instead.
500
+ { name: 'firstName', type: 'string', required: true },
501
+ { name: 'lastName', type: 'string', required: true },
502
+ { name: 'email', type: 'string', required: false },
503
+ { name: 'phone', type: 'string', required: false },
504
+ { name: 'internalNotes', type: 'string', required: false },
505
+ { name: 'secretField', type: 'string', required: false }, // never on the list
506
+ ],
507
+ screenColumns: {
508
+ list: [
509
+ { key: 'fullName', formatHint: 'string' },
510
+ { key: 'status', formatHint: 'string' },
511
+ { key: 'lastContactAt', formatHint: 'datetime' },
512
+ ],
513
+ detail: [
514
+ { key: 'fullName', formatHint: 'string' },
515
+ { key: 'status', formatHint: 'string' },
516
+ { key: 'lastContactAt', formatHint: 'datetime' },
517
+ { key: 'totalOrders', formatHint: 'integer' },
518
+ { key: 'revenue', formatHint: 'currency' },
519
+ ],
520
+ },
521
+ }
522
+ }
523
+
524
+ it('shapes ContactListDto from pagespec list columns (not from entity.fields)', () => {
525
+ const files = generate(fixture({ useScreens: true, entities: [entityWithScreenColumns()] }))
526
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
527
+ expect(types.content).toMatch(/interface ContactListDto \{[\s\S]*?fullName: string;[\s\S]*?status: string;[\s\S]*?lastContactAt: string;[\s\S]*?\}/)
528
+ // Domain fields NOT in pagespec columns must NOT leak into the list DTO.
529
+ expect(types.content.split('export interface ContactDetailDto')[0]).not.toMatch(/firstName:/)
530
+ expect(types.content.split('export interface ContactDetailDto')[0]).not.toMatch(/secretField:/)
531
+ })
532
+
533
+ it('shapes ContactDetailDto from pagespec detail columns (richer than list)', () => {
534
+ const files = generate(fixture({ useScreens: true, entities: [entityWithScreenColumns()] }))
535
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
536
+ // Detail superset: all list cols + totalOrders + revenue.
537
+ expect(types.content).toMatch(/interface ContactDetailDto \{[\s\S]*?totalOrders: number;[\s\S]*?revenue: number;[\s\S]*?\}/)
538
+ })
539
+
540
+ it('maps formatHint to TS type exactly like dotnetTypeFor on the backend (parity)', () => {
541
+ const cols = [
542
+ { key: 'price', formatHint: 'currency' },
543
+ { key: 'qty', formatHint: 'integer' },
544
+ { key: 'active', formatHint: 'boolean' },
545
+ { key: 'createdAt', formatHint: 'datetime' },
546
+ { key: 'ownerId', formatHint: 'guid' },
547
+ { key: 'note', formatHint: 'whatever' }, // fallback
548
+ ]
549
+ const ent = { ...entityWithScreenColumns(), screenColumns: { list: cols, detail: cols } }
550
+ const files = generate(fixture({ useScreens: true, entities: [ent] }))
551
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
552
+ expect(types.content).toMatch(/price: number;/)
553
+ expect(types.content).toMatch(/qty: number;/)
554
+ expect(types.content).toMatch(/active: boolean;/)
555
+ expect(types.content).toMatch(/createdAt: string;/) // ISO-8601 on the wire
556
+ expect(types.content).toMatch(/ownerId: string;/)
557
+ expect(types.content).toMatch(/note: string;/) // default fallback
558
+ })
559
+
560
+ it('falls back to legacy entity.fields when screenColumns is omitted even if useScreens=true', () => {
561
+ // Backward compat: a project that flips useScreens but has not yet wired
562
+ // pagespec columns into the spec still gets a working (best-effort) TS DTO.
563
+ const ent = {
564
+ name: 'Contact',
565
+ section: 'directory',
566
+ hasDashboard: false,
567
+ fields: [
568
+ { name: 'firstName', type: 'string', required: true },
569
+ { name: 'lastName', type: 'string', required: true },
570
+ ],
571
+ }
572
+ const files = generate(fixture({ useScreens: true, entities: [ent] }))
573
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
574
+ expect(types.content).toMatch(/firstName: string;/)
575
+ expect(types.content).toMatch(/lastName: string;/)
576
+ })
577
+
578
+ it('uses screenColumns regardless of useScreens / routeMode (Wave F5 — gate removed)', () => {
579
+ // Wave F5 (2026-05-27): screenColumns now win in ALL route modes.
580
+ // Previously gated behind `isScreenMode`, which made `direct`-mode DTOs
581
+ // fall back to entity.fields.slice(0,5) and silently mismatch the C# DTO.
582
+ const files = generate(fixture({ useScreens: false, entities: [entityWithScreenColumns()] }))
583
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
584
+ // List DTO comes from pagespec columns — fullName/status/lastContactAt.
585
+ const listSlice = types.content.split('export interface ContactDetailDto')[0]
586
+ expect(listSlice).toMatch(/fullName: string;/)
587
+ expect(listSlice).toMatch(/status: string;/)
588
+ expect(listSlice).toMatch(/lastContactAt: string;/)
589
+ // Domain fields not in pagespec MUST NOT leak into the list shape.
590
+ expect(listSlice).not.toMatch(/firstName:/)
591
+ expect(listSlice).not.toMatch(/secretField:/)
592
+ })
593
+
594
+ it('uses screenColumns in direct mode (the REFERENTIELS regression class)', () => {
595
+ // Closes the bug where direct-mode DTOs were shaped from
596
+ // entity.fields.slice(0,5) — wrong fields + wrong types vs the actual
597
+ // C# controller response (Employe/Secteur/Site etc. in GAF).
598
+ const files = generate({
599
+ module: 'crm',
600
+ appCode: 'app',
601
+ entities: [{
602
+ name: 'Contact',
603
+ section: 'contacts',
604
+ hasDashboard: false,
605
+ fields: [
606
+ // Pure domain fields — must NOT drive the wire shape any more.
607
+ { name: 'firstName', type: 'string', required: true },
608
+ { name: 'lastName', type: 'string', required: true },
609
+ { name: 'internalNotes', type: 'string', required: false },
610
+ ],
611
+ screenColumns: {
612
+ list: [
613
+ { key: 'name' },
614
+ { key: 'score', formatHint: 'number' },
615
+ { key: 'isActive', formatHint: 'boolean' },
616
+ ],
617
+ },
618
+ }],
619
+ projectPath: '/test',
620
+ routeMode: 'direct',
621
+ })
622
+
623
+ const types = files.find(f => f.path.includes('types/index.ts'))!
624
+ const listSlice = types.content.split('export interface ContactDetailDto')[0]
625
+ // Shaped from screenColumns, not entity.fields
626
+ expect(listSlice).toMatch(/name: string;/)
627
+ expect(listSlice).toMatch(/score: number;/)
628
+ expect(listSlice).toMatch(/isActive: boolean;/)
629
+ expect(listSlice).not.toMatch(/firstName:/)
630
+ expect(listSlice).not.toMatch(/internalNotes:/)
631
+ })
632
+
633
+ it('falls back to entity.fields.slice(0,5) when screenColumns absent in direct mode', () => {
634
+ // Backward compatibility — any spec that hasn't been migrated to carry
635
+ // pagespec columns still emits a well-formed DTO (best effort).
636
+ const files = generate({
637
+ module: 'crm',
638
+ appCode: 'app',
639
+ entities: [{
640
+ name: 'Contact',
641
+ section: 'contacts',
642
+ hasDashboard: false,
643
+ fields: [
644
+ { name: 'Name', type: 'string', required: true },
645
+ { name: 'Email', type: 'string', required: false },
646
+ { name: 'Phone', type: 'string', required: false },
647
+ { name: 'Score', type: 'int', required: true },
648
+ { name: 'Active', type: 'bool', required: true },
649
+ { name: 'Notes', type: 'string', required: false },
650
+ ],
651
+ // screenColumns intentionally omitted
652
+ }],
653
+ projectPath: '/test',
654
+ routeMode: 'direct',
655
+ })
656
+
657
+ const types = files.find(f => f.path.includes('types/index.ts'))!
658
+ const listSlice = types.content.split('export interface ContactDetailDto')[0]
659
+ // First 5 fields used; 6th (notes) excluded from the list shape.
660
+ expect(listSlice).toMatch(/name: string;/)
661
+ expect(listSlice).toMatch(/active: boolean;/)
662
+ expect(listSlice).not.toMatch(/notes:/)
663
+ })
664
+
665
+ it('Create/Update Dtos still derive from entity.fields (form posts use the integration command shape)', () => {
666
+ // The screen-driven /form endpoint reuses Create{E}Command from the
667
+ // integration stratum (scaffold-screen-controller emits exactly that).
668
+ // So the TS Create{E}Dto must follow entity.fields, NOT screenColumns.
669
+ const files = generate(fixture({ useScreens: true, entities: [entityWithScreenColumns()] }))
670
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
671
+ expect(types.content).toMatch(/interface CreateContactDto \{[\s\S]*?firstName: string;[\s\S]*?lastName: string;[\s\S]*?\}/)
672
+ expect(types.content).toMatch(/interface UpdateContactDto \{[\s\S]*?firstName: string;[\s\S]*?email\?: string;[\s\S]*?\}/)
673
+ })
674
+
675
+ it('detail falls back to list columns when no detail columns are provided', () => {
676
+ const ent = {
677
+ ...entityWithScreenColumns(),
678
+ screenColumns: {
679
+ list: [{ key: 'fullName', formatHint: 'string' }, { key: 'status', formatHint: 'string' }],
680
+ // detail omitted on purpose
681
+ },
682
+ }
683
+ const files = generate(fixture({ useScreens: true, entities: [ent] }))
684
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
685
+ expect(types.content).toMatch(/interface ContactDetailDto \{[\s\S]*?fullName: string;[\s\S]*?status: string;[\s\S]*?\}/)
686
+ })
687
+ })
688
+
689
+ describe('scaffold-api-client / generate — Fix #1 (sub-resource parentPath)', () => {
690
+ function subResourceFixture(overrides: Partial<ScaffoldApiClientInput> = {}): ScaffoldApiClientInput {
691
+ return {
692
+ module: 'referentiels',
693
+ appCode: 'gaf',
694
+ entities: [{
695
+ name: 'Rue',
696
+ pluralName: 'Rues',
697
+ section: 'rues',
698
+ parentPath: '/api/gaf/referentiels/sites/{parentId}/rues',
699
+ parentIdParam: 'siteId',
700
+ hasDashboard: false,
701
+ fields: [{ name: 'nomRue', type: 'string', required: true }],
702
+ }],
703
+ projectPath: '/test',
704
+ routeMode: 'direct',
705
+ ...overrides,
706
+ } as ScaffoldApiClientInput
707
+ }
708
+
709
+ it('emits API_PATH as a function (parentId) => string when parentPath is set', () => {
710
+ const files = generate(subResourceFixture())
711
+ const service = files.find(f => f.path.endsWith('rueService.ts'))!
712
+ expect(service.content).toMatch(/const API_PATH = \(siteId: string\) =>/)
713
+ // Template substitution: `{parentId}` placeholder replaced by `${siteId}`
714
+ expect(service.content).toMatch(/`\/api\/gaf\/referentiels\/sites\/\$\{siteId\}\/rues`/)
715
+ })
716
+
717
+ it('every CRUD service method takes siteId as its first argument', () => {
718
+ const files = generate(subResourceFixture())
719
+ const service = files.find(f => f.path.endsWith('rueService.ts'))!
720
+ expect(service.content).toMatch(/getAll: async \(siteId: string, params\?:/)
721
+ expect(service.content).toMatch(/getById: async \(siteId: string, id: string\)/)
722
+ expect(service.content).toMatch(/create: async \(siteId: string, payload: CreateRueDto\)/)
723
+ expect(service.content).toMatch(/update: async \(siteId: string, id: string, payload: UpdateRueDto\)/)
724
+ expect(service.content).toMatch(/delete: async \(siteId: string, id: string\)/)
725
+ expect(service.content).toMatch(/getLookup: async \(siteId: string, params\?:/)
726
+ })
727
+
728
+ it('every CRUD service method calls API_PATH(siteId) in its URL template', () => {
729
+ const files = generate(subResourceFixture())
730
+ const service = files.find(f => f.path.endsWith('rueService.ts'))!
731
+ // getAll uses the function call as the URL prefix
732
+ expect(service.content).toMatch(/api\.get<PaginatedResult<RueListDto>>\(API_PATH\(siteId\), \{ params \}\)/)
733
+ // getById/update/delete use it inside template literals with /${id}
734
+ expect(service.content).toMatch(/`\$\{API_PATH\(siteId\)\}\/\$\{id\}`/)
735
+ })
736
+
737
+ it('every hook propagates the parent ID into its signature and service call', () => {
738
+ const files = generate(subResourceFixture())
739
+ const hook = files.find(f => f.path.endsWith('useRue.ts'))!
740
+ // List + detail hooks
741
+ expect(hook.content).toMatch(/export function useRues\(siteId: string, params\?:/)
742
+ expect(hook.content).toMatch(/export function useRue\(siteId: string, id: string\)/)
743
+ // Mutation hooks bind the parent ID at hook-instantiation time
744
+ expect(hook.content).toMatch(/export function useCreateRue\(siteId: string\)/)
745
+ expect(hook.content).toMatch(/export function useUpdateRue\(siteId: string\)/)
746
+ expect(hook.content).toMatch(/export function useDeleteRue\(siteId: string\)/)
747
+ // Service calls thread siteId through
748
+ expect(hook.content).toMatch(/rueService\.getAll\(siteId, params\)/)
749
+ expect(hook.content).toMatch(/rueService\.create\(siteId, data\)/)
750
+ })
751
+
752
+ it('rejects parentPath + useScreens combo (mutually exclusive)', () => {
753
+ expect(() => generate(subResourceFixture({ useScreens: true }))).toThrow(
754
+ /parentPath.*screen mode.*mutually exclusive/i,
755
+ )
756
+ })
757
+
758
+ it('non-nested entities keep their legacy signatures byte-for-byte (backward compat)', () => {
759
+ // Default fixture is a flat Contact — no parentPath. The emitted service
760
+ // must NOT carry any parentId parameter anywhere.
761
+ const files = generate(fixture())
762
+ const service = files.find(f => f.path.endsWith('contactService.ts'))!
763
+ expect(service.content).toMatch(/const API_PATH = '/) // plain string constant
764
+ expect(service.content).not.toMatch(/const API_PATH = \(/) // not a function
765
+ expect(service.content).toMatch(/getAll: async \(params\?:/)
766
+ expect(service.content).toMatch(/getById: async \(id: string\)/)
767
+ })
768
+ })
769
+
770
+ describe('scaffold-api-client / generate — Wave F5 (PaginatedResult.totalCount alignment)', () => {
771
+ it('emits totalCount (not total) in PaginatedResult — matches SmartStack.app PaginatedResult<T>.TotalCount', () => {
772
+ const files = generate(fixture())
773
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
774
+ expect(types.content).toMatch(/totalCount: number;/)
775
+ // The historical `total: number` is gone — it silently dropped the count
776
+ // for every paginated endpoint because the JSON key was always `totalCount`.
777
+ expect(types.content).not.toMatch(/^\s*total: number;/m)
778
+ })
779
+
780
+ it('totalCount field is exported in all route modes (direct, integration, screens)', () => {
781
+ for (const mode of ['direct', 'integration'] as const) {
782
+ const f = generate(fixture({ routeMode: mode })).find(x => x.path.endsWith('types/index.ts'))!
783
+ expect(f.content, `routeMode=${mode}`).toMatch(/totalCount: number;/)
784
+ }
785
+ const screens = generate(fixture({ useScreens: true })).find(x => x.path.endsWith('types/index.ts'))!
786
+ expect(screens.content, 'useScreens=true').toMatch(/totalCount: number;/)
787
+ })
788
+ })
789
+
790
+ describe('scaffold-api-client / generate — Bug 1 (custom action payload/response types are emitted + imported)', () => {
791
+ // Reproducer: AFFAIRES/Demande pagespecs referenced CloseRequest, RefuseBalanceRequest,
792
+ // ReconductRequest, ReconductResponse, PrimeApiExportFile in their customActions.
793
+ // The CLI never declared nor imported these, so the generated <entity>Service.ts
794
+ // failed compilation with TS2304 « cannot find name CloseRequest » 7 times.
795
+ it('emits permissive placeholder interface when *Shape is missing', () => {
796
+ const files = generate({
797
+ module: 'affaires',
798
+ appCode: 'gaf',
799
+ entities: [{
800
+ name: 'Demande',
801
+ section: 'demandes',
802
+ hasDashboard: false,
803
+ fields: [{ name: 'Numero', type: 'string', required: true }],
804
+ customActions: [{
805
+ code: 'close',
806
+ kind: 'api',
807
+ scope: 'row',
808
+ httpMethod: 'post',
809
+ payloadType: 'CloseRequest',
810
+ responseType: 'void',
811
+ }],
812
+ }],
813
+ projectPath: '/test',
814
+ routeMode: 'direct',
815
+ })
816
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
817
+ expect(types.content).toMatch(/export interface CloseRequest \{/)
818
+ expect(types.content).toMatch(/\[key: string\]: unknown;/)
819
+ expect(types.content).toMatch(/TODO\[BA-SHAPE\]/)
820
+ })
821
+
822
+ it('emits typed interface when payloadShape is provided', () => {
823
+ const files = generate({
824
+ module: 'affaires',
825
+ appCode: 'gaf',
826
+ entities: [{
827
+ name: 'Demande',
828
+ section: 'demandes',
829
+ hasDashboard: false,
830
+ fields: [{ name: 'Numero', type: 'string', required: true }],
831
+ customActions: [{
832
+ code: 'reconduct',
833
+ kind: 'api',
834
+ scope: 'row',
835
+ httpMethod: 'post',
836
+ payloadType: 'ReconductRequest',
837
+ payloadShape: { motif: 'string', newDeadline: 'string' },
838
+ responseType: 'ReconductResponse',
839
+ responseShape: { newId: 'string', warnings: 'string[]' },
840
+ }],
841
+ }],
842
+ projectPath: '/test',
843
+ routeMode: 'direct',
844
+ })
845
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
846
+ expect(types.content).toMatch(/export interface ReconductRequest \{/)
847
+ expect(types.content).toMatch(/motif: string;/)
848
+ expect(types.content).toMatch(/newDeadline: string;/)
849
+ expect(types.content).toMatch(/export interface ReconductResponse \{/)
850
+ expect(types.content).toMatch(/newId: string;/)
851
+ expect(types.content).toMatch(/warnings: string\[\];/)
852
+ })
853
+
854
+ it('imports custom payload/response types in the service file', () => {
855
+ const files = generate({
856
+ module: 'affaires',
857
+ appCode: 'gaf',
858
+ entities: [{
859
+ name: 'Demande',
860
+ section: 'demandes',
861
+ hasDashboard: false,
862
+ fields: [{ name: 'Numero', type: 'string', required: true }],
863
+ customActions: [
864
+ { code: 'close', scope: 'row', payloadType: 'CloseRequest', responseType: 'void' },
865
+ { code: 'export', scope: 'header', payloadType: null, responseType: 'PrimeApiExportFile' },
866
+ ],
867
+ }],
868
+ projectPath: '/test',
869
+ routeMode: 'direct',
870
+ })
871
+ const service = files.find(f => f.path.endsWith('demandeService.ts'))!
872
+ expect(service.content).toMatch(/import type \{[^}]*CloseRequest[^}]*\} from '\.\.\/types'/)
873
+ expect(service.content).toMatch(/import type \{[^}]*PrimeApiExportFile[^}]*\} from '\.\.\/types'/)
874
+ })
875
+
876
+ it('does NOT re-emit entity DTOs already exported by the file (no collision)', () => {
877
+ const files = generate({
878
+ module: 'budgets',
879
+ appCode: 'TestV2',
880
+ entities: [{
881
+ name: 'Budget',
882
+ section: 'budgets',
883
+ hasDashboard: false,
884
+ fields: [{ name: 'Code', type: 'string', required: true }],
885
+ customActions: [{
886
+ code: 'duplicate',
887
+ scope: 'row',
888
+ payloadType: null,
889
+ // Reuses the entity's own DTO as a response — must not be re-declared.
890
+ responseType: 'BudgetDetailDto',
891
+ }],
892
+ }],
893
+ projectPath: '/test',
894
+ routeMode: 'direct',
895
+ })
896
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
897
+ // BudgetDetailDto exists exactly once (the entity DTO declaration).
898
+ const matches = types.content.match(/export interface BudgetDetailDto \{/g) ?? []
899
+ expect(matches.length).toBe(1)
900
+ })
901
+
902
+ it('does NOT emit declarations for TS builtins (void/string/string[])', () => {
903
+ const files = generate({
904
+ module: 'budgets',
905
+ appCode: 'TestV2',
906
+ entities: [{
907
+ name: 'Budget',
908
+ section: 'budgets',
909
+ hasDashboard: false,
910
+ fields: [{ name: 'Code', type: 'string', required: true }],
911
+ customActions: [
912
+ { code: 'archive', scope: 'row', payloadType: null, responseType: 'void' },
913
+ { code: 'export', scope: 'header', payloadType: null, responseType: 'string' },
914
+ ],
915
+ }],
916
+ projectPath: '/test',
917
+ routeMode: 'direct',
918
+ })
919
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
920
+ expect(types.content).not.toMatch(/export interface void/)
921
+ expect(types.content).not.toMatch(/export interface string/)
922
+ })
923
+ })
924
+
925
+ describe('scaffold-api-client / generate — Bug 2 (entity alias export)', () => {
926
+ // Reproducer: scaffold-component pages emitted `import { Demande } from '.../types'`
927
+ // but scaffold-api-client only exported `DemandeListDto` + `DemandeDetailDto`,
928
+ // triggering 4× TS2305 « no exported member ».
929
+ it('exports {E} as an alias of {E}DetailDto', () => {
930
+ const files = generate(fixture())
931
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
932
+ expect(types.content).toMatch(/export type Contact = ContactDetailDto;/)
933
+ })
934
+
935
+ it('alias works in every route mode (direct, integration, screens)', () => {
936
+ for (const mode of ['direct', 'integration', 'screens'] as const) {
937
+ const f = generate(
938
+ mode === 'screens' ? fixture({ useScreens: true }) : fixture({ routeMode: mode }),
939
+ ).find(x => x.path.endsWith('types/index.ts'))!
940
+ expect(f.content, `mode=${mode}`).toMatch(/export type Contact = ContactDetailDto;/)
941
+ }
942
+ })
943
+ })
944
+
945
+ describe('scaffold-api-client / generate — Bug 3 (custom hook mutateAsync arg count)', () => {
946
+ // Reproducer: `useCloseDemande` called `service.close(arg)` with a single
947
+ // argument while `service.close(id, payload)` expected two — TS2554.
948
+ it('row-scope + payload hook signature is mutateAsync({ id, payload })', () => {
949
+ const files = generate({
950
+ module: 'budgets',
951
+ appCode: 'TestV2',
952
+ entities: [{
953
+ name: 'Budget',
954
+ section: 'budgets',
955
+ hasDashboard: false,
956
+ fields: [{ name: 'Code', type: 'string', required: true }],
957
+ customActions: [{
958
+ code: 'approve',
959
+ scope: 'row',
960
+ payloadType: 'ApproveRequest',
961
+ responseType: 'void',
962
+ }],
963
+ }],
964
+ projectPath: '/test',
965
+ routeMode: 'direct',
966
+ })
967
+ const hook = files.find(f => f.path.endsWith('useBudget.ts'))!
968
+ // The hook destructures { id, payload } AND threads both into the service call.
969
+ expect(hook.content).toMatch(/const mutateAsync = async \(\{ id, payload \}: \{ id: string; payload: ApproveRequest \}\)/)
970
+ expect(hook.content).toMatch(/budgetService\.approve\(id, payload\)/)
971
+ // The legacy `(idOrPayload: unknown)` / `as never` shape MUST be gone.
972
+ expect(hook.content).not.toMatch(/idOrPayload: unknown/)
973
+ expect(hook.content).not.toMatch(/as never/)
974
+ })
975
+
976
+ it('row-scope without payload keeps mutateAsync(id: string)', () => {
977
+ const files = generate({
978
+ module: 'budgets',
979
+ appCode: 'TestV2',
980
+ entities: [{
981
+ name: 'Budget',
982
+ section: 'budgets',
983
+ hasDashboard: false,
984
+ fields: [{ name: 'Code', type: 'string', required: true }],
985
+ customActions: [{ code: 'archive', scope: 'row', payloadType: null, responseType: 'void' }],
986
+ }],
987
+ projectPath: '/test',
988
+ routeMode: 'direct',
989
+ })
990
+ const hook = files.find(f => f.path.endsWith('useBudget.ts'))!
991
+ expect(hook.content).toMatch(/const mutateAsync = async \(id: string\)/)
992
+ expect(hook.content).toMatch(/budgetService\.archive\(id\)/)
993
+ })
994
+
995
+ it('bulk-scope with payload uses mutateAsync(payload)', () => {
996
+ const files = generate({
997
+ module: 'budgets',
998
+ appCode: 'TestV2',
999
+ entities: [{
1000
+ name: 'Budget',
1001
+ section: 'budgets',
1002
+ hasDashboard: false,
1003
+ fields: [{ name: 'Code', type: 'string', required: true }],
1004
+ customActions: [{
1005
+ code: 'bulk-archive',
1006
+ scope: 'bulk',
1007
+ payloadType: 'BulkArchiveRequest',
1008
+ responseType: 'void',
1009
+ }],
1010
+ }],
1011
+ projectPath: '/test',
1012
+ routeMode: 'direct',
1013
+ })
1014
+ const hook = files.find(f => f.path.endsWith('useBudget.ts'))!
1015
+ expect(hook.content).toMatch(/const mutateAsync = async \(payload: BulkArchiveRequest\)/)
1016
+ expect(hook.content).toMatch(/budgetService\.bulkArchive\(payload\)/)
1017
+ })
1018
+
1019
+ it('header-scope without payload emits mutateAsync()', () => {
1020
+ const files = generate({
1021
+ module: 'budgets',
1022
+ appCode: 'TestV2',
1023
+ entities: [{
1024
+ name: 'Budget',
1025
+ section: 'budgets',
1026
+ hasDashboard: false,
1027
+ fields: [{ name: 'Code', type: 'string', required: true }],
1028
+ customActions: [{ code: 'export', scope: 'header', payloadType: null, responseType: 'void' }],
1029
+ }],
1030
+ projectPath: '/test',
1031
+ routeMode: 'direct',
1032
+ })
1033
+ const hook = files.find(f => f.path.endsWith('useBudget.ts'))!
1034
+ expect(hook.content).toMatch(/const mutateAsync = async \(\): Promise<void>/)
1035
+ expect(hook.content).toMatch(/budgetService\.export\(\)/)
1036
+ })
1037
+
1038
+ it('header-scope + payload + parent threads parentId into service call', () => {
1039
+ const files = generate({
1040
+ module: 'referentiels',
1041
+ appCode: 'gaf',
1042
+ entities: [{
1043
+ name: 'Rue',
1044
+ section: 'rues',
1045
+ parentPath: '/api/gaf/referentiels/sites/{parentId}/rues',
1046
+ parentIdParam: 'siteId',
1047
+ hasDashboard: false,
1048
+ fields: [{ name: 'NomRue', type: 'string', required: true }],
1049
+ customActions: [{
1050
+ code: 'sync',
1051
+ scope: 'header',
1052
+ payloadType: 'SyncRequest',
1053
+ responseType: 'void',
1054
+ }],
1055
+ }],
1056
+ projectPath: '/test',
1057
+ routeMode: 'direct',
1058
+ })
1059
+ const hook = files.find(f => f.path.endsWith('useRue.ts'))!
1060
+ // Hook signature carries siteId; mutateAsync takes only the payload; call
1061
+ // threads both: service.sync(siteId, payload).
1062
+ expect(hook.content).toMatch(/export function useSyncRue\(siteId: string\)/)
1063
+ expect(hook.content).toMatch(/const mutateAsync = async \(payload: SyncRequest\)/)
1064
+ expect(hook.content).toMatch(/rueService\.sync\(siteId, payload\)/)
1065
+ })
1066
+ })
1067
+
1068
+ describe('scaffold-api-client / generate — Bug 8 (DetailDto = union(entity.fields, screenColumns.detail))', () => {
1069
+ // Reproducer: AFFAIRES/Demande pagespec declared screenColumns.detail without
1070
+ // localityData / addressData / parcelData (JSON-snapshot nvarchar(max) fields
1071
+ // present in entity.fields). The edit form fetched DemandeDetailDto then tried
1072
+ // to pre-fill these fields — TypeScript reported "property does not exist on
1073
+ // type DemandeDetailDto" because the DTO had no clue about them.
1074
+ it('DetailDto includes entity.fields not present in screenColumns.detail', () => {
1075
+ const files = generate({
1076
+ module: 'affaires',
1077
+ appCode: 'gaf',
1078
+ entities: [{
1079
+ name: 'Demande',
1080
+ section: 'demandes',
1081
+ hasDashboard: false,
1082
+ fields: [
1083
+ { name: 'Numero', type: 'string', required: true },
1084
+ { name: 'LocalityData', type: 'string', required: false }, // JSON snapshot, missing from detail
1085
+ { name: 'AddressData', type: 'string', required: false },
1086
+ { name: 'ParcelData', type: 'string', required: false },
1087
+ ],
1088
+ screenColumns: {
1089
+ list: [{ key: 'numero', formatHint: 'string' }],
1090
+ // Only Numero in detail — the 3 JSON fields are intentionally absent.
1091
+ detail: [{ key: 'numero', formatHint: 'string' }],
1092
+ },
1093
+ }],
1094
+ projectPath: '/test',
1095
+ routeMode: 'direct',
1096
+ })
1097
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
1098
+ // DetailDto contains every entity field, regardless of whether the BA listed it.
1099
+ expect(types.content).toMatch(/export interface DemandeDetailDto \{[\s\S]*?numero:[\s\S]*?localityData\?: string;[\s\S]*?addressData\?: string;[\s\S]*?parcelData\?: string;/)
1100
+ })
1101
+
1102
+ it('DetailDto preserves screenColumns.detail order before entity.fields extras', () => {
1103
+ const files = generate({
1104
+ module: 'affaires',
1105
+ appCode: 'gaf',
1106
+ entities: [{
1107
+ name: 'Demande',
1108
+ section: 'demandes',
1109
+ hasDashboard: false,
1110
+ fields: [
1111
+ { name: 'Numero', type: 'string', required: true },
1112
+ { name: 'Snapshot', type: 'string', required: false },
1113
+ ],
1114
+ screenColumns: {
1115
+ detail: [
1116
+ { key: 'numero', formatHint: 'string' },
1117
+ { key: 'displayedStatus', formatHint: 'string' }, // computed display field
1118
+ ],
1119
+ },
1120
+ }],
1121
+ projectPath: '/test',
1122
+ routeMode: 'direct',
1123
+ })
1124
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
1125
+ // displayedStatus (column-only) appears BEFORE snapshot (entity-only).
1126
+ const detailMatch = types.content.match(/export interface DemandeDetailDto \{([\s\S]*?)\n\}/)
1127
+ expect(detailMatch).toBeTruthy()
1128
+ const body = detailMatch![1]
1129
+ const numeroIdx = body.indexOf('numero:')
1130
+ const displayedIdx = body.indexOf('displayedStatus:')
1131
+ const snapshotIdx = body.indexOf('snapshot?:')
1132
+ expect(numeroIdx).toBeGreaterThan(-1)
1133
+ expect(displayedIdx).toBeGreaterThan(numeroIdx)
1134
+ expect(snapshotIdx).toBeGreaterThan(displayedIdx)
1135
+ })
1136
+
1137
+ it('legacy fallback (no screenColumns) keeps entity.fields shape byte-for-byte', () => {
1138
+ const files = generate(fixture())
1139
+ const types = files.find(f => f.path.endsWith('types/index.ts'))!
1140
+ // Contact fixture has firstName + lastName in entity.fields, no screenColumns.
1141
+ expect(types.content).toMatch(/export interface ContactDetailDto \{[\s\S]*?firstName: string;[\s\S]*?lastName: string;/)
1142
+ })
1143
+ })
1144
+
1145
+ describe('scaffold-api-client / generate — Bug 5 (lookup hook contract is locked)', () => {
1146
+ it('always exports use{E}Lookup at hooks/use{E}.ts', () => {
1147
+ const files = generate(fixture())
1148
+ const hook = files.find(f => f.path === 'src/features/crm/contact/hooks/useContact.ts')
1149
+ expect(hook).toBeDefined()
1150
+ expect(hook!.content).toMatch(/export function useContactLookup/)
1151
+ })
1152
+
1153
+ it('lookup hook is emitted in every route mode (direct, integration, screens)', () => {
1154
+ for (const mode of ['direct', 'integration'] as const) {
1155
+ const f = generate(fixture({ routeMode: mode })).find(x => x.path.endsWith('useContact.ts'))!
1156
+ expect(f.content, `routeMode=${mode}`).toMatch(/export function useContactLookup/)
1157
+ }
1158
+ const screens = generate(fixture({ useScreens: true })).find(x => x.path.endsWith('useContact.ts'))!
1159
+ expect(screens.content, 'useScreens=true').toMatch(/export function useContactLookup/)
1160
+ })
1161
+
1162
+ it('lookup hook is emitted even when the entity has a parentPath (sub-resource)', () => {
1163
+ const files = generate({
1164
+ module: 'referentiels',
1165
+ appCode: 'gaf',
1166
+ entities: [{
1167
+ name: 'Rue',
1168
+ section: 'rues',
1169
+ parentPath: '/api/gaf/referentiels/sites/{parentId}/rues',
1170
+ parentIdParam: 'siteId',
1171
+ hasDashboard: false,
1172
+ fields: [{ name: 'NomRue', type: 'string', required: true }],
1173
+ }],
1174
+ projectPath: '/test',
1175
+ routeMode: 'direct',
1176
+ })
1177
+ const hook = files.find(f => f.path.endsWith('useRue.ts'))!
1178
+ expect(hook.content).toMatch(/export function useRueLookup\(siteId: string,/)
1179
+ })
1180
+ })