@tailor-platform/erp-kit 0.3.0 → 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 (616) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +35 -7
  3. package/dist/cli.mjs +779 -268
  4. package/package.json +5 -4
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +8 -9
  6. package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +4 -0
  7. package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +4 -0
  8. package/skills/erp-kit-app-3-plan/SKILL.md +27 -27
  9. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +21 -17
  10. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +15 -1
  11. package/skills/erp-kit-app-3-plan/references/story-extraction.md +8 -2
  12. package/skills/erp-kit-app-5-impl-backend/SKILL.md +9 -11
  13. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -22
  14. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +0 -1
  15. package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +13 -4
  16. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +5 -0
  17. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +16 -46
  18. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -11
  19. package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +16 -17
  20. package/skills/erp-kit-module-1-requirements/SKILL.md +6 -12
  21. package/skills/erp-kit-module-2-requirements-review/SKILL.md +21 -5
  22. package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +19 -0
  23. package/skills/erp-kit-module-3-plan/SKILL.md +2 -4
  24. package/skills/erp-kit-module-4-plan-review/SKILL.md +21 -5
  25. package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +15 -0
  26. package/skills/erp-kit-module-6-impl-review/SKILL.md +21 -7
  27. package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +15 -0
  28. package/skills/erp-kit-module-shared/SKILL.md +4 -0
  29. package/src/commands/app/index.ts +28 -17
  30. package/src/commands/check.test.ts +1 -1
  31. package/src/commands/check.ts +2 -35
  32. package/src/commands/doc/index.ts +83 -0
  33. package/src/commands/doc/module.test.ts +119 -0
  34. package/src/commands/doc/module.ts +114 -0
  35. package/src/commands/doc/modules.test.ts +103 -0
  36. package/src/commands/doc/modules.ts +98 -0
  37. package/src/commands/doc/search.test.ts +94 -0
  38. package/src/commands/doc/search.ts +111 -0
  39. package/src/commands/generate-doc.ts +17 -10
  40. package/src/commands/index.ts +20 -8
  41. package/src/commands/lib/command-result.ts +30 -0
  42. package/src/commands/lib/discovery.test.ts +74 -0
  43. package/src/commands/lib/discovery.ts +106 -0
  44. package/src/commands/lib/paths.ts +22 -0
  45. package/src/commands/lib/sync-check-source.test.ts +197 -0
  46. package/src/commands/lib/sync-check-source.ts +100 -0
  47. package/src/commands/lib/sync-check-tests.test.ts +178 -0
  48. package/src/commands/lib/sync-check-tests.ts +69 -0
  49. package/src/commands/mock/index.ts +11 -6
  50. package/src/commands/module/generate.ts +13 -8
  51. package/src/commands/module/index.ts +17 -21
  52. package/src/commands/parse-doc-test-cases.ts +13 -2
  53. package/src/commands/sync-check.test.ts +6 -364
  54. package/src/commands/sync-check.ts +7 -251
  55. package/src/generator/generate-app-code.test.ts +121 -0
  56. package/src/generator/generate-app-code.ts +51 -0
  57. package/src/generator/generate-code-boilerplate.test.ts +1 -1
  58. package/src/generator/generate-code.test.ts +33 -6
  59. package/src/generator/generate-code.ts +12 -226
  60. package/src/generator/generate-errors.ts +34 -0
  61. package/src/generator/generate-permissions.ts +12 -0
  62. package/src/generator/generate-shells.ts +28 -0
  63. package/src/generator/generate-stubs.ts +31 -0
  64. package/src/generator/parse-resolver-doc.test.ts +89 -0
  65. package/src/generator/parse-resolver-doc.ts +125 -0
  66. package/src/generator/scaffold.ts +57 -0
  67. package/src/generator/stub-templates.test.ts +55 -0
  68. package/src/generator/stub-templates.ts +145 -0
  69. package/src/modules/audit/README.md +46 -0
  70. package/src/modules/audit/command/activateAuditPolicy.generated.ts +6 -0
  71. package/src/modules/audit/command/activateAuditPolicy.test.ts +186 -0
  72. package/src/modules/audit/command/activateAuditPolicy.ts +97 -0
  73. package/src/modules/audit/command/createAuditPolicy.generated.ts +6 -0
  74. package/src/modules/audit/command/createAuditPolicy.test.ts +395 -0
  75. package/src/modules/audit/command/createAuditPolicy.ts +131 -0
  76. package/src/modules/audit/command/deactivateAuditPolicy.generated.ts +6 -0
  77. package/src/modules/audit/command/deactivateAuditPolicy.test.ts +138 -0
  78. package/src/modules/audit/command/deactivateAuditPolicy.ts +58 -0
  79. package/src/modules/audit/command/deleteAuditPolicy.generated.ts +6 -0
  80. package/src/modules/audit/command/deleteAuditPolicy.test.ts +121 -0
  81. package/src/modules/audit/command/deleteAuditPolicy.ts +52 -0
  82. package/src/modules/audit/command/logAuditEvent.generated.ts +6 -0
  83. package/src/modules/audit/command/logAuditEvent.test.ts +991 -0
  84. package/src/modules/audit/command/logAuditEvent.ts +357 -0
  85. package/src/modules/audit/command/reactivateAuditPolicy.generated.ts +6 -0
  86. package/src/modules/audit/command/reactivateAuditPolicy.test.ts +143 -0
  87. package/src/modules/audit/command/reactivateAuditPolicy.ts +79 -0
  88. package/src/modules/audit/command/registerAuditableEntity.generated.ts +6 -0
  89. package/src/modules/audit/command/registerAuditableEntity.test.ts +268 -0
  90. package/src/modules/audit/command/registerAuditableEntity.ts +94 -0
  91. package/src/modules/audit/command/replaceAuditPolicy.generated.ts +6 -0
  92. package/src/modules/audit/command/replaceAuditPolicy.test.ts +242 -0
  93. package/src/modules/audit/command/replaceAuditPolicy.ts +91 -0
  94. package/src/modules/audit/command/updateAuditPolicy.generated.ts +6 -0
  95. package/src/modules/audit/command/updateAuditPolicy.test.ts +284 -0
  96. package/src/modules/audit/command/updateAuditPolicy.ts +151 -0
  97. package/src/modules/audit/db/auditEntry.ts +47 -0
  98. package/src/modules/audit/db/auditPolicy.ts +33 -0
  99. package/src/modules/audit/db/auditableEntity.ts +22 -0
  100. package/src/modules/audit/db/changeDetail.ts +28 -0
  101. package/src/modules/audit/db/policyFieldRule.ts +23 -0
  102. package/src/modules/audit/docs/commands/ActivateAuditPolicy.md +69 -0
  103. package/src/modules/audit/docs/commands/CreateAuditPolicy.md +79 -0
  104. package/src/modules/audit/docs/commands/DeactivateAuditPolicy.md +55 -0
  105. package/src/modules/audit/docs/commands/DeleteAuditPolicy.md +55 -0
  106. package/src/modules/audit/docs/commands/LogAuditEvent.md +137 -0
  107. package/src/modules/audit/docs/commands/ReactivateAuditPolicy.md +58 -0
  108. package/src/modules/audit/docs/commands/RegisterAuditableEntity.md +62 -0
  109. package/src/modules/audit/docs/commands/ReplaceAuditPolicy.md +72 -0
  110. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +77 -0
  111. package/src/modules/audit/docs/features/audit-event-logging.md +126 -0
  112. package/src/modules/audit/docs/features/audit-policy-configuration.md +135 -0
  113. package/src/modules/audit/docs/features/field-level-change-tracking.md +95 -0
  114. package/src/modules/audit/docs/models/AuditEntry.md +55 -0
  115. package/src/modules/audit/docs/models/AuditPolicy.md +79 -0
  116. package/src/modules/audit/docs/models/AuditableEntity.md +38 -0
  117. package/src/modules/audit/docs/models/ChangeDetail.md +55 -0
  118. package/src/modules/audit/docs/models/PolicyFieldRule.md +45 -0
  119. package/src/modules/audit/docs/queries/GetAuditEntry.md +49 -0
  120. package/src/modules/audit/docs/queries/GetAuditPolicy.md +54 -0
  121. package/src/modules/audit/docs/queries/GetAuditSummary.md +84 -0
  122. package/src/modules/audit/docs/queries/GetChangeDetails.md +56 -0
  123. package/src/modules/audit/docs/queries/ListAuditPolicies.md +58 -0
  124. package/src/modules/audit/docs/queries/SearchAuditEntries.md +91 -0
  125. package/src/modules/audit/generated/kysely-tailordb.ts +92 -0
  126. package/src/modules/audit/index.ts +2 -0
  127. package/src/modules/audit/lib/_db_deps.ts +13 -0
  128. package/src/modules/audit/lib/errors.generated.ts +120 -0
  129. package/src/modules/audit/lib/permissions.generated.ts +14 -0
  130. package/src/modules/audit/lib/types.ts +28 -0
  131. package/src/modules/audit/module.ts +57 -0
  132. package/src/modules/audit/permissions.ts +39 -0
  133. package/src/modules/audit/query/getAuditEntry.generated.ts +5 -0
  134. package/src/modules/audit/query/getAuditEntry.test.ts +123 -0
  135. package/src/modules/audit/query/getAuditEntry.ts +36 -0
  136. package/src/modules/audit/query/getAuditPolicy.generated.ts +5 -0
  137. package/src/modules/audit/query/getAuditPolicy.test.ts +169 -0
  138. package/src/modules/audit/query/getAuditPolicy.ts +42 -0
  139. package/src/modules/audit/query/getAuditSummary.generated.ts +5 -0
  140. package/src/modules/audit/query/getAuditSummary.test.ts +632 -0
  141. package/src/modules/audit/query/getAuditSummary.ts +164 -0
  142. package/src/modules/audit/query/getChangeDetails.generated.ts +5 -0
  143. package/src/modules/audit/query/getChangeDetails.test.ts +195 -0
  144. package/src/modules/audit/query/getChangeDetails.ts +42 -0
  145. package/src/modules/audit/query/listAuditPolicies.generated.ts +5 -0
  146. package/src/modules/audit/query/listAuditPolicies.test.ts +239 -0
  147. package/src/modules/audit/query/listAuditPolicies.ts +100 -0
  148. package/src/modules/audit/query/searchAuditEntries.generated.ts +5 -0
  149. package/src/modules/audit/query/searchAuditEntries.test.ts +424 -0
  150. package/src/modules/audit/query/searchAuditEntries.ts +121 -0
  151. package/src/modules/audit/tailor.config.ts +13 -0
  152. package/src/modules/audit/tailor.d.ts +13 -0
  153. package/src/modules/audit/testing/fixtures.ts +215 -0
  154. package/src/modules/business-partner/README.md +60 -0
  155. package/src/modules/business-partner/command/.gitkeep +0 -0
  156. package/src/modules/business-partner/command/activatePartner.generated.ts +6 -0
  157. package/src/modules/business-partner/command/activatePartner.test.ts +59 -0
  158. package/src/modules/business-partner/command/activatePartner.ts +45 -0
  159. package/src/modules/business-partner/command/assignRoleToPartner.generated.ts +6 -0
  160. package/src/modules/business-partner/command/assignRoleToPartner.test.ts +113 -0
  161. package/src/modules/business-partner/command/assignRoleToPartner.ts +72 -0
  162. package/src/modules/business-partner/command/createContactPerson.generated.ts +6 -0
  163. package/src/modules/business-partner/command/createContactPerson.test.ts +193 -0
  164. package/src/modules/business-partner/command/createContactPerson.ts +98 -0
  165. package/src/modules/business-partner/command/createPartner.generated.ts +6 -0
  166. package/src/modules/business-partner/command/createPartner.test.ts +179 -0
  167. package/src/modules/business-partner/command/createPartner.ts +83 -0
  168. package/src/modules/business-partner/command/createPartnerAddress.generated.ts +6 -0
  169. package/src/modules/business-partner/command/createPartnerAddress.test.ts +195 -0
  170. package/src/modules/business-partner/command/createPartnerAddress.ts +119 -0
  171. package/src/modules/business-partner/command/createPartnerBankAccount.generated.ts +6 -0
  172. package/src/modules/business-partner/command/createPartnerBankAccount.test.ts +297 -0
  173. package/src/modules/business-partner/command/createPartnerBankAccount.ts +114 -0
  174. package/src/modules/business-partner/command/createPartnerIdentification.generated.ts +6 -0
  175. package/src/modules/business-partner/command/createPartnerIdentification.test.ts +255 -0
  176. package/src/modules/business-partner/command/createPartnerIdentification.ts +97 -0
  177. package/src/modules/business-partner/command/deactivateContactPerson.generated.ts +6 -0
  178. package/src/modules/business-partner/command/deactivateContactPerson.test.ts +70 -0
  179. package/src/modules/business-partner/command/deactivateContactPerson.ts +54 -0
  180. package/src/modules/business-partner/command/deactivatePartner.generated.ts +6 -0
  181. package/src/modules/business-partner/command/deactivatePartner.test.ts +59 -0
  182. package/src/modules/business-partner/command/deactivatePartner.ts +46 -0
  183. package/src/modules/business-partner/command/deleteContactPerson.generated.ts +6 -0
  184. package/src/modules/business-partner/command/deleteContactPerson.test.ts +61 -0
  185. package/src/modules/business-partner/command/deleteContactPerson.ts +48 -0
  186. package/src/modules/business-partner/command/deletePartner.generated.ts +6 -0
  187. package/src/modules/business-partner/command/deletePartner.test.ts +58 -0
  188. package/src/modules/business-partner/command/deletePartner.ts +46 -0
  189. package/src/modules/business-partner/command/deletePartnerAddress.generated.ts +6 -0
  190. package/src/modules/business-partner/command/deletePartnerAddress.test.ts +74 -0
  191. package/src/modules/business-partner/command/deletePartnerAddress.ts +52 -0
  192. package/src/modules/business-partner/command/deletePartnerBankAccount.generated.ts +6 -0
  193. package/src/modules/business-partner/command/deletePartnerBankAccount.test.ts +55 -0
  194. package/src/modules/business-partner/command/deletePartnerBankAccount.ts +36 -0
  195. package/src/modules/business-partner/command/deletePartnerIdentification.generated.ts +6 -0
  196. package/src/modules/business-partner/command/deletePartnerIdentification.test.ts +47 -0
  197. package/src/modules/business-partner/command/deletePartnerIdentification.ts +37 -0
  198. package/src/modules/business-partner/command/reactivateContactPerson.generated.ts +6 -0
  199. package/src/modules/business-partner/command/reactivateContactPerson.test.ts +48 -0
  200. package/src/modules/business-partner/command/reactivateContactPerson.ts +48 -0
  201. package/src/modules/business-partner/command/reactivatePartner.generated.ts +6 -0
  202. package/src/modules/business-partner/command/reactivatePartner.test.ts +59 -0
  203. package/src/modules/business-partner/command/reactivatePartner.ts +46 -0
  204. package/src/modules/business-partner/command/removeRoleFromPartner.generated.ts +6 -0
  205. package/src/modules/business-partner/command/removeRoleFromPartner.test.ts +82 -0
  206. package/src/modules/business-partner/command/removeRoleFromPartner.ts +73 -0
  207. package/src/modules/business-partner/command/setDefaultPartnerAddress.generated.ts +6 -0
  208. package/src/modules/business-partner/command/setDefaultPartnerAddress.test.ts +60 -0
  209. package/src/modules/business-partner/command/setDefaultPartnerAddress.ts +48 -0
  210. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.generated.ts +6 -0
  211. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.test.ts +56 -0
  212. package/src/modules/business-partner/command/setDefaultPartnerBankAccount.ts +51 -0
  213. package/src/modules/business-partner/command/setPrimaryContactPerson.generated.ts +6 -0
  214. package/src/modules/business-partner/command/setPrimaryContactPerson.test.ts +63 -0
  215. package/src/modules/business-partner/command/setPrimaryContactPerson.ts +55 -0
  216. package/src/modules/business-partner/command/updateContactPerson.generated.ts +6 -0
  217. package/src/modules/business-partner/command/updateContactPerson.test.ts +193 -0
  218. package/src/modules/business-partner/command/updateContactPerson.ts +92 -0
  219. package/src/modules/business-partner/command/updatePartner.generated.ts +6 -0
  220. package/src/modules/business-partner/command/updatePartner.test.ts +101 -0
  221. package/src/modules/business-partner/command/updatePartner.ts +76 -0
  222. package/src/modules/business-partner/command/updatePartnerAddress.generated.ts +6 -0
  223. package/src/modules/business-partner/command/updatePartnerAddress.test.ts +148 -0
  224. package/src/modules/business-partner/command/updatePartnerAddress.ts +64 -0
  225. package/src/modules/business-partner/command/updatePartnerBankAccount.generated.ts +6 -0
  226. package/src/modules/business-partner/command/updatePartnerBankAccount.test.ts +249 -0
  227. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +109 -0
  228. package/src/modules/business-partner/command/updatePartnerIdentification.generated.ts +6 -0
  229. package/src/modules/business-partner/command/updatePartnerIdentification.test.ts +162 -0
  230. package/src/modules/business-partner/command/updatePartnerIdentification.ts +105 -0
  231. package/src/modules/business-partner/db/.gitkeep +0 -0
  232. package/src/modules/business-partner/db/businessPartner.ts +59 -0
  233. package/src/modules/business-partner/db/contactPerson.ts +49 -0
  234. package/src/modules/business-partner/db/partnerAddress.ts +45 -0
  235. package/src/modules/business-partner/db/partnerBankAccount.ts +53 -0
  236. package/src/modules/business-partner/db/partnerIdentification.ts +53 -0
  237. package/src/modules/business-partner/db/partnerRole.ts +43 -0
  238. package/src/modules/business-partner/docs/commands/ActivatePartner.md +39 -0
  239. package/src/modules/business-partner/docs/commands/AssignRoleToPartner.md +49 -0
  240. package/src/modules/business-partner/docs/commands/CreateContactPerson.md +59 -0
  241. package/src/modules/business-partner/docs/commands/CreatePartner.md +54 -0
  242. package/src/modules/business-partner/docs/commands/CreatePartnerAddress.md +60 -0
  243. package/src/modules/business-partner/docs/commands/CreatePartnerBankAccount.md +68 -0
  244. package/src/modules/business-partner/docs/commands/CreatePartnerIdentification.md +59 -0
  245. package/src/modules/business-partner/docs/commands/DeactivateContactPerson.md +42 -0
  246. package/src/modules/business-partner/docs/commands/DeactivatePartner.md +39 -0
  247. package/src/modules/business-partner/docs/commands/DeleteContactPerson.md +43 -0
  248. package/src/modules/business-partner/docs/commands/DeletePartner.md +40 -0
  249. package/src/modules/business-partner/docs/commands/DeletePartnerAddress.md +40 -0
  250. package/src/modules/business-partner/docs/commands/DeletePartnerBankAccount.md +35 -0
  251. package/src/modules/business-partner/docs/commands/DeletePartnerIdentification.md +33 -0
  252. package/src/modules/business-partner/docs/commands/ReactivateContactPerson.md +38 -0
  253. package/src/modules/business-partner/docs/commands/ReactivatePartner.md +39 -0
  254. package/src/modules/business-partner/docs/commands/RemoveRoleFromPartner.md +46 -0
  255. package/src/modules/business-partner/docs/commands/SetDefaultPartnerAddress.md +38 -0
  256. package/src/modules/business-partner/docs/commands/SetDefaultPartnerBankAccount.md +38 -0
  257. package/src/modules/business-partner/docs/commands/SetPrimaryContactPerson.md +43 -0
  258. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +66 -0
  259. package/src/modules/business-partner/docs/commands/UpdatePartner.md +48 -0
  260. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +46 -0
  261. package/src/modules/business-partner/docs/commands/UpdatePartnerBankAccount.md +64 -0
  262. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +52 -0
  263. package/src/modules/business-partner/docs/features/contact-person-management.md +70 -0
  264. package/src/modules/business-partner/docs/features/partner-address-management.md +96 -0
  265. package/src/modules/business-partner/docs/features/partner-bank-account.md +70 -0
  266. package/src/modules/business-partner/docs/features/partner-identification.md +76 -0
  267. package/src/modules/business-partner/docs/features/partner-lifecycle.md +59 -0
  268. package/src/modules/business-partner/docs/features/partner-role-classification.md +73 -0
  269. package/src/modules/business-partner/docs/models/BusinessPartner.md +64 -0
  270. package/src/modules/business-partner/docs/models/ContactPerson.md +62 -0
  271. package/src/modules/business-partner/docs/models/PartnerAddress.md +52 -0
  272. package/src/modules/business-partner/docs/models/PartnerBankAccount.md +50 -0
  273. package/src/modules/business-partner/docs/models/PartnerIdentification.md +46 -0
  274. package/src/modules/business-partner/docs/models/PartnerRole.md +42 -0
  275. package/src/modules/business-partner/docs/queries/GetContactPerson.md +34 -0
  276. package/src/modules/business-partner/docs/queries/GetDefaultPartnerAddress.md +40 -0
  277. package/src/modules/business-partner/docs/queries/GetDefaultPartnerBankAccount.md +36 -0
  278. package/src/modules/business-partner/docs/queries/GetPartner.md +35 -0
  279. package/src/modules/business-partner/docs/queries/GetPartnerAddress.md +34 -0
  280. package/src/modules/business-partner/docs/queries/GetPartnerBankAccount.md +34 -0
  281. package/src/modules/business-partner/docs/queries/GetPartnerIdentification.md +34 -0
  282. package/src/modules/business-partner/docs/queries/GetPartnerRole.md +34 -0
  283. package/src/modules/business-partner/docs/queries/GetPrimaryContactPerson.md +36 -0
  284. package/src/modules/business-partner/docs/queries/ListContactPersonsByPartner.md +39 -0
  285. package/src/modules/business-partner/docs/queries/ListPartnerAddressesByPartner.md +41 -0
  286. package/src/modules/business-partner/docs/queries/ListPartnerBankAccountsByPartner.md +39 -0
  287. package/src/modules/business-partner/docs/queries/ListPartnerIdentificationsByPartner.md +41 -0
  288. package/src/modules/business-partner/docs/queries/ListPartnersByRole.md +47 -0
  289. package/src/modules/business-partner/executor/.gitkeep +0 -0
  290. package/src/modules/business-partner/generated/.gitkeep +0 -0
  291. package/src/modules/business-partner/generated/enums.ts +60 -0
  292. package/src/modules/business-partner/generated/kysely-tailordb.ts +114 -0
  293. package/src/modules/business-partner/index.ts +2 -0
  294. package/src/modules/business-partner/lib/_db_deps.ts +17 -0
  295. package/src/modules/business-partner/lib/errors.generated.ts +172 -0
  296. package/src/modules/business-partner/lib/errors.ts +2 -0
  297. package/src/modules/business-partner/lib/permissions.generated.ts +30 -0
  298. package/src/modules/business-partner/lib/types.ts +53 -0
  299. package/src/modules/business-partner/module.ts +181 -0
  300. package/src/modules/business-partner/permissions.ts +3 -0
  301. package/src/modules/business-partner/query/.gitkeep +0 -0
  302. package/src/modules/business-partner/query/getContactPerson.generated.ts +5 -0
  303. package/src/modules/business-partner/query/getContactPerson.test.ts +31 -0
  304. package/src/modules/business-partner/query/getContactPerson.ts +16 -0
  305. package/src/modules/business-partner/query/getDefaultPartnerAddress.generated.ts +5 -0
  306. package/src/modules/business-partner/query/getDefaultPartnerAddress.test.ts +45 -0
  307. package/src/modules/business-partner/query/getDefaultPartnerAddress.ts +30 -0
  308. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.generated.ts +5 -0
  309. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.test.ts +43 -0
  310. package/src/modules/business-partner/query/getDefaultPartnerBankAccount.ts +17 -0
  311. package/src/modules/business-partner/query/getPartner.generated.ts +5 -0
  312. package/src/modules/business-partner/query/getPartner.test.ts +31 -0
  313. package/src/modules/business-partner/query/getPartner.ts +16 -0
  314. package/src/modules/business-partner/query/getPartnerAddress.generated.ts +5 -0
  315. package/src/modules/business-partner/query/getPartnerAddress.test.ts +31 -0
  316. package/src/modules/business-partner/query/getPartnerAddress.ts +16 -0
  317. package/src/modules/business-partner/query/getPartnerBankAccount.generated.ts +5 -0
  318. package/src/modules/business-partner/query/getPartnerBankAccount.test.ts +31 -0
  319. package/src/modules/business-partner/query/getPartnerBankAccount.ts +16 -0
  320. package/src/modules/business-partner/query/getPartnerIdentification.generated.ts +5 -0
  321. package/src/modules/business-partner/query/getPartnerIdentification.test.ts +31 -0
  322. package/src/modules/business-partner/query/getPartnerIdentification.ts +16 -0
  323. package/src/modules/business-partner/query/getPartnerRole.generated.ts +5 -0
  324. package/src/modules/business-partner/query/getPartnerRole.test.ts +31 -0
  325. package/src/modules/business-partner/query/getPartnerRole.ts +19 -0
  326. package/src/modules/business-partner/query/getPrimaryContactPerson.generated.ts +5 -0
  327. package/src/modules/business-partner/query/getPrimaryContactPerson.test.ts +43 -0
  328. package/src/modules/business-partner/query/getPrimaryContactPerson.ts +17 -0
  329. package/src/modules/business-partner/query/listContactPersonsByPartner.generated.ts +5 -0
  330. package/src/modules/business-partner/query/listContactPersonsByPartner.test.ts +77 -0
  331. package/src/modules/business-partner/query/listContactPersonsByPartner.ts +32 -0
  332. package/src/modules/business-partner/query/listPartnerAddressesByPartner.generated.ts +5 -0
  333. package/src/modules/business-partner/query/listPartnerAddressesByPartner.test.ts +71 -0
  334. package/src/modules/business-partner/query/listPartnerAddressesByPartner.ts +37 -0
  335. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.generated.ts +5 -0
  336. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.test.ts +59 -0
  337. package/src/modules/business-partner/query/listPartnerBankAccountsByPartner.ts +32 -0
  338. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.generated.ts +5 -0
  339. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.test.ts +72 -0
  340. package/src/modules/business-partner/query/listPartnerIdentificationsByPartner.ts +40 -0
  341. package/src/modules/business-partner/query/listPartnersByRole.generated.ts +5 -0
  342. package/src/modules/business-partner/query/listPartnersByRole.test.ts +103 -0
  343. package/src/modules/business-partner/query/listPartnersByRole.ts +47 -0
  344. package/src/modules/business-partner/tailor.config.ts +13 -0
  345. package/src/modules/business-partner/tailor.d.ts +13 -0
  346. package/src/modules/business-partner/testing/fixtures.ts +204 -0
  347. package/src/modules/coa-management/README.md +61 -0
  348. package/src/modules/coa-management/command/.gitkeep +0 -0
  349. package/src/modules/coa-management/command/activateAccount.generated.ts +6 -0
  350. package/src/modules/coa-management/command/activateAccount.test.ts +125 -0
  351. package/src/modules/coa-management/command/activateAccount.ts +105 -0
  352. package/src/modules/coa-management/command/activateChartOfAccounts.generated.ts +6 -0
  353. package/src/modules/coa-management/command/activateChartOfAccounts.test.ts +113 -0
  354. package/src/modules/coa-management/command/activateChartOfAccounts.ts +104 -0
  355. package/src/modules/coa-management/command/createAccount.generated.ts +6 -0
  356. package/src/modules/coa-management/command/createAccount.test.ts +767 -0
  357. package/src/modules/coa-management/command/createAccount.ts +247 -0
  358. package/src/modules/coa-management/command/createAccountGroup.generated.ts +6 -0
  359. package/src/modules/coa-management/command/createAccountGroup.test.ts +494 -0
  360. package/src/modules/coa-management/command/createAccountGroup.ts +207 -0
  361. package/src/modules/coa-management/command/createChartOfAccounts.generated.ts +6 -0
  362. package/src/modules/coa-management/command/createChartOfAccounts.test.ts +502 -0
  363. package/src/modules/coa-management/command/createChartOfAccounts.ts +267 -0
  364. package/src/modules/coa-management/command/deactivateAccount.generated.ts +6 -0
  365. package/src/modules/coa-management/command/deactivateAccount.test.ts +199 -0
  366. package/src/modules/coa-management/command/deactivateAccount.ts +142 -0
  367. package/src/modules/coa-management/command/deactivateChartOfAccounts.generated.ts +6 -0
  368. package/src/modules/coa-management/command/deactivateChartOfAccounts.test.ts +91 -0
  369. package/src/modules/coa-management/command/deactivateChartOfAccounts.ts +88 -0
  370. package/src/modules/coa-management/command/deleteAccount.generated.ts +6 -0
  371. package/src/modules/coa-management/command/deleteAccount.test.ts +122 -0
  372. package/src/modules/coa-management/command/deleteAccount.ts +103 -0
  373. package/src/modules/coa-management/command/deleteAccountGroup.generated.ts +6 -0
  374. package/src/modules/coa-management/command/deleteAccountGroup.test.ts +120 -0
  375. package/src/modules/coa-management/command/deleteAccountGroup.ts +113 -0
  376. package/src/modules/coa-management/command/deleteChartOfAccounts.generated.ts +6 -0
  377. package/src/modules/coa-management/command/deleteChartOfAccounts.test.ts +154 -0
  378. package/src/modules/coa-management/command/deleteChartOfAccounts.ts +133 -0
  379. package/src/modules/coa-management/command/moveAccountGroup.generated.ts +6 -0
  380. package/src/modules/coa-management/command/moveAccountGroup.test.ts +199 -0
  381. package/src/modules/coa-management/command/moveAccountGroup.ts +145 -0
  382. package/src/modules/coa-management/command/reactivateAccount.generated.ts +6 -0
  383. package/src/modules/coa-management/command/reactivateAccount.test.ts +126 -0
  384. package/src/modules/coa-management/command/reactivateAccount.ts +123 -0
  385. package/src/modules/coa-management/command/updateAccount.generated.ts +6 -0
  386. package/src/modules/coa-management/command/updateAccount.test.ts +669 -0
  387. package/src/modules/coa-management/command/updateAccount.ts +370 -0
  388. package/src/modules/coa-management/command/updateAccountGroup.generated.ts +6 -0
  389. package/src/modules/coa-management/command/updateAccountGroup.test.ts +253 -0
  390. package/src/modules/coa-management/command/updateAccountGroup.ts +191 -0
  391. package/src/modules/coa-management/command/updateChartOfAccounts.generated.ts +6 -0
  392. package/src/modules/coa-management/command/updateChartOfAccounts.test.ts +153 -0
  393. package/src/modules/coa-management/command/updateChartOfAccounts.ts +133 -0
  394. package/src/modules/coa-management/db/.gitkeep +0 -0
  395. package/src/modules/coa-management/db/account.ts +119 -0
  396. package/src/modules/coa-management/db/accountGroup.ts +57 -0
  397. package/src/modules/coa-management/db/chartOfAccounts.ts +55 -0
  398. package/src/modules/coa-management/docs/commands/ActivateAccount.md +49 -0
  399. package/src/modules/coa-management/docs/commands/ActivateChartOfAccounts.md +47 -0
  400. package/src/modules/coa-management/docs/commands/CreateAccount.md +94 -0
  401. package/src/modules/coa-management/docs/commands/CreateAccountGroup.md +70 -0
  402. package/src/modules/coa-management/docs/commands/CreateChartOfAccounts.md +72 -0
  403. package/src/modules/coa-management/docs/commands/DeactivateAccount.md +65 -0
  404. package/src/modules/coa-management/docs/commands/DeactivateChartOfAccounts.md +44 -0
  405. package/src/modules/coa-management/docs/commands/DeleteAccount.md +52 -0
  406. package/src/modules/coa-management/docs/commands/DeleteAccountGroup.md +50 -0
  407. package/src/modules/coa-management/docs/commands/DeleteChartOfAccounts.md +48 -0
  408. package/src/modules/coa-management/docs/commands/MoveAccountGroup.md +57 -0
  409. package/src/modules/coa-management/docs/commands/ReactivateAccount.md +50 -0
  410. package/src/modules/coa-management/docs/commands/UpdateAccount.md +102 -0
  411. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +62 -0
  412. package/src/modules/coa-management/docs/commands/UpdateChartOfAccounts.md +49 -0
  413. package/src/modules/coa-management/docs/features/account-group-hierarchy.md +81 -0
  414. package/src/modules/coa-management/docs/features/account-lifecycle.md +80 -0
  415. package/src/modules/coa-management/docs/features/account-management.md +114 -0
  416. package/src/modules/coa-management/docs/features/chart-of-accounts-setup.md +86 -0
  417. package/src/modules/coa-management/docs/models/Account.md +84 -0
  418. package/src/modules/coa-management/docs/models/AccountGroup.md +55 -0
  419. package/src/modules/coa-management/docs/models/ChartOfAccounts.md +65 -0
  420. package/src/modules/coa-management/docs/queries/DetectCircularReference.md +52 -0
  421. package/src/modules/coa-management/docs/queries/GetAccount.md +42 -0
  422. package/src/modules/coa-management/docs/queries/GetAccountGroup.md +42 -0
  423. package/src/modules/coa-management/docs/queries/GetChartOfAccounts.md +48 -0
  424. package/src/modules/coa-management/docs/queries/ListAccountGroups.md +42 -0
  425. package/src/modules/coa-management/docs/queries/ListAccounts.md +54 -0
  426. package/src/modules/coa-management/docs/queries/ListUnassignedAccounts.md +40 -0
  427. package/src/modules/coa-management/executor/.gitkeep +0 -0
  428. package/src/modules/coa-management/generated/.gitkeep +0 -0
  429. package/src/modules/coa-management/generated/enums.ts +45 -0
  430. package/src/modules/coa-management/generated/kysely-tailordb.ts +81 -0
  431. package/src/modules/coa-management/index.ts +2 -0
  432. package/src/modules/coa-management/lib/_db_deps.ts +17 -0
  433. package/src/modules/coa-management/lib/errors.generated.ts +162 -0
  434. package/src/modules/coa-management/lib/errors.ts +0 -0
  435. package/src/modules/coa-management/lib/permissions.generated.ts +20 -0
  436. package/src/modules/coa-management/lib/types.ts +22 -0
  437. package/src/modules/coa-management/module.ts +136 -0
  438. package/src/modules/coa-management/permissions.ts +3 -0
  439. package/src/modules/coa-management/query/.gitkeep +0 -0
  440. package/src/modules/coa-management/query/detectCircularReference.generated.ts +5 -0
  441. package/src/modules/coa-management/query/detectCircularReference.test.ts +88 -0
  442. package/src/modules/coa-management/query/detectCircularReference.ts +46 -0
  443. package/src/modules/coa-management/query/getAccount.generated.ts +5 -0
  444. package/src/modules/coa-management/query/getAccount.test.ts +55 -0
  445. package/src/modules/coa-management/query/getAccount.ts +25 -0
  446. package/src/modules/coa-management/query/getAccountGroup.generated.ts +5 -0
  447. package/src/modules/coa-management/query/getAccountGroup.test.ts +55 -0
  448. package/src/modules/coa-management/query/getAccountGroup.ts +25 -0
  449. package/src/modules/coa-management/query/getChartOfAccounts.generated.ts +5 -0
  450. package/src/modules/coa-management/query/getChartOfAccounts.test.ts +79 -0
  451. package/src/modules/coa-management/query/getChartOfAccounts.ts +28 -0
  452. package/src/modules/coa-management/query/listAccountGroups.generated.ts +5 -0
  453. package/src/modules/coa-management/query/listAccountGroups.test.ts +72 -0
  454. package/src/modules/coa-management/query/listAccountGroups.ts +49 -0
  455. package/src/modules/coa-management/query/listAccounts.generated.ts +5 -0
  456. package/src/modules/coa-management/query/listAccounts.test.ts +136 -0
  457. package/src/modules/coa-management/query/listAccounts.ts +82 -0
  458. package/src/modules/coa-management/query/listUnassignedAccounts.generated.ts +5 -0
  459. package/src/modules/coa-management/query/listUnassignedAccounts.test.ts +96 -0
  460. package/src/modules/coa-management/query/listUnassignedAccounts.ts +39 -0
  461. package/src/modules/coa-management/tailor.config.ts +13 -0
  462. package/src/modules/coa-management/tailor.d.ts +13 -0
  463. package/src/modules/coa-management/testing/fixtures.ts +201 -0
  464. package/src/modules/item-management/README.md +1 -1
  465. package/src/modules/organization/README.md +57 -0
  466. package/src/modules/organization/command/.gitkeep +0 -0
  467. package/src/modules/organization/command/activateCompany.generated.ts +6 -0
  468. package/src/modules/organization/command/activateCompany.test.ts +184 -0
  469. package/src/modules/organization/command/activateCompany.ts +92 -0
  470. package/src/modules/organization/command/createCompany.generated.ts +6 -0
  471. package/src/modules/organization/command/createCompany.test.ts +156 -0
  472. package/src/modules/organization/command/createCompany.ts +80 -0
  473. package/src/modules/organization/command/createDepartment.generated.ts +6 -0
  474. package/src/modules/organization/command/createDepartment.test.ts +239 -0
  475. package/src/modules/organization/command/createDepartment.ts +98 -0
  476. package/src/modules/organization/command/createSite.generated.ts +6 -0
  477. package/src/modules/organization/command/createSite.test.ts +262 -0
  478. package/src/modules/organization/command/createSite.ts +155 -0
  479. package/src/modules/organization/command/deactivateCompany.generated.ts +6 -0
  480. package/src/modules/organization/command/deactivateCompany.test.ts +58 -0
  481. package/src/modules/organization/command/deactivateCompany.ts +47 -0
  482. package/src/modules/organization/command/deactivateDepartment.generated.ts +6 -0
  483. package/src/modules/organization/command/deactivateDepartment.test.ts +115 -0
  484. package/src/modules/organization/command/deactivateDepartment.ts +63 -0
  485. package/src/modules/organization/command/deactivateSite.generated.ts +6 -0
  486. package/src/modules/organization/command/deactivateSite.test.ts +53 -0
  487. package/src/modules/organization/command/deactivateSite.ts +47 -0
  488. package/src/modules/organization/command/deleteCompany.generated.ts +6 -0
  489. package/src/modules/organization/command/deleteCompany.test.ts +99 -0
  490. package/src/modules/organization/command/deleteCompany.ts +66 -0
  491. package/src/modules/organization/command/reactivateCompany.generated.ts +6 -0
  492. package/src/modules/organization/command/reactivateCompany.test.ts +58 -0
  493. package/src/modules/organization/command/reactivateCompany.ts +47 -0
  494. package/src/modules/organization/command/reactivateDepartment.generated.ts +6 -0
  495. package/src/modules/organization/command/reactivateDepartment.test.ts +59 -0
  496. package/src/modules/organization/command/reactivateDepartment.ts +47 -0
  497. package/src/modules/organization/command/reactivateSite.generated.ts +6 -0
  498. package/src/modules/organization/command/reactivateSite.test.ts +53 -0
  499. package/src/modules/organization/command/reactivateSite.ts +47 -0
  500. package/src/modules/organization/command/updateCompany.generated.ts +6 -0
  501. package/src/modules/organization/command/updateCompany.test.ts +239 -0
  502. package/src/modules/organization/command/updateCompany.ts +127 -0
  503. package/src/modules/organization/command/updateDepartment.generated.ts +6 -0
  504. package/src/modules/organization/command/updateDepartment.test.ts +232 -0
  505. package/src/modules/organization/command/updateDepartment.ts +120 -0
  506. package/src/modules/organization/command/updateSite.generated.ts +6 -0
  507. package/src/modules/organization/command/updateSite.test.ts +274 -0
  508. package/src/modules/organization/command/updateSite.ts +176 -0
  509. package/src/modules/organization/db/.gitkeep +0 -0
  510. package/src/modules/organization/db/company.ts +44 -0
  511. package/src/modules/organization/db/department.ts +46 -0
  512. package/src/modules/organization/db/site.ts +44 -0
  513. package/src/modules/organization/docs/commands/ActivateCompany.md +62 -0
  514. package/src/modules/organization/docs/commands/CreateCompany.md +49 -0
  515. package/src/modules/organization/docs/commands/CreateDepartment.md +62 -0
  516. package/src/modules/organization/docs/commands/CreateSite.md +74 -0
  517. package/src/modules/organization/docs/commands/DeactivateCompany.md +40 -0
  518. package/src/modules/organization/docs/commands/DeactivateDepartment.md +44 -0
  519. package/src/modules/organization/docs/commands/DeactivateSite.md +38 -0
  520. package/src/modules/organization/docs/commands/DeleteCompany.md +50 -0
  521. package/src/modules/organization/docs/commands/ReactivateCompany.md +39 -0
  522. package/src/modules/organization/docs/commands/ReactivateDepartment.md +37 -0
  523. package/src/modules/organization/docs/commands/ReactivateSite.md +37 -0
  524. package/src/modules/organization/docs/commands/UpdateCompany.md +58 -0
  525. package/src/modules/organization/docs/commands/UpdateDepartment.md +64 -0
  526. package/src/modules/organization/docs/commands/UpdateSite.md +80 -0
  527. package/src/modules/organization/docs/features/company-lifecycle.md +76 -0
  528. package/src/modules/organization/docs/features/department-management.md +66 -0
  529. package/src/modules/organization/docs/features/site-management.md +86 -0
  530. package/src/modules/organization/docs/models/Company.md +60 -0
  531. package/src/modules/organization/docs/models/Department.md +57 -0
  532. package/src/modules/organization/docs/models/Site.md +57 -0
  533. package/src/modules/organization/docs/queries/DetectDepartmentCircularReference.md +50 -0
  534. package/src/modules/organization/docs/queries/GetCompany.md +40 -0
  535. package/src/modules/organization/docs/queries/GetDepartment.md +44 -0
  536. package/src/modules/organization/docs/queries/GetDepartmentChildren.md +40 -0
  537. package/src/modules/organization/docs/queries/GetSite.md +37 -0
  538. package/src/modules/organization/docs/queries/ListDepartmentsByCompany.md +54 -0
  539. package/src/modules/organization/docs/queries/ListSitesByCompany.md +54 -0
  540. package/src/modules/organization/executor/.gitkeep +0 -0
  541. package/src/modules/organization/generated/.gitkeep +0 -0
  542. package/src/modules/organization/generated/kysely-tailordb.ts +77 -0
  543. package/src/modules/organization/index.ts +2 -0
  544. package/src/modules/organization/lib/_db_deps.ts +10 -0
  545. package/src/modules/organization/lib/errors.generated.ts +117 -0
  546. package/src/modules/organization/lib/errors.ts +1 -0
  547. package/src/modules/organization/lib/permissions.generated.ts +19 -0
  548. package/src/modules/organization/lib/types.ts +16 -0
  549. package/src/modules/organization/module.ts +89 -0
  550. package/src/modules/organization/permissions.ts +3 -0
  551. package/src/modules/organization/query/.gitkeep +0 -0
  552. package/src/modules/organization/query/detectDepartmentCircularReference.generated.ts +5 -0
  553. package/src/modules/organization/query/detectDepartmentCircularReference.test.ts +102 -0
  554. package/src/modules/organization/query/detectDepartmentCircularReference.ts +27 -0
  555. package/src/modules/organization/query/getCompany.generated.ts +5 -0
  556. package/src/modules/organization/query/getCompany.test.ts +70 -0
  557. package/src/modules/organization/query/getCompany.ts +16 -0
  558. package/src/modules/organization/query/getDepartment.generated.ts +5 -0
  559. package/src/modules/organization/query/getDepartment.test.ts +85 -0
  560. package/src/modules/organization/query/getDepartment.ts +17 -0
  561. package/src/modules/organization/query/getDepartmentChildren.generated.ts +5 -0
  562. package/src/modules/organization/query/getDepartmentChildren.test.ts +75 -0
  563. package/src/modules/organization/query/getDepartmentChildren.ts +21 -0
  564. package/src/modules/organization/query/getSite.generated.ts +5 -0
  565. package/src/modules/organization/query/getSite.test.ts +55 -0
  566. package/src/modules/organization/query/getSite.ts +16 -0
  567. package/src/modules/organization/query/listDepartmentsByCompany.generated.ts +5 -0
  568. package/src/modules/organization/query/listDepartmentsByCompany.test.ts +124 -0
  569. package/src/modules/organization/query/listDepartmentsByCompany.ts +43 -0
  570. package/src/modules/organization/query/listSitesByCompany.generated.ts +5 -0
  571. package/src/modules/organization/query/listSitesByCompany.test.ts +126 -0
  572. package/src/modules/organization/query/listSitesByCompany.ts +41 -0
  573. package/src/modules/organization/tailor.config.ts +13 -0
  574. package/src/modules/organization/tailor.d.ts +13 -0
  575. package/src/modules/organization/testing/fixtures.ts +155 -0
  576. package/src/modules/primitives/README.md +1 -1
  577. package/src/modules/primitives/command/setBaseCurrency.test.ts +8 -64
  578. package/src/modules/primitives/command/setBaseCurrency.ts +6 -64
  579. package/src/modules/primitives/docs/commands/ActivateCategory.md +1 -1
  580. package/src/modules/primitives/docs/commands/ActivateCurrency.md +1 -1
  581. package/src/modules/primitives/docs/commands/ActivateUnit.md +1 -1
  582. package/src/modules/primitives/docs/commands/CreateExchangeRate.md +2 -2
  583. package/src/modules/primitives/docs/commands/CreateUnit.md +1 -1
  584. package/src/modules/primitives/docs/commands/DeactivateCategory.md +1 -1
  585. package/src/modules/primitives/docs/commands/DeactivateCurrency.md +1 -1
  586. package/src/modules/primitives/docs/commands/DeactivateUnit.md +1 -1
  587. package/src/modules/primitives/docs/commands/SetBaseCurrency.md +13 -23
  588. package/src/modules/primitives/docs/commands/SetReferenceUnit.md +1 -1
  589. package/src/modules/primitives/docs/features/currency-definitions.md +13 -14
  590. package/src/modules/primitives/docs/models/Currency.md +3 -4
  591. package/src/modules/primitives/docs/queries/ConvertAmount.md +2 -2
  592. package/src/modules/primitives/docs/queries/ConvertQuantity.md +2 -2
  593. package/src/modules/primitives/lib/errors.generated.ts +5 -0
  594. package/src/modules/product-management/README.md +1 -1
  595. package/src/modules/user-management/docs/commands/CreatePermission.md +3 -3
  596. package/src/modules/user-management/docs/commands/CreateRole.md +1 -1
  597. package/src/modules/user-management/docs/queries/ListRolePermissionsByRole.md +39 -0
  598. package/src/modules/user-management/docs/queries/ListUserRolesByUser.md +39 -0
  599. package/src/modules/user-management/generated/enums.ts +0 -15
  600. package/src/modules/user-management/generated/kysely-tailordb.ts +0 -11
  601. package/src/shared/createContext.ts +2 -1
  602. package/src/shared/defineQuery.ts +36 -1
  603. package/src/shared/requirePermission.ts +3 -3
  604. package/src/shared/types.ts +3 -0
  605. package/templates/scaffold/app/backend/package.json +4 -3
  606. package/templates/scaffold/app/frontend/eslint.config.js +12 -0
  607. package/templates/scaffold/app/frontend/package.json +10 -7
  608. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +30 -0
  609. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +3 -2
  610. package/templates/scaffold/app/frontend/vite.config.ts +5 -5
  611. package/src/commands/module/list.test.ts +0 -57
  612. package/src/commands/module/list.ts +0 -64
  613. /package/src/modules/{accounting → audit/db}/.gitkeep +0 -0
  614. /package/src/modules/audit/{.gitkeep → executor/.gitkeep} +0 -0
  615. /package/src/modules/{coa-management/.gitkeep → audit/lib/errors.ts} +0 -0
  616. /package/src/modules/{supplier-management → business-partner}/.gitkeep +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tailor-platform/erp-kit",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Opinionated ERP toolkit for building business applications on Tailor Platform",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -35,12 +35,13 @@
35
35
  "devDependencies": {
36
36
  "@tailor-platform/function-kysely-tailordb": "0.1.3",
37
37
  "@tailor-platform/function-types": "0.8.2",
38
- "@tailor-platform/sdk": "1.25.1",
38
+ "@tailor-platform/sdk": "1.25.2",
39
39
  "@types/mdast": "^4.0.4",
40
40
  "@types/node": "^25.1.0",
41
+ "@typescript-eslint/parser": "^8.57.0",
41
42
  "eslint": "10.0.3",
42
43
  "kysely": "0.28.11",
43
- "tsdown": "0.21.2",
44
+ "tsdown": "0.21.3",
44
45
  "typescript": "^5.7.3",
45
46
  "vitest": "^4.0.0",
46
47
  "@tailor-platform/eslint-config": "0.0.1"
@@ -48,7 +49,7 @@
48
49
  "peerDependencies": {
49
50
  "@tailor-platform/function-kysely-tailordb": "0.1.3",
50
51
  "@tailor-platform/function-types": "0.8.2",
51
- "@tailor-platform/sdk": "1.25.1",
52
+ "@tailor-platform/sdk": "1.25.2",
52
53
  "kysely": "0.28.11"
53
54
  },
54
55
  "engines": {
@@ -26,15 +26,14 @@ Focus on "what" the application should do, not "how" it will be implemented.
26
26
 
27
27
  ### Phase 2: Clarify
28
28
 
29
- Use AskUserQuestion to clarify undefined requirements:
29
+ Use AskUserQuestion to clarify undefined requirements. Focus on business-level scope and workflows — not platform capabilities like authentication.
30
30
 
31
- | Category | Example Questions |
32
- | ----------------- | ---------------------------------------------- |
33
- | Authentication | External IdP / Password / Out of scope? |
34
- | User Operations | Direct creation / Email invitation / Both? |
35
- | Roles | Fixed roles (Admin/User) / Custom roles? |
36
- | User Self-Service | View only / Profile edit / Password change? |
37
- | Lifecycle | Create only / Full lifecycle (activate/deact)? |
31
+ | Category | Example Questions |
32
+ | ---------------- | ---------------------------------------------------------------------------- |
33
+ | Scope | Which steps are MVP-essential? Any steps that can be deferred? |
34
+ | Edge Cases | How far to handle cancellation, rejection, or mid-flow abandonment? |
35
+ | Actor Boundaries | Are approver and executor separate? What is each actor's operational scope? |
36
+ | Business Rules | Which steps are automated vs manual? What conditional branches exist? |
38
37
 
39
38
  Ask 3-4 questions at a time using multiSelect where appropriate.
40
39
 
@@ -76,7 +75,7 @@ At Tier 2, story files do not exist yet. Use `- TBD` as a placeholder to avoid b
76
75
  ### Phase 4: Validate
77
76
 
78
77
  ```bash
79
- pnpm run app:doc:check
78
+ erp-kit app check -p {APP_ROOT}
80
79
  ```
81
80
 
82
81
  See [schema-constraints.md](../erp-kit-app-shared/references/schema-constraints.md) for notes on expected "No matching files found" output.
@@ -11,6 +11,10 @@ Business flow docs: {{BUSINESS_FLOW_DOCS}}
11
11
 
12
12
  Read [erp-kit-app-shared/references/schema-constraints.md](../../erp-kit-app-shared/references/schema-constraints.md) before evaluating. **Never recommend changes that violate the schema.**
13
13
 
14
+ ## Tier 2 Scope
15
+
16
+ This review targets Tier 1-2 documentation only. Stories (`## Stories` section in business flows) are created in step 3 (`erp-kit-app-3-plan`). A `- TBD` placeholder in the Stories section is expected and correct at this stage — do **not** flag it as incomplete or missing.
17
+
14
18
  ## Instructions
15
19
 
16
20
  1. Read the application README at the path above
@@ -11,6 +11,10 @@ Business flow docs: {{BUSINESS_FLOW_DOCS}}
11
11
 
12
12
  Read [erp-kit-app-shared/references/schema-constraints.md](../../erp-kit-app-shared/references/schema-constraints.md) before evaluating. When checking `naming_consistency`, validate that H1 headings follow the schema rules — different doc types have different heading formats.
13
13
 
14
+ ## Tier 2 Scope
15
+
16
+ This review targets Tier 1-2 documentation only. Stories (`## Stories` section in business flows) are created in step 3 (`erp-kit-app-3-plan`). A `- TBD` placeholder in the Stories section is expected and correct at this stage — do **not** flag it as a broken link, missing content, or incomplete documentation.
17
+
14
18
  ## Instructions
15
19
 
16
20
  1. Read the application README at the path above
@@ -29,26 +29,36 @@ Define shared context for all agents:
29
29
  - `APP_NAME`: basename of APP_ROOT
30
30
  - `BUSINESS_FLOW_DOCS`: glob `<APP_ROOT>/docs/business-flow/*/README.md`
31
31
  - `ACTOR_DOCS`: glob `<APP_ROOT>/docs/actors/*.md`
32
+ - `MODULE_OVERVIEW`: output of `erp-kit doc modules`
32
33
 
33
34
  Verify at least `BUSINESS_FLOW_DOCS` is non-empty. If no business flow docs exist, stop with: "No business flow docs found under <APP_ROOT>/docs/. Run erp-kit-app-1-requirements first."
34
35
 
36
+ Collect module overview:
37
+
38
+ ```bash
39
+ erp-kit doc modules
40
+ ```
41
+
42
+ This returns each module's name, overview, command/query/model counts, and dependencies. Save the full output as `MODULE_OVERVIEW` — all three agents receive it.
43
+
35
44
  ## Step 2: Dispatch Agents (parallelize if possible)
36
45
 
37
46
  Launch 3 Agent tool calls in parallel — one per extraction concern.
38
- Each agent receives: APP_NAME, relevant doc file paths.
47
+ Each agent receives: APP_NAME, relevant doc file paths, and MODULE_OVERVIEW.
39
48
 
40
- | Agent | Prompt Template | Inputs |
41
- | ----- | ---------------------------------------------------------------------- | ---------------------------------------- |
42
- | 1 | [references/story-extraction.md](references/story-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS |
43
- | 2 | [references/screen-extraction.md](references/screen-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS |
44
- | 3 | [references/resolver-extraction.md](references/resolver-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS |
49
+ | Agent | Prompt Template | Inputs |
50
+ | ----- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
51
+ | 1 | [references/story-extraction.md](references/story-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS, MODULE_OVERVIEW |
52
+ | 2 | [references/screen-extraction.md](references/screen-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS, MODULE_OVERVIEW |
53
+ | 3 | [references/resolver-extraction.md](references/resolver-extraction.md) | APP_NAME, ACTOR_DOCS, BUSINESS_FLOW_DOCS, MODULE_OVERVIEW |
45
54
 
46
55
  For each agent:
47
56
 
48
57
  1. Read the prompt template file
49
58
  2. Replace `{{APP_NAME}}` with the resolved app name
50
59
  3. Replace `{{ACTOR_DOCS}}`, `{{BUSINESS_FLOW_DOCS}}` with the actual file paths
51
- 4. Dispatch the agent with the filled prompt
60
+ 4. Replace `{{MODULE_OVERVIEW}}` with the output from `erp-kit doc modules`
61
+ 5. Dispatch the agent with the filled prompt
52
62
 
53
63
  ## Step 3: Aggregate & Present Plan
54
64
 
@@ -59,33 +69,23 @@ After ALL agents return:
59
69
  - Stories to create (with actor, flow, scenario patterns)
60
70
  - Screens to create (with type, fields, actions)
61
71
  - Resolvers to create (with operation type, module mapping)
62
- 3. Wait for user approval
63
-
64
- ## Step 4: Check Module Dependencies
72
+ ## Step 4: Resolve Module Gaps
65
73
 
66
- Before creating resolver docs, verify required modules exist:
74
+ Step 2's resolver agent mapped resolvers to erp-kit modules using `MODULE_OVERVIEW` and flagged any operations that could not be mapped as module gaps.
67
75
 
68
- ```bash
69
- ls packages/erp-kit/src/modules/
70
- ```
71
-
72
- For each resolver that references a module command, check the module and command exist:
73
-
74
- ```bash
75
- ls packages/erp-kit/src/modules/<module-name>/docs/commands/
76
- ```
76
+ If there are no gaps, proceed to Step 5.
77
77
 
78
- **If modules don't exist:**
78
+ **If resolvers require functionality that no erp-kit module provides:**
79
79
 
80
- 1. Identify needed modules group resolver operations by domain
81
- 2. Create module docs first use `erp-kit-module-1-requirements` skill
82
- 3. Return to this step after modules have documented commands
80
+ 1. Group the unmapped operations by domain to identify what custom modules are needed
81
+ 2. Create each custom module using `erp-kit-module-1-requirements` skill
82
+ 3. Return to this step after the custom modules are ready
83
83
 
84
- **Only reference existing module commands** in resolver documentation.
84
+ For resolvers that reference erp-kit modules, use `MODULE_OVERVIEW` as the source of truth. For resolvers that reference custom modules, use the custom module's own documentation.
85
85
 
86
86
  ## Step 5: Scaffold & Populate
87
87
 
88
- After approval, scaffold using `erp-kit` CLI:
88
+ Scaffold using `erp-kit` CLI:
89
89
 
90
90
  ```bash
91
91
  # Tier 3: Stories
@@ -117,7 +117,7 @@ Read-only stories should have `None` under `## Resolvers`.
117
117
  ## Step 6: Validate
118
118
 
119
119
  ```bash
120
- pnpm run app:doc:check
120
+ erp-kit app check -p {APP_ROOT}
121
121
  ```
122
122
 
123
123
  ## Naming Conventions
@@ -6,11 +6,23 @@ App: {{APP_NAME}}
6
6
  Actor docs: {{ACTOR_DOCS}}
7
7
  Business flow docs: {{BUSINESS_FLOW_DOCS}}
8
8
 
9
+ ## Available Modules
10
+
11
+ The following modules are available in erp-kit. Use this to map resolvers to real module commands.
12
+
13
+ {{MODULE_OVERVIEW}}
14
+
15
+ To inspect a specific module's commands in detail, run:
16
+
17
+ ```bash
18
+ erp-kit doc module <module-name> command <command-name>
19
+ ```
20
+
9
21
  ## Instructions
10
22
 
11
23
  1. Read ALL actor docs at the paths above
12
24
  2. Read ALL business flow docs at the paths above
13
- 3. Identify GraphQL resolvers needed for each business flow
25
+ 3. Identify GraphQL resolvers needed for each business flow, using the module overview and `erp-kit doc module <name> command` for detail
14
26
  4. Return results as a structured markdown report
15
27
 
16
28
  ## Extraction Rules
@@ -21,26 +33,13 @@ For each business flow step that modifies data:
21
33
 
22
34
  1. Identify the operation type (create, update, delete, approve, etc.)
23
35
  2. Map to a resolver name using camelCase action-verb convention
24
- 3. Identify the module command the resolver will call
36
+ 3. Identify the module command the resolver will call. If no erp-kit module covers the domain, flag it as a module gap.
25
37
  4. Extract inputs, outputs, and error scenarios
26
38
 
27
39
  ### Operation → Resolver Mapping
28
40
 
29
41
  See [erp-kit-app-shared/references/resolver-classification.md](../../erp-kit-app-shared/references/resolver-classification.md) for the full operation → resolver mapping table and custom vs built-in classification.
30
42
 
31
- ### Module Command Mapping
32
-
33
- For each resolver, identify which erp-kit module provides the command:
34
-
35
- | Resolver Operation | Typical Module |
36
- | ------------------ | --------------------- |
37
- | User invite/roles | `user-management` |
38
- | Supplier CRUD | `supplier-management` |
39
- | Document handling | `document-management` |
40
- | Task workflows | `task-management` |
41
- | Item CRUD | `item-management` |
42
- | Unit/currency | `primitives` |
43
-
44
43
  ### Resolver Content
45
44
 
46
45
  For each resolver, extract:
@@ -78,12 +77,17 @@ For each resolver:
78
77
 
79
78
  List entities that only need built-in list/get queries (no custom resolver needed).
80
79
 
81
- ### Module Dependencies
80
+ ### Module Gaps
81
+
82
+ List any operations that could not be mapped to an existing erp-kit module. These will require a custom module. For each gap:
82
83
 
83
- Table with columns: Module, Required Commands, Status (exists/missing)
84
+ - **Operation:** what the flow requires
85
+ - **Suggested custom module:** proposed module name and domain
86
+ - **Suggested command:** proposed command name
84
87
 
85
88
  ### Summary
86
89
 
87
90
  - Total custom resolvers
88
91
  - Total built-in queries
89
92
  - Resolvers per module (table)
93
+ - Module gaps (if any)
@@ -6,12 +6,25 @@ App: {{APP_NAME}}
6
6
  Actor docs: {{ACTOR_DOCS}}
7
7
  Business flow docs: {{BUSINESS_FLOW_DOCS}}
8
8
 
9
+ ## Available Modules
10
+
11
+ The following modules are available in erp-kit. Use this to understand which entities exist and what operations are available.
12
+
13
+ {{MODULE_OVERVIEW}}
14
+
15
+ To inspect a specific module's model (domain description, state transitions, invariants, commands), run:
16
+
17
+ ```bash
18
+ erp-kit doc module <module-name> model <model-name>
19
+ ```
20
+
9
21
  ## Instructions
10
22
 
11
23
  1. Read ALL actor docs at the paths above
12
24
  2. Read ALL business flow docs at the paths above
13
25
  3. Identify screens needed for each business flow
14
- 4. Return results as a structured markdown report
26
+ 4. For screens that display or edit module entities, use `erp-kit doc module <name> model` to understand the entity's domain
27
+ 5. Return results as a structured markdown report
15
28
 
16
29
  ## Extraction Rules
17
30
 
@@ -63,6 +76,7 @@ For each screen:
63
76
 
64
77
  - **Screen:** `<screen-name>`
65
78
  - **Type:** ListView / Form / DetailView
79
+ - **Module source:** which module's model provides the data (if applicable)
66
80
  - **Fields/Columns:** bulleted list of fields with types
67
81
  - **Actions:** bulleted list of actions
68
82
  - **Referenced by stories:** which stories use this screen
@@ -6,6 +6,12 @@ App: {{APP_NAME}}
6
6
  Actor docs: {{ACTOR_DOCS}}
7
7
  Business flow docs: {{BUSINESS_FLOW_DOCS}}
8
8
 
9
+ ## Available Modules
10
+
11
+ The following modules are available in erp-kit. Use this to determine whether a story needs custom resolvers or can rely on built-in queries.
12
+
13
+ {{MODULE_OVERVIEW}}
14
+
9
15
  ## Instructions
10
16
 
11
17
  1. Read ALL actor docs at the paths above
@@ -49,10 +55,10 @@ For each story, extract:
49
55
 
50
56
  ### Resolver Classification
51
57
 
52
- For each story, determine:
58
+ For each story, determine using the module overview:
53
59
 
54
60
  - **Needs resolvers**: Story involves create/update/delete operations → mark as `- TBD` for resolvers
55
- - **Read-only**: Story only views/lists data → mark as `None` for resolvers
61
+ - **Read-only**: Story only views/lists data and built-in queries suffice → mark as `None` for resolvers
56
62
 
57
63
  ## Naming Convention
58
64
 
@@ -27,9 +27,13 @@ All four tiers of documentation must exist:
27
27
  ## Workflow
28
28
 
29
29
  ```
30
- ANALYZE DOCS → MODULE WIRING → CONFIG → RESOLVERS → GENERATED FILES → VERIFY → DEPLOY
30
+ ANALYZE DOCS → MODULE WIRING → CONFIG → RESOLVERS → GENERATED FILES → DEPLOY
31
31
  ```
32
32
 
33
+ ### Incremental Verification
34
+
35
+ Run `pnpm lint` and `pnpm typecheck` after each of Phase 2, 3, and 4. Fix errors before moving on.
36
+
33
37
  ### Phase 1: Analyze Documentation
34
38
 
35
39
  Read all resolver and screen specs to build a complete picture:
@@ -65,10 +69,12 @@ Key points:
65
69
 
66
70
  ### Phase 4: Implement Backend Resolvers and Executors
67
71
 
68
- Write one file per resolver under `src/modules/<module-name>/resolvers/`, one per executor under `executors/`.
72
+ Write one file per resolver under `src/resolvers/`, one per executor under `executors/`.
69
73
 
70
74
  **Read [resolver & executor patterns reference](references/resolver-patterns.md).**
71
75
 
76
+ For each resolver, check whether its spec (`docs/resolver/*.md`) documents error codes. If it does, implement a `switch(result.error.code)` block — do not use generic `throw result.error`.
77
+
72
78
  Do not directly mutate module-owned tables via Kysely — always use module commands.
73
79
 
74
80
  ### Phase 5: Generated Files
@@ -76,15 +82,7 @@ Do not directly mutate module-owned tables via Kysely — always use module comm
76
82
  - **Kysely types** (`src/generated/kysely-tailordb.ts`) — Auto-generated by `pnpm generate` after deployment. Before deployment, create a minimal placeholder so the codebase typechecks.
77
83
  - **Seed data** (`seed/`) — `exec.mjs` runner + `data/*.jsonl` (records) and `data/*.schema.ts` (validation). Create seed records for initial data (permissions, roles, test users, etc.). Seeded users must have concrete permission keys required by the wired modules.
78
84
 
79
- ### Phase 6: Verify
80
-
81
- ```bash
82
- cd <app-root>/backend
83
- pnpm lint
84
- pnpm typecheck
85
- ```
86
-
87
- ### Phase 7: Deploy Backend & Next Steps
85
+ ### Phase 6: Deploy Backend & Next Steps
88
86
 
89
87
  Frontend implementation requires a deployed backend (for GraphQL schema generation). Prompt the user to:
90
88
 
@@ -1,26 +1,6 @@
1
1
  # Application Config
2
2
 
3
- `tailor.config.ts` defines the Tailor application configuration. Key structure:
4
-
5
- ```ts
6
- export default defineConfig({
7
- name: "<app-name>",
8
- cors: ["http://localhost:5173", website.url],
9
- db: {
10
- "main-db": {
11
- files: [`./src/modules.ts`],
12
- gqlOperations: "query",
13
- },
14
- },
15
- resolver: {
16
- "main-resolver": { files: [`./src/modules/**/resolvers/**/*.ts`] },
17
- },
18
- executor: { files: [`./src/modules/**/executors/**/*.ts`] },
19
- auth: auth,
20
- idp: [idp],
21
- staticWebsites: [website],
22
- });
23
- ```
3
+ `tailor.config.ts` defines the Tailor application configuration. Refer to existing examples in the codebase for the full config structure.
24
4
 
25
5
  Key points:
26
6
 
@@ -30,7 +10,6 @@ Key points:
30
10
 
31
11
  ## Auth configuration
32
12
 
33
- - Define IdP (`defineIdp`), Auth (`defineAuth`), and static website (`defineStaticWebSite`) using Tailor SDK
34
13
  - Prefer stable default naming: auth `default`, IdP `default`, OAuth2 client `default`
35
14
  - `userProfile.type` must reference the `user` DB type from `modules.ts`
36
15
  - `userProfile.usernameField`: stable unique field (e.g., `email`)
@@ -3,7 +3,6 @@
3
3
  `src/modules.ts` composes erp-kit modules and exports their parts for resolver use.
4
4
 
5
5
  ```ts
6
- import { db as field } from "@tailor-platform/sdk";
7
6
  import {
8
7
  definePrimitivesModule,
9
8
  defineUserManagementModule,
@@ -42,18 +42,27 @@ body: async (context) => {
42
42
 
43
43
  ### Error handling
44
44
 
45
- When the resolver spec documents specific error codes, use `result.error.code` to switch:
45
+ Resolver specs document error codes the command can return. When codes are documented, add a `case` for every documented code — generic `throw result.error` loses context for the frontend. The error code is a discriminated union, so TypeScript enforces exhaustive handling without a `default` branch.
46
+
47
+ **Do this:**
46
48
 
47
49
  ```ts
48
50
  if (!result.ok) {
49
51
  switch (result.error.code) {
50
- case "USER_NOT_FOUND":
51
- throw new Error(`User ${context.input.userId} not found`);
52
- // ...
52
+ case "INSUFFICIENT_STOCK":
53
+ throw new Error(`Stock insufficient for item ${context.input.itemId}`);
54
+ case "ORDER_ALREADY_CONFIRMED":
55
+ throw new Error("Cannot modify a confirmed order");
53
56
  }
54
57
  }
55
58
  ```
56
59
 
60
+ **Not this:**
61
+
62
+ ```ts
63
+ if (!result.ok) throw result.error;
64
+ ```
65
+
57
66
  Do not directly mutate module-owned tables via Kysely — always use module commands.
58
67
 
59
68
  ---
@@ -43,6 +43,8 @@ Run `pnpm generate` in the frontend directory to fetch the GraphQL schema from t
43
43
 
44
44
  ### Phase 3: Implement Frontend Pages
45
45
 
46
+ Run `pnpm lint`, `pnpm typecheck`, and `pnpm gql-tada:check` regularly during implementation. Fix errors before moving on.
47
+
46
48
  Create pages driven by screen spec docs. Each screen type has a standard implementation pattern.
47
49
 
48
50
  **Read [pages reference](references/pages.md) for the full pattern catalog.**
@@ -70,5 +72,8 @@ Key frontend patterns:
70
72
  cd <app-root>/frontend
71
73
  pnpm lint
72
74
  pnpm typecheck
75
+ pnpm gql-tada:check
73
76
  pnpm build
74
77
  ```
78
+
79
+ After verification passes, proceed to implementation review with `/erp-kit-app-7-impl-review`.
@@ -31,27 +31,7 @@ Key points:
31
31
 
32
32
  - Two-column `Layout`: detail on left, actions on right
33
33
  - `useParams()` to get entity ID from route
34
- - `DescriptionCard` from `@tailor-platform/app-shell` for key-value fields:
35
-
36
- ```tsx
37
- <DescriptionCard
38
- data={resource}
39
- title="Overview"
40
- columns={3}
41
- fields={[
42
- { key: "name", label: "Name", meta: { copyable: true } },
43
- {
44
- key: "status",
45
- label: "Status",
46
- type: "badge",
47
- meta: { badgeVariantMap: { ACTIVE: "success" } },
48
- },
49
- { key: "createdAt", label: "Created At", type: "date", meta: { dateFormat: "medium" } },
50
- ]}
51
- />
52
- ```
53
-
54
- Field types: `"text"` (default), `"badge"`, `"money"`, `"date"`, `"link"`, `"address"`, `"reference"`, `"divider"`
34
+ - `DescriptionCard` from `@tailor-platform/app-shell` for key-value fields. Refer to existing examples in the codebase for props and field type usage.
55
35
 
56
36
  ### Form Pattern
57
37
 
@@ -59,8 +39,11 @@ Create and edit forms share the same structure:
59
39
 
60
40
  - **React Hook Form + Zod** for validation with `zodResolver`
61
41
  - **urql `useMutation`** for GraphQL mutations
62
- - **Cache invalidation**: pass `additionalTypenames` to the mutation context so urql invalidates related queries (e.g., `createUser(values, { additionalTypenames: ["User"] })`)
63
- - **Toast notifications**: use `useToast` from `@tailor-platform/app-shell` (sonner-based, `Toaster` is built into AppShell) for success/error feedback
42
+ - **Cache invalidation**: pass `additionalTypenames` to the mutation context so urql invalidates related queries after create/edit/delete. Without this, list pages will show stale data.
43
+ ```ts
44
+ createUser(values, { additionalTypenames: ["User"] })
45
+ ```
46
+ - **Toast notifications**: `useToast` from `@/hooks/use-toast`. `toast.error()` accepts `CombinedError` directly (e.g., `toast.error(result.error)`)
64
47
  - **Navigate `".."`** to go back to list after success
65
48
  - Edit form pre-fills `defaultValues` from existing entity via fragment
66
49
 
@@ -81,6 +64,14 @@ Create and edit forms share the same structure:
81
64
  - **Required: Yes** → `.min(1, "Field is required")` (string) / `.positive()` (number)
82
65
  - **Required: No** → `.optional()`
83
66
 
67
+ #### Empty String Handling for Optional Fields
68
+
69
+ React Hook Form defaults text inputs to `""`. For optional fields (e.g., `parentId`), convert empty strings to `undefined` before submitting to avoid backend errors. Use `||` not `??` — empty string is not nullish:
70
+
71
+ ```ts
72
+ parentId: values.parentId || undefined,
73
+ ```
74
+
84
75
  ### Shared Component Patterns
85
76
 
86
77
  #### Fragment Collocation
@@ -117,13 +108,9 @@ const UserQuery = graphql(
117
108
 
118
109
  #### App.tsx
119
110
 
120
- - `AuthGuard`: implement yourself, pass via `guardComponent` prop. AuthProvider shows it automatically when `!isReady || !isAuthenticated`, so the guard only needs to render a sign-in UI — no state checks needed inside it
121
- - `GraphQLProvider`: pass `authClient.fetch` directly to urql's `fetch` option and `authClient.getAppUri()` for the URL
122
- - `useAuth()` returns `{ isAuthenticated, isReady, login, logout }` directly (not nested in `authState`)
123
- - Built-in `me` query returns the current user's `User` record — use it instead of writing a custom resolver for profile info
111
+ Refer to existing examples in the codebase for `AuthGuard`, `GraphQLProvider`, auth client setup, and sidebar configuration.
112
+
124
113
  - Required env vars: `VITE_TAILOR_APP_URL`, `VITE_TAILOR_CLIENT_ID`
125
- - Auth client: create once in `src/lib/auth-client.ts` using `createAuthClient({ appUri, clientId })`
126
- - Sidebar: use `SidebarGroup` + `SidebarItem` for custom ordering
127
114
 
128
115
  #### Module-level page.tsx (required)
129
116
 
@@ -141,20 +128,3 @@ Every page component must:
141
128
 
142
129
  1. Be the **default export** of `page.tsx`
143
130
  2. Set `appShellPageProps` with at least `meta.title`
144
-
145
- #### Common imports
146
-
147
- ```tsx
148
- import {
149
- Layout,
150
- Link,
151
- useParams,
152
- useNavigate,
153
- type AppShellPageProps,
154
- } from "@tailor-platform/app-shell";
155
- import { useQuery, useMutation } from "urql";
156
- import { graphql, type FragmentOf, readFragment } from "@/graphql";
157
- import { useForm } from "react-hook-form";
158
- import { zodResolver } from "@hookform/resolvers/zod";
159
- import { z } from "zod";
160
- ```
@@ -21,7 +21,7 @@ Define shared context for all agents:
21
21
  - `APP_NAME`: basename of APP_ROOT
22
22
  - `RESOLVER_DOCS`: glob `<APP_ROOT>/docs/resolver/*.md`
23
23
  - `SCREEN_DOCS`: glob `<APP_ROOT>/docs/screen/*.md`
24
- - `BACKEND_RESOLVERS`: glob `<APP_ROOT>/backend/src/modules/*/resolvers/*.ts`
24
+ - `BACKEND_RESOLVERS`: glob `<APP_ROOT>/backend/src/resolvers/*.ts`
25
25
  - `BACKEND_EXECUTORS`: glob `<APP_ROOT>/backend/executors/*.ts`
26
26
  - `BACKEND_MODULES`: `<APP_ROOT>/backend/src/modules.ts`
27
27
  - `BACKEND_CONFIG`: `<APP_ROOT>/backend/tailor.config.ts`
@@ -50,16 +50,17 @@ For agents 1-3:
50
50
  3. Replace doc/code path placeholders with the actual file paths
51
51
  4. Dispatch the agent with the filled prompt
52
52
 
53
- For agent 4 (build verification):
53
+ For agent 4 (build & sync verification):
54
54
 
55
- Run build checks inline:
55
+ Run build checks and source-doc sync check inline:
56
56
 
57
57
  ```bash
58
58
  cd <APP_ROOT>/backend && pnpm lint && pnpm typecheck
59
59
  cd <APP_ROOT>/frontend && pnpm lint && pnpm typecheck && pnpm build
60
+ erp-kit app sync-check -p <APP_ROOT>/..
60
61
  ```
61
62
 
62
- Report pass/fail for each check.
63
+ Report pass/fail for each check. `sync-check` detects missing resolver implementations and orphaned docs, so agents 1-3 can skip file-existence checks and focus on content parity.
63
64
 
64
65
  ## Step 3: Aggregate Results
65
66
 
@@ -109,13 +110,14 @@ Render the aggregated results as markdown:
109
110
 
110
111
  ---
111
112
 
112
- ### 4. Build Verification
113
+ ### 4. Build & Sync Verification
113
114
 
114
- | Check | Backend | Frontend |
115
- | ----- | ------- | -------- |
116
- | Lint | | |
117
- | Types | | |
118
- | Build | N/A | |
115
+ | Check | Backend | Frontend |
116
+ | ---------- | ------- | -------- |
117
+ | Lint | | |
118
+ | Types | | |
119
+ | Build | N/A | |
120
+ | Sync-check | | N/A |
119
121
 
120
122
  (Populated from agent 4 results)
121
123
 
@@ -158,7 +160,7 @@ Render the aggregated results as markdown:
158
160
  | Resolver Doc → Code Coverage | | X/Y checks passed |
159
161
  | Screen Doc → Code Coverage | | X/Y checks passed |
160
162
  | Module Wiring Consistency | | X/Y checks passed |
161
- | Build Verification | | pass / fail |
163
+ | Build & Sync Verification | | pass / fail |
162
164
 
163
165
  ### 8. Recommendations
164
166