@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,22 +1,16 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { createMockDb } from "../../testing/index";
3
- import { type CommandContext } from "../../shared/internal";
4
- import { DB } from "../generated/kysely-tailordb";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import { Transaction } from "../generated/kysely-tailordb";
5
4
  import { InvalidStateTransitionError, ItemNotFoundError } from "../lib/errors.generated";
6
5
  import { baseActiveItem, baseDraftItem, baseInactiveItem } from "../testing/fixtures";
7
6
  import { run } from "./reactivateItem";
8
7
 
9
8
  describe("reactivateItem", () => {
10
- const ctx: CommandContext = {
11
- actorId: "test-actor",
12
- permissions: ["item-management:reactivateItem"],
13
- };
14
-
15
9
  it("returns error when item does not exist", async () => {
16
- const { db, spies } = createMockDb<DB>();
10
+ const { db, spies } = createMockDb<Transaction>();
17
11
  spies.select.mockReturnValue(undefined);
18
12
 
19
- const result = await run(db, { id: "nonexistent" }, ctx);
13
+ const result = await run(db, { id: "nonexistent" });
20
14
  expect(result.ok).toBe(false);
21
15
  if (!result.ok) {
22
16
  expect(result.error).toBeInstanceOf(ItemNotFoundError);
@@ -24,10 +18,10 @@ describe("reactivateItem", () => {
24
18
  });
25
19
 
26
20
  it("returns error when item is not INACTIVE", async () => {
27
- const { db, spies } = createMockDb<DB>();
21
+ const { db, spies } = createMockDb<Transaction>();
28
22
  spies.select.mockReturnValueOnce(baseActiveItem);
29
23
 
30
- const result = await run(db, { id: baseActiveItem.id }, ctx);
24
+ const result = await run(db, { id: baseActiveItem.id });
31
25
  expect(result.ok).toBe(false);
32
26
  if (!result.ok) {
33
27
  expect(result.error).toBeInstanceOf(InvalidStateTransitionError);
@@ -35,10 +29,10 @@ describe("reactivateItem", () => {
35
29
  });
36
30
 
37
31
  it("returns error when item is DRAFT", async () => {
38
- const { db, spies } = createMockDb<DB>();
32
+ const { db, spies } = createMockDb<Transaction>();
39
33
  spies.select.mockReturnValueOnce(baseDraftItem);
40
34
 
41
- const result = await run(db, { id: baseDraftItem.id }, ctx);
35
+ const result = await run(db, { id: baseDraftItem.id });
42
36
  expect(result.ok).toBe(false);
43
37
  if (!result.ok) {
44
38
  expect(result.error).toBeInstanceOf(InvalidStateTransitionError);
@@ -46,12 +40,12 @@ describe("reactivateItem", () => {
46
40
  });
47
41
 
48
42
  it("reactivates an INACTIVE item", async () => {
49
- const { db, spies } = createMockDb<DB>();
43
+ const { db, spies } = createMockDb<Transaction>();
50
44
  const reactivatedItem = { ...baseInactiveItem, status: "ACTIVE" };
51
45
  spies.select.mockReturnValueOnce(baseInactiveItem);
52
46
  spies.update.mockReturnValue(reactivatedItem);
53
47
 
54
- const result = await run(db, { id: baseInactiveItem.id }, ctx);
48
+ const result = await run(db, { id: baseInactiveItem.id });
55
49
 
56
50
  expect(result.ok).toBe(true);
57
51
  if (result.ok) {
@@ -61,12 +55,12 @@ describe("reactivateItem", () => {
61
55
  });
62
56
 
63
57
  it("reactivates from custom status when from is overridden", async () => {
64
- const { db, spies } = createMockDb<DB>();
58
+ const { db, spies } = createMockDb<Transaction>();
65
59
  const reactivatedItem = { ...baseDraftItem, status: "ACTIVE" };
66
60
  spies.select.mockReturnValueOnce(baseDraftItem);
67
61
  spies.update.mockReturnValue(reactivatedItem);
68
62
 
69
- const result = await run(db, { id: baseDraftItem.id, from: ["INACTIVE", "DRAFT"] }, ctx);
63
+ const result = await run(db, { id: baseDraftItem.id, from: ["INACTIVE", "DRAFT"] });
70
64
 
71
65
  expect(result.ok).toBe(true);
72
66
  if (result.ok) {
@@ -1,7 +1,6 @@
1
- import { ok, err, type CommandContext } from "../../shared/internal";
2
- import { DB } from "../generated/kysely-tailordb";
1
+ import { ok, err } from "../../../shared";
2
+ import { Transaction } from "../generated/kysely-tailordb";
3
3
  import { InvalidStateTransitionError, ItemNotFoundError } from "../lib/errors.generated";
4
- import { getItem } from "../query/getItem.generated";
5
4
 
6
5
  export interface ReactivateItemInput {
7
6
  id: string;
@@ -14,11 +13,16 @@ export interface ReactivateItemInput {
14
13
  * Transitions an item from INACTIVE back to ACTIVE status,
15
14
  * restoring a previously discontinued SKU for transactions.
16
15
  */
17
- export async function run(db: DB, input: ReactivateItemInput, ctx: CommandContext) {
16
+ export async function run(db: Transaction, input: ReactivateItemInput) {
18
17
  const { id, from } = input;
19
18
 
20
19
  // 1. Check item exists
21
- const { item } = await getItem(db, { id }, ctx);
20
+ const item = await db
21
+ .selectFrom("Item")
22
+ .selectAll()
23
+ .where("id", "=", id)
24
+ .forUpdate()
25
+ .executeTakeFirst();
22
26
 
23
27
  if (!item) {
24
28
  return err(new ItemNotFoundError(id));
@@ -1,5 +1,5 @@
1
1
  // @generated — do not edit
2
- import { defineCommand } from "../../shared/internal";
2
+ import { defineCommand } from "../../../shared";
3
3
  import { permissions } from "../lib/permissions.generated";
4
4
  import { run } from "./removeItemFromTaxonomy";
5
5
 
@@ -1,22 +1,16 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { createMockDb } from "../../testing/index";
3
- import { type CommandContext } from "../../shared/internal";
4
- import { DB } from "../generated/kysely-tailordb";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import { Transaction } from "../generated/kysely-tailordb";
5
4
  import { AssignmentNotFoundError } from "../lib/errors.generated";
6
5
  import { baseAssignment } from "../testing/fixtures";
7
6
  import { run } from "./removeItemFromTaxonomy";
8
7
 
9
8
  describe("removeItemFromTaxonomy", () => {
10
- const ctx: CommandContext = {
11
- actorId: "test-actor",
12
- permissions: ["item-management:removeItemFromTaxonomy"],
13
- };
14
-
15
9
  it("returns error when assignment does not exist", async () => {
16
- const { db, spies } = createMockDb<DB>();
10
+ const { db, spies } = createMockDb<Transaction>();
17
11
  spies.select.mockReturnValueOnce(undefined);
18
12
 
19
- const result = await run(db, { itemId: "item-99", taxonomyNodeId: "node-99" }, ctx);
13
+ const result = await run(db, { itemId: "item-99", taxonomyNodeId: "node-99" });
20
14
  expect(result.ok).toBe(false);
21
15
  if (!result.ok) {
22
16
  expect(result.error).toBeInstanceOf(AssignmentNotFoundError);
@@ -24,15 +18,14 @@ describe("removeItemFromTaxonomy", () => {
24
18
  });
25
19
 
26
20
  it("removes assignment successfully", async () => {
27
- const { db, spies } = createMockDb<DB>();
21
+ const { db, spies } = createMockDb<Transaction>();
28
22
  spies.select.mockReturnValueOnce(baseAssignment);
29
23
  spies.delete.mockReturnValue(undefined);
30
24
 
31
- const result = await run(
32
- db,
33
- { itemId: baseAssignment.itemId, taxonomyNodeId: baseAssignment.taxonomyNodeId },
34
- ctx,
35
- );
25
+ const result = await run(db, {
26
+ itemId: baseAssignment.itemId,
27
+ taxonomyNodeId: baseAssignment.taxonomyNodeId,
28
+ });
36
29
 
37
30
  expect(result.ok).toBe(true);
38
31
  if (result.ok) {
@@ -1,7 +1,6 @@
1
- import { ok, err, type CommandContext } from "../../shared/internal";
2
- import { DB } from "../generated/kysely-tailordb";
1
+ import { ok, err } from "../../../shared";
2
+ import { Transaction } from "../generated/kysely-tailordb";
3
3
  import { AssignmentNotFoundError } from "../lib/errors.generated";
4
- import { getItemTaxonomyAssignment } from "../query/getItemTaxonomyAssignment.generated";
5
4
 
6
5
  export interface RemoveItemFromTaxonomyInput {
7
6
  itemId: string;
@@ -13,11 +12,17 @@ export interface RemoveItemFromTaxonomyInput {
13
12
  *
14
13
  * Removes the link between an item and a taxonomy node.
15
14
  */
16
- export async function run(db: DB, input: RemoveItemFromTaxonomyInput, ctx: CommandContext) {
15
+ export async function run(db: Transaction, input: RemoveItemFromTaxonomyInput) {
17
16
  const { itemId, taxonomyNodeId } = input;
18
17
 
19
- // 1. Check assignment exists
20
- const { assignment } = await getItemTaxonomyAssignment(db, { itemId, taxonomyNodeId }, ctx);
18
+ // 1. Check assignment exists (read-then-delete — lock)
19
+ const assignment = await db
20
+ .selectFrom("ItemTaxonomyAssignment")
21
+ .selectAll()
22
+ .where("itemId", "=", itemId)
23
+ .where("taxonomyNodeId", "=", taxonomyNodeId)
24
+ .forUpdate()
25
+ .executeTakeFirst();
21
26
 
22
27
  if (!assignment) {
23
28
  return err(new AssignmentNotFoundError(`${itemId} in ${taxonomyNodeId}`));
@@ -1,5 +1,5 @@
1
1
  // @generated — do not edit
2
- import { defineCommand } from "../../shared/internal";
2
+ import { defineCommand } from "../../../shared";
3
3
  import { permissions } from "../lib/permissions.generated";
4
4
  import { run } from "./updateItem";
5
5
 
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { createMockDb } from "../../testing/index";
3
- import { type CommandContext } from "../../shared/internal";
4
- import { DB } from "../generated/kysely-tailordb";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import { type CommandContext } from "../../../shared";
4
+ import { Transaction } from "../generated/kysely-tailordb";
5
5
  import {
6
6
  DuplicateBarcodeError,
7
7
  UnitNotFoundError,
@@ -11,7 +11,7 @@ import {
11
11
  UomLockedError,
12
12
  } from "../lib/errors.generated";
13
13
  import { baseActiveItem, baseDraftItem, baseInactiveItem } from "../testing/fixtures";
14
- import { getUnit } from "../../primitives";
14
+ import { getUnit } from "../../primitives/query/getUnit.generated";
15
15
  import { run } from "./updateItem";
16
16
 
17
17
  describe("updateItem", () => {
@@ -21,7 +21,7 @@ describe("updateItem", () => {
21
21
  };
22
22
 
23
23
  it("returns error when item does not exist", async () => {
24
- const { db, spies } = createMockDb<DB>();
24
+ const { db, spies } = createMockDb<Transaction>();
25
25
  spies.select.mockReturnValue(undefined);
26
26
 
27
27
  const result = await run(db, { id: "nonexistent", name: "New Name" }, ctx, { getUnit });
@@ -32,7 +32,7 @@ describe("updateItem", () => {
32
32
  });
33
33
 
34
34
  it("returns error when attempting to change SKU", async () => {
35
- const { db, spies } = createMockDb<DB>();
35
+ const { db, spies } = createMockDb<Transaction>();
36
36
  spies.select.mockReturnValueOnce(baseDraftItem);
37
37
 
38
38
  const result = await run(db, { id: baseDraftItem.id, sku: "NEW-SKU" }, ctx, { getUnit });
@@ -43,7 +43,7 @@ describe("updateItem", () => {
43
43
  });
44
44
 
45
45
  it("returns error when no fields to update", async () => {
46
- const { db, spies } = createMockDb<DB>();
46
+ const { db, spies } = createMockDb<Transaction>();
47
47
  spies.select.mockReturnValueOnce(baseDraftItem);
48
48
 
49
49
  const result = await run(db, { id: baseDraftItem.id }, ctx, { getUnit });
@@ -54,7 +54,7 @@ describe("updateItem", () => {
54
54
  });
55
55
 
56
56
  it("returns error when barcode is duplicate", async () => {
57
- const { db, spies } = createMockDb<DB>();
57
+ const { db, spies } = createMockDb<Transaction>();
58
58
  spies.select
59
59
  .mockReturnValueOnce(baseDraftItem) // Item lookup
60
60
  .mockReturnValueOnce(baseActiveItem); // Barcode already taken
@@ -67,7 +67,7 @@ describe("updateItem", () => {
67
67
  });
68
68
 
69
69
  it("returns error when changing UoM on non-DRAFT item", async () => {
70
- const { db, spies } = createMockDb<DB>();
70
+ const { db, spies } = createMockDb<Transaction>();
71
71
  spies.select.mockReturnValueOnce(baseActiveItem);
72
72
 
73
73
  const result = await run(db, { id: baseActiveItem.id, unitId: "unit-g" }, ctx, { getUnit });
@@ -78,7 +78,7 @@ describe("updateItem", () => {
78
78
  });
79
79
 
80
80
  it("returns error when changing UoM on INACTIVE item", async () => {
81
- const { db, spies } = createMockDb<DB>();
81
+ const { db, spies } = createMockDb<Transaction>();
82
82
  spies.select.mockReturnValueOnce(baseInactiveItem);
83
83
 
84
84
  const result = await run(db, { id: baseInactiveItem.id, unitId: "unit-g" }, ctx, { getUnit });
@@ -89,7 +89,7 @@ describe("updateItem", () => {
89
89
  });
90
90
 
91
91
  it("returns error when new UoM does not exist", async () => {
92
- const { db, spies } = createMockDb<DB>();
92
+ const { db, spies } = createMockDb<Transaction>();
93
93
  spies.select
94
94
  .mockReturnValueOnce(baseDraftItem) // Item lookup
95
95
  .mockReturnValueOnce(undefined); // UoM not found
@@ -104,7 +104,7 @@ describe("updateItem", () => {
104
104
  });
105
105
 
106
106
  it("updates name in any status", async () => {
107
- const { db, spies } = createMockDb<DB>();
107
+ const { db, spies } = createMockDb<Transaction>();
108
108
  const updatedItem = { ...baseActiveItem, name: "Updated Name" };
109
109
  spies.select.mockReturnValueOnce(baseActiveItem);
110
110
  spies.update.mockReturnValue(updatedItem);
@@ -119,7 +119,7 @@ describe("updateItem", () => {
119
119
  });
120
120
 
121
121
  it("updates barcode in any status", async () => {
122
- const { db, spies } = createMockDb<DB>();
122
+ const { db, spies } = createMockDb<Transaction>();
123
123
  const updatedItem = { ...baseActiveItem, barcode: "NEW-BAR" };
124
124
  spies.select
125
125
  .mockReturnValueOnce(baseActiveItem) // Item lookup
@@ -135,7 +135,7 @@ describe("updateItem", () => {
135
135
  });
136
136
 
137
137
  it("clears barcode by setting to null", async () => {
138
- const { db, spies } = createMockDb<DB>();
138
+ const { db, spies } = createMockDb<Transaction>();
139
139
  const updatedItem = { ...baseActiveItem, barcode: null };
140
140
  spies.select.mockReturnValueOnce(baseActiveItem);
141
141
  spies.update.mockReturnValue(updatedItem);
@@ -149,7 +149,7 @@ describe("updateItem", () => {
149
149
  });
150
150
 
151
151
  it("updates UoM in DRAFT status", async () => {
152
- const { db, spies } = createMockDb<DB>();
152
+ const { db, spies } = createMockDb<Transaction>();
153
153
  const activeUnit = { id: "unit-g", isActive: true };
154
154
  const updatedItem = { ...baseDraftItem, unitId: "unit-g" };
155
155
  spies.select
@@ -166,7 +166,7 @@ describe("updateItem", () => {
166
166
  });
167
167
 
168
168
  it("passes custom fields through to set", async () => {
169
- const { db, spies } = createMockDb<DB>();
169
+ const { db, spies } = createMockDb<Transaction>();
170
170
  const updatedItem = { ...baseDraftItem, priority: 10 };
171
171
  spies.select.mockReturnValueOnce(baseDraftItem);
172
172
  spies.update.mockReturnValue(updatedItem);
@@ -1,5 +1,5 @@
1
- import { ok, err, type CommandContext } from "../../shared/internal";
2
- import { DB } from "../generated/kysely-tailordb";
1
+ import { ok, err, type CommandContext } from "../../../shared";
2
+ import { Transaction } from "../generated/kysely-tailordb";
3
3
  import {
4
4
  DuplicateBarcodeError,
5
5
  UnitNotFoundError,
@@ -8,7 +8,6 @@ import {
8
8
  SkuImmutableError,
9
9
  UomLockedError,
10
10
  } from "../lib/errors.generated";
11
- import { getItem } from "../query/getItem.generated";
12
11
  import { type PrimitivesQueries } from "../module";
13
12
 
14
13
  export interface UpdateItemInput {
@@ -26,7 +25,7 @@ export interface UpdateItemInput {
26
25
  * UoM can only be changed in DRAFT status.
27
26
  */
28
27
  export async function run<CF extends Record<string, unknown>>(
29
- db: DB,
28
+ db: Transaction,
30
29
  input: UpdateItemInput & Partial<CF>,
31
30
  ctx: CommandContext,
32
31
  primitivesQueries?: Pick<PrimitivesQueries, "getUnit">,
@@ -34,7 +33,12 @@ export async function run<CF extends Record<string, unknown>>(
34
33
  const { id, sku, name, barcode, unitId, ...customFields } = input;
35
34
 
36
35
  // 1. Check item exists
37
- const { item } = await getItem(db, { id }, ctx);
36
+ const item = await db
37
+ .selectFrom("Item")
38
+ .selectAll()
39
+ .where("id", "=", id)
40
+ .forUpdate()
41
+ .executeTakeFirst();
38
42
 
39
43
  if (!item) {
40
44
  return err(new ItemNotFoundError(id));
@@ -62,6 +66,7 @@ export async function run<CF extends Record<string, unknown>>(
62
66
  .selectAll()
63
67
  .where("barcode", "=", barcode)
64
68
  .where("id", "!=", id)
69
+ .forUpdate()
65
70
  .executeTakeFirst();
66
71
 
67
72
  if (existingBarcode) {
@@ -76,7 +81,7 @@ export async function run<CF extends Record<string, unknown>>(
76
81
  }
77
82
 
78
83
  // Validate UoM exists and is active
79
- const { unit } = await primitivesQueries!.getUnit(db, { id: unitId }, ctx);
84
+ const { unit } = (await primitivesQueries!.getUnit(db, { id: unitId }, ctx)).value;
80
85
 
81
86
  if (!unit?.isActive) {
82
87
  return err(new UnitNotFoundError(unitId));
@@ -1,5 +1,5 @@
1
1
  // @generated — do not edit
2
- import { defineCommand } from "../../shared/internal";
2
+ import { defineCommand } from "../../../shared";
3
3
  import { permissions } from "../lib/permissions.generated";
4
4
  import { run } from "./updateTaxonomyNode";
5
5
 
@@ -1,7 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { createMockDb } from "../../testing/index";
3
- import { type CommandContext } from "../../shared/internal";
4
- import { DB } from "../generated/kysely-tailordb";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import { Transaction } from "../generated/kysely-tailordb";
5
4
  import {
6
5
  CodeImmutableError,
7
6
  MissingRequiredFieldsError,
@@ -11,16 +10,11 @@ import { baseRootNode } from "../testing/fixtures";
11
10
  import { run } from "./updateTaxonomyNode";
12
11
 
13
12
  describe("updateTaxonomyNode", () => {
14
- const ctx: CommandContext = {
15
- actorId: "test-actor",
16
- permissions: ["item-management:updateTaxonomyNode"],
17
- };
18
-
19
13
  it("returns error when node does not exist", async () => {
20
- const { db, spies } = createMockDb<DB>();
14
+ const { db, spies } = createMockDb<Transaction>();
21
15
  spies.select.mockReturnValue(undefined);
22
16
 
23
- const result = await run(db, { id: "nonexistent", name: "New Name" }, ctx);
17
+ const result = await run(db, { id: "nonexistent", name: "New Name" });
24
18
  expect(result.ok).toBe(false);
25
19
  if (!result.ok) {
26
20
  expect(result.error).toBeInstanceOf(NodeNotFoundError);
@@ -28,10 +22,10 @@ describe("updateTaxonomyNode", () => {
28
22
  });
29
23
 
30
24
  it("returns error when attempting to change code", async () => {
31
- const { db, spies } = createMockDb<DB>();
25
+ const { db, spies } = createMockDb<Transaction>();
32
26
  spies.select.mockReturnValueOnce(baseRootNode);
33
27
 
34
- const result = await run(db, { id: baseRootNode.id, code: "NEW-CODE" }, ctx);
28
+ const result = await run(db, { id: baseRootNode.id, code: "NEW-CODE" });
35
29
  expect(result.ok).toBe(false);
36
30
  if (!result.ok) {
37
31
  expect(result.error).toBeInstanceOf(CodeImmutableError);
@@ -39,10 +33,10 @@ describe("updateTaxonomyNode", () => {
39
33
  });
40
34
 
41
35
  it("returns error when name is empty", async () => {
42
- const { db, spies } = createMockDb<DB>();
36
+ const { db, spies } = createMockDb<Transaction>();
43
37
  spies.select.mockReturnValueOnce(baseRootNode);
44
38
 
45
- const result = await run(db, { id: baseRootNode.id, name: "" }, ctx);
39
+ const result = await run(db, { id: baseRootNode.id, name: "" });
46
40
  expect(result.ok).toBe(false);
47
41
  if (!result.ok) {
48
42
  expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
@@ -50,10 +44,10 @@ describe("updateTaxonomyNode", () => {
50
44
  });
51
45
 
52
46
  it("returns error when name is not provided", async () => {
53
- const { db, spies } = createMockDb<DB>();
47
+ const { db, spies } = createMockDb<Transaction>();
54
48
  spies.select.mockReturnValueOnce(baseRootNode);
55
49
 
56
- const result = await run(db, { id: baseRootNode.id }, ctx);
50
+ const result = await run(db, { id: baseRootNode.id });
57
51
  expect(result.ok).toBe(false);
58
52
  if (!result.ok) {
59
53
  expect(result.error).toBeInstanceOf(MissingRequiredFieldsError);
@@ -61,12 +55,12 @@ describe("updateTaxonomyNode", () => {
61
55
  });
62
56
 
63
57
  it("updates node name", async () => {
64
- const { db, spies } = createMockDb<DB>();
58
+ const { db, spies } = createMockDb<Transaction>();
65
59
  const updatedNode = { ...baseRootNode, name: "Consumer Electronics" };
66
60
  spies.select.mockReturnValueOnce(baseRootNode);
67
61
  spies.update.mockReturnValue(updatedNode);
68
62
 
69
- const result = await run(db, { id: baseRootNode.id, name: "Consumer Electronics" }, ctx);
63
+ const result = await run(db, { id: baseRootNode.id, name: "Consumer Electronics" });
70
64
 
71
65
  expect(result.ok).toBe(true);
72
66
  if (result.ok) {
@@ -76,12 +70,12 @@ describe("updateTaxonomyNode", () => {
76
70
  });
77
71
 
78
72
  it("passes custom fields through to set", async () => {
79
- const { db, spies } = createMockDb<DB>();
73
+ const { db, spies } = createMockDb<Transaction>();
80
74
  const updatedNode = { ...baseRootNode, sortOrder: 5 };
81
75
  spies.select.mockReturnValueOnce(baseRootNode);
82
76
  spies.update.mockReturnValue(updatedNode);
83
77
 
84
- await run(db, { id: baseRootNode.id, name: "Electronics", sortOrder: 5 }, ctx);
78
+ await run(db, { id: baseRootNode.id, name: "Electronics", sortOrder: 5 });
85
79
 
86
80
  expect(spies.set).toHaveBeenNthCalledWith(1, expect.objectContaining({ sortOrder: 5 }));
87
81
  });
@@ -1,11 +1,10 @@
1
- import { ok, err, type CommandContext } from "../../shared/internal";
2
- import { DB } from "../generated/kysely-tailordb";
1
+ import { ok, err } from "../../../shared";
2
+ import { Transaction } from "../generated/kysely-tailordb";
3
3
  import {
4
4
  CodeImmutableError,
5
5
  MissingRequiredFieldsError,
6
6
  NodeNotFoundError,
7
7
  } from "../lib/errors.generated";
8
- import { getTaxonomyNode } from "../query/getTaxonomyNode.generated";
9
8
 
10
9
  export interface UpdateTaxonomyNodeInput {
11
10
  id: string;
@@ -20,14 +19,18 @@ export interface UpdateTaxonomyNodeInput {
20
19
  * Node code is immutable.
21
20
  */
22
21
  export async function run<CF extends Record<string, unknown>>(
23
- db: DB,
22
+ db: Transaction,
24
23
  input: UpdateTaxonomyNodeInput & Partial<CF>,
25
- ctx: CommandContext,
26
24
  ) {
27
25
  const { id, code, name, ...customFields } = input;
28
26
 
29
27
  // 1. Check node exists
30
- const { node } = await getTaxonomyNode(db, { id }, ctx);
28
+ const node = await db
29
+ .selectFrom("TaxonomyNode")
30
+ .selectAll()
31
+ .where("id", "=", id)
32
+ .forUpdate()
33
+ .executeTakeFirst();
31
34
 
32
35
  if (!node) {
33
36
  return err(new NodeNotFoundError(id));
@@ -30,3 +30,11 @@ flowchart TD
30
30
 
31
31
  - **ITEM_NOT_FOUND**: Specified item ID does not exist
32
32
  - **INVALID_STATE_TRANSITION**: Item is not in DRAFT status
33
+
34
+ ## Test Cases
35
+
36
+ - returns error when item does not exist
37
+ - returns error when item is not DRAFT
38
+ - returns error when item is INACTIVE
39
+ - activates a DRAFT item
40
+ - activates from custom status when from is overridden
@@ -36,3 +36,10 @@ flowchart TD
36
36
  - **ITEM_NOT_FOUND**: Specified item ID does not exist
37
37
  - **NODE_NOT_FOUND**: Specified taxonomy node ID does not exist
38
38
  - **DUPLICATE_ASSIGNMENT**: Item is already assigned to this taxonomy node
39
+
40
+ ## Test Cases
41
+
42
+ - returns error when item does not exist
43
+ - returns error when node does not exist
44
+ - returns error when assignment already exists
45
+ - creates assignment successfully
@@ -42,3 +42,13 @@ flowchart TD
42
42
  - **DUPLICATE_SKU**: An item with the same SKU already exists
43
43
  - **DUPLICATE_BARCODE**: An item with the same barcode already exists
44
44
  - **UNIT_NOT_FOUND**: Referenced unit does not exist or is inactive
45
+
46
+ ## Test Cases
47
+
48
+ - returns error when SKU already exists
49
+ - returns error when barcode already exists
50
+ - returns error when UoM does not exist
51
+ - creates item in DRAFT status by default
52
+ - creates item in ACTIVE status
53
+ - skips barcode uniqueness check when barcode is not provided
54
+ - passes custom fields through to insert
@@ -42,3 +42,12 @@ flowchart TD
42
42
  - **DUPLICATE_NODE_CODE**: A node with the same code already exists
43
43
  - **PARENT_NODE_NOT_FOUND**: Specified parent node ID does not exist
44
44
  - **MAX_DEPTH_EXCEEDED**: Adding this child would exceed the configurable tree depth limit
45
+
46
+ ## Test Cases
47
+
48
+ - returns error when code already exists
49
+ - returns error when parent does not exist
50
+ - returns error when max depth would be exceeded
51
+ - creates a root node
52
+ - creates a child node under existing parent
53
+ - passes custom fields through to insert
@@ -32,3 +32,11 @@ flowchart TD
32
32
 
33
33
  - **ITEM_NOT_FOUND**: Specified item ID does not exist
34
34
  - **INVALID_STATE_TRANSITION**: Item is not in ACTIVE status
35
+
36
+ ## Test Cases
37
+
38
+ - returns error when item does not exist
39
+ - returns error when item is not ACTIVE
40
+ - returns error when item is already INACTIVE
41
+ - deactivates an ACTIVE item
42
+ - deactivates from custom status when from is overridden
@@ -33,3 +33,10 @@ flowchart TD
33
33
 
34
34
  - **ITEM_NOT_FOUND**: Specified item ID does not exist
35
35
  - **DELETE_NON_DRAFT**: Item is in ACTIVE or INACTIVE status — only DRAFT items can be deleted
36
+
37
+ ## Test Cases
38
+
39
+ - returns error when item does not exist
40
+ - returns error when item is ACTIVE
41
+ - returns error when item is INACTIVE
42
+ - deletes a DRAFT item and removes taxonomy assignments
@@ -37,3 +37,10 @@ flowchart TD
37
37
  - **NODE_NOT_FOUND**: Specified node ID does not exist
38
38
  - **NODE_HAS_CHILDREN**: Node has one or more child nodes — children must be moved or deleted first
39
39
  - **NODE_HAS_ASSIGNMENTS**: Node has one or more item assignments — assignments must be removed first
40
+
41
+ ## Test Cases
42
+
43
+ - returns error when node does not exist
44
+ - returns error when node has children
45
+ - returns error when node has item assignments
46
+ - deletes a leaf node with no assignments
@@ -43,3 +43,13 @@ flowchart TD
43
43
  - **PARENT_NODE_NOT_FOUND**: Specified new parent node ID does not exist
44
44
  - **CIRCULAR_REFERENCE**: New parent is the node itself or one of its descendants
45
45
  - **MAX_DEPTH_EXCEEDED**: Moving this subtree would exceed the configurable tree depth limit
46
+
47
+ ## Test Cases
48
+
49
+ - returns error when node does not exist
50
+ - returns error when new parent does not exist
51
+ - returns error when moving node under itself
52
+ - returns error when moving node under its descendant
53
+ - promotes node to root by setting parent to null
54
+ - moves node to different parent
55
+ - returns error when subtree depth + new parent depth exceeds maxDepth
@@ -32,3 +32,11 @@ flowchart TD
32
32
 
33
33
  - **ITEM_NOT_FOUND**: Specified item ID does not exist
34
34
  - **INVALID_STATE_TRANSITION**: Item is not in INACTIVE status
35
+
36
+ ## Test Cases
37
+
38
+ - returns error when item does not exist
39
+ - returns error when item is not INACTIVE
40
+ - returns error when item is DRAFT
41
+ - reactivates an INACTIVE item
42
+ - reactivates from custom status when from is overridden
@@ -28,3 +28,8 @@ flowchart TD
28
28
  ## Error Scenarios
29
29
 
30
30
  - **ASSIGNMENT_NOT_FOUND**: No assignment exists for the specified item and taxonomy node combination
31
+
32
+ ## Test Cases
33
+
34
+ - returns error when assignment does not exist
35
+ - removes assignment successfully