@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,875 @@
1
+ /**
2
+ * cli:scaffold-api-client — generate.ts
3
+ *
4
+ * Generates TypeScript service + React hooks (useState/useEffect) for a REST entity.
5
+ * Generated code depends on:
6
+ * - `@atlashub/smartstack` (npm) for the pre-configured HTTP client `api`
7
+ * (auth, tenant, retry built-in; returns unwrapped data, not AxiosResponse).
8
+ * - When `httpClient: 'axios'`, generates a local axios instance instead.
9
+ *
10
+ * URL convention — two strata only, no templated paths:
11
+ * useScreens=false → /api/v1/integration/{plural-kebab}
12
+ * useScreens=true → /api/screens/{plural-kebab}/{list|detail|form|...}
13
+ *
14
+ * Both are imported from `lib/url-conventions.ts` — the SAME helpers used by
15
+ * `scaffold-controller` and `scaffold-screen-controller`. Drift is impossible
16
+ * by construction.
17
+ */
18
+ import { buildDirectRoute, buildIntegrationRoute, buildScreenRoute } from '../../../../../lib/url-conventions.js'
19
+ import type { ScaffoldApiClientInput, GeneratedFile, ApiCustomAction, ApiScreenColumn } from './types.js'
20
+
21
+ export function generate(spec: ScaffoldApiClientInput): GeneratedFile[] {
22
+ const files: GeneratedFile[] = []
23
+
24
+ for (const entity of spec.entities) {
25
+ const e = entity.name
26
+ const eLower = e.charAt(0).toLowerCase() + e.slice(1)
27
+ const plural = entity.pluralName ?? e + 's'
28
+ const pluralLower = plural.charAt(0).toLowerCase() + plural.slice(1)
29
+ const pluralKebab = toKebab(plural)
30
+ // Route mode: backward compat — useScreens: true overrides routeMode
31
+ const effectiveMode = spec.useScreens ? 'screens' : (spec.routeMode ?? 'direct')
32
+ const isScreenMode = effectiveMode === 'screens'
33
+ const sectionKebab = toKebab(entity.section)
34
+ const directPath = buildDirectRoute(spec.appCode, spec.module, sectionKebab)
35
+ const integrationPath = buildIntegrationRoute(pluralKebab)
36
+ const apiPath = effectiveMode === 'screens'
37
+ ? buildScreenRoute(pluralKebab)
38
+ : effectiveMode === 'integration'
39
+ ? integrationPath
40
+ : directPath
41
+
42
+ // Sub-resource support (Fix #1, 2026-05-27): when entity.parentPath is set,
43
+ // API_PATH becomes a function `(parentId) => string` instead of a constant.
44
+ // Every service method/hook takes `parentId` as its first argument, and
45
+ // every URL reference uses `API_PATH(parentId)` instead of `API_PATH`. We
46
+ // refuse the combination with the screen stratum — the screen stratum has
47
+ // no nested URL convention and silently dropping the parent would mask the bug.
48
+ const hasParent = entity.parentPath !== undefined
49
+ if (hasParent && isScreenMode) {
50
+ throw new Error(
51
+ `scaffold-api-client: entity '${e}' carries parentPath but the spec is in screen mode — these are mutually exclusive. Use routeMode: 'direct' or 'integration' for sub-resources.`,
52
+ )
53
+ }
54
+ const parentIdParam = entity.parentIdParam ?? 'parentId'
55
+ // `parentArg` is the leading argument string emitted in every method
56
+ // signature (`parentId: string, `), empty when hasParent === false so all
57
+ // existing CLI consumers keep their old signatures byte-for-byte.
58
+ const parentArg = hasParent ? `${parentIdParam}: string, ` : ''
59
+ const parentArgCall = hasParent ? `${parentIdParam}, ` : ''
60
+ // `apiPathExpr` is the JS-side expression that resolves to the URL prefix:
61
+ // - flat: 'API_PATH' (constant string)
62
+ // - nested: 'API_PATH(parentId)' (call site of the helper)
63
+ const apiPathExpr = hasParent ? `API_PATH(${parentIdParam})` : 'API_PATH'
64
+ // `apiPathDecl` is the file-scope binding emitted at the top of the
65
+ // service file. For nested, we emit an arrow function that substitutes
66
+ // `{parentId}` in the template with the runtime parameter value.
67
+ const apiPathDecl = hasParent
68
+ ? `const API_PATH = (${parentIdParam}: string) => \`${entity.parentPath!.replace('{parentId}', '${' + parentIdParam + '}')}\``
69
+ : `const API_PATH = '${apiPath}'`
70
+ const featurePath = `src/features/${spec.module}/${eLower}`
71
+ const clientVar = spec.httpClient === 'axios' ? 'client' : 'api'
72
+ const needsUnwrap = spec.httpClient === 'axios'
73
+ const dr = needsUnwrap ? 'const { data }' : 'const data'
74
+ const clientImport = spec.httpClient === 'axios'
75
+ ? `import axios from 'axios';\n\nconst client = axios.create({ baseURL: '/', withCredentials: true });`
76
+ : `import { api } from '@atlashub/smartstack';`
77
+
78
+ // Wave F1 (2026-05-27) + Wave F5 (2026-05-27): pagespec columns shape the
79
+ // TS DTOs in EVERY route mode — direct, integration, screens. Previously
80
+ // gated behind `isScreenMode`, which made `direct`-mode DTOs fall back to
81
+ // `entity.fields.slice(0,5)` (random domain fields) and silently mismatch
82
+ // the C# DTO returned by the controller. The gate is gone: `screenColumns`
83
+ // now wins whenever it is provided; the legacy heuristic only kicks in for
84
+ // entities whose spec never carried column data (full backward compat).
85
+ const useScreenDtos = entity.screenColumns !== undefined
86
+ && (entity.screenColumns.list !== undefined || entity.screenColumns.detail !== undefined)
87
+
88
+ const listFields = useScreenDtos
89
+ ? renderListFromColumns(entity.screenColumns!.list)
90
+ : entity.fields.slice(0, 5).map(f => ` ${fieldCamel(f.name)}: ${mapTsType(f.type)};`).join('\n')
91
+ // Bug 8 fix — DetailDto is the **union** of `screenColumns.detail` and
92
+ // `entity.fields`. Prior to this, the edit form fetched DetailDto then tried
93
+ // to pre-fill fields that were only declared in `entity.fields` (e.g. JSON
94
+ // snapshot columns like `localityData`, `addressData`, `parcelData`). Result:
95
+ // « field not found » at runtime even though every other layer (Create/Update
96
+ // DTOs, the form input bindings) knew about them. Detail now always carries
97
+ // every entity field. screenColumns.detail order wins for display fields;
98
+ // entity.fields extras are appended.
99
+ const allFields = useScreenDtos
100
+ ? renderDetailFromColumns(entity.screenColumns!.detail, entity.screenColumns!.list, entity.fields)
101
+ : entity.fields.map(f => ` ${fieldCamel(f.name)}${f.required ? '' : '?'}: ${mapTsType(f.type)};`).join('\n')
102
+
103
+ const dashboardTypes = entity.hasDashboard
104
+ ? `
105
+
106
+ export interface ${e}DashboardConsolidatedDto {
107
+ /** Aggregated KPI metrics. Backend supplies the exact shape — the page
108
+ * renders Object.entries(data) so missing keys are no-ops. */
109
+ metrics: Record<string, number | string>;
110
+ /** Optional period echoed back from the query for consistency. */
111
+ startDate?: string;
112
+ endDate?: string;
113
+ }
114
+
115
+ export interface ${e}DashboardAlertDto {
116
+ id: string;
117
+ severity: 'info' | 'warning' | 'critical';
118
+ message: string;
119
+ createdAt: string;
120
+ acknowledgedAt?: string;
121
+ }`
122
+ : ''
123
+
124
+ // Filter `kind: 'navigate'` BEFORE collecting custom types — navigation
125
+ // actions never produce a service member, so their payload/response types
126
+ // are not used and must not pollute the imports.
127
+ const customActions = (entity.customActions ?? []).filter(a => a.kind !== 'navigate')
128
+
129
+ // Bug 1 fix — collect + emit type declarations for every custom action's
130
+ // `payloadType` / `responseType`. Must be computed BEFORE the types/index.ts
131
+ // push so the declarations land at the top of the emitted file.
132
+ const customTypeDecls = renderCustomTypeDeclarations(customActions, e)
133
+ const customTypeNames = collectCustomTypeNames(customActions, e)
134
+ const customTypeImports = customTypeNames.length > 0
135
+ ? `, ${customTypeNames.join(', ')}`
136
+ : ''
137
+
138
+ files.push({
139
+ path: `${featurePath}/types/index.ts`,
140
+ content: `${customTypeDecls}export interface ${e}ListDto {
141
+ id: string;
142
+ ${listFields}
143
+ createdAt: string;
144
+ }
145
+
146
+ export interface ${e}DetailDto {
147
+ id: string;
148
+ ${allFields}
149
+ createdAt: string;
150
+ updatedAt: string;
151
+ }
152
+
153
+ /**
154
+ * Convenience alias — when consumers (e.g. scaffold-component) reference the
155
+ * entity without a DTO suffix, resolve it to the detail shape (the most
156
+ * complete view of the entity). Bug 2 fix: prior to this alias, generated
157
+ * pages emitted "import { Demande }" against a module that only exported
158
+ * DemandeListDto + DemandeDetailDto — TS2305 « no exported member ». Now both
159
+ * names compile.
160
+ */
161
+ export type ${e} = ${e}DetailDto;
162
+
163
+ export interface Create${e}Dto {
164
+ ${entity.fields.filter(f => f.required).map(f => ` ${fieldCamel(f.name)}: ${mapTsType(f.type)};`).join('\n')}
165
+ }
166
+
167
+ export interface Update${e}Dto {
168
+ ${entity.fields.map(f => ` ${fieldCamel(f.name)}${f.required ? '' : '?'}: ${mapTsType(f.type)};`).join('\n')}
169
+ }
170
+
171
+ /**
172
+ * Lightweight reference shape returned by GET /api/v1/integration/{plural}/lookup.
173
+ * Lookup lives on the integration stratum regardless of useScreens (the
174
+ * screen-driven contract intentionally omits it). Consumed by <EntityLookup>
175
+ * for FK selectors — id is the FK value to persist, displayName is the human
176
+ * label rendered in the combobox.
177
+ */
178
+ export interface ${e}RefDto {
179
+ id: string;
180
+ displayName: string;
181
+ }
182
+
183
+ export interface PaginatedResult<T> {
184
+ items: T[];
185
+ /** Mirrors SmartStack.app PaginatedResult<T>.TotalCount (JSON: "totalCount").
186
+ * ASP.NET serialises C# PascalCase property names to camelCase on the wire;
187
+ * the previous "total" identifier silently dropped the count for every
188
+ * paginated endpoint. */
189
+ totalCount: number;
190
+ page: number;
191
+ pageSize: number;
192
+ }${dashboardTypes}
193
+ `,
194
+ })
195
+
196
+ const dashboardServiceMembers = entity.hasDashboard
197
+ ? `,
198
+ getDashboardConsolidated: async (${parentArg}params?: { startDate?: string; endDate?: string }) => {
199
+ ${dr} = await ${clientVar}.get<${e}DashboardConsolidatedDto>(\`\${${apiPathExpr}}/dashboard/consolidated\`, { params });
200
+ return data;
201
+ },
202
+ getDashboardAlerts: async (${hasParent ? `${parentIdParam}: string` : ''}) => {
203
+ ${dr} = await ${clientVar}.get<${e}DashboardAlertDto[]>(\`\${${apiPathExpr}}/dashboard/alerts\`);
204
+ return data;
205
+ }`
206
+ : ''
207
+
208
+ const dashboardImports = entity.hasDashboard
209
+ ? `, ${e}DashboardConsolidatedDto, ${e}DashboardAlertDto`
210
+ : ''
211
+
212
+ // Custom action filtering + custom type collection happens BEFORE the
213
+ // types/index.ts push (see above). Here we only emit the service members
214
+ // since they depend on `apiPathExpr` / `parentArg` already computed.
215
+ const customActionServiceMembers = customActions
216
+ .map((a) => emitCustomActionServiceMember(a, clientVar, dr, parentArg, apiPathExpr))
217
+ .join('')
218
+
219
+ const integrationConstDecl = isScreenMode
220
+ ? `\nconst INTEGRATION_PATH = '${integrationPath}';\n`
221
+ : ''
222
+ const lookupBase = isScreenMode ? 'INTEGRATION_PATH' : 'API_PATH'
223
+ const deleteBase = isScreenMode ? 'INTEGRATION_PATH' : 'API_PATH'
224
+
225
+ const getAllMethod = isScreenMode
226
+ ? `getAll: async (${parentArg}params?: { page?: number; pageSize?: number; search?: string }) => {
227
+ ${dr} = await ${clientVar}.get<PaginatedResult<${e}ListDto>>(\`\${${apiPathExpr}}/list\`, { params });
228
+ return data;
229
+ }`
230
+ : `getAll: async (${parentArg}params?: { page?: number; pageSize?: number; search?: string }) => {
231
+ ${dr} = await ${clientVar}.get<PaginatedResult<${e}ListDto>>(${apiPathExpr}, { params });
232
+ return data;
233
+ }`
234
+
235
+ const getByIdMethod = isScreenMode
236
+ ? `getById: async (${parentArg}id: string) => {
237
+ ${dr} = await ${clientVar}.get<${e}DetailDto>(\`\${${apiPathExpr}}/detail/\${id}\`);
238
+ return data;
239
+ }`
240
+ : `getById: async (${parentArg}id: string) => {
241
+ ${dr} = await ${clientVar}.get<${e}DetailDto>(\`\${${apiPathExpr}}/\${id}\`);
242
+ return data;
243
+ }`
244
+
245
+ const createMethod = isScreenMode
246
+ ? `create: async (${parentArg}payload: Create${e}Dto) => {
247
+ ${dr} = await ${clientVar}.post<string>(\`\${${apiPathExpr}}/form\`, payload);
248
+ return data;
249
+ }`
250
+ : `create: async (${parentArg}payload: Create${e}Dto) => {
251
+ ${dr} = await ${clientVar}.post<string>(${apiPathExpr}, payload);
252
+ return data;
253
+ }`
254
+
255
+ const updateMethod = isScreenMode
256
+ ? `update: async (${parentArg}id: string, payload: Update${e}Dto) => {
257
+ await ${clientVar}.put(\`\${${apiPathExpr}}/form/\${id}\`, payload);
258
+ }`
259
+ : `update: async (${parentArg}id: string, payload: Update${e}Dto) => {
260
+ await ${clientVar}.put(\`\${${apiPathExpr}}/\${id}\`, payload);
261
+ }`
262
+
263
+ // When the entity is nested, lookup / delete also need the parent ID
264
+ // since their URL prefix is the parameterised API_PATH function.
265
+ // INTEGRATION_PATH (used for delete/lookup fallback in screen mode) is a
266
+ // flat URL and never carries a parent — but that combo is rejected above
267
+ // (hasParent && isScreenMode throws), so lookupBase / deleteBase always
268
+ // resolve to apiPathExpr when hasParent is true.
269
+ const lookupExpr = isScreenMode ? '${INTEGRATION_PATH}' : `\${${apiPathExpr}}`
270
+ const deleteExpr = isScreenMode ? '${INTEGRATION_PATH}' : `\${${apiPathExpr}}`
271
+
272
+ files.push({
273
+ path: `${featurePath}/services/${eLower}Service.ts`,
274
+ content: `${clientImport}
275
+ import type { ${e}ListDto, ${e}DetailDto, Create${e}Dto, Update${e}Dto, ${e}RefDto, PaginatedResult${dashboardImports}${customTypeImports} } from '../types';
276
+
277
+ ${apiPathDecl};${integrationConstDecl}
278
+
279
+ export const ${eLower}Service = {
280
+ ${getAllMethod},
281
+ ${getByIdMethod},
282
+ getLookup: async (${parentArg}params?: { search?: string; page?: number; pageSize?: number }) => {
283
+ ${dr} = await ${clientVar}.get<PaginatedResult<${e}RefDto>>(\`${lookupExpr}/lookup\`, { params });
284
+ return data;
285
+ },
286
+ ${createMethod},
287
+ ${updateMethod},
288
+ delete: async (${parentArg}id: string) => {
289
+ await ${clientVar}.delete(\`${deleteExpr}/\${id}\`);
290
+ }${dashboardServiceMembers}${customActionServiceMembers},
291
+ };
292
+ `,
293
+ })
294
+
295
+ const hooksContent = generateStateHooks(e, eLower, plural, pluralLower, customActions, entity.hasDashboard ?? false, hasParent, parentIdParam)
296
+
297
+ files.push({
298
+ path: `${featurePath}/hooks/use${e}.ts`,
299
+ content: hooksContent,
300
+ })
301
+ }
302
+
303
+ return files
304
+ }
305
+
306
+ function fieldCamel(name: string): string {
307
+ return name.charAt(0).toLowerCase() + name.slice(1)
308
+ }
309
+
310
+ function mapTsType(type: string): string {
311
+ const map: Record<string, string> = {
312
+ 'string': 'string',
313
+ 'int': 'number',
314
+ 'integer': 'number',
315
+ 'number': 'number',
316
+ 'decimal': 'number',
317
+ 'bool': 'boolean',
318
+ 'boolean': 'boolean',
319
+ 'datetime': 'string',
320
+ 'date': 'string',
321
+ 'guid': 'string',
322
+ }
323
+ const lookup = map[type.toLowerCase()]
324
+ if (!lookup) {
325
+ throw new Error(`scaffold-api-client: unsupported field type '${type}' — add a mapping in mapTsType()`)
326
+ }
327
+ return lookup
328
+ }
329
+
330
+ /**
331
+ * Wave F1 — TS type for a pagespec column. MUST mirror `dotnetTypeFor` in
332
+ * `templates/skills/development/backend/screen-controller/cli/scaffold-screen-controller/generate.ts`
333
+ * one-to-one. The integration test in `__tests__/screen-strata-contract.test.ts`
334
+ * locks the two tables together.
335
+ */
336
+ function tsTypeForColumn(formatHint: string | undefined): string {
337
+ const h = (formatHint ?? '').toLowerCase()
338
+ if (h === 'currency' || h === 'number' || h === 'decimal') return 'number'
339
+ if (h === 'integer' || h === 'count') return 'number'
340
+ if (h === 'date' || h === 'datetime') return 'string' // ISO-8601 on the wire
341
+ if (h === 'bool' || h === 'boolean') return 'boolean'
342
+ if (h === 'guid' || h === 'uuid') return 'string'
343
+ return 'string'
344
+ }
345
+
346
+ /**
347
+ * Render the body of `${E}ListDto` from pagespec list-view columns. Returns
348
+ * an empty body when no columns are provided — the surrounding template adds
349
+ * `id` + `createdAt` so the interface is still well-formed (matches the
350
+ * C# safe-minimum fallback).
351
+ */
352
+ function renderListFromColumns(columns: ApiScreenColumn[] | undefined): string {
353
+ if (!columns || columns.length === 0) return ''
354
+ return columns.map(c => ` ${c.key}: ${tsTypeForColumn(c.formatHint)};`).join('\n')
355
+ }
356
+
357
+ /**
358
+ * Render the body of `${E}DetailDto`. The MVP shape derives from the detail
359
+ * pagespec when present; otherwise it falls back to the list columns (the
360
+ * detail view is at minimum a superset of the list). Then — Bug 8 fix — appends
361
+ * every `entity.fields` member that is NOT already present, so the edit form's
362
+ * pre-fill (fetched as DetailDto) carries every field the user can edit. Drift
363
+ * between display columns and editable fields stays harmless (extra fields are
364
+ * tolerated by display code) instead of crashing the form with « field not
365
+ * found ».
366
+ *
367
+ * Order :
368
+ * 1. screenColumns.detail keys (display order from BA pagespec)
369
+ * 2. screenColumns.list extras (when no detail-specific spec)
370
+ * 3. entity.fields not yet covered (snapshots, hidden domain fields, etc.)
371
+ *
372
+ * Mirrors how `scaffold-screen-controller` derives `${E}DetailScreenDto` from
373
+ * the same pagespec.columns[] — but the C# side has the domain entity
374
+ * available natively, so the union is implicit there.
375
+ */
376
+ function renderDetailFromColumns(
377
+ detail: ApiScreenColumn[] | undefined,
378
+ list: ApiScreenColumn[] | undefined,
379
+ entityFields: { name: string; type: string; required: boolean }[],
380
+ ): string {
381
+ const columnSource = detail && detail.length > 0 ? detail : (list ?? [])
382
+ const columnKeys = new Set(columnSource.map(c => c.key))
383
+ const columnLines = columnSource.map(c => ` ${c.key}: ${tsTypeForColumn(c.formatHint)};`)
384
+ const extraLines = entityFields
385
+ .filter(f => !columnKeys.has(fieldCamel(f.name)))
386
+ .map(f => ` ${fieldCamel(f.name)}${f.required ? '' : '?'}: ${mapTsType(f.type)};`)
387
+ return [...columnLines, ...extraLines].join('\n')
388
+ }
389
+
390
+ function toKebab(name: string): string {
391
+ return name
392
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
393
+ .replace(/_+/g, '-')
394
+ .toLowerCase()
395
+ }
396
+
397
+ /** Convert kebab-case (`bulk-archive`) to camelCase (`bulkArchive`) for
398
+ * TypeScript service member names. */
399
+ function toCamelCase(code: string): string {
400
+ const parts = code.split('-')
401
+ return parts[0]! + parts.slice(1).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')
402
+ }
403
+
404
+ /** Convert kebab-case (`bulk-archive`) to PascalCase (`BulkArchive`) for
405
+ * hook names (`useBulkArchive${E}`). */
406
+ function toPascalCase(code: string): string {
407
+ return code.split('-').map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')
408
+ }
409
+
410
+ /** Built-in TS types we never re-declare. */
411
+ const TS_BUILTIN_TYPES = new Set([
412
+ 'void', 'string', 'number', 'boolean', 'string[]',
413
+ 'unknown', 'never', 'object', 'any',
414
+ ])
415
+
416
+ /** Compute the set of names already provided by the entity's own DTOs. We
417
+ * must not re-emit these as custom types — they would collide with the
418
+ * interfaces already produced for the entity. */
419
+ function entityGeneratedDtoNames(e: string): Set<string> {
420
+ return new Set([
421
+ `${e}ListDto`,
422
+ `${e}DetailDto`,
423
+ `Create${e}Dto`,
424
+ `Update${e}Dto`,
425
+ `${e}RefDto`,
426
+ `${e}DashboardConsolidatedDto`,
427
+ `${e}DashboardAlertDto`,
428
+ e, // alias
429
+ ])
430
+ }
431
+
432
+ /**
433
+ * Bug 1 helper — collect every type name referenced by a customAction's
434
+ * `payloadType` or `responseType` that needs declaration in the entity's
435
+ * `types/index.ts`. Filters out TS builtins, the entity's own DTOs, and
436
+ * generic forms like `T[]` (array-of-something handled separately).
437
+ */
438
+ function collectCustomTypeNames(
439
+ customActions: ApiCustomAction[],
440
+ e: string,
441
+ ): string[] {
442
+ const generated = entityGeneratedDtoNames(e)
443
+ const seen = new Set<string>()
444
+ const out: string[] = []
445
+ for (const a of customActions) {
446
+ for (const name of [a.payloadType, a.responseType]) {
447
+ if (!name) continue
448
+ if (TS_BUILTIN_TYPES.has(name)) continue
449
+ if (generated.has(name)) continue
450
+ // Strip trailing `[]` (arrays of declared types still need the base type)
451
+ const base = name.endsWith('[]') ? name.slice(0, -2) : name
452
+ if (TS_BUILTIN_TYPES.has(base)) continue
453
+ if (generated.has(base)) continue
454
+ if (seen.has(base)) continue
455
+ seen.add(base)
456
+ out.push(base)
457
+ }
458
+ }
459
+ return out
460
+ }
461
+
462
+ /**
463
+ * Bug 1 helper — emit one `export interface ${name} { ... }` block per custom
464
+ * type. Shape is taken from the matching `payloadShape` / `responseShape`
465
+ * when provided; otherwise emit a permissive `[key: string]: unknown` body
466
+ * plus a TODO comment so the BA author knows to firm it up.
467
+ *
468
+ * The returned string ends with two newlines (or is empty) so it can be
469
+ * prefixed directly to the entity DTO block.
470
+ */
471
+ function renderCustomTypeDeclarations(
472
+ customActions: ApiCustomAction[],
473
+ e: string,
474
+ ): string {
475
+ const generated = entityGeneratedDtoNames(e)
476
+ // Map type name → first non-empty shape we encounter (payloadShape or
477
+ // responseShape). When two actions reference the same name with different
478
+ // shapes we pick the first — the BA contract assumes one canonical shape
479
+ // per type name.
480
+ const shapes = new Map<string, Record<string, string>>()
481
+ const declared = new Set<string>()
482
+ const order: string[] = []
483
+ for (const a of customActions) {
484
+ const pairs: Array<[string | null | undefined, Record<string, string> | undefined]> = [
485
+ [a.payloadType, a.payloadShape],
486
+ [a.responseType === 'void' ? null : a.responseType, a.responseShape],
487
+ ]
488
+ for (const [rawName, shape] of pairs) {
489
+ if (!rawName) continue
490
+ const base = rawName.endsWith('[]') ? rawName.slice(0, -2) : rawName
491
+ if (TS_BUILTIN_TYPES.has(base)) continue
492
+ if (generated.has(base)) continue
493
+ if (!declared.has(base)) {
494
+ declared.add(base)
495
+ order.push(base)
496
+ }
497
+ if (shape && Object.keys(shape).length > 0 && !shapes.has(base)) {
498
+ shapes.set(base, shape)
499
+ }
500
+ }
501
+ }
502
+ if (order.length === 0) return ''
503
+ const blocks = order.map((name) => {
504
+ const shape = shapes.get(name)
505
+ if (shape) {
506
+ const body = Object.entries(shape)
507
+ .map(([field, tsType]) => ` ${field}: ${tsType};`)
508
+ .join('\n')
509
+ return `export interface ${name} {\n${body}\n}`
510
+ }
511
+ // Permissive placeholder — keeps the TypeScript compiler happy while
512
+ // signalling that BA work is needed to firm up the shape.
513
+ return `/**\n * TODO[BA-SHAPE]: replace this permissive placeholder with the real shape.\n * Populate \`customActions[].payloadShape\` (or \`responseShape\`) in the\n * scaffold-api-client spec so this interface lists the actual fields.\n */\nexport interface ${name} {\n [key: string]: unknown;\n}`
514
+ })
515
+ return blocks.join('\n\n') + '\n\n'
516
+ }
517
+
518
+ /**
519
+ * Emit a single service-object member (e.g. `archive: async (id) => ...`).
520
+ * The leading comma is included so the member can be appended directly
521
+ * after the existing CRUD methods.
522
+ */
523
+ function emitCustomActionServiceMember(
524
+ action: ApiCustomAction,
525
+ clientVar: string,
526
+ dr: string,
527
+ parentArg: string,
528
+ apiPathExpr: string,
529
+ ): string {
530
+ const memberName = toCamelCase(action.code) // ← `code` drives the TS identifier
531
+ const urlSegment = action.endpoint ?? action.code // ← `endpoint` (when set) drives the URL
532
+ const responseType = action.responseType
533
+ const isVoid = responseType === 'void'
534
+ const method = action.httpMethod ?? 'post'
535
+ const isGet = method === 'get'
536
+ // Wrap `apiPathExpr` for use inside an emitted JS template-literal:
537
+ // non-nested → '${API_PATH}'
538
+ // nested → '${API_PATH(parentId)}'
539
+ const pathInTpl = `\${${apiPathExpr}}`
540
+
541
+ let signature: string
542
+ let body: string
543
+
544
+ if (action.scope === 'row') {
545
+ if (action.payloadType && !isGet) {
546
+ signature = `(${parentArg}id: string, payload: ${action.payloadType})`
547
+ body = isVoid
548
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/\${id}/${urlSegment}\`, payload);`
549
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/\${id}/${urlSegment}\`, payload);
550
+ return data;`
551
+ } else {
552
+ signature = `(${parentArg}id: string)`
553
+ body = isVoid
554
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/\${id}/${urlSegment}\`);`
555
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/\${id}/${urlSegment}\`);
556
+ return data;`
557
+ }
558
+ } else if (action.scope === 'bulk') {
559
+ if (action.payloadType && !isGet) {
560
+ signature = `(${parentArg}payload: ${action.payloadType})`
561
+ body = isVoid
562
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/bulk/${urlSegment}\`, payload);`
563
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/bulk/${urlSegment}\`, payload);
564
+ return data;`
565
+ } else {
566
+ signature = isGet ? `(${parentArg.replace(/, $/, '')})` : `(${parentArg}ids: string[])`
567
+ const args = isGet ? '' : `, { ids }`
568
+ body = isVoid
569
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/bulk/${urlSegment}\`${args});`
570
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/bulk/${urlSegment}\`${args});
571
+ return data;`
572
+ }
573
+ } else {
574
+ // header scope
575
+ if (action.payloadType && !isGet) {
576
+ signature = `(${parentArg}payload: ${action.payloadType})`
577
+ body = isVoid
578
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/${urlSegment}\`, payload);`
579
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/${urlSegment}\`, payload);
580
+ return data;`
581
+ } else {
582
+ signature = `(${parentArg.replace(/, $/, '')})`
583
+ body = isVoid
584
+ ? `await ${clientVar}.${method}(\`${pathInTpl}/${urlSegment}\`);`
585
+ : `${dr} = await ${clientVar}.${method}<${responseType}>(\`${pathInTpl}/${urlSegment}\`);
586
+ return data;`
587
+ }
588
+ }
589
+
590
+ return `,
591
+ ${memberName}: async ${signature}: Promise<${responseType}> => {
592
+ ${body}
593
+ }`
594
+ }
595
+
596
+ /**
597
+ * Emit a single React Query mutation hook for a custom action. Auto-
598
+ * invalidates the LIST_KEY query and (for row-scope actions) the entity
599
+ * detail query so the UI re-fetches after the mutation succeeds.
600
+ */
601
+ function emitCustomActionHook(action: ApiCustomAction, entity: string, entityLower: string): string {
602
+ const hookName = `use${toPascalCase(action.code)}${entity}`
603
+ const memberName = toCamelCase(action.code)
604
+ const responseType = action.responseType
605
+
606
+ let mutationFnSignature: string
607
+ let mutationFnCall: string
608
+ let invalidations: string
609
+
610
+ if (action.scope === 'row') {
611
+ if (action.payloadType) {
612
+ mutationFnSignature = `({ id, payload }: { id: string; payload: ${action.payloadType} })`
613
+ mutationFnCall = `${entityLower}Service.${memberName}(id, payload)`
614
+ invalidations = `qc.invalidateQueries({ queryKey: LIST_KEY });
615
+ qc.invalidateQueries({ queryKey: ['${entityLower}', variables.id] });`
616
+ } else {
617
+ mutationFnSignature = `(id: string)`
618
+ mutationFnCall = `${entityLower}Service.${memberName}(id)`
619
+ invalidations = `qc.invalidateQueries({ queryKey: LIST_KEY });
620
+ qc.invalidateQueries({ queryKey: ['${entityLower}', variables] });`
621
+ }
622
+ } else if (action.scope === 'bulk') {
623
+ if (action.payloadType) {
624
+ mutationFnSignature = `(payload: ${action.payloadType})`
625
+ mutationFnCall = `${entityLower}Service.${memberName}(payload)`
626
+ } else {
627
+ mutationFnSignature = `(ids: string[])`
628
+ mutationFnCall = `${entityLower}Service.${memberName}(ids)`
629
+ }
630
+ invalidations = `qc.invalidateQueries({ queryKey: LIST_KEY });`
631
+ } else {
632
+ // header scope
633
+ if (action.payloadType) {
634
+ mutationFnSignature = `(payload: ${action.payloadType})`
635
+ mutationFnCall = `${entityLower}Service.${memberName}(payload)`
636
+ } else {
637
+ mutationFnSignature = `()`
638
+ mutationFnCall = `${entityLower}Service.${memberName}()`
639
+ }
640
+ invalidations = `qc.invalidateQueries({ queryKey: LIST_KEY });`
641
+ }
642
+
643
+ // For row-scope actions the variables symbol is the destructured arg
644
+ // (id or { id, payload }). For bulk/header it's the full args object.
645
+ // The `_, variables` signature works in all cases.
646
+ return `
647
+ export function ${hookName}() {
648
+ const qc = useQueryClient();
649
+ return useMutation<${responseType}, Error, ${rxQueryVariables(action)}>({
650
+ mutationFn: ${mutationFnSignature} => ${mutationFnCall},
651
+ onSuccess: (_data, variables) => {
652
+ ${invalidations}
653
+ },
654
+ });
655
+ }`
656
+ }
657
+
658
+ /**
659
+ * Compute the TypeScript type of the `variables` argument for the
660
+ * useMutation call — used as the third type parameter so onSuccess gets
661
+ * a typed `variables` arg.
662
+ */
663
+ function rxQueryVariables(action: ApiCustomAction): string {
664
+ if (action.scope === 'row') {
665
+ return action.payloadType
666
+ ? `{ id: string; payload: ${action.payloadType} }`
667
+ : 'string'
668
+ }
669
+ if (action.scope === 'bulk') {
670
+ return action.payloadType ? action.payloadType : 'string[]'
671
+ }
672
+ // header
673
+ return action.payloadType ? action.payloadType : 'void'
674
+ }
675
+
676
+ function generateReactQueryHooks(
677
+ e: string, eLower: string, plural: string, pluralLower: string,
678
+ customActions: ApiCustomAction[], hasDashboard: boolean,
679
+ ): string {
680
+ return `import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
681
+ import { ${eLower}Service } from '../services/${eLower}Service';
682
+ import type { Create${e}Dto, Update${e}Dto } from '../types';
683
+
684
+ const LIST_KEY = ['${pluralLower}'] as const;
685
+
686
+ export function use${plural}(params?: { page?: number; pageSize?: number; search?: string }) {
687
+ return useQuery({ queryKey: [...LIST_KEY, params], queryFn: () => ${eLower}Service.getAll(params) });
688
+ }
689
+
690
+ export function use${e}(id: string) {
691
+ return useQuery({ queryKey: ['${eLower}', id], queryFn: () => ${eLower}Service.getById(id), enabled: Boolean(id) });
692
+ }
693
+
694
+ export function useCreate${e}() {
695
+ const qc = useQueryClient();
696
+ return useMutation({ mutationFn: (data: Create${e}Dto) => ${eLower}Service.create(data), onSuccess: () => qc.invalidateQueries({ queryKey: LIST_KEY }) });
697
+ }
698
+
699
+ export function useUpdate${e}() {
700
+ const qc = useQueryClient();
701
+ return useMutation({ mutationFn: ({ id, data }: { id: string; data: Update${e}Dto }) => ${eLower}Service.update(id, data), onSuccess: () => qc.invalidateQueries({ queryKey: LIST_KEY }) });
702
+ }
703
+
704
+ export function useDelete${e}() {
705
+ const qc = useQueryClient();
706
+ return useMutation({ mutationFn: (id: string) => ${eLower}Service.delete(id), onSuccess: () => qc.invalidateQueries({ queryKey: LIST_KEY }) });
707
+ }
708
+
709
+ export function use${e}Lookup(params?: { search?: string; page?: number; pageSize?: number }) {
710
+ return useQuery({ queryKey: ['${eLower}', 'lookup', params], queryFn: () => ${eLower}Service.getLookup(params), placeholderData: (previous) => previous, staleTime: 60_000 });
711
+ }
712
+ ${customActions.map((a) => emitCustomActionHook(a, e, eLower)).join('\n')}${hasDashboard ? `
713
+ export function useDashboard${e}(params?: { startDate?: string; endDate?: string }) {
714
+ const consolidated = useQuery({ queryKey: ['${eLower}', 'dashboard', 'consolidated', params], queryFn: () => ${eLower}Service.getDashboardConsolidated(params) });
715
+ const alerts = useQuery({ queryKey: ['${eLower}', 'dashboard', 'alerts'], queryFn: () => ${eLower}Service.getDashboardAlerts() });
716
+ return { consolidated: consolidated.data, alerts: alerts.data, isLoading: consolidated.isLoading || alerts.isLoading, error: consolidated.error ?? alerts.error };
717
+ }` : ''}
718
+ `
719
+ }
720
+
721
+ function generateStateHooks(
722
+ e: string, eLower: string, plural: string, _pluralLower: string,
723
+ customActions: ApiCustomAction[], hasDashboard: boolean,
724
+ hasParent: boolean = false, parentIdParam: string = 'parentId',
725
+ ): string {
726
+ // When the entity is nested under a parent, the service methods take
727
+ // `parentId` as their first argument — and so do the hooks. We thread the
728
+ // value through both the hook signature and the underlying service call.
729
+ // For non-nested entities, `parentSig` / `parentCall` / `parentDep` are all
730
+ // empty strings, so the emitted code stays byte-identical to the legacy form.
731
+ const parentSig = hasParent ? `${parentIdParam}: string, ` : ''
732
+ const parentCall = hasParent ? `${parentIdParam}, ` : ''
733
+ // useEffect deps must include parentId so the hook re-fetches when the
734
+ // parent changes (e.g. selecting a different Site while viewing Rues).
735
+ const parentDep = hasParent ? `${parentIdParam}, ` : ''
736
+ // Mutation arg name when the only parameter is parentId (delete + custom row actions).
737
+ const parentArgAlone = hasParent ? `${parentIdParam}: string` : ''
738
+ // Bug 3 fix — propagate the correct number of arguments from the service
739
+ // member signature to the hook's `mutateAsync`. The previous one-size-fits-all
740
+ // shape `(idOrPayload: unknown)` worked only for row-scope + no payload; every
741
+ // other combination got TS2554 « expected 2 arguments, got 1 ». We now match
742
+ // exactly what `emitCustomActionServiceMember` declared (lines 393, 407, 423),
743
+ // by scope × payloadType:
744
+ // row + payload → ({ id, payload }) → service(id, payload)
745
+ // row + nothing → (id) → service(id)
746
+ // bulk + payload → (payload) → service(payload)
747
+ // bulk + nothing → (ids: string[]) → service(ids)
748
+ // header + payload → (payload) → service(payload)
749
+ // header + nothing → () → service()
750
+ const customHooks = customActions.map(a => {
751
+ const pascalCode = a.code.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('')
752
+ const serviceMethodName = a.code.replace(/-([a-z])/g, (_: string, c: string) => c.toUpperCase())
753
+ const responseType = a.responseType ?? 'void'
754
+ const promiseT = `Promise<${responseType}>`
755
+
756
+ let mutateSig: string
757
+ let callArgs: string
758
+ if (a.scope === 'row') {
759
+ if (a.payloadType) {
760
+ mutateSig = `({ id, payload }: { id: string; payload: ${a.payloadType} })`
761
+ callArgs = 'id, payload'
762
+ } else {
763
+ mutateSig = `(id: string)`
764
+ callArgs = 'id'
765
+ }
766
+ } else if (a.scope === 'bulk') {
767
+ if (a.payloadType) {
768
+ mutateSig = `(payload: ${a.payloadType})`
769
+ callArgs = 'payload'
770
+ } else {
771
+ mutateSig = `(ids: string[])`
772
+ callArgs = 'ids'
773
+ }
774
+ } else {
775
+ // header scope
776
+ if (a.payloadType) {
777
+ mutateSig = `(payload: ${a.payloadType})`
778
+ callArgs = 'payload'
779
+ } else {
780
+ mutateSig = `()`
781
+ callArgs = ''
782
+ }
783
+ }
784
+ // When the entity is nested, every service member takes parentId as its
785
+ // first arg — thread it through the call site. We use parentArgAlone in
786
+ // the hook signature (closure pattern, identical to useDelete/useUpdate)
787
+ // rather than re-passing through mutateAsync.
788
+ const fullCallArgs = hasParent
789
+ ? (callArgs ? `${parentIdParam}, ${callArgs}` : parentIdParam)
790
+ : callArgs
791
+ return `
792
+ export function use${pascalCode}${e}(${parentArgAlone}) {
793
+ const [isPending, setIsPending] = useState(false);
794
+ const mutateAsync = async ${mutateSig}: ${promiseT} => {
795
+ setIsPending(true);
796
+ try { return await ${eLower}Service.${serviceMethodName}(${fullCallArgs}); }
797
+ finally { setIsPending(false); }
798
+ };
799
+ return { mutateAsync, isPending };
800
+ }`
801
+ }).join('\n')
802
+
803
+ return `import { useState, useEffect, useCallback } from 'react';
804
+ import { ${eLower}Service } from '../services/${eLower}Service';
805
+ import type { Create${e}Dto, Update${e}Dto } from '../types';
806
+
807
+ export function use${plural}(${parentSig}params?: { page?: number; pageSize?: number; search?: string }) {
808
+ const [data, setData] = useState<Awaited<ReturnType<typeof ${eLower}Service.getAll>> | undefined>();
809
+ const [isLoading, setIsLoading] = useState(true);
810
+ const [error, setError] = useState<Error | null>(null);
811
+ const refetch = useCallback(() => {
812
+ setIsLoading(true);
813
+ ${eLower}Service.getAll(${parentCall}params).then(setData).catch(setError).finally(() => setIsLoading(false));
814
+ }, [${parentDep}JSON.stringify(params)]);
815
+ useEffect(() => { refetch(); }, [refetch]);
816
+ return { data, isLoading, error, refetch };
817
+ }
818
+
819
+ export function use${e}(${parentSig}id: string) {
820
+ const [data, setData] = useState<Awaited<ReturnType<typeof ${eLower}Service.getById>> | undefined>();
821
+ const [isLoading, setIsLoading] = useState(true);
822
+ useEffect(() => {
823
+ if (!id) return;
824
+ setIsLoading(true);
825
+ ${eLower}Service.getById(${parentCall}id).then(setData).finally(() => setIsLoading(false));
826
+ }, [${parentDep}id]);
827
+ return { data, isLoading };
828
+ }
829
+
830
+ export function useCreate${e}(${parentArgAlone}) {
831
+ const [isPending, setIsPending] = useState(false);
832
+ const mutateAsync = async (data: Create${e}Dto) => {
833
+ setIsPending(true);
834
+ try { return await ${eLower}Service.create(${parentCall}data); } finally { setIsPending(false); }
835
+ };
836
+ return { mutateAsync, isPending };
837
+ }
838
+
839
+ export function useUpdate${e}(${parentArgAlone}) {
840
+ const [isPending, setIsPending] = useState(false);
841
+ const mutateAsync = async ({ id, data }: { id: string; data: Update${e}Dto }) => {
842
+ setIsPending(true);
843
+ try { return await ${eLower}Service.update(${parentCall}id, data); } finally { setIsPending(false); }
844
+ };
845
+ return { mutateAsync, isPending };
846
+ }
847
+
848
+ export function useDelete${e}(${parentArgAlone}) {
849
+ const [isPending, setIsPending] = useState(false);
850
+ const mutateAsync = async (id: string) => {
851
+ setIsPending(true);
852
+ try { return await ${eLower}Service.delete(${parentCall}id); } finally { setIsPending(false); }
853
+ };
854
+ return { mutateAsync, isPending };
855
+ }
856
+
857
+ export function use${e}Lookup(${parentSig}params?: { search?: string; page?: number; pageSize?: number }) {
858
+ const [data, setData] = useState<Awaited<ReturnType<typeof ${eLower}Service.getLookup>> | undefined>();
859
+ useEffect(() => { ${eLower}Service.getLookup(${parentCall}params).then(setData); }, [${parentDep}JSON.stringify(params)]);
860
+ return { data };
861
+ }
862
+ ${customHooks}${hasDashboard ? `
863
+ export function useDashboard${e}(${parentSig}params?: { startDate?: string; endDate?: string }) {
864
+ const [consolidated, setConsolidated] = useState<unknown>();
865
+ const [alerts, setAlerts] = useState<unknown[]>();
866
+ const [isLoading, setIsLoading] = useState(true);
867
+ useEffect(() => {
868
+ Promise.all([${eLower}Service.getDashboardConsolidated(${parentCall}params), ${eLower}Service.getDashboardAlerts(${hasParent ? parentIdParam : ''})])
869
+ .then(([c, a]) => { setConsolidated(c); setAlerts(a); })
870
+ .finally(() => setIsLoading(false));
871
+ }, [${parentDep}JSON.stringify(params)]);
872
+ return { consolidated, alerts, isLoading, error: null };
873
+ }` : ''}
874
+ `
875
+ }