@tailor-platform/erp-kit 0.2.1 → 0.3.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 +18 -0
- package/README.md +154 -80
- package/dist/cli.mjs +1742 -0
- package/package.json +16 -14
- 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 +22 -11
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +103 -0
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +71 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +74 -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 +154 -0
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +89 -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 +168 -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-impl-backend/SKILL.md +98 -0
- 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-app-shared/SKILL.md +15 -0
- package/skills/erp-kit-app-shared/references/link-format-reference.md +13 -0
- package/skills/erp-kit-app-shared/references/naming-conventions.md +21 -0
- package/skills/erp-kit-app-shared/references/resolver-classification.md +23 -0
- package/skills/erp-kit-app-shared/references/schema-constraints.md +25 -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-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +15 -1
- 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 +120 -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-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +2 -2
- 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 +2 -2
- 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 +13 -10
- package/skills/erp-kit-module-shared/references/queries.md +110 -37
- package/skills/erp-kit-module-shared/references/structure.md +1 -1
- package/skills/erp-kit-module-shared/references/testing.md +10 -0
- package/skills/erp-kit-update/SKILL.md +4 -4
- package/src/app.ts +1 -1
- package/src/commands/app/index.ts +57 -24
- package/src/commands/check.ts +1 -1
- package/src/commands/generate-doc.test.ts +63 -0
- package/src/commands/generate-doc.ts +98 -0
- package/src/commands/index.ts +16 -5
- package/src/commands/init-module.test.ts +43 -0
- package/src/commands/init-module.ts +74 -0
- 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/module/generate.ts +33 -13
- package/src/commands/module/index.ts +18 -28
- package/src/commands/parse-doc-test-cases.ts +55 -0
- 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-boilerplate.test.ts +142 -0
- package/src/generator/generate-code.test.ts +47 -12
- package/src/generator/generate-code.ts +123 -20
- package/src/integration.test.ts +3 -3
- 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/SKILL.md +0 -149
- 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/commands/scaffold.test.ts +0 -171
- package/src/commands/scaffold.ts +0 -140
- 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-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/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
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: erp-kit-app-2-breakdown
|
|
3
|
-
description: Create Tier 3 documentation (stories, screens) by breaking down business flows. Use after completing Tier 1-2 documentation with erp-kit-app-1-requirements.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Requirements Breakdown Workflow
|
|
7
|
-
|
|
8
|
-
Break down Tier 2 business flows into Tier 3 documentation: User Stories and Screens.
|
|
9
|
-
|
|
10
|
-
## Prerequisites
|
|
11
|
-
|
|
12
|
-
Tier 1-2 documentation must exist:
|
|
13
|
-
|
|
14
|
-
- `README.md` (requirements)
|
|
15
|
-
- `docs/actors/*.md` (actor definitions)
|
|
16
|
-
- `docs/business-flow/*/README.md` (business workflows)
|
|
17
|
-
|
|
18
|
-
## Workflow Phases
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
ANALYZE → BREAKDOWN → CREATE → VALIDATE
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Phase 1: Analyze
|
|
25
|
-
|
|
26
|
-
Review existing Tier 2 documentation:
|
|
27
|
-
|
|
28
|
-
1. **Read** all business flow files in `docs/business-flow/`
|
|
29
|
-
2. **Identify** flow steps that represent user actions
|
|
30
|
-
3. **Map** each step to the responsible actor
|
|
31
|
-
4. **Note** data inputs/outputs for each step
|
|
32
|
-
|
|
33
|
-
### Phase 2: Breakdown
|
|
34
|
-
|
|
35
|
-
For each business flow, decompose into stories and screens:
|
|
36
|
-
|
|
37
|
-
| Flow Element | Maps To |
|
|
38
|
-
| ---------------- | ----------- |
|
|
39
|
-
| User action step | Story |
|
|
40
|
-
| UI requirement | Screen |
|
|
41
|
-
| Actor in flow | Story actor |
|
|
42
|
-
|
|
43
|
-
### Phase 3: Create
|
|
44
|
-
|
|
45
|
-
Generate documentation using `erp-kit` CLI:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# Tier 3: Stories
|
|
49
|
-
erp-kit app scaffold story <app> <flow>/<actor>--<story> --root examples
|
|
50
|
-
|
|
51
|
-
# Tier 3: Screens
|
|
52
|
-
erp-kit app scaffold screen <app> <screen-name> --root examples
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Naming conventions:**
|
|
56
|
-
|
|
57
|
-
- Story filename: `<actor>--<story-name>.md` (double-dash separator)
|
|
58
|
-
- Story heading: Title Case of story name (after `--`)
|
|
59
|
-
- Screen filename: kebab-case, noun-focused (e.g., `supplier-list.md`)
|
|
60
|
-
|
|
61
|
-
**After creating stories**, replace `- TBD` placeholders in the `## Stories` section of each business flow README with actual links:
|
|
62
|
-
|
|
63
|
-
```markdown
|
|
64
|
-
- [Story Title](./story/<actor>--<story-name>.md)
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Phase 4: Validate
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
pnpm run app:doc:check
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Schema Reference
|
|
74
|
-
|
|
75
|
-
| Schema | Tier | Output Path |
|
|
76
|
-
| ------------ | ---- | ---------------------------------------------------- |
|
|
77
|
-
| `story.yml` | 3 | `docs/business-flow/<flow>/story/<actor>--<name>.md` |
|
|
78
|
-
| `screen.yml` | 3 | `docs/screen/<name>.md` |
|
|
79
|
-
|
|
80
|
-
## Tips
|
|
81
|
-
|
|
82
|
-
- One business flow typically produces 3-8 stories
|
|
83
|
-
- Stories should be completable in a single user session
|
|
84
|
-
- Screens can be shared across multiple stories
|
|
85
|
-
|
|
86
|
-
## Next Step
|
|
87
|
-
|
|
88
|
-
After completing Tier 3, use `/erp-kit-app-3-doc-review` to validate documentation parity.
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: erp-kit-app-3-doc-review
|
|
3
|
-
description: Review documentation parity between Tier 2 (business flows, actors) and Tier 3 (stories, screens). Use when validating that all business flow steps have corresponding stories, and that screens are properly linked.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Documentation Parity Review Workflow
|
|
7
|
-
|
|
8
|
-
Review **documentation consistency** between Tier 2 and Tier 3 documentation.
|
|
9
|
-
|
|
10
|
-
## Purpose
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
Business Flow (Tier 2) → Stories (Tier 3) → Screens (Tier 3)
|
|
14
|
-
↓ ↓ ↓
|
|
15
|
-
Flow Steps User Actions UI Components
|
|
16
|
-
Actors Involved Scenario Patterns Screen Types
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## When to Use
|
|
20
|
-
|
|
21
|
-
- After writing Tier 3 documentation, check for gaps
|
|
22
|
-
- Before proceeding to Tier 4 (implementation spec)
|
|
23
|
-
- Quality check during documentation review
|
|
24
|
-
|
|
25
|
-
## Workflow
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
READ DOCS → PARITY CHECKS → REPORT
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Step 1: Read All Documentation
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
examples/<app-name>/docs/business-flow/*/README.md # Flows
|
|
35
|
-
examples/<app-name>/docs/business-flow/*/story/*.md # Stories
|
|
36
|
-
examples/<app-name>/docs/screen/*.md # Screens
|
|
37
|
-
examples/<app-name>/docs/actors/*.md # Actors
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Step 2: Parity Checks
|
|
41
|
-
|
|
42
|
-
#### Business Flow → Story
|
|
43
|
-
|
|
44
|
-
| Check | Question |
|
|
45
|
-
| --------------- | ----------------------------------------------- |
|
|
46
|
-
| Story existence | Does each flow step have a corresponding story? |
|
|
47
|
-
| Actor coverage | Are all actors in flow represented in stories? |
|
|
48
|
-
| Link validity | Do story links in flow README resolve? |
|
|
49
|
-
|
|
50
|
-
#### Actor → Business Flow
|
|
51
|
-
|
|
52
|
-
| Check | Question |
|
|
53
|
-
| -------------- | ----------------------------------------- |
|
|
54
|
-
| Flow existence | Do all flows in "Authorized Flows" exist? |
|
|
55
|
-
| Link validity | Do flow links resolve correctly? |
|
|
56
|
-
|
|
57
|
-
#### Story → Screen
|
|
58
|
-
|
|
59
|
-
| Check | Question |
|
|
60
|
-
| ---------------- | ---------------------------------- |
|
|
61
|
-
| Screen existence | Do all screens in story exist? |
|
|
62
|
-
| Link validity | Do screen links resolve correctly? |
|
|
63
|
-
|
|
64
|
-
#### Orphan Detection
|
|
65
|
-
|
|
66
|
-
| Check | Question |
|
|
67
|
-
| -------------- | ------------------------------------------ |
|
|
68
|
-
| Orphan stories | Stories not linked from any business flow? |
|
|
69
|
-
| Orphan screens | Screens not referenced by any story? |
|
|
70
|
-
| Orphan actors | Actors not participating in any flow? |
|
|
71
|
-
|
|
72
|
-
### Step 3: Report
|
|
73
|
-
|
|
74
|
-
```markdown
|
|
75
|
-
## Documentation Parity Review Report
|
|
76
|
-
|
|
77
|
-
**Application:** <app-name>
|
|
78
|
-
|
|
79
|
-
### Summary
|
|
80
|
-
|
|
81
|
-
| Aspect | Status | Details |
|
|
82
|
-
| --------------------- | -------- | ----------------- |
|
|
83
|
-
| Business Flow → Story | ✅/⚠️/❌ | X/Y flows covered |
|
|
84
|
-
| Actor → Flow | ✅/⚠️/❌ | All links valid |
|
|
85
|
-
| Story → Screen | ✅/⚠️/❌ | X missing screens |
|
|
86
|
-
| Orphan Detection | ✅/⚠️/❌ | N orphans found |
|
|
87
|
-
|
|
88
|
-
### Gaps Found
|
|
89
|
-
|
|
90
|
-
- [ ] Missing: <item>
|
|
91
|
-
- [ ] Broken link: <source> → <target>
|
|
92
|
-
- [ ] Orphan: <file>
|
|
93
|
-
|
|
94
|
-
### Recommendations
|
|
95
|
-
|
|
96
|
-
1. Create missing: ...
|
|
97
|
-
2. Fix broken links: ...
|
|
98
|
-
3. Remove or link orphans: ...
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Link Format Reference
|
|
102
|
-
|
|
103
|
-
| From | To | Format |
|
|
104
|
-
| ------------- | ------------- | ----------------------------------- |
|
|
105
|
-
| Business Flow | Story | `./story/<actor>--<name>.md` |
|
|
106
|
-
| Business Flow | Actor | `../../actors/<actor>.md` |
|
|
107
|
-
| Actor | Business Flow | `../business-flow/<flow>/README.md` |
|
|
108
|
-
| Story | Screen | `../../../screen/<screen>.md` |
|
|
109
|
-
|
|
110
|
-
## Next Step
|
|
111
|
-
|
|
112
|
-
After fixing all issues, use `/erp-kit-app-4-impl-spec` to create implementation specifications from screen and story documentation.
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: erp-kit-app-4-impl-spec
|
|
3
|
-
description: Create Tier 4 documentation (resolvers) for GraphQL operations. Use after completing documentation review with erp-kit-app-3-doc-review.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Implementation Spec Workflow
|
|
7
|
-
|
|
8
|
-
Create Tier 4 documentation: GraphQL Resolvers (mutations and queries).
|
|
9
|
-
|
|
10
|
-
## Prerequisites
|
|
11
|
-
|
|
12
|
-
Tier 1-3 documentation must exist:
|
|
13
|
-
|
|
14
|
-
- `README.md` (requirements)
|
|
15
|
-
- `docs/actors/*.md` (actors)
|
|
16
|
-
- `docs/business-flow/*/README.md` (flows)
|
|
17
|
-
- `docs/business-flow/*/story/*.md` (stories)
|
|
18
|
-
- `docs/screen/*.md` (screens)
|
|
19
|
-
|
|
20
|
-
## Workflow Phases
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
ANALYZE → IDENTIFY → CHECK MODULES → CREATE → VALIDATE
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Phase 1: Analyze
|
|
27
|
-
|
|
28
|
-
Read all story files and identify:
|
|
29
|
-
|
|
30
|
-
1. **Operations** that modify data → mutations
|
|
31
|
-
2. **Operations** that retrieve data → queries
|
|
32
|
-
3. **Error scenarios** for each operation
|
|
33
|
-
|
|
34
|
-
### Phase 2: Identify
|
|
35
|
-
|
|
36
|
-
Map stories to resolvers:
|
|
37
|
-
|
|
38
|
-
| Story Element | Resolver Type |
|
|
39
|
-
| -------------------- | ------------- |
|
|
40
|
-
| Create/Update/Delete | Mutation |
|
|
41
|
-
| View/List/Search | Query |
|
|
42
|
-
| Real-time updates | Subscription |
|
|
43
|
-
|
|
44
|
-
**Naming:** Use camelCase action-verb names: `create`, `update`, `delete`, `submit`, `approve`
|
|
45
|
-
|
|
46
|
-
### Phase 3: Check Module Dependencies
|
|
47
|
-
|
|
48
|
-
Resolvers reference module commands. Before creating resolver docs, verify required modules exist.
|
|
49
|
-
|
|
50
|
-
**Check existing modules:**
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
ls packages/erp-kit/src/modules/
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**Check module commands:**
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
ls packages/erp-kit/src/modules/<module-name>/docs/commands/
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**Map resolvers to modules:**
|
|
63
|
-
|
|
64
|
-
| Resolver Operation | Typical Module |
|
|
65
|
-
| ------------------ | --------------------- |
|
|
66
|
-
| User invite/roles | `user-management` |
|
|
67
|
-
| Supplier CRUD | `supplier-management` |
|
|
68
|
-
| Document handling | `document-management` |
|
|
69
|
-
| Task workflows | `task-management` |
|
|
70
|
-
|
|
71
|
-
**If modules don't exist:**
|
|
72
|
-
|
|
73
|
-
1. **Identify needed modules** - Group resolver operations by domain
|
|
74
|
-
2. **Create module docs first** - Use `erp-kit-module-1-docs` skill
|
|
75
|
-
3. **Return to Tier 4** - After modules have documented commands
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
Tier 4 blocked → Create modules → Return to Tier 4
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**Only reference existing module commands** in resolver documentation. Never reference modules or commands that don't exist.
|
|
82
|
-
|
|
83
|
-
### Phase 4: Create
|
|
84
|
-
|
|
85
|
-
Generate documentation using `erp-kit` CLI:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
erp-kit scaffold --app-root examples resolver <app> <resolver-name>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Naming conventions:**
|
|
92
|
-
|
|
93
|
-
- Filename must match H1 heading exactly (camelCase)
|
|
94
|
-
- Action-focused names: `createSupplierInvitation.md`
|
|
95
|
-
|
|
96
|
-
### Phase 5: Validate
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
pnpm run app:doc:check
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Schema Reference
|
|
103
|
-
|
|
104
|
-
| Schema | Tier | Output Path |
|
|
105
|
-
| -------------- | ---- | ------------------------- |
|
|
106
|
-
| `resolver.yml` | 4 | `docs/resolver/<name>.md` |
|
|
107
|
-
|
|
108
|
-
## Tips
|
|
109
|
-
|
|
110
|
-
- One story may require 1-3 resolvers
|
|
111
|
-
- Group related operations logically
|
|
112
|
-
- Document all error scenarios
|
|
113
|
-
|
|
114
|
-
## Next Step
|
|
115
|
-
|
|
116
|
-
After completing Tier 4, use `/erp-kit-app-5-implementation` to implement backend resolvers and frontend pages.
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: erp-kit-app-5-implementation
|
|
3
|
-
description: Implement backend and frontend code for app-compose applications using erp-kit modules. Use after completing Tier 4 documentation (resolver specs) with erp-kit-app-4-impl-spec. Triggers when implementing resolvers, wiring modules, creating frontend pages, or building a full-stack application from documentation specs. Also use when the user mentions implementing an app, writing backend resolvers, creating frontend pages, or connecting erp-kit modules to an application.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# App-Compose Implementation
|
|
7
|
-
|
|
8
|
-
Implement backend resolvers and frontend pages for an app-compose application, driven by Tier 1-4 documentation (actors, business flows, stories, screens, resolver specs).
|
|
9
|
-
|
|
10
|
-
## When to Use
|
|
11
|
-
|
|
12
|
-
- Implementing backend resolvers from resolver spec docs
|
|
13
|
-
- Creating frontend pages from screen spec docs
|
|
14
|
-
- Wiring erp-kit modules into an application
|
|
15
|
-
- Building full-stack code for an app-compose application
|
|
16
|
-
|
|
17
|
-
## Prerequisites
|
|
18
|
-
|
|
19
|
-
All four tiers of documentation must exist:
|
|
20
|
-
|
|
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
|
-
- `docs/resolver/*.md` — Resolver specifications (mutations, queries)
|
|
26
|
-
|
|
27
|
-
## Workflow
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
ANALYZE DOCS → BACKEND SCAFFOLD → MODULE WIRING → CONFIG → RESOLVERS → GENERATED FILES → DEPLOY → FRONTEND SCAFFOLD → PAGES → VERIFY
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Phase 1: Analyze Documentation
|
|
34
|
-
|
|
35
|
-
Read all resolver and screen specs to build a complete picture:
|
|
36
|
-
|
|
37
|
-
1. **Resolver docs** (`docs/resolver/*.md`) — Identify which module commands each resolver calls, what inputs/outputs it needs, and what errors it handles
|
|
38
|
-
2. **Screen docs** (`docs/screen/*.md`) — Identify screen types (ListView, Form, DetailView) and their fields/columns/actions
|
|
39
|
-
3. **Command source types** — For each module command the resolver calls, read the input type at `node_modules/@tailor-platform/erp-kit/src/modules/<module>/command/<commandName>.ts`. Do not invent fields that don't exist in the command, and preserve the required/optional distinction.
|
|
40
|
-
|
|
41
|
-
Classify resolvers into two categories:
|
|
42
|
-
|
|
43
|
-
| Category | Description | Implementation |
|
|
44
|
-
| -------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
45
|
-
| **Custom resolvers** | Mutations that call module commands (create, update, activate, deactivate, assign) | Write `createResolver()` files |
|
|
46
|
-
| **Built-in queries** | List and get operations for reading data | Handled automatically by `gqlOperations: "query"` in config — no code needed |
|
|
47
|
-
|
|
48
|
-
Prefer built-in queries over custom resolvers for list/get operations where possible.
|
|
49
|
-
|
|
50
|
-
### Phase 2: Backend Scaffold
|
|
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`)
|
|
59
|
-
|
|
60
|
-
Create the module wiring file that composes all required erp-kit modules.
|
|
61
|
-
|
|
62
|
-
**Read [backend reference](references/backend.md) § "Module Wiring" for the composition pattern.**
|
|
63
|
-
|
|
64
|
-
Key points:
|
|
65
|
-
|
|
66
|
-
- Use `defineXxxModule()` functions from `@tailor-platform/erp-kit/module`
|
|
67
|
-
- Pass inter-module dependencies explicitly (e.g., item-management needs primitives' unit type and query)
|
|
68
|
-
- Export `db`, `commands`, and `executors` for use in resolvers
|
|
69
|
-
|
|
70
|
-
### Phase 4: Configure Application (`tailor.config.ts`)
|
|
71
|
-
|
|
72
|
-
**Read [backend reference](references/backend.md) § "Application Config" for the config pattern.**
|
|
73
|
-
|
|
74
|
-
Key points:
|
|
75
|
-
|
|
76
|
-
- Single DB namespace (`"main-db"`) with `gqlOperations: "query"` for automatic list/get queries
|
|
77
|
-
- Resolver/executor discovery via glob patterns
|
|
78
|
-
- Auth with OAuth2, DPoP, and user profile mapping
|
|
79
|
-
- Generators for Kysely types and seed data
|
|
80
|
-
|
|
81
|
-
### Phase 5: Implement Backend Resolvers and Executors
|
|
82
|
-
|
|
83
|
-
Write one file per resolver under `src/modules/<module-name>/resolvers/`, one per executor under `executors/`.
|
|
84
|
-
|
|
85
|
-
**Read [backend reference](references/backend.md) § "Resolver Patterns" and "Executor Patterns".**
|
|
86
|
-
|
|
87
|
-
Do not directly mutate module-owned tables via Kysely — always use module commands.
|
|
88
|
-
|
|
89
|
-
### Phase 6: Generated Files
|
|
90
|
-
|
|
91
|
-
- **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
|
-
- **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
|
-
|
|
94
|
-
### Phase 7: Deploy Backend
|
|
95
|
-
|
|
96
|
-
Frontend implementation requires a deployed backend (for GraphQL schema generation). Prompt the user to:
|
|
97
|
-
|
|
98
|
-
1. Create a workspace and configure `.env` (including `TAILOR_PLATFORM_WORKSPACE_ID`)
|
|
99
|
-
2. Run `pnpm deploy` and `pnpm generate`
|
|
100
|
-
3. Run `pnpm seed` if seed data was created
|
|
101
|
-
4. Retrieve OAuth2 client ID via `tailor-sdk oauth2client get default --json` for frontend `.env`
|
|
102
|
-
|
|
103
|
-
Wait for the user to confirm deployment is complete before proceeding.
|
|
104
|
-
|
|
105
|
-
### Phase 8: Frontend Scaffold
|
|
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
|
-
```
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
# Backend Implementation Patterns
|
|
2
|
-
|
|
3
|
-
## Table of Contents
|
|
4
|
-
|
|
5
|
-
- [Backend Scaffold](#backend-scaffold)
|
|
6
|
-
- [Module Wiring](#module-wiring)
|
|
7
|
-
- [Application Config](#application-config)
|
|
8
|
-
- [Resolver Patterns](#resolver-patterns)
|
|
9
|
-
- [Executor Patterns](#executor-pattern)
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Backend Scaffold
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
backend/
|
|
17
|
-
├── src/
|
|
18
|
-
│ ├── modules.ts # Module wiring
|
|
19
|
-
│ ├── generated/kysely-tailordb.ts # Auto-generated (placeholder until deploy)
|
|
20
|
-
│ └── modules/<module-name>/
|
|
21
|
-
│ ├── resolvers/<name>.ts
|
|
22
|
-
│ └── executors/<name>.ts
|
|
23
|
-
├── seed/ # Seed data scripts
|
|
24
|
-
├── package.json
|
|
25
|
-
├── tsconfig.json
|
|
26
|
-
├── eslint.config.js
|
|
27
|
-
└── tailor.config.ts
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`package.json` key dependencies and scripts:
|
|
31
|
-
|
|
32
|
-
```json
|
|
33
|
-
{
|
|
34
|
-
"type": "module",
|
|
35
|
-
"scripts": {
|
|
36
|
-
"generate": "tailor-sdk generate",
|
|
37
|
-
"deploy": "tailor-sdk apply --env-file-if-exists .env",
|
|
38
|
-
"lint": "eslint --cache .",
|
|
39
|
-
"typecheck": "tsc --noEmit",
|
|
40
|
-
"seed": "node --env-file-if-exists=.env seed/exec.mjs"
|
|
41
|
-
},
|
|
42
|
-
"dependencies": {
|
|
43
|
-
"@tailor-platform/erp-kit": "...",
|
|
44
|
-
"@tailor-platform/function-kysely-tailordb": "...",
|
|
45
|
-
"kysely": "..."
|
|
46
|
-
},
|
|
47
|
-
"devDependencies": {
|
|
48
|
-
"@tailor-platform/sdk": "...",
|
|
49
|
-
"@tailor-platform/function-types": "...",
|
|
50
|
-
"typescript": "..."
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
`tsconfig.json` — requires `@/*` path alias and `@tailor-platform/function-types` in types:
|
|
56
|
-
|
|
57
|
-
```json
|
|
58
|
-
{
|
|
59
|
-
"compilerOptions": {
|
|
60
|
-
"target": "ES2022",
|
|
61
|
-
"module": "ESNext",
|
|
62
|
-
"moduleResolution": "bundler",
|
|
63
|
-
"strict": true,
|
|
64
|
-
"noEmit": true,
|
|
65
|
-
"skipLibCheck": true,
|
|
66
|
-
"types": ["node", "@tailor-platform/function-types"],
|
|
67
|
-
"paths": { "@/*": ["./src/*"] }
|
|
68
|
-
},
|
|
69
|
-
"include": ["**/*.ts"]
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Module Wiring
|
|
76
|
-
|
|
77
|
-
`src/modules.ts` composes erp-kit modules and exports their parts for resolver use.
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
import { db as field } from "@tailor-platform/sdk";
|
|
81
|
-
import {
|
|
82
|
-
definePrimitivesModule,
|
|
83
|
-
defineUserManagementModule,
|
|
84
|
-
defineItemManagementModule,
|
|
85
|
-
} from "@tailor-platform/erp-kit/module";
|
|
86
|
-
|
|
87
|
-
const primitivesModules = definePrimitivesModule({});
|
|
88
|
-
|
|
89
|
-
const umModules = defineUserManagementModule({
|
|
90
|
-
dbNamespace: "main-db",
|
|
91
|
-
user: {
|
|
92
|
-
fields: {
|
|
93
|
-
/* custom fields */
|
|
94
|
-
},
|
|
95
|
-
additionalStatuses: ["SUSPENDED"],
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// Pass inter-module dependencies explicitly
|
|
100
|
-
const imModules = defineItemManagementModule({
|
|
101
|
-
primitives: {
|
|
102
|
-
db: { unit: primitivesModules.db.unit },
|
|
103
|
-
queries: { getUnit: primitivesModules.queries.getUnit },
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// Destructure db into individual table exports (required for DB scanner)
|
|
108
|
-
export const { db: primitivesDb, commands: primitivesCommands } = primitivesModules;
|
|
109
|
-
export const { uomCategory, unit, currency, exchangeRate } = primitivesDb;
|
|
110
|
-
|
|
111
|
-
export const { db: umDb, executors: umExecutors, commands: umCommands } = umModules;
|
|
112
|
-
export const { user, permission, role, userRole, rolePermission, auditEvent } = umDb;
|
|
113
|
-
|
|
114
|
-
export const { db: imDb, commands: imCommands } = imModules;
|
|
115
|
-
export const { item, taxonomyNode, itemTaxonomyAssignment } = imDb;
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
Key conventions:
|
|
119
|
-
|
|
120
|
-
- Prefix exports to avoid collisions (`umCommands`, `imCommands`, `primitivesCommands`)
|
|
121
|
-
- Every module's `db` must be destructured into individual table exports — the DB scanner only picks up named exports
|
|
122
|
-
- Extract individual executors for re-export in executor files
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Application Config
|
|
127
|
-
|
|
128
|
-
`tailor.config.ts` defines the Tailor application configuration. Key structure:
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
export default defineConfig({
|
|
132
|
-
name: "<app-name>",
|
|
133
|
-
cors: ["http://localhost:5173", website.url],
|
|
134
|
-
db: {
|
|
135
|
-
"main-db": {
|
|
136
|
-
files: [`./src/modules.ts`],
|
|
137
|
-
gqlOperations: "query",
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
resolver: {
|
|
141
|
-
"main-resolver": { files: [`./src/modules/**/resolvers/**/*.ts`] },
|
|
142
|
-
},
|
|
143
|
-
executor: { files: [`./src/modules/**/executors/**/*.ts`] },
|
|
144
|
-
auth: auth,
|
|
145
|
-
idp: [idp],
|
|
146
|
-
staticWebsites: [website],
|
|
147
|
-
});
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Key points:
|
|
151
|
-
|
|
152
|
-
- `gqlOperations: "query"` — Auto-generates list/get GraphQL queries for all DB types
|
|
153
|
-
- Glob patterns for resolver/executor discovery
|
|
154
|
-
- See [SDK configuration docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/configuration.md) for full config options
|
|
155
|
-
|
|
156
|
-
### Auth configuration
|
|
157
|
-
|
|
158
|
-
- Define IdP (`defineIdp`), Auth (`defineAuth`), and static website (`defineStaticWebSite`) using Tailor SDK
|
|
159
|
-
- Prefer stable default naming: auth `default`, IdP `default`, OAuth2 client `default`
|
|
160
|
-
- `userProfile.type` must reference the `user` DB type from `modules.ts`
|
|
161
|
-
- `userProfile.usernameField`: stable unique field (e.g., `email`)
|
|
162
|
-
- Include static website URL and localhost in CORS: `cors: ["http://localhost:5173", website.url]`
|
|
163
|
-
- Frontend `VITE_TAILOR_CLIENT_ID` must come from `tailor-sdk oauth2client get default --json` — do not hardcode
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Resolver Patterns
|
|
168
|
-
|
|
169
|
-
All resolvers export a default `createResolver()` from `@tailor-platform/sdk`.
|
|
170
|
-
|
|
171
|
-
### Verify command input types
|
|
172
|
-
|
|
173
|
-
Before implementing a resolver, read the command's type definition:
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
node_modules/@tailor-platform/erp-kit/src/modules/<module>/command/<commandName>.ts
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
The command source is the ground truth. Do not invent fields that don't exist, and preserve the required/optional distinction.
|
|
180
|
-
|
|
181
|
-
### SDK type system
|
|
182
|
-
|
|
183
|
-
See [Resolver docs](https://raw.githubusercontent.com/tailor-platform/sdk/refs/heads/main/packages/sdk/docs/services/resolver.md) for the `t` namespace.
|
|
184
|
-
|
|
185
|
-
`t.array()` and `t.boolean()` do **not exist**. Never attempt to use them.
|
|
186
|
-
|
|
187
|
-
### Command-based mutation
|
|
188
|
-
|
|
189
|
-
The most common pattern. Key points:
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
import { createContext } from "@tailor-platform/erp-kit/app";
|
|
193
|
-
|
|
194
|
-
body: async (context) => {
|
|
195
|
-
const db = getDB("main-db");
|
|
196
|
-
const result = await imCommands.createItem(db, { ...context.input }, createContext(context));
|
|
197
|
-
if (!result.ok) throw result.error;
|
|
198
|
-
return { id: result.value.item.id, ... };
|
|
199
|
-
},
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
- `context.input.optionalField ?? undefined` — Convert null to undefined for command inputs
|
|
203
|
-
- `result.value.entity.nullableField ?? ""` — Handle nullable return values
|
|
204
|
-
- `createContext(context)` wraps the resolver context for erp-kit commands
|
|
205
|
-
- `getDB("main-db")` — Namespace must match `tailor.config.ts`
|
|
206
|
-
|
|
207
|
-
### Error handling
|
|
208
|
-
|
|
209
|
-
When the resolver spec documents specific error codes, use `result.error.code` to switch:
|
|
210
|
-
|
|
211
|
-
```ts
|
|
212
|
-
if (!result.ok) {
|
|
213
|
-
switch (result.error.code) {
|
|
214
|
-
case "USER_NOT_FOUND":
|
|
215
|
-
throw new Error(`User ${context.input.userId} not found`);
|
|
216
|
-
// ...
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
Do not directly mutate module-owned tables via Kysely — always use module commands.
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## Executor Patterns
|
|
226
|
-
|
|
227
|
-
Executors re-export module-provided event handlers. One file per executor, no custom logic:
|
|
228
|
-
|
|
229
|
-
```ts
|
|
230
|
-
import { rolePermissionCreated } from "@/modules";
|
|
231
|
-
export default rolePermissionCreated;
|
|
232
|
-
```
|