@tailor-platform/erp-kit 0.1.1 → 0.2.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 (342) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +158 -62
  3. package/dist/cli.js +1010 -270
  4. package/package.json +11 -8
  5. package/schemas/module/command.yml +1 -0
  6. package/schemas/module/model.yml +14 -0
  7. package/schemas/module/query.yml +53 -0
  8. package/skills/{app-compose-1-requirement-analysis → erp-kit-app-1-requirements}/SKILL.md +2 -2
  9. package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/SKILL.md +3 -3
  10. package/skills/{app-compose-3-doc-review → erp-kit-app-3-doc-review}/SKILL.md +2 -2
  11. package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/SKILL.md +3 -3
  12. package/skills/{app-compose-5-design-mock-review → erp-kit-app-5-design-review}/SKILL.md +4 -4
  13. package/skills/{app-compose-6-implementation-spec → erp-kit-app-6-impl-spec}/SKILL.md +3 -3
  14. package/skills/{mock-scenario → erp-kit-mock-scenario}/SKILL.md +1 -1
  15. package/skills/{1-module-docs → erp-kit-module-1-docs}/SKILL.md +2 -2
  16. package/skills/{2-module-feature-breakdown → erp-kit-module-2-feature-breakdown}/SKILL.md +13 -9
  17. package/skills/erp-kit-module-2-feature-breakdown/references/naming.md +59 -0
  18. package/skills/{3-module-doc-review → erp-kit-module-3-doc-review}/SKILL.md +83 -25
  19. package/skills/erp-kit-module-4-tdd/SKILL.md +94 -0
  20. package/skills/erp-kit-module-4-tdd/references/cross-module-dependency.md +133 -0
  21. package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/db-relations.md +5 -1
  22. package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/exports.md +1 -1
  23. package/skills/erp-kit-module-4-tdd/references/generated-code.md +32 -0
  24. package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/SKILL.md +46 -44
  25. package/skills/erp-kit-module-5-impl-review/references/commands.md +62 -0
  26. package/skills/erp-kit-module-5-impl-review/references/errors.md +10 -0
  27. package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/references/testing.md +1 -1
  28. package/skills/erp-kit-module-shared/SKILL.md +16 -0
  29. package/skills/erp-kit-module-shared/references/commands.md +203 -0
  30. package/skills/erp-kit-module-shared/references/errors.md +35 -0
  31. package/skills/erp-kit-module-shared/references/queries.md +168 -0
  32. package/skills/erp-kit-module-shared/references/structure.md +36 -0
  33. package/skills/{3-module-doc-review → erp-kit-module-shared}/references/testing.md +4 -3
  34. package/skills/erp-kit-update/SKILL.md +64 -0
  35. package/src/cli.doc.test.ts +65 -0
  36. package/src/cli.ts +3 -117
  37. package/src/commands/app/index.ts +74 -0
  38. package/src/commands/check.test.ts +3 -2
  39. package/src/commands/check.ts +3 -2
  40. package/src/commands/index.ts +73 -0
  41. package/src/commands/init.test.ts +22 -5
  42. package/src/commands/init.ts +25 -16
  43. package/src/commands/license.ts +193 -0
  44. package/src/commands/mock/index.ts +2 -2
  45. package/src/commands/mock/start.ts +1 -1
  46. package/src/commands/mock/validate.test.ts +1 -1
  47. package/src/commands/module/generate.ts +35 -0
  48. package/src/commands/module/index.ts +87 -0
  49. package/src/commands/module/list.test.ts +57 -0
  50. package/src/commands/module/list.ts +64 -0
  51. package/src/commands/scaffold-templates.ts +65 -0
  52. package/src/commands/scaffold.test.ts +97 -2
  53. package/src/commands/scaffold.ts +24 -3
  54. package/src/commands/sync-check.test.ts +88 -1
  55. package/src/commands/sync-check.ts +41 -2
  56. package/src/generator/generate-code.test.ts +200 -0
  57. package/src/generator/generate-code.ts +260 -0
  58. package/src/generator/parse-command-doc.test.ts +159 -0
  59. package/src/generator/parse-command-doc.ts +116 -0
  60. package/src/integration.test.ts +6 -8
  61. package/src/module.ts +10 -9
  62. package/src/modules/item-management/README.md +38 -0
  63. package/src/modules/item-management/command/activateItem.generated.ts +6 -0
  64. package/src/modules/item-management/command/activateItem.test.ts +76 -0
  65. package/src/modules/item-management/command/activateItem.ts +42 -0
  66. package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +6 -0
  67. package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +88 -0
  68. package/src/modules/item-management/command/assignItemToTaxonomy.ts +63 -0
  69. package/src/modules/item-management/command/createItem.generated.ts +6 -0
  70. package/src/modules/item-management/command/createItem.test.ts +152 -0
  71. package/src/modules/item-management/command/createItem.ts +72 -0
  72. package/src/modules/item-management/command/createTaxonomyNode.generated.ts +6 -0
  73. package/src/modules/item-management/command/createTaxonomyNode.test.ts +126 -0
  74. package/src/modules/item-management/command/createTaxonomyNode.ts +70 -0
  75. package/src/modules/item-management/command/deactivateItem.generated.ts +6 -0
  76. package/src/modules/item-management/command/deactivateItem.test.ts +76 -0
  77. package/src/modules/item-management/command/deactivateItem.ts +42 -0
  78. package/src/modules/item-management/command/deleteItem.generated.ts +6 -0
  79. package/src/modules/item-management/command/deleteItem.test.ts +61 -0
  80. package/src/modules/item-management/command/deleteItem.ts +38 -0
  81. package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +6 -0
  82. package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +73 -0
  83. package/src/modules/item-management/command/deleteTaxonomyNode.ts +50 -0
  84. package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +6 -0
  85. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +136 -0
  86. package/src/modules/item-management/command/moveTaxonomyNode.ts +85 -0
  87. package/src/modules/item-management/command/reactivateItem.generated.ts +6 -0
  88. package/src/modules/item-management/command/reactivateItem.test.ts +76 -0
  89. package/src/modules/item-management/command/reactivateItem.ts +42 -0
  90. package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +6 -0
  91. package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +43 -0
  92. package/src/modules/item-management/command/removeItemFromTaxonomy.ts +30 -0
  93. package/src/modules/item-management/command/updateItem.generated.ts +6 -0
  94. package/src/modules/item-management/command/updateItem.test.ts +178 -0
  95. package/src/modules/item-management/command/updateItem.ts +103 -0
  96. package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +6 -0
  97. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +88 -0
  98. package/src/modules/item-management/command/updateTaxonomyNode.ts +62 -0
  99. package/src/modules/item-management/db/item.ts +47 -0
  100. package/src/modules/item-management/db/itemTaxonomyAssignment.ts +49 -0
  101. package/src/modules/item-management/db/taxonomyNode.ts +34 -0
  102. package/src/modules/item-management/docs/commands/ActivateItem.md +32 -0
  103. package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +38 -0
  104. package/src/modules/item-management/docs/commands/CreateItem.md +44 -0
  105. package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +44 -0
  106. package/src/modules/item-management/docs/commands/DeactivateItem.md +34 -0
  107. package/src/modules/item-management/docs/commands/DeleteItem.md +35 -0
  108. package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +39 -0
  109. package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +45 -0
  110. package/src/modules/item-management/docs/commands/ReactivateItem.md +34 -0
  111. package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +30 -0
  112. package/src/modules/item-management/docs/commands/UpdateItem.md +55 -0
  113. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +36 -0
  114. package/src/modules/item-management/docs/features/item-lifecycle.md +60 -0
  115. package/src/modules/item-management/docs/features/item-taxonomy.md +65 -0
  116. package/src/modules/item-management/docs/models/ItemTaxonomyAssignment.md +36 -0
  117. package/src/modules/item-management/docs/models/TaxonomyNode.md +47 -0
  118. package/src/modules/item-management/docs/models/item.md +59 -0
  119. package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +36 -0
  120. package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +40 -0
  121. package/src/modules/item-management/docs/queries/DetectCircularReference.md +41 -0
  122. package/src/modules/item-management/docs/queries/GetItem.md +38 -0
  123. package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +29 -0
  124. package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +35 -0
  125. package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +29 -0
  126. package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +29 -0
  127. package/src/modules/item-management/generated/enums.ts +9 -0
  128. package/src/modules/item-management/generated/kysely-tailordb.ts +62 -0
  129. package/src/modules/item-management/index.ts +53 -0
  130. package/src/modules/item-management/lib/_db_deps.ts +13 -0
  131. package/src/modules/item-management/lib/errors.generated.ts +117 -0
  132. package/src/modules/item-management/lib/permissions.generated.ts +17 -0
  133. package/src/modules/item-management/lib/types.ts +19 -0
  134. package/src/modules/item-management/module.ts +97 -0
  135. package/src/modules/item-management/query/calculateNodeDepth.generated.ts +5 -0
  136. package/src/modules/item-management/query/calculateNodeDepth.test.ts +56 -0
  137. package/src/modules/item-management/query/calculateNodeDepth.ts +28 -0
  138. package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +5 -0
  139. package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +75 -0
  140. package/src/modules/item-management/query/calculateSubtreeDepth.ts +29 -0
  141. package/src/modules/item-management/query/detectCircularReference.generated.ts +5 -0
  142. package/src/modules/item-management/query/detectCircularReference.test.ts +61 -0
  143. package/src/modules/item-management/query/detectCircularReference.ts +32 -0
  144. package/src/modules/item-management/query/getItem.generated.ts +5 -0
  145. package/src/modules/item-management/query/getItem.test.ts +67 -0
  146. package/src/modules/item-management/query/getItem.ts +20 -0
  147. package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +5 -0
  148. package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +25 -0
  149. package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +18 -0
  150. package/src/modules/item-management/query/getTaxonomyNode.generated.ts +5 -0
  151. package/src/modules/item-management/query/getTaxonomyNode.test.ts +47 -0
  152. package/src/modules/item-management/query/getTaxonomyNode.ts +18 -0
  153. package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +5 -0
  154. package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +25 -0
  155. package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +16 -0
  156. package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +5 -0
  157. package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +34 -0
  158. package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +16 -0
  159. package/src/modules/item-management/tailor.config.ts +11 -0
  160. package/src/modules/item-management/testing/fixtures.ts +81 -0
  161. package/src/modules/primitives/command/activateCategory.generated.ts +6 -0
  162. package/src/modules/primitives/command/activateCategory.test.ts +11 -29
  163. package/src/modules/primitives/command/activateCategory.ts +27 -34
  164. package/src/modules/primitives/command/activateCurrency.generated.ts +6 -0
  165. package/src/modules/primitives/command/activateCurrency.test.ts +11 -29
  166. package/src/modules/primitives/command/activateCurrency.ts +27 -34
  167. package/src/modules/primitives/command/activateUnit.generated.ts +6 -0
  168. package/src/modules/primitives/command/activateUnit.test.ts +11 -15
  169. package/src/modules/primitives/command/activateUnit.ts +27 -34
  170. package/src/modules/primitives/command/createCategory.generated.ts +6 -0
  171. package/src/modules/primitives/command/createCategory.test.ts +27 -39
  172. package/src/modules/primitives/command/createCategory.ts +53 -62
  173. package/src/modules/primitives/command/createCurrency.generated.ts +6 -0
  174. package/src/modules/primitives/command/createCurrency.test.ts +78 -71
  175. package/src/modules/primitives/command/createCurrency.ts +43 -48
  176. package/src/modules/primitives/command/createExchangeRate.generated.ts +6 -0
  177. package/src/modules/primitives/command/createExchangeRate.test.ts +101 -100
  178. package/src/modules/primitives/command/createExchangeRate.ts +50 -59
  179. package/src/modules/primitives/command/createUnit.generated.ts +6 -0
  180. package/src/modules/primitives/command/createUnit.test.ts +92 -95
  181. package/src/modules/primitives/command/createUnit.ts +54 -57
  182. package/src/modules/primitives/command/deactivateCategory.generated.ts +6 -0
  183. package/src/modules/primitives/command/deactivateCategory.test.ts +27 -28
  184. package/src/modules/primitives/command/deactivateCategory.ts +43 -50
  185. package/src/modules/primitives/command/deactivateCurrency.generated.ts +6 -0
  186. package/src/modules/primitives/command/deactivateCurrency.test.ts +23 -38
  187. package/src/modules/primitives/command/deactivateCurrency.ts +31 -38
  188. package/src/modules/primitives/command/deactivateUnit.generated.ts +6 -0
  189. package/src/modules/primitives/command/deactivateUnit.test.ts +27 -23
  190. package/src/modules/primitives/command/deactivateUnit.ts +39 -49
  191. package/src/modules/primitives/command/setBaseCurrency.generated.ts +6 -0
  192. package/src/modules/primitives/command/setBaseCurrency.test.ts +40 -33
  193. package/src/modules/primitives/command/setBaseCurrency.ts +43 -50
  194. package/src/modules/primitives/command/setReferenceUnit.generated.ts +6 -0
  195. package/src/modules/primitives/command/setReferenceUnit.test.ts +39 -35
  196. package/src/modules/primitives/command/setReferenceUnit.ts +46 -59
  197. package/src/modules/primitives/db/unit.ts +13 -3
  198. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -2
  199. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -2
  200. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -2
  201. package/src/modules/primitives/docs/commands/CreateCategory.md +1 -4
  202. package/src/modules/primitives/docs/commands/CreateCurrency.md +3 -4
  203. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +4 -5
  204. package/src/modules/primitives/docs/commands/CreateUnit.md +5 -5
  205. package/src/modules/primitives/docs/commands/DeactivateCategory.md +2 -3
  206. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +2 -3
  207. package/src/modules/primitives/docs/commands/DeactivateUnit.md +2 -3
  208. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +2 -3
  209. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +2 -3
  210. package/src/modules/primitives/docs/models/Currency.md +4 -0
  211. package/src/modules/primitives/docs/models/ExchangeRate.md +4 -1
  212. package/src/modules/primitives/docs/models/Unit.md +4 -1
  213. package/src/modules/primitives/docs/models/UoMCategory.md +2 -0
  214. package/src/modules/primitives/docs/{commands → queries}/ConvertAmount.md +3 -5
  215. package/src/modules/primitives/docs/{commands → queries}/ConvertQuantity.md +3 -5
  216. package/src/modules/primitives/docs/queries/GetBaseCurrency.md +32 -0
  217. package/src/modules/primitives/docs/queries/GetCurrency.md +36 -0
  218. package/src/modules/primitives/docs/queries/GetUnit.md +36 -0
  219. package/src/modules/primitives/docs/queries/GetUoMCategory.md +36 -0
  220. package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +26 -0
  221. package/src/modules/primitives/generated/kysely-tailordb.ts +24 -45
  222. package/src/modules/primitives/index.ts +17 -6
  223. package/src/modules/primitives/lib/errors.generated.ts +112 -0
  224. package/src/modules/primitives/{permissions.ts → lib/permissions.generated.ts} +9 -10
  225. package/src/modules/primitives/module.ts +39 -27
  226. package/src/modules/primitives/query/convertAmount.generated.ts +5 -0
  227. package/src/modules/primitives/{command → query}/convertAmount.test.ts +4 -21
  228. package/src/modules/primitives/query/convertAmount.ts +121 -0
  229. package/src/modules/primitives/query/convertQuantity.generated.ts +5 -0
  230. package/src/modules/primitives/{command → query}/convertQuantity.test.ts +8 -15
  231. package/src/modules/primitives/query/convertQuantity.ts +63 -0
  232. package/src/modules/primitives/query/getBaseCurrency.generated.ts +5 -0
  233. package/src/modules/primitives/query/getBaseCurrency.test.ts +28 -0
  234. package/src/modules/primitives/query/getBaseCurrency.ts +16 -0
  235. package/src/modules/primitives/query/getCurrency.generated.ts +5 -0
  236. package/src/modules/primitives/query/getCurrency.test.ts +47 -0
  237. package/src/modules/primitives/query/getCurrency.ts +18 -0
  238. package/src/modules/primitives/query/getUnit.generated.ts +5 -0
  239. package/src/modules/primitives/query/getUnit.test.ts +47 -0
  240. package/src/modules/primitives/query/getUnit.ts +18 -0
  241. package/src/modules/primitives/query/getUoMCategory.generated.ts +5 -0
  242. package/src/modules/primitives/query/getUoMCategory.test.ts +47 -0
  243. package/src/modules/primitives/query/getUoMCategory.ts +18 -0
  244. package/src/modules/primitives/query/listUnitsByCategory.generated.ts +5 -0
  245. package/src/modules/primitives/query/listUnitsByCategory.ts +16 -0
  246. package/src/modules/primitives/tailor.config.ts +3 -3
  247. package/src/modules/shared/defineCommand.test.ts +23 -10
  248. package/src/modules/shared/defineCommand.ts +23 -10
  249. package/src/modules/shared/defineQuery.test.ts +28 -0
  250. package/src/modules/shared/defineQuery.ts +16 -0
  251. package/src/modules/shared/internal.ts +3 -1
  252. package/src/modules/shared/requirePermission.test.ts +22 -21
  253. package/src/modules/shared/requirePermission.ts +8 -2
  254. package/src/modules/shared/result.ts +12 -0
  255. package/src/modules/shared/types.ts +8 -0
  256. package/src/modules/testing/index.ts +36 -11
  257. package/src/modules/user-management/command/activateUser.generated.ts +6 -0
  258. package/src/modules/user-management/command/activateUser.test.ts +27 -27
  259. package/src/modules/user-management/command/activateUser.ts +40 -48
  260. package/src/modules/user-management/command/assignPermissionToRole.generated.ts +6 -0
  261. package/src/modules/user-management/command/assignPermissionToRole.test.ts +42 -43
  262. package/src/modules/user-management/command/assignPermissionToRole.ts +59 -62
  263. package/src/modules/user-management/command/assignRoleToUser.generated.ts +6 -0
  264. package/src/modules/user-management/command/assignRoleToUser.test.ts +70 -63
  265. package/src/modules/user-management/command/assignRoleToUser.ts +63 -66
  266. package/src/modules/user-management/command/createPermission.generated.ts +6 -0
  267. package/src/modules/user-management/command/createPermission.test.ts +45 -38
  268. package/src/modules/user-management/command/createPermission.ts +42 -46
  269. package/src/modules/user-management/command/createRole.generated.ts +6 -0
  270. package/src/modules/user-management/command/createRole.test.ts +30 -29
  271. package/src/modules/user-management/command/createRole.ts +33 -33
  272. package/src/modules/user-management/command/createUser.generated.ts +6 -0
  273. package/src/modules/user-management/command/createUser.test.ts +64 -42
  274. package/src/modules/user-management/command/createUser.ts +54 -56
  275. package/src/modules/user-management/command/deactivateUser.generated.ts +6 -0
  276. package/src/modules/user-management/command/deactivateUser.test.ts +27 -27
  277. package/src/modules/user-management/command/deactivateUser.ts +40 -48
  278. package/src/modules/user-management/command/logAuditEvent.generated.ts +6 -0
  279. package/src/modules/user-management/command/logAuditEvent.test.ts +50 -42
  280. package/src/modules/user-management/command/logAuditEvent.ts +25 -28
  281. package/src/modules/user-management/command/reactivateUser.generated.ts +6 -0
  282. package/src/modules/user-management/command/reactivateUser.test.ts +31 -27
  283. package/src/modules/user-management/command/reactivateUser.ts +40 -48
  284. package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +6 -0
  285. package/src/modules/user-management/command/revokePermissionFromRole.test.ts +52 -51
  286. package/src/modules/user-management/command/revokePermissionFromRole.ts +60 -57
  287. package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +6 -0
  288. package/src/modules/user-management/command/revokeRoleFromUser.test.ts +53 -48
  289. package/src/modules/user-management/command/revokeRoleFromUser.ts +58 -57
  290. package/src/modules/user-management/docs/commands/CreatePermission.md +2 -2
  291. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  292. package/src/modules/user-management/docs/models/AuditEvent.md +2 -0
  293. package/src/modules/user-management/docs/models/Permission.md +2 -0
  294. package/src/modules/user-management/docs/models/Role.md +2 -0
  295. package/src/modules/user-management/docs/models/RolePermission.md +2 -0
  296. package/src/modules/user-management/docs/models/User.md +2 -0
  297. package/src/modules/user-management/docs/models/UserRole.md +2 -0
  298. package/src/modules/user-management/generated/enums.ts +11 -11
  299. package/src/modules/user-management/generated/kysely-tailordb.ts +27 -56
  300. package/src/modules/user-management/index.ts +2 -2
  301. package/src/modules/user-management/lib/errors.generated.ts +67 -0
  302. package/src/modules/user-management/{permissions.ts → lib/permissions.generated.ts} +8 -7
  303. package/src/modules/user-management/module.ts +22 -22
  304. package/src/modules/user-management/tailor.config.ts +3 -3
  305. package/src/schemas.ts +2 -1
  306. package/skills/1-module-docs/references/structure.md +0 -22
  307. package/skills/2-module-feature-breakdown/references/commands.md +0 -48
  308. package/skills/2-module-feature-breakdown/references/structure.md +0 -22
  309. package/skills/3-module-doc-review/references/commands.md +0 -54
  310. package/skills/3-module-doc-review/references/models.md +0 -29
  311. package/skills/4-module-tdd-implementation/SKILL.md +0 -74
  312. package/skills/4-module-tdd-implementation/references/commands.md +0 -45
  313. package/skills/4-module-tdd-implementation/references/errors.md +0 -7
  314. package/skills/4-module-tdd-implementation/references/models.md +0 -30
  315. package/skills/4-module-tdd-implementation/references/structure.md +0 -22
  316. package/skills/4-module-tdd-implementation/references/testing.md +0 -37
  317. package/skills/5-module-implementation-review/references/commands.md +0 -45
  318. package/skills/5-module-implementation-review/references/errors.md +0 -7
  319. package/skills/5-module-implementation-review/references/exports.md +0 -8
  320. package/skills/5-module-implementation-review/references/models.md +0 -30
  321. package/src/modules/primitives/command/convertAmount.ts +0 -126
  322. package/src/modules/primitives/command/convertQuantity.ts +0 -73
  323. package/src/modules/primitives/lib/errors.ts +0 -138
  324. package/src/modules/user-management/lib/errors.ts +0 -81
  325. /package/skills/{app-compose-1-requirement-analysis → erp-kit-app-1-requirements}/references/structure.md +0 -0
  326. /package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/references/screen-detailview.md +0 -0
  327. /package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/references/screen-form.md +0 -0
  328. /package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/references/screen-listview.md +0 -0
  329. /package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/references/structure.md +0 -0
  330. /package/skills/{app-compose-3-doc-review → erp-kit-app-3-doc-review}/references/structure.md +0 -0
  331. /package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/references/component.md +0 -0
  332. /package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/references/screen-detailview.md +0 -0
  333. /package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/references/screen-form.md +0 -0
  334. /package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/references/screen-listview.md +0 -0
  335. /package/skills/{app-compose-4-design-mock → erp-kit-app-4-design}/references/structure.md +0 -0
  336. /package/skills/{app-compose-5-design-mock-review → erp-kit-app-5-design-review}/references/component.md +0 -0
  337. /package/skills/{app-compose-5-design-mock-review → erp-kit-app-5-design-review}/references/screen-detailview.md +0 -0
  338. /package/skills/{app-compose-5-design-mock-review → erp-kit-app-5-design-review}/references/screen-form.md +0 -0
  339. /package/skills/{app-compose-5-design-mock-review → erp-kit-app-5-design-review}/references/screen-listview.md +0 -0
  340. /package/skills/{app-compose-6-implementation-spec → erp-kit-app-6-impl-spec}/references/auth.md +0 -0
  341. /package/skills/{app-compose-6-implementation-spec → erp-kit-app-6-impl-spec}/references/structure.md +0 -0
  342. /package/skills/{2-module-feature-breakdown → erp-kit-module-4-tdd}/references/models.md +0 -0
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { InsufficientPermissionError, type CommandContext } from "../../shared/internal";
2
+ import { type CommandContext } from "../../shared/internal";
3
3
  import { createMockDb } from "../../testing/index";
4
4
  import { DB } from "../generated/kysely-tailordb";
5
5
  import {
@@ -7,16 +7,14 @@ import {
7
7
  InactiveCurrencyError,
8
8
  InvalidExchangeRateError,
9
9
  SameCurrencyPairError,
10
- } from "../lib/errors";
10
+ } from "../lib/errors.generated";
11
11
  import {
12
12
  baseCurrencyEUR,
13
13
  baseCurrencyUSD,
14
14
  baseExchangeRateUSDtoEUR,
15
15
  inactiveCurrency,
16
16
  } from "../testing/fixtures";
17
- import { makeCreateExchangeRate } from "./createExchangeRate";
18
-
19
- const createExchangeRate = makeCreateExchangeRate();
17
+ import { run } from "./createExchangeRate";
20
18
 
21
19
  describe("createExchangeRate", () => {
22
20
  const ctx: CommandContext = {
@@ -29,36 +27,42 @@ describe("createExchangeRate", () => {
29
27
  const { db, spies } = createMockDb<DB>();
30
28
  spies.select.mockReturnValue(undefined);
31
29
 
32
- await expect(
33
- createExchangeRate(
34
- db,
35
- {
36
- sourceCurrencyId: "nonexistent-currency",
37
- targetCurrencyId: baseCurrencyEUR.id,
38
- rate: 0.92,
39
- effectiveDate: new Date("2024-01-15"),
40
- },
41
- ctx,
42
- ),
43
- ).rejects.toBeInstanceOf(CurrencyNotFoundError);
30
+ const result = await run(
31
+ db,
32
+ {
33
+ sourceCurrencyId: "nonexistent-currency",
34
+ targetCurrencyId: baseCurrencyEUR.id,
35
+ rate: 0.92,
36
+ effectiveDate: new Date("2024-01-15"),
37
+ },
38
+ ctx,
39
+ );
40
+
41
+ expect(result.ok).toBe(false);
42
+ if (!result.ok) {
43
+ expect(result.error).toBeInstanceOf(CurrencyNotFoundError);
44
+ }
44
45
  });
45
46
 
46
47
  it("throws when source currency is inactive", async () => {
47
48
  const { db, spies } = createMockDb<DB>();
48
49
  spies.select.mockReturnValue(inactiveCurrency);
49
50
 
50
- await expect(
51
- createExchangeRate(
52
- db,
53
- {
54
- sourceCurrencyId: inactiveCurrency.id,
55
- targetCurrencyId: baseCurrencyEUR.id,
56
- rate: 0.92,
57
- effectiveDate: new Date("2024-01-15"),
58
- },
59
- ctx,
60
- ),
61
- ).rejects.toBeInstanceOf(InactiveCurrencyError);
51
+ const result = await run(
52
+ db,
53
+ {
54
+ sourceCurrencyId: inactiveCurrency.id,
55
+ targetCurrencyId: baseCurrencyEUR.id,
56
+ rate: 0.92,
57
+ effectiveDate: new Date("2024-01-15"),
58
+ },
59
+ ctx,
60
+ );
61
+
62
+ expect(result.ok).toBe(false);
63
+ if (!result.ok) {
64
+ expect(result.error).toBeInstanceOf(InactiveCurrencyError);
65
+ }
62
66
  });
63
67
 
64
68
  it("throws when target currency doesn't exist", async () => {
@@ -67,18 +71,21 @@ describe("createExchangeRate", () => {
67
71
  .mockReturnValueOnce(baseCurrencyUSD) // Source exists
68
72
  .mockReturnValueOnce(undefined); // Target doesn't exist
69
73
 
70
- await expect(
71
- createExchangeRate(
72
- db,
73
- {
74
- sourceCurrencyId: baseCurrencyUSD.id,
75
- targetCurrencyId: "nonexistent-currency",
76
- rate: 0.92,
77
- effectiveDate: new Date("2024-01-15"),
78
- },
79
- ctx,
80
- ),
81
- ).rejects.toBeInstanceOf(CurrencyNotFoundError);
74
+ const result = await run(
75
+ db,
76
+ {
77
+ sourceCurrencyId: baseCurrencyUSD.id,
78
+ targetCurrencyId: "nonexistent-currency",
79
+ rate: 0.92,
80
+ effectiveDate: new Date("2024-01-15"),
81
+ },
82
+ ctx,
83
+ );
84
+
85
+ expect(result.ok).toBe(false);
86
+ if (!result.ok) {
87
+ expect(result.error).toBeInstanceOf(CurrencyNotFoundError);
88
+ }
82
89
  });
83
90
 
84
91
  it("throws when target currency is inactive", async () => {
@@ -87,54 +94,63 @@ describe("createExchangeRate", () => {
87
94
  .mockReturnValueOnce(baseCurrencyUSD) // Source exists and active
88
95
  .mockReturnValueOnce(inactiveCurrency); // Target is inactive
89
96
 
90
- await expect(
91
- createExchangeRate(
92
- db,
93
- {
94
- sourceCurrencyId: baseCurrencyUSD.id,
95
- targetCurrencyId: inactiveCurrency.id,
96
- rate: 0.92,
97
- effectiveDate: new Date("2024-01-15"),
98
- },
99
- ctx,
100
- ),
101
- ).rejects.toBeInstanceOf(InactiveCurrencyError);
97
+ const result = await run(
98
+ db,
99
+ {
100
+ sourceCurrencyId: baseCurrencyUSD.id,
101
+ targetCurrencyId: inactiveCurrency.id,
102
+ rate: 0.92,
103
+ effectiveDate: new Date("2024-01-15"),
104
+ },
105
+ ctx,
106
+ );
107
+
108
+ expect(result.ok).toBe(false);
109
+ if (!result.ok) {
110
+ expect(result.error).toBeInstanceOf(InactiveCurrencyError);
111
+ }
102
112
  });
103
113
 
104
114
  it("throws when source and target are the same", async () => {
105
115
  const { db, spies } = createMockDb<DB>();
106
116
  spies.select.mockReturnValue(baseCurrencyUSD);
107
117
 
108
- await expect(
109
- createExchangeRate(
110
- db,
111
- {
112
- sourceCurrencyId: baseCurrencyUSD.id,
113
- targetCurrencyId: baseCurrencyUSD.id,
114
- rate: 1.0,
115
- effectiveDate: new Date("2024-01-15"),
116
- },
117
- ctx,
118
- ),
119
- ).rejects.toBeInstanceOf(SameCurrencyPairError);
118
+ const result = await run(
119
+ db,
120
+ {
121
+ sourceCurrencyId: baseCurrencyUSD.id,
122
+ targetCurrencyId: baseCurrencyUSD.id,
123
+ rate: 1.0,
124
+ effectiveDate: new Date("2024-01-15"),
125
+ },
126
+ ctx,
127
+ );
128
+
129
+ expect(result.ok).toBe(false);
130
+ if (!result.ok) {
131
+ expect(result.error).toBeInstanceOf(SameCurrencyPairError);
132
+ }
120
133
  });
121
134
 
122
135
  it("throws when rate is not positive", async () => {
123
136
  const { db, spies } = createMockDb<DB>();
124
137
  spies.select.mockReturnValueOnce(baseCurrencyUSD).mockReturnValueOnce(baseCurrencyEUR);
125
138
 
126
- await expect(
127
- createExchangeRate(
128
- db,
129
- {
130
- sourceCurrencyId: baseCurrencyUSD.id,
131
- targetCurrencyId: baseCurrencyEUR.id,
132
- rate: 0,
133
- effectiveDate: new Date("2024-01-15"),
134
- },
135
- ctx,
136
- ),
137
- ).rejects.toBeInstanceOf(InvalidExchangeRateError);
139
+ const result = await run(
140
+ db,
141
+ {
142
+ sourceCurrencyId: baseCurrencyUSD.id,
143
+ targetCurrencyId: baseCurrencyEUR.id,
144
+ rate: 0,
145
+ effectiveDate: new Date("2024-01-15"),
146
+ },
147
+ ctx,
148
+ );
149
+
150
+ expect(result.ok).toBe(false);
151
+ if (!result.ok) {
152
+ expect(result.error).toBeInstanceOf(InvalidExchangeRateError);
153
+ }
138
154
  });
139
155
 
140
156
  // Success cases
@@ -153,7 +169,7 @@ describe("createExchangeRate", () => {
153
169
  spies.select.mockReturnValueOnce(baseCurrencyUSD).mockReturnValueOnce(baseCurrencyEUR);
154
170
  spies.insert.mockReturnValue(createdRate);
155
171
 
156
- const result = await createExchangeRate(
172
+ const result = await run(
157
173
  db,
158
174
  {
159
175
  sourceCurrencyId: baseCurrencyUSD.id,
@@ -164,31 +180,16 @@ describe("createExchangeRate", () => {
164
180
  ctx,
165
181
  );
166
182
 
167
- expect(result.exchangeRate.rate).toBe(0.92);
168
- expect(result.exchangeRate.sourceCurrencyId).toBe(baseCurrencyUSD.id);
169
- expect(result.exchangeRate.targetCurrencyId).toBe(baseCurrencyEUR.id);
183
+ expect(result.ok).toBe(true);
184
+ if (result.ok) {
185
+ expect(result.value.exchangeRate.rate).toBe(0.92);
186
+ expect(result.value.exchangeRate.sourceCurrencyId).toBe(baseCurrencyUSD.id);
187
+ expect(result.value.exchangeRate.targetCurrencyId).toBe(baseCurrencyEUR.id);
188
+ }
170
189
  expect(spies.insert).toHaveBeenCalled();
171
190
  });
172
191
 
173
- it("throws when permission is missing", async () => {
174
- const { db } = createMockDb<DB>();
175
- const denied: CommandContext = { actorId: "test-actor", permissions: [] };
176
- await expect(
177
- createExchangeRate(
178
- db,
179
- {
180
- sourceCurrencyId: "cur-1",
181
- targetCurrencyId: "cur-2",
182
- rate: 1.5,
183
- effectiveDate: new Date("2024-01-15"),
184
- },
185
- denied,
186
- ),
187
- ).rejects.toBeInstanceOf(InsufficientPermissionError);
188
- });
189
-
190
192
  it("passes custom fields through to insert", async () => {
191
- const createExchangeRateWithFields = makeCreateExchangeRate<{ source: string }>();
192
193
  const { db, spies } = createMockDb<DB>();
193
194
  const createdRate = {
194
195
  ...baseExchangeRateUSDtoEUR,
@@ -199,7 +200,7 @@ describe("createExchangeRate", () => {
199
200
  spies.select.mockReturnValueOnce(baseCurrencyUSD).mockReturnValueOnce(baseCurrencyEUR);
200
201
  spies.insert.mockReturnValue(createdRate);
201
202
 
202
- await createExchangeRateWithFields(
203
+ await run(
203
204
  db,
204
205
  {
205
206
  sourceCurrencyId: baseCurrencyUSD.id,
@@ -1,12 +1,12 @@
1
- import { defineCommand } from "../../shared/internal";
1
+ import { ok, err, type CommandContext } from "../../shared/internal";
2
2
  import { DB } from "../generated/kysely-tailordb";
3
3
  import {
4
4
  CurrencyNotFoundError,
5
5
  InactiveCurrencyError,
6
6
  InvalidExchangeRateError,
7
7
  SameCurrencyPairError,
8
- } from "../lib/errors";
9
- import { permissions } from "../permissions";
8
+ } from "../lib/errors.generated";
9
+ import { getCurrency } from "../query/getCurrency.generated";
10
10
 
11
11
  interface CreateExchangeRateInput {
12
12
  sourceCurrencyId: string;
@@ -22,70 +22,61 @@ interface CreateExchangeRateInput {
22
22
  * effective date. The rate specifies how many units of the target currency
23
23
  * equal one unit of the source currency.
24
24
  */
25
- export function makeCreateExchangeRate<CF extends Record<string, unknown>>() {
26
- return defineCommand(
27
- permissions.createExchangeRate,
28
- async (db: DB, input: CreateExchangeRateInput & CF) => {
29
- const { sourceCurrencyId, targetCurrencyId, rate, effectiveDate, ...customFields } = input;
25
+ export async function run<CF extends Record<string, unknown>>(
26
+ db: DB,
27
+ input: CreateExchangeRateInput & CF,
28
+ ctx: CommandContext,
29
+ ) {
30
+ const { sourceCurrencyId, targetCurrencyId, rate, effectiveDate, ...customFields } = input;
30
31
 
31
- // 1. Check source currency exists
32
- const sourceCurrency = await db
33
- .selectFrom("Currency")
34
- .selectAll()
35
- .where("id", "=", sourceCurrencyId)
36
- .executeTakeFirst();
32
+ // 1. Check source currency exists
33
+ const { currency: sourceCurrency } = await getCurrency(db, { id: sourceCurrencyId }, ctx);
37
34
 
38
- if (!sourceCurrency) {
39
- throw new CurrencyNotFoundError(sourceCurrencyId);
40
- }
35
+ if (!sourceCurrency) {
36
+ return err(new CurrencyNotFoundError(sourceCurrencyId));
37
+ }
41
38
 
42
- // 2. Check source currency is active
43
- if (!sourceCurrency.isActive) {
44
- throw new InactiveCurrencyError(sourceCurrency.code);
45
- }
39
+ // 2. Check source currency is active
40
+ if (!sourceCurrency.isActive) {
41
+ return err(new InactiveCurrencyError(sourceCurrency.code));
42
+ }
46
43
 
47
- // 3. Check target currency exists
48
- const targetCurrency = await db
49
- .selectFrom("Currency")
50
- .selectAll()
51
- .where("id", "=", targetCurrencyId)
52
- .executeTakeFirst();
44
+ // 3. Check target currency exists
45
+ const { currency: targetCurrency } = await getCurrency(db, { id: targetCurrencyId }, ctx);
53
46
 
54
- if (!targetCurrency) {
55
- throw new CurrencyNotFoundError(targetCurrencyId);
56
- }
47
+ if (!targetCurrency) {
48
+ return err(new CurrencyNotFoundError(targetCurrencyId));
49
+ }
57
50
 
58
- // 4. Check target currency is active
59
- if (!targetCurrency.isActive) {
60
- throw new InactiveCurrencyError(targetCurrency.code);
61
- }
51
+ // 4. Check target currency is active
52
+ if (!targetCurrency.isActive) {
53
+ return err(new InactiveCurrencyError(targetCurrency.code));
54
+ }
62
55
 
63
- // 5. Check source and target are different
64
- if (sourceCurrencyId === targetCurrencyId) {
65
- throw new SameCurrencyPairError(sourceCurrencyId);
66
- }
56
+ // 5. Check source and target are different
57
+ if (sourceCurrencyId === targetCurrencyId) {
58
+ return err(new SameCurrencyPairError(sourceCurrencyId));
59
+ }
67
60
 
68
- // 6. Validate rate is positive
69
- if (rate <= 0) {
70
- throw new InvalidExchangeRateError(rate);
71
- }
61
+ // 6. Validate rate is positive
62
+ if (rate <= 0) {
63
+ return err(new InvalidExchangeRateError(String(rate)));
64
+ }
72
65
 
73
- // 7. Create exchange rate
74
- const exchangeRate = await db
75
- .insertInto("ExchangeRate")
76
- .values({
77
- ...(customFields as Record<string, unknown>),
78
- sourceCurrencyId,
79
- targetCurrencyId,
80
- rate,
81
- effectiveDate,
82
- createdAt: new Date(),
83
- updatedAt: null,
84
- })
85
- .returningAll()
86
- .executeTakeFirst();
66
+ // 7. Create exchange rate
67
+ const exchangeRate = await db
68
+ .insertInto("ExchangeRate")
69
+ .values({
70
+ ...(customFields as Record<string, unknown>),
71
+ sourceCurrencyId,
72
+ targetCurrencyId,
73
+ rate,
74
+ effectiveDate,
75
+ createdAt: new Date(),
76
+ updatedAt: null,
77
+ })
78
+ .returningAll()
79
+ .executeTakeFirst();
87
80
 
88
- return { exchangeRate: exchangeRate! };
89
- },
90
- );
81
+ return ok({ exchangeRate: exchangeRate! });
91
82
  }
@@ -0,0 +1,6 @@
1
+ // @generated — do not edit
2
+ import { defineCommand } from "../../shared/internal";
3
+ import { permissions } from "../lib/permissions.generated";
4
+ import { run } from "./createUnit";
5
+
6
+ export const createUnit = defineCommand(permissions.createUnit, run);