@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,88 +0,0 @@
1
- ---
2
- name: erp-kit-app-2-breakdown
3
- description: Create Tier 3 documentation (stories, screens) by breaking down business flows. Use after completing Tier 1-2 documentation with erp-kit-app-1-requirements.
4
- ---
5
-
6
- # Requirements Breakdown Workflow
7
-
8
- Break down Tier 2 business flows into Tier 3 documentation: User Stories and Screens.
9
-
10
- ## Prerequisites
11
-
12
- Tier 1-2 documentation must exist:
13
-
14
- - `README.md` (requirements)
15
- - `docs/actors/*.md` (actor definitions)
16
- - `docs/business-flow/*/README.md` (business workflows)
17
-
18
- ## Workflow Phases
19
-
20
- ```
21
- ANALYZE → BREAKDOWN → CREATE → VALIDATE
22
- ```
23
-
24
- ### Phase 1: Analyze
25
-
26
- Review existing Tier 2 documentation:
27
-
28
- 1. **Read** all business flow files in `docs/business-flow/`
29
- 2. **Identify** flow steps that represent user actions
30
- 3. **Map** each step to the responsible actor
31
- 4. **Note** data inputs/outputs for each step
32
-
33
- ### Phase 2: Breakdown
34
-
35
- For each business flow, decompose into stories and screens:
36
-
37
- | Flow Element | Maps To |
38
- | ---------------- | ----------- |
39
- | User action step | Story |
40
- | UI requirement | Screen |
41
- | Actor in flow | Story actor |
42
-
43
- ### Phase 3: Create
44
-
45
- Generate documentation using `erp-kit` CLI:
46
-
47
- ```bash
48
- # Tier 3: Stories
49
- erp-kit app scaffold story <app> <flow>/<actor>--<story> --root examples
50
-
51
- # Tier 3: Screens
52
- erp-kit app scaffold screen <app> <screen-name> --root examples
53
- ```
54
-
55
- **Naming conventions:**
56
-
57
- - Story filename: `<actor>--<story-name>.md` (double-dash separator)
58
- - Story heading: Title Case of story name (after `--`)
59
- - Screen filename: kebab-case, noun-focused (e.g., `supplier-list.md`)
60
-
61
- **After creating stories**, replace `- TBD` placeholders in the `## Stories` section of each business flow README with actual links:
62
-
63
- ```markdown
64
- - [Story Title](./story/<actor>--<story-name>.md)
65
- ```
66
-
67
- ### Phase 4: Validate
68
-
69
- ```bash
70
- pnpm run app:doc:check
71
- ```
72
-
73
- ## Schema Reference
74
-
75
- | Schema | Tier | Output Path |
76
- | ------------ | ---- | ---------------------------------------------------- |
77
- | `story.yml` | 3 | `docs/business-flow/<flow>/story/<actor>--<name>.md` |
78
- | `screen.yml` | 3 | `docs/screen/<name>.md` |
79
-
80
- ## Tips
81
-
82
- - One business flow typically produces 3-8 stories
83
- - Stories should be completable in a single user session
84
- - Screens can be shared across multiple stories
85
-
86
- ## Next Step
87
-
88
- After completing Tier 3, use `/erp-kit-app-3-doc-review` to validate documentation parity.
@@ -1,112 +0,0 @@
1
- ---
2
- name: erp-kit-app-3-doc-review
3
- description: Review documentation parity between Tier 2 (business flows, actors) and Tier 3 (stories, screens). Use when validating that all business flow steps have corresponding stories, and that screens are properly linked.
4
- ---
5
-
6
- # Documentation Parity Review Workflow
7
-
8
- Review **documentation consistency** between Tier 2 and Tier 3 documentation.
9
-
10
- ## Purpose
11
-
12
- ```
13
- Business Flow (Tier 2) → Stories (Tier 3) → Screens (Tier 3)
14
- ↓ ↓ ↓
15
- Flow Steps User Actions UI Components
16
- Actors Involved Scenario Patterns Screen Types
17
- ```
18
-
19
- ## When to Use
20
-
21
- - After writing Tier 3 documentation, check for gaps
22
- - Before proceeding to Tier 4 (implementation spec)
23
- - Quality check during documentation review
24
-
25
- ## Workflow
26
-
27
- ```
28
- READ DOCS → PARITY CHECKS → REPORT
29
- ```
30
-
31
- ### Step 1: Read All Documentation
32
-
33
- ```
34
- examples/<app-name>/docs/business-flow/*/README.md # Flows
35
- examples/<app-name>/docs/business-flow/*/story/*.md # Stories
36
- examples/<app-name>/docs/screen/*.md # Screens
37
- examples/<app-name>/docs/actors/*.md # Actors
38
- ```
39
-
40
- ### Step 2: Parity Checks
41
-
42
- #### Business Flow → Story
43
-
44
- | Check | Question |
45
- | --------------- | ----------------------------------------------- |
46
- | Story existence | Does each flow step have a corresponding story? |
47
- | Actor coverage | Are all actors in flow represented in stories? |
48
- | Link validity | Do story links in flow README resolve? |
49
-
50
- #### Actor → Business Flow
51
-
52
- | Check | Question |
53
- | -------------- | ----------------------------------------- |
54
- | Flow existence | Do all flows in "Authorized Flows" exist? |
55
- | Link validity | Do flow links resolve correctly? |
56
-
57
- #### Story → Screen
58
-
59
- | Check | Question |
60
- | ---------------- | ---------------------------------- |
61
- | Screen existence | Do all screens in story exist? |
62
- | Link validity | Do screen links resolve correctly? |
63
-
64
- #### Orphan Detection
65
-
66
- | Check | Question |
67
- | -------------- | ------------------------------------------ |
68
- | Orphan stories | Stories not linked from any business flow? |
69
- | Orphan screens | Screens not referenced by any story? |
70
- | Orphan actors | Actors not participating in any flow? |
71
-
72
- ### Step 3: Report
73
-
74
- ```markdown
75
- ## Documentation Parity Review Report
76
-
77
- **Application:** <app-name>
78
-
79
- ### Summary
80
-
81
- | Aspect | Status | Details |
82
- | --------------------- | -------- | ----------------- |
83
- | Business Flow → Story | ✅/⚠️/❌ | X/Y flows covered |
84
- | Actor → Flow | ✅/⚠️/❌ | All links valid |
85
- | Story → Screen | ✅/⚠️/❌ | X missing screens |
86
- | Orphan Detection | ✅/⚠️/❌ | N orphans found |
87
-
88
- ### Gaps Found
89
-
90
- - [ ] Missing: <item>
91
- - [ ] Broken link: <source> → <target>
92
- - [ ] Orphan: <file>
93
-
94
- ### Recommendations
95
-
96
- 1. Create missing: ...
97
- 2. Fix broken links: ...
98
- 3. Remove or link orphans: ...
99
- ```
100
-
101
- ## Link Format Reference
102
-
103
- | From | To | Format |
104
- | ------------- | ------------- | ----------------------------------- |
105
- | Business Flow | Story | `./story/<actor>--<name>.md` |
106
- | Business Flow | Actor | `../../actors/<actor>.md` |
107
- | Actor | Business Flow | `../business-flow/<flow>/README.md` |
108
- | Story | Screen | `../../../screen/<screen>.md` |
109
-
110
- ## Next Step
111
-
112
- After fixing all issues, use `/erp-kit-app-4-impl-spec` to create implementation specifications from screen and story documentation.
@@ -1,116 +0,0 @@
1
- ---
2
- name: erp-kit-app-4-impl-spec
3
- description: Create Tier 4 documentation (resolvers) for GraphQL operations. Use after completing documentation review with erp-kit-app-3-doc-review.
4
- ---
5
-
6
- # Implementation Spec Workflow
7
-
8
- Create Tier 4 documentation: GraphQL Resolvers (mutations and queries).
9
-
10
- ## Prerequisites
11
-
12
- Tier 1-3 documentation must exist:
13
-
14
- - `README.md` (requirements)
15
- - `docs/actors/*.md` (actors)
16
- - `docs/business-flow/*/README.md` (flows)
17
- - `docs/business-flow/*/story/*.md` (stories)
18
- - `docs/screen/*.md` (screens)
19
-
20
- ## Workflow Phases
21
-
22
- ```
23
- ANALYZE → IDENTIFY → CHECK MODULES → CREATE → VALIDATE
24
- ```
25
-
26
- ### Phase 1: Analyze
27
-
28
- Read all story files and identify:
29
-
30
- 1. **Operations** that modify data → mutations
31
- 2. **Operations** that retrieve data → queries
32
- 3. **Error scenarios** for each operation
33
-
34
- ### Phase 2: Identify
35
-
36
- Map stories to resolvers:
37
-
38
- | Story Element | Resolver Type |
39
- | -------------------- | ------------- |
40
- | Create/Update/Delete | Mutation |
41
- | View/List/Search | Query |
42
- | Real-time updates | Subscription |
43
-
44
- **Naming:** Use camelCase action-verb names: `create`, `update`, `delete`, `submit`, `approve`
45
-
46
- ### Phase 3: Check Module Dependencies
47
-
48
- Resolvers reference module commands. Before creating resolver docs, verify required modules exist.
49
-
50
- **Check existing modules:**
51
-
52
- ```bash
53
- ls packages/erp-kit/src/modules/
54
- ```
55
-
56
- **Check module commands:**
57
-
58
- ```bash
59
- ls packages/erp-kit/src/modules/<module-name>/docs/commands/
60
- ```
61
-
62
- **Map resolvers to modules:**
63
-
64
- | Resolver Operation | Typical Module |
65
- | ------------------ | --------------------- |
66
- | User invite/roles | `user-management` |
67
- | Supplier CRUD | `supplier-management` |
68
- | Document handling | `document-management` |
69
- | Task workflows | `task-management` |
70
-
71
- **If modules don't exist:**
72
-
73
- 1. **Identify needed modules** - Group resolver operations by domain
74
- 2. **Create module docs first** - Use `erp-kit-module-1-docs` skill
75
- 3. **Return to Tier 4** - After modules have documented commands
76
-
77
- ```
78
- Tier 4 blocked → Create modules → Return to Tier 4
79
- ```
80
-
81
- **Only reference existing module commands** in resolver documentation. Never reference modules or commands that don't exist.
82
-
83
- ### Phase 4: Create
84
-
85
- Generate documentation using `erp-kit` CLI:
86
-
87
- ```bash
88
- erp-kit scaffold --app-root examples resolver <app> <resolver-name>
89
- ```
90
-
91
- **Naming conventions:**
92
-
93
- - Filename must match H1 heading exactly (camelCase)
94
- - Action-focused names: `createSupplierInvitation.md`
95
-
96
- ### Phase 5: Validate
97
-
98
- ```bash
99
- pnpm run app:doc:check
100
- ```
101
-
102
- ## Schema Reference
103
-
104
- | Schema | Tier | Output Path |
105
- | -------------- | ---- | ------------------------- |
106
- | `resolver.yml` | 4 | `docs/resolver/<name>.md` |
107
-
108
- ## Tips
109
-
110
- - One story may require 1-3 resolvers
111
- - Group related operations logically
112
- - Document all error scenarios
113
-
114
- ## Next Step
115
-
116
- After completing Tier 4, use `/erp-kit-app-5-implementation` to implement backend resolvers and frontend pages.
@@ -1,149 +0,0 @@
1
- ---
2
- name: erp-kit-app-5-implementation
3
- description: Implement backend and frontend code for app-compose applications using erp-kit modules. Use after completing Tier 4 documentation (resolver specs) with erp-kit-app-4-impl-spec. Triggers when implementing resolvers, wiring modules, creating frontend pages, or building a full-stack application from documentation specs. Also use when the user mentions implementing an app, writing backend resolvers, creating frontend pages, or connecting erp-kit modules to an application.
4
- ---
5
-
6
- # App-Compose Implementation
7
-
8
- Implement backend resolvers and frontend pages for an app-compose application, driven by Tier 1-4 documentation (actors, business flows, stories, screens, resolver specs).
9
-
10
- ## When to Use
11
-
12
- - Implementing backend resolvers from resolver spec docs
13
- - Creating frontend pages from screen spec docs
14
- - Wiring erp-kit modules into an application
15
- - Building full-stack code for an app-compose application
16
-
17
- ## Prerequisites
18
-
19
- All four tiers of documentation must exist:
20
-
21
- - `README.md` — Application overview
22
- - `docs/actors/*.md` — Actor definitions
23
- - `docs/business-flow/*/README.md` + `story/*.md` — Business flows and user stories
24
- - `docs/screen/*.md` — Screen specifications (ListView, Form, DetailView)
25
- - `docs/resolver/*.md` — Resolver specifications (mutations, queries)
26
-
27
- ## Workflow
28
-
29
- ```
30
- ANALYZE DOCS → BACKEND SCAFFOLD → MODULE WIRING → CONFIG → RESOLVERS → GENERATED FILES → DEPLOY → FRONTEND SCAFFOLD → PAGES → VERIFY
31
- ```
32
-
33
- ### Phase 1: Analyze Documentation
34
-
35
- Read all resolver and screen specs to build a complete picture:
36
-
37
- 1. **Resolver docs** (`docs/resolver/*.md`) — Identify which module commands each resolver calls, what inputs/outputs it needs, and what errors it handles
38
- 2. **Screen docs** (`docs/screen/*.md`) — Identify screen types (ListView, Form, DetailView) and their fields/columns/actions
39
- 3. **Command source types** — For each module command the resolver calls, read the input type at `node_modules/@tailor-platform/erp-kit/src/modules/<module>/command/<commandName>.ts`. Do not invent fields that don't exist in the command, and preserve the required/optional distinction.
40
-
41
- Classify resolvers into two categories:
42
-
43
- | Category | Description | Implementation |
44
- | -------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
45
- | **Custom resolvers** | Mutations that call module commands (create, update, activate, deactivate, assign) | Write `createResolver()` files |
46
- | **Built-in queries** | List and get operations for reading data | Handled automatically by `gqlOperations: "query"` in config — no code needed |
47
-
48
- Prefer built-in queries over custom resolvers for list/get operations where possible.
49
-
50
- ### Phase 2: Backend Scaffold
51
-
52
- Set up the backend project structure and config files.
53
-
54
- **Read [backend reference](references/backend.md) § "Backend Scaffold" for the directory structure and boilerplate.**
55
-
56
- Key files: `package.json` (dependencies, scripts), `tsconfig.json` (path alias, types), `eslint.config.js`.
57
-
58
- ### Phase 3: Wire Modules (`src/modules.ts`)
59
-
60
- Create the module wiring file that composes all required erp-kit modules.
61
-
62
- **Read [backend reference](references/backend.md) § "Module Wiring" for the composition pattern.**
63
-
64
- Key points:
65
-
66
- - Use `defineXxxModule()` functions from `@tailor-platform/erp-kit/module`
67
- - Pass inter-module dependencies explicitly (e.g., item-management needs primitives' unit type and query)
68
- - Export `db`, `commands`, and `executors` for use in resolvers
69
-
70
- ### Phase 4: Configure Application (`tailor.config.ts`)
71
-
72
- **Read [backend reference](references/backend.md) § "Application Config" for the config pattern.**
73
-
74
- Key points:
75
-
76
- - Single DB namespace (`"main-db"`) with `gqlOperations: "query"` for automatic list/get queries
77
- - Resolver/executor discovery via glob patterns
78
- - Auth with OAuth2, DPoP, and user profile mapping
79
- - Generators for Kysely types and seed data
80
-
81
- ### Phase 5: Implement Backend Resolvers and Executors
82
-
83
- Write one file per resolver under `src/modules/<module-name>/resolvers/`, one per executor under `executors/`.
84
-
85
- **Read [backend reference](references/backend.md) § "Resolver Patterns" and "Executor Patterns".**
86
-
87
- Do not directly mutate module-owned tables via Kysely — always use module commands.
88
-
89
- ### Phase 6: Generated Files
90
-
91
- - **Kysely types** (`src/generated/kysely-tailordb.ts`) — Auto-generated by `pnpm generate` after deployment. Before deployment, create a minimal placeholder so the codebase typechecks.
92
- - **Seed data** (`seed/`) — `exec.mjs` runner + `data/*.jsonl` (records) and `data/*.schema.ts` (validation). Create seed records for initial data (permissions, roles, test users, etc.). Seeded users must have concrete permission keys required by the wired modules.
93
-
94
- ### Phase 7: Deploy Backend
95
-
96
- Frontend implementation requires a deployed backend (for GraphQL schema generation). Prompt the user to:
97
-
98
- 1. Create a workspace and configure `.env` (including `TAILOR_PLATFORM_WORKSPACE_ID`)
99
- 2. Run `pnpm deploy` and `pnpm generate`
100
- 3. Run `pnpm seed` if seed data was created
101
- 4. Retrieve OAuth2 client ID via `tailor-sdk oauth2client get default --json` for frontend `.env`
102
-
103
- Wait for the user to confirm deployment is complete before proceeding.
104
-
105
- ### Phase 8: Frontend Scaffold
106
-
107
- Set up the frontend project structure, config files, and generate GraphQL schema.
108
-
109
- **Read [frontend reference](references/frontend.md) § "Frontend Scaffold" for the directory structure, boilerplate, and schema generation.**
110
-
111
- Key files: `package.json`, `tsconfig.json`, `vite.config.ts`, `eslint.config.js`, UI components, `scripts/generate-graphql.mjs`. After scaffolding, run `pnpm generate` to fetch the GraphQL schema from the deployed backend.
112
-
113
- ### Phase 9: Implement Frontend Pages
114
-
115
- Create pages driven by screen spec docs. Each screen type has a standard implementation pattern.
116
-
117
- **Read [frontend reference](references/frontend.md) § "Frontend Pages" for the full pattern catalog.**
118
-
119
- Page types and their file structure:
120
-
121
- | Screen Type | Files |
122
- | ------------- | ------------------------------------------------------------------------------------------------ |
123
- | ListView | `page.tsx` + `components/<entity>-table.tsx` |
124
- | Form (create) | `create/page.tsx` + `create/components/create-<entity>-form.tsx` |
125
- | Form (edit) | `[id]/edit/page.tsx` + `[id]/edit/components/edit-<entity>-form.tsx` |
126
- | DetailView | `[id]/page.tsx` + `[id]/components/<entity>-detail.tsx` + `[id]/components/<entity>-actions.tsx` |
127
-
128
- Key frontend patterns:
129
-
130
- - **GraphQL fragments** — Each table/form/detail component exports its own fragment; page-level queries compose fragments
131
- - **gql.tada** — Type-safe GraphQL via `graphql()` from `@/graphql`
132
- - **React Hook Form + Zod** — Form validation with `zodResolver`
133
- - **urql** — `useQuery` for reads, `useMutation` for writes
134
- - **app-shell routing** — `Layout`, `Link`, `useParams`, `useNavigate` from `@tailor-platform/app-shell`
135
-
136
- ### Phase 10: Verify
137
-
138
- ```bash
139
- # Backend
140
- cd <app-root>/backend
141
- pnpm lint
142
- pnpm typecheck
143
-
144
- # Frontend
145
- cd <app-root>/frontend
146
- pnpm lint
147
- pnpm typecheck
148
- pnpm build
149
- ```
@@ -1,232 +0,0 @@
1
- # Backend Implementation Patterns
2
-
3
- ## Table of Contents
4
-
5
- - [Backend Scaffold](#backend-scaffold)
6
- - [Module Wiring](#module-wiring)
7
- - [Application Config](#application-config)
8
- - [Resolver Patterns](#resolver-patterns)
9
- - [Executor Patterns](#executor-pattern)
10
-
11
- ---
12
-
13
- ## Backend Scaffold
14
-
15
- ```
16
- backend/
17
- ├── src/
18
- │ ├── modules.ts # Module wiring
19
- │ ├── generated/kysely-tailordb.ts # Auto-generated (placeholder until deploy)
20
- │ └── modules/<module-name>/
21
- │ ├── resolvers/<name>.ts
22
- │ └── executors/<name>.ts
23
- ├── seed/ # Seed data scripts
24
- ├── package.json
25
- ├── tsconfig.json
26
- ├── eslint.config.js
27
- └── tailor.config.ts
28
- ```
29
-
30
- `package.json` key dependencies and scripts:
31
-
32
- ```json
33
- {
34
- "type": "module",
35
- "scripts": {
36
- "generate": "tailor-sdk generate",
37
- "deploy": "tailor-sdk apply --env-file-if-exists .env",
38
- "lint": "eslint --cache .",
39
- "typecheck": "tsc --noEmit",
40
- "seed": "node --env-file-if-exists=.env seed/exec.mjs"
41
- },
42
- "dependencies": {
43
- "@tailor-platform/erp-kit": "...",
44
- "@tailor-platform/function-kysely-tailordb": "...",
45
- "kysely": "..."
46
- },
47
- "devDependencies": {
48
- "@tailor-platform/sdk": "...",
49
- "@tailor-platform/function-types": "...",
50
- "typescript": "..."
51
- }
52
- }
53
- ```
54
-
55
- `tsconfig.json` — requires `@/*` path alias and `@tailor-platform/function-types` in types:
56
-
57
- ```json
58
- {
59
- "compilerOptions": {
60
- "target": "ES2022",
61
- "module": "ESNext",
62
- "moduleResolution": "bundler",
63
- "strict": true,
64
- "noEmit": true,
65
- "skipLibCheck": true,
66
- "types": ["node", "@tailor-platform/function-types"],
67
- "paths": { "@/*": ["./src/*"] }
68
- },
69
- "include": ["**/*.ts"]
70
- }
71
- ```
72
-
73
- ---
74
-
75
- ## Module Wiring
76
-
77
- `src/modules.ts` composes erp-kit modules and exports their parts for resolver use.
78
-
79
- ```ts
80
- import { db as field } from "@tailor-platform/sdk";
81
- import {
82
- definePrimitivesModule,
83
- defineUserManagementModule,
84
- defineItemManagementModule,
85
- } from "@tailor-platform/erp-kit/module";
86
-
87
- const primitivesModules = definePrimitivesModule({});
88
-
89
- const umModules = defineUserManagementModule({
90
- dbNamespace: "main-db",
91
- user: {
92
- fields: {
93
- /* custom fields */
94
- },
95
- additionalStatuses: ["SUSPENDED"],
96
- },
97
- });
98
-
99
- // Pass inter-module dependencies explicitly
100
- const imModules = defineItemManagementModule({
101
- primitives: {
102
- db: { unit: primitivesModules.db.unit },
103
- queries: { getUnit: primitivesModules.queries.getUnit },
104
- },
105
- });
106
-
107
- // Destructure db into individual table exports (required for DB scanner)
108
- export const { db: primitivesDb, commands: primitivesCommands } = primitivesModules;
109
- export const { uomCategory, unit, currency, exchangeRate } = primitivesDb;
110
-
111
- export const { db: umDb, executors: umExecutors, commands: umCommands } = umModules;
112
- export const { user, permission, role, userRole, rolePermission, auditEvent } = umDb;
113
-
114
- export const { db: imDb, commands: imCommands } = imModules;
115
- export const { item, taxonomyNode, itemTaxonomyAssignment } = imDb;
116
- ```
117
-
118
- Key conventions:
119
-
120
- - Prefix exports to avoid collisions (`umCommands`, `imCommands`, `primitivesCommands`)
121
- - Every module's `db` must be destructured into individual table exports — the DB scanner only picks up named exports
122
- - Extract individual executors for re-export in executor files
123
-
124
- ---
125
-
126
- ## Application Config
127
-
128
- `tailor.config.ts` defines the Tailor application configuration. Key structure:
129
-
130
- ```ts
131
- export default defineConfig({
132
- name: "<app-name>",
133
- cors: ["http://localhost:5173", website.url],
134
- db: {
135
- "main-db": {
136
- files: [`./src/modules.ts`],
137
- gqlOperations: "query",
138
- },
139
- },
140
- resolver: {
141
- "main-resolver": { files: [`./src/modules/**/resolvers/**/*.ts`] },
142
- },
143
- executor: { files: [`./src/modules/**/executors/**/*.ts`] },
144
- auth: auth,
145
- idp: [idp],
146
- staticWebsites: [website],
147
- });
148
- ```
149
-
150
- Key points:
151
-
152
- - `gqlOperations: "query"` — Auto-generates list/get GraphQL queries for all DB types
153
- - Glob patterns for resolver/executor discovery
154
- - See [SDK configuration docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/configuration.md) for full config options
155
-
156
- ### Auth configuration
157
-
158
- - Define IdP (`defineIdp`), Auth (`defineAuth`), and static website (`defineStaticWebSite`) using Tailor SDK
159
- - Prefer stable default naming: auth `default`, IdP `default`, OAuth2 client `default`
160
- - `userProfile.type` must reference the `user` DB type from `modules.ts`
161
- - `userProfile.usernameField`: stable unique field (e.g., `email`)
162
- - Include static website URL and localhost in CORS: `cors: ["http://localhost:5173", website.url]`
163
- - Frontend `VITE_TAILOR_CLIENT_ID` must come from `tailor-sdk oauth2client get default --json` — do not hardcode
164
-
165
- ---
166
-
167
- ## Resolver Patterns
168
-
169
- All resolvers export a default `createResolver()` from `@tailor-platform/sdk`.
170
-
171
- ### Verify command input types
172
-
173
- Before implementing a resolver, read the command's type definition:
174
-
175
- ```
176
- node_modules/@tailor-platform/erp-kit/src/modules/<module>/command/<commandName>.ts
177
- ```
178
-
179
- The command source is the ground truth. Do not invent fields that don't exist, and preserve the required/optional distinction.
180
-
181
- ### SDK type system
182
-
183
- See [Resolver docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/services/resolver.md) for the `t` namespace.
184
-
185
- `t.array()` and `t.boolean()` do **not exist**. Never attempt to use them.
186
-
187
- ### Command-based mutation
188
-
189
- The most common pattern. Key points:
190
-
191
- ```ts
192
- import { createContext } from "@tailor-platform/erp-kit/app";
193
-
194
- body: async (context) => {
195
- const db = getDB("main-db");
196
- const result = await imCommands.createItem(db, { ...context.input }, createContext(context));
197
- if (!result.ok) throw result.error;
198
- return { id: result.value.item.id, ... };
199
- },
200
- ```
201
-
202
- - `context.input.optionalField ?? undefined` — Convert null to undefined for command inputs
203
- - `result.value.entity.nullableField ?? ""` — Handle nullable return values
204
- - `createContext(context)` wraps the resolver context for erp-kit commands
205
- - `getDB("main-db")` — Namespace must match `tailor.config.ts`
206
-
207
- ### Error handling
208
-
209
- When the resolver spec documents specific error codes, use `result.error.code` to switch:
210
-
211
- ```ts
212
- if (!result.ok) {
213
- switch (result.error.code) {
214
- case "USER_NOT_FOUND":
215
- throw new Error(`User ${context.input.userId} not found`);
216
- // ...
217
- }
218
- }
219
- ```
220
-
221
- Do not directly mutate module-owned tables via Kysely — always use module commands.
222
-
223
- ---
224
-
225
- ## Executor Patterns
226
-
227
- Executors re-export module-provided event handlers. One file per executor, no custom logic:
228
-
229
- ```ts
230
- import { rolePermissionCreated } from "@/modules";
231
- export default rolePermissionCreated;
232
- ```