@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,1126 @@
1
+ /**
2
+ * audit-dev-frontend/audit.ts — Deterministic checkers for DEV-UI-001..012.
3
+ *
4
+ * Self-builds the project inventory from disk (replaces the system-prompt
5
+ * skill's externally-injected inventory). Each rule = one async checker
6
+ * fed { args, prdSlice, inventory } returning Finding[] (≥1 ok, or N err/warn).
7
+ *
8
+ * Heuristics are line-based and regex-based — NOT AST. The baseline scaffold
9
+ * generators emit idiomatic code, so the heuristics work in practice. Edge
10
+ * cases that don't match the templates fall through as ok (no false err).
11
+ */
12
+ import path from 'node:path';
13
+ import { findFiles, readText, fileExists, readJson, directoryExists } from '../../../../lib/fs.js';
14
+ import type {
15
+ AuditDevFrontendArgs,
16
+ AuditReport,
17
+ Finding,
18
+ FrontendInventory,
19
+ PageEntry,
20
+ PrdRbacEntry,
21
+ PrdSliceFrontend,
22
+ RegistryEntry,
23
+ } from './types.js';
24
+
25
+ // ─── Page filename parsing ────────────────────────────────────────────────
26
+
27
+ const PAGE_FILENAME_RE = /^([A-Z]\w+?)(List|Detail|Form|Dashboard|Create|Edit|Home)Page\.tsx$/;
28
+
29
+ function parsePageFilename(file: string): Pick<PageEntry, 'entity' | 'kind'> {
30
+ const base = path.basename(file);
31
+ const m = PAGE_FILENAME_RE.exec(base);
32
+ if (!m) return { entity: null, kind: 'other' };
33
+ const kind = m[2].toLowerCase() as PageEntry['kind'];
34
+ return { entity: m[1], kind };
35
+ }
36
+
37
+ // ─── Inventory builder ────────────────────────────────────────────────────
38
+
39
+ export async function buildInventory(projectPath: string): Promise<FrontendInventory> {
40
+ const pages = await discoverPages(projectPath);
41
+ const registries = await discoverRegistries(projectPath);
42
+ const i18n = await discoverI18n(projectPath);
43
+ return { pages, registries, i18n };
44
+ }
45
+
46
+ async function discoverPages(projectPath: string): Promise<PageEntry[]> {
47
+ const patterns = ['src/pages/**/*.tsx', 'src/features/**/pages/**/*.tsx'];
48
+ const found = new Set<string>();
49
+ for (const pat of patterns) {
50
+ for (const f of await findFiles(pat, { cwd: projectPath })) {
51
+ const rel = path.relative(projectPath, f).replace(/\\/g, '/');
52
+ if (rel.endsWith('.test.tsx') || rel.endsWith('.spec.tsx')) continue;
53
+ found.add(rel);
54
+ }
55
+ }
56
+ return [...found].map((file) => ({ file, ...parsePageFilename(file) }));
57
+ }
58
+
59
+ async function discoverRegistries(projectPath: string): Promise<RegistryEntry[]> {
60
+ const candidates = await findFiles('src/extensions/**/*.ts', { cwd: projectPath });
61
+ const out: RegistryEntry[] = [];
62
+ for (const abs of candidates) {
63
+ const rel = path.relative(projectPath, abs).replace(/\\/g, '/');
64
+ const source = await readText(abs);
65
+ if (!/PageRegistry\.register\s*\(/.test(source) && !/ComponentRegistry\.register\s*\(/.test(source)) {
66
+ continue;
67
+ }
68
+
69
+ // Build a name → importPath map from `const X = lazy(() => import('@/...'))`
70
+ // or `const X = lazyWithRetry(() => import('@/...'))` (two-step pattern
71
+ // used by componentRegistry.generated.ts — the SDK-sanctioned wrapper
72
+ // adds retry logic but is otherwise indistinguishable from React.lazy).
73
+ const lazyConsts = new Map<string, string>();
74
+ const lazyConstRe = /\bconst\s+(\w+)\s*=\s*(?:lazy|lazyWithRetry)\s*\(\s*\(\s*\)\s*=>\s*import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
75
+ let mc: RegExpExecArray | null;
76
+ while ((mc = lazyConstRe.exec(source)) !== null) {
77
+ lazyConsts.set(mc[1], mc[2]);
78
+ }
79
+
80
+ const keys: string[] = [];
81
+ const imports: RegistryEntry['imports'] = [];
82
+
83
+ // Pattern A — inline lazy/lazyWithRetry: `register('key', lazy(() => import('@/...')))`
84
+ // Restrict the gap between key and the wrapper call to whitespace only —
85
+ // otherwise the non-greedy match jumps across several register() calls to a
86
+ // later wrapper invocation.
87
+ const inlineRe = /(?:Page|Component)Registry\.register\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?:lazy|lazyWithRetry)\s*\(\s*\(\s*\)\s*=>\s*import\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
88
+ let m: RegExpExecArray | null;
89
+ while ((m = inlineRe.exec(source)) !== null) {
90
+ const key = m[1];
91
+ const importPath = m[2];
92
+ keys.push(key);
93
+ imports.push({ key, importPath, resolvedAbsPath: await resolveImport(abs, importPath, projectPath) });
94
+ }
95
+
96
+ // Pattern B — const reference: `register('key', SomeConst)`
97
+ const refRe = /(?:Page|Component)Registry\.register\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*(\w+)\s*\)/g;
98
+ while ((m = refRe.exec(source)) !== null) {
99
+ const key = m[1];
100
+ const constName = m[2];
101
+ const importPath = lazyConsts.get(constName);
102
+ if (!importPath) continue; // not a lazy const we tracked
103
+ // Skip if already added by inline pattern (rare, but possible if both used in the same file)
104
+ if (keys.includes(key)) continue;
105
+ keys.push(key);
106
+ imports.push({ key, importPath, resolvedAbsPath: await resolveImport(abs, importPath, projectPath) });
107
+ }
108
+
109
+ out.push({ file: rel, keys, imports });
110
+ }
111
+ return out;
112
+ }
113
+
114
+ async function resolveImport(
115
+ registryAbsPath: string,
116
+ importPath: string,
117
+ projectPath: string,
118
+ ): Promise<string | null> {
119
+ // Resolve `@/` alias against `<projectPath>/src/`.
120
+ let target: string;
121
+ if (importPath.startsWith('@/')) {
122
+ target = path.resolve(projectPath, 'src', importPath.slice(2));
123
+ } else if (importPath.startsWith('.')) {
124
+ target = path.resolve(path.dirname(registryAbsPath), importPath);
125
+ } else {
126
+ // External package — assume valid (we don't try to resolve node_modules).
127
+ return null;
128
+ }
129
+ // Try with .tsx, .ts, /index.tsx, /index.ts extensions.
130
+ const candidates = [
131
+ target,
132
+ `${target}.tsx`,
133
+ `${target}.ts`,
134
+ path.join(target, 'index.tsx'),
135
+ path.join(target, 'index.ts'),
136
+ ];
137
+ for (const c of candidates) {
138
+ if (await fileExists(c)) return c;
139
+ }
140
+ return null;
141
+ }
142
+
143
+ async function discoverI18n(projectPath: string): Promise<{ locales: string[]; namespaces: string[] }> {
144
+ const localesDir = path.join(projectPath, 'src', 'locales');
145
+ if (!(await directoryExists(localesDir))) {
146
+ // Try src/i18n/locales as fallback
147
+ const alt = path.join(projectPath, 'src', 'i18n', 'locales');
148
+ if (!(await directoryExists(alt))) return { locales: [], namespaces: [] };
149
+ return discoverI18nFrom(alt);
150
+ }
151
+ return discoverI18nFrom(localesDir);
152
+ }
153
+
154
+ async function discoverI18nFrom(dir: string): Promise<{ locales: string[]; namespaces: string[] }> {
155
+ const files = await findFiles('*/*.json', { cwd: dir });
156
+ const locales = new Set<string>();
157
+ const namespaces = new Set<string>();
158
+ for (const abs of files) {
159
+ const rel = path.relative(dir, abs).replace(/\\/g, '/');
160
+ const [loc, fname] = rel.split('/');
161
+ if (loc && fname && fname.endsWith('.json')) {
162
+ locales.add(loc);
163
+ namespaces.add(fname.slice(0, -'.json'.length));
164
+ }
165
+ }
166
+ return { locales: [...locales].sort(), namespaces: [...namespaces].sort() };
167
+ }
168
+
169
+ // ─── PRD slice loader ─────────────────────────────────────────────────────
170
+
171
+ export async function loadPrdSlice(prdSlicePath: string | undefined): Promise<PrdSliceFrontend> {
172
+ if (!prdSlicePath) return {};
173
+ return readJson<PrdSliceFrontend>(path.resolve(prdSlicePath));
174
+ }
175
+
176
+ // ─── Helpers ──────────────────────────────────────────────────────────────
177
+
178
+ function makeOk(code: string, params: Record<string, unknown> = {}): Finding {
179
+ return {
180
+ dimension: 'devFrontend',
181
+ code,
182
+ severity: 'ok',
183
+ label: `${code.replace(/-/g, '_')}_ok`,
184
+ params,
185
+ solution: '',
186
+ autoFixable: false,
187
+ };
188
+ }
189
+
190
+ function makeErr(
191
+ code: string,
192
+ params: Record<string, unknown>,
193
+ solution: string,
194
+ extra: Partial<Finding> = {},
195
+ ): Finding {
196
+ return {
197
+ dimension: 'devFrontend',
198
+ code,
199
+ severity: 'err',
200
+ label: `${code.replace(/-/g, '_')}_err`,
201
+ params,
202
+ solution,
203
+ autoFixable: extra.autoFixable ?? false,
204
+ ...extra,
205
+ };
206
+ }
207
+
208
+ function makeWarn(
209
+ code: string,
210
+ params: Record<string, unknown>,
211
+ solution: string,
212
+ extra: Partial<Finding> = {},
213
+ ): Finding {
214
+ return {
215
+ dimension: 'devFrontend',
216
+ code,
217
+ severity: 'warn',
218
+ label: `${code.replace(/-/g, '_')}_warn`,
219
+ params,
220
+ solution,
221
+ autoFixable: extra.autoFixable ?? false,
222
+ ...extra,
223
+ };
224
+ }
225
+
226
+ // Normalise PRD entity/kind for matching against page inventory.
227
+ function screenKey(entity: string | null | undefined, kind: string | null | undefined): string {
228
+ return `${(entity ?? '').toLowerCase()}|${(kind ?? '').toLowerCase()}`;
229
+ }
230
+
231
+ // ─── Rule checkers ────────────────────────────────────────────────────────
232
+
233
+ interface CheckerInput {
234
+ args: AuditDevFrontendArgs;
235
+ prdSlice: PrdSliceFrontend;
236
+ inventory: FrontendInventory;
237
+ projectPath: string;
238
+ }
239
+
240
+ async function checkDevUi001(input: CheckerInput): Promise<Finding[]> {
241
+ const { prdSlice, inventory } = input;
242
+ const screens = prdSlice.screens ?? [];
243
+ if (screens.length === 0) return [makeOk('DEV-UI-001', { count: 0, note: 'no screens in PRD slice' })];
244
+
245
+ const inventoryKeys = new Set(
246
+ inventory.pages
247
+ .filter((p) => p.entity)
248
+ .map((p) => screenKey(p.entity, p.kind)),
249
+ );
250
+
251
+ const missing: string[] = [];
252
+ for (const s of screens) {
253
+ if (!s.entity || !s.kind) continue;
254
+ if (!inventoryKeys.has(screenKey(s.entity, s.kind))) {
255
+ missing.push(`${s.entity}/${s.kind}`);
256
+ }
257
+ }
258
+ if (missing.length === 0) return [makeOk('DEV-UI-001', { count: screens.length })];
259
+ return [makeErr(
260
+ 'DEV-UI-001',
261
+ { missing: missing.join(',') },
262
+ 'Re-run the Frontend phase. The subagent must call scaffold-component for each missing page, using the matching SmartComponent pattern from the PRD slice.',
263
+ { fixSkill: 'frontend-component', fixPhaseKey: 'frontend', autoFixable: true },
264
+ )];
265
+ }
266
+
267
+ async function checkDevUi002(input: CheckerInput): Promise<Finding[]> {
268
+ const { inventory } = input;
269
+ if (inventory.pages.length === 0) return [makeOk('DEV-UI-002', { note: 'no pages on disk' })];
270
+
271
+ // Build a set of resolved import target abs paths from all registries.
272
+ const registeredAbs = new Set<string>();
273
+ for (const reg of inventory.registries) {
274
+ for (const imp of reg.imports) {
275
+ if (imp.resolvedAbsPath) registeredAbs.add(imp.resolvedAbsPath);
276
+ }
277
+ }
278
+
279
+ const orphanFindings: Finding[] = [];
280
+ for (const page of inventory.pages) {
281
+ const abs = path.resolve(input.projectPath, page.file);
282
+ if (registeredAbs.has(abs)) continue;
283
+ orphanFindings.push(makeErr(
284
+ 'DEV-UI-002',
285
+ { pages: page.file },
286
+ 'Either re-run the routes scaffolder to regenerate the registry, or add a manual lazy-import entry. The DB-driven router fails to resolve unregistered pages.',
287
+ { file: page.file, autoFixable: true, fixSkill: 'frontend-routes', fixPhaseKey: 'frontend' },
288
+ ));
289
+ }
290
+ if (orphanFindings.length === 0) return [makeOk('DEV-UI-002')];
291
+ return orphanFindings;
292
+ }
293
+
294
+ async function checkDevUi003(input: CheckerInput): Promise<Finding[]> {
295
+ const { inventory } = input;
296
+ const broken: Finding[] = [];
297
+ for (const reg of inventory.registries) {
298
+ for (const imp of reg.imports) {
299
+ if (imp.resolvedAbsPath === null && !imp.importPath.includes('node_modules')) {
300
+ // External import returns null too; only flag those that look like local @/ or relative paths.
301
+ if (imp.importPath.startsWith('@/') || imp.importPath.startsWith('.')) {
302
+ broken.push(makeErr(
303
+ 'DEV-UI-003',
304
+ { broken: `${reg.file}→${imp.importPath}` },
305
+ 'Either restore the missing files or remove the orphan import entries from the registry. Lazy-imports that resolve to non-existent paths produce a runtime error on first navigation, not at build time.',
306
+ { file: reg.file, autoFixable: false },
307
+ ));
308
+ }
309
+ }
310
+ }
311
+ }
312
+ if (broken.length === 0) return [makeOk('DEV-UI-003')];
313
+ return broken;
314
+ }
315
+
316
+ async function checkDevUi004(input: CheckerInput): Promise<Finding[]> {
317
+ const { inventory, args } = input;
318
+ if (inventory.i18n.locales.length === 0) {
319
+ return [makeOk('DEV-UI-004', { note: 'no i18n locales — skipping' })];
320
+ }
321
+ const expectedNs = `${args.appCode}.${args.moduleCode}`;
322
+ const altNs = args.moduleCode;
323
+ const missing: string[] = [];
324
+ for (const loc of inventory.i18n.locales) {
325
+ // The namespace must exist somewhere in the locale's file set.
326
+ const has = inventory.i18n.namespaces.includes(expectedNs) || inventory.i18n.namespaces.includes(altNs);
327
+ if (!has) missing.push(`${loc}.${expectedNs}`);
328
+ }
329
+ if (missing.length === 0) return [makeOk('DEV-UI-004', { namespace: expectedNs })];
330
+ return [makeWarn(
331
+ 'DEV-UI-004',
332
+ { missing: missing.join(','), expectedNamespace: expectedNs },
333
+ `Add the missing namespace JSON files for each locale (typically src/locales/<locale>/${expectedNs}.json). Even an empty {} is preferable — i18next logs a warning but does not crash.`,
334
+ { autoFixable: true },
335
+ )];
336
+ }
337
+
338
+ async function checkDevUi005(input: CheckerInput): Promise<Finding[]> {
339
+ const { inventory, projectPath } = input;
340
+ const violators: Finding[] = [];
341
+ for (const page of inventory.pages) {
342
+ if (!page.entity) continue;
343
+ if (page.kind === 'dashboard' || page.kind === 'home') continue;
344
+ const abs = path.resolve(projectPath, page.file);
345
+ const source = await readText(abs);
346
+ if (/<PageTemplate[\s>]/.test(source)) continue;
347
+ violators.push(makeWarn(
348
+ 'DEV-UI-005',
349
+ { pages: page.file },
350
+ 'Wrap each listed page with <PageTemplate title="...">{...}</PageTemplate>. The template is the single source of truth for layout (header / sidebar / breadcrumbs).',
351
+ { file: page.file, autoFixable: true },
352
+ ));
353
+ }
354
+ if (violators.length === 0) return [makeOk('DEV-UI-005')];
355
+ return violators;
356
+ }
357
+
358
+ async function checkDevUi006(input: CheckerInput): Promise<Finding[]> {
359
+ const { inventory, projectPath } = input;
360
+ const violators: Finding[] = [];
361
+ const writeKeywords = /\b(?:Create|Edit|Delete|Update|New|Add|Remove)\b/;
362
+ for (const page of inventory.pages) {
363
+ if (page.kind === 'dashboard' || page.kind === 'home') continue;
364
+ const abs = path.resolve(projectPath, page.file);
365
+ const source = await readText(abs);
366
+ if (!writeKeywords.test(source)) continue;
367
+ if (/PermissionGuard\b|useHasPermission\b/.test(source)) continue;
368
+ violators.push(makeWarn(
369
+ 'DEV-UI-006',
370
+ { pages: page.file },
371
+ 'Wrap each write button with <PermissionGuard permission="<key>">...</PermissionGuard> or short-circuit the handler with useHasPermission. Without the gate, unauthorized users see a button that throws on click instead of being hidden.',
372
+ { file: page.file, autoFixable: false },
373
+ ));
374
+ }
375
+ if (violators.length === 0) return [makeOk('DEV-UI-006')];
376
+ return violators;
377
+ }
378
+
379
+ async function checkDevUi007(input: CheckerInput): Promise<Finding[]> {
380
+ const { inventory, projectPath } = input;
381
+ const violators: Finding[] = [];
382
+ for (const page of inventory.pages) {
383
+ const abs = path.resolve(projectPath, page.file);
384
+ const dir = path.dirname(abs);
385
+ const base = path.basename(abs, '.tsx');
386
+ const sibling = path.join(dir, `${base}.test.tsx`);
387
+ const sibling2 = path.join(dir, '__tests__', `${base}.test.tsx`);
388
+ if ((await fileExists(sibling)) || (await fileExists(sibling2))) continue;
389
+ violators.push(makeWarn(
390
+ 'DEV-UI-007',
391
+ { pages: page.file },
392
+ 'Re-run scaffold-tests --layer frontend for each listed page, or add a minimal smoke test that mounts the page with a Test wrapper providing QueryClient + i18n.',
393
+ { file: page.file, autoFixable: true, fixSkill: 'testing', fixPhaseKey: 'frontend' },
394
+ ));
395
+ }
396
+ if (violators.length === 0) return [makeOk('DEV-UI-007')];
397
+ return violators;
398
+ }
399
+
400
+ async function checkDevUi008(input: CheckerInput): Promise<Finding[]> {
401
+ const { prdSlice, inventory } = input;
402
+ const screens = prdSlice.screens ?? [];
403
+ // No PRD screens to compare against → can't detect ghosts → ok.
404
+ if (screens.length === 0) return [makeOk('DEV-UI-008', { note: 'no PRD screens to compare' })];
405
+
406
+ const prdKeys = new Set(screens.filter((s) => s.entity && s.kind).map((s) => screenKey(s.entity, s.kind)));
407
+ const ghosts: string[] = [];
408
+ for (const page of inventory.pages) {
409
+ if (!page.entity) continue;
410
+ if (!prdKeys.has(screenKey(page.entity, page.kind))) {
411
+ ghosts.push(page.file);
412
+ }
413
+ }
414
+ if (ghosts.length === 0) return [makeOk('DEV-UI-008')];
415
+ return [makeWarn(
416
+ 'DEV-UI-008',
417
+ { pages: ghosts.join(',') },
418
+ 'Either re-add the corresponding screen to the PRD slice if it was removed by mistake, or delete the page file AND remove its registry entry. Leaving ghost pages in the registry leaves dead routes in the Studio menu.',
419
+ { autoFixable: false },
420
+ )];
421
+ }
422
+
423
+ // ─── DEV-UI-009..012 (Track D) ────────────────────────────────────────────
424
+
425
+ async function checkDevUi009(input: CheckerInput): Promise<Finding[]> {
426
+ const { prdSlice, inventory } = input;
427
+ const useCases = prdSlice.useCases ?? [];
428
+ if (useCases.length === 0) return [makeOk('DEV-UI-009', { note: 'no use cases in PRD' })];
429
+
430
+ const inventoryEntities = new Set(inventory.pages.filter((p) => p.entity).map((p) => p.entity!.toLowerCase()));
431
+ const uncovered: string[] = [];
432
+ for (const uc of useCases) {
433
+ if (!uc.entity) continue;
434
+ if (!inventoryEntities.has(uc.entity.toLowerCase())) {
435
+ uncovered.push(`${uc.code}(${uc.entity})`);
436
+ }
437
+ }
438
+ if (uncovered.length === 0) return [makeOk('DEV-UI-009', { count: useCases.length })];
439
+ return [makeErr(
440
+ 'DEV-UI-009',
441
+ { useCases: uncovered.join(',') },
442
+ 'Each PRD use case must have at least one page targeting its primary entity. Re-run scaffold-component to generate the missing pages.',
443
+ { fixSkill: 'frontend-component', fixPhaseKey: 'frontend', autoFixable: true },
444
+ )];
445
+ }
446
+
447
+ async function checkDevUi010(input: CheckerInput): Promise<Finding[]> {
448
+ const { prdSlice, inventory, projectPath } = input;
449
+ const rules = prdSlice.businessRules ?? [];
450
+ const uiRules = rules.filter((r) => r.enforcedAt === 'ui' || r.enforcedAt === 'both');
451
+ if (uiRules.length === 0) return [makeOk('DEV-UI-010', { note: 'no UI-enforced business rules' })];
452
+
453
+ // For each UI rule, find the form/edit page for its entity and check the source mentions
454
+ // the rule code or has a Zod schema with refinements.
455
+ const violators: Finding[] = [];
456
+ for (const rule of uiRules) {
457
+ if (!rule.entity) continue;
458
+ const formPages = inventory.pages.filter((p) =>
459
+ p.entity?.toLowerCase() === rule.entity!.toLowerCase()
460
+ && (p.kind === 'form' || p.kind === 'create' || p.kind === 'edit'),
461
+ );
462
+ if (formPages.length === 0) {
463
+ violators.push(makeWarn(
464
+ 'DEV-UI-010',
465
+ { rule: rule.code, entity: rule.entity, missingPage: true },
466
+ `No form/create/edit page found for entity ${rule.entity} — cannot enforce business rule ${rule.code} in UI.`,
467
+ { autoFixable: false },
468
+ ));
469
+ continue;
470
+ }
471
+ for (const fp of formPages) {
472
+ const abs = path.resolve(projectPath, fp.file);
473
+ const source = await readText(abs);
474
+ const mentionsRule = source.includes(rule.code);
475
+ const hasZodRefine = /z\.object\([\s\S]*?\)\.refine\(/.test(source) || /\.refine\(/.test(source);
476
+ if (!mentionsRule && !hasZodRefine) {
477
+ violators.push(makeWarn(
478
+ 'DEV-UI-010',
479
+ { rule: rule.code, entity: rule.entity, page: fp.file },
480
+ `Form page ${fp.file} should enforce business rule ${rule.code} via Zod schema refine() or conditional render. Inject a refine using the rule's validExamples/invalidExamples.`,
481
+ { file: fp.file, autoFixable: false },
482
+ ));
483
+ }
484
+ }
485
+ }
486
+ if (violators.length === 0) return [makeOk('DEV-UI-010', { count: uiRules.length })];
487
+ return violators;
488
+ }
489
+
490
+ async function checkDevUi011(input: CheckerInput): Promise<Finding[]> {
491
+ const { prdSlice, inventory, projectPath, args } = input;
492
+ const permissions = prdSlice.permissions ?? [];
493
+ if (permissions.length === 0) return [makeOk('DEV-UI-011', { note: 'no PRD permissions to map' })];
494
+
495
+ // Try to read controller [RequirePermission(...)] from backend if backendPath provided.
496
+ let controllerPermissions: string[] = [];
497
+ if (args.backendPath) {
498
+ controllerPermissions = await scanControllerPermissions(args.backendPath);
499
+ }
500
+
501
+ // Map each permission → expected page (by entity match).
502
+ const violators: Finding[] = [];
503
+ const permsToCheck = controllerPermissions.length > 0
504
+ ? Array.from(new Set([...controllerPermissions, ...permissions.map((p) => p.code)]))
505
+ : permissions.map((p) => p.code);
506
+
507
+ for (const permCode of permsToCheck) {
508
+ // Find the matching PrdPermission entry (or derive entity from the perm key).
509
+ const prdPerm = permissions.find((p) => p.code === permCode);
510
+ const entity = prdPerm?.entity ?? deriveEntityFromPermissionKey(permCode);
511
+ if (!entity) continue;
512
+ const targetPages = inventory.pages.filter((p) => p.entity?.toLowerCase() === entity.toLowerCase());
513
+ if (targetPages.length === 0) continue;
514
+ for (const tp of targetPages) {
515
+ const abs = path.resolve(projectPath, tp.file);
516
+ const source = await readText(abs);
517
+ const wrapped = new RegExp(`PermissionGuard[^>]*permission=\\{?["'\`]${permCode.replace(/\./g, '\\.')}["'\`]`).test(source);
518
+ if (wrapped) continue;
519
+ violators.push(makeErr(
520
+ 'DEV-UI-011',
521
+ { page: tp.file, permission: permCode, entity },
522
+ `Page ${tp.file} must wrap its body in <PermissionGuard permission="${permCode}">…</PermissionGuard>. The backend [RequirePermission] returns 403 silently to the user — the frontend guard hides the route entirely.`,
523
+ { file: tp.file, autoFixable: true, fixSkill: 'audit-dev-frontend', fixPhaseKey: 'frontend' },
524
+ ));
525
+ }
526
+ }
527
+ if (violators.length === 0) return [makeOk('DEV-UI-011')];
528
+ return violators;
529
+ }
530
+
531
+ function deriveEntityFromPermissionKey(key: string): string | null {
532
+ // Convention: {module}.{section}.{action} → entity ≈ section (e.g. crm.contacts.read → contacts).
533
+ const parts = key.split('.');
534
+ if (parts.length >= 3) return parts[parts.length - 2];
535
+ if (parts.length === 2) return parts[0];
536
+ return null;
537
+ }
538
+
539
+ async function scanControllerPermissions(backendPath: string): Promise<string[]> {
540
+ const controllers = await findFiles('**/*Controller.cs', { cwd: backendPath });
541
+ const perms = new Set<string>();
542
+ for (const abs of controllers) {
543
+ const source = await readText(abs);
544
+ const re = /\[RequirePermission\s*\(\s*["]([^"]+)["]/g;
545
+ let m: RegExpExecArray | null;
546
+ while ((m = re.exec(source)) !== null) {
547
+ perms.add(m[1]);
548
+ }
549
+ }
550
+ return [...perms].sort();
551
+ }
552
+
553
+ async function checkDevUi012(input: CheckerInput): Promise<Finding[]> {
554
+ const { prdSlice, args } = input;
555
+ const rbac: PrdRbacEntry[] = prdSlice.rbac ?? [];
556
+ if (rbac.length === 0) return [makeOk('DEV-UI-012', { note: 'no PRD RBAC entries' })];
557
+ if (!args.coreNavigationSeedPath) {
558
+ return [makeOk('DEV-UI-012', { note: 'coreNavigationSeedPath not provided — skipping' })];
559
+ }
560
+
561
+ let source: string;
562
+ try {
563
+ source = await readText(path.resolve(args.coreNavigationSeedPath));
564
+ } catch {
565
+ return [makeWarn(
566
+ 'DEV-UI-012',
567
+ { path: args.coreNavigationSeedPath, error: 'unreadable' },
568
+ 'Could not read CoreNavigationSeedDataProvider.cs to verify RBAC menu coverage.',
569
+ { autoFixable: false },
570
+ )];
571
+ }
572
+
573
+ // For each PRD RBAC entry granting nav-related permissions, the seed file should declare the nav with requiredPermissions.
574
+ const violators: Finding[] = [];
575
+ for (const entry of rbac) {
576
+ for (const perm of entry.grants) {
577
+ if (!source.includes(`"${perm}"`)) {
578
+ violators.push(makeWarn(
579
+ 'DEV-UI-012',
580
+ { actor: entry.actor, permission: perm, file: args.coreNavigationSeedPath },
581
+ `Navigation seed does not reference permission "${perm}" granted to actor "${entry.actor}". Re-run scaffold-core-seed after updating the BA RBAC tables to include this permission in the navigation entry's requiredPermissions.`,
582
+ { autoFixable: false, fixSkill: 'backend-core-seed', fixPhaseKey: 'core' },
583
+ ));
584
+ break; // one per actor is enough
585
+ }
586
+ }
587
+ }
588
+ if (violators.length === 0) return [makeOk('DEV-UI-012')];
589
+ return violators;
590
+ }
591
+
592
+ // ─── DEV-UI-013 — hardcoded navigate() URL vs routes-helper ───────────────
593
+
594
+ async function checkDevUi013(input: CheckerInput): Promise<Finding[]> {
595
+ const { inventory, projectPath } = input;
596
+ const offenders: Array<{ file: string; url: string }> = [];
597
+ for (const page of inventory.pages) {
598
+ const abs = path.resolve(projectPath, page.file);
599
+ const source = await readText(abs);
600
+ if (!source) continue;
601
+ // Match navigate('/...') or navigate("/...") or navigate(`/...`) — absolute literal.
602
+ const re = /navigate\s*\(\s*(['"`])(\/[^'"`]+)\1\s*\)/g;
603
+ let m: RegExpExecArray | null;
604
+ while ((m = re.exec(source)) !== null) {
605
+ offenders.push({ file: page.file, url: m[2] });
606
+ }
607
+ }
608
+ if (offenders.length === 0) return [makeOk('DEV-UI-013')];
609
+ return offenders.map((o) =>
610
+ makeErr(
611
+ 'DEV-UI-013',
612
+ { file: o.file, url: o.url },
613
+ "Replace the hardcoded URL with a call to the per-module routes helper " +
614
+ "(`import { routes } from '@/extensions/<module>Routes'`; then `navigate(routes.<section>.create())` etc.). " +
615
+ "URL paths and DynamicRouter componentKeys must share a single source of truth — hardcoded literals drift the moment a route gets renamed.",
616
+ { file: o.file, fixSkill: 'frontend-component', fixPhaseKey: 'frontend', autoFixable: true },
617
+ ),
618
+ );
619
+ }
620
+
621
+ // ─── DEV-UI-014 — stub helpers in list pages (return 0 / '' / null) ───────
622
+
623
+ async function checkDevUi014(input: CheckerInput): Promise<Finding[]> {
624
+ const { inventory, projectPath } = input;
625
+ const offenders: Array<{ file: string; helper: string }> = [];
626
+ // Match named arrow/function helpers whose body returns a literal stub:
627
+ // const consumptionFor = (b) => 0
628
+ // function priceFor(item) { return ''; }
629
+ // const xFor = (b: Foo) => null
630
+ // Restrict to List pages (the bug pattern that produced empty KPIs).
631
+ const helperRe =
632
+ /(?:const|let)\s+(\w+For)\s*=\s*\([^)]*\)\s*(?::\s*[^=]+)?=>\s*\(?\s*(0|''|""|null|false)\s*\)?\s*[,;]|function\s+(\w+For)\s*\([^)]*\)\s*(?::\s*[^=]+)?\{\s*(?:[^{}]{0,80}?)return\s+(0|''|""|null|false)\s*;\s*\}/g;
633
+ for (const page of inventory.pages) {
634
+ if (page.kind !== 'list') continue;
635
+ const abs = path.resolve(projectPath, page.file);
636
+ const source = await readText(abs);
637
+ if (!source) continue;
638
+ let m: RegExpExecArray | null;
639
+ while ((m = helperRe.exec(source)) !== null) {
640
+ offenders.push({ file: page.file, helper: m[1] ?? m[3] ?? '<anonymous>' });
641
+ }
642
+ }
643
+ if (offenders.length === 0) return [makeOk('DEV-UI-014')];
644
+ return offenders.map((o) =>
645
+ makeErr(
646
+ 'DEV-UI-014',
647
+ { file: o.file, helper: o.helper },
648
+ `List page emits a stub helper (\`${o.helper}\`) returning a literal — typical "give-up fallback" when the DTO doesn't expose a needed field. Don't paper over the gap : either (a) declare the missing field as a computed attribute with a \`formula\` in the BA data model so scaffold-business projects it via LINQ, or (b) extend the list DTO to include the value computed by the backend service. Audit DM-016 enforces the first path at the BA level.`,
649
+ { file: o.file, fixSkill: 'frontend-api-client', fixPhaseKey: 'data', autoFixable: false },
650
+ ),
651
+ );
652
+ }
653
+
654
+ // ─── DEV-UI-015 — api-client services match controller routes ────────────
655
+
656
+ interface ControllerEndpoint {
657
+ /** Lower-cased verb: 'get' / 'post' / 'put' / 'delete' / 'patch'. */
658
+ verb: string;
659
+ /** Full route pattern, e.g. 'api/budgets/dashboard/consolidated'. Lower-cased, no leading slash, no `:id` token (replaced by `{id}`). */
660
+ fullPath: string;
661
+ /** Whether the action method declares a `[FromBody]` parameter (or non-decorated reference type for POST/PUT/PATCH). */
662
+ hasBody: boolean;
663
+ /** Source file (relative to backendPath). */
664
+ file: string;
665
+ }
666
+
667
+ interface ServiceCall {
668
+ verb: string;
669
+ /** URL literal as written in the TS source, lower-cased, no leading `/api/` (axios baseURL prepends it). */
670
+ url: string;
671
+ /** Whether the axios call passes a body argument. */
672
+ hasBody: boolean;
673
+ file: string;
674
+ }
675
+
676
+ const C_HTTP_VERBS = ['Get', 'Post', 'Put', 'Delete', 'Patch'];
677
+
678
+ async function loadControllerEndpoints(backendPath: string): Promise<ControllerEndpoint[]> {
679
+ const endpoints: ControllerEndpoint[] = [];
680
+ const files = await findFiles('**/*Controller.cs', { cwd: backendPath });
681
+ for (const abs of files) {
682
+ const source = await readText(abs);
683
+ if (!source) continue;
684
+ const rel = path.relative(backendPath, abs).replace(/\\/g, '/');
685
+ // Class-level [Route("...")] (above `public class XxxController`).
686
+ const classRouteMatch = /\[Route\(\s*['"]([^'"]+)['"]\s*\)\][\s\S]{0,400}?public\s+(?:abstract\s+|sealed\s+)?class\s+\w+Controller\b/.exec(source);
687
+ const baseRoute = classRouteMatch ? classRouteMatch[1].trim() : '';
688
+ // Method-level [HttpVerb("route")] capturing the optional inline route + the method signature on the next line.
689
+ const methodRe = new RegExp(
690
+ `\\[Http(${C_HTTP_VERBS.join('|')})(?:\\(\\s*['"]([^'"]*)['"]\\s*\\))?\\s*\\][^\\n]*\\n[\\s\\S]{0,400}?public[^\\(]+\\(([^\\)]*)\\)`,
691
+ 'g',
692
+ );
693
+ let m: RegExpExecArray | null;
694
+ while ((m = methodRe.exec(source)) !== null) {
695
+ const verb = m[1].toLowerCase();
696
+ const inlineRoute = (m[2] ?? '').trim();
697
+ const params = m[3] ?? '';
698
+ const merged = mergeRoutes(baseRoute, inlineRoute);
699
+ const fullPath = normaliseRoute(merged);
700
+ const hasBody = /\[FromBody\]/.test(params) || (verb !== 'get' && /\b(?:Dto|Command|Request|Model)\b\s+\w+/.test(params));
701
+ endpoints.push({ verb, fullPath, hasBody, file: rel });
702
+ }
703
+ }
704
+ return endpoints;
705
+ }
706
+
707
+ function mergeRoutes(base: string, inline: string): string {
708
+ const b = base.replace(/^\/+|\/+$/g, '');
709
+ const i = inline.replace(/^\/+|\/+$/g, '');
710
+ if (!b && !i) return '';
711
+ if (!i) return b;
712
+ if (!b) return i;
713
+ return `${b}/${i}`;
714
+ }
715
+
716
+ function normaliseRoute(route: string): string {
717
+ return route
718
+ .toLowerCase()
719
+ // [controller] token expanded by ASP.NET → can't resolve here; replace with a placeholder that won't match a real path.
720
+ .replace(/\[controller\]/g, '__controller__')
721
+ // {id:guid} → {id}
722
+ .replace(/\{(\w+)(?::[^}]+)?\}/g, '{$1}')
723
+ .replace(/^\/+|\/+$/g, '');
724
+ }
725
+
726
+ async function loadServiceCalls(projectPath: string): Promise<ServiceCall[]> {
727
+ const calls: ServiceCall[] = [];
728
+ const patterns = ['src/features/**/services/*Service.ts', 'src/services/**/*.ts'];
729
+ const found = new Set<string>();
730
+ for (const pat of patterns) {
731
+ for (const f of await findFiles(pat, { cwd: projectPath })) {
732
+ found.add(path.relative(projectPath, f).replace(/\\/g, '/'));
733
+ }
734
+ }
735
+ for (const rel of found) {
736
+ const abs = path.join(projectPath, rel);
737
+ const source = await readText(abs);
738
+ if (!source) continue;
739
+ // axios-style: apiClient.get('/path', ...) / apiClient.post('/path', body, ...) etc.
740
+ const callRe = /\b(?:apiClient|axios|client|http)\s*\.\s*(get|post|put|delete|patch)\s*<[^>]*>?\s*\(\s*(['"`])([^'"`]+)\2\s*(,\s*([^,)]+))?/g;
741
+ let m: RegExpExecArray | null;
742
+ while ((m = callRe.exec(source)) !== null) {
743
+ const verb = m[1].toLowerCase();
744
+ const rawUrl = m[3];
745
+ const secondArg = (m[5] ?? '').trim();
746
+ // Heuristic for body argument : POST/PUT/PATCH with a non-empty second
747
+ // arg that isn't an axios config object (`{ params: ... }` etc.).
748
+ const hasBody =
749
+ verb !== 'get' && verb !== 'delete' &&
750
+ secondArg.length > 0 &&
751
+ !secondArg.startsWith('{ params') &&
752
+ !/^\{\s*params\s*:/.test(secondArg);
753
+ const url = normaliseTsUrl(rawUrl);
754
+ calls.push({ verb, url, hasBody, file: rel });
755
+ }
756
+ }
757
+ return calls;
758
+ }
759
+
760
+ function normaliseTsUrl(url: string): string {
761
+ // Convert template-literal `${id}` to `{id}` so it matches the controller `{id}` token.
762
+ return url
763
+ .toLowerCase()
764
+ .replace(/\$\{[^}]+\}/g, '{id}')
765
+ .replace(/^\/+|\/+$/g, '')
766
+ // axios baseURL is /api — strip it so the comparison is against the route's
767
+ // application-relative form (controllers list `api/...` in [Route]).
768
+ .replace(/^api\//, '');
769
+ }
770
+
771
+ async function checkDevUi015(input: CheckerInput): Promise<Finding[]> {
772
+ const { args, projectPath } = input;
773
+ if (!args.backendPath) {
774
+ return [makeOk('DEV-UI-015', { note: 'skipping — --backend-path not supplied' })];
775
+ }
776
+ const backendAbs = path.resolve(args.backendPath);
777
+ const endpoints = await loadControllerEndpoints(backendAbs);
778
+ if (endpoints.length === 0) {
779
+ return [makeOk('DEV-UI-015', { note: 'no controllers found at backendPath' })];
780
+ }
781
+ const calls = await loadServiceCalls(projectPath);
782
+ if (calls.length === 0) {
783
+ return [makeOk('DEV-UI-015', { note: 'no axios services found' })];
784
+ }
785
+
786
+ // Endpoints normalised: strip `api/` prefix to align with TS calls (`apiClient` baseURL is `/api`).
787
+ const endpointKeys = new Map<string, ControllerEndpoint>();
788
+ for (const ep of endpoints) {
789
+ const stripped = ep.fullPath.replace(/^api\//, '');
790
+ endpointKeys.set(`${ep.verb} ${stripped}`, ep);
791
+ }
792
+
793
+ const mismatches: Array<{ call: ServiceCall; reason: string }> = [];
794
+ for (const call of calls) {
795
+ const key = `${call.verb} ${call.url}`;
796
+ const ep = endpointKeys.get(key);
797
+ if (!ep) {
798
+ // Try fuzzy: same URL but different verb (typical "GET vs POST" mismatch).
799
+ const candidates = Array.from(endpointKeys.values()).filter((e) => e.fullPath.replace(/^api\//, '') === call.url);
800
+ if (candidates.length > 0) {
801
+ mismatches.push({
802
+ call,
803
+ reason: `wrong HTTP verb — service uses '${call.verb.toUpperCase()}' but controller exposes '${candidates[0].verb.toUpperCase()}'`,
804
+ });
805
+ } else {
806
+ mismatches.push({
807
+ call,
808
+ reason: `no controller route matches '${call.verb.toUpperCase()} /${call.url}' — typo or missing endpoint`,
809
+ });
810
+ }
811
+ continue;
812
+ }
813
+ if (call.hasBody !== ep.hasBody) {
814
+ mismatches.push({
815
+ call,
816
+ reason: ep.hasBody
817
+ ? `controller expects a body ([FromBody]) but service does not send one`
818
+ : `service sends a body but controller has no [FromBody] / mutation parameter`,
819
+ });
820
+ }
821
+ }
822
+
823
+ if (mismatches.length === 0) {
824
+ return [makeOk('DEV-UI-015', { count: calls.length })];
825
+ }
826
+ return mismatches.map((mm) =>
827
+ makeErr(
828
+ 'DEV-UI-015',
829
+ { file: mm.call.file, verb: mm.call.verb.toUpperCase(), url: `/${mm.call.url}`, reason: mm.reason },
830
+ `API client / controller drift: ${mm.reason}. Re-run scaffold-api-client with the corrected spec, or fix the controller route attribute. Mismatches at this layer surface as runtime 400/404 errors with no console diagnostic — exactly the dashboard-empty-cards pattern.`,
831
+ { file: mm.call.file, fixSkill: 'frontend-api-client', fixPhaseKey: 'api', autoFixable: false },
832
+ ),
833
+ );
834
+ }
835
+
836
+ // ─── DEV-UI-016 — list pages must use <DataTable> from customisation-ui ───
837
+
838
+ async function checkDevUi016(input: CheckerInput): Promise<Finding[]> {
839
+ const { inventory, projectPath } = input;
840
+ const offenders: string[] = [];
841
+ for (const page of inventory.pages) {
842
+ if (page.kind !== 'list') continue;
843
+ const abs = path.resolve(projectPath, page.file);
844
+ const source = await readText(abs);
845
+ if (!source) continue;
846
+ const usesDataTable = /<DataTable\b/.test(source);
847
+ const usesRawTable = /<table\b/.test(source);
848
+ if (usesRawTable && !usesDataTable) offenders.push(page.file);
849
+ }
850
+ if (offenders.length === 0) return [makeOk('DEV-UI-016')];
851
+ return [
852
+ makeWarn(
853
+ 'DEV-UI-016',
854
+ { pages: offenders.join(',') },
855
+ "List pages must use `<DataTable>` from `@/components/ui/DataTable` (customisation-ui baseline). Raw `<table>` skips the SmartStack search/pagination/sorting and breaks theme cohesion. Re-run scaffold-component with `--overwrite` for each listed page.",
856
+ { fixSkill: 'frontend-component', fixPhaseKey: 'frontend', autoFixable: true },
857
+ ),
858
+ ];
859
+ }
860
+
861
+ // ─── DEV-UI-017 — generated CSS token classes exist in index.css ──────────
862
+
863
+ async function checkDevUi017(input: CheckerInput): Promise<Finding[]> {
864
+ const { inventory, projectPath } = input;
865
+ const indexCssPath = path.resolve(projectPath, 'src', 'index.css');
866
+ const indexCss = (await fileExists(indexCssPath)) ? await readText(indexCssPath) : '';
867
+ // Build a set of declared utility class names: `.input { ... }`, `.btn-primary { ... }`, …
868
+ const declared = new Set<string>();
869
+ const declRe = /^\s*\.([a-zA-Z][\w-]*)\s*[\{,]/gm;
870
+ let m: RegExpExecArray | null;
871
+ while ((m = declRe.exec(indexCss)) !== null) declared.add(m[1]);
872
+
873
+ // Tokens used by the generated templates whose CSS lives in index.css. Other
874
+ // class names (Tailwind utilities, framework-provided) are not checked.
875
+ const TRACKED = ['input', 'btn-primary', 'btn-secondary'];
876
+ const missingByPage: Array<{ file: string; classes: string[] }> = [];
877
+ for (const page of inventory.pages) {
878
+ const abs = path.resolve(projectPath, page.file);
879
+ const source = await readText(abs);
880
+ if (!source) continue;
881
+ const used = new Set<string>();
882
+ const classNameRe = /className\s*=\s*"([^"]+)"/g;
883
+ while ((m = classNameRe.exec(source)) !== null) {
884
+ for (const cls of m[1].split(/\s+/)) {
885
+ if (TRACKED.includes(cls)) used.add(cls);
886
+ }
887
+ }
888
+ const missing = Array.from(used).filter((c) => !declared.has(c));
889
+ if (missing.length > 0) missingByPage.push({ file: page.file, classes: missing });
890
+ }
891
+ if (missingByPage.length === 0) return [makeOk('DEV-UI-017')];
892
+ return missingByPage.map((p) =>
893
+ makeWarn(
894
+ 'DEV-UI-017',
895
+ { file: p.file, classes: p.classes.join(',') },
896
+ `Page uses utility classes (\`${p.classes.join('`, `')}\`) that are not declared in src/index.css. Re-run scaffold-theme to inject the missing helper classes — without them, inputs and buttons render unstyled.`,
897
+ { file: p.file, fixSkill: 'frontend-theme', fixPhaseKey: 'frontend', autoFixable: true },
898
+ ),
899
+ );
900
+ }
901
+
902
+ // ─── DEV-UI-018 — Barrel exports resolve to existing files ────────────────
903
+ // Catches the class of bug where `src/components/<area>/index.ts` re-exports
904
+ // a sibling module that was renamed or deleted. Vite serves a 404 for the
905
+ // missing module → the barrel cannot be transformed → every dynamic import
906
+ // that traverses it cascades into ChunkLoadError on the parent bundle.
907
+ // DEV-UI-003 only covers registry files; this rule covers generic barrels.
908
+
909
+ const BARREL_REEXPORT_RE = /export\s*(?:\*|\{[^}]*\})\s*from\s*['"`](\.\/?[^'"`]+)['"`]/g;
910
+
911
+ async function discoverBarrels(projectPath: string): Promise<string[]> {
912
+ const patterns = [
913
+ 'src/components/**/index.ts',
914
+ 'src/pages/**/index.ts',
915
+ 'src/hooks/**/index.ts',
916
+ 'src/utils/**/index.ts',
917
+ 'src/services/**/index.ts',
918
+ 'src/features/**/index.ts',
919
+ ];
920
+ const out = new Set<string>();
921
+ for (const pat of patterns) {
922
+ for (const f of await findFiles(pat, { cwd: projectPath })) {
923
+ const rel = path.relative(projectPath, f).replace(/\\/g, '/');
924
+ // Exclude the registry aggregator — already covered by DEV-UI-003.
925
+ if (rel === 'src/extensions/componentRegistry.generated.ts') continue;
926
+ out.add(rel);
927
+ }
928
+ }
929
+ return [...out].sort();
930
+ }
931
+
932
+ async function resolveBarrelExport(
933
+ barrelAbsPath: string,
934
+ importPath: string,
935
+ ): Promise<string | null> {
936
+ // Only relative imports are tracked — bare-module barrels (rare) bypass disk check.
937
+ if (!importPath.startsWith('.')) return null;
938
+ const target = path.resolve(path.dirname(barrelAbsPath), importPath);
939
+ const candidates = [
940
+ target,
941
+ `${target}.tsx`,
942
+ `${target}.ts`,
943
+ path.join(target, 'index.tsx'),
944
+ path.join(target, 'index.ts'),
945
+ ];
946
+ for (const c of candidates) {
947
+ if (await fileExists(c)) return c;
948
+ }
949
+ return null;
950
+ }
951
+
952
+ async function checkDevUi018(input: CheckerInput): Promise<Finding[]> {
953
+ const { args } = input;
954
+ const projectPath = path.resolve(args.projectPath);
955
+ const barrels = await discoverBarrels(projectPath);
956
+ const broken: Finding[] = [];
957
+ for (const rel of barrels) {
958
+ const abs = path.join(projectPath, rel);
959
+ const source = await readText(abs);
960
+ BARREL_REEXPORT_RE.lastIndex = 0;
961
+ let m: RegExpExecArray | null;
962
+ while ((m = BARREL_REEXPORT_RE.exec(source)) !== null) {
963
+ const importPath = m[1];
964
+ const resolved = await resolveBarrelExport(abs, importPath);
965
+ if (resolved !== null) continue;
966
+ broken.push(makeErr(
967
+ 'DEV-UI-018',
968
+ { broken: `${rel}→${importPath}` },
969
+ "Either restore the missing file or delete the dead re-export line. A barrel `index.ts` that references a non-existent sibling makes Vite serve a 404 on the barrel itself, which cascades into ChunkLoadError on every dynamic import traversing it.",
970
+ { file: rel, autoFixable: false },
971
+ ));
972
+ }
973
+ }
974
+ if (broken.length === 0) return [makeOk('DEV-UI-018')];
975
+ return broken;
976
+ }
977
+
978
+ // ─── DEV-UI-022 — FK fields render via <EntityLookup>, never <input>/<select>
979
+ // Symmetric to backend DEV-DAT-008 (same-module FK constraints are real, not
980
+ // bare Guid). On the frontend, the symmetric guarantee is that the user
981
+ // interacts with a typed combobox over /api/{module}/{plural}/lookup — not a
982
+ // free-text Guid input that breaks on first paste and silently degrades UX.
983
+ //
984
+ // Detection: scan Form / Create / Edit pages for
985
+ // <input ... name="xxxId"> // FK rendered as text field
986
+ // <input ... id="xxxId"> // same, alternate attribute
987
+ // <select ... value={...xxxId}> // FK rendered as static dropdown
988
+ // The xxxId convention matches scaffold-component's field name convention
989
+ // (BA `entité.md` Rel: lines emit PascalCase FK columns → camelCase in TS).
990
+ //
991
+ // Whitelist: identifier-bearing fields that happen to end in "Id" but are NOT
992
+ // foreign-key references — `externalId` (third-party Id), `parentId` (raw
993
+ // self-reference, may be free-form), `guidId` (legacy alias). Extend at the
994
+ // top of the file; the test snapshot pins the default list.
995
+
996
+ const DEV_UI_022_FK_INPUT_RE = /<input\b[^>]*\b(?:name|id)\s*=\s*["']([A-Za-z]\w*Id)["']/g;
997
+ const DEV_UI_022_FK_SELECT_RE = /<select\b[^>]*\bvalue=\{[^}]*?\.([A-Za-z]\w*Id)\b[^}]*?\}/g;
998
+ const DEV_UI_022_WHITELIST = new Set(['externalId', 'parentId', 'guidId']);
999
+
1000
+ async function checkDevUi022(input: CheckerInput): Promise<Finding[]> {
1001
+ const { inventory, projectPath } = input;
1002
+ const formPages = inventory.pages.filter((p) =>
1003
+ p.kind === 'form' || p.kind === 'create' || p.kind === 'edit',
1004
+ );
1005
+ if (formPages.length === 0) return [makeOk('DEV-UI-022', { note: 'no form pages on disk' })];
1006
+
1007
+ const findings: Finding[] = [];
1008
+ for (const page of formPages) {
1009
+ const abs = path.join(projectPath, page.file);
1010
+ const source = await readText(abs);
1011
+ if (!source) continue;
1012
+
1013
+ const offenders = new Set<string>();
1014
+
1015
+ DEV_UI_022_FK_INPUT_RE.lastIndex = 0;
1016
+ let m: RegExpExecArray | null;
1017
+ while ((m = DEV_UI_022_FK_INPUT_RE.exec(source)) !== null) {
1018
+ const field = m[1];
1019
+ if (DEV_UI_022_WHITELIST.has(field)) continue;
1020
+ // Skip hidden inputs — Auth tokens, CSRF, … occasionally use ...Id naming
1021
+ // and are not user-facing.
1022
+ const tag = m[0];
1023
+ if (/type\s*=\s*["']hidden["']/.test(tag)) continue;
1024
+ offenders.add(field);
1025
+ }
1026
+
1027
+ DEV_UI_022_FK_SELECT_RE.lastIndex = 0;
1028
+ while ((m = DEV_UI_022_FK_SELECT_RE.exec(source)) !== null) {
1029
+ const field = m[1];
1030
+ if (DEV_UI_022_WHITELIST.has(field)) continue;
1031
+ offenders.add(field);
1032
+ }
1033
+
1034
+ for (const field of offenders) {
1035
+ findings.push(makeErr(
1036
+ 'DEV-UI-022',
1037
+ { file: page.file, field, entity: page.entity },
1038
+ `FK field '${field}' is rendered as <input>/<select> instead of <EntityLookup>. ` +
1039
+ `Re-run scaffold-component for this page so the orchestrator (ba-develop Phase 3a) ` +
1040
+ `enriches the field with \`fkTo: { entity, module }\` from entité.md Rel: lines, ` +
1041
+ `and the generator emits <EntityLookup apiEndpoint="/api/{module}/{plural}/lookup" />. ` +
1042
+ `If the FK has no declared relation in entité.md, add 'Relations: ${page.entity ?? 'Source'} *→1 Target (FK ${field}, restrict)' ` +
1043
+ `to the entity definition, then re-audit.`,
1044
+ { file: page.file, fixSkill: 'frontend-component', fixPhaseKey: 'frontend', autoFixable: false },
1045
+ ));
1046
+ }
1047
+ }
1048
+
1049
+ if (findings.length === 0) return [makeOk('DEV-UI-022')];
1050
+ return findings;
1051
+ }
1052
+
1053
+ // ─── Dispatcher ───────────────────────────────────────────────────────────
1054
+
1055
+ const CHECKERS: Record<string, (input: CheckerInput) => Promise<Finding[]>> = {
1056
+ 'DEV-UI-001': checkDevUi001,
1057
+ 'DEV-UI-002': checkDevUi002,
1058
+ 'DEV-UI-003': checkDevUi003,
1059
+ 'DEV-UI-004': checkDevUi004,
1060
+ 'DEV-UI-005': checkDevUi005,
1061
+ 'DEV-UI-006': checkDevUi006,
1062
+ 'DEV-UI-007': checkDevUi007,
1063
+ 'DEV-UI-008': checkDevUi008,
1064
+ 'DEV-UI-009': checkDevUi009,
1065
+ 'DEV-UI-010': checkDevUi010,
1066
+ 'DEV-UI-011': checkDevUi011,
1067
+ 'DEV-UI-012': checkDevUi012,
1068
+ 'DEV-UI-013': checkDevUi013,
1069
+ 'DEV-UI-014': checkDevUi014,
1070
+ 'DEV-UI-015': checkDevUi015,
1071
+ 'DEV-UI-016': checkDevUi016,
1072
+ 'DEV-UI-017': checkDevUi017,
1073
+ 'DEV-UI-018': checkDevUi018,
1074
+ 'DEV-UI-022': checkDevUi022,
1075
+ };
1076
+
1077
+ export async function audit(args: AuditDevFrontendArgs): Promise<AuditReport> {
1078
+ const projectPath = path.resolve(args.projectPath);
1079
+ const inventory = args.inventory
1080
+ ? await readJson<FrontendInventory>(path.resolve(args.inventory))
1081
+ : await buildInventory(projectPath);
1082
+ const prdSlice = await loadPrdSlice(args.prdSlice);
1083
+
1084
+ const wantRules = args.rules.length === 0
1085
+ ? Object.keys(CHECKERS)
1086
+ : args.rules.filter((r) => CHECKERS[r]);
1087
+
1088
+ const findings: Finding[] = [];
1089
+ const input: CheckerInput = { args, prdSlice, inventory, projectPath };
1090
+ for (const ruleId of wantRules) {
1091
+ const checker = CHECKERS[ruleId];
1092
+ try {
1093
+ const hits = await checker(input);
1094
+ findings.push(...hits);
1095
+ } catch (err) {
1096
+ findings.push(makeErr(
1097
+ ruleId,
1098
+ { error: err instanceof Error ? err.message : String(err) },
1099
+ `Checker for ${ruleId} threw an exception. This is an audit bug, not a code defect — investigate the checker logic.`,
1100
+ { autoFixable: false },
1101
+ ));
1102
+ }
1103
+ }
1104
+
1105
+ const counts = { errors: 0, warnings: 0, oks: 0 };
1106
+ const byRule: Record<string, number> = {};
1107
+ for (const f of findings) {
1108
+ if (f.severity === 'err') counts.errors++;
1109
+ else if (f.severity === 'warn') counts.warnings++;
1110
+ else counts.oks++;
1111
+ byRule[f.code] = (byRule[f.code] ?? 0) + 1;
1112
+ }
1113
+
1114
+ return {
1115
+ scope: 'devFrontend',
1116
+ applicationCode: args.appCode,
1117
+ moduleCode: args.moduleCode,
1118
+ projectPath,
1119
+ filesInspected: inventory.pages.length,
1120
+ findings,
1121
+ counts,
1122
+ byRule,
1123
+ };
1124
+ }
1125
+
1126
+ export { CHECKERS };