@tailor-platform/erp-kit 0.1.2 → 0.2.1

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 (330) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +80 -12
  3. package/dist/cli.js +1070 -450
  4. package/package.json +11 -8
  5. package/schemas/app-compose/business-flow.yml +3 -0
  6. package/schemas/app-compose/story.yml +1 -1
  7. package/schemas/module/model.yml +5 -0
  8. package/skills/{app-compose-1-requirement-analysis → erp-kit-app-1-requirements}/SKILL.md +8 -14
  9. package/skills/{app-compose-2-requirements-breakdown → erp-kit-app-2-breakdown}/SKILL.md +6 -13
  10. package/skills/{app-compose-3-doc-review → erp-kit-app-3-doc-review}/SKILL.md +2 -6
  11. package/skills/{app-compose-6-implementation-spec → erp-kit-app-4-impl-spec}/SKILL.md +11 -22
  12. package/skills/erp-kit-app-5-implementation/SKILL.md +149 -0
  13. package/skills/erp-kit-app-5-implementation/references/backend.md +232 -0
  14. package/skills/erp-kit-app-5-implementation/references/frontend.md +242 -0
  15. package/skills/{mock-scenario → erp-kit-mock-scenario}/SKILL.md +1 -1
  16. package/skills/{1-module-docs → erp-kit-module-1-docs}/SKILL.md +2 -2
  17. package/skills/{2-module-feature-breakdown → erp-kit-module-2-feature-breakdown}/SKILL.md +13 -9
  18. package/skills/erp-kit-module-2-feature-breakdown/references/naming.md +59 -0
  19. package/skills/{3-module-doc-review → erp-kit-module-3-doc-review}/SKILL.md +83 -25
  20. package/skills/erp-kit-module-4-tdd/SKILL.md +94 -0
  21. package/skills/erp-kit-module-4-tdd/references/cross-module-dependency.md +133 -0
  22. package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/db-relations.md +5 -1
  23. package/skills/{4-module-tdd-implementation → erp-kit-module-4-tdd}/references/exports.md +1 -1
  24. package/skills/erp-kit-module-4-tdd/references/generated-code.md +32 -0
  25. package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/SKILL.md +46 -44
  26. package/skills/erp-kit-module-5-impl-review/references/commands.md +62 -0
  27. package/skills/erp-kit-module-5-impl-review/references/errors.md +10 -0
  28. package/skills/{5-module-implementation-review → erp-kit-module-5-impl-review}/references/testing.md +1 -1
  29. package/skills/erp-kit-module-shared/SKILL.md +16 -0
  30. package/skills/erp-kit-module-shared/references/commands.md +203 -0
  31. package/skills/erp-kit-module-shared/references/errors.md +35 -0
  32. package/skills/erp-kit-module-shared/references/queries.md +168 -0
  33. package/skills/erp-kit-module-shared/references/structure.md +36 -0
  34. package/skills/{3-module-doc-review → erp-kit-module-shared}/references/testing.md +4 -3
  35. package/skills/erp-kit-update/SKILL.md +64 -0
  36. package/src/cli.doc.test.ts +65 -0
  37. package/src/cli.ts +3 -35
  38. package/src/commands/app/index.ts +3 -3
  39. package/src/commands/check.test.ts +1 -1
  40. package/src/commands/check.ts +2 -2
  41. package/src/commands/index.ts +73 -0
  42. package/src/commands/init.test.ts +22 -5
  43. package/src/commands/init.ts +25 -16
  44. package/src/commands/license.ts +193 -0
  45. package/src/commands/mock/index.ts +2 -2
  46. package/src/commands/mock/start.ts +1 -1
  47. package/src/commands/mock/validate.test.ts +1 -1
  48. package/src/commands/module/generate.ts +35 -0
  49. package/src/commands/module/index.ts +6 -4
  50. package/src/commands/module/list.test.ts +7 -12
  51. package/src/commands/module/list.ts +1 -1
  52. package/src/commands/scaffold-templates.ts +65 -0
  53. package/src/commands/scaffold.test.ts +92 -2
  54. package/src/commands/scaffold.ts +22 -2
  55. package/src/commands/sync-check.test.ts +60 -1
  56. package/src/commands/sync-check.ts +35 -2
  57. package/src/generator/generate-code.test.ts +200 -0
  58. package/src/generator/generate-code.ts +260 -0
  59. package/src/generator/parse-command-doc.test.ts +159 -0
  60. package/src/generator/parse-command-doc.ts +116 -0
  61. package/src/integration.test.ts +2 -2
  62. package/src/module.ts +44 -6
  63. package/src/modules/item-management/README.md +38 -0
  64. package/src/modules/item-management/command/activateItem.generated.ts +6 -0
  65. package/src/modules/item-management/command/activateItem.test.ts +76 -0
  66. package/src/modules/item-management/command/activateItem.ts +42 -0
  67. package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +6 -0
  68. package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +88 -0
  69. package/src/modules/item-management/command/assignItemToTaxonomy.ts +63 -0
  70. package/src/modules/item-management/command/createItem.generated.ts +6 -0
  71. package/src/modules/item-management/command/createItem.test.ts +152 -0
  72. package/src/modules/item-management/command/createItem.ts +72 -0
  73. package/src/modules/item-management/command/createTaxonomyNode.generated.ts +6 -0
  74. package/src/modules/item-management/command/createTaxonomyNode.test.ts +126 -0
  75. package/src/modules/item-management/command/createTaxonomyNode.ts +70 -0
  76. package/src/modules/item-management/command/deactivateItem.generated.ts +6 -0
  77. package/src/modules/item-management/command/deactivateItem.test.ts +76 -0
  78. package/src/modules/item-management/command/deactivateItem.ts +42 -0
  79. package/src/modules/item-management/command/deleteItem.generated.ts +6 -0
  80. package/src/modules/item-management/command/deleteItem.test.ts +61 -0
  81. package/src/modules/item-management/command/deleteItem.ts +38 -0
  82. package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +6 -0
  83. package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +73 -0
  84. package/src/modules/item-management/command/deleteTaxonomyNode.ts +50 -0
  85. package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +6 -0
  86. package/src/modules/item-management/command/moveTaxonomyNode.test.ts +136 -0
  87. package/src/modules/item-management/command/moveTaxonomyNode.ts +85 -0
  88. package/src/modules/item-management/command/reactivateItem.generated.ts +6 -0
  89. package/src/modules/item-management/command/reactivateItem.test.ts +76 -0
  90. package/src/modules/item-management/command/reactivateItem.ts +42 -0
  91. package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +6 -0
  92. package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +43 -0
  93. package/src/modules/item-management/command/removeItemFromTaxonomy.ts +30 -0
  94. package/src/modules/item-management/command/updateItem.generated.ts +6 -0
  95. package/src/modules/item-management/command/updateItem.test.ts +178 -0
  96. package/src/modules/item-management/command/updateItem.ts +103 -0
  97. package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +6 -0
  98. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +88 -0
  99. package/src/modules/item-management/command/updateTaxonomyNode.ts +62 -0
  100. package/src/modules/item-management/db/item.ts +47 -0
  101. package/src/modules/item-management/db/itemTaxonomyAssignment.ts +49 -0
  102. package/src/modules/item-management/db/taxonomyNode.ts +34 -0
  103. package/src/modules/item-management/docs/commands/ActivateItem.md +32 -0
  104. package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +38 -0
  105. package/src/modules/item-management/docs/commands/CreateItem.md +44 -0
  106. package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +44 -0
  107. package/src/modules/item-management/docs/commands/DeactivateItem.md +34 -0
  108. package/src/modules/item-management/docs/commands/DeleteItem.md +35 -0
  109. package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +39 -0
  110. package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +45 -0
  111. package/src/modules/item-management/docs/commands/ReactivateItem.md +34 -0
  112. package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +30 -0
  113. package/src/modules/item-management/docs/commands/UpdateItem.md +55 -0
  114. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +36 -0
  115. package/src/modules/item-management/docs/features/item-lifecycle.md +60 -0
  116. package/src/modules/item-management/docs/features/item-taxonomy.md +65 -0
  117. package/src/modules/item-management/docs/models/ItemTaxonomyAssignment.md +36 -0
  118. package/src/modules/item-management/docs/models/TaxonomyNode.md +47 -0
  119. package/src/modules/item-management/docs/models/item.md +59 -0
  120. package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +36 -0
  121. package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +40 -0
  122. package/src/modules/item-management/docs/queries/DetectCircularReference.md +41 -0
  123. package/src/modules/item-management/docs/queries/GetItem.md +38 -0
  124. package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +29 -0
  125. package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +35 -0
  126. package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +29 -0
  127. package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +29 -0
  128. package/src/modules/item-management/generated/enums.ts +9 -0
  129. package/src/modules/item-management/generated/kysely-tailordb.ts +62 -0
  130. package/src/modules/item-management/index.ts +53 -0
  131. package/src/modules/item-management/lib/_db_deps.ts +13 -0
  132. package/src/modules/item-management/lib/errors.generated.ts +117 -0
  133. package/src/modules/item-management/lib/permissions.generated.ts +17 -0
  134. package/src/modules/item-management/lib/types.ts +19 -0
  135. package/src/modules/item-management/module.ts +97 -0
  136. package/src/modules/item-management/query/calculateNodeDepth.generated.ts +5 -0
  137. package/src/modules/item-management/query/calculateNodeDepth.test.ts +56 -0
  138. package/src/modules/item-management/query/calculateNodeDepth.ts +28 -0
  139. package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +5 -0
  140. package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +75 -0
  141. package/src/modules/item-management/query/calculateSubtreeDepth.ts +29 -0
  142. package/src/modules/item-management/query/detectCircularReference.generated.ts +5 -0
  143. package/src/modules/item-management/query/detectCircularReference.test.ts +61 -0
  144. package/src/modules/item-management/query/detectCircularReference.ts +32 -0
  145. package/src/modules/item-management/query/getItem.generated.ts +5 -0
  146. package/src/modules/item-management/query/getItem.test.ts +67 -0
  147. package/src/modules/item-management/query/getItem.ts +20 -0
  148. package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +5 -0
  149. package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +25 -0
  150. package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +18 -0
  151. package/src/modules/item-management/query/getTaxonomyNode.generated.ts +5 -0
  152. package/src/modules/item-management/query/getTaxonomyNode.test.ts +47 -0
  153. package/src/modules/item-management/query/getTaxonomyNode.ts +18 -0
  154. package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +5 -0
  155. package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +25 -0
  156. package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +16 -0
  157. package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +5 -0
  158. package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +34 -0
  159. package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +16 -0
  160. package/src/modules/item-management/tailor.config.ts +11 -0
  161. package/src/modules/item-management/testing/fixtures.ts +81 -0
  162. package/src/modules/primitives/command/activateCategory.generated.ts +6 -0
  163. package/src/modules/primitives/command/activateCategory.test.ts +11 -29
  164. package/src/modules/primitives/command/activateCategory.ts +27 -34
  165. package/src/modules/primitives/command/activateCurrency.generated.ts +6 -0
  166. package/src/modules/primitives/command/activateCurrency.test.ts +11 -29
  167. package/src/modules/primitives/command/activateCurrency.ts +27 -34
  168. package/src/modules/primitives/command/activateUnit.generated.ts +6 -0
  169. package/src/modules/primitives/command/activateUnit.test.ts +11 -15
  170. package/src/modules/primitives/command/activateUnit.ts +27 -34
  171. package/src/modules/primitives/command/createCategory.generated.ts +6 -0
  172. package/src/modules/primitives/command/createCategory.test.ts +27 -39
  173. package/src/modules/primitives/command/createCategory.ts +53 -62
  174. package/src/modules/primitives/command/createCurrency.generated.ts +6 -0
  175. package/src/modules/primitives/command/createCurrency.test.ts +78 -71
  176. package/src/modules/primitives/command/createCurrency.ts +43 -48
  177. package/src/modules/primitives/command/createExchangeRate.generated.ts +6 -0
  178. package/src/modules/primitives/command/createExchangeRate.test.ts +101 -100
  179. package/src/modules/primitives/command/createExchangeRate.ts +50 -59
  180. package/src/modules/primitives/command/createUnit.generated.ts +6 -0
  181. package/src/modules/primitives/command/createUnit.test.ts +92 -95
  182. package/src/modules/primitives/command/createUnit.ts +54 -57
  183. package/src/modules/primitives/command/deactivateCategory.generated.ts +6 -0
  184. package/src/modules/primitives/command/deactivateCategory.test.ts +27 -28
  185. package/src/modules/primitives/command/deactivateCategory.ts +43 -50
  186. package/src/modules/primitives/command/deactivateCurrency.generated.ts +6 -0
  187. package/src/modules/primitives/command/deactivateCurrency.test.ts +23 -38
  188. package/src/modules/primitives/command/deactivateCurrency.ts +31 -38
  189. package/src/modules/primitives/command/deactivateUnit.generated.ts +6 -0
  190. package/src/modules/primitives/command/deactivateUnit.test.ts +27 -23
  191. package/src/modules/primitives/command/deactivateUnit.ts +39 -49
  192. package/src/modules/primitives/command/setBaseCurrency.generated.ts +6 -0
  193. package/src/modules/primitives/command/setBaseCurrency.test.ts +40 -33
  194. package/src/modules/primitives/command/setBaseCurrency.ts +43 -50
  195. package/src/modules/primitives/command/setReferenceUnit.generated.ts +6 -0
  196. package/src/modules/primitives/command/setReferenceUnit.test.ts +39 -35
  197. package/src/modules/primitives/command/setReferenceUnit.ts +46 -59
  198. package/src/modules/primitives/db/unit.ts +13 -3
  199. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -2
  200. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -2
  201. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -2
  202. package/src/modules/primitives/docs/commands/CreateCategory.md +1 -4
  203. package/src/modules/primitives/docs/commands/CreateCurrency.md +3 -4
  204. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +4 -5
  205. package/src/modules/primitives/docs/commands/CreateUnit.md +5 -5
  206. package/src/modules/primitives/docs/commands/DeactivateCategory.md +2 -3
  207. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +2 -3
  208. package/src/modules/primitives/docs/commands/DeactivateUnit.md +2 -3
  209. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +2 -3
  210. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +2 -3
  211. package/src/modules/primitives/docs/queries/ConvertAmount.md +3 -5
  212. package/src/modules/primitives/docs/queries/ConvertQuantity.md +3 -5
  213. package/src/modules/primitives/docs/queries/GetBaseCurrency.md +32 -0
  214. package/src/modules/primitives/docs/queries/GetCurrency.md +36 -0
  215. package/src/modules/primitives/docs/queries/GetUnit.md +36 -0
  216. package/src/modules/primitives/docs/queries/GetUoMCategory.md +36 -0
  217. package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +26 -0
  218. package/src/modules/primitives/generated/kysely-tailordb.ts +24 -45
  219. package/src/modules/primitives/index.ts +15 -4
  220. package/src/modules/primitives/lib/errors.generated.ts +112 -0
  221. package/src/modules/primitives/{permissions.ts → lib/permissions.generated.ts} +9 -8
  222. package/src/modules/primitives/module.ts +37 -27
  223. package/src/modules/primitives/query/convertAmount.generated.ts +5 -0
  224. package/src/modules/primitives/query/convertAmount.test.ts +2 -2
  225. package/src/modules/primitives/query/convertAmount.ts +27 -28
  226. package/src/modules/primitives/query/convertQuantity.generated.ts +5 -0
  227. package/src/modules/primitives/query/convertQuantity.test.ts +6 -2
  228. package/src/modules/primitives/query/convertQuantity.ts +49 -57
  229. package/src/modules/primitives/query/getBaseCurrency.generated.ts +5 -0
  230. package/src/modules/primitives/query/getBaseCurrency.test.ts +28 -0
  231. package/src/modules/primitives/query/getBaseCurrency.ts +16 -0
  232. package/src/modules/primitives/query/getCurrency.generated.ts +5 -0
  233. package/src/modules/primitives/query/getCurrency.test.ts +47 -0
  234. package/src/modules/primitives/query/getCurrency.ts +18 -0
  235. package/src/modules/primitives/query/getUnit.generated.ts +5 -0
  236. package/src/modules/primitives/query/getUnit.test.ts +47 -0
  237. package/src/modules/primitives/query/getUnit.ts +18 -0
  238. package/src/modules/primitives/query/getUoMCategory.generated.ts +5 -0
  239. package/src/modules/primitives/query/getUoMCategory.test.ts +47 -0
  240. package/src/modules/primitives/query/getUoMCategory.ts +18 -0
  241. package/src/modules/primitives/query/listUnitsByCategory.generated.ts +5 -0
  242. package/src/modules/primitives/query/listUnitsByCategory.ts +16 -0
  243. package/src/modules/primitives/tailor.config.ts +3 -3
  244. package/src/modules/shared/defineCommand.test.ts +23 -10
  245. package/src/modules/shared/defineCommand.ts +23 -10
  246. package/src/modules/shared/internal.ts +1 -0
  247. package/src/modules/shared/requirePermission.test.ts +22 -21
  248. package/src/modules/shared/requirePermission.ts +8 -2
  249. package/src/modules/shared/result.ts +12 -0
  250. package/src/modules/testing/index.ts +36 -11
  251. package/src/modules/user-management/command/activateUser.generated.ts +6 -0
  252. package/src/modules/user-management/command/activateUser.test.ts +27 -27
  253. package/src/modules/user-management/command/activateUser.ts +40 -48
  254. package/src/modules/user-management/command/assignPermissionToRole.generated.ts +6 -0
  255. package/src/modules/user-management/command/assignPermissionToRole.test.ts +42 -43
  256. package/src/modules/user-management/command/assignPermissionToRole.ts +59 -62
  257. package/src/modules/user-management/command/assignRoleToUser.generated.ts +6 -0
  258. package/src/modules/user-management/command/assignRoleToUser.test.ts +70 -63
  259. package/src/modules/user-management/command/assignRoleToUser.ts +63 -66
  260. package/src/modules/user-management/command/createPermission.generated.ts +6 -0
  261. package/src/modules/user-management/command/createPermission.test.ts +45 -38
  262. package/src/modules/user-management/command/createPermission.ts +42 -46
  263. package/src/modules/user-management/command/createRole.generated.ts +6 -0
  264. package/src/modules/user-management/command/createRole.test.ts +30 -29
  265. package/src/modules/user-management/command/createRole.ts +33 -33
  266. package/src/modules/user-management/command/createUser.generated.ts +6 -0
  267. package/src/modules/user-management/command/createUser.test.ts +64 -42
  268. package/src/modules/user-management/command/createUser.ts +54 -56
  269. package/src/modules/user-management/command/deactivateUser.generated.ts +6 -0
  270. package/src/modules/user-management/command/deactivateUser.test.ts +27 -27
  271. package/src/modules/user-management/command/deactivateUser.ts +40 -48
  272. package/src/modules/user-management/command/logAuditEvent.generated.ts +6 -0
  273. package/src/modules/user-management/command/logAuditEvent.test.ts +50 -42
  274. package/src/modules/user-management/command/logAuditEvent.ts +25 -28
  275. package/src/modules/user-management/command/reactivateUser.generated.ts +6 -0
  276. package/src/modules/user-management/command/reactivateUser.test.ts +31 -27
  277. package/src/modules/user-management/command/reactivateUser.ts +40 -48
  278. package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +6 -0
  279. package/src/modules/user-management/command/revokePermissionFromRole.test.ts +52 -51
  280. package/src/modules/user-management/command/revokePermissionFromRole.ts +60 -57
  281. package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +6 -0
  282. package/src/modules/user-management/command/revokeRoleFromUser.test.ts +53 -48
  283. package/src/modules/user-management/command/revokeRoleFromUser.ts +58 -57
  284. package/src/modules/user-management/docs/commands/CreatePermission.md +2 -2
  285. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  286. package/src/modules/user-management/generated/enums.ts +11 -11
  287. package/src/modules/user-management/generated/kysely-tailordb.ts +27 -56
  288. package/src/modules/user-management/index.ts +2 -2
  289. package/src/modules/user-management/lib/errors.generated.ts +67 -0
  290. package/src/modules/user-management/{permissions.ts → lib/permissions.generated.ts} +8 -7
  291. package/src/modules/user-management/module.ts +22 -22
  292. package/src/modules/user-management/tailor.config.ts +3 -3
  293. package/src/schemas.ts +1 -1
  294. package/skills/1-module-docs/references/structure.md +0 -22
  295. package/skills/2-module-feature-breakdown/references/commands.md +0 -48
  296. package/skills/2-module-feature-breakdown/references/structure.md +0 -22
  297. package/skills/3-module-doc-review/references/commands.md +0 -54
  298. package/skills/3-module-doc-review/references/models.md +0 -29
  299. package/skills/4-module-tdd-implementation/SKILL.md +0 -74
  300. package/skills/4-module-tdd-implementation/references/commands.md +0 -45
  301. package/skills/4-module-tdd-implementation/references/errors.md +0 -7
  302. package/skills/4-module-tdd-implementation/references/models.md +0 -30
  303. package/skills/4-module-tdd-implementation/references/structure.md +0 -22
  304. package/skills/4-module-tdd-implementation/references/testing.md +0 -37
  305. package/skills/5-module-implementation-review/references/commands.md +0 -45
  306. package/skills/5-module-implementation-review/references/errors.md +0 -7
  307. package/skills/5-module-implementation-review/references/exports.md +0 -8
  308. package/skills/5-module-implementation-review/references/models.md +0 -30
  309. package/skills/app-compose-1-requirement-analysis/references/structure.md +0 -27
  310. package/skills/app-compose-2-requirements-breakdown/references/screen-detailview.md +0 -106
  311. package/skills/app-compose-2-requirements-breakdown/references/screen-form.md +0 -139
  312. package/skills/app-compose-2-requirements-breakdown/references/screen-listview.md +0 -153
  313. package/skills/app-compose-2-requirements-breakdown/references/structure.md +0 -27
  314. package/skills/app-compose-3-doc-review/references/structure.md +0 -27
  315. package/skills/app-compose-4-design-mock/SKILL.md +0 -256
  316. package/skills/app-compose-4-design-mock/references/component.md +0 -50
  317. package/skills/app-compose-4-design-mock/references/screen-detailview.md +0 -106
  318. package/skills/app-compose-4-design-mock/references/screen-form.md +0 -139
  319. package/skills/app-compose-4-design-mock/references/screen-listview.md +0 -153
  320. package/skills/app-compose-4-design-mock/references/structure.md +0 -27
  321. package/skills/app-compose-5-design-mock-review/SKILL.md +0 -290
  322. package/skills/app-compose-5-design-mock-review/references/component.md +0 -50
  323. package/skills/app-compose-5-design-mock-review/references/screen-detailview.md +0 -106
  324. package/skills/app-compose-5-design-mock-review/references/screen-form.md +0 -139
  325. package/skills/app-compose-5-design-mock-review/references/screen-listview.md +0 -153
  326. package/skills/app-compose-6-implementation-spec/references/auth.md +0 -72
  327. package/skills/app-compose-6-implementation-spec/references/structure.md +0 -27
  328. package/src/modules/primitives/lib/errors.ts +0 -138
  329. package/src/modules/user-management/lib/errors.ts +0 -81
  330. /package/skills/{2-module-feature-breakdown → erp-kit-module-4-tdd}/references/models.md +0 -0
@@ -1,11 +1,11 @@
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
  DuplicateCurrencyCodeError,
5
5
  InvalidDecimalPlacesError,
6
- InvalidISOCodeError,
7
- } from "../lib/errors";
8
- import { permissions } from "../permissions";
6
+ InvalidIsoCodeError,
7
+ } from "../lib/errors.generated";
8
+ import { getCurrency } from "../query/getCurrency.generated";
9
9
 
10
10
  interface CreateCurrencyInput {
11
11
  code: string;
@@ -22,56 +22,51 @@ const ISO_CODE_PATTERN = /^[A-Z]{3}$/;
22
22
  * Establishes a new monetary unit with its ISO 4217 code, display symbol,
23
23
  * name, and decimal precision. The first currency becomes the base currency.
24
24
  */
25
- export function makeCreateCurrency<CF extends Record<string, unknown>>() {
26
- return defineCommand(
27
- permissions.createCurrency,
28
- async (db: DB, input: CreateCurrencyInput & CF) => {
29
- const { code, name, symbol, decimalPlaces, ...customFields } = input;
25
+ export async function run<CF extends Record<string, unknown>>(
26
+ db: DB,
27
+ input: CreateCurrencyInput & CF,
28
+ ctx: CommandContext,
29
+ ) {
30
+ const { code, name, symbol, decimalPlaces, ...customFields } = input;
30
31
 
31
- // 1. Validate ISO code format
32
- if (!ISO_CODE_PATTERN.test(code)) {
33
- throw new InvalidISOCodeError(code);
34
- }
32
+ // 1. Validate ISO code format
33
+ if (!ISO_CODE_PATTERN.test(code)) {
34
+ return err(new InvalidIsoCodeError(code));
35
+ }
35
36
 
36
- // 2. Check code uniqueness
37
- const existingCurrency = await db
38
- .selectFrom("Currency")
39
- .selectAll()
40
- .where("code", "=", code)
41
- .executeTakeFirst();
37
+ // 2. Check code uniqueness
38
+ const { currency: existingCurrency } = await getCurrency(db, { code }, ctx);
42
39
 
43
- if (existingCurrency) {
44
- throw new DuplicateCurrencyCodeError(code);
45
- }
40
+ if (existingCurrency) {
41
+ return err(new DuplicateCurrencyCodeError(code));
42
+ }
46
43
 
47
- // 3. Validate decimal places
48
- if (decimalPlaces < 0 || decimalPlaces > 4) {
49
- throw new InvalidDecimalPlacesError(decimalPlaces);
50
- }
44
+ // 3. Validate decimal places
45
+ if (decimalPlaces < 0 || decimalPlaces > 4) {
46
+ return err(new InvalidDecimalPlacesError(String(decimalPlaces)));
47
+ }
51
48
 
52
- // 4. Check if this is the first currency
53
- const anyCurrency = await db.selectFrom("Currency").selectAll().executeTakeFirst();
49
+ // 4. Check if this is the first currency
50
+ const anyCurrency = await db.selectFrom("Currency").selectAll().executeTakeFirst();
54
51
 
55
- const isBaseCurrency = !anyCurrency;
52
+ const isBaseCurrency = !anyCurrency;
56
53
 
57
- // 5. Create currency
58
- const currency = await db
59
- .insertInto("Currency")
60
- .values({
61
- ...(customFields as Record<string, unknown>),
62
- code,
63
- name,
64
- symbol,
65
- decimalPlaces,
66
- isBaseCurrency,
67
- isActive: true,
68
- createdAt: new Date(),
69
- updatedAt: null,
70
- })
71
- .returningAll()
72
- .executeTakeFirst();
54
+ // 5. Create currency
55
+ const currency = await db
56
+ .insertInto("Currency")
57
+ .values({
58
+ ...(customFields as Record<string, unknown>),
59
+ code,
60
+ name,
61
+ symbol,
62
+ decimalPlaces,
63
+ isBaseCurrency,
64
+ isActive: true,
65
+ createdAt: new Date(),
66
+ updatedAt: null,
67
+ })
68
+ .returningAll()
69
+ .executeTakeFirst();
73
70
 
74
- return { currency: currency! };
75
- },
76
- );
71
+ return ok({ currency: currency! });
77
72
  }
@@ -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 "./createExchangeRate";
5
+
6
+ export const createExchangeRate = defineCommand(permissions.createExchangeRate, run);
@@ -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);