@tailor-platform/erp-kit 0.2.1 → 0.3.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 (633) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +154 -80
  3. package/dist/cli.mjs +1742 -0
  4. package/package.json +16 -14
  5. package/schemas/app-compose/story.yml +12 -0
  6. package/schemas/module/command.yml +9 -0
  7. package/schemas/module/module.yml +4 -0
  8. package/schemas/module/query.yml +9 -0
  9. package/skills/erp-kit-app-1-requirements/SKILL.md +22 -11
  10. package/skills/erp-kit-app-2-requirements-review/SKILL.md +103 -0
  11. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +71 -0
  12. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +74 -0
  13. package/skills/erp-kit-app-2-requirements-review/references/requirements-report-format.md +25 -0
  14. package/skills/erp-kit-app-3-plan/SKILL.md +154 -0
  15. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +89 -0
  16. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +74 -0
  17. package/skills/erp-kit-app-3-plan/references/story-extraction.md +86 -0
  18. package/skills/erp-kit-app-4-plan-review/SKILL.md +168 -0
  19. package/skills/erp-kit-app-4-plan-review/references/actor-flow-parity.md +73 -0
  20. package/skills/erp-kit-app-4-plan-review/references/business-flow-story-parity.md +86 -0
  21. package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +69 -0
  22. package/skills/erp-kit-app-4-plan-review/references/parity-report-format.md +52 -0
  23. package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +83 -0
  24. package/skills/erp-kit-app-4-plan-review/references/story-screen-parity.md +73 -0
  25. package/skills/erp-kit-app-5-impl-backend/SKILL.md +98 -0
  26. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +38 -0
  27. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +48 -0
  28. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +68 -0
  29. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +74 -0
  30. package/skills/{erp-kit-app-5-implementation/references/frontend.md → erp-kit-app-6-impl-frontend/references/pages.md} +8 -90
  31. package/skills/erp-kit-app-7-impl-review/SKILL.md +176 -0
  32. package/skills/erp-kit-app-7-impl-review/references/impl-parity-report-format.md +52 -0
  33. package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +84 -0
  34. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +86 -0
  35. package/skills/erp-kit-app-7-impl-review/references/screen-doc-code-parity.md +86 -0
  36. package/skills/erp-kit-app-shared/SKILL.md +15 -0
  37. package/skills/erp-kit-app-shared/references/link-format-reference.md +13 -0
  38. package/skills/erp-kit-app-shared/references/naming-conventions.md +21 -0
  39. package/skills/erp-kit-app-shared/references/resolver-classification.md +23 -0
  40. package/skills/erp-kit-app-shared/references/schema-constraints.md +25 -0
  41. package/skills/erp-kit-module-1-requirements/SKILL.md +126 -0
  42. package/skills/erp-kit-module-1-requirements/references/boundary-analysis.md +51 -0
  43. package/skills/erp-kit-module-1-requirements/references/erp-research.md +57 -0
  44. package/skills/erp-kit-module-1-requirements/references/feature-doc.md +61 -0
  45. package/skills/erp-kit-module-2-requirements-review/SKILL.md +112 -0
  46. package/skills/erp-kit-module-2-requirements-review/references/best-practices-check.md +79 -0
  47. package/skills/erp-kit-module-2-requirements-review/references/boundary-consistency-check.md +70 -0
  48. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +25 -0
  49. package/skills/erp-kit-module-3-plan/SKILL.md +107 -0
  50. package/skills/erp-kit-module-3-plan/references/command-extraction.md +87 -0
  51. package/skills/erp-kit-module-3-plan/references/model-extraction.md +72 -0
  52. package/skills/{erp-kit-module-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +15 -1
  53. package/skills/erp-kit-module-3-plan/references/query-extraction.md +59 -0
  54. package/skills/erp-kit-module-4-plan-review/SKILL.md +158 -0
  55. package/skills/erp-kit-module-4-plan-review/references/command-model-consistency.md +46 -0
  56. package/skills/erp-kit-module-4-plan-review/references/feature-command-parity.md +97 -0
  57. package/skills/erp-kit-module-4-plan-review/references/feature-model-parity.md +47 -0
  58. package/skills/erp-kit-module-4-plan-review/references/feature-query-parity.md +70 -0
  59. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +52 -0
  60. package/skills/erp-kit-module-5-impl/SKILL.md +120 -0
  61. package/skills/erp-kit-module-5-impl/references/command-impl.md +68 -0
  62. package/skills/erp-kit-module-5-impl/references/exports.md +10 -0
  63. package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +2 -2
  64. package/skills/erp-kit-module-5-impl/references/model-impl.md +45 -0
  65. package/skills/erp-kit-module-5-impl/references/query-impl.md +53 -0
  66. package/skills/erp-kit-module-6-impl-review/SKILL.md +187 -0
  67. package/skills/erp-kit-module-6-impl-review/references/command-doc-code-parity.md +92 -0
  68. package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +93 -0
  69. package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +95 -0
  70. package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/errors.md +2 -2
  71. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +52 -0
  72. package/skills/erp-kit-module-6-impl-review/references/model-doc-code-parity.md +80 -0
  73. package/skills/erp-kit-module-shared/SKILL.md +1 -1
  74. package/skills/erp-kit-module-shared/references/commands.md +1 -1
  75. package/skills/erp-kit-module-shared/references/errors.md +13 -10
  76. package/skills/erp-kit-module-shared/references/queries.md +110 -37
  77. package/skills/erp-kit-module-shared/references/structure.md +1 -1
  78. package/skills/erp-kit-module-shared/references/testing.md +10 -0
  79. package/skills/erp-kit-update/SKILL.md +4 -4
  80. package/src/app.ts +1 -1
  81. package/src/commands/app/index.ts +57 -24
  82. package/src/commands/check.ts +1 -1
  83. package/src/commands/generate-doc.test.ts +63 -0
  84. package/src/commands/generate-doc.ts +98 -0
  85. package/src/commands/index.ts +16 -5
  86. package/src/commands/init-module.test.ts +43 -0
  87. package/src/commands/init-module.ts +74 -0
  88. package/src/commands/init.test.ts +22 -69
  89. package/src/commands/init.ts +28 -115
  90. package/src/commands/lib/distribute.test.ts +126 -0
  91. package/src/commands/lib/distribute.ts +129 -0
  92. package/src/commands/module/generate.ts +33 -13
  93. package/src/commands/module/index.ts +18 -28
  94. package/src/commands/parse-doc-test-cases.ts +55 -0
  95. package/src/commands/sync-check.test.ts +173 -0
  96. package/src/commands/sync-check.ts +103 -2
  97. package/src/commands/update.test.ts +87 -0
  98. package/src/commands/update.ts +41 -0
  99. package/src/generator/generate-code-boilerplate.test.ts +142 -0
  100. package/src/generator/generate-code.test.ts +47 -12
  101. package/src/generator/generate-code.ts +123 -20
  102. package/src/integration.test.ts +3 -3
  103. package/src/module.ts +14 -97
  104. package/src/modules/item-management/README.md +8 -0
  105. package/src/modules/item-management/command/activateItem.generated.ts +1 -1
  106. package/src/modules/item-management/command/activateItem.test.ts +12 -18
  107. package/src/modules/item-management/command/activateItem.ts +9 -5
  108. package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
  109. package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +10 -24
  110. package/src/modules/item-management/command/assignItemToTaxonomy.ts +19 -16
  111. package/src/modules/item-management/command/createItem.generated.ts +1 -1
  112. package/src/modules/item-management/command/createItem.test.ts +11 -11
  113. package/src/modules/item-management/command/createItem.ts +16 -7
  114. package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
  115. package/src/modules/item-management/command/createTaxonomyNode.test.ts +9 -9
  116. package/src/modules/item-management/command/createTaxonomyNode.ts +33 -14
  117. package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
  118. package/src/modules/item-management/command/deactivateItem.test.ts +12 -18
  119. package/src/modules/item-management/command/deactivateItem.ts +9 -5
  120. package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
  121. package/src/modules/item-management/command/deleteItem.test.ts +10 -16
  122. package/src/modules/item-management/command/deleteItem.ts +9 -5
  123. package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
  124. package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +10 -16
  125. package/src/modules/item-management/command/deleteTaxonomyNode.ts +22 -12
  126. package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
  127. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +10 -10
  128. package/src/modules/item-management/command/moveTaxonomyNode.ts +63 -19
  129. package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
  130. package/src/modules/item-management/command/reactivateItem.test.ts +12 -18
  131. package/src/modules/item-management/command/reactivateItem.ts +9 -5
  132. package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
  133. package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +9 -16
  134. package/src/modules/item-management/command/removeItemFromTaxonomy.ts +11 -6
  135. package/src/modules/item-management/command/updateItem.generated.ts +1 -1
  136. package/src/modules/item-management/command/updateItem.test.ts +16 -16
  137. package/src/modules/item-management/command/updateItem.ts +11 -6
  138. package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
  139. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +14 -20
  140. package/src/modules/item-management/command/updateTaxonomyNode.ts +9 -6
  141. package/src/modules/item-management/docs/commands/ActivateItem.md +8 -0
  142. package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +7 -0
  143. package/src/modules/item-management/docs/commands/CreateItem.md +10 -0
  144. package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +9 -0
  145. package/src/modules/item-management/docs/commands/DeactivateItem.md +8 -0
  146. package/src/modules/item-management/docs/commands/DeleteItem.md +7 -0
  147. package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +7 -0
  148. package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +10 -0
  149. package/src/modules/item-management/docs/commands/ReactivateItem.md +8 -0
  150. package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +5 -0
  151. package/src/modules/item-management/docs/commands/UpdateItem.md +15 -0
  152. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +9 -0
  153. package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +8 -0
  154. package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +7 -0
  155. package/src/modules/item-management/docs/queries/DetectCircularReference.md +9 -0
  156. package/src/modules/item-management/docs/queries/GetItem.md +9 -0
  157. package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +5 -0
  158. package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +7 -0
  159. package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +5 -0
  160. package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +6 -0
  161. package/src/modules/item-management/index.ts +0 -51
  162. package/src/modules/item-management/lib/errors.generated.ts +24 -24
  163. package/src/modules/item-management/lib/permissions.generated.ts +1 -1
  164. package/src/modules/item-management/lib/types.ts +1 -1
  165. package/src/modules/item-management/module.ts +1 -1
  166. package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
  167. package/src/modules/item-management/query/calculateNodeDepth.test.ts +21 -6
  168. package/src/modules/item-management/query/calculateNodeDepth.ts +2 -2
  169. package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
  170. package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +17 -5
  171. package/src/modules/item-management/query/calculateSubtreeDepth.ts +2 -2
  172. package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
  173. package/src/modules/item-management/query/detectCircularReference.test.ts +25 -7
  174. package/src/modules/item-management/query/detectCircularReference.ts +4 -4
  175. package/src/modules/item-management/query/getItem.generated.ts +1 -1
  176. package/src/modules/item-management/query/getItem.test.ts +25 -7
  177. package/src/modules/item-management/query/getItem.ts +2 -2
  178. package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
  179. package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +9 -3
  180. package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +2 -2
  181. package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
  182. package/src/modules/item-management/query/getTaxonomyNode.test.ts +17 -5
  183. package/src/modules/item-management/query/getTaxonomyNode.ts +2 -2
  184. package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
  185. package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +9 -3
  186. package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +2 -2
  187. package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
  188. package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +13 -4
  189. package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +2 -2
  190. package/src/modules/item-management/tailor.config.ts +6 -4
  191. package/src/modules/item-management/tailor.d.ts +13 -0
  192. package/src/modules/primitives/README.md +8 -0
  193. package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
  194. package/src/modules/primitives/command/activateCategory.test.ts +8 -18
  195. package/src/modules/primitives/command/activateCategory.ts +9 -5
  196. package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
  197. package/src/modules/primitives/command/activateCurrency.test.ts +8 -18
  198. package/src/modules/primitives/command/activateCurrency.ts +9 -5
  199. package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
  200. package/src/modules/primitives/command/activateUnit.test.ts +8 -15
  201. package/src/modules/primitives/command/activateUnit.ts +9 -5
  202. package/src/modules/primitives/command/createCategory.generated.ts +1 -1
  203. package/src/modules/primitives/command/createCategory.test.ts +29 -44
  204. package/src/modules/primitives/command/createCategory.ts +9 -5
  205. package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
  206. package/src/modules/primitives/command/createCurrency.test.ts +53 -78
  207. package/src/modules/primitives/command/createCurrency.ts +9 -6
  208. package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
  209. package/src/modules/primitives/command/createExchangeRate.test.ts +59 -97
  210. package/src/modules/primitives/command/createExchangeRate.ts +13 -7
  211. package/src/modules/primitives/command/createUnit.generated.ts +1 -1
  212. package/src/modules/primitives/command/createUnit.test.ts +59 -90
  213. package/src/modules/primitives/command/createUnit.ts +9 -6
  214. package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
  215. package/src/modules/primitives/command/deactivateCategory.test.ts +15 -33
  216. package/src/modules/primitives/command/deactivateCategory.ts +9 -5
  217. package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
  218. package/src/modules/primitives/command/deactivateCurrency.test.ts +12 -26
  219. package/src/modules/primitives/command/deactivateCurrency.ts +9 -5
  220. package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
  221. package/src/modules/primitives/command/deactivateUnit.test.ts +15 -30
  222. package/src/modules/primitives/command/deactivateUnit.ts +14 -7
  223. package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
  224. package/src/modules/primitives/command/setBaseCurrency.test.ts +18 -40
  225. package/src/modules/primitives/command/setBaseCurrency.ts +15 -7
  226. package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
  227. package/src/modules/primitives/command/setReferenceUnit.test.ts +22 -44
  228. package/src/modules/primitives/command/setReferenceUnit.ts +21 -9
  229. package/src/modules/primitives/docs/commands/ActivateCategory.md +6 -0
  230. package/src/modules/primitives/docs/commands/ActivateCurrency.md +6 -0
  231. package/src/modules/primitives/docs/commands/ActivateUnit.md +6 -0
  232. package/src/modules/primitives/docs/commands/CreateCategory.md +6 -0
  233. package/src/modules/primitives/docs/commands/CreateCurrency.md +10 -0
  234. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +11 -0
  235. package/src/modules/primitives/docs/commands/CreateUnit.md +10 -0
  236. package/src/modules/primitives/docs/commands/DeactivateCategory.md +7 -0
  237. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +7 -0
  238. package/src/modules/primitives/docs/commands/DeactivateUnit.md +7 -0
  239. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +7 -0
  240. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +7 -0
  241. package/src/modules/primitives/docs/queries/ConvertAmount.md +14 -0
  242. package/src/modules/primitives/docs/queries/ConvertQuantity.md +13 -0
  243. package/src/modules/primitives/docs/queries/GetBaseCurrency.md +5 -0
  244. package/src/modules/primitives/docs/queries/GetCurrency.md +7 -0
  245. package/src/modules/primitives/docs/queries/GetUnit.md +7 -0
  246. package/src/modules/primitives/docs/queries/GetUoMCategory.md +7 -0
  247. package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +15 -5
  248. package/src/modules/primitives/index.ts +0 -49
  249. package/src/modules/primitives/lib/errors.generated.ts +23 -23
  250. package/src/modules/primitives/lib/permissions.generated.ts +1 -1
  251. package/src/modules/primitives/lib/types.ts +1 -1
  252. package/src/modules/primitives/module.ts +1 -1
  253. package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
  254. package/src/modules/primitives/query/convertAmount.test.ts +110 -77
  255. package/src/modules/primitives/query/convertAmount.ts +61 -47
  256. package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
  257. package/src/modules/primitives/query/convertQuantity.test.ts +99 -69
  258. package/src/modules/primitives/query/convertQuantity.ts +12 -10
  259. package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
  260. package/src/modules/primitives/query/getBaseCurrency.test.ts +10 -4
  261. package/src/modules/primitives/query/getBaseCurrency.ts +2 -2
  262. package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
  263. package/src/modules/primitives/query/getCurrency.test.ts +17 -5
  264. package/src/modules/primitives/query/getCurrency.ts +2 -2
  265. package/src/modules/primitives/query/getUnit.generated.ts +1 -1
  266. package/src/modules/primitives/query/getUnit.test.ts +17 -5
  267. package/src/modules/primitives/query/getUnit.ts +2 -2
  268. package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
  269. package/src/modules/primitives/query/getUoMCategory.test.ts +17 -5
  270. package/src/modules/primitives/query/getUoMCategory.ts +2 -2
  271. package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
  272. package/src/modules/primitives/query/listUnitsByCategory.test.ts +80 -0
  273. package/src/modules/primitives/query/listUnitsByCategory.ts +19 -3
  274. package/src/modules/primitives/tailor.config.ts +6 -4
  275. package/src/modules/primitives/tailor.d.ts +13 -0
  276. package/src/modules/product-management/README.md +52 -0
  277. package/src/modules/product-management/command/activateProduct.generated.ts +6 -0
  278. package/src/modules/product-management/command/activateProduct.test.ts +40 -0
  279. package/src/modules/product-management/command/activateProduct.ts +42 -0
  280. package/src/modules/product-management/command/assignProductToCategory.generated.ts +6 -0
  281. package/src/modules/product-management/command/assignProductToCategory.test.ts +90 -0
  282. package/src/modules/product-management/command/assignProductToCategory.ts +62 -0
  283. package/src/modules/product-management/command/createProduct.generated.ts +6 -0
  284. package/src/modules/product-management/command/createProduct.test.ts +149 -0
  285. package/src/modules/product-management/command/createProduct.ts +73 -0
  286. package/src/modules/product-management/command/createProductAttribute.generated.ts +6 -0
  287. package/src/modules/product-management/command/createProductAttribute.test.ts +70 -0
  288. package/src/modules/product-management/command/createProductAttribute.ts +53 -0
  289. package/src/modules/product-management/command/createProductAttributeValue.generated.ts +6 -0
  290. package/src/modules/product-management/command/createProductAttributeValue.test.ts +68 -0
  291. package/src/modules/product-management/command/createProductAttributeValue.ts +63 -0
  292. package/src/modules/product-management/command/createProductCategory.generated.ts +6 -0
  293. package/src/modules/product-management/command/createProductCategory.test.ts +135 -0
  294. package/src/modules/product-management/command/createProductCategory.ts +82 -0
  295. package/src/modules/product-management/command/deactivateProduct.generated.ts +6 -0
  296. package/src/modules/product-management/command/deactivateProduct.test.ts +40 -0
  297. package/src/modules/product-management/command/deactivateProduct.ts +42 -0
  298. package/src/modules/product-management/command/deleteProduct.generated.ts +6 -0
  299. package/src/modules/product-management/command/deleteProduct.test.ts +42 -0
  300. package/src/modules/product-management/command/deleteProduct.ts +42 -0
  301. package/src/modules/product-management/command/deleteProductAttribute.generated.ts +6 -0
  302. package/src/modules/product-management/command/deleteProductAttribute.test.ts +49 -0
  303. package/src/modules/product-management/command/deleteProductAttribute.ts +45 -0
  304. package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +6 -0
  305. package/src/modules/product-management/command/deleteProductAttributeValue.test.ts +71 -0
  306. package/src/modules/product-management/command/deleteProductAttributeValue.ts +68 -0
  307. package/src/modules/product-management/command/deleteProductCategory.generated.ts +6 -0
  308. package/src/modules/product-management/command/deleteProductCategory.test.ts +74 -0
  309. package/src/modules/product-management/command/deleteProductCategory.ts +53 -0
  310. package/src/modules/product-management/command/generateVariants.generated.ts +6 -0
  311. package/src/modules/product-management/command/generateVariants.test.ts +365 -0
  312. package/src/modules/product-management/command/generateVariants.ts +168 -0
  313. package/src/modules/product-management/command/moveProductCategory.generated.ts +6 -0
  314. package/src/modules/product-management/command/moveProductCategory.test.ts +170 -0
  315. package/src/modules/product-management/command/moveProductCategory.ts +124 -0
  316. package/src/modules/product-management/command/reactivateProduct.generated.ts +6 -0
  317. package/src/modules/product-management/command/reactivateProduct.test.ts +40 -0
  318. package/src/modules/product-management/command/reactivateProduct.ts +42 -0
  319. package/src/modules/product-management/command/removeProductFromCategory.generated.ts +6 -0
  320. package/src/modules/product-management/command/removeProductFromCategory.test.ts +42 -0
  321. package/src/modules/product-management/command/removeProductFromCategory.ts +32 -0
  322. package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +6 -0
  323. package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +206 -0
  324. package/src/modules/product-management/command/setProductAttributeAssignment.ts +102 -0
  325. package/src/modules/product-management/command/updateProduct.generated.ts +6 -0
  326. package/src/modules/product-management/command/updateProduct.test.ts +168 -0
  327. package/src/modules/product-management/command/updateProduct.ts +95 -0
  328. package/src/modules/product-management/command/updateProductAttribute.generated.ts +6 -0
  329. package/src/modules/product-management/command/updateProductAttribute.test.ts +101 -0
  330. package/src/modules/product-management/command/updateProductAttribute.ts +68 -0
  331. package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +6 -0
  332. package/src/modules/product-management/command/updateProductAttributeValue.test.ts +80 -0
  333. package/src/modules/product-management/command/updateProductAttributeValue.ts +58 -0
  334. package/src/modules/product-management/command/updateProductCategory.generated.ts +6 -0
  335. package/src/modules/product-management/command/updateProductCategory.test.ts +80 -0
  336. package/src/modules/product-management/command/updateProductCategory.ts +66 -0
  337. package/src/modules/product-management/db/product.ts +47 -0
  338. package/src/modules/product-management/db/productAttribute.ts +26 -0
  339. package/src/modules/product-management/db/productAttributeAssignment.ts +58 -0
  340. package/src/modules/product-management/db/productAttributeValue.ts +39 -0
  341. package/src/modules/product-management/db/productCategory.ts +34 -0
  342. package/src/modules/product-management/db/productCategoryAssignment.ts +49 -0
  343. package/src/modules/product-management/db/productVariant.ts +52 -0
  344. package/src/modules/product-management/docs/commands/ActivateProduct.md +39 -0
  345. package/src/modules/product-management/docs/commands/AssignProductToCategory.md +43 -0
  346. package/src/modules/product-management/docs/commands/CreateProduct.md +48 -0
  347. package/src/modules/product-management/docs/commands/CreateProductAttribute.md +39 -0
  348. package/src/modules/product-management/docs/commands/CreateProductAttributeValue.md +42 -0
  349. package/src/modules/product-management/docs/commands/CreateProductCategory.md +54 -0
  350. package/src/modules/product-management/docs/commands/DeactivateProduct.md +39 -0
  351. package/src/modules/product-management/docs/commands/DeleteProduct.md +42 -0
  352. package/src/modules/product-management/docs/commands/DeleteProductAttribute.md +39 -0
  353. package/src/modules/product-management/docs/commands/DeleteProductAttributeValue.md +42 -0
  354. package/src/modules/product-management/docs/commands/DeleteProductCategory.md +43 -0
  355. package/src/modules/product-management/docs/commands/GenerateVariants.md +68 -0
  356. package/src/modules/product-management/docs/commands/MoveProductCategory.md +54 -0
  357. package/src/modules/product-management/docs/commands/ReactivateProduct.md +38 -0
  358. package/src/modules/product-management/docs/commands/RemoveProductFromCategory.md +34 -0
  359. package/src/modules/product-management/docs/commands/SetProductAttributeAssignment.md +62 -0
  360. package/src/modules/product-management/docs/commands/UpdateProduct.md +61 -0
  361. package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +46 -0
  362. package/src/modules/product-management/docs/commands/UpdateProductAttributeValue.md +47 -0
  363. package/src/modules/product-management/docs/commands/UpdateProductCategory.md +46 -0
  364. package/src/modules/product-management/docs/features/attribute-management.md +48 -0
  365. package/src/modules/product-management/docs/features/product-category.md +71 -0
  366. package/src/modules/product-management/docs/features/product-lifecycle.md +66 -0
  367. package/src/modules/product-management/docs/features/variant-generation.md +77 -0
  368. package/src/modules/product-management/docs/models/Product.md +58 -0
  369. package/src/modules/product-management/docs/models/ProductAttribute.md +37 -0
  370. package/src/modules/product-management/docs/models/ProductAttributeAssignment.md +41 -0
  371. package/src/modules/product-management/docs/models/ProductAttributeValue.md +40 -0
  372. package/src/modules/product-management/docs/models/ProductCategory.md +46 -0
  373. package/src/modules/product-management/docs/models/ProductCategoryAssignment.md +37 -0
  374. package/src/modules/product-management/docs/models/ProductVariant.md +41 -0
  375. package/src/modules/product-management/docs/queries/CalculateCategoryDepth.md +47 -0
  376. package/src/modules/product-management/docs/queries/DetectCategoryCircularReference.md +51 -0
  377. package/src/modules/product-management/docs/queries/GetProduct.md +42 -0
  378. package/src/modules/product-management/docs/queries/GetProductAttribute.md +42 -0
  379. package/src/modules/product-management/docs/queries/GetProductAttributeAssignment.md +34 -0
  380. package/src/modules/product-management/docs/queries/GetProductAttributeValue.md +40 -0
  381. package/src/modules/product-management/docs/queries/GetProductCategory.md +42 -0
  382. package/src/modules/product-management/docs/queries/GetProductCategoryAssignment.md +34 -0
  383. package/src/modules/product-management/docs/queries/GetProductVariant.md +41 -0
  384. package/src/modules/product-management/docs/queries/ListAttributeAssignmentsByAttribute.md +34 -0
  385. package/src/modules/product-management/docs/queries/ListCategoryAssignmentsByProduct.md +35 -0
  386. package/src/modules/product-management/docs/queries/ListProductAttributeAssignments.md +34 -0
  387. package/src/modules/product-management/docs/queries/ListProductAttributeValues.md +36 -0
  388. package/src/modules/product-management/docs/queries/ListProductCategoryAssignments.md +34 -0
  389. package/src/modules/product-management/docs/queries/ListProductCategoryChildren.md +34 -0
  390. package/src/modules/product-management/docs/queries/ListProductVariants.md +34 -0
  391. package/src/modules/product-management/generated/enums.ts +9 -0
  392. package/src/modules/product-management/generated/kysely-tailordb.ts +100 -0
  393. package/src/modules/product-management/index.ts +2 -0
  394. package/src/modules/product-management/lib/_db_deps.ts +17 -0
  395. package/src/modules/product-management/lib/errors.generated.ts +152 -0
  396. package/src/modules/product-management/lib/permissions.generated.ts +25 -0
  397. package/src/modules/product-management/lib/types.ts +51 -0
  398. package/src/modules/product-management/module.ts +201 -0
  399. package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +5 -0
  400. package/src/modules/product-management/query/calculateCategoryDepth.test.ts +72 -0
  401. package/src/modules/product-management/query/calculateCategoryDepth.ts +37 -0
  402. package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +5 -0
  403. package/src/modules/product-management/query/detectCategoryCircularReference.test.ts +72 -0
  404. package/src/modules/product-management/query/detectCategoryCircularReference.ts +44 -0
  405. package/src/modules/product-management/query/getProduct.generated.ts +5 -0
  406. package/src/modules/product-management/query/getProduct.test.ts +59 -0
  407. package/src/modules/product-management/query/getProduct.ts +18 -0
  408. package/src/modules/product-management/query/getProductAttribute.generated.ts +5 -0
  409. package/src/modules/product-management/query/getProductAttribute.test.ts +59 -0
  410. package/src/modules/product-management/query/getProductAttribute.ts +18 -0
  411. package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +5 -0
  412. package/src/modules/product-management/query/getProductAttributeAssignment.test.ts +37 -0
  413. package/src/modules/product-management/query/getProductAttributeAssignment.ts +18 -0
  414. package/src/modules/product-management/query/getProductAttributeValue.generated.ts +5 -0
  415. package/src/modules/product-management/query/getProductAttributeValue.test.ts +31 -0
  416. package/src/modules/product-management/query/getProductAttributeValue.ts +16 -0
  417. package/src/modules/product-management/query/getProductCategory.generated.ts +5 -0
  418. package/src/modules/product-management/query/getProductCategory.test.ts +59 -0
  419. package/src/modules/product-management/query/getProductCategory.ts +18 -0
  420. package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +5 -0
  421. package/src/modules/product-management/query/getProductCategoryAssignment.test.ts +37 -0
  422. package/src/modules/product-management/query/getProductCategoryAssignment.ts +18 -0
  423. package/src/modules/product-management/query/getProductVariant.generated.ts +5 -0
  424. package/src/modules/product-management/query/getProductVariant.test.ts +43 -0
  425. package/src/modules/product-management/query/getProductVariant.ts +20 -0
  426. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +5 -0
  427. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.test.ts +31 -0
  428. package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +16 -0
  429. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +5 -0
  430. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.test.ts +31 -0
  431. package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +16 -0
  432. package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +5 -0
  433. package/src/modules/product-management/query/listProductAttributeAssignments.test.ts +31 -0
  434. package/src/modules/product-management/query/listProductAttributeAssignments.ts +16 -0
  435. package/src/modules/product-management/query/listProductAttributeValues.generated.ts +5 -0
  436. package/src/modules/product-management/query/listProductAttributeValues.test.ts +31 -0
  437. package/src/modules/product-management/query/listProductAttributeValues.ts +17 -0
  438. package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +5 -0
  439. package/src/modules/product-management/query/listProductCategoryAssignments.test.ts +31 -0
  440. package/src/modules/product-management/query/listProductCategoryAssignments.ts +16 -0
  441. package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +5 -0
  442. package/src/modules/product-management/query/listProductCategoryChildren.test.ts +31 -0
  443. package/src/modules/product-management/query/listProductCategoryChildren.ts +16 -0
  444. package/src/modules/product-management/query/listProductVariants.generated.ts +5 -0
  445. package/src/modules/product-management/query/listProductVariants.test.ts +31 -0
  446. package/src/modules/product-management/query/listProductVariants.ts +16 -0
  447. package/src/modules/product-management/tailor.config.ts +13 -0
  448. package/src/modules/product-management/tailor.d.ts +13 -0
  449. package/src/modules/product-management/testing/fixtures.ts +151 -0
  450. package/src/modules/user-management/README.md +9 -3
  451. package/src/modules/user-management/command/activateUser.generated.ts +1 -1
  452. package/src/modules/user-management/command/activateUser.test.ts +12 -65
  453. package/src/modules/user-management/command/activateUser.ts +5 -20
  454. package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
  455. package/src/modules/user-management/command/assignPermissionToRole.test.ts +25 -60
  456. package/src/modules/user-management/command/assignPermissionToRole.ts +5 -24
  457. package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
  458. package/src/modules/user-management/command/assignRoleToUser.test.ts +35 -87
  459. package/src/modules/user-management/command/assignRoleToUser.ts +5 -24
  460. package/src/modules/user-management/command/createPermission.generated.ts +1 -1
  461. package/src/modules/user-management/command/createPermission.test.ts +23 -33
  462. package/src/modules/user-management/command/createPermission.ts +4 -5
  463. package/src/modules/user-management/command/createRole.generated.ts +1 -1
  464. package/src/modules/user-management/command/createRole.test.ts +17 -27
  465. package/src/modules/user-management/command/createRole.ts +4 -5
  466. package/src/modules/user-management/command/createUser.generated.ts +1 -1
  467. package/src/modules/user-management/command/createUser.test.ts +31 -118
  468. package/src/modules/user-management/command/createUser.ts +7 -25
  469. package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
  470. package/src/modules/user-management/command/deactivateUser.test.ts +12 -65
  471. package/src/modules/user-management/command/deactivateUser.ts +6 -21
  472. package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
  473. package/src/modules/user-management/command/reactivateUser.test.ts +13 -66
  474. package/src/modules/user-management/command/reactivateUser.ts +5 -20
  475. package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
  476. package/src/modules/user-management/command/revokePermissionFromRole.test.ts +24 -62
  477. package/src/modules/user-management/command/revokePermissionFromRole.ts +5 -24
  478. package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
  479. package/src/modules/user-management/command/revokeRoleFromUser.test.ts +24 -60
  480. package/src/modules/user-management/command/revokeRoleFromUser.ts +5 -24
  481. package/src/modules/user-management/docs/commands/ActivateUser.md +7 -0
  482. package/src/modules/user-management/docs/commands/AssignPermissionToRole.md +7 -0
  483. package/src/modules/user-management/docs/commands/AssignRoleToUser.md +9 -0
  484. package/src/modules/user-management/docs/commands/CreatePermission.md +12 -0
  485. package/src/modules/user-management/docs/commands/CreateRole.md +9 -0
  486. package/src/modules/user-management/docs/commands/CreateUser.md +11 -0
  487. package/src/modules/user-management/docs/commands/DeactivateUser.md +7 -0
  488. package/src/modules/user-management/docs/commands/ReactivateUser.md +7 -0
  489. package/src/modules/user-management/docs/commands/RevokePermissionFromRole.md +7 -0
  490. package/src/modules/user-management/docs/commands/RevokeRoleFromUser.md +7 -0
  491. package/src/modules/user-management/index.ts +0 -30
  492. package/src/modules/user-management/lib/errors.generated.ts +14 -14
  493. package/src/modules/user-management/lib/permissions.generated.ts +1 -2
  494. package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -3
  495. package/src/modules/user-management/lib/types.ts +1 -1
  496. package/src/modules/user-management/module.ts +2 -7
  497. package/src/modules/user-management/tailor.config.ts +6 -4
  498. package/src/modules/user-management/tailor.d.ts +13 -0
  499. package/src/modules/user-management/testing/fixtures.ts +1 -20
  500. package/src/schemas.ts +1 -1
  501. package/src/{modules/shared → shared}/defineCommand.test.ts +23 -7
  502. package/src/{modules/shared → shared}/defineCommand.ts +19 -10
  503. package/src/{modules/shared/internal.ts → shared/index.ts} +9 -1
  504. package/src/shared/pagination.test.ts +43 -0
  505. package/src/shared/pagination.ts +22 -0
  506. package/src/{modules/shared → shared}/types.ts +13 -0
  507. package/src/{modules/testing → testing}/index.ts +14 -7
  508. package/src/testing.ts +1 -1
  509. package/src/util.ts +8 -0
  510. package/templates/config/license.config.json +4 -0
  511. package/templates/scaffold/app/backend/.env.example +1 -0
  512. package/templates/scaffold/app/backend/__dot__gitignore +4 -0
  513. package/templates/scaffold/app/backend/eslint.config.js +32 -0
  514. package/templates/scaffold/app/backend/package.json +31 -0
  515. package/templates/scaffold/app/backend/seed/data/AuditEvent.jsonl +0 -0
  516. package/templates/scaffold/app/backend/seed/data/Permission.jsonl +0 -0
  517. package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +20 -0
  518. package/templates/scaffold/app/backend/seed/data/Role.jsonl +0 -0
  519. package/templates/scaffold/app/backend/seed/data/Role.schema.ts +20 -0
  520. package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +0 -0
  521. package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +24 -0
  522. package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -0
  523. package/templates/scaffold/app/backend/seed/data/User.schema.ts +20 -0
  524. package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +0 -0
  525. package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +24 -0
  526. package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -0
  527. package/templates/scaffold/app/backend/seed/data/_User.schema.ts +30 -0
  528. package/templates/scaffold/app/backend/seed/exec.mjs +659 -0
  529. package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +3 -0
  530. package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +3 -0
  531. package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +83 -0
  532. package/templates/scaffold/app/backend/src/modules.ts +9 -0
  533. package/templates/scaffold/app/backend/src/resolvers/createUser.ts +46 -0
  534. package/templates/scaffold/app/backend/tailor.config.ts +68 -0
  535. package/templates/scaffold/app/backend/tailor.d.ts +15 -0
  536. package/templates/scaffold/app/backend/tsconfig.json +19 -0
  537. package/templates/scaffold/app/docs/actors/.gitkeep +0 -0
  538. package/templates/scaffold/app/docs/business-flow/.gitkeep +0 -0
  539. package/templates/scaffold/app/docs/resolver/.gitkeep +0 -0
  540. package/templates/scaffold/app/docs/screen/.gitkeep +0 -0
  541. package/templates/scaffold/app/frontend/.env.example +2 -0
  542. package/templates/scaffold/app/frontend/__dot__gitignore +3 -0
  543. package/templates/scaffold/app/frontend/components.json +23 -0
  544. package/templates/scaffold/app/frontend/eslint.config.js +48 -0
  545. package/templates/scaffold/app/frontend/index.html +13 -0
  546. package/templates/scaffold/app/frontend/package.json +53 -0
  547. package/templates/scaffold/app/frontend/scripts/generate-graphql.mjs +6 -0
  548. package/templates/scaffold/app/frontend/src/App.tsx +58 -0
  549. package/templates/scaffold/app/frontend/src/components/composed/empty-state.tsx +26 -0
  550. package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +28 -0
  551. package/templates/scaffold/app/frontend/src/components/composed/loading.tsx +13 -0
  552. package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +39 -0
  553. package/templates/scaffold/app/frontend/src/components/ui/button.tsx +60 -0
  554. package/templates/scaffold/app/frontend/src/components/ui/card.tsx +75 -0
  555. package/templates/scaffold/app/frontend/src/components/ui/form.tsx +152 -0
  556. package/templates/scaffold/app/frontend/src/components/ui/input.tsx +21 -0
  557. package/templates/scaffold/app/frontend/src/components/ui/label.tsx +21 -0
  558. package/templates/scaffold/app/frontend/src/components/ui/spinner.tsx +16 -0
  559. package/templates/scaffold/app/frontend/src/components/ui/table.tsx +90 -0
  560. package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +103 -0
  561. package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1235 -0
  562. package/templates/scaffold/app/frontend/src/graphql/index.ts +15 -0
  563. package/templates/scaffold/app/frontend/src/index.css +5 -0
  564. package/templates/scaffold/app/frontend/src/lib/auth-client.ts +17 -0
  565. package/templates/scaffold/app/frontend/src/lib/utils.ts +6 -0
  566. package/templates/scaffold/app/frontend/src/main.tsx +10 -0
  567. package/templates/scaffold/app/frontend/src/pages/page.tsx +20 -0
  568. package/templates/scaffold/app/frontend/src/pages/user-management/page.tsx +19 -0
  569. package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +97 -0
  570. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +58 -0
  571. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +51 -0
  572. package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +101 -0
  573. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +99 -0
  574. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/page.tsx +19 -0
  575. package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +61 -0
  576. package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +21 -0
  577. package/templates/scaffold/app/frontend/tsconfig.app.json +35 -0
  578. package/templates/scaffold/app/frontend/tsconfig.json +16 -0
  579. package/templates/scaffold/app/frontend/tsconfig.node.json +23 -0
  580. package/templates/scaffold/app/frontend/vite.config.ts +23 -0
  581. package/templates/scaffold/module/command/.gitkeep +0 -0
  582. package/templates/scaffold/module/db/.gitkeep +0 -0
  583. package/templates/scaffold/module/executor/.gitkeep +0 -0
  584. package/templates/scaffold/module/generated/.gitkeep +0 -0
  585. package/templates/scaffold/module/index.ts +2 -0
  586. package/templates/scaffold/module/lib/errors.ts +1 -0
  587. package/templates/scaffold/module/lib/types.ts +4 -0
  588. package/templates/scaffold/module/module.ts +7 -0
  589. package/templates/scaffold/module/permissions.ts +3 -0
  590. package/templates/scaffold/module/query/.gitkeep +0 -0
  591. package/templates/scaffold/module/tailor.config.ts +13 -0
  592. package/templates/scaffold/module/testing/fixtures.ts +1 -0
  593. package/templates/workflows/erp-kit-check.yml +37 -0
  594. package/dist/cli.js +0 -1654
  595. package/skills/erp-kit-app-2-breakdown/SKILL.md +0 -88
  596. package/skills/erp-kit-app-3-doc-review/SKILL.md +0 -112
  597. package/skills/erp-kit-app-4-impl-spec/SKILL.md +0 -116
  598. package/skills/erp-kit-app-5-implementation/SKILL.md +0 -149
  599. package/skills/erp-kit-app-5-implementation/references/backend.md +0 -232
  600. package/skills/erp-kit-module-1-docs/SKILL.md +0 -111
  601. package/skills/erp-kit-module-2-feature-breakdown/SKILL.md +0 -76
  602. package/skills/erp-kit-module-3-doc-review/SKILL.md +0 -294
  603. package/skills/erp-kit-module-4-tdd/SKILL.md +0 -94
  604. package/skills/erp-kit-module-4-tdd/references/exports.md +0 -8
  605. package/skills/erp-kit-module-5-impl-review/SKILL.md +0 -410
  606. package/src/commands/scaffold-templates.ts +0 -65
  607. package/src/commands/scaffold.test.ts +0 -171
  608. package/src/commands/scaffold.ts +0 -140
  609. package/src/modules/shared/index.ts +0 -1
  610. package/src/modules/user-management/command/logAuditEvent.generated.ts +0 -6
  611. package/src/modules/user-management/command/logAuditEvent.test.ts +0 -187
  612. package/src/modules/user-management/command/logAuditEvent.ts +0 -56
  613. package/src/modules/user-management/db/auditEvent.ts +0 -47
  614. package/src/modules/user-management/docs/commands/LogAuditEvent.md +0 -37
  615. package/src/modules/user-management/docs/features/audit-trail.md +0 -80
  616. package/src/modules/user-management/docs/models/AuditEvent.md +0 -36
  617. /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/cross-module-dependency.md +0 -0
  618. /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/db-relations.md +0 -0
  619. /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/models.md +0 -0
  620. /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/commands.md +0 -0
  621. /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/testing.md +0 -0
  622. /package/src/modules/{product-management → audit}/.gitkeep +0 -0
  623. /package/src/{modules/shared → shared}/createContext.test.ts +0 -0
  624. /package/src/{modules/shared → shared}/createContext.ts +0 -0
  625. /package/src/{modules/shared → shared}/definePermissions.test.ts +0 -0
  626. /package/src/{modules/shared → shared}/definePermissions.ts +0 -0
  627. /package/src/{modules/shared → shared}/defineQuery.test.ts +0 -0
  628. /package/src/{modules/shared → shared}/defineQuery.ts +0 -0
  629. /package/src/{modules/shared → shared}/entityTypes.ts +0 -0
  630. /package/src/{modules/shared → shared}/errors.ts +0 -0
  631. /package/src/{modules/shared → shared}/requirePermission.test.ts +0 -0
  632. /package/src/{modules/shared → shared}/requirePermission.ts +0 -0
  633. /package/src/{modules/shared → shared}/result.ts +0 -0
@@ -1,410 +0,0 @@
1
- ---
2
- name: erp-kit-module-5-impl-review
3
- description: Review implementation parity between documentation and code. Use when validating that TDD implementation (step 4) matches model docs, command docs, and test coverage requirements.
4
- ---
5
-
6
- # Implementation Parity Review Workflow
7
-
8
- Review **implementation consistency** between documentation and actual code.
9
-
10
- ## Purpose
11
-
12
- Verify that TDD implementation (models, commands, tests) properly implements what's documented in model docs and command docs.
13
-
14
- ```
15
- Model Docs (Schema) →db/*.ts (Implementation)
16
- ↓ ↓
17
- Fields createEntityType()
18
- Relationships Foreign keys
19
- State Transitions Status enums
20
-
21
- Command Docs (Spec) →command/*.ts (Implementation)
22
- ↓ ↓
23
- Business Rules Validation logic
24
- Error Scenarios Error classes
25
- Process Flows Branching logic
26
-
27
- Command Docs (Spec) →command/*.test.ts (Tests)
28
- ↓ ↓
29
- Process Flow branches Test cases
30
- Error scenarios Error assertions
31
- Idempotent paths Return existing tests
32
- ```
33
-
34
- ## When to Use
35
-
36
- - After TDD implementation (step 4), verify it matches documentation
37
- - Before merging feature branches
38
- - Quality check during code review
39
-
40
- ## Workflow
41
-
42
- ```
43
- MODEL DOCS → MODEL CODE → COMMAND DOCS → COMMAND CODE → TESTS → COMPARE → REPORT
44
- ```
45
-
46
- ## Step-by-Step
47
-
48
- ### 1. Read Model Documentation
49
-
50
- Read ALL model docs:
51
-
52
- ```
53
- modules/<module-name>/docs/models/*.md
54
- ```
55
-
56
- Extract for each model:
57
-
58
- - Field names and types
59
- - Required vs optional fields
60
- - Relationships (foreign keys)
61
- - State transitions (if stateful)
62
- - Constraints
63
-
64
- ### 2. Read Model Implementation
65
-
66
- Read ALL model files:
67
-
68
- ```
69
- modules/<module-name>/db/*.ts
70
- ```
71
-
72
- Extract for each model:
73
-
74
- - Fields in `createEntityType()`
75
- - Status enums (base + additional)
76
- - Foreign key references
77
- - Field descriptions
78
-
79
- ### 3. Read Command Documentation
80
-
81
- Read ALL command docs:
82
-
83
- ```
84
- modules/<module-name>/docs/commands/*.md
85
- ```
86
-
87
- Extract for each command:
88
-
89
- - Business rules
90
- - Error scenarios (with codes)
91
- - Process flow branches
92
- - Input/output types
93
-
94
- ### 4. Read Command Implementation
95
-
96
- Read ALL command files:
97
-
98
- ```
99
- modules/<module-name>/command/*.ts
100
- ```
101
-
102
- Extract for each command:
103
-
104
- - Validation logic implemented
105
- - Error classes returned via Result
106
- - Branching paths (if/else, early returns)
107
- - Input interface fields
108
- - Return type structure
109
-
110
- ### 5. Read Error Implementation
111
-
112
- Read generated error definitions:
113
-
114
- ```
115
- modules/<module-name>/lib/errors.generated.ts
116
- ```
117
-
118
- Extract:
119
-
120
- - Error class names (generated from doc error codes)
121
- - Error codes
122
- - Error message patterns
123
-
124
- ### 6. Read Test Implementation
125
-
126
- Read ALL test files:
127
-
128
- ```
129
- modules/<module-name>/command/*.test.ts
130
- ```
131
-
132
- Extract for each command:
133
-
134
- - Test case descriptions
135
- - Error assertions
136
- - Happy path coverage
137
- - Edge case coverage
138
-
139
- ### 7. Model Doc → Model Code Parity Check
140
-
141
- | Check Item | Question |
142
- | ------------------ | ---------------------------------------------------------------- |
143
- | Field coverage | Does code include all fields from model doc? |
144
- | Type accuracy | Do field types match doc specification? |
145
- | Required fields | Are required fields enforced (no default, not nullable)? |
146
- | Relationship impl | Are foreign key fields implemented for documented relationships? |
147
- | State transitions | Does status enum include all documented states? |
148
- | Field descriptions | Do `.description()` calls match doc field descriptions? |
149
-
150
- ### 8. Command Doc → Command Code Parity Check
151
-
152
- | Check Item | Question |
153
- | ----------------------- | ----------------------------------------------------------- |
154
- | Business rule impl | Is each documented business rule implemented in code? |
155
- | Error scenario coverage | Does code return errors for all documented error scenarios? |
156
- | Error code accuracy | Do error codes in code match documented codes? |
157
- | Process flow alignment | Do code branches match documented process flow? |
158
- | Input type coverage | Does input interface include all documented inputs? |
159
- | Return type accuracy | Does return type match documented output? |
160
- | Generated shell pattern | Does command export `run` with a `.generated.ts` shell? |
161
-
162
- ### 9. Command Doc → Test Coverage Check
163
-
164
- | Check Item | Question |
165
- | --------------------- | ---------------------------------------------------------- |
166
- | Process flow coverage | Does each branch in process flow have a test case? |
167
- | Error scenario tests | Does each documented error scenario have a test assertion? |
168
- | Happy path tests | Are success paths tested? |
169
- | Idempotent path tests | If doc shows "already exists → return", is this tested? |
170
-
171
- ### 10. Report Findings
172
-
173
- ```markdown
174
- ## Implementation Parity Review Report
175
-
176
- **Module:** <module-name>
177
-
178
- ---
179
-
180
- ### 1. Model Doc → Model Code Coverage
181
-
182
- | Model Doc | Fields Documented | Fields Implemented | Gap |
183
- | --------- | ----------------- | ------------------ | ------------------- |
184
- | <Model-A> | N fields | N fields | ✅ |
185
- | <Model-B> | N fields | N-1 fields | ❌ `fieldX` missing |
186
-
187
- ---
188
-
189
- ### 2. Model State Transitions
190
-
191
- | Model | Documented States | Implemented States | Gap |
192
- | --------- | ------------------------ | ------------------ | ------------------ |
193
- | <Model-A> | PENDING, ACTIVE, REMOVED | PENDING, ACTIVE | ❌ REMOVED missing |
194
- | <Model-B> | ACTIVE, INACTIVE | ACTIVE, INACTIVE | ✅ |
195
-
196
- ---
197
-
198
- ### 3. Command Doc → Command Code Coverage
199
-
200
- | Command Doc | Business Rules | Implemented | Gap |
201
- | ----------- | -------------- | ----------- | -------------------------------- |
202
- | <cmd-a> | 3 rules | 3 rules | ✅ |
203
- | <cmd-b> | 4 rules | 3 rules | ❌ "rule X validation" not found |
204
-
205
- ---
206
-
207
- ### 4. Error Scenario Implementation
208
-
209
- | Command Doc | Error Code | Generated in errors.generated.ts | Returned in command | Test assertion |
210
- | ----------- | ---------------- | -------------------------------- | ------------------- | -------------- |
211
- | <cmd-a> | ENTITY_NOT_FOUND | ✅ EntityNotFoundError | ✅ | ✅ |
212
- | <cmd-a> | INVALID_STATE | ❌ Not defined | ❌ | ❌ |
213
- | <cmd-b> | DUPLICATE_ENTRY | ✅ DuplicateEntryError | ✅ | ❌ No test |
214
-
215
- ---
216
-
217
- ### 5. Process Flow → Test Coverage
218
-
219
- | Command Doc | Process Flow Branches | Test Cases | Gap |
220
- | ----------- | --------------------- | ---------- | -------------------------------- |
221
- | <cmd-a> | 3 branches | 3 tests | ✅ |
222
- | <cmd-b> | 4 branches | 2 tests | ❌ Missing "already exists" test |
223
-
224
- ---
225
-
226
- ### 6. Implementation Pattern Compliance
227
-
228
- | Command | Generated Shell | Input Interface Exported | JSDoc Present |
229
- | ------- | ------------------------- | ------------------------ | ------------- |
230
- | <cmd-a> | ✅ `.generated.ts` exists | ✅ | ✅ |
231
- | <cmd-b> | ❌ Missing shell | ✅ | ❌ |
232
-
233
- ---
234
-
235
- ### 7. Missing Implementation
236
-
237
- #### Missing in Model Code
238
-
239
- | Model Doc | Missing Item | Type | Doc Reference |
240
- | --------- | ------------ | ------ | --------------------------- |
241
- | <Model-A> | `fieldX` | Field | "fieldX: uuid, required" |
242
- | <Model-A> | `REMOVED` | Status | State diagram shows REMOVED |
243
-
244
- #### Missing in Command Code
245
-
246
- | Command Doc | Missing Item | Type | Doc Reference |
247
- | ----------- | ---------------- | ------------- | ------------------------ |
248
- | <cmd-b> | validation for X | Business rule | "Rule: X must be unique" |
249
-
250
- #### Missing Error Classes
251
-
252
- | Command Doc | Error Code | Expected Class |
253
- | ----------- | ------------- | ----------------- |
254
- | <cmd-a> | INVALID_STATE | InvalidStateError |
255
-
256
- #### Missing Tests
257
-
258
- | Command Doc | Missing Test Case | Doc Reference |
259
- | ----------- | -------------------------------- | --------------------- |
260
- | <cmd-b> | "entity already exists → return" | Process flow branch 2 |
261
- | <cmd-b> | "returns DUPLICATE_ENTRY" | Error scenario 3 |
262
-
263
- ---
264
-
265
- ### 8. Inconsistencies
266
-
267
- | Type | Location | Issue |
268
- | ------------------- | -------------- | ------------------------------------------- |
269
- | Type mismatch | Model-A.fieldX | Doc: string, Code: number |
270
- | Error code mismatch | cmd-a | Doc: USER_NOT_FOUND, Code: ENTITY_NOT_FOUND |
271
- | Missing description | Model-B.fieldY | No `.description()` but doc has description |
272
-
273
- ---
274
-
275
- ### 9. Summary
276
-
277
- | Aspect | Status | Details |
278
- | ----------------------------- | ------ | --------------------------------- |
279
- | Model Doc → Code Coverage | ⚠️ | X/Y models fully implemented |
280
- | Command Doc → Code Coverage | ⚠️ | X/Y commands fully implemented |
281
- | Error Scenario Implementation | ❌ | X/Y errors defined and returned |
282
- | Test Coverage | ⚠️ | X/Y process branches have tests |
283
- | Pattern Compliance | ✅ | All commands use generated shells |
284
-
285
- ### 10. Recommendations
286
-
287
- 1. **Add missing model fields:**
288
- - Model-A: add `fieldX` field
289
-
290
- 2. **Add missing status values:**
291
- - Model-A: add `REMOVED` to status enum
292
-
293
- 3. **Implement missing business rules:**
294
- - cmd-b: add validation for "X must be unique"
295
-
296
- 4. **Define missing error classes:**
297
- - Add `INVALID_STATE` error scenario to command doc + re-run `erp-kit module generate code`
298
-
299
- 5. **Add missing test cases:**
300
- - cmd-b: test "entity already exists → return existing"
301
- - cmd-b: test "throws DUPLICATE_ENTRY on duplicate"
302
-
303
- 6. **Fix inconsistencies:**
304
- - Model-A.fieldX: change type to string per doc
305
- ```
306
-
307
- ## Common Gaps
308
-
309
- ### Model Doc → Model Code
310
-
311
- - **Missing fields**: Doc specifies field but not in code
312
- - **Type mismatches**: Doc says string, code uses number
313
- - **Missing status values**: State diagram shows state not in enum
314
- - **Missing relationships**: Doc shows FK but not implemented
315
- - **Missing descriptions**: Doc has field description but no `.description()`
316
-
317
- ### Command Doc → Command Code
318
-
319
- - **Unimplemented business rules**: Rule in doc but no validation code
320
- - **Missing error returns**: Error scenario documented but not returned
321
- - **Wrong error codes**: Code and doc use different error codes
322
- - **Missing process branches**: Flowchart branch not in code logic
323
- - **Missing generated shell**: No `.generated.ts` file for command
324
-
325
- ### Command Doc → Tests
326
-
327
- - **Uncovered process branches**: Flowchart branch has no test
328
- - **Missing error tests**: Error scenario has no assertion
329
- - **Missing idempotent tests**: "Return existing" path untested
330
- - **Missing edge cases**: Boundary conditions not tested
331
-
332
- ## Quick Reference: Extraction Patterns
333
-
334
- ### From Model Docs
335
-
336
- ```markdown
337
- ## Fields
338
-
339
- | Field | Type | Required |
340
- | -------- | ------ | -------- | ---------------------------------------- |
341
- | id | uuid | yes | → Check: field exists, type matches |
342
- | name | string | yes | → Check: not nullable |
343
- | status | enum | yes | → Check: enum values match state diagram |
344
- | parentId | uuid | yes | → Check: foreign key implemented |
345
-
346
- ## State Diagram
347
-
348
- PENDING → ACTIVE → REMOVED
349
- → Check: all states in enum
350
- ```
351
-
352
- ### From Command Docs
353
-
354
- ```markdown
355
- ## Business Rules
356
-
357
- 1. Entity must exist → Check: validation in code
358
- 2. Status must be ACTIVE → Check: status check in code
359
-
360
- ## Error Scenarios
361
-
362
- | Code | Condition |
363
- | -------------- | -------------- | ------------------------------------------ |
364
- | NOT_FOUND | Entity missing | → Check: error class + return err() + test |
365
- | INVALID_STATUS | Wrong status | → Check: error class + return err() + test |
366
-
367
- ## Process Flow (mermaid)
368
-
369
- graph TD
370
- A[Start] --> B{Exists?}
371
- B -->|Yes| C[Return] → Check: test for "already exists"
372
- B -->|No| D[Create] → Check: test for "create new"
373
- ```
374
-
375
- ### From Implementation
376
-
377
- ```typescript
378
- // Model: check fields match doc
379
- export function createEntityType(params) {
380
- return {
381
- fields: {
382
- /* verify each field */
383
- },
384
- };
385
- }
386
-
387
- // Command: check business rules (run function pattern)
388
- export async function run(db, input, ctx) {
389
- // Check: validation for each business rule
390
- if (!entity) return err(new EntityNotFoundError()); // Check: matches doc error
391
- // Check: each branch matches process flow
392
- }
393
-
394
- // Generated shell: check it exists
395
- // myCommand.generated.ts
396
- export const myCommand = defineCommand(permissions.myCommand, run);
397
-
398
- // Test: check coverage
399
- describe("myCommand", () => {
400
- it("creates entity when valid"); // Check: happy path
401
- it("returns existing if found"); // Check: idempotent path
402
- it("returns NOT_FOUND when missing"); // Check: error scenario
403
- });
404
- ```
405
-
406
- ## References
407
-
408
- - [Command patterns](references/commands.md)
409
- - [Error patterns](references/errors.md)
410
- - [Testing patterns](references/testing.md)
@@ -1,65 +0,0 @@
1
- export type TemplateEntry =
2
- | { type: "dir"; path: string }
3
- | { type: "file"; path: string; content: (moduleName: string) => string };
4
-
5
- export function getModuleSrcTemplates(): TemplateEntry[] {
6
- return [
7
- { type: "dir", path: "db" },
8
- { type: "dir", path: "command" },
9
- { type: "dir", path: "executor" },
10
- { type: "dir", path: "generated" },
11
- { type: "dir", path: "query" },
12
- { type: "file", path: "module.ts", content: () => MODULE_TEMPLATE },
13
- { type: "file", path: "index.ts", content: () => INDEX_TEMPLATE },
14
- { type: "file", path: "permissions.ts", content: (n) => permissionsTemplate(n) },
15
- { type: "file", path: "tailor.config.ts", content: (n) => tailorConfigTemplate(n) },
16
- { type: "file", path: "lib/errors.ts", content: () => ERRORS_TEMPLATE },
17
- { type: "file", path: "lib/types.ts", content: () => TYPES_TEMPLATE },
18
- { type: "file", path: "testing/fixtures.ts", content: () => FIXTURES_TEMPLATE },
19
- ];
20
- }
21
-
22
- const MODULE_TEMPLATE = `export const defineModule = () => {
23
- return {
24
- db: {},
25
- commands: {},
26
- queries: {},
27
- };
28
- };
29
- `;
30
-
31
- const INDEX_TEMPLATE = `export { defineModule } from "./module";
32
- export { permissions, own, all } from "./permissions";
33
- `;
34
-
35
- const ERRORS_TEMPLATE = `import { createDomainError } from "../../shared/internal";\n`;
36
-
37
- const TYPES_TEMPLATE = `import type { InferSchema, Selectable, Insertable, Updateable } from "../../shared/internal";
38
- import type { DB } from "../generated/kysely-tailordb";
39
-
40
- export type Schema = InferSchema<DB>;
41
- `;
42
-
43
- const FIXTURES_TEMPLATE = `// Add test fixtures here\n`;
44
-
45
- function permissionsTemplate(moduleName: string): string {
46
- return `import { definePermissions } from "../shared/internal";
47
-
48
- export const { permissions, own, all } = definePermissions("${moduleName}", [] as const);
49
- `;
50
- }
51
-
52
- function tailorConfigTemplate(moduleName: string): string {
53
- return `import { defineConfig, defineGenerators } from "@tailor-platform/sdk";
54
-
55
- export default defineConfig({
56
- name: "${moduleName}",
57
- db: { "main-db": { files: [\`./db/*.ts\`] } },
58
- });
59
-
60
- export const generators = defineGenerators(
61
- ["@tailor-platform/kysely-type", { distPath: \`./generated/kysely-tailordb.ts\` }],
62
- ["@tailor-platform/enum-constants", { distPath: "./generated/enums.ts" }],
63
- );
64
- `;
65
- }
@@ -1,171 +0,0 @@
1
- import fs from "node:fs";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import {
5
- type Diagnostic,
6
- DiagnosticCategory,
7
- flattenDiagnosticMessageText,
8
- ModuleKind,
9
- ScriptTarget,
10
- transpileModule,
11
- } from "typescript";
12
- import { describe, it, expect, afterEach } from "vitest";
13
- import { resolveScaffoldPath, scaffoldModuleSrc } from "./scaffold";
14
- import { getModuleSrcTemplates } from "./scaffold-templates";
15
-
16
- describe("resolveScaffoldPath", () => {
17
- // Module types
18
- it("resolves module scaffold path", () => {
19
- const result = resolveScaffoldPath("module", "inventory", undefined, "modules");
20
- expect(result).toBe("modules/inventory/README.md");
21
- });
22
-
23
- it("resolves command scaffold path", () => {
24
- const result = resolveScaffoldPath("command", "inventory", "CreateOrder", "modules");
25
- expect(result).toBe("modules/inventory/docs/commands/CreateOrder.md");
26
- });
27
-
28
- it("resolves feature scaffold path", () => {
29
- const result = resolveScaffoldPath("feature", "inventory", "stock-tracking", "modules");
30
- expect(result).toBe("modules/inventory/docs/features/stock-tracking.md");
31
- });
32
-
33
- it("resolves model scaffold path", () => {
34
- const result = resolveScaffoldPath("model", "inventory", "StockItem", "modules");
35
- expect(result).toBe("modules/inventory/docs/models/StockItem.md");
36
- });
37
-
38
- // App-compose types
39
- it("resolves requirements scaffold path", () => {
40
- const result = resolveScaffoldPath("requirements", "my-app", undefined, "examples");
41
- expect(result).toBe("examples/my-app/README.md");
42
- });
43
-
44
- it("resolves actors scaffold path", () => {
45
- const result = resolveScaffoldPath("actors", "my-app", "admin", "examples");
46
- expect(result).toBe("examples/my-app/docs/actors/admin.md");
47
- });
48
-
49
- it("resolves business-flow scaffold path", () => {
50
- const result = resolveScaffoldPath("business-flow", "my-app", "onboarding", "examples");
51
- expect(result).toBe("examples/my-app/docs/business-flow/onboarding/README.md");
52
- });
53
-
54
- it("resolves story scaffold path with flow/name format", () => {
55
- const result = resolveScaffoldPath(
56
- "story",
57
- "my-app",
58
- "onboarding/admin--create-user",
59
- "examples",
60
- );
61
- expect(result).toBe(
62
- "examples/my-app/docs/business-flow/onboarding/story/admin--create-user.md",
63
- );
64
- });
65
-
66
- it("resolves screen scaffold path", () => {
67
- const result = resolveScaffoldPath("screen", "my-app", "supplier-list", "examples");
68
- expect(result).toBe("examples/my-app/docs/screen/supplier-list.md");
69
- });
70
-
71
- it("resolves resolver scaffold path", () => {
72
- const result = resolveScaffoldPath("resolver", "my-app", "create-supplier", "examples");
73
- expect(result).toBe("examples/my-app/docs/resolver/create-supplier.md");
74
- });
75
-
76
- it("resolves query scaffold path", () => {
77
- const result = resolveScaffoldPath("query", "inventory", "ConvertQuantity", "modules");
78
- expect(result).toBe("modules/inventory/docs/queries/ConvertQuantity.md");
79
- });
80
-
81
- // Validation
82
- it("throws when name is required but missing", () => {
83
- expect(() => resolveScaffoldPath("command", "inventory", undefined, "modules")).toThrow(
84
- "Name is required",
85
- );
86
- });
87
-
88
- it("throws when story name is not flow/name format", () => {
89
- expect(() => resolveScaffoldPath("story", "my-app", "bad-name", "examples")).toThrow(
90
- "Story name must be",
91
- );
92
- });
93
- });
94
-
95
- describe("scaffoldModuleSrc", () => {
96
- let tmpDir: string;
97
-
98
- afterEach(() => {
99
- if (tmpDir) {
100
- fs.rmSync(tmpDir, { recursive: true, force: true });
101
- }
102
- });
103
-
104
- it("creates expected directories and files", () => {
105
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "scaffold-test-"));
106
- const moduleDir = path.join(tmpDir, "test-module");
107
- fs.mkdirSync(moduleDir, { recursive: true });
108
-
109
- scaffoldModuleSrc(moduleDir, "test-module");
110
-
111
- // Verify directories exist directly under module root (flat structure)
112
- for (const dir of ["db", "command", "executor", "generated", "lib", "query", "testing"]) {
113
- expect(fs.existsSync(path.join(moduleDir, dir))).toBe(true);
114
- }
115
-
116
- // Verify .gitkeep in empty directories
117
- for (const dir of ["db", "command", "executor", "generated", "query"]) {
118
- expect(fs.existsSync(path.join(moduleDir, dir, ".gitkeep"))).toBe(true);
119
- }
120
-
121
- // Verify starter files exist
122
- const expectedFiles = [
123
- "module.ts",
124
- "index.ts",
125
- "permissions.ts",
126
- "tailor.config.ts",
127
- "lib/errors.ts",
128
- "lib/types.ts",
129
- "testing/fixtures.ts",
130
- ];
131
- for (const file of expectedFiles) {
132
- expect(fs.existsSync(path.join(moduleDir, file))).toBe(true);
133
- }
134
-
135
- // Verify module name is used in content
136
- const permissions = fs.readFileSync(path.join(moduleDir, "permissions.ts"), "utf-8");
137
- expect(permissions).toContain('definePermissions("test-module"');
138
-
139
- const config = fs.readFileSync(path.join(moduleDir, "tailor.config.ts"), "utf-8");
140
- expect(config).toContain('name: "test-module"');
141
-
142
- const moduleFile = fs.readFileSync(path.join(moduleDir, "module.ts"), "utf-8");
143
- expect(moduleFile).toContain("defineModule");
144
- expect(moduleFile).toContain("commands");
145
- expect(moduleFile).toContain("queries");
146
- });
147
-
148
- it("generates syntactically valid TypeScript for all file templates", () => {
149
- const templates = getModuleSrcTemplates();
150
- const fileTemplates = templates.filter((t) => t.type === "file");
151
-
152
- for (const entry of fileTemplates) {
153
- const source = entry.content("test-module");
154
- const result = transpileModule(source, {
155
- reportDiagnostics: true,
156
- compilerOptions: { target: ScriptTarget.ESNext, module: ModuleKind.ESNext },
157
- });
158
- const errors = (result.diagnostics ?? []).filter(
159
- (d) => d.category === DiagnosticCategory.Error,
160
- );
161
- expect(
162
- errors,
163
- `syntax errors in template "${entry.path}": ${formatDiagnostics(errors)}`,
164
- ).toHaveLength(0);
165
- }
166
- });
167
- });
168
-
169
- function formatDiagnostics(diagnostics: Diagnostic[]): string {
170
- return diagnostics.map((d) => flattenDiagnosticMessageText(d.messageText, "\n")).join("; ");
171
- }