@tailor-platform/erp-kit 0.2.1 → 0.2.2
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 +6 -0
- package/README.md +1 -23
- package/dist/cli.mjs +1613 -0
- package/package.json +14 -13
- package/schemas/app-compose/story.yml +12 -0
- package/schemas/module/command.yml +9 -0
- package/schemas/module/module.yml +4 -0
- package/schemas/module/query.yml +9 -0
- package/skills/erp-kit-app-1-requirements/SKILL.md +4 -4
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +102 -0
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +66 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +69 -0
- package/skills/erp-kit-app-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +157 -0
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +107 -0
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +74 -0
- package/skills/erp-kit-app-3-plan/references/story-extraction.md +86 -0
- package/skills/erp-kit-app-4-plan-review/SKILL.md +177 -0
- package/skills/erp-kit-app-4-plan-review/references/actor-flow-parity.md +73 -0
- package/skills/erp-kit-app-4-plan-review/references/business-flow-story-parity.md +86 -0
- package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +69 -0
- package/skills/erp-kit-app-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +83 -0
- package/skills/erp-kit-app-4-plan-review/references/story-screen-parity.md +73 -0
- package/skills/{erp-kit-app-5-implementation → erp-kit-app-5-impl-backend}/SKILL.md +24 -68
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +38 -0
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +48 -0
- package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +68 -0
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +74 -0
- package/skills/{erp-kit-app-5-implementation/references/frontend.md → erp-kit-app-6-impl-frontend/references/pages.md} +8 -90
- package/skills/erp-kit-app-7-impl-review/SKILL.md +176 -0
- package/skills/erp-kit-app-7-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +84 -0
- package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +86 -0
- package/skills/erp-kit-app-7-impl-review/references/screen-doc-code-parity.md +86 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +126 -0
- package/skills/erp-kit-module-1-requirements/references/boundary-analysis.md +51 -0
- package/skills/erp-kit-module-1-requirements/references/erp-research.md +57 -0
- package/skills/erp-kit-module-1-requirements/references/feature-doc.md +61 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +112 -0
- package/skills/erp-kit-module-2-requirements-review/references/best-practices-check.md +79 -0
- package/skills/erp-kit-module-2-requirements-review/references/boundary-consistency-check.md +70 -0
- package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +107 -0
- package/skills/erp-kit-module-3-plan/references/command-extraction.md +87 -0
- package/skills/erp-kit-module-3-plan/references/model-extraction.md +72 -0
- package/skills/erp-kit-module-3-plan/references/query-extraction.md +59 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +158 -0
- package/skills/erp-kit-module-4-plan-review/references/command-model-consistency.md +46 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-command-parity.md +97 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-model-parity.md +47 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-query-parity.md +70 -0
- package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +118 -0
- package/skills/erp-kit-module-5-impl/references/command-impl.md +68 -0
- package/skills/erp-kit-module-5-impl/references/exports.md +10 -0
- package/skills/erp-kit-module-5-impl/references/model-impl.md +45 -0
- package/skills/erp-kit-module-5-impl/references/query-impl.md +53 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +187 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-code-parity.md +92 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +93 -0
- package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +95 -0
- package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/errors.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-module-6-impl-review/references/model-doc-code-parity.md +80 -0
- package/skills/erp-kit-module-shared/SKILL.md +1 -1
- package/skills/erp-kit-module-shared/references/commands.md +1 -1
- package/skills/erp-kit-module-shared/references/errors.md +12 -9
- package/skills/erp-kit-module-shared/references/queries.md +109 -36
- package/skills/erp-kit-module-shared/references/testing.md +10 -0
- package/skills/erp-kit-update/SKILL.md +2 -2
- package/src/app.ts +1 -1
- package/src/commands/check.ts +1 -1
- package/src/commands/index.ts +16 -5
- package/src/commands/init.test.ts +22 -69
- package/src/commands/init.ts +28 -115
- package/src/commands/lib/distribute.test.ts +126 -0
- package/src/commands/lib/distribute.ts +129 -0
- package/src/commands/parse-doc-test-cases.ts +55 -0
- package/src/commands/scaffold.test.ts +74 -33
- package/src/commands/scaffold.ts +54 -18
- package/src/commands/sync-check.test.ts +173 -0
- package/src/commands/sync-check.ts +103 -2
- package/src/commands/update.test.ts +87 -0
- package/src/commands/update.ts +41 -0
- package/src/generator/generate-code.test.ts +23 -12
- package/src/generator/generate-code.ts +22 -16
- package/src/integration.test.ts +1 -1
- package/src/module.ts +14 -97
- package/src/modules/item-management/README.md +8 -0
- package/src/modules/item-management/command/activateItem.generated.ts +1 -1
- package/src/modules/item-management/command/activateItem.test.ts +12 -18
- package/src/modules/item-management/command/activateItem.ts +9 -5
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +10 -24
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +19 -16
- package/src/modules/item-management/command/createItem.generated.ts +1 -1
- package/src/modules/item-management/command/createItem.test.ts +11 -11
- package/src/modules/item-management/command/createItem.ts +16 -7
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +9 -9
- package/src/modules/item-management/command/createTaxonomyNode.ts +33 -14
- package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/deactivateItem.ts +9 -5
- package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
- package/src/modules/item-management/command/deleteItem.test.ts +10 -16
- package/src/modules/item-management/command/deleteItem.ts +9 -5
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +10 -16
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +22 -12
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +10 -10
- package/src/modules/item-management/command/moveTaxonomyNode.ts +63 -19
- package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/reactivateItem.ts +9 -5
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +9 -16
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +11 -6
- package/src/modules/item-management/command/updateItem.generated.ts +1 -1
- package/src/modules/item-management/command/updateItem.test.ts +16 -16
- package/src/modules/item-management/command/updateItem.ts +11 -6
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +14 -20
- package/src/modules/item-management/command/updateTaxonomyNode.ts +9 -6
- package/src/modules/item-management/docs/commands/ActivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +7 -0
- package/src/modules/item-management/docs/commands/CreateItem.md +10 -0
- package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/commands/DeactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/DeleteItem.md +7 -0
- package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +10 -0
- package/src/modules/item-management/docs/commands/ReactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +5 -0
- package/src/modules/item-management/docs/commands/UpdateItem.md +15 -0
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +8 -0
- package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +7 -0
- package/src/modules/item-management/docs/queries/DetectCircularReference.md +9 -0
- package/src/modules/item-management/docs/queries/GetItem.md +9 -0
- package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +6 -0
- package/src/modules/item-management/index.ts +0 -51
- package/src/modules/item-management/lib/errors.generated.ts +24 -24
- package/src/modules/item-management/lib/permissions.generated.ts +1 -1
- package/src/modules/item-management/lib/types.ts +1 -1
- package/src/modules/item-management/module.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.test.ts +21 -6
- package/src/modules/item-management/query/calculateNodeDepth.ts +2 -2
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +17 -5
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +2 -2
- package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.test.ts +25 -7
- package/src/modules/item-management/query/detectCircularReference.ts +4 -4
- package/src/modules/item-management/query/getItem.generated.ts +1 -1
- package/src/modules/item-management/query/getItem.test.ts +25 -7
- package/src/modules/item-management/query/getItem.ts +2 -2
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +9 -3
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.test.ts +17 -5
- package/src/modules/item-management/query/getTaxonomyNode.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +9 -3
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +13 -4
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +2 -2
- package/src/modules/item-management/tailor.config.ts +6 -4
- package/src/modules/item-management/tailor.d.ts +13 -0
- package/src/modules/primitives/README.md +8 -0
- package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/activateCategory.test.ts +8 -18
- package/src/modules/primitives/command/activateCategory.ts +9 -5
- package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.test.ts +8 -18
- package/src/modules/primitives/command/activateCurrency.ts +9 -5
- package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/activateUnit.test.ts +8 -15
- package/src/modules/primitives/command/activateUnit.ts +9 -5
- package/src/modules/primitives/command/createCategory.generated.ts +1 -1
- package/src/modules/primitives/command/createCategory.test.ts +29 -44
- package/src/modules/primitives/command/createCategory.ts +9 -5
- package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/createCurrency.test.ts +53 -78
- package/src/modules/primitives/command/createCurrency.ts +9 -6
- package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.test.ts +59 -97
- package/src/modules/primitives/command/createExchangeRate.ts +13 -7
- package/src/modules/primitives/command/createUnit.generated.ts +1 -1
- package/src/modules/primitives/command/createUnit.test.ts +59 -90
- package/src/modules/primitives/command/createUnit.ts +9 -6
- package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.test.ts +15 -33
- package/src/modules/primitives/command/deactivateCategory.ts +9 -5
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.test.ts +12 -26
- package/src/modules/primitives/command/deactivateCurrency.ts +9 -5
- package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.test.ts +15 -30
- package/src/modules/primitives/command/deactivateUnit.ts +14 -7
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/setBaseCurrency.test.ts +18 -40
- package/src/modules/primitives/command/setBaseCurrency.ts +15 -7
- package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
- package/src/modules/primitives/command/setReferenceUnit.test.ts +22 -44
- package/src/modules/primitives/command/setReferenceUnit.ts +21 -9
- package/src/modules/primitives/docs/commands/ActivateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateUnit.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCurrency.md +10 -0
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +11 -0
- package/src/modules/primitives/docs/commands/CreateUnit.md +10 -0
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +7 -0
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +7 -0
- package/src/modules/primitives/docs/queries/ConvertAmount.md +14 -0
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +13 -0
- package/src/modules/primitives/docs/queries/GetBaseCurrency.md +5 -0
- package/src/modules/primitives/docs/queries/GetCurrency.md +7 -0
- package/src/modules/primitives/docs/queries/GetUnit.md +7 -0
- package/src/modules/primitives/docs/queries/GetUoMCategory.md +7 -0
- package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +15 -5
- package/src/modules/primitives/index.ts +0 -49
- package/src/modules/primitives/lib/errors.generated.ts +23 -23
- package/src/modules/primitives/lib/permissions.generated.ts +1 -1
- package/src/modules/primitives/lib/types.ts +1 -1
- package/src/modules/primitives/module.ts +1 -1
- package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
- package/src/modules/primitives/query/convertAmount.test.ts +110 -77
- package/src/modules/primitives/query/convertAmount.ts +61 -47
- package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.test.ts +99 -69
- package/src/modules/primitives/query/convertQuantity.ts +12 -10
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.test.ts +10 -4
- package/src/modules/primitives/query/getBaseCurrency.ts +2 -2
- package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getCurrency.test.ts +17 -5
- package/src/modules/primitives/query/getCurrency.ts +2 -2
- package/src/modules/primitives/query/getUnit.generated.ts +1 -1
- package/src/modules/primitives/query/getUnit.test.ts +17 -5
- package/src/modules/primitives/query/getUnit.ts +2 -2
- package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.test.ts +17 -5
- package/src/modules/primitives/query/getUoMCategory.ts +2 -2
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.test.ts +80 -0
- package/src/modules/primitives/query/listUnitsByCategory.ts +19 -3
- package/src/modules/primitives/tailor.config.ts +6 -4
- package/src/modules/primitives/tailor.d.ts +13 -0
- package/src/modules/product-management/README.md +52 -0
- package/src/modules/product-management/command/activateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/activateProduct.test.ts +40 -0
- package/src/modules/product-management/command/activateProduct.ts +42 -0
- package/src/modules/product-management/command/assignProductToCategory.generated.ts +6 -0
- package/src/modules/product-management/command/assignProductToCategory.test.ts +90 -0
- package/src/modules/product-management/command/assignProductToCategory.ts +62 -0
- package/src/modules/product-management/command/createProduct.generated.ts +6 -0
- package/src/modules/product-management/command/createProduct.test.ts +149 -0
- package/src/modules/product-management/command/createProduct.ts +73 -0
- package/src/modules/product-management/command/createProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttribute.test.ts +70 -0
- package/src/modules/product-management/command/createProductAttribute.ts +53 -0
- package/src/modules/product-management/command/createProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttributeValue.test.ts +68 -0
- package/src/modules/product-management/command/createProductAttributeValue.ts +63 -0
- package/src/modules/product-management/command/createProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/createProductCategory.test.ts +135 -0
- package/src/modules/product-management/command/createProductCategory.ts +82 -0
- package/src/modules/product-management/command/deactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/deactivateProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProduct.test.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttribute.test.ts +49 -0
- package/src/modules/product-management/command/deleteProductAttribute.ts +45 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.test.ts +71 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.ts +68 -0
- package/src/modules/product-management/command/deleteProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductCategory.test.ts +74 -0
- package/src/modules/product-management/command/deleteProductCategory.ts +53 -0
- package/src/modules/product-management/command/generateVariants.generated.ts +6 -0
- package/src/modules/product-management/command/generateVariants.test.ts +365 -0
- package/src/modules/product-management/command/generateVariants.ts +168 -0
- package/src/modules/product-management/command/moveProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/moveProductCategory.test.ts +170 -0
- package/src/modules/product-management/command/moveProductCategory.ts +124 -0
- package/src/modules/product-management/command/reactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/reactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/reactivateProduct.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.generated.ts +6 -0
- package/src/modules/product-management/command/removeProductFromCategory.test.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.ts +32 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +6 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +206 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +102 -0
- package/src/modules/product-management/command/updateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/updateProduct.test.ts +168 -0
- package/src/modules/product-management/command/updateProduct.ts +95 -0
- package/src/modules/product-management/command/updateProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttribute.test.ts +101 -0
- package/src/modules/product-management/command/updateProductAttribute.ts +68 -0
- package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttributeValue.test.ts +80 -0
- package/src/modules/product-management/command/updateProductAttributeValue.ts +58 -0
- package/src/modules/product-management/command/updateProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductCategory.test.ts +80 -0
- package/src/modules/product-management/command/updateProductCategory.ts +66 -0
- package/src/modules/product-management/db/product.ts +47 -0
- package/src/modules/product-management/db/productAttribute.ts +26 -0
- package/src/modules/product-management/db/productAttributeAssignment.ts +58 -0
- package/src/modules/product-management/db/productAttributeValue.ts +39 -0
- package/src/modules/product-management/db/productCategory.ts +34 -0
- package/src/modules/product-management/db/productCategoryAssignment.ts +49 -0
- package/src/modules/product-management/db/productVariant.ts +52 -0
- package/src/modules/product-management/docs/commands/ActivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/AssignProductToCategory.md +43 -0
- package/src/modules/product-management/docs/commands/CreateProduct.md +48 -0
- package/src/modules/product-management/docs/commands/CreateProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/CreateProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/CreateProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/DeactivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProduct.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductCategory.md +43 -0
- package/src/modules/product-management/docs/commands/GenerateVariants.md +68 -0
- package/src/modules/product-management/docs/commands/MoveProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/ReactivateProduct.md +38 -0
- package/src/modules/product-management/docs/commands/RemoveProductFromCategory.md +34 -0
- package/src/modules/product-management/docs/commands/SetProductAttributeAssignment.md +62 -0
- package/src/modules/product-management/docs/commands/UpdateProduct.md +61 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +46 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttributeValue.md +47 -0
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +46 -0
- package/src/modules/product-management/docs/features/attribute-management.md +48 -0
- package/src/modules/product-management/docs/features/product-category.md +71 -0
- package/src/modules/product-management/docs/features/product-lifecycle.md +66 -0
- package/src/modules/product-management/docs/features/variant-generation.md +77 -0
- package/src/modules/product-management/docs/models/Product.md +58 -0
- package/src/modules/product-management/docs/models/ProductAttribute.md +37 -0
- package/src/modules/product-management/docs/models/ProductAttributeAssignment.md +41 -0
- package/src/modules/product-management/docs/models/ProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/models/ProductCategory.md +46 -0
- package/src/modules/product-management/docs/models/ProductCategoryAssignment.md +37 -0
- package/src/modules/product-management/docs/models/ProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/CalculateCategoryDepth.md +47 -0
- package/src/modules/product-management/docs/queries/DetectCategoryCircularReference.md +51 -0
- package/src/modules/product-management/docs/queries/GetProduct.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttribute.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/queries/GetProductCategory.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductCategoryAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/ListAttributeAssignmentsByAttribute.md +34 -0
- package/src/modules/product-management/docs/queries/ListCategoryAssignmentsByProduct.md +35 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeValues.md +36 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryChildren.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductVariants.md +34 -0
- package/src/modules/product-management/generated/enums.ts +9 -0
- package/src/modules/product-management/generated/kysely-tailordb.ts +100 -0
- package/src/modules/product-management/index.ts +2 -0
- package/src/modules/product-management/lib/_db_deps.ts +17 -0
- package/src/modules/product-management/lib/errors.generated.ts +152 -0
- package/src/modules/product-management/lib/permissions.generated.ts +25 -0
- package/src/modules/product-management/lib/types.ts +51 -0
- package/src/modules/product-management/module.ts +201 -0
- package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +5 -0
- package/src/modules/product-management/query/calculateCategoryDepth.test.ts +72 -0
- package/src/modules/product-management/query/calculateCategoryDepth.ts +37 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +5 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.test.ts +72 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.ts +44 -0
- package/src/modules/product-management/query/getProduct.generated.ts +5 -0
- package/src/modules/product-management/query/getProduct.test.ts +59 -0
- package/src/modules/product-management/query/getProduct.ts +18 -0
- package/src/modules/product-management/query/getProductAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttribute.test.ts +59 -0
- package/src/modules/product-management/query/getProductAttribute.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeValue.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeValue.test.ts +31 -0
- package/src/modules/product-management/query/getProductAttributeValue.ts +16 -0
- package/src/modules/product-management/query/getProductCategory.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategory.test.ts +59 -0
- package/src/modules/product-management/query/getProductCategory.ts +18 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductVariant.generated.ts +5 -0
- package/src/modules/product-management/query/getProductVariant.test.ts +43 -0
- package/src/modules/product-management/query/getProductVariant.ts +20 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.test.ts +31 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +16 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +5 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.test.ts +31 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeValues.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeValues.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeValues.ts +17 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryChildren.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryChildren.ts +16 -0
- package/src/modules/product-management/query/listProductVariants.generated.ts +5 -0
- package/src/modules/product-management/query/listProductVariants.test.ts +31 -0
- package/src/modules/product-management/query/listProductVariants.ts +16 -0
- package/src/modules/product-management/tailor.config.ts +13 -0
- package/src/modules/product-management/tailor.d.ts +13 -0
- package/src/modules/product-management/testing/fixtures.ts +151 -0
- package/src/modules/user-management/README.md +9 -3
- package/src/modules/user-management/command/activateUser.generated.ts +1 -1
- package/src/modules/user-management/command/activateUser.test.ts +12 -65
- package/src/modules/user-management/command/activateUser.ts +5 -20
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.test.ts +25 -60
- package/src/modules/user-management/command/assignPermissionToRole.ts +5 -24
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.test.ts +35 -87
- package/src/modules/user-management/command/assignRoleToUser.ts +5 -24
- package/src/modules/user-management/command/createPermission.generated.ts +1 -1
- package/src/modules/user-management/command/createPermission.test.ts +23 -33
- package/src/modules/user-management/command/createPermission.ts +4 -5
- package/src/modules/user-management/command/createRole.generated.ts +1 -1
- package/src/modules/user-management/command/createRole.test.ts +17 -27
- package/src/modules/user-management/command/createRole.ts +4 -5
- package/src/modules/user-management/command/createUser.generated.ts +1 -1
- package/src/modules/user-management/command/createUser.test.ts +31 -118
- package/src/modules/user-management/command/createUser.ts +7 -25
- package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.test.ts +12 -65
- package/src/modules/user-management/command/deactivateUser.ts +6 -21
- package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.test.ts +13 -66
- package/src/modules/user-management/command/reactivateUser.ts +5 -20
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.test.ts +24 -62
- package/src/modules/user-management/command/revokePermissionFromRole.ts +5 -24
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.test.ts +24 -60
- package/src/modules/user-management/command/revokeRoleFromUser.ts +5 -24
- package/src/modules/user-management/docs/commands/ActivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/AssignPermissionToRole.md +7 -0
- package/src/modules/user-management/docs/commands/AssignRoleToUser.md +9 -0
- package/src/modules/user-management/docs/commands/CreatePermission.md +12 -0
- package/src/modules/user-management/docs/commands/CreateRole.md +9 -0
- package/src/modules/user-management/docs/commands/CreateUser.md +11 -0
- package/src/modules/user-management/docs/commands/DeactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/ReactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/RevokePermissionFromRole.md +7 -0
- package/src/modules/user-management/docs/commands/RevokeRoleFromUser.md +7 -0
- package/src/modules/user-management/index.ts +0 -30
- package/src/modules/user-management/lib/errors.generated.ts +14 -14
- package/src/modules/user-management/lib/permissions.generated.ts +1 -2
- package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -3
- package/src/modules/user-management/lib/types.ts +1 -1
- package/src/modules/user-management/module.ts +2 -7
- package/src/modules/user-management/tailor.config.ts +6 -4
- package/src/modules/user-management/tailor.d.ts +13 -0
- package/src/modules/user-management/testing/fixtures.ts +1 -20
- package/src/schemas.ts +1 -1
- package/src/{modules/shared → shared}/defineCommand.test.ts +23 -7
- package/src/{modules/shared → shared}/defineCommand.ts +19 -10
- package/src/{modules/shared/internal.ts → shared/index.ts} +9 -1
- package/src/shared/pagination.test.ts +43 -0
- package/src/shared/pagination.ts +22 -0
- package/src/{modules/shared → shared}/types.ts +13 -0
- package/src/{modules/testing → testing}/index.ts +14 -7
- package/src/testing.ts +1 -1
- package/src/util.ts +8 -0
- package/templates/config/license.config.json +4 -0
- package/templates/scaffold/app/backend/.env.example +1 -0
- package/templates/scaffold/app/backend/__dot__gitignore +4 -0
- package/templates/scaffold/app/backend/eslint.config.js +32 -0
- package/templates/scaffold/app/backend/package.json +31 -0
- package/templates/scaffold/app/backend/seed/data/AuditEvent.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/_User.schema.ts +30 -0
- package/templates/scaffold/app/backend/seed/exec.mjs +659 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +3 -0
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +3 -0
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +83 -0
- package/templates/scaffold/app/backend/src/modules.ts +9 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +46 -0
- package/templates/scaffold/app/backend/tailor.config.ts +68 -0
- package/templates/scaffold/app/backend/tailor.d.ts +15 -0
- package/templates/scaffold/app/backend/tsconfig.json +19 -0
- package/templates/scaffold/app/docs/actors/.gitkeep +0 -0
- package/templates/scaffold/app/docs/business-flow/.gitkeep +0 -0
- package/templates/scaffold/app/docs/resolver/.gitkeep +0 -0
- package/templates/scaffold/app/docs/screen/.gitkeep +0 -0
- package/templates/scaffold/app/frontend/.env.example +2 -0
- package/templates/scaffold/app/frontend/__dot__gitignore +3 -0
- package/templates/scaffold/app/frontend/components.json +23 -0
- package/templates/scaffold/app/frontend/eslint.config.js +48 -0
- package/templates/scaffold/app/frontend/index.html +13 -0
- package/templates/scaffold/app/frontend/package.json +53 -0
- package/templates/scaffold/app/frontend/scripts/generate-graphql.mjs +6 -0
- package/templates/scaffold/app/frontend/src/App.tsx +58 -0
- package/templates/scaffold/app/frontend/src/components/composed/empty-state.tsx +26 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +28 -0
- package/templates/scaffold/app/frontend/src/components/composed/loading.tsx +13 -0
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +39 -0
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +60 -0
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +75 -0
- package/templates/scaffold/app/frontend/src/components/ui/form.tsx +152 -0
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/label.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/spinner.tsx +16 -0
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +103 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1235 -0
- package/templates/scaffold/app/frontend/src/graphql/index.ts +15 -0
- package/templates/scaffold/app/frontend/src/index.css +5 -0
- package/templates/scaffold/app/frontend/src/lib/auth-client.ts +17 -0
- package/templates/scaffold/app/frontend/src/lib/utils.ts +6 -0
- package/templates/scaffold/app/frontend/src/main.tsx +10 -0
- package/templates/scaffold/app/frontend/src/pages/page.tsx +20 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +97 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +58 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +101 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +99 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +61 -0
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +21 -0
- package/templates/scaffold/app/frontend/tsconfig.app.json +35 -0
- package/templates/scaffold/app/frontend/tsconfig.json +16 -0
- package/templates/scaffold/app/frontend/tsconfig.node.json +23 -0
- package/templates/scaffold/app/frontend/vite.config.ts +23 -0
- package/templates/scaffold/module/command/.gitkeep +0 -0
- package/templates/scaffold/module/db/.gitkeep +0 -0
- package/templates/scaffold/module/executor/.gitkeep +0 -0
- package/templates/scaffold/module/generated/.gitkeep +0 -0
- package/templates/scaffold/module/index.ts +2 -0
- package/templates/scaffold/module/lib/errors.ts +1 -0
- package/templates/scaffold/module/lib/types.ts +4 -0
- package/templates/scaffold/module/module.ts +7 -0
- package/templates/scaffold/module/permissions.ts +3 -0
- package/templates/scaffold/module/query/.gitkeep +0 -0
- package/templates/scaffold/module/tailor.config.ts +13 -0
- package/templates/scaffold/module/testing/fixtures.ts +1 -0
- package/templates/workflows/erp-kit-check.yml +37 -0
- package/dist/cli.js +0 -1654
- package/skills/erp-kit-app-2-breakdown/SKILL.md +0 -88
- package/skills/erp-kit-app-3-doc-review/SKILL.md +0 -112
- package/skills/erp-kit-app-4-impl-spec/SKILL.md +0 -116
- package/skills/erp-kit-app-5-implementation/references/backend.md +0 -232
- package/skills/erp-kit-module-1-docs/SKILL.md +0 -111
- package/skills/erp-kit-module-2-feature-breakdown/SKILL.md +0 -76
- package/skills/erp-kit-module-3-doc-review/SKILL.md +0 -294
- package/skills/erp-kit-module-4-tdd/SKILL.md +0 -94
- package/skills/erp-kit-module-4-tdd/references/exports.md +0 -8
- package/skills/erp-kit-module-5-impl-review/SKILL.md +0 -410
- package/src/commands/scaffold-templates.ts +0 -65
- package/src/modules/shared/index.ts +0 -1
- package/src/modules/user-management/command/logAuditEvent.generated.ts +0 -6
- package/src/modules/user-management/command/logAuditEvent.test.ts +0 -187
- package/src/modules/user-management/command/logAuditEvent.ts +0 -56
- package/src/modules/user-management/db/auditEvent.ts +0 -47
- package/src/modules/user-management/docs/commands/LogAuditEvent.md +0 -37
- package/src/modules/user-management/docs/features/audit-trail.md +0 -80
- package/src/modules/user-management/docs/models/AuditEvent.md +0 -36
- /package/skills/{erp-kit-module-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/cross-module-dependency.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/db-relations.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/models.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/commands.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/testing.md +0 -0
- /package/src/modules/{product-management → audit}/.gitkeep +0 -0
- /package/src/{modules/shared → shared}/createContext.test.ts +0 -0
- /package/src/{modules/shared → shared}/createContext.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.test.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.test.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.ts +0 -0
- /package/src/{modules/shared → shared}/entityTypes.ts +0 -0
- /package/src/{modules/shared → shared}/errors.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.test.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.ts +0 -0
- /package/src/{modules/shared → shared}/result.ts +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Parity Report Format
|
|
2
|
+
|
|
3
|
+
All parity check agents return results in this JSON structure.
|
|
4
|
+
|
|
5
|
+
## Schema
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"check_type": "<one of: business-flow-story-parity, actor-flow-parity, story-screen-parity, story-resolver-parity, orphan-detection>",
|
|
10
|
+
"app": "<app-name>",
|
|
11
|
+
"gaps": [
|
|
12
|
+
{
|
|
13
|
+
"source": "<source doc path>",
|
|
14
|
+
"target": "<target doc path or 'missing'>",
|
|
15
|
+
"check": "<check_id from the agent's parity checks table>",
|
|
16
|
+
"status": "pass | fail | skip",
|
|
17
|
+
"detail": "<human-readable description of the finding>"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"inconsistencies": [
|
|
21
|
+
{
|
|
22
|
+
"type": "<inconsistency type, e.g. link_mismatch>",
|
|
23
|
+
"location": "<source vs target description>",
|
|
24
|
+
"detail": "<human-readable description>"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"summary": {
|
|
28
|
+
"total_checks": 0,
|
|
29
|
+
"passed": 0,
|
|
30
|
+
"failed": 0,
|
|
31
|
+
"skipped": 0
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Field Reference
|
|
37
|
+
|
|
38
|
+
### gaps[]
|
|
39
|
+
|
|
40
|
+
One entry per parity check performed. `status` is:
|
|
41
|
+
|
|
42
|
+
- `pass`: source and target are consistent
|
|
43
|
+
- `fail`: gap or mismatch found
|
|
44
|
+
- `skip`: target docs missing or empty, check could not run
|
|
45
|
+
|
|
46
|
+
### inconsistencies[]
|
|
47
|
+
|
|
48
|
+
Cross-cutting issues found during the check that don't fit a single gap entry (e.g., link format violations, naming mismatches across multiple docs).
|
|
49
|
+
|
|
50
|
+
### summary
|
|
51
|
+
|
|
52
|
+
Aggregate counts. `total_checks = passed + failed + skipped`.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Story → Resolver Parity Check
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
App: {{APP_NAME}}
|
|
6
|
+
Story docs: {{STORY_DOCS}}
|
|
7
|
+
Resolver docs: {{RESOLVER_DOCS}}
|
|
8
|
+
|
|
9
|
+
## Instructions
|
|
10
|
+
|
|
11
|
+
1. Read ALL story docs at the paths above
|
|
12
|
+
2. Read ALL resolver docs at the paths above
|
|
13
|
+
3. For each story, check resolver coverage
|
|
14
|
+
4. Return results as JSON per the Output Format section
|
|
15
|
+
|
|
16
|
+
## Extraction: Story Docs
|
|
17
|
+
|
|
18
|
+
From each story doc, extract:
|
|
19
|
+
|
|
20
|
+
- Story name (from filename or heading)
|
|
21
|
+
- Resolver section content:
|
|
22
|
+
- `None` → read-only story, skip resolver checks
|
|
23
|
+
- `- TBD` → story needs resolvers but none documented yet (fail)
|
|
24
|
+
- Resolver links (format: `../../../resolver/<name>.md`) → verify they exist
|
|
25
|
+
- Operations described that imply mutations (create, update, delete, submit, approve, etc.)
|
|
26
|
+
|
|
27
|
+
## Extraction: Resolver Docs
|
|
28
|
+
|
|
29
|
+
From each resolver doc, extract:
|
|
30
|
+
|
|
31
|
+
- Resolver name (from filename or heading)
|
|
32
|
+
- Type: Mutation or Query
|
|
33
|
+
- Module and command it calls
|
|
34
|
+
- Input parameters and error scenarios
|
|
35
|
+
|
|
36
|
+
## Parity Checks
|
|
37
|
+
|
|
38
|
+
For each story:
|
|
39
|
+
|
|
40
|
+
| Check ID | Question |
|
|
41
|
+
| ------------------ | ------------------------------------------------------------------------ |
|
|
42
|
+
| resolver_existence | Do all resolver links in the story resolve to existing docs? |
|
|
43
|
+
| resolver_coverage | Does every non-read-only story have at least one resolver? |
|
|
44
|
+
| resolver_tbd | Are there stories still showing `- TBD` for resolvers? |
|
|
45
|
+
| link_validity | Do resolver links in the story resolve to real files? |
|
|
46
|
+
| operation_coverage | Do story operations (create/update/delete) have matching resolver types? |
|
|
47
|
+
|
|
48
|
+
### How to Check
|
|
49
|
+
|
|
50
|
+
1. Read each story's `## Resolvers` section
|
|
51
|
+
2. If `None` → skip (read-only story)
|
|
52
|
+
3. If `- TBD` → fail: resolver docs not yet created
|
|
53
|
+
4. If links present → verify each link resolves to a file in RESOLVER_DOCS
|
|
54
|
+
5. Cross-check story operations against resolver types (mutation for writes, query for reads)
|
|
55
|
+
|
|
56
|
+
## Link Format Reference
|
|
57
|
+
|
|
58
|
+
| From | To | Format |
|
|
59
|
+
| ----- | -------- | ----------------------------- |
|
|
60
|
+
| Story | Resolver | `../../../resolver/<name>.md` |
|
|
61
|
+
|
|
62
|
+
## Common Gap Patterns
|
|
63
|
+
|
|
64
|
+
- **TBD resolvers**: Story still has placeholder `- TBD` instead of resolver links
|
|
65
|
+
- **Missing resolver docs**: Story links to a resolver that has no doc
|
|
66
|
+
- **Operation mismatch**: Story describes a create operation but no create resolver exists
|
|
67
|
+
- **Orphaned resolvers**: Resolver doc exists but no story links to it (covered by orphan detection)
|
|
68
|
+
|
|
69
|
+
## Output Format
|
|
70
|
+
|
|
71
|
+
Return a JSON object:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"check_type": "story-resolver-parity",
|
|
76
|
+
"app": "{{APP_NAME}}",
|
|
77
|
+
"gaps": [...],
|
|
78
|
+
"inconsistencies": [...],
|
|
79
|
+
"summary": { "total_checks": N, "passed": N, "failed": N, "skipped": N }
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
See [parity-report-format.md](parity-report-format.md) for field definitions.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Story → Screen Parity Check
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
App: {{APP_NAME}}
|
|
6
|
+
Story docs: {{STORY_DOCS}}
|
|
7
|
+
Screen docs: {{SCREEN_DOCS}}
|
|
8
|
+
|
|
9
|
+
## Instructions
|
|
10
|
+
|
|
11
|
+
1. Read ALL story docs at the paths above
|
|
12
|
+
2. Read ALL screen docs at the paths above
|
|
13
|
+
3. For each story, extract referenced screens
|
|
14
|
+
4. Run every parity check below against each story
|
|
15
|
+
5. Return results as JSON per the Output Format section
|
|
16
|
+
|
|
17
|
+
## Extraction: Story Docs
|
|
18
|
+
|
|
19
|
+
From each story doc, extract:
|
|
20
|
+
|
|
21
|
+
- Story name (from filename or heading)
|
|
22
|
+
- All screen references (format: `../../../screen/<screen>.md`)
|
|
23
|
+
- UI interactions described that imply screen usage
|
|
24
|
+
|
|
25
|
+
## Extraction: Screen Docs
|
|
26
|
+
|
|
27
|
+
From each screen doc, extract:
|
|
28
|
+
|
|
29
|
+
- Screen name (from filename or heading)
|
|
30
|
+
- Screen type and UI components described
|
|
31
|
+
|
|
32
|
+
## Parity Checks
|
|
33
|
+
|
|
34
|
+
For each story's screen references:
|
|
35
|
+
|
|
36
|
+
| Check ID | Question |
|
|
37
|
+
| ---------------- | --------------------------------------------------- |
|
|
38
|
+
| screen_existence | Do all screens referenced in the story exist? |
|
|
39
|
+
| link_validity | Do screen links in the story resolve to real files? |
|
|
40
|
+
|
|
41
|
+
### How to Check
|
|
42
|
+
|
|
43
|
+
1. List all screen references from each story doc
|
|
44
|
+
2. Verify a corresponding screen doc exists for each reference
|
|
45
|
+
3. Validate that all `../../../screen/<screen>.md` links resolve to actual files in SCREEN_DOCS
|
|
46
|
+
|
|
47
|
+
## Link Format Reference
|
|
48
|
+
|
|
49
|
+
| From | To | Format |
|
|
50
|
+
| ----- | ------ | ----------------------------- |
|
|
51
|
+
| Story | Screen | `../../../screen/<screen>.md` |
|
|
52
|
+
|
|
53
|
+
## Common Gap Patterns
|
|
54
|
+
|
|
55
|
+
- **Missing screen docs**: Story references a screen that has no doc
|
|
56
|
+
- **Broken screen links**: Story links to a screen file that does not exist
|
|
57
|
+
- **Implicit screens**: Story describes UI interaction but has no explicit screen link
|
|
58
|
+
|
|
59
|
+
## Output Format
|
|
60
|
+
|
|
61
|
+
Return a JSON object:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"check_type": "story-screen-parity",
|
|
66
|
+
"app": "{{APP_NAME}}",
|
|
67
|
+
"gaps": [...],
|
|
68
|
+
"inconsistencies": [...],
|
|
69
|
+
"summary": { "total_checks": N, "passed": N, "failed": N, "skipped": N }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
See [parity-report-format.md](parity-report-format.md) for field definitions.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: erp-kit-app-5-
|
|
3
|
-
description: Implement backend
|
|
2
|
+
name: erp-kit-app-5-impl-backend
|
|
3
|
+
description: Implement backend code for app-compose applications using erp-kit modules. Use after completing plan review with erp-kit-app-4-plan-review. Triggers when implementing backend resolvers, wiring modules, configuring applications, or when the user mentions implementing backend, writing resolvers, or connecting erp-kit modules.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# App-Compose Implementation
|
|
6
|
+
# App-Compose Backend Implementation
|
|
7
7
|
|
|
8
|
-
Implement backend resolvers and
|
|
8
|
+
Implement backend resolvers and application configuration for an app-compose application, driven by Tier 1-4 documentation (actors, business flows, stories, screens, resolvers).
|
|
9
9
|
|
|
10
10
|
## When to Use
|
|
11
11
|
|
|
12
12
|
- Implementing backend resolvers from resolver spec docs
|
|
13
|
-
- Creating frontend pages from screen spec docs
|
|
14
13
|
- Wiring erp-kit modules into an application
|
|
15
|
-
-
|
|
14
|
+
- Configuring the Tailor application (auth, DB, resolvers)
|
|
15
|
+
- Deploying the backend for frontend schema generation
|
|
16
16
|
|
|
17
17
|
## Prerequisites
|
|
18
18
|
|
|
@@ -27,7 +27,7 @@ All four tiers of documentation must exist:
|
|
|
27
27
|
## Workflow
|
|
28
28
|
|
|
29
29
|
```
|
|
30
|
-
ANALYZE DOCS →
|
|
30
|
+
ANALYZE DOCS → MODULE WIRING → CONFIG → RESOLVERS → GENERATED FILES → VERIFY → DEPLOY
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
### Phase 1: Analyze Documentation
|
|
@@ -47,19 +47,11 @@ Classify resolvers into two categories:
|
|
|
47
47
|
|
|
48
48
|
Prefer built-in queries over custom resolvers for list/get operations where possible.
|
|
49
49
|
|
|
50
|
-
### Phase 2:
|
|
51
|
-
|
|
52
|
-
Set up the backend project structure and config files.
|
|
53
|
-
|
|
54
|
-
**Read [backend reference](references/backend.md) § "Backend Scaffold" for the directory structure and boilerplate.**
|
|
55
|
-
|
|
56
|
-
Key files: `package.json` (dependencies, scripts), `tsconfig.json` (path alias, types), `eslint.config.js`.
|
|
57
|
-
|
|
58
|
-
### Phase 3: Wire Modules (`src/modules.ts`)
|
|
50
|
+
### Phase 2: Wire Modules (`src/modules.ts`)
|
|
59
51
|
|
|
60
52
|
Create the module wiring file that composes all required erp-kit modules.
|
|
61
53
|
|
|
62
|
-
**Read [
|
|
54
|
+
**Read [module wiring reference](references/module-wiring.md) for the composition pattern.**
|
|
63
55
|
|
|
64
56
|
Key points:
|
|
65
57
|
|
|
@@ -67,9 +59,9 @@ Key points:
|
|
|
67
59
|
- Pass inter-module dependencies explicitly (e.g., item-management needs primitives' unit type and query)
|
|
68
60
|
- Export `db`, `commands`, and `executors` for use in resolvers
|
|
69
61
|
|
|
70
|
-
### Phase
|
|
62
|
+
### Phase 3: Configure Application (`tailor.config.ts`)
|
|
71
63
|
|
|
72
|
-
**Read [
|
|
64
|
+
**Read [application config reference](references/app-config.md) for the config pattern.**
|
|
73
65
|
|
|
74
66
|
Key points:
|
|
75
67
|
|
|
@@ -78,20 +70,28 @@ Key points:
|
|
|
78
70
|
- Auth with OAuth2, DPoP, and user profile mapping
|
|
79
71
|
- Generators for Kysely types and seed data
|
|
80
72
|
|
|
81
|
-
### Phase
|
|
73
|
+
### Phase 4: Implement Backend Resolvers and Executors
|
|
82
74
|
|
|
83
75
|
Write one file per resolver under `src/modules/<module-name>/resolvers/`, one per executor under `executors/`.
|
|
84
76
|
|
|
85
|
-
**Read [
|
|
77
|
+
**Read [resolver & executor patterns reference](references/resolver-patterns.md).**
|
|
86
78
|
|
|
87
79
|
Do not directly mutate module-owned tables via Kysely — always use module commands.
|
|
88
80
|
|
|
89
|
-
### Phase
|
|
81
|
+
### Phase 5: Generated Files
|
|
90
82
|
|
|
91
83
|
- **Kysely types** (`src/generated/kysely-tailordb.ts`) — Auto-generated by `pnpm generate` after deployment. Before deployment, create a minimal placeholder so the codebase typechecks.
|
|
92
84
|
- **Seed data** (`seed/`) — `exec.mjs` runner + `data/*.jsonl` (records) and `data/*.schema.ts` (validation). Create seed records for initial data (permissions, roles, test users, etc.). Seeded users must have concrete permission keys required by the wired modules.
|
|
93
85
|
|
|
94
|
-
### Phase
|
|
86
|
+
### Phase 6: Verify
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
cd <app-root>/backend
|
|
90
|
+
pnpm lint
|
|
91
|
+
pnpm typecheck
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Phase 7: Deploy Backend & Next Steps
|
|
95
95
|
|
|
96
96
|
Frontend implementation requires a deployed backend (for GraphQL schema generation). Prompt the user to:
|
|
97
97
|
|
|
@@ -102,48 +102,4 @@ Frontend implementation requires a deployed backend (for GraphQL schema generati
|
|
|
102
102
|
|
|
103
103
|
Wait for the user to confirm deployment is complete before proceeding.
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
Set up the frontend project structure, config files, and generate GraphQL schema.
|
|
108
|
-
|
|
109
|
-
**Read [frontend reference](references/frontend.md) § "Frontend Scaffold" for the directory structure, boilerplate, and schema generation.**
|
|
110
|
-
|
|
111
|
-
Key files: `package.json`, `tsconfig.json`, `vite.config.ts`, `eslint.config.js`, UI components, `scripts/generate-graphql.mjs`. After scaffolding, run `pnpm generate` to fetch the GraphQL schema from the deployed backend.
|
|
112
|
-
|
|
113
|
-
### Phase 9: Implement Frontend Pages
|
|
114
|
-
|
|
115
|
-
Create pages driven by screen spec docs. Each screen type has a standard implementation pattern.
|
|
116
|
-
|
|
117
|
-
**Read [frontend reference](references/frontend.md) § "Frontend Pages" for the full pattern catalog.**
|
|
118
|
-
|
|
119
|
-
Page types and their file structure:
|
|
120
|
-
|
|
121
|
-
| Screen Type | Files |
|
|
122
|
-
| ------------- | ------------------------------------------------------------------------------------------------ |
|
|
123
|
-
| ListView | `page.tsx` + `components/<entity>-table.tsx` |
|
|
124
|
-
| Form (create) | `create/page.tsx` + `create/components/create-<entity>-form.tsx` |
|
|
125
|
-
| Form (edit) | `[id]/edit/page.tsx` + `[id]/edit/components/edit-<entity>-form.tsx` |
|
|
126
|
-
| DetailView | `[id]/page.tsx` + `[id]/components/<entity>-detail.tsx` + `[id]/components/<entity>-actions.tsx` |
|
|
127
|
-
|
|
128
|
-
Key frontend patterns:
|
|
129
|
-
|
|
130
|
-
- **GraphQL fragments** — Each table/form/detail component exports its own fragment; page-level queries compose fragments
|
|
131
|
-
- **gql.tada** — Type-safe GraphQL via `graphql()` from `@/graphql`
|
|
132
|
-
- **React Hook Form + Zod** — Form validation with `zodResolver`
|
|
133
|
-
- **urql** — `useQuery` for reads, `useMutation` for writes
|
|
134
|
-
- **app-shell routing** — `Layout`, `Link`, `useParams`, `useNavigate` from `@tailor-platform/app-shell`
|
|
135
|
-
|
|
136
|
-
### Phase 10: Verify
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
# Backend
|
|
140
|
-
cd <app-root>/backend
|
|
141
|
-
pnpm lint
|
|
142
|
-
pnpm typecheck
|
|
143
|
-
|
|
144
|
-
# Frontend
|
|
145
|
-
cd <app-root>/frontend
|
|
146
|
-
pnpm lint
|
|
147
|
-
pnpm typecheck
|
|
148
|
-
pnpm build
|
|
149
|
-
```
|
|
105
|
+
After deployment is confirmed, proceed to frontend implementation with `/erp-kit-app-6-impl-frontend`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Application Config
|
|
2
|
+
|
|
3
|
+
`tailor.config.ts` defines the Tailor application configuration. Key structure:
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
name: "<app-name>",
|
|
8
|
+
cors: ["http://localhost:5173", website.url],
|
|
9
|
+
db: {
|
|
10
|
+
"main-db": {
|
|
11
|
+
files: [`./src/modules.ts`],
|
|
12
|
+
gqlOperations: "query",
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
resolver: {
|
|
16
|
+
"main-resolver": { files: [`./src/modules/**/resolvers/**/*.ts`] },
|
|
17
|
+
},
|
|
18
|
+
executor: { files: [`./src/modules/**/executors/**/*.ts`] },
|
|
19
|
+
auth: auth,
|
|
20
|
+
idp: [idp],
|
|
21
|
+
staticWebsites: [website],
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Key points:
|
|
26
|
+
|
|
27
|
+
- `gqlOperations: "query"` — Auto-generates list/get GraphQL queries for all DB types
|
|
28
|
+
- Glob patterns for resolver/executor discovery
|
|
29
|
+
- See [SDK configuration docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/configuration.md) for full config options
|
|
30
|
+
|
|
31
|
+
## Auth configuration
|
|
32
|
+
|
|
33
|
+
- Define IdP (`defineIdp`), Auth (`defineAuth`), and static website (`defineStaticWebSite`) using Tailor SDK
|
|
34
|
+
- Prefer stable default naming: auth `default`, IdP `default`, OAuth2 client `default`
|
|
35
|
+
- `userProfile.type` must reference the `user` DB type from `modules.ts`
|
|
36
|
+
- `userProfile.usernameField`: stable unique field (e.g., `email`)
|
|
37
|
+
- Include static website URL and localhost in CORS: `cors: ["http://localhost:5173", website.url]`
|
|
38
|
+
- Frontend `VITE_TAILOR_CLIENT_ID` must come from `tailor-sdk oauth2client get default --json` — do not hardcode
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Module Wiring
|
|
2
|
+
|
|
3
|
+
`src/modules.ts` composes erp-kit modules and exports their parts for resolver use.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { db as field } from "@tailor-platform/sdk";
|
|
7
|
+
import {
|
|
8
|
+
definePrimitivesModule,
|
|
9
|
+
defineUserManagementModule,
|
|
10
|
+
defineItemManagementModule,
|
|
11
|
+
} from "@tailor-platform/erp-kit/module";
|
|
12
|
+
|
|
13
|
+
const primitivesModules = definePrimitivesModule({});
|
|
14
|
+
|
|
15
|
+
const umModules = defineUserManagementModule({
|
|
16
|
+
dbNamespace: "main-db",
|
|
17
|
+
user: {
|
|
18
|
+
fields: {
|
|
19
|
+
/* custom fields */
|
|
20
|
+
},
|
|
21
|
+
additionalStatuses: ["SUSPENDED"],
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Pass inter-module dependencies explicitly
|
|
26
|
+
const imModules = defineItemManagementModule({
|
|
27
|
+
primitives: {
|
|
28
|
+
db: { unit: primitivesModules.db.unit },
|
|
29
|
+
queries: { getUnit: primitivesModules.queries.getUnit },
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Destructure db into individual table exports (required for DB scanner)
|
|
34
|
+
export const { db: primitivesDb, commands: primitivesCommands } = primitivesModules;
|
|
35
|
+
export const { uomCategory, unit, currency, exchangeRate } = primitivesDb;
|
|
36
|
+
|
|
37
|
+
export const { db: umDb, executors: umExecutors, commands: umCommands } = umModules;
|
|
38
|
+
export const { user, permission, role, userRole, rolePermission, auditEvent } = umDb;
|
|
39
|
+
|
|
40
|
+
export const { db: imDb, commands: imCommands } = imModules;
|
|
41
|
+
export const { item, taxonomyNode, itemTaxonomyAssignment } = imDb;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Key conventions:
|
|
45
|
+
|
|
46
|
+
- Prefix exports to avoid collisions (`umCommands`, `imCommands`, `primitivesCommands`)
|
|
47
|
+
- Every module's `db` must be destructured into individual table exports — the DB scanner only picks up named exports
|
|
48
|
+
- Extract individual executors for re-export in executor files
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Resolver & Executor Patterns
|
|
2
|
+
|
|
3
|
+
## Resolver Patterns
|
|
4
|
+
|
|
5
|
+
All resolvers export a default `createResolver()` from `@tailor-platform/sdk`.
|
|
6
|
+
|
|
7
|
+
### Verify command input types
|
|
8
|
+
|
|
9
|
+
Before implementing a resolver, read the command's type definition:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
node_modules/@tailor-platform/erp-kit/src/modules/<module>/command/<commandName>.ts
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The command source is the ground truth. Do not invent fields that don't exist, and preserve the required/optional distinction.
|
|
16
|
+
|
|
17
|
+
### SDK type system
|
|
18
|
+
|
|
19
|
+
See [Resolver docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/services/resolver.md) for the `t` namespace.
|
|
20
|
+
|
|
21
|
+
`t.array()` and `t.boolean()` do **not exist**. Never attempt to use them.
|
|
22
|
+
|
|
23
|
+
### Command-based mutation
|
|
24
|
+
|
|
25
|
+
The most common pattern. Key points:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { createContext } from "@tailor-platform/erp-kit/app";
|
|
29
|
+
|
|
30
|
+
body: async (context) => {
|
|
31
|
+
const db = getDB("main-db");
|
|
32
|
+
const result = await imCommands.createItem(db, { ...context.input }, createContext(context));
|
|
33
|
+
if (!result.ok) throw result.error;
|
|
34
|
+
return { id: result.value.item.id, ... };
|
|
35
|
+
},
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- `context.input.optionalField ?? undefined` — Convert null to undefined for command inputs
|
|
39
|
+
- `result.value.entity.nullableField ?? ""` — Handle nullable return values
|
|
40
|
+
- `createContext(context)` wraps the resolver context for erp-kit commands
|
|
41
|
+
- `getDB("main-db")` — Namespace must match `tailor.config.ts`
|
|
42
|
+
|
|
43
|
+
### Error handling
|
|
44
|
+
|
|
45
|
+
When the resolver spec documents specific error codes, use `result.error.code` to switch:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
if (!result.ok) {
|
|
49
|
+
switch (result.error.code) {
|
|
50
|
+
case "USER_NOT_FOUND":
|
|
51
|
+
throw new Error(`User ${context.input.userId} not found`);
|
|
52
|
+
// ...
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Do not directly mutate module-owned tables via Kysely — always use module commands.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Executor Patterns
|
|
62
|
+
|
|
63
|
+
Executors re-export module-provided event handlers. One file per executor, no custom logic:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { rolePermissionCreated } from "@/modules";
|
|
67
|
+
export default rolePermissionCreated;
|
|
68
|
+
```
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: erp-kit-app-6-impl-frontend
|
|
3
|
+
description: Implement frontend code for app-compose applications. Use after deploying the backend with erp-kit-app-5-impl-backend. Triggers when implementing frontend pages, creating React components from screen specs, or when the user mentions implementing frontend, creating pages, or building UI for an app-compose application.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# App-Compose Frontend Implementation
|
|
7
|
+
|
|
8
|
+
Implement frontend pages for an app-compose application, driven by screen spec documentation and a deployed backend.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
- Implementing frontend pages from screen spec docs
|
|
13
|
+
- Creating React components for ListView, Form, or DetailView screens
|
|
14
|
+
- Building the frontend UI for an app-compose application after backend deployment
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
- Deployed backend (from `erp-kit-app-5-impl-backend`)
|
|
19
|
+
- `.env` with `VITE_TAILOR_APP_URL` and `VITE_TAILOR_CLIENT_ID`
|
|
20
|
+
- All four tiers of documentation:
|
|
21
|
+
- `README.md` — Application overview
|
|
22
|
+
- `docs/actors/*.md` — Actor definitions
|
|
23
|
+
- `docs/business-flow/*/README.md` + `story/*.md` — Business flows and user stories
|
|
24
|
+
- `docs/screen/*.md` — Screen specifications (ListView, Form, DetailView)
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
ANALYZE SCREENS → GENERATE GRAPHQL SCHEMA → IMPLEMENT PAGES → VERIFY
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Phase 1: Analyze Screen Documentation
|
|
33
|
+
|
|
34
|
+
Read all screen specs (`docs/screen/*.md`) to build a complete picture:
|
|
35
|
+
|
|
36
|
+
1. **Screen types** — Identify each screen as ListView, Form (create/edit), or DetailView
|
|
37
|
+
2. **Fields and columns** — Map required columns (ListView), form fields (Form), and detail fields (DetailView) from each spec
|
|
38
|
+
3. **Actions** — Identify navigation actions (create, edit, back-to-list) and mutation actions (save, delete, activate/deactivate)
|
|
39
|
+
|
|
40
|
+
### Phase 2: Generate GraphQL Schema
|
|
41
|
+
|
|
42
|
+
Run `pnpm generate` in the frontend directory to fetch the GraphQL schema from the deployed backend.
|
|
43
|
+
|
|
44
|
+
### Phase 3: Implement Frontend Pages
|
|
45
|
+
|
|
46
|
+
Create pages driven by screen spec docs. Each screen type has a standard implementation pattern.
|
|
47
|
+
|
|
48
|
+
**Read [pages reference](references/pages.md) for the full pattern catalog.**
|
|
49
|
+
|
|
50
|
+
Page types and their file structure:
|
|
51
|
+
|
|
52
|
+
| Screen Type | Files |
|
|
53
|
+
| ------------- | ------------------------------------------------------------------------------------------------ |
|
|
54
|
+
| ListView | `page.tsx` + `components/<entity>-table.tsx` |
|
|
55
|
+
| Form (create) | `create/page.tsx` + `create/components/create-<entity>-form.tsx` |
|
|
56
|
+
| Form (edit) | `[id]/edit/page.tsx` + `[id]/edit/components/edit-<entity>-form.tsx` |
|
|
57
|
+
| DetailView | `[id]/page.tsx` + `[id]/components/<entity>-detail.tsx` + `[id]/components/<entity>-actions.tsx` |
|
|
58
|
+
|
|
59
|
+
Key frontend patterns:
|
|
60
|
+
|
|
61
|
+
- **GraphQL fragments** — Each table/form/detail component exports its own fragment; page-level queries compose fragments
|
|
62
|
+
- **gql.tada** — Type-safe GraphQL via `graphql()` from `@/graphql`
|
|
63
|
+
- **React Hook Form + Zod** — Form validation with `zodResolver`
|
|
64
|
+
- **urql** — `useQuery` for reads, `useMutation` for writes
|
|
65
|
+
- **app-shell routing** — `Layout`, `Link`, `useParams`, `useNavigate` from `@tailor-platform/app-shell`
|
|
66
|
+
|
|
67
|
+
### Phase 4: Verify
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd <app-root>/frontend
|
|
71
|
+
pnpm lint
|
|
72
|
+
pnpm typecheck
|
|
73
|
+
pnpm build
|
|
74
|
+
```
|