@tailor-platform/erp-kit 0.2.2 → 0.4.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 (639) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +193 -69
  3. package/dist/cli.mjs +1038 -398
  4. package/package.json +7 -5
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +27 -17
  6. package/skills/erp-kit-app-2-requirements-review/SKILL.md +5 -4
  7. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +10 -1
  8. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +10 -1
  9. package/skills/erp-kit-app-3-plan/SKILL.md +31 -34
  10. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +22 -36
  11. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
  12. package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
  13. package/skills/erp-kit-app-4-plan-review/SKILL.md +1 -10
  14. package/skills/erp-kit-app-5-impl-backend/SKILL.md +10 -19
  15. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  16. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  17. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  18. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
  19. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  20. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
  21. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  22. package/skills/erp-kit-app-shared/SKILL.md +15 -0
  23. package/skills/erp-kit-app-shared/references/link-format-reference.md +13 -0
  24. package/skills/erp-kit-app-shared/references/naming-conventions.md +21 -0
  25. package/skills/erp-kit-app-shared/references/resolver-classification.md +23 -0
  26. package/skills/erp-kit-app-shared/references/schema-constraints.md +25 -0
  27. package/skills/erp-kit-module-1-requirements/SKILL.md +7 -13
  28. package/skills/erp-kit-module-1-requirements/references/feature-doc.md +1 -1
  29. package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
  30. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  31. package/skills/erp-kit-module-3-plan/SKILL.md +6 -8
  32. package/skills/erp-kit-module-3-plan/references/naming.md +15 -1
  33. package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
  34. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  35. package/skills/erp-kit-module-5-impl/SKILL.md +12 -10
  36. package/skills/erp-kit-module-5-impl/references/generated-code.md +2 -2
  37. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  38. package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +1 -1
  39. package/skills/erp-kit-module-6-impl-review/references/errors.md +1 -1
  40. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  41. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  42. package/skills/erp-kit-module-shared/references/errors.md +1 -1
  43. package/skills/erp-kit-module-shared/references/queries.md +1 -1
  44. package/skills/erp-kit-module-shared/references/structure.md +1 -1
  45. package/skills/erp-kit-update/SKILL.md +2 -2
  46. package/src/commands/app/index.ts +75 -31
  47. package/src/commands/check.test.ts +1 -1
  48. package/src/commands/check.ts +2 -35
  49. package/src/commands/doc/index.ts +83 -0
  50. package/src/commands/doc/module.test.ts +119 -0
  51. package/src/commands/doc/module.ts +114 -0
  52. package/src/commands/doc/modules.test.ts +103 -0
  53. package/src/commands/doc/modules.ts +98 -0
  54. package/src/commands/doc/search.test.ts +94 -0
  55. package/src/commands/doc/search.ts +111 -0
  56. package/src/commands/generate-doc.test.ts +63 -0
  57. package/src/commands/generate-doc.ts +105 -0
  58. package/src/commands/index.ts +20 -8
  59. package/src/commands/init-module.test.ts +43 -0
  60. package/src/commands/init-module.ts +74 -0
  61. package/src/commands/lib/command-result.ts +30 -0
  62. package/src/commands/lib/discovery.test.ts +74 -0
  63. package/src/commands/lib/discovery.ts +106 -0
  64. package/src/commands/lib/paths.ts +22 -0
  65. package/src/commands/lib/sync-check-source.test.ts +197 -0
  66. package/src/commands/lib/sync-check-source.ts +100 -0
  67. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  68. package/src/commands/lib/sync-check-tests.ts +69 -0
  69. package/src/commands/mock/index.ts +11 -6
  70. package/src/commands/module/generate.ts +39 -14
  71. package/src/commands/module/index.ts +31 -45
  72. package/src/commands/parse-doc-test-cases.ts +13 -2
  73. package/src/commands/sync-check.test.ts +6 -364
  74. package/src/commands/sync-check.ts +7 -251
  75. package/src/generator/generate-app-code.test.ts +121 -0
  76. package/src/generator/generate-app-code.ts +51 -0
  77. package/src/{commands/scaffold.test.ts → generator/generate-code-boilerplate.test.ts} +19 -89
  78. package/src/generator/generate-code.test.ts +57 -6
  79. package/src/generator/generate-code.ts +40 -157
  80. package/src/generator/generate-errors.ts +34 -0
  81. package/src/generator/generate-permissions.ts +12 -0
  82. package/src/generator/generate-shells.ts +28 -0
  83. package/src/generator/generate-stubs.ts +31 -0
  84. package/src/generator/parse-resolver-doc.test.ts +89 -0
  85. package/src/generator/parse-resolver-doc.ts +125 -0
  86. package/src/generator/scaffold.ts +57 -0
  87. package/src/generator/stub-templates.test.ts +55 -0
  88. package/src/generator/stub-templates.ts +145 -0
  89. package/src/integration.test.ts +2 -2
  90. package/src/modules/audit/README.md +46 -0
  91. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  93. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  94. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  95. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  96. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  97. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  98. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  99. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  100. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  101. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  102. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  103. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  104. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  105. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  106. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  107. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  108. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  109. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  110. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  111. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  112. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  113. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  114. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  115. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  116. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  117. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  118. package/src/modules/audit/db/auditEntry.ts +47 -0
  119. package/src/modules/audit/db/auditPolicy.ts +33 -0
  120. package/src/modules/audit/db/auditableEntity.ts +22 -0
  121. package/src/modules/audit/db/changeDetail.ts +28 -0
  122. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  123. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  124. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  125. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  126. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  127. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  128. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  129. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  130. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  131. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  132. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  133. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  134. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  135. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  136. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  137. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  138. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  139. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  140. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  141. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  142. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  143. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  144. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  145. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  146. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  147. package/src/modules/audit/index.ts +2 -0
  148. package/src/modules/audit/lib/_db_deps.ts +13 -0
  149. package/src/modules/audit/lib/errors.generated.ts +120 -0
  150. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  151. package/src/modules/audit/lib/types.ts +28 -0
  152. package/src/modules/audit/module.ts +57 -0
  153. package/src/modules/audit/permissions.ts +39 -0
  154. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  155. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  156. package/src/modules/audit/query/getAuditEntry.ts +36 -0
  157. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  158. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  159. package/src/modules/audit/query/getAuditPolicy.ts +42 -0
  160. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  161. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  162. package/src/modules/audit/query/getAuditSummary.ts +164 -0
  163. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  164. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  165. package/src/modules/audit/query/getChangeDetails.ts +42 -0
  166. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  167. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  168. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  169. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  170. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  171. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  172. package/src/modules/audit/tailor.config.ts +13 -0
  173. package/src/modules/audit/tailor.d.ts +13 -0
  174. package/src/modules/audit/testing/fixtures.ts +215 -0
  175. package/src/modules/business-partner/README.md +60 -0
  176. package/src/modules/business-partner/command/.gitkeep +0 -0
  177. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  178. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  179. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  180. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  181. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  182. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  183. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  184. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  185. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  186. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  187. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  188. package/src/modules/business-partner/command/createPartner.ts +83 -0
  189. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  190. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  191. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  192. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  193. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  194. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  195. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  196. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  197. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  198. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  199. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  200. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  201. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  202. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  203. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  204. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  205. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  206. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  207. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  208. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  209. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  210. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  211. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  212. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  213. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  214. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  215. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  216. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  217. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  218. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  219. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  220. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  221. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  222. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  223. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  224. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  225. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  226. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  227. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  228. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  229. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  230. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  231. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  232. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  233. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  234. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  235. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  236. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  237. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  238. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  239. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  240. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  241. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  242. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  243. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  244. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  245. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  246. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  247. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  248. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  249. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  250. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  251. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  252. package/src/modules/business-partner/db/.gitkeep +0 -0
  253. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  254. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  255. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  256. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  257. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  258. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  259. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  260. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  261. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  262. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  263. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  264. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  265. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  266. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  267. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  268. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  269. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  270. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  271. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  272. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  273. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  274. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  275. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  276. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  277. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  278. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  279. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  280. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  281. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  282. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  283. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  284. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  285. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  286. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  287. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  288. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  289. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  290. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  291. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  292. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  293. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  294. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  295. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  296. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  297. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  298. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  299. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  300. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  301. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  302. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  303. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  304. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  305. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  306. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  307. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  308. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  309. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  310. package/src/modules/business-partner/executor/.gitkeep +0 -0
  311. package/src/modules/business-partner/generated/.gitkeep +0 -0
  312. package/src/modules/business-partner/generated/enums.ts +60 -0
  313. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  314. package/src/modules/business-partner/index.ts +2 -0
  315. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  316. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  317. package/src/modules/business-partner/lib/errors.ts +2 -0
  318. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  319. package/src/modules/business-partner/lib/types.ts +53 -0
  320. package/src/modules/business-partner/module.ts +181 -0
  321. package/src/modules/business-partner/permissions.ts +3 -0
  322. package/src/modules/business-partner/query/.gitkeep +0 -0
  323. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  324. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  325. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  326. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  327. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  328. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  329. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  330. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  331. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  332. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  333. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  334. package/src/modules/business-partner/query/getPartner.ts +16 -0
  335. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  336. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  337. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  338. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  339. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  340. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  341. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  342. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  343. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  344. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  345. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  346. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  347. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  348. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  349. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  350. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  351. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  352. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  353. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  354. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  355. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  356. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  357. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  358. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  359. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  360. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  361. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  362. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  363. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  364. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  365. package/src/modules/business-partner/tailor.config.ts +13 -0
  366. package/src/modules/business-partner/tailor.d.ts +13 -0
  367. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  368. package/src/modules/coa-management/README.md +61 -0
  369. package/src/modules/coa-management/command/.gitkeep +0 -0
  370. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  371. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  372. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  373. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  374. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  375. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  376. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  377. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  378. package/src/modules/coa-management/command/createAccount.ts +247 -0
  379. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  380. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  381. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  382. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  383. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  384. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  385. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  386. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  387. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  388. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  389. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  390. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  391. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  392. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  393. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  394. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  395. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  396. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  397. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  398. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  399. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  400. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  401. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  402. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  403. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  404. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  405. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  406. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  407. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  408. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  409. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  410. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  411. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  412. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  413. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  414. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  415. package/src/modules/coa-management/db/.gitkeep +0 -0
  416. package/src/modules/coa-management/db/account.ts +119 -0
  417. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  418. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  419. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  420. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  421. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  422. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  423. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  424. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  425. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  426. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  427. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  428. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  429. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  430. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  431. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  432. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  433. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  434. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  435. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  436. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  437. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  438. package/src/modules/coa-management/docs/models/Account.md +84 -0
  439. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  440. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  441. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  442. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  443. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  444. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  445. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  446. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  447. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  448. package/src/modules/coa-management/executor/.gitkeep +0 -0
  449. package/src/modules/coa-management/generated/.gitkeep +0 -0
  450. package/src/modules/coa-management/generated/enums.ts +45 -0
  451. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  452. package/src/modules/coa-management/index.ts +2 -0
  453. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  454. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  455. package/src/modules/coa-management/lib/errors.ts +0 -0
  456. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  457. package/src/modules/coa-management/lib/types.ts +22 -0
  458. package/src/modules/coa-management/module.ts +136 -0
  459. package/src/modules/coa-management/permissions.ts +3 -0
  460. package/src/modules/coa-management/query/.gitkeep +0 -0
  461. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  462. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  463. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  464. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  465. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  466. package/src/modules/coa-management/query/getAccount.ts +25 -0
  467. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  468. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  469. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  470. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  471. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  472. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  473. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  474. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  475. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  476. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  477. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  478. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  479. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  480. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  481. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  482. package/src/modules/coa-management/tailor.config.ts +13 -0
  483. package/src/modules/coa-management/tailor.d.ts +13 -0
  484. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  485. package/src/modules/item-management/README.md +1 -1
  486. package/src/modules/organization/README.md +57 -0
  487. package/src/modules/organization/command/.gitkeep +0 -0
  488. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  489. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  490. package/src/modules/organization/command/activateCompany.ts +92 -0
  491. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  492. package/src/modules/organization/command/createCompany.test.ts +156 -0
  493. package/src/modules/organization/command/createCompany.ts +80 -0
  494. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  495. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  496. package/src/modules/organization/command/createDepartment.ts +98 -0
  497. package/src/modules/organization/command/createSite.generated.ts +6 -0
  498. package/src/modules/organization/command/createSite.test.ts +262 -0
  499. package/src/modules/organization/command/createSite.ts +155 -0
  500. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  501. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  502. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  503. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  504. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  505. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  506. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  507. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  508. package/src/modules/organization/command/deactivateSite.ts +47 -0
  509. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  510. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  511. package/src/modules/organization/command/deleteCompany.ts +66 -0
  512. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  513. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  514. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  515. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  516. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  517. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  518. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  519. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  520. package/src/modules/organization/command/reactivateSite.ts +47 -0
  521. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  522. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  523. package/src/modules/organization/command/updateCompany.ts +127 -0
  524. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  525. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  526. package/src/modules/organization/command/updateDepartment.ts +120 -0
  527. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  528. package/src/modules/organization/command/updateSite.test.ts +274 -0
  529. package/src/modules/organization/command/updateSite.ts +176 -0
  530. package/src/modules/organization/db/.gitkeep +0 -0
  531. package/src/modules/organization/db/company.ts +44 -0
  532. package/src/modules/organization/db/department.ts +46 -0
  533. package/src/modules/organization/db/site.ts +44 -0
  534. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  535. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  536. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  537. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  538. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  539. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  540. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  541. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  542. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  543. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  544. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  545. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  546. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  547. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  548. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  549. package/src/modules/organization/docs/features/department-management.md +66 -0
  550. package/src/modules/organization/docs/features/site-management.md +86 -0
  551. package/src/modules/organization/docs/models/Company.md +60 -0
  552. package/src/modules/organization/docs/models/Department.md +57 -0
  553. package/src/modules/organization/docs/models/Site.md +57 -0
  554. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  555. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  556. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  557. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  558. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  559. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  560. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  561. package/src/modules/organization/executor/.gitkeep +0 -0
  562. package/src/modules/organization/generated/.gitkeep +0 -0
  563. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  564. package/src/modules/organization/index.ts +2 -0
  565. package/src/modules/organization/lib/_db_deps.ts +10 -0
  566. package/src/modules/organization/lib/errors.generated.ts +117 -0
  567. package/src/modules/organization/lib/errors.ts +1 -0
  568. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  569. package/src/modules/organization/lib/types.ts +16 -0
  570. package/src/modules/organization/module.ts +89 -0
  571. package/src/modules/organization/permissions.ts +3 -0
  572. package/src/modules/organization/query/.gitkeep +0 -0
  573. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  574. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  575. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  576. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  577. package/src/modules/organization/query/getCompany.test.ts +70 -0
  578. package/src/modules/organization/query/getCompany.ts +16 -0
  579. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  580. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  581. package/src/modules/organization/query/getDepartment.ts +17 -0
  582. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  583. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  584. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  585. package/src/modules/organization/query/getSite.generated.ts +5 -0
  586. package/src/modules/organization/query/getSite.test.ts +55 -0
  587. package/src/modules/organization/query/getSite.ts +16 -0
  588. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  589. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  590. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  591. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  592. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  593. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  594. package/src/modules/organization/tailor.config.ts +13 -0
  595. package/src/modules/organization/tailor.d.ts +13 -0
  596. package/src/modules/organization/testing/fixtures.ts +155 -0
  597. package/src/modules/primitives/README.md +1 -1
  598. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  599. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  600. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  601. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  602. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  603. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  604. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  605. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  606. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  607. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  608. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  609. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  610. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  611. package/src/modules/primitives/docs/models/Currency.md +3 -4
  612. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  613. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  614. package/src/modules/primitives/lib/errors.generated.ts +5 -0
  615. package/src/modules/product-management/README.md +1 -1
  616. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  617. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  618. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  619. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  620. package/src/modules/user-management/generated/enums.ts +0 -15
  621. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  622. package/src/shared/createContext.ts +2 -1
  623. package/src/shared/defineQuery.ts +36 -1
  624. package/src/shared/requirePermission.ts +3 -3
  625. package/src/shared/types.ts +3 -0
  626. package/templates/scaffold/app/backend/package.json +8 -7
  627. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  628. package/templates/scaffold/app/frontend/package.json +19 -16
  629. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  630. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  631. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  632. package/templates/workflows/erp-kit-check.yml +2 -2
  633. package/src/commands/module/list.test.ts +0 -57
  634. package/src/commands/module/list.ts +0 -64
  635. package/src/commands/scaffold.ts +0 -176
  636. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  637. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  638. /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
  639. /package/src/modules/{supplier-management → business-partner}/.gitkeep +0 -0
@@ -59,7 +59,14 @@ After ALL agents return:
59
59
  3. Merge all `inconsistencies[]` arrays into a single list
60
60
  4. Deduplicate: if two gaps share the same `source + target + check`, keep only one
61
61
  5. Calculate totals across all summaries
62
- 6. Render the final report below
62
+ 6. **Classify severity** — for each non-pass gap and inconsistency, the router assigns a severity based on the finding's `check`, `status`, and `detail`:
63
+ - `critical`: missing implementation of documented feature, broken doc-code contract — blocks progress
64
+ - `major`: incomplete implementation, missing test case for documented business rule — should fix
65
+ - `nit`: minor naming difference, optional JSDoc, cosmetic issue — does NOT block the review
66
+ 7. **Determine verdict**:
67
+ - **APPROVED**: zero `critical` and zero `major` findings (nits only, or all pass)
68
+ - **NEEDS CHANGES**: one or more `critical` or `major` findings
69
+ 8. Render the final report below
63
70
 
64
71
  ## Report Format
65
72
 
@@ -171,13 +178,20 @@ Render the aggregated results as markdown:
171
178
 
172
179
  ### 10. Recommendations
173
180
 
174
- Numbered list of actionable fixes, grouped by priority:
181
+ Numbered list of actionable fixes, grouped by severity:
175
182
 
176
- 1. Add missing model fields/states (highest priority)
177
- 2. Implement missing business rules
178
- 3. Define missing error classes (re-run `erp-kit module generate code`)
179
- 4. Add missing test cases
180
- 5. Fix inconsistencies
183
+ 1. `critical` missing model fields/states, broken doc-code contract (must fix)
184
+ 2. `major` missing business rules, incomplete test coverage (should fix)
185
+ 3. `nit` minor naming differences, optional JSDoc, cosmetic issues (informational only)
186
+
187
+ ### 11. Verdict
188
+
189
+ **Verdict: APPROVED / NEEDS CHANGES**
190
+
191
+ - If APPROVED with nits: "Review passed. The following nits are informational and do not block progress:" followed by the nit list.
192
+ - If NEEDS CHANGES: "Review requires changes. Fix all critical and major issues, then re-run the review."
193
+
194
+ Severity counts: `critical: N, major: N, nit: N`
181
195
 
182
196
  ## References
183
197
 
@@ -72,7 +72,7 @@ For each error scenario documented in command docs:
72
72
 
73
73
  ## Common Gap Patterns
74
74
 
75
- - **Missing error class**: Error code in doc but no generated class (re-run `erp-kit module generate code`)
75
+ - **Missing error class**: Error code in doc but no generated class (re-run `erp-kit module generate code -p <path>`)
76
76
  - **Error not returned**: Generated class exists but command code doesn't return it
77
77
  - **Error not imported**: Command uses inline error instead of generated class
78
78
  - **Missing error test**: Error is returned in code but no test asserts it
@@ -7,4 +7,4 @@ Errors are **generated** from command/query documentation into `lib/errors.gener
7
7
  - Every error code in `docs/commands/*.md` has a corresponding class in `lib/errors.generated.ts`
8
8
  - Command implementations import errors from `../lib/errors.generated`
9
9
  - Generated error codes are prefixed with the module name (e.g., doc code `UNIT_NOT_FOUND` becomes `PRIMITIVES_UNIT_NOT_FOUND`)
10
- - If errors are missing, re-run `erp-kit module generate code`
10
+ - If errors are missing, re-run `erp-kit module generate code -p <path>`
@@ -50,3 +50,18 @@ Cross-cutting issues found during the check that don't fit a single gap entry (e
50
50
  ### summary
51
51
 
52
52
  Aggregate counts. `total_checks = passed + failed + skipped`.
53
+
54
+ ## Router-Level Severity and Verdict
55
+
56
+ The router (SKILL.md Step 3) assigns severity to each non-pass finding after collecting all agent results. Agents do NOT assign severity — they only report `status` and `detail`.
57
+
58
+ The router classifies each finding as:
59
+
60
+ - `critical`: blocks progress — missing implementation of documented feature, broken contract between doc and code
61
+ - `major`: should fix — incomplete implementation, missing test case for documented business rule
62
+ - `nit`: nice to have — minor naming difference, optional JSDoc improvement, cosmetic code style issue
63
+
64
+ Verdict rule:
65
+
66
+ - `APPROVED`: zero `critical` and zero `major` findings (nits only, or all pass)
67
+ - `NEEDS_CHANGES`: one or more `critical` or `major` findings
@@ -7,6 +7,10 @@ description: Shared references for erp-kit module skills. Not invoked directly
7
7
 
8
8
  Canonical reference files shared across module skills. Individual skills reference these instead of maintaining their own copies.
9
9
 
10
+ ## Design Philosophy
11
+
12
+ Modules are intentionally simple. Each module is a thin layer of domain logic over the database — avoid introducing unnecessary abstractions, deep inheritance hierarchies, or complex patterns. Over-engineering is actively harmful: it makes modules harder to understand, test, and maintain. When in doubt, choose the straightforward approach. A few lines of duplicated code is better than a premature abstraction.
13
+
10
14
  ## References
11
15
 
12
16
  - [Module structure](references/structure.md)
@@ -5,7 +5,7 @@ Errors are **generated** from command/query documentation. Do not write `lib/err
5
5
  ## How it works
6
6
 
7
7
  1. Write error scenarios in `docs/commands/*.md` as `CODE: Description` pairs
8
- 2. Run `erp-kit module generate code` to produce `lib/errors.generated.ts`
8
+ 2. Run `erp-kit module generate code -p <path>` to produce `lib/errors.generated.ts`
9
9
  3. Import generated errors in your command implementations
10
10
 
11
11
  ## Naming convention (in docs)
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Generated Query Shells
4
4
 
5
- Run `erp-kit module generate code` to generate query shells from `docs/queries/*.md`. Each generated shell wraps your `run` function with `defineQuery`.
5
+ Run `erp-kit module generate code -p <path>` to generate query shells from `docs/queries/*.md`. Each generated shell wraps your `run` function with `defineQuery`.
6
6
 
7
7
  ### Generated shell example
8
8
 
@@ -1,6 +1,6 @@
1
1
  # Module Directory Structure
2
2
 
3
- This structure is automatically scaffolded by `erp-kit module scaffold module <name>`.
3
+ This structure is automatically scaffolded by `erp-kit module init <name> <dir>`.
4
4
 
5
5
  ```
6
6
  {module}/
@@ -19,8 +19,8 @@ Ask the user:
19
19
 
20
20
  1. **What changed?** (free-text description of the change)
21
21
  2. **Where?** Determine domain from the target:
22
- - `examples/<app>/` → **App workflow** (skills matching `erp-kit-app-*`)
23
- - `modules/<module>/` → **Module workflow** (skills matching `erp-kit-module-*`)
22
+ - App directory (e.g., `{APP_ROOT}/{APP_NAME}/`) → **App workflow** (skills matching `erp-kit-app-*`)
23
+ - Module directory (e.g., `{MODULE_ROOT}/{MODULE_NAME}/`) → **Module workflow** (skills matching `erp-kit-module-*`)
24
24
 
25
25
  If the user names a specific app or module, confirm the path. If ambiguous, check both directories.
26
26
 
@@ -1,14 +1,18 @@
1
+ import path from "node:path";
1
2
  import { z } from "zod";
2
3
  import { defineCommand, arg } from "politty";
3
4
  import { runCheck } from "../check";
4
5
  import { runSyncCheck, formatSyncCheckReport } from "../sync-check";
5
- import { runScaffold, APP_TYPES, type ScaffoldType } from "../scaffold";
6
+ import { runGenerateDoc, APP_DOC_TYPES, type DocType } from "../generate-doc";
7
+ import { runGenerateAppCode } from "../../generator/generate-app-code";
8
+ import { runInitAppWithReadme } from "../init-module";
9
+ import { executeCommand, success, silentFailure } from "../lib/command-result";
6
10
 
7
11
  const cwd = process.cwd();
8
12
 
9
- const rootArgs = z.object({
10
- root: arg(z.string(), {
11
- alias: "r",
13
+ const pathArgs = z.object({
14
+ path: arg(z.string(), {
15
+ alias: "p",
12
16
  description: "Path to app-compose directory",
13
17
  }),
14
18
  });
@@ -16,50 +20,89 @@ const rootArgs = z.object({
16
20
  const checkCommand = defineCommand({
17
21
  name: "check",
18
22
  description: "Validate app docs against schemas",
19
- args: rootArgs,
20
- run: async (args) => {
21
- const exitCode = await runCheck({ appRoot: args.root }, cwd);
22
- process.exit(exitCode);
23
+ args: pathArgs,
24
+ run: (args) => {
25
+ return executeCommand(async () => {
26
+ const exitCode = await runCheck({ appRoot: args.path }, cwd);
27
+ return exitCode === 0 ? success() : silentFailure(exitCode);
28
+ });
23
29
  },
24
30
  });
25
31
 
26
32
  const syncCheckCommand = defineCommand({
27
33
  name: "sync-check",
28
34
  description: "Validate source <-> doc correspondence",
29
- args: rootArgs,
30
- run: async (args) => {
31
- const result = await runSyncCheck({ appRoot: args.root }, cwd);
32
- console.log(formatSyncCheckReport(result));
33
- process.exit(result.exitCode);
35
+ args: pathArgs,
36
+ run: (args) => {
37
+ return executeCommand(async () => {
38
+ const result = await runSyncCheck({ appRoot: args.path }, cwd);
39
+ console.log(formatSyncCheckReport(result));
40
+ return result.exitCode === 0 ? success() : silentFailure(result.exitCode);
41
+ });
34
42
  },
35
43
  });
36
44
 
37
- const scaffoldCommand = defineCommand({
38
- name: "scaffold",
39
- description: "Generate app doc from schema template",
40
- args: rootArgs.extend({
41
- type: arg(z.enum(APP_TYPES as unknown as [string, ...string[]]), {
45
+ const initCommand = defineCommand({
46
+ name: "init",
47
+ description: "Bootstrap a new app with directory structure and README",
48
+ args: z.object({
49
+ name: arg(z.string(), {
42
50
  positional: true,
43
- description: `Scaffold type (${APP_TYPES.join(", ")})`,
51
+ description: "App name",
44
52
  }),
45
- parent: arg(z.string(), {
53
+ dir: arg(z.string(), {
46
54
  positional: true,
47
- description: "App name",
55
+ description: "Parent directory where the app will be created",
56
+ }),
57
+ }),
58
+ run: (args) => {
59
+ return executeCommand(async () => {
60
+ const exitCode = await runInitAppWithReadme(args.name, args.dir, cwd);
61
+ return exitCode === 0 ? success() : silentFailure(exitCode);
62
+ });
63
+ },
64
+ });
65
+
66
+ const docCommand = defineCommand({
67
+ name: "doc",
68
+ description: "Create a documentation file from a schema template",
69
+ args: pathArgs.extend({
70
+ type: arg(z.enum(APP_DOC_TYPES as unknown as [string, ...string[]]), {
71
+ positional: true,
72
+ description: `Doc type (${APP_DOC_TYPES.join(", ")})`,
48
73
  }),
49
74
  name: arg(z.string().optional(), {
50
75
  positional: true,
51
76
  description: "Item name (required for most types)",
52
77
  }),
53
78
  }),
54
- run: async (args) => {
55
- const exitCode = await runScaffold(
56
- args.type as ScaffoldType,
57
- args.parent,
58
- args.name,
59
- args.root,
60
- cwd,
61
- );
62
- process.exit(exitCode);
79
+ run: (args) => {
80
+ return executeCommand(async () => {
81
+ const exitCode = await runGenerateDoc(args.type as DocType, args.name, args.path, cwd);
82
+ return exitCode === 0 ? success() : silentFailure(exitCode);
83
+ });
84
+ },
85
+ });
86
+
87
+ const codeCommand = defineCommand({
88
+ name: "code",
89
+ description: "Generate boilerplate source files from docs",
90
+ args: pathArgs,
91
+ run: (args) => {
92
+ return executeCommand(() => {
93
+ const appPath = path.resolve(cwd, args.path);
94
+ const exitCode = runGenerateAppCode(appPath);
95
+ return exitCode === 0 ? success() : silentFailure(exitCode);
96
+ });
97
+ },
98
+ });
99
+
100
+ const generateCommand = defineCommand({
101
+ name: "generate",
102
+ description: "Generate docs and code for an app",
103
+ subCommands: {
104
+ doc: docCommand,
105
+ code: codeCommand,
63
106
  },
64
107
  });
65
108
 
@@ -69,6 +112,7 @@ export const appCommand = defineCommand({
69
112
  subCommands: {
70
113
  check: checkCommand,
71
114
  "sync-check": syncCheckCommand,
72
- scaffold: scaffoldCommand,
115
+ init: initCommand,
116
+ generate: generateCommand,
73
117
  },
74
118
  });
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { buildCheckTargets } from "./check";
2
+ import { buildCheckTargets } from "./lib/discovery";
3
3
 
4
4
  describe("buildCheckTargets", () => {
5
5
  it("generates module targets when modulesRoot is set", () => {
@@ -1,41 +1,8 @@
1
1
  import { runMdschema } from "../mdschema";
2
2
  import { ALL_SCHEMAS } from "../schemas";
3
- export interface CheckTarget {
4
- glob: string;
5
- schemaKey: string;
6
- }
7
-
8
- export function buildCheckTargets(config: {
9
- modulesRoot?: string;
10
- appRoot?: string;
11
- }): CheckTarget[] {
12
- const targets: CheckTarget[] = [];
13
-
14
- if (config.modulesRoot) {
15
- const m = config.modulesRoot;
16
- targets.push(
17
- { glob: `${m}/[a-zA-Z]*/docs/features/*.md`, schemaKey: "feature" },
18
- { glob: `${m}/[a-zA-Z]*/docs/commands/*.md`, schemaKey: "command" },
19
- { glob: `${m}/[a-zA-Z]*/docs/models/*.md`, schemaKey: "model" },
20
- { glob: `${m}/[a-zA-Z]*/docs/queries/*.md`, schemaKey: "query" },
21
- { glob: `${m}/[a-zA-Z]*/README.md`, schemaKey: "module" },
22
- );
23
- }
3
+ import { buildCheckTargets } from "./lib/discovery";
24
4
 
25
- if (config.appRoot) {
26
- const a = config.appRoot;
27
- targets.push(
28
- { glob: `${a}/[a-zA-Z]*/README.md`, schemaKey: "app" },
29
- { glob: `${a}/[a-zA-Z]*/docs/actors/*.md`, schemaKey: "actors" },
30
- { glob: `${a}/[a-zA-Z]*/docs/business-flow/*/README.md`, schemaKey: "business-flow" },
31
- { glob: `${a}/[a-zA-Z]*/docs/business-flow/*/story/*.md`, schemaKey: "story" },
32
- { glob: `${a}/[a-zA-Z]*/docs/screen/*.md`, schemaKey: "screen" },
33
- { glob: `${a}/[a-zA-Z]*/docs/resolver/*.md`, schemaKey: "resolver" },
34
- );
35
- }
36
-
37
- return targets;
38
- }
5
+ export type { CheckTarget } from "./lib/discovery";
39
6
 
40
7
  export async function runCheck(
41
8
  config: { modulesRoot?: string; appRoot?: string },
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ import { defineCommand, arg } from "politty";
3
+ import { executeCommand, success, silentFailure } from "../lib/command-result";
4
+ import { runDocModules } from "./modules";
5
+ import { runDocModule } from "./module";
6
+ import { runDocSearch } from "./search";
7
+
8
+ const formatArg = arg(z.enum(["text", "json"]).default("text"), {
9
+ alias: "f",
10
+ description: "Output format (text or json)",
11
+ });
12
+
13
+ const modulesCommand = defineCommand({
14
+ name: "modules",
15
+ description: "List all modules with capabilities overview",
16
+ args: z.object({
17
+ format: formatArg,
18
+ }),
19
+ run: (args) => {
20
+ return executeCommand(() => {
21
+ const exitCode = runDocModules(args.format);
22
+ return exitCode === 0 ? success() : silentFailure(exitCode);
23
+ });
24
+ },
25
+ });
26
+
27
+ const moduleCommand = defineCommand({
28
+ name: "module",
29
+ description: "Show documentation for a specific module",
30
+ args: z.object({
31
+ name: arg(z.string(), {
32
+ positional: true,
33
+ description: "Module name",
34
+ }),
35
+ type: arg(z.string().optional(), {
36
+ positional: true,
37
+ description: "Doc type (command, query, model, feature)",
38
+ }),
39
+ docName: arg(z.string().optional(), {
40
+ positional: true,
41
+ description: "Doc name",
42
+ }),
43
+ format: formatArg,
44
+ }),
45
+ run: (args) => {
46
+ return executeCommand(() => {
47
+ const exitCode = runDocModule(args.name, args.type, args.docName, args.format);
48
+ return exitCode === 0 ? success() : silentFailure(exitCode);
49
+ });
50
+ },
51
+ });
52
+
53
+ const searchCommand = defineCommand({
54
+ name: "search",
55
+ description: "Search across all module documentation",
56
+ args: z.object({
57
+ query: arg(z.string(), {
58
+ positional: true,
59
+ description: "Search query",
60
+ }),
61
+ type: arg(z.string().optional(), {
62
+ alias: "t",
63
+ description: "Filter by doc type (command, query, model, feature, readme)",
64
+ }),
65
+ format: formatArg,
66
+ }),
67
+ run: (args) => {
68
+ return executeCommand(() => {
69
+ const exitCode = runDocSearch(args.query, args.type, args.format);
70
+ return exitCode === 0 ? success() : silentFailure(exitCode);
71
+ });
72
+ },
73
+ });
74
+
75
+ export const docCommand = defineCommand({
76
+ name: "doc",
77
+ description: "Browse module documentation",
78
+ subCommands: {
79
+ modules: modulesCommand,
80
+ module: moduleCommand,
81
+ search: searchCommand,
82
+ },
83
+ });
@@ -0,0 +1,119 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { runDocModule } from "./module";
3
+
4
+ describe("runDocModule", () => {
5
+ beforeEach(() => {
6
+ vi.restoreAllMocks();
7
+ });
8
+
9
+ it("outputs README and available docs for a known module", () => {
10
+ const logs: string[] = [];
11
+ vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => {
12
+ logs.push(args.map(String).join(" "));
13
+ });
14
+
15
+ const exitCode = runDocModule("organization");
16
+ expect(exitCode).toBe(0);
17
+
18
+ const output = logs.join("\n");
19
+ expect(output).toContain("## Overview");
20
+ expect(output).toContain("## Available Documentation");
21
+ expect(output).toContain("CreateCompany");
22
+ expect(output).toContain("GetCompany");
23
+ expect(output).toContain("Company");
24
+ });
25
+
26
+ it("outputs raw doc content for a specific command", () => {
27
+ const logs: string[] = [];
28
+ vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => {
29
+ logs.push(args.map(String).join(" "));
30
+ });
31
+
32
+ const exitCode = runDocModule("organization", "command", "CreateCompany");
33
+ expect(exitCode).toBe(0);
34
+
35
+ const output = logs.join("\n");
36
+ expect(output).toContain("# CreateCompany");
37
+ expect(output).toContain("## Overview");
38
+ expect(output).toContain("## Business Rules");
39
+ expect(output).toContain("## Error Scenarios");
40
+ });
41
+
42
+ it("returns error for unknown module", () => {
43
+ const errors: string[] = [];
44
+ vi.spyOn(console, "error").mockImplementation((...args: unknown[]) => {
45
+ errors.push(args.map(String).join(" "));
46
+ });
47
+
48
+ const exitCode = runDocModule("nonexistent");
49
+ expect(exitCode).toBe(1);
50
+
51
+ const output = errors.join("\n");
52
+ expect(output).toContain("Module not found: nonexistent");
53
+ expect(output).toContain("Available modules:");
54
+ });
55
+
56
+ it("returns error for unknown doc type", () => {
57
+ const errors: string[] = [];
58
+ vi.spyOn(console, "error").mockImplementation((...args: unknown[]) => {
59
+ errors.push(args.map(String).join(" "));
60
+ });
61
+
62
+ const exitCode = runDocModule("organization", "invalid", "Foo");
63
+ expect(exitCode).toBe(1);
64
+
65
+ const output = errors.join("\n");
66
+ expect(output).toContain("Unknown doc type: invalid");
67
+ expect(output).toContain("Available types:");
68
+ });
69
+
70
+ it("outputs valid JSON for module detail with --format json", () => {
71
+ const logs: string[] = [];
72
+ vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => {
73
+ logs.push(args.map(String).join(" "));
74
+ });
75
+
76
+ const exitCode = runDocModule("organization", undefined, undefined, "json");
77
+ expect(exitCode).toBe(0);
78
+
79
+ const parsed = JSON.parse(logs.join("\n")) as Record<string, unknown>;
80
+ expect(parsed).toHaveProperty("module", "organization");
81
+ expect(parsed).toHaveProperty("readme");
82
+ expect(parsed).toHaveProperty("docs");
83
+ expect(typeof parsed.readme).toBe("string");
84
+ const docs = parsed.docs as Record<string, string[]>;
85
+ expect(docs.command.length).toBeGreaterThan(0);
86
+ });
87
+
88
+ it("outputs valid JSON for specific command with --format json", () => {
89
+ const logs: string[] = [];
90
+ vi.spyOn(console, "log").mockImplementation((...args: unknown[]) => {
91
+ logs.push(args.map(String).join(" "));
92
+ });
93
+
94
+ const exitCode = runDocModule("organization", "command", "CreateCompany", "json");
95
+ expect(exitCode).toBe(0);
96
+
97
+ const parsed = JSON.parse(logs.join("\n")) as Record<string, unknown>;
98
+ expect(parsed).toHaveProperty("module", "organization");
99
+ expect(parsed).toHaveProperty("type", "command");
100
+ expect(parsed).toHaveProperty("name", "CreateCompany");
101
+ expect(parsed).toHaveProperty("content");
102
+ expect(typeof parsed.content).toBe("string");
103
+ expect(parsed.content as string).toContain("# CreateCompany");
104
+ });
105
+
106
+ it("returns error for unknown doc name", () => {
107
+ const errors: string[] = [];
108
+ vi.spyOn(console, "error").mockImplementation((...args: unknown[]) => {
109
+ errors.push(args.map(String).join(" "));
110
+ });
111
+
112
+ const exitCode = runDocModule("organization", "command", "Nonexistent");
113
+ expect(exitCode).toBe(1);
114
+
115
+ const output = errors.join("\n");
116
+ expect(output).toContain("Doc not found: organization/command/Nonexistent");
117
+ expect(output).toContain("Available commands:");
118
+ });
119
+ });
@@ -0,0 +1,114 @@
1
+ import { readdirSync, readFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { PACKAGE_ROOT } from "../../util";
4
+ import { MODULE_PATHS } from "../lib/paths";
5
+
6
+ const MODULES_DIR = join(PACKAGE_ROOT, "src", "modules");
7
+ const EXCLUDED_DIRS = new Set(["shared", "testing"]);
8
+
9
+ const DOC_TYPE_MAP: Record<string, string> = {
10
+ command: MODULE_PATHS.docs.commands,
11
+ query: MODULE_PATHS.docs.queries,
12
+ model: MODULE_PATHS.docs.models,
13
+ feature: MODULE_PATHS.docs.features,
14
+ };
15
+
16
+ function listDocNames(dir: string): string[] {
17
+ if (!existsSync(dir)) return [];
18
+ return readdirSync(dir)
19
+ .filter((f) => f.endsWith(".md"))
20
+ .map((f) => f.replace(/\.md$/, ""))
21
+ .sort();
22
+ }
23
+
24
+ function formatDocList(type: string, names: string[]): string {
25
+ if (names.length === 0) return "";
26
+ return `${type}: ${names.join(", ")}`;
27
+ }
28
+
29
+ export function runDocModule(
30
+ moduleName: string,
31
+ docType?: string,
32
+ docName?: string,
33
+ format = "text",
34
+ ): number {
35
+ if (!existsSync(MODULES_DIR) || EXCLUDED_DIRS.has(moduleName)) {
36
+ console.error(`Module not found: ${moduleName}`);
37
+ return 1;
38
+ }
39
+
40
+ const modDir = join(MODULES_DIR, moduleName);
41
+ if (!existsSync(modDir)) {
42
+ console.error(`Module not found: ${moduleName}`);
43
+ const available = readdirSync(MODULES_DIR, { withFileTypes: true })
44
+ .filter((d) => d.isDirectory() && !EXCLUDED_DIRS.has(d.name))
45
+ .map((d) => d.name)
46
+ .sort();
47
+ console.error(`Available modules: ${available.join(", ")}`);
48
+ return 1;
49
+ }
50
+
51
+ // Level 3: specific doc
52
+ if (docType && docName) {
53
+ const docSubdir = DOC_TYPE_MAP[docType];
54
+ if (!docSubdir) {
55
+ console.error(`Unknown doc type: ${docType}`);
56
+ console.error(`Available types: ${Object.keys(DOC_TYPE_MAP).join(", ")}`);
57
+ return 1;
58
+ }
59
+
60
+ const docPath = join(modDir, docSubdir, `${docName}.md`);
61
+ if (!existsSync(docPath)) {
62
+ console.error(`Doc not found: ${moduleName}/${docType}/${docName}`);
63
+ const available = listDocNames(join(modDir, docSubdir));
64
+ if (available.length > 0) {
65
+ console.error(`Available ${docType}s: ${available.join(", ")}`);
66
+ } else {
67
+ console.error(`No ${docType} docs found for ${moduleName}`);
68
+ }
69
+ return 1;
70
+ }
71
+
72
+ const content = readFileSync(docPath, "utf-8");
73
+ if (format === "json") {
74
+ console.log(
75
+ JSON.stringify({ module: moduleName, type: docType, name: docName, content }, null, 2),
76
+ );
77
+ } else {
78
+ console.log(content);
79
+ }
80
+ return 0;
81
+ }
82
+
83
+ // Level 2: full module detail
84
+ const readmePath = join(modDir, "README.md");
85
+ const readme = existsSync(readmePath) ? readFileSync(readmePath, "utf-8") : "";
86
+
87
+ const docs: Record<string, string[]> = {};
88
+ for (const [type, subdir] of Object.entries(DOC_TYPE_MAP)) {
89
+ const names = listDocNames(join(modDir, subdir));
90
+ if (names.length > 0) docs[type] = names;
91
+ }
92
+
93
+ if (format === "json") {
94
+ console.log(JSON.stringify({ module: moduleName, readme, docs }, null, 2));
95
+ } else {
96
+ if (readme) {
97
+ console.log(readme);
98
+ } else {
99
+ console.log(`# ${moduleName}\n\nNo README found.\n`);
100
+ }
101
+
102
+ const sections: string[] = [];
103
+ for (const [type, names] of Object.entries(docs)) {
104
+ sections.push(formatDocList(type, names));
105
+ }
106
+
107
+ if (sections.length > 0) {
108
+ console.log("\n## Available Documentation\n");
109
+ console.log(sections.join("\n"));
110
+ }
111
+ }
112
+
113
+ return 0;
114
+ }