@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,825 @@
1
+ /**
2
+ * ui-polish/audit.ts — Scan *.tsx files and produce a list of findings against
3
+ * the hard rules catalogued in tokens.json.
4
+ *
5
+ * Design notes:
6
+ * - Parsing is line-based and regex-based — NOT a real AST parser. This is
7
+ * intentional: keeps the skill zero-dep and the rules explainable. False
8
+ * positives are expected for exotic code; the baseline generator templates
9
+ * should only produce idiomatic code, so the heuristics work in practice.
10
+ * - Each rule has a pure function `checkRxx(source, filePath, rule) → Finding[]`.
11
+ * - Aggregation happens in `audit()` at the bottom.
12
+ */
13
+ import path from 'node:path';
14
+ import { findFiles, readText, fileExists } from '../../../../../lib/fs.js';
15
+ import type {
16
+ AuditReport,
17
+ Finding,
18
+ HardRule,
19
+ Severity,
20
+ TokensFile,
21
+ UiPolishArgs,
22
+ } from './types.js';
23
+
24
+ // ─── Tokens loading ───────────────────────────────────────────────────────
25
+
26
+ export async function loadTokens(tokensFile: string): Promise<TokensFile> {
27
+ const raw = await readText(tokensFile);
28
+ return JSON.parse(raw) as TokensFile;
29
+ }
30
+
31
+ // ─── className span extraction (shared with apply.ts) ────────────────────
32
+
33
+ /** className attribute spans (start/end offsets + inner text) in the source. */
34
+ export function classNameSpans(source: string): Array<{ start: number; end: number; text: string }> {
35
+ const spans: Array<{ start: number; end: number; text: string }> = [];
36
+ const re = /className=\{?[`"']([^`"']*)[`"']/g;
37
+ let m: RegExpExecArray | null;
38
+ while ((m = re.exec(source)) !== null) {
39
+ const text = m[1];
40
+ const start = m.index + m[0].indexOf(text);
41
+ spans.push({ start, end: start + text.length, text });
42
+ }
43
+ return spans;
44
+ }
45
+
46
+ // ─── Page discovery ───────────────────────────────────────────────────────
47
+
48
+ async function discoverPages(projectPath: string): Promise<string[]> {
49
+ const patterns = [
50
+ 'src/pages/**/*.tsx',
51
+ 'src/features/**/pages/**/*.tsx',
52
+ ];
53
+ const found: string[] = [];
54
+ for (const pat of patterns) {
55
+ const files = await findFiles(pat, { cwd: projectPath });
56
+ found.push(...files);
57
+ }
58
+ // Dedup + filter tests
59
+ return [...new Set(found)].filter(
60
+ (f) => !f.endsWith('.test.tsx') && !f.endsWith('.spec.tsx'),
61
+ );
62
+ }
63
+
64
+ // ─── Local-import resolver (shared component scanning) ───────────────────
65
+
66
+ /**
67
+ * Follow 1 level of local imports from a page file. Extracts static import
68
+ * paths matching @/components/** or @/features/** and resolves them to
69
+ * absolute filesystem paths. Does NOT recurse into imported files' imports.
70
+ */
71
+ async function resolveLocalImports(
72
+ source: string,
73
+ projectPath: string,
74
+ ): Promise<string[]> {
75
+ const importRe = /import\s+[^;]*from\s+['"](@\/(?:components|features)\/[^'"]+)['"]/g;
76
+ const resolved: string[] = [];
77
+ let m: RegExpExecArray | null;
78
+ while ((m = importRe.exec(source)) !== null) {
79
+ const importPath = m[1];
80
+ const base = path.join(projectPath, 'src', importPath.slice(2));
81
+ const candidates = [
82
+ `${base}.tsx`, `${base}.ts`,
83
+ path.join(base, 'index.tsx'), path.join(base, 'index.ts'),
84
+ ];
85
+ for (const c of candidates) {
86
+ if (await fileExists(c)) {
87
+ resolved.push(c);
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ return resolved;
93
+ }
94
+
95
+ // ─── URL → component file resolver ───────────────────────────────────────
96
+
97
+ /**
98
+ * Resolve a URL path to component files via PageRegistry.register() data.
99
+ * Scans src/extensions/*Registry.ts for register('<key>', lazy(() => import('<path>')))
100
+ * and builds a reverse lookup.
101
+ */
102
+ async function resolveUrlToFiles(
103
+ url: string,
104
+ projectPath: string,
105
+ ): Promise<string[]> {
106
+ const segments = url.replace(/^\//, '').split('/').filter(Boolean);
107
+ const cleaned = segments.map(s =>
108
+ s.startsWith(':') || s.startsWith('{') ? null : s,
109
+ );
110
+ let key = cleaned.filter(Boolean).join('.');
111
+ const lastCleaned = cleaned[cleaned.length - 1];
112
+ const secondLast = cleaned.length >= 2 ? cleaned[cleaned.length - 2] : undefined;
113
+ if (key.endsWith('.new')) key = key.replace(/\.new$/, '.create');
114
+ else if (lastCleaned === null && secondLast !== null) key += '.detail';
115
+
116
+ const extensionsDir = path.join(projectPath, 'src', 'extensions');
117
+ let registryFiles: string[];
118
+ try {
119
+ registryFiles = await findFiles('*Registry.ts', { cwd: extensionsDir });
120
+ } catch {
121
+ return [];
122
+ }
123
+ const registerRe = /PageRegistry\.register\(\s*['"`]([^'"`]+)['"`]\s*,[\s\S]*?import\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
124
+ const results: string[] = [];
125
+
126
+ for (const regFile of registryFiles) {
127
+ let content: string;
128
+ try {
129
+ content = await readText(regFile);
130
+ } catch {
131
+ continue;
132
+ }
133
+ registerRe.lastIndex = 0;
134
+ let m: RegExpExecArray | null;
135
+ while ((m = registerRe.exec(content)) !== null) {
136
+ if (m[1] === key || m[1].startsWith(key + '.')) {
137
+ const importPath = m[2];
138
+ const base = importPath.startsWith('@/')
139
+ ? path.join(projectPath, 'src', importPath.slice(2))
140
+ : path.join(extensionsDir, importPath);
141
+ const candidates = [
142
+ `${base}.tsx`, `${base}.ts`,
143
+ path.join(base, 'index.tsx'), path.join(base, 'index.ts'),
144
+ ];
145
+ for (const c of candidates) {
146
+ if (await fileExists(c)) {
147
+ results.push(c);
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ return results;
155
+ }
156
+
157
+ // ─── Rule implementations ─────────────────────────────────────────────────
158
+
159
+ type RuleChecker = (source: string, filePath: string, rule: HardRule) => Finding[];
160
+
161
+ function withBase(rule: HardRule, filePath: string): Omit<Finding, 'line' | 'message' | 'snippet'> {
162
+ return {
163
+ ruleId: rule.id,
164
+ severity: rule.severity,
165
+ file: filePath,
166
+ autoFixable: rule.autoFixable,
167
+ };
168
+ }
169
+
170
+ /** R1 — Page must use <PageTemplate>. Heuristic: PageTemplate import + usage anywhere in file. */
171
+ const checkR1: RuleChecker = (source, filePath, rule) => {
172
+ // Only check files that look like a page (export function XxxPage).
173
+ const exportMatch = source.match(/export\s+(?:default\s+)?function\s+[A-Z]\w*Page\s*\(/);
174
+ if (!exportMatch) return [];
175
+ // Pass if <PageTemplate appears anywhere in the JSX (wrapped in PermissionGuard, early returns ok).
176
+ const usesPageTemplate = /<PageTemplate[\s>]/.test(source);
177
+ if (usesPageTemplate) return [];
178
+ const lineNumber = source.slice(0, exportMatch.index!).split('\n').length;
179
+ return [{
180
+ ...withBase(rule, filePath),
181
+ line: lineNumber,
182
+ message: `Page does not render <PageTemplate> anywhere. Every page must wrap its main content in <PageTemplate title=…> from @/components/ui/PageTemplate.`,
183
+ snippet: exportMatch[0].slice(0, 60),
184
+ }];
185
+ };
186
+
187
+ /** R2 — No arbitrary hex in className. Matches `bg-[#xxx]`, `text-[#xxx]`, `border-[#xxx]`. */
188
+ const checkR2: RuleChecker = (source, filePath, rule) => {
189
+ const findings: Finding[] = [];
190
+ const hexClass = /className=\{?["'`][^"'`]*\b(?:bg|text|border|fill|stroke)-\[#[0-9a-fA-F]{3,8}\][^"'`]*["'`]/g;
191
+ let m: RegExpExecArray | null;
192
+ while ((m = hexClass.exec(source)) !== null) {
193
+ const line = source.slice(0, m.index).split('\n').length;
194
+ findings.push({
195
+ ...withBase(rule, filePath),
196
+ line,
197
+ message: `className contains an arbitrary hex color. Use var(--token-name) instead.`,
198
+ snippet: m[0].slice(0, 120),
199
+ });
200
+ }
201
+ return findings;
202
+ };
203
+
204
+ /** R3 — Primary CTA must use accent-5/6 token. Heuristic: buttons with "primary" context using non-token bg. */
205
+ const checkR3: RuleChecker = (source, filePath, rule) => {
206
+ const findings: Finding[] = [];
207
+ // Catch obvious bad primaries: bg-blue-*, bg-indigo-*, bg-violet-* on <button>
208
+ const badButton = /<button[^>]*className=\{?["'`][^"'`]*\bbg-(?:blue|indigo|violet|purple|green|red)-\d{3}[^"'`]*["'`]/g;
209
+ let m: RegExpExecArray | null;
210
+ while ((m = badButton.exec(source)) !== null) {
211
+ const line = source.slice(0, m.index).split('\n').length;
212
+ findings.push({
213
+ ...withBase(rule, filePath),
214
+ line,
215
+ message: `<button> uses a raw Tailwind color. Primary CTAs must use bg-[var(--color-accent-500)] or .btn .btn-primary.`,
216
+ snippet: m[0].slice(0, 140),
217
+ });
218
+ }
219
+ return findings;
220
+ };
221
+
222
+ /** R4 — No hardcoded user-facing strings. Heuristic: JSX text nodes with word chars not wrapped in t(). */
223
+ const checkR4: RuleChecker = (source, filePath, rule) => {
224
+ const findings: Finding[] = [];
225
+ // Look for >Something</ or >Something< where Something is a word+ and not {t(...)} / {expr}
226
+ const textNode = />\s*([A-Z][a-zA-Z ]{3,}?)\s*</g;
227
+ let m: RegExpExecArray | null;
228
+ const seen = new Set<string>();
229
+ while ((m = textNode.exec(source)) !== null) {
230
+ const txt = m[1].trim();
231
+ // Skip HTML entities, common framework text, single words in Pascal (likely component names not text).
232
+ if (seen.has(txt)) continue;
233
+ if (/^[A-Z][a-z]+$/.test(txt)) continue; // Single PascalCase word — often a variable, skip.
234
+ if (['TODO', 'FIXME', 'N/A'].includes(txt)) continue;
235
+ seen.add(txt);
236
+ const line = source.slice(0, m.index).split('\n').length;
237
+ findings.push({
238
+ ...withBase(rule, filePath),
239
+ line,
240
+ message: `JSX contains hardcoded text "${txt}". Wrap in useTranslation('ns') + t('key').`,
241
+ snippet: m[0].slice(0, 120),
242
+ });
243
+ }
244
+ return findings;
245
+ };
246
+
247
+ /** R5 — Icons from lucide-react only. */
248
+ const checkR5: RuleChecker = (source, filePath, rule) => {
249
+ const findings: Finding[] = [];
250
+ const badImport = /import\s+[^;]+from\s+['"](?:@heroicons|react-icons|@fortawesome)[^'"]*['"]/g;
251
+ let m: RegExpExecArray | null;
252
+ while ((m = badImport.exec(source)) !== null) {
253
+ const line = source.slice(0, m.index).split('\n').length;
254
+ findings.push({
255
+ ...withBase(rule, filePath),
256
+ line,
257
+ message: `Non-lucide icon library imported. Use lucide-react exclusively.`,
258
+ snippet: m[0],
259
+ });
260
+ }
261
+ return findings;
262
+ };
263
+
264
+ /** R6 — Loading state uses Loader2 animate-spin. Heuristic: "loading" string + non-Loader2 spinner. */
265
+ const checkR6: RuleChecker = (source, filePath, rule) => {
266
+ // Look for "isLoading" / "loading" conditional rendering without Loader2.
267
+ const hasLoading = /\bis?[Ll]oading\b/.test(source);
268
+ const hasLoader2 = /\bLoader2\b/.test(source);
269
+ const hasCustomSpinner = /className=\{?["'`][^"'`]*\banimate-spin\b[^"'`]*["'`]/.test(source);
270
+ if (hasLoading && !hasLoader2 && hasCustomSpinner) {
271
+ return [{
272
+ ...withBase(rule, filePath),
273
+ line: 1,
274
+ message: `Page has a loading state but uses a custom spinner. Prefer <Loader2 className="animate-spin" /> from lucide-react.`,
275
+ }];
276
+ }
277
+ return [];
278
+ };
279
+
280
+ /** R7 — Error banner anatomy. Catch bg-red-* error banners. */
281
+ const checkR7: RuleChecker = (source, filePath, rule) => {
282
+ const findings: Finding[] = [];
283
+ const badBanner = /className=\{?["'`][^"'`]*\b(?:bg-red-\d{3}|text-red-\d{3}|border-red-\d{3})[^"'`]*["'`]/g;
284
+ let m: RegExpExecArray | null;
285
+ while ((m = badBanner.exec(source)) !== null) {
286
+ const line = source.slice(0, m.index).split('\n').length;
287
+ findings.push({
288
+ ...withBase(rule, filePath),
289
+ line,
290
+ message: `Error styling uses Tailwind red-*. Use bg-[var(--error-bg)] border-[var(--error-border)] text-[var(--error-text)].`,
291
+ snippet: m[0].slice(0, 140),
292
+ });
293
+ }
294
+ return findings;
295
+ };
296
+
297
+ /** R8 — Lists should use DataTable. Heuristic: file ends with ListPage.tsx, contains <table>, no <DataTable>. */
298
+ const checkR8: RuleChecker = (source, filePath, rule) => {
299
+ if (!filePath.endsWith('ListPage.tsx')) return [];
300
+ const hasTable = /<table[\s>]/.test(source);
301
+ const hasDataTable = /<DataTable[\s>]/.test(source);
302
+ const hasNestedSection = /rounded-\[var\(--radius-card\)\][^>]*>\s*[\s\S]*?<table/.test(source);
303
+ if (hasTable && !hasDataTable && !hasNestedSection) {
304
+ return [{
305
+ ...withBase(rule, filePath),
306
+ line: 1,
307
+ message: `ListPage uses raw <table>. Consider <DataTable> from @/components/ui/DataTable for standard list views.`,
308
+ }];
309
+ }
310
+ return [];
311
+ };
312
+
313
+ /** R9 — useParams<{id:string}>() must be null-checked. Accept classic `if (!id)` OR derived boolean (`!!id`, `id ??`, ternary with id). */
314
+ const checkR9: RuleChecker = (source, filePath, rule) => {
315
+ const findings: Finding[] = [];
316
+ const useParamsMatch = source.match(/const\s*\{\s*id(?:\s*:[^}]+)?\s*\}\s*=\s*useParams/);
317
+ if (!useParamsMatch) return [];
318
+ // Look for any of these guard patterns in the whole file:
319
+ // - `if (!id) ...` → classic early-return guard
320
+ // - `!!id` / `!id` → ternary / boolean derivation (e.g. `const isEdit = !!id`)
321
+ // - `id ?? ''` / `id ?? ...` → nullish coalescing fallback (safe)
322
+ // - `id ? ... : ...` → ternary
323
+ // - `id && ...` → short-circuit
324
+ const patterns = [
325
+ /if\s*\(\s*!\s*\w+\s*\)/, // if (!id) or if (!tenantId) etc.
326
+ /!!\s*\w+\b/, // !!id somewhere
327
+ /\bid\s*\?\?\s*/, // id ?? '...'
328
+ /\bid\s*\?\s*[^:]+:/, // id ? x : y
329
+ /\bid\s*&&\s*/, // id && x
330
+ /\bid\s*!==?\s*['"`]?\w*['"`]?/, // id !== 'new' or id !== undefined etc.
331
+ ];
332
+ const hasGuard = patterns.some((r) => r.test(source));
333
+ if (!hasGuard) {
334
+ const line = source.slice(0, useParamsMatch.index!).split('\n').length;
335
+ findings.push({
336
+ ...withBase(rule, filePath),
337
+ line,
338
+ message: `useParams destructures "id" but no null-check pattern (if (!id), !!id, id ??, id ?:, id &&, id !== …) found in the file.`,
339
+ snippet: useParamsMatch[0],
340
+ });
341
+ }
342
+ return findings;
343
+ };
344
+
345
+ /** R10 — Permission key must be {module}.{section}.{action}, no appCode prefix. */
346
+ const checkR10: RuleChecker = (source, filePath, rule) => {
347
+ const findings: Finding[] = [];
348
+ const permRegex = /permission=\{?["'`]([a-zA-Z0-9._-]+)["'`]/g;
349
+ let m: RegExpExecArray | null;
350
+ while ((m = permRegex.exec(source)) !== null) {
351
+ const key = m[1];
352
+ const parts = key.split('.');
353
+ const line = source.slice(0, m.index).split('\n').length;
354
+ // Valid: 3 segments (module.section.action). Also tolerate 2 (module.action) for simple modules.
355
+ if (parts.length < 2 || parts.length > 3) {
356
+ findings.push({
357
+ ...withBase(rule, filePath),
358
+ line,
359
+ message: `Permission key "${key}" has ${parts.length} segments. Expected {module}.{section}.{action} (3 segments).`,
360
+ snippet: m[0],
361
+ });
362
+ }
363
+ // Detect appCode prefix: 4 segments OR known bad shapes.
364
+ if (parts.length === 4) {
365
+ findings.push({
366
+ ...withBase(rule, filePath),
367
+ line,
368
+ message: `Permission key "${key}" has 4 segments — likely contains appCode prefix. Strip the leading {appCode}. to match {module}.{section}.{action}.`,
369
+ snippet: m[0],
370
+ });
371
+ }
372
+ // Detect underscores instead of dots.
373
+ if (key.includes('_') && !key.includes('.')) {
374
+ findings.push({
375
+ ...withBase(rule, filePath),
376
+ line,
377
+ message: `Permission key "${key}" uses underscores. Expected dot-separated: {module}.{section}.{action}.`,
378
+ snippet: m[0],
379
+ });
380
+ }
381
+ }
382
+ return findings;
383
+ };
384
+
385
+ /** R11 — Pages SHOULD expose Slot injection points. Heuristic: ListPage/DetailPage without <Slot />. */
386
+ const checkR11: RuleChecker = (source, filePath, rule) => {
387
+ const isList = filePath.endsWith('ListPage.tsx');
388
+ const isDetail = filePath.endsWith('DetailPage.tsx');
389
+ const isForm = filePath.endsWith('CreatePage.tsx') || filePath.endsWith('EditPage.tsx') || filePath.endsWith('FormPage.tsx');
390
+ if (!isList && !isDetail && !isForm) return [];
391
+ const hasSlot = /<Slot[\s>]/.test(source);
392
+ if (!hasSlot) {
393
+ return [{
394
+ ...withBase(rule, filePath),
395
+ line: 1,
396
+ message: `Page does not expose any <Slot name="…" /> injection point. Recommend adding header.actions / table.columns / form.fields slots per tokens.json extensionPattern.`,
397
+ }];
398
+ }
399
+ return [];
400
+ };
401
+
402
+ /** R12 — Dark theme base must be #161618. Catch hardcoded #0a0a0a / black in dark-mode context. */
403
+ const checkR12: RuleChecker = (source, filePath, rule) => {
404
+ const findings: Finding[] = [];
405
+ const badDark = /#(?:0[0a-f]{5}|000(?:000)?)\b/gi;
406
+ let m: RegExpExecArray | null;
407
+ while ((m = badDark.exec(source)) !== null) {
408
+ // Only flag if preceded by "dark" within 60 chars
409
+ const ctxStart = Math.max(0, m.index - 60);
410
+ const ctx = source.slice(ctxStart, m.index);
411
+ if (/\bdark\b/i.test(ctx)) {
412
+ const line = source.slice(0, m.index).split('\n').length;
413
+ findings.push({
414
+ ...withBase(rule, filePath),
415
+ line,
416
+ message: `Dark-mode context references ${m[0]} — design system mandates #161618 as --bg-app.`,
417
+ snippet: m[0],
418
+ });
419
+ }
420
+ }
421
+ return findings;
422
+ };
423
+
424
+ /** R13 — Status badge anatomy — catch bg-green-500/text-white as status badges. */
425
+ const checkR13: RuleChecker = (source, filePath, rule) => {
426
+ const findings: Finding[] = [];
427
+ const badBadge = /className=\{?["'`][^"'`]*\b(?:bg-(?:green|yellow|red|blue)-\d{3})[^"'`]*\b(?:rounded|badge)[^"'`]*["'`]/g;
428
+ let m: RegExpExecArray | null;
429
+ while ((m = badBadge.exec(source)) !== null) {
430
+ const line = source.slice(0, m.index).split('\n').length;
431
+ findings.push({
432
+ ...withBase(rule, filePath),
433
+ line,
434
+ message: `Status badge uses raw Tailwind color. Use bg-[var(--<status>-bg)] text-[var(--<status>-text)] border-[var(--<status>-border)] (or .badge-<status>).`,
435
+ snippet: m[0].slice(0, 140),
436
+ });
437
+ }
438
+ return findings;
439
+ };
440
+
441
+ // ─── R14 / R15 — comprehensive hardcoded-color detection ───────────────────
442
+ //
443
+ // These two rules are the general net that complements the context-specific
444
+ // color rules (R3 button, R7 banner, R13 badge): they flag a raw Tailwind color
445
+ // utility ANYWHERE in a className, on ANY prefix.
446
+
447
+ /** Tailwind utility prefixes that accept a palette color. */
448
+ const COLOR_PREFIXES =
449
+ 'bg|text|border|ring|fill|stroke|outline|divide|decoration|placeholder|caret|accent|from|via|to';
450
+ /** Saturated / semantic families — a design token exists for these. */
451
+ const SATURATED_FAMILIES =
452
+ 'red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose';
453
+ /** Neutral families — only SURFACE tokens exist (var(--bg-*)); text/border have none yet. */
454
+ const NEUTRAL_FAMILIES = 'slate|gray|zinc|neutral|stone';
455
+
456
+ /**
457
+ * Scan every className="…" / className={`…`} value and emit one finding per
458
+ * hardcoded color utility whose family is in `familyAlternation`. Shared by R14
459
+ * (saturated) and R15 (neutral). When `includeBW` is true, bare `white`/`black`
460
+ * (which carry no shade) are matched too.
461
+ */
462
+ function scanColorUtilities(
463
+ source: string,
464
+ filePath: string,
465
+ rule: HardRule,
466
+ familyAlternation: string,
467
+ includeBW: boolean,
468
+ ): Finding[] {
469
+ const findings: Finding[] = [];
470
+ const classAttr = /className=\{?[`"']([^`"']*)[`"']/g;
471
+ const inner = `(?:${familyAlternation})-\\d{2,3}${includeBW ? '|white|black' : ''}`;
472
+ let attr: RegExpExecArray | null;
473
+ while ((attr = classAttr.exec(source)) !== null) {
474
+ const classList = attr[1];
475
+ const attrValueStart = attr.index + attr[0].indexOf(classList);
476
+ // Fresh regex per attribute (stateful `lastIndex`).
477
+ const utilRe = new RegExp(`\\b(?:${COLOR_PREFIXES})-(?:${inner})(?:\\/\\d{1,3})?\\b`, 'g');
478
+ let u: RegExpExecArray | null;
479
+ while ((u = utilRe.exec(classList)) !== null) {
480
+ const absIndex = attrValueStart + u.index;
481
+ const line = source.slice(0, absIndex).split('\n').length;
482
+ findings.push({
483
+ ...withBase(rule, filePath),
484
+ line,
485
+ message: `className uses hardcoded color "${u[0]}". Replace with a design token (var(--<status>-bg|text|border), var(--color-accent-<shade>) or var(--bg-*)).`,
486
+ snippet: u[0],
487
+ });
488
+ }
489
+ }
490
+ return findings;
491
+ }
492
+
493
+ /** R14 — any saturated/semantic Tailwind color utility, anywhere in className. */
494
+ const checkR14: RuleChecker = (source, filePath, rule) =>
495
+ scanColorUtilities(source, filePath, rule, SATURATED_FAMILIES, false);
496
+
497
+ /** R15 — any neutral Tailwind color utility (incl. white/black), anywhere in className. */
498
+ const checkR15: RuleChecker = (source, filePath, rule) =>
499
+ scanColorUtilities(source, filePath, rule, NEUTRAL_FAMILIES, true);
500
+
501
+ /**
502
+ * R16 — status token bound to the wrong utility prefix. Unlike R14 (Tailwind
503
+ * families) and R2 (hex), the colour here is ALREADY a var(--token) — the bug is
504
+ * that a token is used outside its role:
505
+ * - bg-[var(--<status>-text)] → a saturated foreground used as a fill (illegible)
506
+ * - text-[var(--<status>-bg)] → a pale surface used as text (invisible)
507
+ * Both collapse contrast, most visibly in dark mode.
508
+ */
509
+ const STATUS_NAMES = 'success|warning|error|info';
510
+ const checkR16: RuleChecker = (source, filePath, rule) => {
511
+ const findings: Finding[] = [];
512
+ const misuse = new RegExp(
513
+ `\\bbg-\\[var\\(--(?:${STATUS_NAMES})-text\\)\\]|\\btext-\\[var\\(--(?:${STATUS_NAMES})-bg\\)\\]`,
514
+ 'g',
515
+ );
516
+ let m: RegExpExecArray | null;
517
+ while ((m = misuse.exec(source)) !== null) {
518
+ const line = source.slice(0, m.index).split('\n').length;
519
+ const util = m[0];
520
+ findings.push({
521
+ ...withBase(rule, filePath),
522
+ line,
523
+ message: `Status token used in the wrong role: "${util}". A --<status>-text token is a saturated foreground (bind it to text-…); a --<status>-bg token is a pale surface (bind it to bg-…). For a badge/banner use the soft triplet bg-[var(--<status>-bg)] text-[var(--<status>-text)] border-[var(--<status>-border)].`,
524
+ snippet: util,
525
+ });
526
+ }
527
+ return findings;
528
+ };
529
+
530
+ /**
531
+ * R17 — status token used as a DECORATIVE / categorical color. Unlike R16
532
+ * (utility-role misuse), the token is bound to the CORRECT utility — the bug is
533
+ * SEMANTIC: a status token (--success|--warning|--error|--info) is aliased to a
534
+ * decorative color-name key (`blue`, `green`, `yellow`, …) in a color map, so a
535
+ * neutral metric inherits a status meaning it does not have (a count rendered in
536
+ * --warning reads as an alert; --success/--error imply ok/bad). This is exactly
537
+ * the `colorClasses = { blue: 'bg-[var(--info-bg)]', yellow: '…--warning…' }`
538
+ * stat-card pattern: every value is a var(--token) so R2 (hex) and R14 (Tailwind
539
+ * family) stay silent, and the utility binding is right so R16 stays silent too.
540
+ *
541
+ * Heuristic: a color-family-named object key whose STRING value contains
542
+ * var(--<status>-…). Precise for the common color-map pattern. Decorative keys
543
+ * mapped to var(--color-accent-*) / var(--bg-*) are NOT flagged — accent and
544
+ * neutral surfaces are the legitimate decorative palette. An inline, non-mapped
545
+ * decorative status token is intentionally NOT flagged (undecidable by regex).
546
+ */
547
+ const DECORATIVE_COLOR_KEYS =
548
+ 'red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose';
549
+ const checkR17: RuleChecker = (source, filePath, rule) => {
550
+ const findings: Finding[] = [];
551
+ // <colorKey>: '<…var(--<status>-…)>' — value must be a string literal so a
552
+ // type annotation like `teal: string = …` cannot false-match.
553
+ const decorAsStatus = new RegExp(
554
+ `(['"\`]?)(${DECORATIVE_COLOR_KEYS})\\1\\s*:\\s*['"\`][^'"\`]*?var\\(--(${STATUS_NAMES})-`,
555
+ 'g',
556
+ );
557
+ let m: RegExpExecArray | null;
558
+ while ((m = decorAsStatus.exec(source)) !== null) {
559
+ const line = source.slice(0, m.index).split('\n').length;
560
+ const colorKey = m[2];
561
+ const status = m[3];
562
+ findings.push({
563
+ ...withBase(rule, filePath),
564
+ line,
565
+ message: `Decorative key "${colorKey}" is mapped to the status token var(--${status}-…). Status tokens (success/warning/error/info) carry meaning — using them as a categorical/decorative palette mislabels neutral data (a count shown in --warning reads as an alert). Use var(--color-accent-<shade>) or a neutral surface for decorative categories, and reserve --<status>-* for real status (e.g. an active/inactive badge).`,
566
+ snippet: m[0].slice(0, 80),
567
+ });
568
+ }
569
+ return findings;
570
+ };
571
+
572
+ /**
573
+ * R18 — hardcoded Tailwind color utilities OUTSIDE className attributes.
574
+ * Catches colors in JS data structures (objects, arrays, config maps) that
575
+ * escape the className-scoped R14/R15 scanners. Uses classNameSpans() to
576
+ * build exclusion zones — never fires on strings already inside className.
577
+ */
578
+ const checkR18: RuleChecker = (source, filePath, rule) => {
579
+ const findings: Finding[] = [];
580
+ const cnSpans = classNameSpans(source);
581
+ const isInClassName = (offset: number): boolean =>
582
+ cnSpans.some((s) => offset >= s.start && offset < s.end);
583
+
584
+ const stringLiteral = /(['"`])([^'"`]*?)\1/g;
585
+ const colorUtil = new RegExp(
586
+ `\\b(?:${COLOR_PREFIXES})-(?:(?:${SATURATED_FAMILIES}|${NEUTRAL_FAMILIES})-\\d{2,3}|white|black)(?:\\/\\d{1,3})?\\b`,
587
+ 'g',
588
+ );
589
+
590
+ let strMatch: RegExpExecArray | null;
591
+ while ((strMatch = stringLiteral.exec(source)) !== null) {
592
+ const strContent = strMatch[2];
593
+ const strContentStart = strMatch.index + 1;
594
+ if (isInClassName(strContentStart)) continue;
595
+
596
+ colorUtil.lastIndex = 0;
597
+ let colorMatch: RegExpExecArray | null;
598
+ while ((colorMatch = colorUtil.exec(strContent)) !== null) {
599
+ const absOffset = strContentStart + colorMatch.index;
600
+ if (isInClassName(absOffset)) continue;
601
+ const line = source.slice(0, absOffset).split('\n').length;
602
+ findings.push({
603
+ ...withBase(rule, filePath),
604
+ line,
605
+ message: `String literal outside className contains hardcoded color "${colorMatch[0]}". This Tailwind utility will render with a hardcoded color bypassing the design token system.`,
606
+ snippet: strMatch[0].slice(0, 120),
607
+ });
608
+ }
609
+ }
610
+ return findings;
611
+ };
612
+
613
+ /**
614
+ * R19 — hex/rgb/rgba colors in inline style={{ }} props.
615
+ * These bypass the design token system and do not respond to theme/dark mode.
616
+ * Only flags style blocks that contain a color-related CSS property.
617
+ */
618
+ const checkR19: RuleChecker = (source, filePath, rule) => {
619
+ const findings: Finding[] = [];
620
+ const styleBlock = /style=\{\{([^}]*(?:\{[^}]*\}[^}]*)*)\}\}/g;
621
+ const hexOrRgb = /#[0-9a-fA-F]{3,8}\b|rgba?\s*\(/g;
622
+ const colorProps = /(?:background(?:Color)?|color|border(?:Color|LeftColor|RightColor|TopColor|BottomColor)?|fill|stroke|outline(?:Color)?|boxShadow|textShadow|textDecoration(?:Color)?)\s*:/i;
623
+
624
+ let styleMatch: RegExpExecArray | null;
625
+ while ((styleMatch = styleBlock.exec(source)) !== null) {
626
+ const content = styleMatch[1];
627
+ if (!colorProps.test(content)) continue;
628
+ hexOrRgb.lastIndex = 0;
629
+ const colorMatch = hexOrRgb.exec(content);
630
+ if (!colorMatch) continue;
631
+ const line = source.slice(0, styleMatch.index).split('\n').length;
632
+ findings.push({
633
+ ...withBase(rule, filePath),
634
+ line,
635
+ message: `Inline style contains hardcoded color "${colorMatch[0].slice(0, 20)}". Inline hex/rgb values bypass the design token system and do not respond to theme or dark mode changes.`,
636
+ snippet: styleMatch[0].slice(0, 140),
637
+ });
638
+ }
639
+ return findings;
640
+ };
641
+
642
+ /**
643
+ * R20 — accent token overuse on non-CTA elements. Three sub-heuristics:
644
+ * A) thick accent border (border-2+) on non-button
645
+ * B) pale accent (50/100) as section/header background
646
+ * C) full accent fill (shade ≥ 500) on non-button
647
+ */
648
+ const checkR20: RuleChecker = (source, filePath, rule) => {
649
+ const findings: Finding[] = [];
650
+ const lines = source.split('\n');
651
+
652
+ for (let i = 0; i < lines.length; i++) {
653
+ const ln = lines[i];
654
+ const lineNum = i + 1;
655
+ const ctx = lines.slice(Math.max(0, i - 3), i + 1).join('\n');
656
+
657
+ // A) thick accent border on non-button
658
+ if (/\bborder-[2-8]\b/.test(ln) && /\bborder-\[var\(--color-accent-/.test(ln)) {
659
+ if (!/<button\b/i.test(ctx) && !/\bbtn\b/.test(ctx)) {
660
+ findings.push({
661
+ ...withBase(rule, filePath),
662
+ line: lineNum,
663
+ message: `Thick accent border (border-2+) on a non-button element creates visual noise. Use border (1px) with a subtle accent, or use a neutral border (var(--border-color)) for containers.`,
664
+ snippet: ln.trim().slice(0, 120),
665
+ });
666
+ }
667
+ }
668
+
669
+ // B) pale accent as section/header background
670
+ if (/\bbg-\[var\(--color-accent-(?:50|100)\)\]/.test(ln)) {
671
+ if (/<(?:section|header|div)\b/i.test(ctx) || /\b(?:header|section|banner|hero)\b/i.test(ctx)) {
672
+ findings.push({
673
+ ...withBase(rule, filePath),
674
+ line: lineNum,
675
+ message: `Pale accent (accent-50/100) used as section/header background. Use var(--bg-secondary) or var(--bg-muted) for container backgrounds — reserve accent tints for interactive focus/hover states.`,
676
+ snippet: ln.trim().slice(0, 120),
677
+ });
678
+ }
679
+ }
680
+
681
+ // C) full accent fill (shade >= 500) on non-button
682
+ if (/\bbg-\[var\(--color-accent-[5-9]\d{2}\)\]/.test(ln)) {
683
+ if (!/<button\b/i.test(ctx) && !/\bbtn\b/.test(ctx)) {
684
+ findings.push({
685
+ ...withBase(rule, filePath),
686
+ line: lineNum,
687
+ message: `Full accent fill (shade ≥ 500) on a non-button element. Reserve full accent backgrounds for primary CTAs. Use accent-50/100 for decorative tints or var(--bg-secondary) for containers.`,
688
+ snippet: ln.trim().slice(0, 120),
689
+ });
690
+ }
691
+ }
692
+ }
693
+
694
+ return findings;
695
+ };
696
+
697
+ const CHECKERS: Record<string, RuleChecker> = {
698
+ 'R1-pagetemplate': checkR1,
699
+ 'R2-no-hex-colors': checkR2,
700
+ 'R3-primary-cta': checkR3,
701
+ 'R4-i18n-namespace': checkR4,
702
+ 'R5-lucide-icons': checkR5,
703
+ 'R6-loader2-spinner': checkR6,
704
+ 'R7-error-banner-anatomy': checkR7,
705
+ 'R8-datatable-for-lists': checkR8,
706
+ 'R9-useparams-nullcheck': checkR9,
707
+ 'R10-permission-key-format': checkR10,
708
+ 'R11-slot-anatomy': checkR11,
709
+ 'R12-darktheme-base': checkR12,
710
+ 'R13-badge-anatomy': checkR13,
711
+ 'R14-no-hardcoded-colors': checkR14,
712
+ 'R15-no-neutral-hardcoded-colors': checkR15,
713
+ 'R16-token-role-misuse': checkR16,
714
+ 'R17-status-token-as-decoration': checkR17,
715
+ 'R18-colors-outside-classname': checkR18,
716
+ 'R19-hex-in-inline-style': checkR19,
717
+ 'R20-accent-overuse': checkR20,
718
+ };
719
+
720
+ // ─── Entry point ──────────────────────────────────────────────────────────
721
+
722
+ export async function audit(args: UiPolishArgs, tokens: TokensFile): Promise<AuditReport> {
723
+ const projectPath = path.resolve(args.projectPath);
724
+ // When explicit page paths are supplied (--page), scan only those (resolved
725
+ // to absolute, relative to the project root). Otherwise discover all pages.
726
+ const files = args.paths.length > 0
727
+ ? args.paths.map((p) => (path.isAbsolute(p) ? p : path.join(projectPath, p)))
728
+ : await discoverPages(projectPath);
729
+
730
+ // Resolve --url arguments to file paths via PageRegistry
731
+ if (args.urls && args.urls.length > 0) {
732
+ for (const url of args.urls) {
733
+ const resolved = await resolveUrlToFiles(url, projectPath);
734
+ for (const f of resolved) {
735
+ if (!files.includes(f)) files.push(f);
736
+ }
737
+ }
738
+ }
739
+
740
+ // Shared component expansion: when scanning specific pages (--page / --url),
741
+ // also scan their 1st-level local imports so violations in shared components
742
+ // are visible. Only follows @/components/** and @/features/** — no recursion.
743
+ if (args.paths.length > 0 || (args.urls && args.urls.length > 0)) {
744
+ const componentFiles = new Set<string>();
745
+ for (const file of [...files]) {
746
+ const abs = path.resolve(file);
747
+ if (!(await fileExists(abs))) continue;
748
+ const src = await readText(abs);
749
+ const imports = await resolveLocalImports(src, projectPath);
750
+ for (const imp of imports) {
751
+ if (!files.includes(imp)) componentFiles.add(imp);
752
+ }
753
+ }
754
+ files.push(...componentFiles);
755
+ }
756
+
757
+ // Filter rules to the subset requested
758
+ const wantRules = args.rules.length === 0
759
+ ? tokens.hardRules
760
+ : tokens.hardRules.filter((r) => {
761
+ return args.rules.some((req) => r.id === req || r.id.startsWith(req + '-') || r.id.split('-')[0] === req);
762
+ });
763
+
764
+ const findings: Finding[] = [];
765
+ for (const file of files) {
766
+ const abs = path.resolve(file);
767
+ if (!(await fileExists(abs))) continue;
768
+ const source = await readText(abs);
769
+ const rel = path.relative(projectPath, abs).replace(/\\/g, '/');
770
+ for (const rule of wantRules) {
771
+ const checker = CHECKERS[rule.id];
772
+ if (!checker) continue;
773
+ const hits = checker(source, rel, rule);
774
+ findings.push(...hits);
775
+ }
776
+ }
777
+
778
+ // Dedup: the general color nets (R14/R15) defer to the context-specific color
779
+ // rules (R3 button, R7 banner, R13 badge). When a precise rule already flagged
780
+ // the SAME color util at the same (file, line), drop the R14/R15 duplicate so
781
+ // the user sees one actionable finding. Keyed on the exact color token — never
782
+ // on the line alone — so a second, distinct hardcoded color on the same line is
783
+ // still reported.
784
+ const SPECIFIC_COLOR_RULES = new Set([
785
+ 'R3-primary-cta',
786
+ 'R7-error-banner-anatomy',
787
+ 'R13-badge-anatomy',
788
+ ]);
789
+ const colorUtilRe = new RegExp(
790
+ `\\b(?:${COLOR_PREFIXES})-(?:(?:${SATURATED_FAMILIES}|${NEUTRAL_FAMILIES})-\\d{2,3}|white|black)(?:\\/\\d{1,3})?\\b`,
791
+ );
792
+ const claimed = new Set<string>();
793
+ for (const f of findings) {
794
+ if (!SPECIFIC_COLOR_RULES.has(f.ruleId)) continue;
795
+ const util = f.snippet?.match(colorUtilRe)?.[0];
796
+ if (util) claimed.add(`${f.file}:${f.line}:${util}`);
797
+ }
798
+ const visible = findings.filter((f) => {
799
+ const isGeneralNet =
800
+ f.ruleId === 'R14-no-hardcoded-colors' || f.ruleId === 'R15-no-neutral-hardcoded-colors';
801
+ return !(isGeneralNet && claimed.has(`${f.file}:${f.line}:${f.snippet}`));
802
+ });
803
+
804
+ // Aggregate counts
805
+ const counts: AuditReport['counts'] = { errors: 0, warnings: 0, infos: 0 };
806
+ const byRule: Record<string, number> = {};
807
+ for (const f of visible) {
808
+ if (f.severity === 'error') counts.errors++;
809
+ else if (f.severity === 'warning') counts.warnings++;
810
+ else counts.infos++;
811
+ byRule[f.ruleId] = (byRule[f.ruleId] ?? 0) + 1;
812
+ }
813
+
814
+ return {
815
+ projectPath,
816
+ filesInspected: files.length,
817
+ findings: visible,
818
+ counts,
819
+ byRule,
820
+ };
821
+ }
822
+
823
+ // ─── Helpers exported for apply.ts ────────────────────────────────────────
824
+
825
+ export { CHECKERS, discoverPages };