@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
@@ -0,0 +1,73 @@
1
+ import { z } from "zod";
2
+ import { defineCommand, arg } from "politty";
3
+ import { runInit } from "./init";
4
+ import { runLicenseCheck, runLicenseList } from "./license";
5
+ import { moduleCommand } from "./module/index";
6
+ import { appCommand } from "./app/index";
7
+ import { mockCommand } from "./mock/index";
8
+
9
+ export { moduleCommand } from "./module/index";
10
+ export { appCommand } from "./app/index";
11
+ export { mockCommand } from "./mock/index";
12
+
13
+ const cwd = process.cwd();
14
+
15
+ export const initCommand = defineCommand({
16
+ name: "init",
17
+ description: "Set up consumer repo with framework skills",
18
+ args: z.object({
19
+ force: arg(z.boolean().default(false), {
20
+ alias: "f",
21
+ description: "Overwrite existing skills",
22
+ }),
23
+ }),
24
+ run: (args) => {
25
+ const exitCode = runInit(cwd, args.force);
26
+ process.exit(exitCode);
27
+ },
28
+ });
29
+
30
+ const licenseCheckCommand = defineCommand({
31
+ name: "check",
32
+ description: "Check dependency licenses against allowlist",
33
+ args: z.object({
34
+ config: arg(z.string(), {
35
+ alias: "c",
36
+ description: "Path to license config JSON file",
37
+ }),
38
+ }),
39
+ run: (args) => {
40
+ const exitCode = runLicenseCheck(args.config);
41
+ process.exit(exitCode);
42
+ },
43
+ });
44
+
45
+ const licenseListCommand = defineCommand({
46
+ name: "list",
47
+ description: "List available license groups",
48
+ run: () => {
49
+ const exitCode = runLicenseList();
50
+ process.exit(exitCode);
51
+ },
52
+ });
53
+
54
+ const licenseCommand = defineCommand({
55
+ name: "license",
56
+ description: "License management",
57
+ subCommands: {
58
+ check: licenseCheckCommand,
59
+ list: licenseListCommand,
60
+ },
61
+ });
62
+
63
+ export const mainCommand = defineCommand({
64
+ name: "erp-kit",
65
+ description: "ERP module framework CLI",
66
+ subCommands: {
67
+ module: moduleCommand,
68
+ app: appCommand,
69
+ mock: mockCommand,
70
+ init: initCommand,
71
+ license: licenseCommand,
72
+ },
73
+ });
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { describe, it, expect, beforeEach, afterEach } from "vitest";
5
- import { runInit } from "./init.js";
5
+ import { runInit } from "./init";
6
6
 
7
7
  describe("runInit", () => {
8
8
  let tmpDir: string;
@@ -17,7 +17,7 @@ describe("runInit", () => {
17
17
 
18
18
  it("copies framework skills to .agents/skills/", () => {
19
19
  runInit(tmpDir, false);
20
- const skillPath = path.join(tmpDir, ".agents", "skills", "1-module-docs", "SKILL.md");
20
+ const skillPath = path.join(tmpDir, ".agents", "skills", "erp-kit-module-1-docs", "SKILL.md");
21
21
  expect(fs.existsSync(skillPath)).toBe(true);
22
22
  });
23
23
 
@@ -27,7 +27,7 @@ describe("runInit", () => {
27
27
  tmpDir,
28
28
  ".agents",
29
29
  "skills",
30
- "4-module-tdd-implementation",
30
+ "erp-kit-module-4-tdd",
31
31
  "references",
32
32
  "models.md",
33
33
  );
@@ -47,7 +47,7 @@ describe("runInit", () => {
47
47
  });
48
48
 
49
49
  it("does not overwrite existing framework skills", () => {
50
- const skillDir = path.join(tmpDir, ".agents", "skills", "1-module-docs");
50
+ const skillDir = path.join(tmpDir, ".agents", "skills", "erp-kit-module-1-docs");
51
51
  fs.mkdirSync(skillDir, { recursive: true });
52
52
  fs.writeFileSync(path.join(skillDir, "SKILL.md"), "# Customized");
53
53
  runInit(tmpDir, false);
@@ -56,7 +56,7 @@ describe("runInit", () => {
56
56
  });
57
57
 
58
58
  it("overwrites existing framework skills with --force", () => {
59
- const skillDir = path.join(tmpDir, ".agents", "skills", "1-module-docs");
59
+ const skillDir = path.join(tmpDir, ".agents", "skills", "erp-kit-module-1-docs");
60
60
  fs.mkdirSync(skillDir, { recursive: true });
61
61
  fs.writeFileSync(path.join(skillDir, "SKILL.md"), "# Customized");
62
62
  runInit(tmpDir, true);
@@ -78,6 +78,23 @@ describe("runInit", () => {
78
78
  expect(fs.lstatSync(claudeSkills).isSymbolicLink()).toBe(false);
79
79
  });
80
80
 
81
+ it("removes stale erp-kit-* skills with --force", () => {
82
+ const staleDir = path.join(tmpDir, ".agents", "skills", "erp-kit-old-skill");
83
+ fs.mkdirSync(staleDir, { recursive: true });
84
+ fs.writeFileSync(path.join(staleDir, "SKILL.md"), "# Stale");
85
+ runInit(tmpDir, true);
86
+ expect(fs.existsSync(staleDir)).toBe(false);
87
+ });
88
+
89
+ it("preserves non-erp-kit skills with --force", () => {
90
+ const customDir = path.join(tmpDir, ".agents", "skills", "my-custom-skill");
91
+ fs.mkdirSync(customDir, { recursive: true });
92
+ fs.writeFileSync(path.join(customDir, "SKILL.md"), "# Custom");
93
+ runInit(tmpDir, true);
94
+ expect(fs.existsSync(path.join(customDir, "SKILL.md"))).toBe(true);
95
+ expect(fs.readFileSync(path.join(customDir, "SKILL.md"), "utf-8")).toBe("# Custom");
96
+ });
97
+
81
98
  it("relinks symlink with --force when target differs", () => {
82
99
  const claudeSkills = path.join(tmpDir, ".claude", "skills");
83
100
  fs.mkdirSync(path.dirname(claudeSkills), { recursive: true });
@@ -1,24 +1,17 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import chalk from "chalk";
4
- import { PACKAGE_ROOT } from "../util.js";
4
+ import { PACKAGE_ROOT } from "../util";
5
5
 
6
6
  const SKILLS_SRC = path.join(PACKAGE_ROOT, "skills");
7
7
 
8
- const FRAMEWORK_SKILLS = [
9
- "1-module-docs",
10
- "2-module-feature-breakdown",
11
- "3-module-doc-review",
12
- "4-module-tdd-implementation",
13
- "5-module-implementation-review",
14
- "app-compose-1-requirement-analysis",
15
- "app-compose-2-requirements-breakdown",
16
- "app-compose-3-doc-review",
17
- "app-compose-4-design-mock",
18
- "app-compose-5-design-mock-review",
19
- "app-compose-6-implementation-spec",
20
- "mock-scenario",
21
- ];
8
+ function discoverFrameworkSkills(): string[] {
9
+ if (!fs.existsSync(SKILLS_SRC)) return [];
10
+ return fs
11
+ .readdirSync(SKILLS_SRC, { withFileTypes: true })
12
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith("erp-kit-"))
13
+ .map((entry) => entry.name);
14
+ }
22
15
 
23
16
  function copyDirectoryRecursive(
24
17
  srcDir: string,
@@ -55,9 +48,25 @@ export function runInit(cwd: string, force: boolean): number {
55
48
 
56
49
  // --- Skills ---
57
50
  const skillsDest = path.join(cwd, ".agents", "skills");
51
+
52
+ // Clean up existing erp-kit-* skills before copying to remove stale names
53
+ if (force && fs.existsSync(skillsDest)) {
54
+ let removedCount = 0;
55
+ for (const entry of fs.readdirSync(skillsDest)) {
56
+ if (entry.startsWith("erp-kit-")) {
57
+ fs.rmSync(path.join(skillsDest, entry), { recursive: true, force: true });
58
+ removedCount++;
59
+ }
60
+ }
61
+ if (removedCount > 0) {
62
+ console.log(chalk.green(` Removed ${removedCount} existing erp-kit-* skills`));
63
+ }
64
+ }
65
+
58
66
  let copiedCount = 0;
59
67
  let skippedCount = 0;
60
- for (const skill of FRAMEWORK_SKILLS) {
68
+ const frameworkSkills = discoverFrameworkSkills();
69
+ for (const skill of frameworkSkills) {
61
70
  const srcSkillDir = path.join(SKILLS_SRC, skill);
62
71
  if (!fs.existsSync(srcSkillDir)) continue;
63
72
 
@@ -0,0 +1,193 @@
1
+ import fs from "node:fs";
2
+ import { execSync } from "node:child_process";
3
+
4
+ // License groups based on Google licenseclassifier categories
5
+ // https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go
6
+ export const licenseGroups = {
7
+ // https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go#L225
8
+ reciprocal: [
9
+ "APSL-1.0",
10
+ "APSL-1.1",
11
+ "APSL-1.2",
12
+ "APSL-2.0",
13
+ "CDDL-1.0",
14
+ "CDDL-1.1",
15
+ "CPL-1.0",
16
+ "EPL-1.0",
17
+ "EPL-2.0",
18
+ "FreeImage",
19
+ "IPL-1.0",
20
+ "MPL-1.0",
21
+ "MPL-1.1",
22
+ "MPL-2.0",
23
+ "Ruby",
24
+ ],
25
+ // https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go#L249
26
+ notice: [
27
+ "AFL-1.1",
28
+ "AFL-1.2",
29
+ "AFL-2.0",
30
+ "AFL-2.1",
31
+ "AFL-3.0",
32
+ "Apache-1.0",
33
+ "Apache-1.1",
34
+ "Apache-2.0",
35
+ "Artistic-1.0-cl8",
36
+ "Artistic-1.0-Perl",
37
+ "Artistic-1.0",
38
+ "Artistic-2.0",
39
+ "BSL-1.0",
40
+ "BSD-2-Clause-FreeBSD",
41
+ "BSD-2-Clause-NetBSD",
42
+ "BSD-2-Clause",
43
+ "BSD-3-Clause-Attribution",
44
+ "BSD-3-Clause-Clear",
45
+ "BSD-3-Clause-LBNL",
46
+ "BSD-3-Clause",
47
+ "BSD-4-Clause",
48
+ "BSD-4-Clause-UC",
49
+ "BSD-Protection",
50
+ "CC-BY-1.0",
51
+ "CC-BY-2.0",
52
+ "CC-BY-2.5",
53
+ "CC-BY-3.0",
54
+ "CC-BY-4.0",
55
+ "FTL",
56
+ "ISC",
57
+ "ImageMagick",
58
+ "Libpng",
59
+ "Lil-1.0",
60
+ "Linux-OpenIB",
61
+ "LPL-1.02",
62
+ "LPL-1.0",
63
+ "MS-PL",
64
+ "MIT",
65
+ "NCSA",
66
+ "OpenSSL",
67
+ "PHP-3.01",
68
+ "PHP-3.0",
69
+ "PIL",
70
+ "Python-2.0",
71
+ "Python-2.0-complete",
72
+ "PostgreSQL",
73
+ "SGI-B-1.0",
74
+ "SGI-B-1.1",
75
+ "SGI-B-2.0",
76
+ "Unicode-DFS-2015",
77
+ "Unicode-DFS-2016",
78
+ "Unicode-TOU",
79
+ "UPL-1.0",
80
+ "W3C-19980720",
81
+ "W3C-20150513",
82
+ "W3C",
83
+ "X11",
84
+ "Xnet",
85
+ "Zend-2.0",
86
+ "zlib-acknowledgement",
87
+ "Zlib",
88
+ "ZPL-1.1",
89
+ "ZPL-2.0",
90
+ "ZPL-2.1",
91
+ ],
92
+ // https://github.com/google/licenseclassifier/blob/e6a9bb99b5a6f71d5a34336b8245e305f5430f99/license_type.go#L324
93
+ unencumbered: ["CC0-1.0", "Unlicense", "0BSD"],
94
+ } as const;
95
+
96
+ export type LicenseGroup = keyof typeof licenseGroups;
97
+
98
+ interface LicenseConfig {
99
+ groups: LicenseGroup[];
100
+ allow?: string[];
101
+ deny?: string[];
102
+ }
103
+
104
+ function buildAllowSet(config: LicenseConfig): Set<string> {
105
+ const set = new Set<string>();
106
+ for (const group of config.groups) {
107
+ for (const license of licenseGroups[group]) {
108
+ set.add(license);
109
+ }
110
+ }
111
+ if (config.allow) {
112
+ for (const license of config.allow) {
113
+ set.add(license);
114
+ }
115
+ }
116
+ if (config.deny) {
117
+ for (const license of config.deny) {
118
+ set.delete(license);
119
+ }
120
+ }
121
+ return set;
122
+ }
123
+
124
+ function isLicenseAllowed(licenseString: string, allowSet: Set<string>): boolean {
125
+ if (/\s+(?:OR|AND)\s+/i.test(licenseString)) {
126
+ const licenses = licenseString
127
+ .replace(/[()]/g, "")
128
+ .trim()
129
+ .split(/\s+(?:OR|AND)\s+/i)
130
+ .map((l) => l.trim())
131
+ .filter((l) => l.length > 0);
132
+ return licenses.every((l) => allowSet.has(l));
133
+ }
134
+ return allowSet.has(licenseString);
135
+ }
136
+
137
+ export interface LicenseViolation {
138
+ package: string;
139
+ license: string;
140
+ }
141
+
142
+ export function runLicenseList(): number {
143
+ for (const [group, licenses] of Object.entries(licenseGroups)) {
144
+ console.log(`${group} (${licenses.length} licenses):`);
145
+ for (const license of licenses) {
146
+ console.log(` ${license}`);
147
+ }
148
+ console.log();
149
+ }
150
+ return 0;
151
+ }
152
+
153
+ export function runLicenseCheck(configPath: string): number {
154
+ const raw = fs.readFileSync(configPath, "utf-8");
155
+ const config = JSON.parse(raw) as LicenseConfig;
156
+
157
+ const validGroups = Object.keys(licenseGroups);
158
+ for (const group of config.groups) {
159
+ if (!validGroups.includes(group)) {
160
+ console.error(`Unknown license group: "${group}". Valid groups: ${validGroups.join(", ")}`);
161
+ return 2;
162
+ }
163
+ }
164
+
165
+ const allowSet = buildAllowSet(config);
166
+
167
+ console.log("Checking licenses...\n");
168
+ execSync("pnpm licenses list", { stdio: "inherit" });
169
+
170
+ const output = execSync("pnpm licenses list --json");
171
+ const licensesJson = JSON.parse(output.toString()) as Record<string, { name: string }[]>;
172
+
173
+ const violations: LicenseViolation[] = [];
174
+ for (const [license, packages] of Object.entries(licensesJson)) {
175
+ if (!isLicenseAllowed(license, allowSet)) {
176
+ for (const pkg of packages) {
177
+ violations.push({ package: pkg.name, license });
178
+ }
179
+ }
180
+ }
181
+
182
+ if (violations.length === 0) {
183
+ console.log("All licenses are allowed.");
184
+ return 0;
185
+ }
186
+
187
+ console.error("Found dependencies with disallowed licenses:\n");
188
+ for (const violation of violations) {
189
+ console.error(` - ${violation.package}`);
190
+ console.error(` License: ${violation.license}\n`);
191
+ }
192
+ return 1;
193
+ }
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { defineCommand, arg } from "politty";
3
- import { runMockStart } from "./start.js";
4
- import { runMockValidate } from "./validate.js";
3
+ import { runMockStart } from "./start";
4
+ import { runMockValidate } from "./validate";
5
5
 
6
6
  const startCommand = defineCommand({
7
7
  name: "start",
@@ -2,7 +2,7 @@ import { createServer, request as httpRequest } from "node:http";
2
2
  import { createServer as createNetServer } from "node:net";
3
3
  import { existsSync, readdirSync } from "node:fs";
4
4
  import { resolve, relative, join } from "node:path";
5
- import { createMockServer, type MockServer } from "../../mockServer.js";
5
+ import { createMockServer, type MockServer } from "../../mockServer";
6
6
 
7
7
  interface MockEntry {
8
8
  provider: string;
@@ -2,7 +2,7 @@ import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { tmpdir } from "node:os";
4
4
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
5
- import { runMockValidate } from "./validate.js";
5
+ import { runMockValidate } from "./validate";
6
6
 
7
7
  let tempDir: string;
8
8
 
@@ -0,0 +1,35 @@
1
+ import path from "node:path";
2
+ import { defineCommand, arg } from "politty";
3
+ import { z } from "zod";
4
+ import { runGenerateCode } from "../../generator/generate-code";
5
+
6
+ const cwd = process.cwd();
7
+
8
+ const codeCommand = defineCommand({
9
+ name: "code",
10
+ description: "Generate errors, permissions, command shells, and query shells from docs",
11
+ args: z.object({
12
+ root: arg(z.string(), {
13
+ alias: "r",
14
+ description: "Path to modules directory",
15
+ }),
16
+ module: arg(z.string(), {
17
+ positional: true,
18
+ description: "Module name (e.g., primitives, item-management)",
19
+ }),
20
+ }),
21
+ run: (args) => {
22
+ const modulePath = path.resolve(cwd, args.root, args.module);
23
+ console.log(`Generating code for ${args.module}...`);
24
+ const exitCode = runGenerateCode(modulePath, args.module);
25
+ process.exit(exitCode);
26
+ },
27
+ });
28
+
29
+ export const generateCommand = defineCommand({
30
+ name: "generate",
31
+ description: "Generate code from model definitions and docs",
32
+ subCommands: {
33
+ code: codeCommand,
34
+ },
35
+ });
@@ -1,9 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { defineCommand, arg } from "politty";
3
- import { runCheck } from "../check.js";
4
- import { runSyncCheck, formatSyncCheckReport } from "../sync-check.js";
5
- import { runScaffold, MODULE_TYPES, type ScaffoldType } from "../scaffold.js";
6
- import { runModuleList } from "./list.js";
3
+ import { runCheck } from "../check";
4
+ import { runSyncCheck, formatSyncCheckReport } from "../sync-check";
5
+ import { runScaffold, MODULE_TYPES, type ScaffoldType } from "../scaffold";
6
+ import { runModuleList } from "./list";
7
+ import { generateCommand } from "./generate";
7
8
 
8
9
  const cwd = process.cwd();
9
10
 
@@ -81,5 +82,6 @@ export const moduleCommand = defineCommand({
81
82
  check: checkCommand,
82
83
  "sync-check": syncCheckCommand,
83
84
  scaffold: scaffoldCommand,
85
+ generate: generateCommand,
84
86
  },
85
87
  });
@@ -1,8 +1,8 @@
1
1
  import { describe, it, expect } from "vitest";
2
+ import { listModules, formatModuleList } from "./list";
2
3
 
3
4
  describe("listModules", () => {
4
- it("returns the built-in modules with counts", async () => {
5
- const { listModules } = await import("./list.js");
5
+ it("returns the built-in modules with counts", () => {
6
6
  const modules = listModules();
7
7
  expect(modules.length).toBeGreaterThan(0);
8
8
 
@@ -13,8 +13,7 @@ describe("listModules", () => {
13
13
  expect(primitives!.features).toBeGreaterThan(0);
14
14
  });
15
15
 
16
- it("returns zero counts for stub modules", async () => {
17
- const { listModules } = await import("./list.js");
16
+ it("returns zero counts for stub modules", () => {
18
17
  const modules = listModules();
19
18
  const inventory = modules.find((m) => m.name === "inventory");
20
19
  expect(inventory).toBeDefined();
@@ -23,16 +22,14 @@ describe("listModules", () => {
23
22
  expect(inventory!.features).toBe(0);
24
23
  });
25
24
 
26
- it("excludes shared and testing directories", async () => {
27
- const { listModules } = await import("./list.js");
25
+ it("excludes shared and testing directories", () => {
28
26
  const modules = listModules();
29
27
  const names = modules.map((m) => m.name);
30
28
  expect(names).not.toContain("shared");
31
29
  expect(names).not.toContain("testing");
32
30
  });
33
31
 
34
- it("returns modules in alphabetical order", async () => {
35
- const { listModules } = await import("./list.js");
32
+ it("returns modules in alphabetical order", () => {
36
33
  const modules = listModules();
37
34
  const names = modules.map((m) => m.name);
38
35
  const sorted = [...names].sort();
@@ -41,8 +38,7 @@ describe("listModules", () => {
41
38
  });
42
39
 
43
40
  describe("formatModuleList", () => {
44
- it("formats modules with counts", async () => {
45
- const { formatModuleList } = await import("./list.js");
41
+ it("formats modules with counts", () => {
46
42
  const output = formatModuleList([
47
43
  { name: "primitives", commands: 14, models: 4, features: 4 },
48
44
  { name: "inventory", commands: 0, models: 0, features: 0 },
@@ -55,8 +51,7 @@ describe("formatModuleList", () => {
55
51
  expect(output).toContain("2 modules");
56
52
  });
57
53
 
58
- it("handles empty list", async () => {
59
- const { formatModuleList } = await import("./list.js");
54
+ it("handles empty list", () => {
60
55
  expect(formatModuleList([])).toBe("No modules found.");
61
56
  });
62
57
  });
@@ -1,7 +1,7 @@
1
1
  import { readdirSync, existsSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import chalk from "chalk";
4
- import { PACKAGE_ROOT } from "../../util.js";
4
+ import { PACKAGE_ROOT } from "../../util";
5
5
 
6
6
  const MODULES_DIR = join(PACKAGE_ROOT, "src", "modules");
7
7
  const EXCLUDED_DIRS = new Set(["shared", "testing"]);
@@ -0,0 +1,65 @@
1
+ export type TemplateEntry =
2
+ | { type: "dir"; path: string }
3
+ | { type: "file"; path: string; content: (moduleName: string) => string };
4
+
5
+ export function getModuleSrcTemplates(): TemplateEntry[] {
6
+ return [
7
+ { type: "dir", path: "db" },
8
+ { type: "dir", path: "command" },
9
+ { type: "dir", path: "executor" },
10
+ { type: "dir", path: "generated" },
11
+ { type: "dir", path: "query" },
12
+ { type: "file", path: "module.ts", content: () => MODULE_TEMPLATE },
13
+ { type: "file", path: "index.ts", content: () => INDEX_TEMPLATE },
14
+ { type: "file", path: "permissions.ts", content: (n) => permissionsTemplate(n) },
15
+ { type: "file", path: "tailor.config.ts", content: (n) => tailorConfigTemplate(n) },
16
+ { type: "file", path: "lib/errors.ts", content: () => ERRORS_TEMPLATE },
17
+ { type: "file", path: "lib/types.ts", content: () => TYPES_TEMPLATE },
18
+ { type: "file", path: "testing/fixtures.ts", content: () => FIXTURES_TEMPLATE },
19
+ ];
20
+ }
21
+
22
+ const MODULE_TEMPLATE = `export const defineModule = () => {
23
+ return {
24
+ db: {},
25
+ commands: {},
26
+ queries: {},
27
+ };
28
+ };
29
+ `;
30
+
31
+ const INDEX_TEMPLATE = `export { defineModule } from "./module";
32
+ export { permissions, own, all } from "./permissions";
33
+ `;
34
+
35
+ const ERRORS_TEMPLATE = `import { createDomainError } from "../../shared/internal";\n`;
36
+
37
+ const TYPES_TEMPLATE = `import type { InferSchema, Selectable, Insertable, Updateable } from "../../shared/internal";
38
+ import type { DB } from "../generated/kysely-tailordb";
39
+
40
+ export type Schema = InferSchema<DB>;
41
+ `;
42
+
43
+ const FIXTURES_TEMPLATE = `// Add test fixtures here\n`;
44
+
45
+ function permissionsTemplate(moduleName: string): string {
46
+ return `import { definePermissions } from "../shared/internal";
47
+
48
+ export const { permissions, own, all } = definePermissions("${moduleName}", [] as const);
49
+ `;
50
+ }
51
+
52
+ function tailorConfigTemplate(moduleName: string): string {
53
+ return `import { defineConfig, defineGenerators } from "@tailor-platform/sdk";
54
+
55
+ export default defineConfig({
56
+ name: "${moduleName}",
57
+ db: { "main-db": { files: [\`./db/*.ts\`] } },
58
+ });
59
+
60
+ export const generators = defineGenerators(
61
+ ["@tailor-platform/kysely-type", { distPath: \`./generated/kysely-tailordb.ts\` }],
62
+ ["@tailor-platform/enum-constants", { distPath: "./generated/enums.ts" }],
63
+ );
64
+ `;
65
+ }