@tailor-platform/erp-kit 0.7.0 → 0.8.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 (635) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +8 -4
  3. package/dist/cli.mjs +70 -70
  4. package/package.json +1 -1
  5. package/skills/erp-kit-app-5-impl-backend/SKILL.md +5 -5
  6. package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
  7. package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
  8. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +3 -1
  9. package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
  10. package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
  11. package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
  12. package/skills/erp-kit-app-7-impl-review/SKILL.md +3 -2
  13. package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
  14. package/skills/erp-kit-module-6-impl-review/SKILL.md +16 -19
  15. package/skills/erp-kit-module-shared/references/commands.md +68 -1
  16. package/src/commands/index.ts +8 -2
  17. package/src/commands/init.test.ts +24 -8
  18. package/src/commands/init.ts +5 -12
  19. package/src/commands/lib/distribute.test.ts +1 -20
  20. package/src/commands/lib/distribute.ts +0 -14
  21. package/src/commands/update.test.ts +1 -1
  22. package/src/generator/scaffold.ts +25 -4
  23. package/src/module.ts +4 -1
  24. package/src/modules/accounting/README.md +63 -0
  25. package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
  26. package/src/modules/accounting/command/activateBudget.test.ts +119 -0
  27. package/src/modules/accounting/command/activateBudget.ts +77 -0
  28. package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
  29. package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
  30. package/src/modules/accounting/command/activateCostElement.ts +41 -0
  31. package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
  32. package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
  33. package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
  34. package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
  35. package/src/modules/accounting/command/approveBudget.test.ts +69 -0
  36. package/src/modules/accounting/command/approveBudget.ts +47 -0
  37. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
  38. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
  39. package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
  40. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
  41. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
  42. package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
  43. package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
  44. package/src/modules/accounting/command/closeBudget.test.ts +93 -0
  45. package/src/modules/accounting/command/closeBudget.ts +40 -0
  46. package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
  47. package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
  48. package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
  49. package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
  50. package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
  51. package/src/modules/accounting/command/consumeCommitment.ts +62 -0
  52. package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
  53. package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
  54. package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
  55. package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
  56. package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
  57. package/src/modules/accounting/command/createAllocationRule.ts +103 -0
  58. package/src/modules/accounting/command/createBudget.generated.ts +6 -0
  59. package/src/modules/accounting/command/createBudget.test.ts +159 -0
  60. package/src/modules/accounting/command/createBudget.ts +100 -0
  61. package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
  62. package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
  63. package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
  64. package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
  65. package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
  66. package/src/modules/accounting/command/createCostCenter.ts +112 -0
  67. package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
  68. package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
  69. package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
  70. package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
  71. package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
  72. package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
  73. package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
  74. package/src/modules/accounting/command/createCostElement.test.ts +317 -0
  75. package/src/modules/accounting/command/createCostElement.ts +149 -0
  76. package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
  77. package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
  78. package/src/modules/accounting/command/createInternalOrder.ts +104 -0
  79. package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
  80. package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
  81. package/src/modules/accounting/command/createPlanVersion.ts +71 -0
  82. package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
  83. package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
  84. package/src/modules/accounting/command/createProfitCenter.ts +81 -0
  85. package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
  86. package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
  87. package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
  88. package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
  89. package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
  90. package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
  91. package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
  92. package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
  93. package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
  94. package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
  95. package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
  96. package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
  97. package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
  98. package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
  99. package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
  100. package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
  101. package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
  102. package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
  103. package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
  104. package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
  105. package/src/modules/accounting/command/deleteBudget.ts +35 -0
  106. package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
  107. package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
  108. package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
  109. package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
  110. package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
  111. package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
  112. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
  113. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
  114. package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
  115. package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
  116. package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
  117. package/src/modules/accounting/command/deleteCostElement.ts +33 -0
  118. package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
  119. package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
  120. package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
  121. package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
  122. package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
  123. package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
  124. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
  125. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
  126. package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
  127. package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
  128. package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
  129. package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
  130. package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
  131. package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
  132. package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
  133. package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
  134. package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
  135. package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
  136. package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
  137. package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
  138. package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
  139. package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
  140. package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
  141. package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
  142. package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
  143. package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
  144. package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
  145. package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
  146. package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
  147. package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
  148. package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
  149. package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
  150. package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
  151. package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
  152. package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
  153. package/src/modules/accounting/command/recordCommitment.ts +113 -0
  154. package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
  155. package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
  156. package/src/modules/accounting/command/rejectBudget.ts +51 -0
  157. package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
  158. package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
  159. package/src/modules/accounting/command/releaseCommitment.ts +51 -0
  160. package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
  161. package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
  162. package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
  163. package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
  164. package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
  165. package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
  166. package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
  167. package/src/modules/accounting/command/submitBudget.test.ts +60 -0
  168. package/src/modules/accounting/command/submitBudget.ts +51 -0
  169. package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
  170. package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
  171. package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
  172. package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
  173. package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
  174. package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
  175. package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
  176. package/src/modules/accounting/command/updateBudget.test.ts +112 -0
  177. package/src/modules/accounting/command/updateBudget.ts +44 -0
  178. package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
  179. package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
  180. package/src/modules/accounting/command/updateCostCenter.ts +79 -0
  181. package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
  182. package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
  183. package/src/modules/accounting/command/updateCostElement.ts +158 -0
  184. package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
  185. package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
  186. package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
  187. package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
  188. package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
  189. package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
  190. package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
  191. package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
  192. package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
  193. package/src/modules/accounting/db/allocationCycle.ts +59 -0
  194. package/src/modules/accounting/db/allocationResult.ts +58 -0
  195. package/src/modules/accounting/db/allocationRule.ts +48 -0
  196. package/src/modules/accounting/db/budget.ts +84 -0
  197. package/src/modules/accounting/db/budgetLineItem.ts +64 -0
  198. package/src/modules/accounting/db/commitment.ts +60 -0
  199. package/src/modules/accounting/db/costCenter.ts +73 -0
  200. package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
  201. package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
  202. package/src/modules/accounting/db/costElement.ts +56 -0
  203. package/src/modules/accounting/db/internalOrder.ts +69 -0
  204. package/src/modules/accounting/db/planVersion.ts +47 -0
  205. package/src/modules/accounting/db/profitCenter.ts +52 -0
  206. package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
  207. package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
  208. package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
  209. package/src/modules/accounting/db/varianceReport.ts +54 -0
  210. package/src/modules/accounting/db/varianceReportLine.ts +62 -0
  211. package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
  212. package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
  213. package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
  214. package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
  215. package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
  216. package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
  217. package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
  218. package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
  219. package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
  220. package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
  221. package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
  222. package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
  223. package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
  224. package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
  225. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
  226. package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
  227. package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
  228. package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
  229. package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
  230. package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
  231. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
  232. package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
  233. package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
  234. package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
  235. package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
  236. package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
  237. package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
  238. package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
  239. package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
  240. package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
  241. package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
  242. package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
  243. package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
  244. package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
  245. package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
  246. package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
  247. package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
  248. package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
  249. package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
  250. package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
  251. package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
  252. package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
  253. package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
  254. package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
  255. package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
  256. package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
  257. package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
  258. package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
  259. package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
  260. package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
  261. package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
  262. package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
  263. package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
  264. package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
  265. package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
  266. package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
  267. package/src/modules/accounting/docs/features/budget-management.md +147 -0
  268. package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
  269. package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
  270. package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
  271. package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
  272. package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
  273. package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
  274. package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
  275. package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
  276. package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
  277. package/src/modules/accounting/docs/models/Budget.md +77 -0
  278. package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
  279. package/src/modules/accounting/docs/models/Commitment.md +45 -0
  280. package/src/modules/accounting/docs/models/CostCenter.md +51 -0
  281. package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
  282. package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
  283. package/src/modules/accounting/docs/models/CostElement.md +66 -0
  284. package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
  285. package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
  286. package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
  287. package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
  288. package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
  289. package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
  290. package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
  291. package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
  292. package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
  293. package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
  294. package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
  295. package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
  296. package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
  297. package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
  298. package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
  299. package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
  300. package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
  301. package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
  302. package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
  303. package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
  304. package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
  305. package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
  306. package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
  307. package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
  308. package/src/modules/accounting/generated/enums.ts +110 -0
  309. package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
  310. package/src/modules/accounting/index.ts +2 -0
  311. package/src/modules/accounting/lib/_db_deps.ts +70 -0
  312. package/src/modules/accounting/lib/actualAmounts.ts +93 -0
  313. package/src/modules/accounting/lib/allocationPosting.ts +152 -0
  314. package/src/modules/accounting/lib/errors.generated.ts +432 -0
  315. package/src/modules/accounting/lib/permissions.generated.ts +61 -0
  316. package/src/modules/accounting/lib/types.ts +114 -0
  317. package/src/modules/accounting/module.ts +428 -0
  318. package/src/modules/accounting/permissions.ts +3 -0
  319. package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
  320. package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
  321. package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
  322. package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
  323. package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
  324. package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
  325. package/src/modules/accounting/query/getBudget.generated.ts +5 -0
  326. package/src/modules/accounting/query/getBudget.test.ts +80 -0
  327. package/src/modules/accounting/query/getBudget.ts +31 -0
  328. package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
  329. package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
  330. package/src/modules/accounting/query/getCostCenter.ts +33 -0
  331. package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
  332. package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
  333. package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
  334. package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
  335. package/src/modules/accounting/query/getCostElement.test.ts +57 -0
  336. package/src/modules/accounting/query/getCostElement.ts +21 -0
  337. package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
  338. package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
  339. package/src/modules/accounting/query/getInternalOrder.ts +21 -0
  340. package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
  341. package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
  342. package/src/modules/accounting/query/getProfitCenter.ts +31 -0
  343. package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
  344. package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
  345. package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
  346. package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
  347. package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
  348. package/src/modules/accounting/query/getVarianceReport.ts +31 -0
  349. package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
  350. package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
  351. package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
  352. package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
  353. package/src/modules/accounting/query/listBudgets.test.ts +150 -0
  354. package/src/modules/accounting/query/listBudgets.ts +85 -0
  355. package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
  356. package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
  357. package/src/modules/accounting/query/listCostCenters.ts +71 -0
  358. package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
  359. package/src/modules/accounting/query/listCostElements.test.ts +138 -0
  360. package/src/modules/accounting/query/listCostElements.ts +105 -0
  361. package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
  362. package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
  363. package/src/modules/accounting/query/listInternalOrders.ts +94 -0
  364. package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
  365. package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
  366. package/src/modules/accounting/query/listProfitCenters.ts +56 -0
  367. package/src/modules/accounting/seed/index.ts +19 -0
  368. package/src/modules/accounting/tailor.config.ts +13 -0
  369. package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
  370. package/src/modules/accounting/testing/fixtures.ts +502 -0
  371. package/src/modules/audit/command/logAuditEvent.ts +43 -38
  372. package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
  373. package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
  374. package/src/modules/audit/module.ts +4 -0
  375. package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
  376. package/src/modules/business-partner/command/updatePartner.ts +13 -6
  377. package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
  378. package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
  379. package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
  380. package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
  381. package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
  382. package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
  383. package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
  384. package/src/modules/coa-management/command/updateAccount.ts +3 -3
  385. package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -0
  386. package/src/modules/coa-management/command/updateAccountGroup.ts +30 -18
  387. package/src/modules/coa-management/command/updateChartOfAccounts.ts +3 -4
  388. package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +4 -3
  389. package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
  390. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
  391. package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
  392. package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
  393. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
  394. package/src/modules/inventory/command/updateLot.test.ts +1 -1
  395. package/src/modules/inventory/command/updateLot.ts +2 -3
  396. package/src/modules/inventory/command/updateStockMovement.ts +2 -3
  397. package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
  398. package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
  399. package/src/modules/inventory/command/updateWarehouse.ts +2 -3
  400. package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
  401. package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
  402. package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
  403. package/src/modules/item-management/command/updateItem.test.ts +16 -12
  404. package/src/modules/item-management/command/updateItem.ts +47 -31
  405. package/src/modules/item-management/command/updateTaxonomyNode.test.ts +15 -16
  406. package/src/modules/item-management/command/updateTaxonomyNode.ts +42 -29
  407. package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
  408. package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
  409. package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
  410. package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
  411. package/src/modules/manufacturing/command/updateRouting.ts +3 -4
  412. package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
  413. package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
  414. package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
  415. package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
  416. package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
  417. package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
  418. package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
  419. package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
  420. package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
  421. package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
  422. package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
  423. package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
  424. package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
  425. package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
  426. package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
  427. package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
  428. package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
  429. package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
  430. package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
  431. package/src/modules/organization/command/updateCompany.test.ts +6 -6
  432. package/src/modules/organization/command/updateCompany.ts +3 -4
  433. package/src/modules/organization/command/updateDepartment.test.ts +7 -7
  434. package/src/modules/organization/command/updateDepartment.ts +13 -12
  435. package/src/modules/organization/command/updateSite.test.ts +10 -10
  436. package/src/modules/organization/command/updateSite.ts +3 -4
  437. package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
  438. package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
  439. package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
  440. package/src/modules/product-management/command/updateProduct.test.ts +17 -11
  441. package/src/modules/product-management/command/updateProduct.ts +45 -28
  442. package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
  443. package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
  444. package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
  445. package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
  446. package/src/modules/product-management/command/updateProductCategory.ts +42 -26
  447. package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
  448. package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
  449. package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
  450. package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
  451. package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
  452. package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
  453. package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +2 -3
  454. package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
  455. package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
  456. package/src/modules/sales/command/updateChannel.test.ts +4 -4
  457. package/src/modules/sales/command/updateChannel.ts +2 -3
  458. package/src/modules/sales/command/updateListing.test.ts +2 -2
  459. package/src/modules/sales/command/updateListing.ts +2 -3
  460. package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
  461. package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
  462. package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
  463. package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
  464. package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
  465. package/src/modules/sales/command/updateSalesOrder.ts +2 -3
  466. package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
  467. package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
  468. package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
  469. package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
  470. package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
  471. package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
  472. package/src/modules/sales/command/updateShipment.test.ts +2 -2
  473. package/src/modules/sales/command/updateShipment.ts +2 -3
  474. package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
  475. package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
  476. package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
  477. package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
  478. package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
  479. package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
  480. package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
  481. package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
  482. package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
  483. package/src/modules/user-management/README.md +2 -1
  484. package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
  485. package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
  486. package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
  487. package/src/modules/user-management/command/updateUser.generated.ts +6 -0
  488. package/src/modules/user-management/command/updateUser.test.ts +195 -0
  489. package/src/modules/user-management/command/updateUser.ts +76 -0
  490. package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
  491. package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
  492. package/src/modules/user-management/docs/features/user-account-management.md +28 -3
  493. package/src/modules/user-management/docs/models/User.md +2 -0
  494. package/src/modules/user-management/lib/errors.generated.ts +5 -0
  495. package/src/modules/user-management/lib/permissions.generated.ts +2 -0
  496. package/src/modules/user-management/module.ts +5 -0
  497. package/src/modules/user-management/seed/index.ts +19 -0
  498. package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
  499. package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
  500. package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
  501. package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
  502. package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
  503. package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
  504. package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
  505. package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
  506. package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
  507. package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
  508. package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
  509. package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
  510. package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
  511. package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
  512. package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
  513. package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
  514. package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
  515. package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
  516. package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
  517. package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
  518. package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
  519. package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
  520. package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
  521. package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
  522. package/templates/scaffold/app/backend/src/modules.ts +3 -5
  523. package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
  524. package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
  525. package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
  526. package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
  527. package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
  528. package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
  529. package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
  530. package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
  531. package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
  532. package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
  533. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
  534. package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
  535. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
  536. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
  537. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
  538. package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
  539. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
  540. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
  541. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
  542. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
  543. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +158 -0
  544. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
  545. package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
  546. package/templates/scaffold/app/backend/tailor.config.ts +6 -2
  547. package/templates/scaffold/app/docs/actors/user.md +11 -0
  548. package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
  549. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
  550. package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
  551. package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
  552. package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
  553. package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
  554. package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
  555. package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
  556. package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
  557. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
  558. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
  559. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
  560. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
  561. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
  562. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
  563. package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
  564. package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
  565. package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
  566. package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
  567. package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
  568. package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
  569. package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
  570. package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
  571. package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
  572. package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
  573. package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
  574. package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
  575. package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
  576. package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
  577. package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
  578. package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
  579. package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
  580. package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
  581. package/templates/scaffold/app/docs/screen/role-list.md +23 -0
  582. package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
  583. package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
  584. package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
  585. package/templates/scaffold/app/docs/screen/user-list.md +24 -0
  586. package/templates/scaffold/app/frontend/package.json +1 -1
  587. package/templates/scaffold/app/frontend/src/App.tsx +4 -0
  588. package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
  589. package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
  590. package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
  591. package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
  592. package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
  593. package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/components/audit-entry-detail.tsx +102 -0
  594. package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/page.tsx +65 -0
  595. package/templates/scaffold/app/frontend/src/pages/user-management/audit/components/audit-entries-table.tsx +90 -0
  596. package/templates/scaffold/app/frontend/src/pages/user-management/audit/page.tsx +52 -0
  597. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
  598. package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
  599. package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
  600. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
  601. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
  602. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
  603. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
  604. package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
  605. package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
  606. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
  607. package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
  608. package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
  609. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
  610. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
  611. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
  612. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
  613. package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
  614. package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
  615. package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
  616. package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
  617. package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
  618. package/templates/scaffold/module/eslint.config.js +8 -0
  619. package/templates/scaffold/project/__dot__gitignore +1 -0
  620. package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
  621. package/templates/scaffold/project/apps/.gitkeep +0 -0
  622. package/templates/scaffold/project/modules/.gitkeep +0 -0
  623. package/templates/scaffold/project/package.json +15 -0
  624. package/templates/workflows/erp-kit-check.yml +10 -4
  625. package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
  626. package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
  627. package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
  628. package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
  629. package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
  630. /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
  631. /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
  632. /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
  633. /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
  634. /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
  635. /package/templates/{config → scaffold/project}/license.config.json +0 -0
@@ -0,0 +1,255 @@
1
+ # DetailView Pattern
2
+
3
+ ## File Structure
4
+
5
+ ```bash
6
+ [id]/
7
+ page.tsx # route entry — fetches data, composes fragments
8
+ components/
9
+ <entity>-detail.tsx # DescriptionCard with field definitions
10
+ <entity>-actions.tsx # ActionPanel with mutation actions
11
+ ```
12
+
13
+ ## page.tsx
14
+
15
+ ```tsx
16
+ import {
17
+ Layout,
18
+ useParams,
19
+ type AppShellPageProps,
20
+ } from "@tailor-platform/app-shell";
21
+ import { useQuery } from "urql";
22
+ import { UserDetail, UserDetailFragment } from "./components/user-detail";
23
+ import { UserActions, UserActionsFragment } from "./components/user-actions";
24
+ import { graphql } from "@/graphql";
25
+ import { ErrorFallback } from "@/components/composed/error-fallback";
26
+ import { Loading } from "@/components/composed/loading";
27
+
28
+ const UserQuery = graphql(
29
+ `
30
+ query User($id: ID!) {
31
+ user(id: $id) {
32
+ ...UserDetail
33
+ ...UserActions
34
+ }
35
+ }
36
+ `,
37
+ [UserDetailFragment, UserActionsFragment],
38
+ );
39
+
40
+ const UserPage = () => {
41
+ const { id } = useParams();
42
+ const [{ data, error, fetching }, reexecuteQuery] = useQuery({
43
+ query: UserQuery,
44
+ variables: { id: id! },
45
+ });
46
+
47
+ if (fetching) return <Loading />;
48
+ if (error || !data?.user)
49
+ return (
50
+ <ErrorFallback
51
+ title="Failed to load user"
52
+ message="An error occurred while fetching the user details."
53
+ onReset={() => reexecuteQuery({ requestPolicy: "network-only" })}
54
+ />
55
+ );
56
+
57
+ return (
58
+ <Layout>
59
+ <Layout.Header title="User Detail" />
60
+ <Layout.Column>
61
+ <UserDetail user={data.user} />
62
+ </Layout.Column>
63
+ <Layout.Column>
64
+ <UserActions user={data.user} />
65
+ </Layout.Column>
66
+ </Layout>
67
+ );
68
+ };
69
+
70
+ UserPage.appShellPageProps = {
71
+ meta: { title: "User Detail" },
72
+ } satisfies AppShellPageProps;
73
+ export default UserPage;
74
+ ```
75
+
76
+ ## `<entity>-detail.tsx` — DescriptionCard
77
+
78
+ ```tsx
79
+ import { DescriptionCard } from "@tailor-platform/app-shell";
80
+ import { graphql, type FragmentOf, readFragment } from "@/graphql";
81
+
82
+ export const UserDetailFragment = graphql(`
83
+ fragment UserDetail on User {
84
+ id
85
+ name
86
+ email
87
+ status
88
+ createdAt
89
+ updatedAt
90
+ }
91
+ `);
92
+
93
+ export const UserDetail = ({
94
+ user: userFragment,
95
+ }: {
96
+ user: FragmentOf<typeof UserDetailFragment>;
97
+ }) => {
98
+ const user = readFragment(UserDetailFragment, userFragment);
99
+ return (
100
+ <DescriptionCard
101
+ data={user}
102
+ title="User Information"
103
+ columns={3}
104
+ fields={[
105
+ { key: "name", label: "Name" },
106
+ { key: "email", label: "Email", meta: { copyable: true } },
107
+ {
108
+ key: "status",
109
+ label: "Status",
110
+ type: "badge",
111
+ meta: {
112
+ badgeVariantMap: {
113
+ ACTIVE: "success",
114
+ PENDING: "warning",
115
+ INACTIVE: "neutral",
116
+ },
117
+ },
118
+ },
119
+ { type: "divider" },
120
+ {
121
+ key: "createdAt",
122
+ label: "Created At",
123
+ type: "date",
124
+ meta: { dateFormat: "medium" },
125
+ },
126
+ {
127
+ key: "updatedAt",
128
+ label: "Updated At",
129
+ type: "date",
130
+ meta: { dateFormat: "relative" },
131
+ },
132
+ ]}
133
+ />
134
+ );
135
+ };
136
+ ```
137
+
138
+ ### DescriptionCard Field Types
139
+
140
+ | `type` | Description | `meta` options |
141
+ | ----------- | --------------------------------- | ---------------------------------------------------------------------------- |
142
+ | (omitted) | Plain text | `copyable: true` |
143
+ | `"badge"` | Status badge with variant mapping | `badgeVariantMap: { VALUE: "success" \| "warning" \| "neutral" \| "error" }` |
144
+ | `"date"` | Formatted date/time | `dateFormat: "short" \| "medium" \| "long" \| "relative"` |
145
+ | `"divider"` | Horizontal rule | — |
146
+
147
+ ### Multiple DescriptionCards
148
+
149
+ When an entity has a logically distinct secondary collection (e.g. taxonomy assignments, related items), render it as a second `DescriptionCard` stacked below the primary one.
150
+
151
+ ## `<entity>-actions.tsx` — ActionPanel
152
+
153
+ ```tsx
154
+ import { ActionPanel, useNavigate } from "@tailor-platform/app-shell";
155
+ import { useMutation } from "urql";
156
+ import { Pencil, UserX, UserCheck } from "lucide-react";
157
+ import { graphql, type FragmentOf, readFragment } from "@/graphql";
158
+ import { useToast } from "@/hooks/use-toast";
159
+
160
+ const DeactivateUserMutation = graphql(`
161
+ mutation DeactivateUser($userId: String!) {
162
+ deactivateUser(userId: $userId) {
163
+ id
164
+ status
165
+ }
166
+ }
167
+ `);
168
+
169
+ export const UserActionsFragment = graphql(`
170
+ fragment UserActions on User {
171
+ id
172
+ status
173
+ }
174
+ `);
175
+
176
+ export const UserActions = ({
177
+ user: userFragment,
178
+ }: {
179
+ user: FragmentOf<typeof UserActionsFragment>;
180
+ }) => {
181
+ const user = readFragment(UserActionsFragment, userFragment);
182
+ const navigate = useNavigate();
183
+ const toast = useToast();
184
+ const [{ fetching: deactivating }, deactivateUser] = useMutation(
185
+ DeactivateUserMutation,
186
+ );
187
+
188
+ return (
189
+ <ActionPanel
190
+ title="Actions"
191
+ actions={[
192
+ {
193
+ key: "edit",
194
+ label: "Edit User",
195
+ icon: <Pencil />,
196
+ onClick: () => navigate("edit"),
197
+ },
198
+ ...(user.status === "ACTIVE"
199
+ ? [
200
+ {
201
+ key: "deactivate",
202
+ label: "Deactivate User",
203
+ icon: <UserX />,
204
+ loading: deactivating,
205
+ onClick: () =>
206
+ deactivateUser({ userId: user.id }).then((result) => {
207
+ if (result.error) {
208
+ toast.error(result.error);
209
+ return;
210
+ }
211
+ toast.success("User deactivated successfully");
212
+ }),
213
+ },
214
+ ]
215
+ : []),
216
+ ]}
217
+ />
218
+ );
219
+ };
220
+ ```
221
+
222
+ ### Error Handling in Actions
223
+
224
+ Always handle mutation results with `useToast`:
225
+
226
+ ```tsx
227
+ import { useToast } from "@/hooks/use-toast";
228
+
229
+ const toast = useToast();
230
+
231
+ // In onClick:
232
+ onClick: () =>
233
+ someMutation({ ... }).then((result) => {
234
+ if (result.error) {
235
+ toast.error(result.error); // accepts CombinedError directly
236
+ return;
237
+ }
238
+ toast.success("Action completed successfully");
239
+ }),
240
+ ```
241
+
242
+ - `toast.error(result.error)` accepts `CombinedError` from urql directly — no manual message extraction needed
243
+ - `toast.success(message)` for successful operations
244
+ - Import from `@/hooks/use-toast`, not from `@tailor-platform/app-shell` directly (ESLint enforced)
245
+
246
+ ### ActionItem Fields
247
+
248
+ | Field | Type | Description |
249
+ | ---------- | ----------------------------- | -------------------------------------- |
250
+ | `key` | `string` | React key |
251
+ | `label` | `string` | Visible row label |
252
+ | `icon` | `ReactNode` | Icon from `lucide-react` |
253
+ | `onClick` | `() => void \| Promise<void>` | Use `useNavigate()` for routing |
254
+ | `disabled` | `boolean?` | Disable the row |
255
+ | `loading` | `boolean?` | Show spinner, make row non-interactive |
@@ -27,11 +27,7 @@ Key points:
27
27
 
28
28
  ### DetailView
29
29
 
30
- Key points:
31
-
32
- - Two-column `Layout`: detail on left, actions on right
33
- - `useParams()` to get entity ID from route
34
- - `DescriptionCard` from `@tailor-platform/app-shell` for key-value fields. Refer to existing examples in the codebase for props and field type usage.
30
+ See **[detail-view.md](detail-view.md)** for the full pattern including `DescriptionCard` field types and `ActionPanel` usage.
35
31
 
36
32
  ### Form Pattern
37
33
 
@@ -36,6 +36,7 @@ Define shared context for all agents:
36
36
  - `BACKEND_RESOLVERS`: glob `<APP_ROOT>/backend/src/resolvers/*.ts`
37
37
  - `BACKEND_EXECUTORS`: glob `<APP_ROOT>/backend/executors/*.ts`
38
38
  - `BACKEND_MODULES`: `<APP_ROOT>/backend/src/modules.ts`
39
+ - `BACKEND_MODULES_DB`: `<APP_ROOT>/backend/src/modules-db.ts`
39
40
  - `BACKEND_CONFIG`: `<APP_ROOT>/backend/tailor.config.ts`
40
41
  - `FRONTEND_PAGES`: glob `<APP_ROOT>/frontend/src/app/(main)/**/*.tsx`
41
42
 
@@ -53,7 +54,7 @@ All review agents are read-only — no shared-file conflict risk.
53
54
  | ----- | -------------------------------------------------------------------------------- | ------------------ | ------------------------------------------------------------ |
54
55
  | A | [references/resolver-doc-code-parity.md](references/resolver-doc-code-parity.md) | One per resolver | Single RESOLVER_DOC + matching BACKEND_RESOLVER + BACKEND_EXECUTOR |
55
56
  | B | [references/screen-doc-code-parity.md](references/screen-doc-code-parity.md) | One per screen | Single SCREEN_DOC + matching FRONTEND_PAGE directory |
56
- | C | [references/module-wiring-parity.md](references/module-wiring-parity.md) | One per resolver | Single RESOLVER_DOC + BACKEND_MODULES + BACKEND_CONFIG |
57
+ | C | [references/module-wiring-parity.md](references/module-wiring-parity.md) | One per resolver | Single RESOLVER_DOC + BACKEND_MODULES + BACKEND_MODULES_DB + BACKEND_CONFIG |
57
58
  | D | Build verification (inline) | One global agent | All source paths |
58
59
 
59
60
  With R resolvers and S screens, this produces R + S + R + 1 parallel agents.
@@ -119,7 +120,7 @@ Render the aggregated results as markdown:
119
120
 
120
121
  ### 3. Module Wiring Consistency
121
122
 
122
- | Resolver | Required Module | Wired in modules.ts | Config Reference | Gap |
123
+ | Resolver | Required Module | Wired in modules.ts / modules-db.ts | Config Reference | Gap |
123
124
  | -------- | --------------- | ------------------- | ---------------- | --- |
124
125
 
125
126
  (Populated from agent 3 gaps)
@@ -5,12 +5,13 @@
5
5
  App: {{APP_NAME}}
6
6
  Resolver docs: {{RESOLVER_DOCS}}
7
7
  Backend modules file: {{BACKEND_MODULES}}
8
+ Backend modules-db file: {{BACKEND_MODULES_DB}}
8
9
  Backend config file: {{BACKEND_CONFIG}}
9
10
 
10
11
  ## Instructions
11
12
 
12
13
  1. Read ALL resolver docs at the paths above
13
- 2. Read the modules file (`src/modules.ts`)
14
+ 2. Read the modules file (`src/modules.ts`) and the modules-db file (`src/modules-db.ts`)
14
15
  3. Read the config file (`tailor.config.ts`)
15
16
  4. Verify all required modules are wired and configured
16
17
  5. Return results as JSON per the Output Format section
@@ -22,13 +23,18 @@ From each resolver doc, extract:
22
23
  - Module it depends on (which `defineXxxModule` it needs)
23
24
  - Commands it calls (which module command functions)
24
25
 
25
- ## Extraction: modules.ts
26
+ ## Extraction: modules.ts and modules-db.ts
26
27
 
27
- From the modules file, extract:
28
+ From `modules.ts`, extract:
28
29
 
29
30
  - All `defineXxxModule()` calls
30
31
  - Inter-module dependency wiring (e.g., primitives passed to item-management)
31
- - Exported `db`, `commands`, and `executors`
32
+ - Exported module objects (`umModules`, `imModules`, etc.)
33
+
34
+ From `modules-db.ts`, extract:
35
+
36
+ - Individual DB table exports (destructured from module objects)
37
+ - This file must NOT be imported by resolvers
32
38
 
33
39
  ## Extraction: tailor.config.ts
34
40
 
@@ -43,7 +49,7 @@ From the config file, extract:
43
49
 
44
50
  | Check ID | Question |
45
51
  | -------------------- | ---------------------------------------------------------------- |
46
- | module_wired | Is every module referenced by resolvers wired in modules.ts? |
52
+ | module_wired | Is every module referenced by resolvers wired in modules.ts and exported in modules-db.ts? |
47
53
  | dependency_order | Are inter-module dependencies passed correctly? |
48
54
  | exports_complete | Are db, commands, and executors all exported? |
49
55
  | config_resolver_glob | Does the resolver glob in config cover all resolver directories? |
@@ -54,14 +60,14 @@ From the config file, extract:
54
60
  ### How to Check
55
61
 
56
62
  1. Build a set of required modules from resolver docs
57
- 2. Check each required module appears as a `defineXxxModule()` call in modules.ts
63
+ 2. Check each required module appears as a `defineXxxModule()` call in modules.ts and its DB types are exported in modules-db.ts
58
64
  3. Verify dependency wiring (e.g., if item-management resolvers exist, primitives must be wired into it)
59
- 4. Check tailor.config.ts resolver glob pattern covers all module resolver directories
65
+ 4. Check tailor.config.ts db.files references modules-db.ts and resolver glob pattern covers all resolver directories
60
66
  5. Verify auth is configured if any resolver requires authentication
61
67
 
62
68
  ## Common Gap Patterns
63
69
 
64
- - **Missing module**: Resolver references a module not wired in modules.ts
70
+ - **Missing module**: Resolver references a module not wired in modules.ts or not exported in modules-db.ts
65
71
  - **Missing dependency**: Module wired but not given required dependencies
66
72
  - **Glob mismatch**: Config resolver glob doesn't cover a module's resolvers directory
67
73
  - **Missing auth**: Resolvers exist but no auth configured
@@ -33,42 +33,39 @@ Verify at least `MODEL_DOCS`, `COMMAND_DOCS`, or `QUERY_DOCS` is non-empty. If n
33
33
 
34
34
  ## Step 2: Dispatch Agents (parallelize ALL agents in a single message)
35
35
 
36
- Split each parity check into its own agent, then further split by file batches when there are many files. Target **~5 agents per domain** (model, command, query) for maximum parallelism. Launch **ALL agents in a single message** — do NOT wait for one domain to finish before starting another.
36
+ Split checks into agents by **domain + file batch**, not by check type. Command checks (C-1, C-2, C-3) run together in one agent per batch; query checks (Q-1, Q-2, Q-3) run together in one agent per batch. Launch **ALL agents in a single message** — do NOT wait for one domain to finish before starting another.
37
37
 
38
- If a doc or code directory is empty, skip that agent entirely.
38
+ If a doc or code directory is empty, skip that domain entirely.
39
39
 
40
40
  ### Splitting Strategy
41
41
 
42
- 1. **Each parity check type = separate agent** (never combine different check types in one agent)
43
- 2. **File batching**: If a check has more than 5 doc files, split docs into batches of 3-5 files each. Each batch becomes its own agent running the same check type on a subset of files.
42
+ 1. **Domain grouping**: C-1 + C-2 + C-3 in the same agent. Q-1 + Q-2 + Q-3 in the same agent. M-1 is its own agent.
43
+ 2. **File batching**: If a domain has more than 5 doc files, split docs into batches of 3-5 files each. Each batch becomes its own agent.
44
44
  3. **Corresponding code/test files**: When batching by doc files, include only the matching code and test files for those specific docs (match by filename stem, e.g., `docs/commands/createFoo.md` → `command/createFoo.ts` + `command/createFoo.test.ts`).
45
45
 
46
46
  ### Agent Table
47
47
 
48
- | Check Type | Domain | Prompt Template | Inputs per agent |
49
- | ---------- | ------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
50
- | M-1 | Model | [references/model-doc-code-parity.md](references/model-doc-code-parity.md) | MODEL_DOCS (batch), MODEL_CODE (matching) |
51
- | C-1 | Command | [references/command-doc-code-parity.md](references/command-doc-code-parity.md) | COMMAND_DOCS (batch), COMMAND_CODE (matching) |
52
- | C-2 | Command | [references/command-error-implementation-parity.md](references/command-error-implementation-parity.md) | COMMAND_DOCS (batch), COMMAND_CODE (matching), ERROR_DEFS |
53
- | C-3 | Command | [references/command-doc-test-parity.md](references/command-doc-test-parity.md) | COMMAND_DOCS (batch), COMMAND_TEST_CODE (matching) |
54
- | Q-1 | Query | [references/query-doc-code-parity.md](references/query-doc-code-parity.md) | QUERY_DOCS (batch), QUERY_CODE (matching) |
55
- | Q-2 | Query | [references/query-error-implementation-parity.md](references/query-error-implementation-parity.md) | QUERY_DOCS (batch), QUERY_CODE (matching), ERROR_DEFS |
56
- | Q-3 | Query | [references/query-doc-test-parity.md](references/query-doc-test-parity.md) | QUERY_DOCS (batch), QUERY_TEST_CODE (matching) |
48
+ | Agent Type | Domain | Prompt Templates (all included in one agent) | Inputs per agent |
49
+ | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
50
+ | M-1 | Model | [references/model-doc-code-parity.md](references/model-doc-code-parity.md) | MODEL_DOCS (batch), MODEL_CODE (matching) |
51
+ | C-1 + C-2 + C-3 | Command | [references/command-doc-code-parity.md](references/command-doc-code-parity.md) + [references/command-error-implementation-parity.md](references/command-error-implementation-parity.md) + [references/command-doc-test-parity.md](references/command-doc-test-parity.md) | COMMAND_DOCS (batch), COMMAND_CODE (matching), COMMAND_TEST_CODE (matching), ERROR_DEFS |
52
+ | Q-1 + Q-2 + Q-3 | Query | [references/query-doc-code-parity.md](references/query-doc-code-parity.md) + [references/query-error-implementation-parity.md](references/query-error-implementation-parity.md) + [references/query-doc-test-parity.md](references/query-doc-test-parity.md) | QUERY_DOCS (batch), QUERY_CODE (matching), QUERY_TEST_CODE (matching), ERROR_DEFS |
57
53
 
58
54
  ### Batching Example
59
55
 
60
- If a module has 8 command docs: split into 3 batches (3+3+2). Each batch spawns 3 agents (C-1, C-2, C-3) → 9 command agents total. If it has 4 command docs: no batching needed, 3 agents (C-1, C-2, C-3).
56
+ If a module has 8 command docs: split into 3 batches (3+3+2). Each batch spawns 1 agent (C-1+C-2+C-3) → 3 command agents total. If it has 4 command docs: no batching needed, 1 agent.
61
57
 
62
58
  For model docs: if 6 models → 2 batches (3+3) → 2 agents (M-1 × 2). If 3 models → 1 agent.
63
59
 
64
60
  ### Agent Dispatch
65
61
 
66
- For each agent:
62
+ For combined agents (command or query), concatenate all prompt templates in order, then fill placeholders. For each agent:
67
63
 
68
- 1. Read the prompt template file for that check type
69
- 2. Replace `{{MODULE_NAME}}` with the resolved module name
70
- 3. Replace template placeholders (`{{MODEL_DOCS}}`, `{{COMMAND_DOCS}}`, `{{QUERY_DOCS}}`, `{{MODEL_CODE}}`, `{{COMMAND_CODE}}`, `{{QUERY_CODE}}`, `{{COMMAND_TEST_CODE}}`, `{{QUERY_TEST_CODE}}`, `{{ERROR_DEFS}}`) with the actual file paths **for this batch only**
71
- 4. Dispatch the agent with the filled prompt
64
+ 1. Read all prompt template files for that agent type
65
+ 2. Concatenate them in order with a `---` separator between each
66
+ 3. Replace `{{MODULE_NAME}}` with the resolved module name
67
+ 4. Replace template placeholders (`{{MODEL_DOCS}}`, `{{COMMAND_DOCS}}`, `{{QUERY_DOCS}}`, `{{MODEL_CODE}}`, `{{COMMAND_CODE}}`, `{{QUERY_CODE}}`, `{{COMMAND_TEST_CODE}}`, `{{QUERY_TEST_CODE}}`, `{{ERROR_DEFS}}`) with the actual file paths **for this batch only**
68
+ 5. Dispatch the agent with the filled prompt; instruct it to return a **single JSON result** with combined `gaps[]` and `inconsistencies[]` covering all check types
72
69
 
73
70
  **IMPORTANT**: Launch ALL agents across ALL domains in a single parallel message. Do not serialize by domain.
74
71
 
@@ -180,9 +180,76 @@ const units = await db
180
180
  - **Error handling**: Use `ok()` / `err()` from `@tailor-platform/erp-kit/module` — do not throw
181
181
  - **Validation**: Check referenced entities exist before operating, return `err()` if not found
182
182
 
183
+ ## Update Command Input Type
184
+
185
+ Update commands use a structured type that separates lookup keys from mutable fields, and explicitly excludes status-controlled fields.
186
+
187
+ ### Input type shape
188
+
189
+ ```typescript
190
+ export type UpdateXInput = ({
191
+ id: string;
192
+ } | {
193
+ naturalKey: string; // e.g. sku, code
194
+ }) & {
195
+ mutableField1?: string;
196
+ mutableField2?: string | null;
197
+ }
198
+ ```
199
+
200
+ ### Run signature with custom fields
201
+
202
+ ```typescript
203
+ export async function run<CF extends Record<string, unknown>>(
204
+ db: Transaction,
205
+ input: UpdateXInput & Omit<Partial<CF>, "status">,
206
+ ctx: CommandContext,
207
+ )
208
+ ```
209
+
210
+ ### Rules
211
+
212
+ | Field kind | Examples | How to handle |
213
+ |---|---|---|
214
+ | Lookup key (primary) | `id` | One branch of the union |
215
+ | Lookup key (natural) | `sku`, `code` | Another branch of the union — used to look up the record, not to update it |
216
+ | Mutable fields | `name`, `barcode` | Listed in the `&` intersection as optional fields |
217
+ | Status-controlled | `status` | **Never in the input type.** Managed by dedicated commands (`activateX`, `deactivateX`). Excluded from `CF` via `Omit`. |
218
+ | System fields | `createdAt`, `updatedAt` | Never in the input type. Set automatically. |
219
+
220
+ ### Lookup implementation
221
+
222
+ Use `"id" in input` to branch between lookup strategies:
223
+
224
+ ```typescript
225
+ let query = db.selectFrom("Item").selectAll();
226
+ if ("id" in input) {
227
+ query = query.where("id", "=", input.id);
228
+ } else {
229
+ query = query.where("sku", "=", (input as { sku: string }).sku);
230
+ }
231
+ const item = await query.forUpdate().executeTakeFirst();
232
+ ```
233
+
234
+ ### Custom field extraction
235
+
236
+ Destructure known fields and treat the rest as custom fields:
237
+
238
+ ```typescript
239
+ const { name, barcode, unitId, ...rest } = input as any;
240
+ const { id: _id, sku: _sku, ...customFields } = rest;
241
+ ```
242
+
243
+ ### Why not throw immutable errors
244
+
245
+ Natural keys like `sku` or `code` are **lookup keys**, not updatable fields. They do not belong in the mutable section of the input type — the type system prevents callers from passing them as update targets. There is no need for a `SkuImmutableError` or `CodeImmutableError` in an update command.
246
+
247
+ > Exception: conditionally-mutable fields (e.g., `baseCurrencyId` that can only change in DRAFT status) belong in the mutable section and use a business-rule error when the condition is not met.
248
+
183
249
  ## Conventions
184
250
 
185
- - Input types: exported interfaces (`export interface MyFunctionInput`)
251
+ - Input types for create commands: exported interfaces (`export interface CreateXInput`)
252
+ - Input types for update commands: exported type aliases (`export type UpdateXInput = ...`)
186
253
  - Use `.executeTakeFirst()` for single results
187
254
  - Include JSDoc: `/** Function: name \n Description */`
188
255
 
@@ -19,9 +19,15 @@ const cwd = process.cwd();
19
19
  export const initCommand = defineCommand({
20
20
  name: "init",
21
21
  description: "First-time setup for a consumer repo",
22
- run: () => {
22
+ args: z.object({
23
+ name: arg(z.string(), {
24
+ positional: true,
25
+ description: "Project name",
26
+ }),
27
+ }),
28
+ run: (args) => {
23
29
  return executeCommand(() => {
24
- const exitCode = runInit(cwd);
30
+ const exitCode = runInit(args.name, cwd);
25
31
  return exitCode === 0 ? success() : silentFailure(exitCode);
26
32
  });
27
33
  },
@@ -15,8 +15,8 @@ describe("runInit", () => {
15
15
  fs.rmSync(tmpDir, { recursive: true, force: true });
16
16
  });
17
17
 
18
- it("copies skills, workflows, config, and symlink on fresh repo", () => {
19
- const exitCode = runInit(tmpDir);
18
+ it("copies skills, workflows, symlink, and scaffolds project on fresh repo", () => {
19
+ const exitCode = runInit("test-project", tmpDir);
20
20
  expect(exitCode).toBe(0);
21
21
 
22
22
  // Skills
@@ -37,14 +37,30 @@ describe("runInit", () => {
37
37
  const wfPath = path.join(tmpDir, ".github", "workflows", "erp-kit-check.yml");
38
38
  expect(fs.existsSync(wfPath)).toBe(true);
39
39
 
40
- // Config
41
- const configPath = path.join(tmpDir, "license.config.json");
42
- expect(fs.existsSync(configPath)).toBe(true);
40
+ // Scaffold: package.json
41
+ const pkgPath = path.join(tmpDir, "package.json");
42
+ expect(fs.existsSync(pkgPath)).toBe(true);
43
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8")) as { name: string; private: boolean };
44
+ expect(pkg.name).toBe("test-project");
45
+ expect(pkg.private).toBe(true);
46
+
47
+ // Scaffold: pnpm-workspace.yaml
48
+ expect(fs.existsSync(path.join(tmpDir, "pnpm-workspace.yaml"))).toBe(true);
49
+
50
+ // Scaffold: .gitignore
51
+ expect(fs.existsSync(path.join(tmpDir, ".gitignore"))).toBe(true);
52
+
53
+ // Scaffold: license.config.json
54
+ expect(fs.existsSync(path.join(tmpDir, "license.config.json"))).toBe(true);
55
+
56
+ // Scaffold: apps/ and modules/
57
+ expect(fs.existsSync(path.join(tmpDir, "apps", ".gitkeep"))).toBe(true);
58
+ expect(fs.existsSync(path.join(tmpDir, "modules", ".gitkeep"))).toBe(true);
43
59
  });
44
60
 
45
61
  it("refuses to run if already initialized", () => {
46
- runInit(tmpDir);
47
- const exitCode = runInit(tmpDir);
62
+ runInit("test-project", tmpDir);
63
+ const exitCode = runInit("test-project", tmpDir);
48
64
  expect(exitCode).toBe(1);
49
65
  });
50
66
 
@@ -52,7 +68,7 @@ describe("runInit", () => {
52
68
  const customDir = path.join(tmpDir, ".agents", "skills", "my-custom-skill");
53
69
  fs.mkdirSync(customDir, { recursive: true });
54
70
  fs.writeFileSync(path.join(customDir, "SKILL.md"), "# Custom");
55
- runInit(tmpDir);
71
+ runInit("test-project", tmpDir);
56
72
  expect(fs.readFileSync(path.join(customDir, "SKILL.md"), "utf-8")).toBe("# Custom");
57
73
  });
58
74
  });
@@ -1,13 +1,8 @@
1
1
  import chalk from "chalk";
2
- import {
3
- copySkills,
4
- copyWorkflows,
5
- copyConfigs,
6
- setupSymlink,
7
- isAlreadyInitialized,
8
- } from "./lib/distribute";
2
+ import { scaffoldProjectBoilerplate } from "../generator/scaffold";
3
+ import { copySkills, copyWorkflows, setupSymlink, isAlreadyInitialized } from "./lib/distribute";
9
4
 
10
- export function runInit(cwd: string): number {
5
+ export function runInit(name: string, cwd: string): number {
11
6
  console.log(chalk.bold("erp-kit init\n"));
12
7
 
13
8
  if (isAlreadyInitialized(cwd)) {
@@ -36,10 +31,8 @@ export function runInit(cwd: string): number {
36
31
  console.log(chalk.green(` Copied ${workflows.copied} workflow(s) to .github/workflows/`));
37
32
  }
38
33
 
39
- const configs = copyConfigs(cwd);
40
- if (configs.copied > 0) {
41
- console.log(chalk.green(` Copied ${configs.copied} config file(s)`));
42
- }
34
+ scaffoldProjectBoilerplate(cwd, name);
35
+ console.log(chalk.green(" Scaffolded project structure"));
43
36
 
44
37
  console.log(chalk.bold.green("\nDone! Run `erp-kit check` to validate your docs."));
45
38
  return 0;
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
5
- import { copySkills, copyWorkflows, copyConfigs, setupSymlink } from "./distribute";
5
+ import { copySkills, copyWorkflows, setupSymlink } from "./distribute";
6
6
 
7
7
  describe("copySkills", () => {
8
8
  let tmpDir: string;
@@ -74,25 +74,6 @@ describe("copyWorkflows", () => {
74
74
  });
75
75
  });
76
76
 
77
- describe("copyConfigs", () => {
78
- let tmpDir: string;
79
-
80
- beforeEach(() => {
81
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "distribute-test-"));
82
- });
83
-
84
- afterEach(() => {
85
- fs.rmSync(tmpDir, { recursive: true, force: true });
86
- });
87
-
88
- it("copies config files to repo root", () => {
89
- const result = copyConfigs(tmpDir);
90
- const configPath = path.join(tmpDir, "license.config.json");
91
- expect(fs.existsSync(configPath)).toBe(true);
92
- expect(result.copied).toBeGreaterThan(0);
93
- });
94
- });
95
-
96
77
  describe("setupSymlink", () => {
97
78
  let tmpDir: string;
98
79
 
@@ -4,7 +4,6 @@ import { PACKAGE_ROOT } from "../../util";
4
4
 
5
5
  const SKILLS_SRC = path.join(PACKAGE_ROOT, "skills");
6
6
  const WORKFLOWS_SRC = path.join(PACKAGE_ROOT, "templates", "workflows");
7
- const CONFIG_SRC = path.join(PACKAGE_ROOT, "templates", "config");
8
7
 
9
8
  export interface CopyResult {
10
9
  copied: number;
@@ -77,19 +76,6 @@ export function copyWorkflows(cwd: string): CopyResult {
77
76
  return { copied, removed: 0 };
78
77
  }
79
78
 
80
- export function copyConfigs(cwd: string): CopyResult {
81
- if (!fs.existsSync(CONFIG_SRC)) return { copied: 0, removed: 0 };
82
-
83
- let copied = 0;
84
- for (const entry of fs.readdirSync(CONFIG_SRC)) {
85
- const destPath = path.join(cwd, entry);
86
- fs.copyFileSync(path.join(CONFIG_SRC, entry), destPath);
87
- copied++;
88
- }
89
-
90
- return { copied, removed: 0 };
91
- }
92
-
93
79
  export type SymlinkResult = "linked" | "already_linked" | "skipped_directory" | "copied";
94
80
 
95
81
  function createSymlink(target: string, linkPath: string): void {