@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.
- package/CHANGELOG.md +25 -0
- package/README.md +8 -4
- package/dist/cli.mjs +70 -70
- package/package.json +1 -1
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +5 -5
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +1 -1
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +37 -12
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +3 -1
- package/skills/erp-kit-app-6-impl-frontend/references/component.md +90 -0
- package/skills/erp-kit-app-6-impl-frontend/references/detail-view.md +255 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +1 -5
- package/skills/erp-kit-app-7-impl-review/SKILL.md +3 -2
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +14 -8
- package/skills/erp-kit-module-6-impl-review/SKILL.md +16 -19
- package/skills/erp-kit-module-shared/references/commands.md +68 -1
- package/src/commands/index.ts +8 -2
- package/src/commands/init.test.ts +24 -8
- package/src/commands/init.ts +5 -12
- package/src/commands/lib/distribute.test.ts +1 -20
- package/src/commands/lib/distribute.ts +0 -14
- package/src/commands/update.test.ts +1 -1
- package/src/generator/scaffold.ts +25 -4
- package/src/module.ts +4 -1
- package/src/modules/accounting/README.md +63 -0
- package/src/modules/accounting/command/activateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/activateBudget.test.ts +119 -0
- package/src/modules/accounting/command/activateBudget.ts +77 -0
- package/src/modules/accounting/command/activateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/activateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/activateCostElement.ts +41 -0
- package/src/modules/accounting/command/activateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/activateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/activateProfitCenter.ts +38 -0
- package/src/modules/accounting/command/approveBudget.generated.ts +6 -0
- package/src/modules/accounting/command/approveBudget.test.ts +69 -0
- package/src/modules/accounting/command/approveBudget.ts +47 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.test.ts +112 -0
- package/src/modules/accounting/command/assignCostCenterToHierarchyNode.ts +67 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.test.ts +123 -0
- package/src/modules/accounting/command/assignProfitCenterToHierarchyNode.ts +71 -0
- package/src/modules/accounting/command/closeBudget.generated.ts +6 -0
- package/src/modules/accounting/command/closeBudget.test.ts +93 -0
- package/src/modules/accounting/command/closeBudget.ts +40 -0
- package/src/modules/accounting/command/closeInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/closeInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/closeInternalOrder.ts +38 -0
- package/src/modules/accounting/command/consumeCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/consumeCommitment.test.ts +123 -0
- package/src/modules/accounting/command/consumeCommitment.ts +62 -0
- package/src/modules/accounting/command/createAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationCycle.test.ts +166 -0
- package/src/modules/accounting/command/createAllocationCycle.ts +68 -0
- package/src/modules/accounting/command/createAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/createAllocationRule.test.ts +195 -0
- package/src/modules/accounting/command/createAllocationRule.ts +103 -0
- package/src/modules/accounting/command/createBudget.generated.ts +6 -0
- package/src/modules/accounting/command/createBudget.test.ts +159 -0
- package/src/modules/accounting/command/createBudget.ts +100 -0
- package/src/modules/accounting/command/createBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/createBudgetLineItem.test.ts +178 -0
- package/src/modules/accounting/command/createBudgetLineItem.ts +104 -0
- package/src/modules/accounting/command/createCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenter.test.ts +179 -0
- package/src/modules/accounting/command/createCostCenter.ts +112 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createCostCenterHierarchy.ts +48 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.test.ts +171 -0
- package/src/modules/accounting/command/createCostCenterHierarchyNode.ts +117 -0
- package/src/modules/accounting/command/createCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/createCostElement.test.ts +317 -0
- package/src/modules/accounting/command/createCostElement.ts +149 -0
- package/src/modules/accounting/command/createInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/createInternalOrder.test.ts +206 -0
- package/src/modules/accounting/command/createInternalOrder.ts +104 -0
- package/src/modules/accounting/command/createPlanVersion.generated.ts +6 -0
- package/src/modules/accounting/command/createPlanVersion.test.ts +230 -0
- package/src/modules/accounting/command/createPlanVersion.ts +71 -0
- package/src/modules/accounting/command/createProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenter.test.ts +227 -0
- package/src/modules/accounting/command/createProfitCenter.ts +81 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.test.ts +91 -0
- package/src/modules/accounting/command/createProfitCenterHierarchy.ts +46 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.test.ts +160 -0
- package/src/modules/accounting/command/createProfitCenterHierarchyNode.ts +109 -0
- package/src/modules/accounting/command/deactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/deactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/deactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/deactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/deleteAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationCycle.test.ts +90 -0
- package/src/modules/accounting/command/deleteAllocationCycle.ts +39 -0
- package/src/modules/accounting/command/deleteAllocationRule.generated.ts +6 -0
- package/src/modules/accounting/command/deleteAllocationRule.test.ts +98 -0
- package/src/modules/accounting/command/deleteAllocationRule.ts +40 -0
- package/src/modules/accounting/command/deleteBudget.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudget.test.ts +90 -0
- package/src/modules/accounting/command/deleteBudget.ts +35 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.generated.ts +6 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.test.ts +85 -0
- package/src/modules/accounting/command/deleteBudgetLineItem.ts +50 -0
- package/src/modules/accounting/command/deleteCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenter.test.ts +79 -0
- package/src/modules/accounting/command/deleteCostCenter.ts +67 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.test.ts +59 -0
- package/src/modules/accounting/command/deleteCostCenterHierarchyNode.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/deleteCostElement.test.ts +58 -0
- package/src/modules/accounting/command/deleteCostElement.ts +33 -0
- package/src/modules/accounting/command/deleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/deleteInternalOrder.test.ts +81 -0
- package/src/modules/accounting/command/deleteInternalOrder.ts +37 -0
- package/src/modules/accounting/command/deleteProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenter.test.ts +68 -0
- package/src/modules/accounting/command/deleteProfitCenter.ts +39 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.test.ts +72 -0
- package/src/modules/accounting/command/deleteProfitCenterHierarchyNode.ts +61 -0
- package/src/modules/accounting/command/executeAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/executeAllocationCycle.test.ts +167 -0
- package/src/modules/accounting/command/executeAllocationCycle.ts +94 -0
- package/src/modules/accounting/command/finalizeVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/finalizeVarianceReport.test.ts +60 -0
- package/src/modules/accounting/command/finalizeVarianceReport.ts +45 -0
- package/src/modules/accounting/command/generateVarianceReport.generated.ts +6 -0
- package/src/modules/accounting/command/generateVarianceReport.test.ts +386 -0
- package/src/modules/accounting/command/generateVarianceReport.ts +219 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.test.ts +84 -0
- package/src/modules/accounting/command/invalidateAllocationCycle.ts +45 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.generated.ts +6 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.test.ts +135 -0
- package/src/modules/accounting/command/moveCostCenterHierarchyNode.ts +81 -0
- package/src/modules/accounting/command/postAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/postAllocationCycle.test.ts +98 -0
- package/src/modules/accounting/command/postAllocationCycle.ts +65 -0
- package/src/modules/accounting/command/reactivateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateCostElement.test.ts +59 -0
- package/src/modules/accounting/command/reactivateCostElement.ts +41 -0
- package/src/modules/accounting/command/reactivateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/reactivateProfitCenter.test.ts +60 -0
- package/src/modules/accounting/command/reactivateProfitCenter.ts +42 -0
- package/src/modules/accounting/command/recordCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/recordCommitment.test.ts +157 -0
- package/src/modules/accounting/command/recordCommitment.ts +113 -0
- package/src/modules/accounting/command/rejectBudget.generated.ts +6 -0
- package/src/modules/accounting/command/rejectBudget.test.ts +105 -0
- package/src/modules/accounting/command/rejectBudget.ts +51 -0
- package/src/modules/accounting/command/releaseCommitment.generated.ts +6 -0
- package/src/modules/accounting/command/releaseCommitment.test.ts +94 -0
- package/src/modules/accounting/command/releaseCommitment.ts +51 -0
- package/src/modules/accounting/command/releaseInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/releaseInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/releaseInternalOrder.ts +38 -0
- package/src/modules/accounting/command/reverseAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/reverseAllocationCycle.test.ts +124 -0
- package/src/modules/accounting/command/reverseAllocationCycle.ts +63 -0
- package/src/modules/accounting/command/submitBudget.generated.ts +6 -0
- package/src/modules/accounting/command/submitBudget.test.ts +60 -0
- package/src/modules/accounting/command/submitBudget.ts +51 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.test.ts +74 -0
- package/src/modules/accounting/command/technicallyCompleteInternalOrder.ts +42 -0
- package/src/modules/accounting/command/updateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/updateAllocationCycle.test.ts +112 -0
- package/src/modules/accounting/command/updateAllocationCycle.ts +41 -0
- package/src/modules/accounting/command/updateBudget.generated.ts +6 -0
- package/src/modules/accounting/command/updateBudget.test.ts +112 -0
- package/src/modules/accounting/command/updateBudget.ts +44 -0
- package/src/modules/accounting/command/updateCostCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostCenter.test.ts +105 -0
- package/src/modules/accounting/command/updateCostCenter.ts +79 -0
- package/src/modules/accounting/command/updateCostElement.generated.ts +6 -0
- package/src/modules/accounting/command/updateCostElement.test.ts +265 -0
- package/src/modules/accounting/command/updateCostElement.ts +158 -0
- package/src/modules/accounting/command/updateInternalOrder.generated.ts +6 -0
- package/src/modules/accounting/command/updateInternalOrder.test.ts +209 -0
- package/src/modules/accounting/command/updateInternalOrder.ts +88 -0
- package/src/modules/accounting/command/updateProfitCenter.generated.ts +6 -0
- package/src/modules/accounting/command/updateProfitCenter.test.ts +162 -0
- package/src/modules/accounting/command/updateProfitCenter.ts +73 -0
- package/src/modules/accounting/command/validateAllocationCycle.generated.ts +6 -0
- package/src/modules/accounting/command/validateAllocationCycle.test.ts +141 -0
- package/src/modules/accounting/command/validateAllocationCycle.ts +80 -0
- package/src/modules/accounting/db/allocationCycle.ts +59 -0
- package/src/modules/accounting/db/allocationResult.ts +58 -0
- package/src/modules/accounting/db/allocationRule.ts +48 -0
- package/src/modules/accounting/db/budget.ts +84 -0
- package/src/modules/accounting/db/budgetLineItem.ts +64 -0
- package/src/modules/accounting/db/commitment.ts +60 -0
- package/src/modules/accounting/db/costCenter.ts +73 -0
- package/src/modules/accounting/db/costCenterHierarchy.ts +37 -0
- package/src/modules/accounting/db/costCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/costElement.ts +56 -0
- package/src/modules/accounting/db/internalOrder.ts +69 -0
- package/src/modules/accounting/db/planVersion.ts +47 -0
- package/src/modules/accounting/db/profitCenter.ts +52 -0
- package/src/modules/accounting/db/profitCenterHierarchy.ts +36 -0
- package/src/modules/accounting/db/profitCenterHierarchyAssignment.ts +62 -0
- package/src/modules/accounting/db/profitCenterHierarchyNode.ts +48 -0
- package/src/modules/accounting/db/varianceReport.ts +54 -0
- package/src/modules/accounting/db/varianceReportLine.ts +62 -0
- package/src/modules/accounting/docs/commands/ActivateBudget.md +54 -0
- package/src/modules/accounting/docs/commands/ActivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ActivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/ApproveBudget.md +46 -0
- package/src/modules/accounting/docs/commands/AssignCostCenterToHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/AssignProfitCenterToHierarchyNode.md +47 -0
- package/src/modules/accounting/docs/commands/CloseBudget.md +47 -0
- package/src/modules/accounting/docs/commands/CloseInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/ConsumeCommitment.md +53 -0
- package/src/modules/accounting/docs/commands/CreateAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/CreateAllocationRule.md +60 -0
- package/src/modules/accounting/docs/commands/CreateBudget.md +65 -0
- package/src/modules/accounting/docs/commands/CreateBudgetLineItem.md +66 -0
- package/src/modules/accounting/docs/commands/CreateCostCenter.md +64 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateCostCenterHierarchyNode.md +61 -0
- package/src/modules/accounting/docs/commands/CreateCostElement.md +91 -0
- package/src/modules/accounting/docs/commands/CreateInternalOrder.md +72 -0
- package/src/modules/accounting/docs/commands/CreatePlanVersion.md +59 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenter.md +63 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/commands/CreateProfitCenterHierarchyNode.md +60 -0
- package/src/modules/accounting/docs/commands/DeactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeactivateProfitCenter.md +44 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationCycle.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteAllocationRule.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteBudget.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteBudgetLineItem.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/DeleteCostCenterHierarchyNode.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/DeleteInternalOrder.md +45 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenter.md +46 -0
- package/src/modules/accounting/docs/commands/DeleteProfitCenterHierarchyNode.md +46 -0
- package/src/modules/accounting/docs/commands/ExecuteAllocationCycle.md +54 -0
- package/src/modules/accounting/docs/commands/FinalizeVarianceReport.md +44 -0
- package/src/modules/accounting/docs/commands/GenerateVarianceReport.md +83 -0
- package/src/modules/accounting/docs/commands/InvalidateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/MoveCostCenterHierarchyNode.md +51 -0
- package/src/modules/accounting/docs/commands/PostAllocationCycle.md +58 -0
- package/src/modules/accounting/docs/commands/ReactivateCostElement.md +43 -0
- package/src/modules/accounting/docs/commands/ReactivateProfitCenter.md +43 -0
- package/src/modules/accounting/docs/commands/RecordCommitment.md +60 -0
- package/src/modules/accounting/docs/commands/RejectBudget.md +49 -0
- package/src/modules/accounting/docs/commands/ReleaseCommitment.md +45 -0
- package/src/modules/accounting/docs/commands/ReleaseInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/ReverseAllocationCycle.md +55 -0
- package/src/modules/accounting/docs/commands/SubmitBudget.md +47 -0
- package/src/modules/accounting/docs/commands/TechnicallyCompleteInternalOrder.md +44 -0
- package/src/modules/accounting/docs/commands/UpdateAllocationCycle.md +45 -0
- package/src/modules/accounting/docs/commands/UpdateBudget.md +47 -0
- package/src/modules/accounting/docs/commands/UpdateCostCenter.md +50 -0
- package/src/modules/accounting/docs/commands/UpdateCostElement.md +82 -0
- package/src/modules/accounting/docs/commands/UpdateInternalOrder.md +62 -0
- package/src/modules/accounting/docs/commands/UpdateProfitCenter.md +56 -0
- package/src/modules/accounting/docs/commands/ValidateAllocationCycle.md +57 -0
- package/src/modules/accounting/docs/features/budget-management.md +147 -0
- package/src/modules/accounting/docs/features/cost-allocation.md +129 -0
- package/src/modules/accounting/docs/features/cost-center-management.md +118 -0
- package/src/modules/accounting/docs/features/cost-element-management.md +114 -0
- package/src/modules/accounting/docs/features/internal-order-management.md +111 -0
- package/src/modules/accounting/docs/features/profit-center-management.md +120 -0
- package/src/modules/accounting/docs/features/variance-analysis.md +130 -0
- package/src/modules/accounting/docs/models/AllocationCycle.md +81 -0
- package/src/modules/accounting/docs/models/AllocationResult.md +37 -0
- package/src/modules/accounting/docs/models/AllocationRule.md +41 -0
- package/src/modules/accounting/docs/models/Budget.md +77 -0
- package/src/modules/accounting/docs/models/BudgetLineItem.md +40 -0
- package/src/modules/accounting/docs/models/Commitment.md +45 -0
- package/src/modules/accounting/docs/models/CostCenter.md +51 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchy.md +38 -0
- package/src/modules/accounting/docs/models/CostCenterHierarchyNode.md +41 -0
- package/src/modules/accounting/docs/models/CostElement.md +66 -0
- package/src/modules/accounting/docs/models/InternalOrder.md +67 -0
- package/src/modules/accounting/docs/models/PlanVersion.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenter.md +66 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchy.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyAssignment.md +36 -0
- package/src/modules/accounting/docs/models/ProfitCenterHierarchyNode.md +39 -0
- package/src/modules/accounting/docs/models/VarianceReport.md +58 -0
- package/src/modules/accounting/docs/models/VarianceReportLine.md +43 -0
- package/src/modules/accounting/docs/queries/CalculateBudgetAvailability.md +64 -0
- package/src/modules/accounting/docs/queries/GetAllocationCycle.md +43 -0
- package/src/modules/accounting/docs/queries/GetBudget.md +42 -0
- package/src/modules/accounting/docs/queries/GetCostCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetCostCenterHierarchy.md +45 -0
- package/src/modules/accounting/docs/queries/GetCostElement.md +39 -0
- package/src/modules/accounting/docs/queries/GetInternalOrder.md +42 -0
- package/src/modules/accounting/docs/queries/GetProfitCenter.md +38 -0
- package/src/modules/accounting/docs/queries/GetProfitCenterHierarchy.md +46 -0
- package/src/modules/accounting/docs/queries/GetVarianceReport.md +45 -0
- package/src/modules/accounting/docs/queries/ListAllocationCycles.md +63 -0
- package/src/modules/accounting/docs/queries/ListBudgets.md +70 -0
- package/src/modules/accounting/docs/queries/ListCostCenters.md +55 -0
- package/src/modules/accounting/docs/queries/ListCostElements.md +63 -0
- package/src/modules/accounting/docs/queries/ListInternalOrders.md +62 -0
- package/src/modules/accounting/docs/queries/ListProfitCenters.md +49 -0
- package/src/modules/accounting/generated/enums.ts +110 -0
- package/src/modules/accounting/generated/kysely-tailordb.ts +302 -0
- package/src/modules/accounting/index.ts +2 -0
- package/src/modules/accounting/lib/_db_deps.ts +70 -0
- package/src/modules/accounting/lib/actualAmounts.ts +93 -0
- package/src/modules/accounting/lib/allocationPosting.ts +152 -0
- package/src/modules/accounting/lib/errors.generated.ts +432 -0
- package/src/modules/accounting/lib/permissions.generated.ts +61 -0
- package/src/modules/accounting/lib/types.ts +114 -0
- package/src/modules/accounting/module.ts +428 -0
- package/src/modules/accounting/permissions.ts +3 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.generated.ts +5 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.test.ts +229 -0
- package/src/modules/accounting/query/calculateBudgetAvailability.ts +147 -0
- package/src/modules/accounting/query/getAllocationCycle.generated.ts +5 -0
- package/src/modules/accounting/query/getAllocationCycle.test.ts +94 -0
- package/src/modules/accounting/query/getAllocationCycle.ts +37 -0
- package/src/modules/accounting/query/getBudget.generated.ts +5 -0
- package/src/modules/accounting/query/getBudget.test.ts +80 -0
- package/src/modules/accounting/query/getBudget.ts +31 -0
- package/src/modules/accounting/query/getCostCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenter.test.ts +50 -0
- package/src/modules/accounting/query/getCostCenter.ts +33 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.test.ts +100 -0
- package/src/modules/accounting/query/getCostCenterHierarchy.ts +80 -0
- package/src/modules/accounting/query/getCostElement.generated.ts +5 -0
- package/src/modules/accounting/query/getCostElement.test.ts +57 -0
- package/src/modules/accounting/query/getCostElement.ts +21 -0
- package/src/modules/accounting/query/getInternalOrder.generated.ts +5 -0
- package/src/modules/accounting/query/getInternalOrder.test.ts +73 -0
- package/src/modules/accounting/query/getInternalOrder.ts +21 -0
- package/src/modules/accounting/query/getProfitCenter.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenter.test.ts +65 -0
- package/src/modules/accounting/query/getProfitCenter.ts +31 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.generated.ts +5 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.test.ts +97 -0
- package/src/modules/accounting/query/getProfitCenterHierarchy.ts +87 -0
- package/src/modules/accounting/query/getVarianceReport.generated.ts +5 -0
- package/src/modules/accounting/query/getVarianceReport.test.ts +108 -0
- package/src/modules/accounting/query/getVarianceReport.ts +31 -0
- package/src/modules/accounting/query/listAllocationCycles.generated.ts +5 -0
- package/src/modules/accounting/query/listAllocationCycles.test.ts +152 -0
- package/src/modules/accounting/query/listAllocationCycles.ts +96 -0
- package/src/modules/accounting/query/listBudgets.generated.ts +5 -0
- package/src/modules/accounting/query/listBudgets.test.ts +150 -0
- package/src/modules/accounting/query/listBudgets.ts +85 -0
- package/src/modules/accounting/query/listCostCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listCostCenters.test.ts +111 -0
- package/src/modules/accounting/query/listCostCenters.ts +71 -0
- package/src/modules/accounting/query/listCostElements.generated.ts +5 -0
- package/src/modules/accounting/query/listCostElements.test.ts +138 -0
- package/src/modules/accounting/query/listCostElements.ts +105 -0
- package/src/modules/accounting/query/listInternalOrders.generated.ts +5 -0
- package/src/modules/accounting/query/listInternalOrders.test.ts +129 -0
- package/src/modules/accounting/query/listInternalOrders.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.generated.ts +5 -0
- package/src/modules/accounting/query/listProfitCenters.test.ts +94 -0
- package/src/modules/accounting/query/listProfitCenters.ts +56 -0
- package/src/modules/accounting/seed/index.ts +19 -0
- package/src/modules/accounting/tailor.config.ts +13 -0
- package/src/modules/accounting/testing/commandTestUtils.ts +35 -0
- package/src/modules/accounting/testing/fixtures.ts +502 -0
- package/src/modules/audit/command/logAuditEvent.ts +43 -38
- package/src/modules/audit/command/updateAuditPolicy.ts +2 -2
- package/src/modules/audit/docs/commands/UpdateAuditPolicy.md +1 -1
- package/src/modules/audit/module.ts +4 -0
- package/src/modules/business-partner/command/updateContactPerson.ts +3 -4
- package/src/modules/business-partner/command/updatePartner.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerAddress.ts +13 -6
- package/src/modules/business-partner/command/updatePartnerBankAccount.ts +3 -4
- package/src/modules/business-partner/command/updatePartnerIdentification.ts +3 -4
- package/src/modules/business-partner/docs/commands/UpdateContactPerson.md +3 -3
- package/src/modules/business-partner/docs/commands/UpdatePartner.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerAddress.md +2 -2
- package/src/modules/business-partner/docs/commands/UpdatePartnerIdentification.md +2 -2
- package/src/modules/coa-management/command/updateAccount.ts +3 -3
- package/src/modules/coa-management/command/updateAccountGroup.test.ts +22 -0
- package/src/modules/coa-management/command/updateAccountGroup.ts +30 -18
- package/src/modules/coa-management/command/updateChartOfAccounts.ts +3 -4
- package/src/modules/coa-management/docs/commands/UpdateAccountGroup.md +4 -3
- package/src/modules/finance-ledger/command/updateFiscalYear.ts +2 -3
- package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +0 -17
- package/src/modules/finance-ledger/command/updateJournalEntry.ts +2 -10
- package/src/modules/finance-ledger/command/updateJournalLine.ts +2 -3
- package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +1 -4
- package/src/modules/inventory/command/updateLot.test.ts +1 -1
- package/src/modules/inventory/command/updateLot.ts +2 -3
- package/src/modules/inventory/command/updateStockMovement.ts +2 -3
- package/src/modules/inventory/command/updateStorageLocation.ts +12 -17
- package/src/modules/inventory/command/updateValuationPolicy.ts +2 -3
- package/src/modules/inventory/command/updateWarehouse.ts +2 -3
- package/src/modules/inventory/docs/commands/UpdateLot.md +3 -3
- package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +6 -6
- package/src/modules/inventory/docs/commands/UpdateWarehouse.md +2 -2
- package/src/modules/item-management/command/updateItem.test.ts +16 -12
- package/src/modules/item-management/command/updateItem.ts +47 -31
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +15 -16
- package/src/modules/item-management/command/updateTaxonomyNode.ts +42 -29
- package/src/modules/item-management/docs/commands/UpdateItem.md +7 -11
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +10 -14
- package/src/modules/manufacturing/command/updateBillOfMaterial.ts +3 -4
- package/src/modules/manufacturing/command/updateProductionOrder.ts +3 -4
- package/src/modules/manufacturing/command/updateRouting.ts +3 -4
- package/src/modules/manufacturing/command/updateWorkCenter.test.ts +16 -7
- package/src/modules/manufacturing/command/updateWorkCenter.ts +41 -38
- package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +2 -0
- package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +2 -0
- package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +1 -0
- package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +6 -5
- package/src/modules/manufacturing/docs/models/BillOfMaterialLine.md +42 -0
- package/src/modules/manufacturing/docs/models/CostVarianceLine.md +36 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostLine.md +37 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostSettlementRecord.md +34 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderBomSnapshot.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderCostBaseline.md +36 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderMaterialRequirement.md +35 -0
- package/src/modules/manufacturing/docs/models/ProductionOrderRoutingSnapshot.md +34 -0
- package/src/modules/manufacturing/docs/models/RoutingOperation.md +40 -0
- package/src/modules/manufacturing/docs/models/WorkOrderExecutionEvent.md +38 -0
- package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +1 -0
- package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +1 -0
- package/src/modules/organization/command/updateCompany.test.ts +6 -6
- package/src/modules/organization/command/updateCompany.ts +3 -4
- package/src/modules/organization/command/updateDepartment.test.ts +7 -7
- package/src/modules/organization/command/updateDepartment.ts +13 -12
- package/src/modules/organization/command/updateSite.test.ts +10 -10
- package/src/modules/organization/command/updateSite.ts +3 -4
- package/src/modules/organization/docs/commands/UpdateCompany.md +6 -6
- package/src/modules/organization/docs/commands/UpdateDepartment.md +9 -10
- package/src/modules/organization/docs/commands/UpdateSite.md +12 -12
- package/src/modules/product-management/command/updateProduct.test.ts +17 -11
- package/src/modules/product-management/command/updateProduct.ts +45 -28
- package/src/modules/product-management/command/updateProductAttribute.test.ts +16 -21
- package/src/modules/product-management/command/updateProductAttribute.ts +40 -26
- package/src/modules/product-management/command/updateProductAttributeValue.ts +2 -3
- package/src/modules/product-management/command/updateProductCategory.test.ts +14 -19
- package/src/modules/product-management/command/updateProductCategory.ts +42 -26
- package/src/modules/product-management/docs/commands/UpdateProduct.md +16 -20
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +10 -14
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +10 -14
- package/src/modules/purchase/command/updateGoodsReceipt.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseBill.ts +2 -3
- package/src/modules/purchase/command/updatePurchaseOrder.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceList.ts +2 -3
- package/src/modules/purchase/command/updatePurchasePriceRule.ts +2 -3
- package/src/modules/sales/command/updateChannel.test.ts +4 -4
- package/src/modules/sales/command/updateChannel.ts +2 -3
- package/src/modules/sales/command/updateListing.test.ts +2 -2
- package/src/modules/sales/command/updateListing.ts +2 -3
- package/src/modules/sales/command/updateSalesCreditNote.test.ts +2 -2
- package/src/modules/sales/command/updateSalesCreditNote.ts +2 -3
- package/src/modules/sales/command/updateSalesInvoice.test.ts +2 -2
- package/src/modules/sales/command/updateSalesInvoice.ts +2 -3
- package/src/modules/sales/command/updateSalesOrder.test.ts +3 -3
- package/src/modules/sales/command/updateSalesOrder.ts +2 -3
- package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +2 -2
- package/src/modules/sales/command/updateSalesPaymentTerm.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceList.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceList.ts +2 -3
- package/src/modules/sales/command/updateSalesPriceRule.test.ts +3 -3
- package/src/modules/sales/command/updateSalesPriceRule.ts +2 -3
- package/src/modules/sales/command/updateShipment.test.ts +2 -2
- package/src/modules/sales/command/updateShipment.ts +2 -3
- package/src/modules/sales/docs/commands/UpdateChannel.md +4 -4
- package/src/modules/sales/docs/commands/UpdateListing.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesOrder.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +2 -2
- package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +3 -3
- package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +3 -3
- package/src/modules/sales/docs/commands/UpdateShipment.md +2 -2
- package/src/modules/user-management/README.md +2 -1
- package/src/modules/user-management/command/updateOwnProfile.generated.ts +6 -0
- package/src/modules/user-management/command/updateOwnProfile.test.ts +191 -0
- package/src/modules/user-management/command/updateOwnProfile.ts +82 -0
- package/src/modules/user-management/command/updateUser.generated.ts +6 -0
- package/src/modules/user-management/command/updateUser.test.ts +195 -0
- package/src/modules/user-management/command/updateUser.ts +76 -0
- package/src/modules/user-management/docs/commands/UpdateOwnProfile.md +68 -0
- package/src/modules/user-management/docs/commands/UpdateUser.md +67 -0
- package/src/modules/user-management/docs/features/user-account-management.md +28 -3
- package/src/modules/user-management/docs/models/User.md +2 -0
- package/src/modules/user-management/lib/errors.generated.ts +5 -0
- package/src/modules/user-management/lib/permissions.generated.ts +2 -0
- package/src/modules/user-management/module.ts +5 -0
- package/src/modules/user-management/seed/index.ts +19 -0
- package/templates/scaffold/app/backend/seed/data/AuditEntry.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.jsonl +7 -0
- package/templates/scaffold/app/backend/seed/data/AuditPolicy.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.jsonl +4 -0
- package/templates/scaffold/app/backend/seed/data/AuditableEntity.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/ChangeDetail.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Company.schema.ts +15 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/PolicyFieldRule.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +13 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +1 -1
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -1
- package/templates/scaffold/app/backend/seed/exec.mjs +12 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +2 -2
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +2 -2
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +62 -0
- package/templates/scaffold/app/backend/src/modules-db.ts +13 -0
- package/templates/scaffold/app/backend/src/modules.ts +3 -5
- package/templates/scaffold/app/backend/src/resolvers/assignPermissionToRole.ts +70 -0
- package/templates/scaffold/app/backend/src/resolvers/assignRoleToUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/createRole.ts +92 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +113 -13
- package/templates/scaffold/app/backend/src/resolvers/deactivateUser.ts +67 -0
- package/templates/scaffold/app/backend/src/resolvers/reactivateUser.ts +63 -0
- package/templates/scaffold/app/backend/src/resolvers/revokePermissionFromRole.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/revokeRoleFromUser.ts +72 -0
- package/templates/scaffold/app/backend/src/resolvers/updateOwnProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/resolvers/updateUserProfile.ts +107 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log-detail.test.ts +79 -0
- package/templates/scaffold/app/backend/src/tests/stories/audit-log/user--view-audit-log.test.ts +86 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--assign-role-to-user.test.ts +103 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--create-role.test.ts +61 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--remove-role-from-user.test.ts +89 -0
- package/templates/scaffold/app/backend/src/tests/stories/role-management/user--update-role-permissions.test.ts +125 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--browse-user-list.test.ts +91 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--create-user-account.test.ts +97 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--toggle-user-status.test.ts +131 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-own-profile.test.ts +85 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--update-user-profile.test.ts +158 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-own-profile.test.ts +30 -0
- package/templates/scaffold/app/backend/src/tests/stories/user-lifecycle/user--view-user-detail.test.ts +98 -0
- package/templates/scaffold/app/backend/tailor.config.ts +6 -2
- package/templates/scaffold/app/docs/actors/user.md +11 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/README.md +31 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log-detail.md +35 -0
- package/templates/scaffold/app/docs/business-flow/audit-log/story/user--view-audit-log.md +44 -0
- package/templates/scaffold/app/docs/business-flow/role-management/README.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--assign-role-to-user.md +35 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--create-role.md +41 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--remove-role-from-user.md +33 -0
- package/templates/scaffold/app/docs/business-flow/role-management/story/user--update-role-permissions.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/README.md +48 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--browse-user-list.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--create-user-account.md +45 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--toggle-user-status.md +38 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-own-profile.md +36 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--update-user-profile.md +41 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-own-profile.md +30 -0
- package/templates/scaffold/app/docs/business-flow/user-lifecycle/story/user--view-user-detail.md +33 -0
- package/templates/scaffold/app/docs/resolver/assignPermissionToRole.md +16 -0
- package/templates/scaffold/app/docs/resolver/assignRoleToUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/createRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/createUser.md +23 -0
- package/templates/scaffold/app/docs/resolver/deactivateUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/reactivateUser.md +16 -0
- package/templates/scaffold/app/docs/resolver/revokePermissionFromRole.md +17 -0
- package/templates/scaffold/app/docs/resolver/revokeRoleFromUser.md +17 -0
- package/templates/scaffold/app/docs/resolver/updateOwnProfile.md +20 -0
- package/templates/scaffold/app/docs/resolver/updateUserProfile.md +19 -0
- package/templates/scaffold/app/docs/screen/audit-entry-detail.md +30 -0
- package/templates/scaffold/app/docs/screen/audit-entry-list.md +25 -0
- package/templates/scaffold/app/docs/screen/my-profile-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/my-profile.md +27 -0
- package/templates/scaffold/app/docs/screen/role-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/role-detail.md +27 -0
- package/templates/scaffold/app/docs/screen/role-edit-form.md +21 -0
- package/templates/scaffold/app/docs/screen/role-list.md +23 -0
- package/templates/scaffold/app/docs/screen/user-create-form.md +23 -0
- package/templates/scaffold/app/docs/screen/user-detail.md +33 -0
- package/templates/scaffold/app/docs/screen/user-edit-form.md +22 -0
- package/templates/scaffold/app/docs/screen/user-list.md +24 -0
- package/templates/scaffold/app/frontend/package.json +1 -1
- package/templates/scaffold/app/frontend/src/App.tsx +4 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +1 -1
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +59 -31
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1411 -688
- package/templates/scaffold/app/frontend/src/hooks/use-toast.ts +1 -1
- package/templates/scaffold/app/frontend/src/lib/permission-groups.ts +59 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/components/audit-entry-detail.tsx +102 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/[id]/page.tsx +65 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/components/audit-entries-table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/audit/page.tsx +52 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/components/edit-profile-form.tsx +125 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/edit/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +41 -21
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-actions.tsx +26 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/components/role-detail.tsx +69 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/components/edit-role-form.tsx +192 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/[id]/page.tsx +56 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/components/roles-table.tsx +85 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/components/create-role-form.tsx +204 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/role/page.tsx +60 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-actions.tsx +216 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +97 -33
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/components/edit-user-form.tsx +115 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/edit/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +8 -2
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +43 -42
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +120 -45
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +3 -4
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +8 -1
- package/templates/scaffold/module/eslint.config.js +8 -0
- package/templates/scaffold/project/__dot__gitignore +1 -0
- package/templates/scaffold/project/__pnpm-workspace.yaml +3 -0
- package/templates/scaffold/project/apps/.gitkeep +0 -0
- package/templates/scaffold/project/modules/.gitkeep +0 -0
- package/templates/scaffold/project/package.json +15 -0
- package/templates/workflows/erp-kit-check.yml +10 -4
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +0 -39
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +0 -60
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +0 -75
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +0 -21
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +0 -90
- /package/src/modules/{supplier-portal → accounting/executor}/.gitkeep +0 -0
- /package/templates/scaffold/app/{docs/actors/.gitkeep → backend/seed/data/AuditEntry.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/business-flow/.gitkeep → backend/seed/data/ChangeDetail.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/resolver/.gitkeep → backend/seed/data/Company.jsonl} +0 -0
- /package/templates/scaffold/app/{docs/screen/.gitkeep → backend/seed/data/PolicyFieldRule.jsonl} +0 -0
- /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
|
-
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
38
|
+
If a doc or code directory is empty, skip that domain entirely.
|
|
39
39
|
|
|
40
40
|
### Splitting Strategy
|
|
41
41
|
|
|
42
|
-
1. **
|
|
43
|
-
2. **File batching**: If a
|
|
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
|
-
|
|
|
49
|
-
|
|
|
50
|
-
| M-1
|
|
51
|
-
| C-1
|
|
52
|
-
|
|
|
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
|
|
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
|
|
69
|
-
2.
|
|
70
|
-
3. Replace
|
|
71
|
-
4.
|
|
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
|
|
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
|
|
package/src/commands/index.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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
|
-
//
|
|
41
|
-
const
|
|
42
|
-
expect(fs.existsSync(
|
|
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
|
});
|
package/src/commands/init.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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,
|
|
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 {
|