@tailor-platform/erp-kit 0.5.1 → 0.7.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 +29 -0
- package/README.md +10 -10
- package/dist/cli.mjs +499 -81
- package/package.json +1 -1
- package/skills/erp-kit-app-1-requirements/SKILL.md +33 -17
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +12 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +18 -4
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +1 -1
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +1 -1
- package/skills/erp-kit-app-4-plan-review/SKILL.md +12 -0
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +19 -4
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +12 -0
- package/skills/erp-kit-app-7-impl-review/SKILL.md +14 -2
- package/skills/erp-kit-app-shared/references/progress-protocol.md +77 -0
- package/skills/erp-kit-mock-scenario/SKILL.md +1 -1
- package/skills/erp-kit-module-1-requirements/SKILL.md +1 -1
- package/skills/erp-kit-module-3-plan/SKILL.md +3 -3
- package/skills/erp-kit-module-3-update-plan/SKILL.md +3 -3
- package/skills/erp-kit-module-5-impl/SKILL.md +1 -1
- package/skills/erp-kit-module-6-impl-review/SKILL.md +39 -17
- package/src/commands/app/index.ts +2 -0
- package/src/commands/app/progress/git-context.ts +16 -0
- package/src/commands/app/progress/index.ts +45 -0
- package/src/commands/app/progress/log.ts +49 -0
- package/src/commands/app/progress/progress.test.ts +128 -0
- package/src/commands/app/progress/schema-cmd.ts +10 -0
- package/src/commands/check.test.ts +4 -4
- package/src/commands/generate-doc.ts +1 -1
- package/src/commands/lib/discovery.test.ts +18 -10
- package/src/commands/lib/discovery.ts +17 -9
- package/src/commands/lib/paths.ts +4 -2
- package/src/commands/lib/sync-check-source.test.ts +1 -1
- package/src/commands/lib/sync-check-source.ts +6 -1
- package/src/commands/lib/sync-check-tests.test.ts +127 -6
- package/src/commands/lib/sync-check-tests.ts +82 -4
- package/src/commands/sync-check.ts +10 -3
- package/src/generator/generate-app-code.test.ts +0 -6
- package/src/generator/generate-app-code.ts +47 -22
- package/src/generator/generate-code.test.ts +10 -40
- package/src/generator/generate-code.ts +6 -12
- package/src/generator/stub-templates.test.ts +9 -5
- package/src/generator/stub-templates.ts +16 -9
- package/src/modules/finance-ledger/README.md +50 -0
- package/src/modules/finance-ledger/command/.gitkeep +0 -0
- package/src/modules/finance-ledger/command/addJournalLine.generated.ts +6 -0
- package/src/modules/finance-ledger/command/addJournalLine.test.ts +438 -0
- package/src/modules/finance-ledger/command/addJournalLine.ts +122 -0
- package/src/modules/finance-ledger/command/approveAndLockPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/approveAndLockPeriod.test.ts +107 -0
- package/src/modules/finance-ledger/command/approveAndLockPeriod.ts +72 -0
- package/src/modules/finance-ledger/command/beginClose.generated.ts +6 -0
- package/src/modules/finance-ledger/command/beginClose.test.ts +106 -0
- package/src/modules/finance-ledger/command/beginClose.ts +58 -0
- package/src/modules/finance-ledger/command/closePeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/closePeriod.test.ts +87 -0
- package/src/modules/finance-ledger/command/closePeriod.ts +44 -0
- package/src/modules/finance-ledger/command/createAccountingPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/createAccountingPeriod.test.ts +425 -0
- package/src/modules/finance-ledger/command/createAccountingPeriod.ts +133 -0
- package/src/modules/finance-ledger/command/createFiscalYear.generated.ts +6 -0
- package/src/modules/finance-ledger/command/createFiscalYear.test.ts +197 -0
- package/src/modules/finance-ledger/command/createFiscalYear.ts +70 -0
- package/src/modules/finance-ledger/command/createJournalEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/createJournalEntry.test.ts +261 -0
- package/src/modules/finance-ledger/command/createJournalEntry.ts +121 -0
- package/src/modules/finance-ledger/command/deleteAccountingPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/deleteAccountingPeriod.test.ts +71 -0
- package/src/modules/finance-ledger/command/deleteAccountingPeriod.ts +55 -0
- package/src/modules/finance-ledger/command/deleteFiscalYear.generated.ts +6 -0
- package/src/modules/finance-ledger/command/deleteFiscalYear.test.ts +38 -0
- package/src/modules/finance-ledger/command/deleteFiscalYear.ts +34 -0
- package/src/modules/finance-ledger/command/deleteJournalEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/deleteJournalEntry.test.ts +58 -0
- package/src/modules/finance-ledger/command/deleteJournalEntry.ts +43 -0
- package/src/modules/finance-ledger/command/executeYearEndClose.generated.ts +6 -0
- package/src/modules/finance-ledger/command/executeYearEndClose.test.ts +239 -0
- package/src/modules/finance-ledger/command/executeYearEndClose.ts +415 -0
- package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.test.ts +102 -0
- package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.ts +76 -0
- package/src/modules/finance-ledger/command/finalizeFinancialStatement.generated.ts +6 -0
- package/src/modules/finance-ledger/command/finalizeFinancialStatement.test.ts +73 -0
- package/src/modules/finance-ledger/command/finalizeFinancialStatement.ts +73 -0
- package/src/modules/finance-ledger/command/generateFinancialStatement.generated.ts +6 -0
- package/src/modules/finance-ledger/command/generateFinancialStatement.test.ts +311 -0
- package/src/modules/finance-ledger/command/generateFinancialStatement.ts +275 -0
- package/src/modules/finance-ledger/command/generatePreliminaryStatements.generated.ts +6 -0
- package/src/modules/finance-ledger/command/generatePreliminaryStatements.test.ts +152 -0
- package/src/modules/finance-ledger/command/generatePreliminaryStatements.ts +140 -0
- package/src/modules/finance-ledger/command/generateTrialBalance.generated.ts +6 -0
- package/src/modules/finance-ledger/command/generateTrialBalance.test.ts +439 -0
- package/src/modules/finance-ledger/command/generateTrialBalance.ts +268 -0
- package/src/modules/finance-ledger/command/initiatePeriodClose.generated.ts +6 -0
- package/src/modules/finance-ledger/command/initiatePeriodClose.test.ts +153 -0
- package/src/modules/finance-ledger/command/initiatePeriodClose.ts +84 -0
- package/src/modules/finance-ledger/command/openForAdvanceEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/openForAdvanceEntry.test.ts +87 -0
- package/src/modules/finance-ledger/command/openForAdvanceEntry.ts +44 -0
- package/src/modules/finance-ledger/command/openPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/openPeriod.test.ts +90 -0
- package/src/modules/finance-ledger/command/openPeriod.ts +44 -0
- package/src/modules/finance-ledger/command/permanentlyClosePeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/permanentlyClosePeriod.test.ts +87 -0
- package/src/modules/finance-ledger/command/permanentlyClosePeriod.ts +48 -0
- package/src/modules/finance-ledger/command/postAdjustingEntries.generated.ts +6 -0
- package/src/modules/finance-ledger/command/postAdjustingEntries.test.ts +392 -0
- package/src/modules/finance-ledger/command/postAdjustingEntries.ts +156 -0
- package/src/modules/finance-ledger/command/postJournalEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/postJournalEntry.test.ts +346 -0
- package/src/modules/finance-ledger/command/postJournalEntry.ts +160 -0
- package/src/modules/finance-ledger/command/processInventoryHandoff.generated.ts +6 -0
- package/src/modules/finance-ledger/command/processInventoryHandoff.test.ts +211 -0
- package/src/modules/finance-ledger/command/processInventoryHandoff.ts +133 -0
- package/src/modules/finance-ledger/command/processManufacturingHandoff.generated.ts +6 -0
- package/src/modules/finance-ledger/command/processManufacturingHandoff.test.ts +221 -0
- package/src/modules/finance-ledger/command/processManufacturingHandoff.ts +133 -0
- package/src/modules/finance-ledger/command/processPurchaseHandoff.generated.ts +6 -0
- package/src/modules/finance-ledger/command/processPurchaseHandoff.test.ts +222 -0
- package/src/modules/finance-ledger/command/processPurchaseHandoff.ts +133 -0
- package/src/modules/finance-ledger/command/processSalesHandoff.generated.ts +6 -0
- package/src/modules/finance-ledger/command/processSalesHandoff.test.ts +257 -0
- package/src/modules/finance-ledger/command/processSalesHandoff.ts +135 -0
- package/src/modules/finance-ledger/command/regenerateFinancialStatement.generated.ts +6 -0
- package/src/modules/finance-ledger/command/regenerateFinancialStatement.test.ts +129 -0
- package/src/modules/finance-ledger/command/regenerateFinancialStatement.ts +186 -0
- package/src/modules/finance-ledger/command/removeJournalLine.generated.ts +6 -0
- package/src/modules/finance-ledger/command/removeJournalLine.test.ts +65 -0
- package/src/modules/finance-ledger/command/removeJournalLine.ts +39 -0
- package/src/modules/finance-ledger/command/reopenPeriod.generated.ts +6 -0
- package/src/modules/finance-ledger/command/reopenPeriod.test.ts +87 -0
- package/src/modules/finance-ledger/command/reopenPeriod.ts +44 -0
- package/src/modules/finance-ledger/command/reverseJournalEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/reverseJournalEntry.test.ts +337 -0
- package/src/modules/finance-ledger/command/reverseJournalEntry.ts +140 -0
- package/src/modules/finance-ledger/command/revertSoftLock.generated.ts +6 -0
- package/src/modules/finance-ledger/command/revertSoftLock.test.ts +96 -0
- package/src/modules/finance-ledger/command/revertSoftLock.ts +67 -0
- package/src/modules/finance-ledger/command/updateFiscalYear.generated.ts +6 -0
- package/src/modules/finance-ledger/command/updateFiscalYear.test.ts +138 -0
- package/src/modules/finance-ledger/command/updateFiscalYear.ts +85 -0
- package/src/modules/finance-ledger/command/updateJournalEntry.generated.ts +6 -0
- package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +195 -0
- package/src/modules/finance-ledger/command/updateJournalEntry.ts +86 -0
- package/src/modules/finance-ledger/command/updateJournalLine.generated.ts +6 -0
- package/src/modules/finance-ledger/command/updateJournalLine.test.ts +385 -0
- package/src/modules/finance-ledger/command/updateJournalLine.ts +155 -0
- package/src/modules/finance-ledger/command/verifySubledgerTransfers.generated.ts +6 -0
- package/src/modules/finance-ledger/command/verifySubledgerTransfers.test.ts +201 -0
- package/src/modules/finance-ledger/command/verifySubledgerTransfers.ts +113 -0
- package/src/modules/finance-ledger/command/verifyTrialBalance.generated.ts +6 -0
- package/src/modules/finance-ledger/command/verifyTrialBalance.test.ts +136 -0
- package/src/modules/finance-ledger/command/verifyTrialBalance.ts +97 -0
- package/src/modules/finance-ledger/db/.gitkeep +0 -0
- package/src/modules/finance-ledger/db/accountingPeriod.ts +58 -0
- package/src/modules/finance-ledger/db/financialStatement.ts +92 -0
- package/src/modules/finance-ledger/db/financialStatementLineItem.ts +76 -0
- package/src/modules/finance-ledger/db/fiscalYear.ts +41 -0
- package/src/modules/finance-ledger/db/journalEntry.ts +101 -0
- package/src/modules/finance-ledger/db/journalLine.ts +64 -0
- package/src/modules/finance-ledger/db/periodClose.ts +97 -0
- package/src/modules/finance-ledger/db/trialBalance.ts +63 -0
- package/src/modules/finance-ledger/db/trialBalanceLine.ts +63 -0
- package/src/modules/finance-ledger/docs/commands/AddJournalLine.md +74 -0
- package/src/modules/finance-ledger/docs/commands/ApproveAndLockPeriod.md +53 -0
- package/src/modules/finance-ledger/docs/commands/BeginClose.md +47 -0
- package/src/modules/finance-ledger/docs/commands/ClosePeriod.md +45 -0
- package/src/modules/finance-ledger/docs/commands/CreateAccountingPeriod.md +69 -0
- package/src/modules/finance-ledger/docs/commands/CreateFiscalYear.md +56 -0
- package/src/modules/finance-ledger/docs/commands/CreateJournalEntry.md +63 -0
- package/src/modules/finance-ledger/docs/commands/DeleteAccountingPeriod.md +46 -0
- package/src/modules/finance-ledger/docs/commands/DeleteFiscalYear.md +40 -0
- package/src/modules/finance-ledger/docs/commands/DeleteJournalEntry.md +44 -0
- package/src/modules/finance-ledger/docs/commands/ExecuteYearEndClose.md +81 -0
- package/src/modules/finance-ledger/docs/commands/FinalCloseAndLockPeriod.md +49 -0
- package/src/modules/finance-ledger/docs/commands/FinalizeFinancialStatement.md +43 -0
- package/src/modules/finance-ledger/docs/commands/GenerateFinancialStatement.md +86 -0
- package/src/modules/finance-ledger/docs/commands/GeneratePreliminaryStatements.md +53 -0
- package/src/modules/finance-ledger/docs/commands/GenerateTrialBalance.md +75 -0
- package/src/modules/finance-ledger/docs/commands/InitiatePeriodClose.md +58 -0
- package/src/modules/finance-ledger/docs/commands/OpenForAdvanceEntry.md +44 -0
- package/src/modules/finance-ledger/docs/commands/OpenPeriod.md +45 -0
- package/src/modules/finance-ledger/docs/commands/PermanentlyClosePeriod.md +45 -0
- package/src/modules/finance-ledger/docs/commands/PostAdjustingEntries.md +61 -0
- package/src/modules/finance-ledger/docs/commands/PostJournalEntry.md +81 -0
- package/src/modules/finance-ledger/docs/commands/ProcessInventoryHandoff.md +72 -0
- package/src/modules/finance-ledger/docs/commands/ProcessManufacturingHandoff.md +68 -0
- package/src/modules/finance-ledger/docs/commands/ProcessPurchaseHandoff.md +68 -0
- package/src/modules/finance-ledger/docs/commands/ProcessSalesHandoff.md +71 -0
- package/src/modules/finance-ledger/docs/commands/RegenerateFinancialStatement.md +60 -0
- package/src/modules/finance-ledger/docs/commands/RemoveJournalLine.md +42 -0
- package/src/modules/finance-ledger/docs/commands/ReopenPeriod.md +45 -0
- package/src/modules/finance-ledger/docs/commands/ReverseJournalEntry.md +62 -0
- package/src/modules/finance-ledger/docs/commands/RevertSoftLock.md +49 -0
- package/src/modules/finance-ledger/docs/commands/UpdateFiscalYear.md +60 -0
- package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +50 -0
- package/src/modules/finance-ledger/docs/commands/UpdateJournalLine.md +61 -0
- package/src/modules/finance-ledger/docs/commands/VerifySubledgerTransfers.md +59 -0
- package/src/modules/finance-ledger/docs/commands/VerifyTrialBalance.md +53 -0
- package/src/modules/finance-ledger/docs/features/accounting-period-management.md +110 -0
- package/src/modules/finance-ledger/docs/features/financial-statement-generation.md +115 -0
- package/src/modules/finance-ledger/docs/features/journal-entry-management.md +138 -0
- package/src/modules/finance-ledger/docs/features/period-end-close.md +102 -0
- package/src/modules/finance-ledger/docs/features/subledger-integration.md +141 -0
- package/src/modules/finance-ledger/docs/features/trial-balance.md +99 -0
- package/src/modules/finance-ledger/docs/features/year-end-close.md +84 -0
- package/src/modules/finance-ledger/docs/models/AccountingPeriod.md +71 -0
- package/src/modules/finance-ledger/docs/models/FinancialStatement.md +76 -0
- package/src/modules/finance-ledger/docs/models/FinancialStatementLineItem.md +41 -0
- package/src/modules/finance-ledger/docs/models/FiscalYear.md +41 -0
- package/src/modules/finance-ledger/docs/models/JournalEntry.md +80 -0
- package/src/modules/finance-ledger/docs/models/JournalLine.md +47 -0
- package/src/modules/finance-ledger/docs/models/PeriodClose.md +83 -0
- package/src/modules/finance-ledger/docs/models/TrialBalance.md +56 -0
- package/src/modules/finance-ledger/docs/models/TrialBalanceLine.md +37 -0
- package/src/modules/finance-ledger/docs/queries/GetAccountingPeriod.md +35 -0
- package/src/modules/finance-ledger/docs/queries/GetFinancialStatement.md +38 -0
- package/src/modules/finance-ledger/docs/queries/GetFiscalYear.md +35 -0
- package/src/modules/finance-ledger/docs/queries/GetJournalEntry.md +37 -0
- package/src/modules/finance-ledger/docs/queries/GetPeriodByDate.md +38 -0
- package/src/modules/finance-ledger/docs/queries/GetPeriodClose.md +36 -0
- package/src/modules/finance-ledger/docs/queries/GetSubledgerTransferStatus.md +45 -0
- package/src/modules/finance-ledger/docs/queries/GetTrialBalance.md +38 -0
- package/src/modules/finance-ledger/docs/queries/ListAccountingPeriods.md +46 -0
- package/src/modules/finance-ledger/docs/queries/ListFinancialStatements.md +46 -0
- package/src/modules/finance-ledger/docs/queries/ListFiscalYears.md +42 -0
- package/src/modules/finance-ledger/docs/queries/ListJournalEntries.md +48 -0
- package/src/modules/finance-ledger/docs/queries/ListPeriodCloses.md +46 -0
- package/src/modules/finance-ledger/docs/queries/ListTrialBalances.md +51 -0
- package/src/modules/finance-ledger/executor/.gitkeep +0 -0
- package/src/modules/finance-ledger/generated/enums.ts +109 -0
- package/src/modules/finance-ledger/generated/kysely-tailordb.ts +202 -0
- package/src/modules/finance-ledger/index.ts +2 -0
- package/src/modules/finance-ledger/lib/_db_deps.ts +56 -0
- package/src/modules/finance-ledger/lib/errors.generated.ts +332 -0
- package/src/modules/finance-ledger/lib/permissions.generated.ts +41 -0
- package/src/modules/finance-ledger/lib/types.ts +66 -0
- package/src/modules/finance-ledger/module.ts +262 -0
- package/src/modules/finance-ledger/package.json +26 -0
- package/src/modules/finance-ledger/permissions.ts +3 -0
- package/src/modules/finance-ledger/query/.gitkeep +0 -0
- package/src/modules/finance-ledger/query/getAccountingPeriod.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getAccountingPeriod.test.ts +31 -0
- package/src/modules/finance-ledger/query/getAccountingPeriod.ts +21 -0
- package/src/modules/finance-ledger/query/getFinancialStatement.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getFinancialStatement.test.ts +35 -0
- package/src/modules/finance-ledger/query/getFinancialStatement.ts +29 -0
- package/src/modules/finance-ledger/query/getFiscalYear.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getFiscalYear.test.ts +31 -0
- package/src/modules/finance-ledger/query/getFiscalYear.ts +21 -0
- package/src/modules/finance-ledger/query/getJournalEntry.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getJournalEntry.test.ts +35 -0
- package/src/modules/finance-ledger/query/getJournalEntry.ts +29 -0
- package/src/modules/finance-ledger/query/getPeriodByDate.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getPeriodByDate.test.ts +53 -0
- package/src/modules/finance-ledger/query/getPeriodByDate.ts +27 -0
- package/src/modules/finance-ledger/query/getPeriodClose.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getPeriodClose.test.ts +31 -0
- package/src/modules/finance-ledger/query/getPeriodClose.ts +21 -0
- package/src/modules/finance-ledger/query/getSubledgerTransferStatus.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getSubledgerTransferStatus.test.ts +101 -0
- package/src/modules/finance-ledger/query/getSubledgerTransferStatus.ts +68 -0
- package/src/modules/finance-ledger/query/getTrialBalance.generated.ts +5 -0
- package/src/modules/finance-ledger/query/getTrialBalance.test.ts +33 -0
- package/src/modules/finance-ledger/query/getTrialBalance.ts +30 -0
- package/src/modules/finance-ledger/query/listAccountingPeriods.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listAccountingPeriods.test.ts +81 -0
- package/src/modules/finance-ledger/query/listAccountingPeriods.ts +61 -0
- package/src/modules/finance-ledger/query/listFinancialStatements.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listFinancialStatements.test.ts +76 -0
- package/src/modules/finance-ledger/query/listFinancialStatements.ts +62 -0
- package/src/modules/finance-ledger/query/listFiscalYears.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listFiscalYears.test.ts +63 -0
- package/src/modules/finance-ledger/query/listFiscalYears.ts +45 -0
- package/src/modules/finance-ledger/query/listJournalEntries.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listJournalEntries.test.ts +91 -0
- package/src/modules/finance-ledger/query/listJournalEntries.ts +64 -0
- package/src/modules/finance-ledger/query/listPeriodCloses.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listPeriodCloses.test.ts +63 -0
- package/src/modules/finance-ledger/query/listPeriodCloses.ts +64 -0
- package/src/modules/finance-ledger/query/listTrialBalances.generated.ts +5 -0
- package/src/modules/finance-ledger/query/listTrialBalances.test.ts +78 -0
- package/src/modules/finance-ledger/query/listTrialBalances.ts +56 -0
- package/src/modules/finance-ledger/seed/index.ts +19 -0
- package/src/modules/finance-ledger/tailor.config.ts +13 -0
- package/src/modules/finance-ledger/tailor.d.ts +13 -0
- package/src/modules/finance-ledger/testing/commandTestUtils.ts +35 -0
- package/src/modules/finance-ledger/testing/fixtures.ts +382 -0
- package/src/modules/finance-ledger/tsconfig.json +16 -0
- package/src/modules/inventory/docs/features/inventory-adjustment.md +2 -1
- package/src/modules/inventory/docs/features/scrap-management.md +39 -1
- package/src/modules/manufacturing/README.md +63 -0
- package/src/modules/manufacturing/command/.gitkeep +0 -0
- package/src/modules/manufacturing/command/activateBillOfMaterial.generated.ts +6 -0
- package/src/modules/manufacturing/command/activateBillOfMaterial.test.ts +166 -0
- package/src/modules/manufacturing/command/activateBillOfMaterial.ts +173 -0
- package/src/modules/manufacturing/command/activateRouting.generated.ts +6 -0
- package/src/modules/manufacturing/command/activateRouting.test.ts +152 -0
- package/src/modules/manufacturing/command/activateRouting.ts +92 -0
- package/src/modules/manufacturing/command/activateWorkCenter.generated.ts +6 -0
- package/src/modules/manufacturing/command/activateWorkCenter.test.ts +135 -0
- package/src/modules/manufacturing/command/activateWorkCenter.ts +91 -0
- package/src/modules/manufacturing/command/cancelProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/cancelProductionOrder.test.ts +151 -0
- package/src/modules/manufacturing/command/cancelProductionOrder.ts +114 -0
- package/src/modules/manufacturing/command/closeProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/closeProductionOrder.test.ts +126 -0
- package/src/modules/manufacturing/command/closeProductionOrder.ts +87 -0
- package/src/modules/manufacturing/command/completeProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/completeProductionOrder.test.ts +132 -0
- package/src/modules/manufacturing/command/completeProductionOrder.ts +97 -0
- package/src/modules/manufacturing/command/completeWorkOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/completeWorkOrder.test.ts +369 -0
- package/src/modules/manufacturing/command/completeWorkOrder.ts +212 -0
- package/src/modules/manufacturing/command/createBillOfMaterial.generated.ts +6 -0
- package/src/modules/manufacturing/command/createBillOfMaterial.test.ts +210 -0
- package/src/modules/manufacturing/command/createBillOfMaterial.ts +176 -0
- package/src/modules/manufacturing/command/createProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/createProductionOrder.test.ts +160 -0
- package/src/modules/manufacturing/command/createProductionOrder.ts +129 -0
- package/src/modules/manufacturing/command/createRouting.generated.ts +6 -0
- package/src/modules/manufacturing/command/createRouting.test.ts +168 -0
- package/src/modules/manufacturing/command/createRouting.ts +128 -0
- package/src/modules/manufacturing/command/createWorkCenter.generated.ts +6 -0
- package/src/modules/manufacturing/command/createWorkCenter.test.ts +148 -0
- package/src/modules/manufacturing/command/createWorkCenter.ts +131 -0
- package/src/modules/manufacturing/command/deactivateBillOfMaterial.generated.ts +6 -0
- package/src/modules/manufacturing/command/deactivateBillOfMaterial.test.ts +103 -0
- package/src/modules/manufacturing/command/deactivateBillOfMaterial.ts +78 -0
- package/src/modules/manufacturing/command/deactivateRouting.generated.ts +6 -0
- package/src/modules/manufacturing/command/deactivateRouting.test.ts +112 -0
- package/src/modules/manufacturing/command/deactivateRouting.ts +76 -0
- package/src/modules/manufacturing/command/deactivateWorkCenter.generated.ts +6 -0
- package/src/modules/manufacturing/command/deactivateWorkCenter.test.ts +113 -0
- package/src/modules/manufacturing/command/deactivateWorkCenter.ts +85 -0
- package/src/modules/manufacturing/command/pauseWorkOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/pauseWorkOrder.test.ts +118 -0
- package/src/modules/manufacturing/command/pauseWorkOrder.ts +82 -0
- package/src/modules/manufacturing/command/recordInventoryIssueOutcome.generated.ts +6 -0
- package/src/modules/manufacturing/command/recordInventoryIssueOutcome.test.ts +183 -0
- package/src/modules/manufacturing/command/recordInventoryIssueOutcome.ts +139 -0
- package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.generated.ts +6 -0
- package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.test.ts +120 -0
- package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.ts +110 -0
- package/src/modules/manufacturing/command/releaseProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/releaseProductionOrder.test.ts +220 -0
- package/src/modules/manufacturing/command/releaseProductionOrder.ts +450 -0
- package/src/modules/manufacturing/command/reopenProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/reopenProductionOrder.test.ts +196 -0
- package/src/modules/manufacturing/command/reopenProductionOrder.ts +98 -0
- package/src/modules/manufacturing/command/reportWorkOrderProgress.generated.ts +6 -0
- package/src/modules/manufacturing/command/reportWorkOrderProgress.test.ts +204 -0
- package/src/modules/manufacturing/command/reportWorkOrderProgress.ts +129 -0
- package/src/modules/manufacturing/command/rescheduleProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/rescheduleProductionOrder.test.ts +185 -0
- package/src/modules/manufacturing/command/rescheduleProductionOrder.ts +95 -0
- package/src/modules/manufacturing/command/resumeWorkOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/resumeWorkOrder.test.ts +122 -0
- package/src/modules/manufacturing/command/resumeWorkOrder.ts +94 -0
- package/src/modules/manufacturing/command/reviewManufacturingCostSummary.generated.ts +6 -0
- package/src/modules/manufacturing/command/reviewManufacturingCostSummary.test.ts +231 -0
- package/src/modules/manufacturing/command/reviewManufacturingCostSummary.ts +137 -0
- package/src/modules/manufacturing/command/startWorkOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/startWorkOrder.test.ts +118 -0
- package/src/modules/manufacturing/command/startWorkOrder.ts +126 -0
- package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.test.ts +153 -0
- package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.ts +106 -0
- package/src/modules/manufacturing/command/unreleaseProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/unreleaseProductionOrder.test.ts +140 -0
- package/src/modules/manufacturing/command/unreleaseProductionOrder.ts +131 -0
- package/src/modules/manufacturing/command/updateBillOfMaterial.generated.ts +6 -0
- package/src/modules/manufacturing/command/updateBillOfMaterial.test.ts +149 -0
- package/src/modules/manufacturing/command/updateBillOfMaterial.ts +174 -0
- package/src/modules/manufacturing/command/updateProductionOrder.generated.ts +6 -0
- package/src/modules/manufacturing/command/updateProductionOrder.test.ts +112 -0
- package/src/modules/manufacturing/command/updateProductionOrder.ts +145 -0
- package/src/modules/manufacturing/command/updateRouting.generated.ts +6 -0
- package/src/modules/manufacturing/command/updateRouting.test.ts +211 -0
- package/src/modules/manufacturing/command/updateRouting.ts +124 -0
- package/src/modules/manufacturing/command/updateWorkCenter.generated.ts +6 -0
- package/src/modules/manufacturing/command/updateWorkCenter.test.ts +152 -0
- package/src/modules/manufacturing/command/updateWorkCenter.ts +137 -0
- package/src/modules/manufacturing/db/.gitkeep +0 -0
- package/src/modules/manufacturing/db/billOfMaterial.ts +70 -0
- package/src/modules/manufacturing/db/billOfMaterialLine.ts +49 -0
- package/src/modules/manufacturing/db/costVarianceLine.ts +53 -0
- package/src/modules/manufacturing/db/manufacturingCostLine.ts +35 -0
- package/src/modules/manufacturing/db/manufacturingCostSettlementRecord.ts +39 -0
- package/src/modules/manufacturing/db/manufacturingCostSummary.ts +59 -0
- package/src/modules/manufacturing/db/productionOrder.ts +83 -0
- package/src/modules/manufacturing/db/productionOrderBomSnapshot.ts +44 -0
- package/src/modules/manufacturing/db/productionOrderCostBaseline.ts +44 -0
- package/src/modules/manufacturing/db/productionOrderMaterialRequirement.ts +57 -0
- package/src/modules/manufacturing/db/productionOrderRoutingSnapshot.ts +43 -0
- package/src/modules/manufacturing/db/routing.ts +63 -0
- package/src/modules/manufacturing/db/routingOperation.ts +57 -0
- package/src/modules/manufacturing/db/workCenter.ts +87 -0
- package/src/modules/manufacturing/db/workOrder.ts +65 -0
- package/src/modules/manufacturing/db/workOrderExecutionEvent.ts +54 -0
- package/src/modules/manufacturing/docs/commands/ActivateBillOfMaterial.md +50 -0
- package/src/modules/manufacturing/docs/commands/ActivateRouting.md +48 -0
- package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +49 -0
- package/src/modules/manufacturing/docs/commands/CancelProductionOrder.md +48 -0
- package/src/modules/manufacturing/docs/commands/CloseProductionOrder.md +46 -0
- package/src/modules/manufacturing/docs/commands/CompleteProductionOrder.md +48 -0
- package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +66 -0
- package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +54 -0
- package/src/modules/manufacturing/docs/commands/CreateProductionOrder.md +49 -0
- package/src/modules/manufacturing/docs/commands/CreateRouting.md +50 -0
- package/src/modules/manufacturing/docs/commands/CreateWorkCenter.md +51 -0
- package/src/modules/manufacturing/docs/commands/DeactivateBillOfMaterial.md +45 -0
- package/src/modules/manufacturing/docs/commands/DeactivateRouting.md +45 -0
- package/src/modules/manufacturing/docs/commands/DeactivateWorkCenter.md +45 -0
- package/src/modules/manufacturing/docs/commands/PauseWorkOrder.md +44 -0
- package/src/modules/manufacturing/docs/commands/RecordInventoryIssueOutcome.md +59 -0
- package/src/modules/manufacturing/docs/commands/RecordManufacturingCostSettlementAcknowledgment.md +49 -0
- package/src/modules/manufacturing/docs/commands/ReleaseProductionOrder.md +57 -0
- package/src/modules/manufacturing/docs/commands/ReopenProductionOrder.md +54 -0
- package/src/modules/manufacturing/docs/commands/ReportWorkOrderProgress.md +53 -0
- package/src/modules/manufacturing/docs/commands/RescheduleProductionOrder.md +45 -0
- package/src/modules/manufacturing/docs/commands/ResumeWorkOrder.md +44 -0
- package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +52 -0
- package/src/modules/manufacturing/docs/commands/StartWorkOrder.md +46 -0
- package/src/modules/manufacturing/docs/commands/TechnicallyCompleteProductionOrder.md +51 -0
- package/src/modules/manufacturing/docs/commands/UnreleaseProductionOrder.md +46 -0
- package/src/modules/manufacturing/docs/commands/UpdateBillOfMaterial.md +48 -0
- package/src/modules/manufacturing/docs/commands/UpdateProductionOrder.md +48 -0
- package/src/modules/manufacturing/docs/commands/UpdateRouting.md +52 -0
- package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +48 -0
- package/src/modules/manufacturing/docs/features/bill-of-material-management.md +83 -0
- package/src/modules/manufacturing/docs/features/manufacturing-cost-and-variance.md +191 -0
- package/src/modules/manufacturing/docs/features/production-order-lifecycle.md +103 -0
- package/src/modules/manufacturing/docs/features/routing-and-work-center-definition.md +63 -0
- package/src/modules/manufacturing/docs/features/work-order-execution.md +115 -0
- package/src/modules/manufacturing/docs/models/BillOfMaterial.md +60 -0
- package/src/modules/manufacturing/docs/models/ManufacturingCostSummary.md +66 -0
- package/src/modules/manufacturing/docs/models/ProductionOrder.md +76 -0
- package/src/modules/manufacturing/docs/models/Routing.md +58 -0
- package/src/modules/manufacturing/docs/models/WorkCenter.md +56 -0
- package/src/modules/manufacturing/docs/models/WorkOrder.md +63 -0
- package/src/modules/manufacturing/docs/queries/DetectBillOfMaterialCircularReference.md +39 -0
- package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +56 -0
- package/src/modules/manufacturing/docs/queries/GetBillOfMaterial.md +37 -0
- package/src/modules/manufacturing/docs/queries/GetManufacturingCostSummary.md +39 -0
- package/src/modules/manufacturing/docs/queries/GetProductionOrder.md +37 -0
- package/src/modules/manufacturing/docs/queries/GetRouting.md +39 -0
- package/src/modules/manufacturing/docs/queries/GetWorkCenter.md +35 -0
- package/src/modules/manufacturing/docs/queries/GetWorkOrder.md +38 -0
- package/src/modules/manufacturing/docs/queries/ListBillOfMaterialsByItem.md +42 -0
- package/src/modules/manufacturing/docs/queries/ListManufacturingCostSummariesByStatus.md +41 -0
- package/src/modules/manufacturing/docs/queries/ListProductionOrdersByStatus.md +41 -0
- package/src/modules/manufacturing/docs/queries/ListRoutingsByItem.md +42 -0
- package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +38 -0
- package/src/modules/manufacturing/docs/queries/ListWorkOrdersByProductionOrder.md +39 -0
- package/src/modules/manufacturing/docs/queries/ListWorkOrdersByWorkCenter.md +43 -0
- package/src/modules/manufacturing/executor/.gitkeep +0 -0
- package/src/modules/manufacturing/generated/enums.ts +113 -0
- package/src/modules/manufacturing/generated/kysely-tailordb.ts +247 -0
- package/src/modules/manufacturing/index.ts +2 -0
- package/src/modules/manufacturing/lib/_db_deps.ts +22 -0
- package/src/modules/manufacturing/lib/errors.generated.ts +592 -0
- package/src/modules/manufacturing/lib/permissions.generated.ts +35 -0
- package/src/modules/manufacturing/lib/types.ts +111 -0
- package/src/modules/manufacturing/module.ts +226 -0
- package/src/modules/manufacturing/permissions.ts +3 -0
- package/src/modules/manufacturing/query/.gitkeep +0 -0
- package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.generated.ts +5 -0
- package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.test.ts +115 -0
- package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.ts +79 -0
- package/src/modules/manufacturing/query/explodeBillOfMaterial.generated.ts +5 -0
- package/src/modules/manufacturing/query/explodeBillOfMaterial.test.ts +445 -0
- package/src/modules/manufacturing/query/explodeBillOfMaterial.ts +306 -0
- package/src/modules/manufacturing/query/getBillOfMaterial.generated.ts +5 -0
- package/src/modules/manufacturing/query/getBillOfMaterial.test.ts +64 -0
- package/src/modules/manufacturing/query/getBillOfMaterial.ts +27 -0
- package/src/modules/manufacturing/query/getManufacturingCostSummary.generated.ts +5 -0
- package/src/modules/manufacturing/query/getManufacturingCostSummary.test.ts +147 -0
- package/src/modules/manufacturing/query/getManufacturingCostSummary.ts +46 -0
- package/src/modules/manufacturing/query/getProductionOrder.generated.ts +5 -0
- package/src/modules/manufacturing/query/getProductionOrder.test.ts +139 -0
- package/src/modules/manufacturing/query/getProductionOrder.ts +84 -0
- package/src/modules/manufacturing/query/getRouting.generated.ts +5 -0
- package/src/modules/manufacturing/query/getRouting.test.ts +71 -0
- package/src/modules/manufacturing/query/getRouting.ts +34 -0
- package/src/modules/manufacturing/query/getWorkCenter.generated.ts +5 -0
- package/src/modules/manufacturing/query/getWorkCenter.test.ts +37 -0
- package/src/modules/manufacturing/query/getWorkCenter.ts +21 -0
- package/src/modules/manufacturing/query/getWorkOrder.generated.ts +5 -0
- package/src/modules/manufacturing/query/getWorkOrder.test.ts +73 -0
- package/src/modules/manufacturing/query/getWorkOrder.ts +28 -0
- package/src/modules/manufacturing/query/listBillOfMaterialsByItem.generated.ts +5 -0
- package/src/modules/manufacturing/query/listBillOfMaterialsByItem.test.ts +107 -0
- package/src/modules/manufacturing/query/listBillOfMaterialsByItem.ts +58 -0
- package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.generated.ts +5 -0
- package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.test.ts +96 -0
- package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.ts +77 -0
- package/src/modules/manufacturing/query/listProductionOrdersByStatus.generated.ts +5 -0
- package/src/modules/manufacturing/query/listProductionOrdersByStatus.test.ts +121 -0
- package/src/modules/manufacturing/query/listProductionOrdersByStatus.ts +83 -0
- package/src/modules/manufacturing/query/listRoutingsByItem.generated.ts +5 -0
- package/src/modules/manufacturing/query/listRoutingsByItem.test.ts +110 -0
- package/src/modules/manufacturing/query/listRoutingsByItem.ts +54 -0
- package/src/modules/manufacturing/query/listWorkCentersBySite.generated.ts +5 -0
- package/src/modules/manufacturing/query/listWorkCentersBySite.test.ts +81 -0
- package/src/modules/manufacturing/query/listWorkCentersBySite.ts +70 -0
- package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.generated.ts +5 -0
- package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.test.ts +102 -0
- package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.ts +53 -0
- package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.generated.ts +5 -0
- package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.test.ts +143 -0
- package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.ts +56 -0
- package/src/modules/manufacturing/seed/index.ts +19 -0
- package/src/modules/manufacturing/tailor.config.ts +13 -0
- package/src/modules/manufacturing/tailor.d.ts +13 -0
- package/src/modules/manufacturing/testing/commandTestUtils.ts +29 -0
- package/src/modules/manufacturing/testing/fixtures.ts +402 -0
- package/src/progress/schema.test.ts +161 -0
- package/src/progress/schema.ts +316 -0
- package/templates/scaffold/app/backend/package.json +7 -2
- package/templates/scaffold/app/backend/src/tests/utils/graphql-client.ts +66 -0
- package/templates/scaffold/app/backend/src/tests/utils/setup.ts +21 -0
- package/templates/scaffold/app/backend/tsconfig.json +9 -2
- package/templates/scaffold/app/backend/vitest.config.ts +18 -0
- package/templates/scaffold/app/frontend/package.json +2 -2
- package/src/generator/generate-stubs.ts +0 -31
package/dist/cli.mjs
CHANGED
|
@@ -3,9 +3,9 @@ import { createRequire } from "node:module";
|
|
|
3
3
|
import { arg, defineCommand, runMain } from "politty";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
-
import fs, { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
6
|
+
import fs, { existsSync, globSync, readFileSync, readdirSync } from "node:fs";
|
|
7
7
|
import path, { basename, dirname, join, relative, resolve } from "node:path";
|
|
8
|
-
import { execFile, execSync } from "node:child_process";
|
|
8
|
+
import { execFile, execFileSync, execSync } from "node:child_process";
|
|
9
9
|
import fg from "fast-glob";
|
|
10
10
|
import { fromMarkdown } from "mdast-util-from-markdown";
|
|
11
11
|
import { toString } from "mdast-util-to-string";
|
|
@@ -452,11 +452,12 @@ const MODULE_PATHS = {
|
|
|
452
452
|
}
|
|
453
453
|
};
|
|
454
454
|
const APP_PATHS = {
|
|
455
|
-
|
|
455
|
+
tests: { stories: "backend/src/tests/stories" },
|
|
456
456
|
docs: {
|
|
457
457
|
resolver: "docs/resolver",
|
|
458
458
|
actors: "docs/actors",
|
|
459
459
|
businessFlow: "docs/business-flow",
|
|
460
|
+
story: "story",
|
|
460
461
|
screen: "docs/screen"
|
|
461
462
|
}
|
|
462
463
|
};
|
|
@@ -487,12 +488,19 @@ function moduleCategories(root) {
|
|
|
487
488
|
function appComposeCategories(root) {
|
|
488
489
|
return [{
|
|
489
490
|
name: "resolver",
|
|
490
|
-
sourcePattern: `${root}
|
|
491
|
-
docPattern: `${root}
|
|
491
|
+
sourcePattern: `${root}/backend/src/resolvers/*.ts`,
|
|
492
|
+
docPattern: `${root}/${APP_PATHS.docs.resolver}/*.md`,
|
|
492
493
|
exclusions: [/\.test\.ts$/, /^index\.ts$/]
|
|
493
494
|
}];
|
|
494
495
|
}
|
|
495
|
-
function
|
|
496
|
+
function appTestCaseCategories(root) {
|
|
497
|
+
return {
|
|
498
|
+
name: "story-test-case",
|
|
499
|
+
docPattern: `${root}/*/${APP_PATHS.docs.businessFlow}/*/${APP_PATHS.docs.story}/*.md`,
|
|
500
|
+
testDir: APP_PATHS.tests.stories
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
function moduleTestCaseCategories(root) {
|
|
496
504
|
return [{
|
|
497
505
|
name: "command-test-case",
|
|
498
506
|
docPattern: `${root}/*/${MODULE_PATHS.docs.commands}/*.md`,
|
|
@@ -527,22 +535,22 @@ function buildCheckTargets(config) {
|
|
|
527
535
|
if (config.appRoot) {
|
|
528
536
|
const a = config.appRoot;
|
|
529
537
|
targets.push({
|
|
530
|
-
glob: `${a}/
|
|
538
|
+
glob: `${a}/README.md`,
|
|
531
539
|
schemaKey: "app"
|
|
532
540
|
}, {
|
|
533
|
-
glob: `${a}
|
|
541
|
+
glob: `${a}/${APP_PATHS.docs.actors}/*.md`,
|
|
534
542
|
schemaKey: "actors"
|
|
535
543
|
}, {
|
|
536
|
-
glob: `${a}
|
|
544
|
+
glob: `${a}/${APP_PATHS.docs.businessFlow}/*/README.md`,
|
|
537
545
|
schemaKey: "business-flow"
|
|
538
546
|
}, {
|
|
539
|
-
glob: `${a}
|
|
547
|
+
glob: `${a}/${APP_PATHS.docs.businessFlow}/*/${APP_PATHS.docs.story}/*.md`,
|
|
540
548
|
schemaKey: "story"
|
|
541
549
|
}, {
|
|
542
|
-
glob: `${a}
|
|
550
|
+
glob: `${a}/${APP_PATHS.docs.screen}/*.md`,
|
|
543
551
|
schemaKey: "screen"
|
|
544
552
|
}, {
|
|
545
|
-
glob: `${a}
|
|
553
|
+
glob: `${a}/${APP_PATHS.docs.resolver}/*.md`,
|
|
546
554
|
schemaKey: "resolver"
|
|
547
555
|
});
|
|
548
556
|
}
|
|
@@ -622,6 +630,12 @@ async function runInitAppWithReadme(name, dir, cwd) {
|
|
|
622
630
|
function success() {
|
|
623
631
|
return { exitCode: 0 };
|
|
624
632
|
}
|
|
633
|
+
function failure(message, exitCode = 1) {
|
|
634
|
+
return {
|
|
635
|
+
exitCode,
|
|
636
|
+
message
|
|
637
|
+
};
|
|
638
|
+
}
|
|
625
639
|
function silentFailure(exitCode = 1) {
|
|
626
640
|
return {
|
|
627
641
|
exitCode,
|
|
@@ -742,9 +756,9 @@ function parseItDescriptionsFromTest(content) {
|
|
|
742
756
|
function toCamelCase(pascalCase) {
|
|
743
757
|
return pascalCase.charAt(0).toLowerCase() + pascalCase.slice(1);
|
|
744
758
|
}
|
|
745
|
-
async function
|
|
759
|
+
async function runModuleTestCaseSyncCheck(root, cwd) {
|
|
746
760
|
const errors = [];
|
|
747
|
-
const categories =
|
|
761
|
+
const categories = moduleTestCaseCategories(root);
|
|
748
762
|
for (const category of categories) {
|
|
749
763
|
const docPaths = await fg(category.docPattern, { cwd });
|
|
750
764
|
for (const docPath of docPaths) {
|
|
@@ -758,7 +772,16 @@ async function runTestCaseSyncCheck(root, cwd) {
|
|
|
758
772
|
const testFileName = `${toCamelCase(docBasename)}.test.ts`;
|
|
759
773
|
const testPath = path.join(modulePath, category.testDir, testFileName);
|
|
760
774
|
const testFullPath = path.join(cwd, testPath);
|
|
761
|
-
if (!fs.existsSync(testFullPath))
|
|
775
|
+
if (!fs.existsSync(testFullPath)) {
|
|
776
|
+
errors.push({
|
|
777
|
+
type: "missing-test-file",
|
|
778
|
+
category: category.name,
|
|
779
|
+
docPath,
|
|
780
|
+
sourcePath: testPath,
|
|
781
|
+
expectedBasename: testFileName
|
|
782
|
+
});
|
|
783
|
+
continue;
|
|
784
|
+
}
|
|
762
785
|
const itDescriptions = parseItDescriptionsFromTest(fs.readFileSync(testFullPath, "utf-8"));
|
|
763
786
|
const docSet = new Set(docTestCases);
|
|
764
787
|
const testSet = new Set(itDescriptions);
|
|
@@ -780,15 +803,66 @@ async function runTestCaseSyncCheck(root, cwd) {
|
|
|
780
803
|
}
|
|
781
804
|
return errors;
|
|
782
805
|
}
|
|
806
|
+
function resolveStoryTestPath(docPath, testDir) {
|
|
807
|
+
const match = /^(.+)\/docs\/business-flow\/([^/]+)\/story\/([^/]+)\.md$/.exec(docPath);
|
|
808
|
+
if (!match) return null;
|
|
809
|
+
const [, appPath, flow, name] = match;
|
|
810
|
+
return `${appPath}/${testDir}/${flow}/${name}.test.ts`;
|
|
811
|
+
}
|
|
812
|
+
async function runAppTestCaseSyncCheck(appRoot, cwd) {
|
|
813
|
+
const errors = [];
|
|
814
|
+
const config = appTestCaseCategories(appRoot);
|
|
815
|
+
const docPaths = await fg(config.docPattern, { cwd });
|
|
816
|
+
for (const docPath of docPaths) {
|
|
817
|
+
const docFullPath = path.join(cwd, docPath);
|
|
818
|
+
const docTestCases = parseTestCasesFromDoc(fs.readFileSync(docFullPath, "utf-8"));
|
|
819
|
+
if (docTestCases.length === 0) continue;
|
|
820
|
+
const testPath = resolveStoryTestPath(docPath, config.testDir);
|
|
821
|
+
if (!testPath) continue;
|
|
822
|
+
const testFullPath = path.join(cwd, testPath);
|
|
823
|
+
if (!fs.existsSync(testFullPath)) {
|
|
824
|
+
errors.push({
|
|
825
|
+
type: "missing-test-file",
|
|
826
|
+
category: config.name,
|
|
827
|
+
docPath,
|
|
828
|
+
sourcePath: testPath,
|
|
829
|
+
expectedBasename: path.basename(testPath)
|
|
830
|
+
});
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
const itDescriptions = parseItDescriptionsFromTest(fs.readFileSync(testFullPath, "utf-8"));
|
|
834
|
+
const docSet = new Set(docTestCases);
|
|
835
|
+
const testSet = new Set(itDescriptions);
|
|
836
|
+
for (const docCase of docSet) if (!testSet.has(docCase)) errors.push({
|
|
837
|
+
type: "missing-test-case",
|
|
838
|
+
category: config.name,
|
|
839
|
+
docPath,
|
|
840
|
+
sourcePath: testPath,
|
|
841
|
+
expectedBasename: docCase
|
|
842
|
+
});
|
|
843
|
+
for (const testCase of testSet) if (!docSet.has(testCase)) errors.push({
|
|
844
|
+
type: "extra-test-case",
|
|
845
|
+
category: config.name,
|
|
846
|
+
docPath,
|
|
847
|
+
sourcePath: testPath,
|
|
848
|
+
expectedBasename: testCase
|
|
849
|
+
});
|
|
850
|
+
}
|
|
851
|
+
return errors;
|
|
852
|
+
}
|
|
783
853
|
//#endregion
|
|
784
854
|
//#region src/commands/sync-check.ts
|
|
785
855
|
async function runSyncCheck(config, cwd) {
|
|
786
856
|
const sourceResult = await runSourceSyncCheck(config, cwd);
|
|
787
857
|
if (config.modulesRoot) {
|
|
788
|
-
const testCaseErrors = await
|
|
858
|
+
const testCaseErrors = await runModuleTestCaseSyncCheck(config.modulesRoot, cwd);
|
|
789
859
|
sourceResult.errors.push(...testCaseErrors);
|
|
790
|
-
sourceResult.exitCode = sourceResult.errors.length > 0 ? 1 : 0;
|
|
791
860
|
}
|
|
861
|
+
if (config.appRoot) {
|
|
862
|
+
const storyErrors = await runAppTestCaseSyncCheck(config.appRoot, cwd);
|
|
863
|
+
sourceResult.errors.push(...storyErrors);
|
|
864
|
+
}
|
|
865
|
+
sourceResult.exitCode = sourceResult.errors.length > 0 ? 1 : 0;
|
|
792
866
|
return sourceResult;
|
|
793
867
|
}
|
|
794
868
|
function formatSyncCheckReport(result) {
|
|
@@ -817,6 +891,9 @@ function formatSyncCheckReport(result) {
|
|
|
817
891
|
} else if (error.type === "extra-test-case") {
|
|
818
892
|
lines.push(` ${chalk.red(error.sourcePath)}`);
|
|
819
893
|
lines.push(` ${chalk.yellow("Extra test case:")} "${error.expectedBasename}" is in test but not in doc`);
|
|
894
|
+
} else if (error.type === "missing-test-file") {
|
|
895
|
+
lines.push(` ${chalk.red(error.docPath)}`);
|
|
896
|
+
lines.push(` ${chalk.yellow("Missing test file:")} ${error.expectedBasename}`);
|
|
820
897
|
}
|
|
821
898
|
lines.push("");
|
|
822
899
|
}
|
|
@@ -1082,46 +1159,23 @@ export default createResolver({
|
|
|
1082
1159
|
});
|
|
1083
1160
|
`;
|
|
1084
1161
|
} },
|
|
1085
|
-
|
|
1086
|
-
return `import { describe, expect, it } from "vitest";
|
|
1162
|
+
storyTest: { render: (name, testCases) => {
|
|
1163
|
+
return `import { describe, expect, inject, it } from "vitest";
|
|
1164
|
+
import { createGraphQLClient } from "@/tests/utils/graphql-client";
|
|
1087
1165
|
|
|
1088
1166
|
describe("${name}", () => {
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
expect(resolver.default.name).toBe("${name}");
|
|
1093
|
-
});
|
|
1167
|
+
const graphQLClient = createGraphQLClient(inject("url"), inject("token"));
|
|
1168
|
+
|
|
1169
|
+
${testCases.map((tc) => ` it("${tc}", async () => {\n // TODO: implement\n });`).join("\n\n")}
|
|
1094
1170
|
});
|
|
1095
1171
|
`;
|
|
1096
1172
|
} }
|
|
1097
1173
|
};
|
|
1098
|
-
function renderStub(type, name) {
|
|
1174
|
+
function renderStub(type, name, testCases) {
|
|
1175
|
+
if (type === "storyTest") return templates.storyTest.render(name, testCases);
|
|
1099
1176
|
return templates[type].render(name);
|
|
1100
1177
|
}
|
|
1101
1178
|
//#endregion
|
|
1102
|
-
//#region src/generator/generate-stubs.ts
|
|
1103
|
-
function generateCommandStub(doc) {
|
|
1104
|
-
return renderStub("command", doc.commandName);
|
|
1105
|
-
}
|
|
1106
|
-
function generateTestStub(doc) {
|
|
1107
|
-
return renderStub("commandTest", doc.commandName);
|
|
1108
|
-
}
|
|
1109
|
-
function generateQueryStub(doc) {
|
|
1110
|
-
return renderStub("query", doc.commandName);
|
|
1111
|
-
}
|
|
1112
|
-
function generateQueryTestStub(doc) {
|
|
1113
|
-
return renderStub("queryTest", doc.commandName);
|
|
1114
|
-
}
|
|
1115
|
-
function generateDbStub(modelName) {
|
|
1116
|
-
return renderStub("db", modelName);
|
|
1117
|
-
}
|
|
1118
|
-
function generateResolverStub(resolverName) {
|
|
1119
|
-
return renderStub("resolver", resolverName);
|
|
1120
|
-
}
|
|
1121
|
-
function generateResolverTestStub(resolverName) {
|
|
1122
|
-
return renderStub("resolverTest", resolverName);
|
|
1123
|
-
}
|
|
1124
|
-
//#endregion
|
|
1125
1179
|
//#region src/generator/scaffold.ts
|
|
1126
1180
|
function copyTemplateDir(srcDir, destDir, replacements, placeholderFiles) {
|
|
1127
1181
|
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
@@ -1226,12 +1280,12 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1226
1280
|
console.log(` wrote ${path.relative(modulePath, shellFile)}`);
|
|
1227
1281
|
generated++;
|
|
1228
1282
|
if (!fs.existsSync(implFile)) {
|
|
1229
|
-
fs.writeFileSync(implFile,
|
|
1283
|
+
fs.writeFileSync(implFile, renderStub("command", doc.commandName));
|
|
1230
1284
|
console.log(` scaffolded ${path.relative(modulePath, implFile)}`);
|
|
1231
1285
|
}
|
|
1232
1286
|
const testFile = path.join(commandDir, `${doc.commandName}.test.ts`);
|
|
1233
1287
|
if (!fs.existsSync(testFile)) {
|
|
1234
|
-
fs.writeFileSync(testFile,
|
|
1288
|
+
fs.writeFileSync(testFile, renderStub("commandTest", doc.commandName));
|
|
1235
1289
|
console.log(` scaffolded ${path.relative(modulePath, testFile)}`);
|
|
1236
1290
|
}
|
|
1237
1291
|
}
|
|
@@ -1249,12 +1303,12 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1249
1303
|
generated++;
|
|
1250
1304
|
const implFile = path.join(queryDir, `${doc.commandName}.ts`);
|
|
1251
1305
|
if (!fs.existsSync(implFile)) {
|
|
1252
|
-
fs.writeFileSync(implFile,
|
|
1306
|
+
fs.writeFileSync(implFile, renderStub("query", doc.commandName));
|
|
1253
1307
|
console.log(` scaffolded ${path.relative(modulePath, implFile)}`);
|
|
1254
1308
|
}
|
|
1255
1309
|
const testFile = path.join(queryDir, `${doc.commandName}.test.ts`);
|
|
1256
1310
|
if (!fs.existsSync(testFile)) {
|
|
1257
|
-
fs.writeFileSync(testFile,
|
|
1311
|
+
fs.writeFileSync(testFile, renderStub("queryTest", doc.commandName));
|
|
1258
1312
|
console.log(` scaffolded ${path.relative(modulePath, testFile)}`);
|
|
1259
1313
|
}
|
|
1260
1314
|
}
|
|
@@ -1271,7 +1325,7 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1271
1325
|
const camelName = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
1272
1326
|
const dbFile = path.join(dbDir, `${camelName}.ts`);
|
|
1273
1327
|
if (!fs.existsSync(dbFile)) {
|
|
1274
|
-
fs.writeFileSync(dbFile,
|
|
1328
|
+
fs.writeFileSync(dbFile, renderStub("db", camelName));
|
|
1275
1329
|
console.log(` scaffolded ${path.relative(modulePath, dbFile)}`);
|
|
1276
1330
|
}
|
|
1277
1331
|
}
|
|
@@ -1314,7 +1368,7 @@ function resolveDocPath(type, name, modulePath) {
|
|
|
1314
1368
|
if (type === "story") {
|
|
1315
1369
|
const parts = name.split("/");
|
|
1316
1370
|
if (parts.length !== 2) throw new Error(`Story name must be "<flow>/<story>" (e.g., "onboarding/admin--create-user")`);
|
|
1317
|
-
return path.join(modulePath, APP_PATHS.docs.businessFlow, parts[0], APP_PATHS.
|
|
1371
|
+
return path.join(modulePath, APP_PATHS.docs.businessFlow, parts[0], APP_PATHS.docs.story, `${parts[1]}.md`);
|
|
1318
1372
|
}
|
|
1319
1373
|
if (MODULE_DIR_MAP[type]) return path.join(modulePath, MODULE_DIR_MAP[type], `${name}.md`);
|
|
1320
1374
|
if (APP_DIR_MAP[type]) return path.join(modulePath, APP_DIR_MAP[type], `${name}.md`);
|
|
@@ -1351,7 +1405,7 @@ async function runGenerateDoc(type, name, modulePath, cwd) {
|
|
|
1351
1405
|
}
|
|
1352
1406
|
//#endregion
|
|
1353
1407
|
//#region src/commands/module/generate.ts
|
|
1354
|
-
const cwd$
|
|
1408
|
+
const cwd$4 = process.cwd();
|
|
1355
1409
|
const pathArgs$2 = z.object({ path: arg(z.string(), {
|
|
1356
1410
|
alias: "p",
|
|
1357
1411
|
description: "Path to the module directory"
|
|
@@ -1375,7 +1429,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1375
1429
|
}),
|
|
1376
1430
|
run: (args) => {
|
|
1377
1431
|
return executeCommand(async () => {
|
|
1378
|
-
const exitCode = await runGenerateDoc(args.type, args.name, args.path, cwd$
|
|
1432
|
+
const exitCode = await runGenerateDoc(args.type, args.name, args.path, cwd$4);
|
|
1379
1433
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1380
1434
|
});
|
|
1381
1435
|
}
|
|
@@ -1386,7 +1440,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1386
1440
|
args: pathArgs$2,
|
|
1387
1441
|
run: (args) => {
|
|
1388
1442
|
return executeCommand(() => {
|
|
1389
|
-
const modulePath = path.resolve(cwd$
|
|
1443
|
+
const modulePath = path.resolve(cwd$4, args.path);
|
|
1390
1444
|
const moduleName = path.basename(modulePath);
|
|
1391
1445
|
console.log(`Generating code for ${moduleName}...`);
|
|
1392
1446
|
const exitCode = runGenerateCode(modulePath, moduleName);
|
|
@@ -1398,7 +1452,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1398
1452
|
});
|
|
1399
1453
|
//#endregion
|
|
1400
1454
|
//#region src/commands/module/index.ts
|
|
1401
|
-
const cwd$
|
|
1455
|
+
const cwd$3 = process.cwd();
|
|
1402
1456
|
const pathArgs$1 = z.object({ path: arg(z.string(), {
|
|
1403
1457
|
alias: "p",
|
|
1404
1458
|
description: "Path to modules directory"
|
|
@@ -1409,7 +1463,7 @@ const checkCommand$1 = defineCommand({
|
|
|
1409
1463
|
args: pathArgs$1,
|
|
1410
1464
|
run: (args) => {
|
|
1411
1465
|
return executeCommand(async () => {
|
|
1412
|
-
const exitCode = await runCheck({ modulesRoot: args.path }, cwd$
|
|
1466
|
+
const exitCode = await runCheck({ modulesRoot: args.path }, cwd$3);
|
|
1413
1467
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1414
1468
|
});
|
|
1415
1469
|
}
|
|
@@ -1420,7 +1474,7 @@ const syncCheckCommand$1 = defineCommand({
|
|
|
1420
1474
|
args: pathArgs$1,
|
|
1421
1475
|
run: (args) => {
|
|
1422
1476
|
return executeCommand(async () => {
|
|
1423
|
-
const result = await runSyncCheck({ modulesRoot: args.path }, cwd$
|
|
1477
|
+
const result = await runSyncCheck({ modulesRoot: args.path }, cwd$3);
|
|
1424
1478
|
console.log(formatSyncCheckReport(result));
|
|
1425
1479
|
return result.exitCode === 0 ? success() : silentFailure(result.exitCode);
|
|
1426
1480
|
});
|
|
@@ -1441,7 +1495,7 @@ const initCommand$2 = defineCommand({
|
|
|
1441
1495
|
}),
|
|
1442
1496
|
run: (args) => {
|
|
1443
1497
|
return executeCommand(async () => {
|
|
1444
|
-
const exitCode = await runInitModuleWithReadme(args.name, args.dir, cwd$
|
|
1498
|
+
const exitCode = await runInitModuleWithReadme(args.name, args.dir, cwd$3);
|
|
1445
1499
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1446
1500
|
});
|
|
1447
1501
|
}
|
|
@@ -1540,19 +1594,16 @@ function parseExceptionHandlingFromRaw(markdown) {
|
|
|
1540
1594
|
function runGenerateAppCode(appPath) {
|
|
1541
1595
|
const appName = path.basename(appPath);
|
|
1542
1596
|
scaffoldAppBoilerplate(appPath, appName);
|
|
1597
|
+
generateResolverStubs(appPath, appName);
|
|
1598
|
+
generateStoryTestStubs(appPath, appName);
|
|
1599
|
+
return 0;
|
|
1600
|
+
}
|
|
1601
|
+
function generateResolverStubs(appPath, appName) {
|
|
1543
1602
|
const docsDir = path.join(appPath, "docs", "resolver");
|
|
1544
|
-
|
|
1545
|
-
if (!fs.existsSync(docsDir)) {
|
|
1546
|
-
console.log(`No docs/resolver/ directory found — skipping resolver generation`);
|
|
1547
|
-
console.log(`Generated boilerplate for ${appName}`);
|
|
1548
|
-
return 0;
|
|
1549
|
-
}
|
|
1603
|
+
if (!fs.existsSync(docsDir)) return;
|
|
1550
1604
|
const mdFiles = fs.readdirSync(docsDir).filter((f) => f.endsWith(".md"));
|
|
1551
|
-
if (mdFiles.length === 0)
|
|
1552
|
-
|
|
1553
|
-
console.log(`Generated boilerplate for ${appName}`);
|
|
1554
|
-
return 0;
|
|
1555
|
-
}
|
|
1605
|
+
if (mdFiles.length === 0) return;
|
|
1606
|
+
const resolverDir = path.join(appPath, "backend", "src", "resolvers");
|
|
1556
1607
|
fs.mkdirSync(resolverDir, { recursive: true });
|
|
1557
1608
|
let generated = 0;
|
|
1558
1609
|
for (const file of mdFiles) {
|
|
@@ -1560,18 +1611,31 @@ function runGenerateAppCode(appPath) {
|
|
|
1560
1611
|
const doc = parseResolverDoc(path.basename(file, ".md"), content);
|
|
1561
1612
|
const implFile = path.join(resolverDir, `${doc.resolverName}.ts`);
|
|
1562
1613
|
if (!fs.existsSync(implFile)) {
|
|
1563
|
-
fs.writeFileSync(implFile,
|
|
1614
|
+
fs.writeFileSync(implFile, renderStub("resolver", doc.resolverName));
|
|
1564
1615
|
console.log(` scaffolded ${path.relative(appPath, implFile)}`);
|
|
1565
1616
|
generated++;
|
|
1566
1617
|
}
|
|
1567
|
-
const testFile = path.join(resolverDir, `${doc.resolverName}.test.ts`);
|
|
1568
|
-
if (!fs.existsSync(testFile)) {
|
|
1569
|
-
fs.writeFileSync(testFile, generateResolverTestStub(doc.resolverName));
|
|
1570
|
-
console.log(` scaffolded ${path.relative(appPath, testFile)}`);
|
|
1571
|
-
}
|
|
1572
1618
|
}
|
|
1573
|
-
console.log(`Scaffolded ${generated} resolver(s) for ${appName}`);
|
|
1574
|
-
|
|
1619
|
+
if (generated > 0) console.log(`Scaffolded ${generated} resolver(s) for ${appName}`);
|
|
1620
|
+
}
|
|
1621
|
+
function generateStoryTestStubs(appPath, appName) {
|
|
1622
|
+
const storyDocs = globSync(path.join(appPath, "docs/business-flow/*/story/*.md"));
|
|
1623
|
+
let generated = 0;
|
|
1624
|
+
for (const storyDocPath of storyDocs) {
|
|
1625
|
+
const testCases = parseTestCasesFromDoc(fs.readFileSync(storyDocPath, "utf-8"));
|
|
1626
|
+
if (testCases.length === 0) continue;
|
|
1627
|
+
const match = /\/docs\/business-flow\/([^/]+)\/story\/([^/]+)\.md$/.exec(storyDocPath);
|
|
1628
|
+
if (!match) continue;
|
|
1629
|
+
const [, flow, storyName] = match;
|
|
1630
|
+
const testDir = path.join(appPath, APP_PATHS.tests.stories, flow);
|
|
1631
|
+
const testFile = path.join(testDir, `${storyName}.test.ts`);
|
|
1632
|
+
if (fs.existsSync(testFile)) continue;
|
|
1633
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
1634
|
+
fs.writeFileSync(testFile, renderStub("storyTest", storyName, testCases));
|
|
1635
|
+
console.log(` scaffolded ${path.relative(appPath, testFile)}`);
|
|
1636
|
+
generated++;
|
|
1637
|
+
}
|
|
1638
|
+
if (generated > 0) console.log(`Scaffolded ${generated} story test(s) for ${appName}`);
|
|
1575
1639
|
}
|
|
1576
1640
|
//#endregion
|
|
1577
1641
|
//#region src/shared/uuidv5.ts
|
|
@@ -1958,6 +2022,359 @@ function runGenerateSeed(appPath) {
|
|
|
1958
2022
|
console.log(`Generated ${written} file(s), skipped ${skipped} existing`);
|
|
1959
2023
|
return 0;
|
|
1960
2024
|
}
|
|
2025
|
+
z.enum([
|
|
2026
|
+
"step.start",
|
|
2027
|
+
"step.complete",
|
|
2028
|
+
"decision",
|
|
2029
|
+
"agent.dispatch",
|
|
2030
|
+
"agent.result",
|
|
2031
|
+
"artifact.create",
|
|
2032
|
+
"validation",
|
|
2033
|
+
"error",
|
|
2034
|
+
"note"
|
|
2035
|
+
]);
|
|
2036
|
+
const StepStatus = z.enum([
|
|
2037
|
+
"pass",
|
|
2038
|
+
"fail",
|
|
2039
|
+
"blocked"
|
|
2040
|
+
]);
|
|
2041
|
+
const ArtifactType = z.enum([
|
|
2042
|
+
"doc",
|
|
2043
|
+
"code",
|
|
2044
|
+
"config",
|
|
2045
|
+
"report",
|
|
2046
|
+
"seed",
|
|
2047
|
+
"asset"
|
|
2048
|
+
]);
|
|
2049
|
+
const ArtifactOperation = z.enum([
|
|
2050
|
+
"create",
|
|
2051
|
+
"update",
|
|
2052
|
+
"delete"
|
|
2053
|
+
]);
|
|
2054
|
+
const ConversationMessage = z.object({
|
|
2055
|
+
role: z.enum(["user", "agent"]),
|
|
2056
|
+
message: z.string()
|
|
2057
|
+
});
|
|
2058
|
+
const GitContext = z.object({
|
|
2059
|
+
branch: z.string(),
|
|
2060
|
+
commit: z.string()
|
|
2061
|
+
});
|
|
2062
|
+
const StepStartData = z.object({
|
|
2063
|
+
skill: z.string(),
|
|
2064
|
+
context: z.record(z.string(), z.unknown())
|
|
2065
|
+
});
|
|
2066
|
+
const StepCompleteData = z.object({
|
|
2067
|
+
status: StepStatus,
|
|
2068
|
+
summary: z.string(),
|
|
2069
|
+
artifacts: z.array(z.string())
|
|
2070
|
+
});
|
|
2071
|
+
const DecisionData = z.object({
|
|
2072
|
+
question: z.string(),
|
|
2073
|
+
choice: z.string(),
|
|
2074
|
+
alternatives: z.array(z.string()),
|
|
2075
|
+
rationale: z.string()
|
|
2076
|
+
});
|
|
2077
|
+
const AgentDispatchData = z.object({
|
|
2078
|
+
agentName: z.string(),
|
|
2079
|
+
task: z.string(),
|
|
2080
|
+
inputs: z.record(z.string(), z.unknown())
|
|
2081
|
+
});
|
|
2082
|
+
const AgentResultData = z.object({
|
|
2083
|
+
agentName: z.string(),
|
|
2084
|
+
status: z.enum(["pass", "fail"]),
|
|
2085
|
+
outputs: z.record(z.string(), z.unknown()),
|
|
2086
|
+
duration_ms: z.number()
|
|
2087
|
+
});
|
|
2088
|
+
const ArtifactCreateData = z.object({
|
|
2089
|
+
path: z.string(),
|
|
2090
|
+
type: ArtifactType,
|
|
2091
|
+
operation: ArtifactOperation
|
|
2092
|
+
});
|
|
2093
|
+
const ValidationData = z.object({
|
|
2094
|
+
command: z.string(),
|
|
2095
|
+
status: z.enum(["pass", "fail"]),
|
|
2096
|
+
issues: z.array(z.string())
|
|
2097
|
+
});
|
|
2098
|
+
const ErrorData = z.object({
|
|
2099
|
+
message: z.string(),
|
|
2100
|
+
recoverable: z.boolean()
|
|
2101
|
+
});
|
|
2102
|
+
const NoteData = z.object({
|
|
2103
|
+
message: z.string(),
|
|
2104
|
+
tags: z.array(z.string())
|
|
2105
|
+
});
|
|
2106
|
+
const convField = () => z.array(ConversationMessage).default([]);
|
|
2107
|
+
const StepStartEntry = z.object({
|
|
2108
|
+
v: z.literal(1),
|
|
2109
|
+
timestamp: z.string().datetime(),
|
|
2110
|
+
sessionId: z.string(),
|
|
2111
|
+
prompt: z.string(),
|
|
2112
|
+
git: GitContext,
|
|
2113
|
+
conversation: convField(),
|
|
2114
|
+
event: z.literal("step.start"),
|
|
2115
|
+
data: StepStartData
|
|
2116
|
+
});
|
|
2117
|
+
const StepCompleteEntry = z.object({
|
|
2118
|
+
v: z.literal(1),
|
|
2119
|
+
timestamp: z.string().datetime(),
|
|
2120
|
+
sessionId: z.string(),
|
|
2121
|
+
prompt: z.string(),
|
|
2122
|
+
git: GitContext,
|
|
2123
|
+
conversation: convField(),
|
|
2124
|
+
event: z.literal("step.complete"),
|
|
2125
|
+
data: StepCompleteData
|
|
2126
|
+
});
|
|
2127
|
+
const DecisionEntry = z.object({
|
|
2128
|
+
v: z.literal(1),
|
|
2129
|
+
timestamp: z.string().datetime(),
|
|
2130
|
+
sessionId: z.string(),
|
|
2131
|
+
prompt: z.string(),
|
|
2132
|
+
git: GitContext,
|
|
2133
|
+
conversation: convField(),
|
|
2134
|
+
event: z.literal("decision"),
|
|
2135
|
+
data: DecisionData
|
|
2136
|
+
});
|
|
2137
|
+
const AgentDispatchEntry = z.object({
|
|
2138
|
+
v: z.literal(1),
|
|
2139
|
+
timestamp: z.string().datetime(),
|
|
2140
|
+
sessionId: z.string(),
|
|
2141
|
+
prompt: z.string(),
|
|
2142
|
+
git: GitContext,
|
|
2143
|
+
conversation: convField(),
|
|
2144
|
+
event: z.literal("agent.dispatch"),
|
|
2145
|
+
data: AgentDispatchData
|
|
2146
|
+
});
|
|
2147
|
+
const AgentResultEntry = z.object({
|
|
2148
|
+
v: z.literal(1),
|
|
2149
|
+
timestamp: z.string().datetime(),
|
|
2150
|
+
sessionId: z.string(),
|
|
2151
|
+
prompt: z.string(),
|
|
2152
|
+
git: GitContext,
|
|
2153
|
+
conversation: convField(),
|
|
2154
|
+
event: z.literal("agent.result"),
|
|
2155
|
+
data: AgentResultData
|
|
2156
|
+
});
|
|
2157
|
+
const ArtifactCreateEntry = z.object({
|
|
2158
|
+
v: z.literal(1),
|
|
2159
|
+
timestamp: z.string().datetime(),
|
|
2160
|
+
sessionId: z.string(),
|
|
2161
|
+
prompt: z.string(),
|
|
2162
|
+
git: GitContext,
|
|
2163
|
+
conversation: convField(),
|
|
2164
|
+
event: z.literal("artifact.create"),
|
|
2165
|
+
data: ArtifactCreateData
|
|
2166
|
+
});
|
|
2167
|
+
const ValidationEntry = z.object({
|
|
2168
|
+
v: z.literal(1),
|
|
2169
|
+
timestamp: z.string().datetime(),
|
|
2170
|
+
sessionId: z.string(),
|
|
2171
|
+
prompt: z.string(),
|
|
2172
|
+
git: GitContext,
|
|
2173
|
+
conversation: convField(),
|
|
2174
|
+
event: z.literal("validation"),
|
|
2175
|
+
data: ValidationData
|
|
2176
|
+
});
|
|
2177
|
+
const ErrorEntry = z.object({
|
|
2178
|
+
v: z.literal(1),
|
|
2179
|
+
timestamp: z.string().datetime(),
|
|
2180
|
+
sessionId: z.string(),
|
|
2181
|
+
prompt: z.string(),
|
|
2182
|
+
git: GitContext,
|
|
2183
|
+
conversation: convField(),
|
|
2184
|
+
event: z.literal("error"),
|
|
2185
|
+
data: ErrorData
|
|
2186
|
+
});
|
|
2187
|
+
const NoteEntry = z.object({
|
|
2188
|
+
v: z.literal(1),
|
|
2189
|
+
timestamp: z.string().datetime(),
|
|
2190
|
+
sessionId: z.string(),
|
|
2191
|
+
prompt: z.string(),
|
|
2192
|
+
git: GitContext,
|
|
2193
|
+
conversation: convField(),
|
|
2194
|
+
event: z.literal("note"),
|
|
2195
|
+
data: NoteData
|
|
2196
|
+
});
|
|
2197
|
+
const ProgressEntry = z.union([
|
|
2198
|
+
StepStartEntry,
|
|
2199
|
+
StepCompleteEntry,
|
|
2200
|
+
DecisionEntry,
|
|
2201
|
+
AgentDispatchEntry,
|
|
2202
|
+
AgentResultEntry,
|
|
2203
|
+
ArtifactCreateEntry,
|
|
2204
|
+
ValidationEntry,
|
|
2205
|
+
ErrorEntry,
|
|
2206
|
+
NoteEntry
|
|
2207
|
+
]);
|
|
2208
|
+
const StepStartInput = z.object({
|
|
2209
|
+
v: z.literal(1),
|
|
2210
|
+
sessionId: z.string(),
|
|
2211
|
+
prompt: z.string(),
|
|
2212
|
+
conversation: convField(),
|
|
2213
|
+
event: z.literal("step.start"),
|
|
2214
|
+
data: StepStartData
|
|
2215
|
+
});
|
|
2216
|
+
const StepCompleteInput = z.object({
|
|
2217
|
+
v: z.literal(1),
|
|
2218
|
+
sessionId: z.string(),
|
|
2219
|
+
prompt: z.string(),
|
|
2220
|
+
conversation: convField(),
|
|
2221
|
+
event: z.literal("step.complete"),
|
|
2222
|
+
data: StepCompleteData
|
|
2223
|
+
});
|
|
2224
|
+
const DecisionInput = z.object({
|
|
2225
|
+
v: z.literal(1),
|
|
2226
|
+
sessionId: z.string(),
|
|
2227
|
+
prompt: z.string(),
|
|
2228
|
+
conversation: convField(),
|
|
2229
|
+
event: z.literal("decision"),
|
|
2230
|
+
data: DecisionData
|
|
2231
|
+
});
|
|
2232
|
+
const AgentDispatchInput = z.object({
|
|
2233
|
+
v: z.literal(1),
|
|
2234
|
+
sessionId: z.string(),
|
|
2235
|
+
prompt: z.string(),
|
|
2236
|
+
conversation: convField(),
|
|
2237
|
+
event: z.literal("agent.dispatch"),
|
|
2238
|
+
data: AgentDispatchData
|
|
2239
|
+
});
|
|
2240
|
+
const AgentResultInput = z.object({
|
|
2241
|
+
v: z.literal(1),
|
|
2242
|
+
sessionId: z.string(),
|
|
2243
|
+
prompt: z.string(),
|
|
2244
|
+
conversation: convField(),
|
|
2245
|
+
event: z.literal("agent.result"),
|
|
2246
|
+
data: AgentResultData
|
|
2247
|
+
});
|
|
2248
|
+
const ArtifactCreateInput = z.object({
|
|
2249
|
+
v: z.literal(1),
|
|
2250
|
+
sessionId: z.string(),
|
|
2251
|
+
prompt: z.string(),
|
|
2252
|
+
conversation: convField(),
|
|
2253
|
+
event: z.literal("artifact.create"),
|
|
2254
|
+
data: ArtifactCreateData
|
|
2255
|
+
});
|
|
2256
|
+
const ValidationInput = z.object({
|
|
2257
|
+
v: z.literal(1),
|
|
2258
|
+
sessionId: z.string(),
|
|
2259
|
+
prompt: z.string(),
|
|
2260
|
+
conversation: convField(),
|
|
2261
|
+
event: z.literal("validation"),
|
|
2262
|
+
data: ValidationData
|
|
2263
|
+
});
|
|
2264
|
+
const ErrorInput = z.object({
|
|
2265
|
+
v: z.literal(1),
|
|
2266
|
+
sessionId: z.string(),
|
|
2267
|
+
prompt: z.string(),
|
|
2268
|
+
conversation: convField(),
|
|
2269
|
+
event: z.literal("error"),
|
|
2270
|
+
data: ErrorData
|
|
2271
|
+
});
|
|
2272
|
+
const NoteInput = z.object({
|
|
2273
|
+
v: z.literal(1),
|
|
2274
|
+
sessionId: z.string(),
|
|
2275
|
+
prompt: z.string(),
|
|
2276
|
+
conversation: convField(),
|
|
2277
|
+
event: z.literal("note"),
|
|
2278
|
+
data: NoteData
|
|
2279
|
+
});
|
|
2280
|
+
const ProgressInput = z.union([
|
|
2281
|
+
StepStartInput,
|
|
2282
|
+
StepCompleteInput,
|
|
2283
|
+
DecisionInput,
|
|
2284
|
+
AgentDispatchInput,
|
|
2285
|
+
AgentResultInput,
|
|
2286
|
+
ArtifactCreateInput,
|
|
2287
|
+
ValidationInput,
|
|
2288
|
+
ErrorInput,
|
|
2289
|
+
NoteInput
|
|
2290
|
+
]);
|
|
2291
|
+
//#endregion
|
|
2292
|
+
//#region src/commands/app/progress/git-context.ts
|
|
2293
|
+
function getGitContext(cwd) {
|
|
2294
|
+
return {
|
|
2295
|
+
branch: execFileSync("git", [
|
|
2296
|
+
"rev-parse",
|
|
2297
|
+
"--abbrev-ref",
|
|
2298
|
+
"HEAD"
|
|
2299
|
+
], {
|
|
2300
|
+
cwd,
|
|
2301
|
+
encoding: "utf-8"
|
|
2302
|
+
}).trim(),
|
|
2303
|
+
commit: execFileSync("git", [
|
|
2304
|
+
"rev-parse",
|
|
2305
|
+
"--short",
|
|
2306
|
+
"HEAD"
|
|
2307
|
+
], {
|
|
2308
|
+
cwd,
|
|
2309
|
+
encoding: "utf-8"
|
|
2310
|
+
}).trim()
|
|
2311
|
+
};
|
|
2312
|
+
}
|
|
2313
|
+
//#endregion
|
|
2314
|
+
//#region src/commands/app/progress/log.ts
|
|
2315
|
+
function runProgressLog(jsonInput, dryRun, cwd) {
|
|
2316
|
+
let parsed;
|
|
2317
|
+
try {
|
|
2318
|
+
parsed = JSON.parse(jsonInput);
|
|
2319
|
+
} catch {
|
|
2320
|
+
return failure("Invalid JSON input");
|
|
2321
|
+
}
|
|
2322
|
+
const inputResult = ProgressInput.safeParse(parsed);
|
|
2323
|
+
if (!inputResult.success) return failure(`Invalid progress input: ${inputResult.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ")}`);
|
|
2324
|
+
const enriched = {
|
|
2325
|
+
...inputResult.data,
|
|
2326
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2327
|
+
git: getGitContext(cwd)
|
|
2328
|
+
};
|
|
2329
|
+
const entryResult = ProgressEntry.safeParse(enriched);
|
|
2330
|
+
if (!entryResult.success) return failure(`Invalid progress entry after enrichment: ${entryResult.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ")}`);
|
|
2331
|
+
const line = JSON.stringify(entryResult.data);
|
|
2332
|
+
console.log(line);
|
|
2333
|
+
if (dryRun) return success();
|
|
2334
|
+
const erpKitDir = path.join(cwd, ".erp-kit");
|
|
2335
|
+
fs.mkdirSync(erpKitDir, { recursive: true });
|
|
2336
|
+
fs.appendFileSync(path.join(erpKitDir, "progress.jsonl"), line + "\n", "utf-8");
|
|
2337
|
+
return success();
|
|
2338
|
+
}
|
|
2339
|
+
//#endregion
|
|
2340
|
+
//#region src/commands/app/progress/schema-cmd.ts
|
|
2341
|
+
function runProgressSchema() {
|
|
2342
|
+
const jsonSchema = z.toJSONSchema(ProgressInput);
|
|
2343
|
+
console.log(JSON.stringify(jsonSchema, null, 2));
|
|
2344
|
+
return success();
|
|
2345
|
+
}
|
|
2346
|
+
//#endregion
|
|
2347
|
+
//#region src/commands/app/progress/index.ts
|
|
2348
|
+
const cwd$2 = process.cwd();
|
|
2349
|
+
const progressCommand = defineCommand({
|
|
2350
|
+
name: "progress",
|
|
2351
|
+
description: "Audit log for app skill sessions",
|
|
2352
|
+
subCommands: {
|
|
2353
|
+
log: defineCommand({
|
|
2354
|
+
name: "log",
|
|
2355
|
+
description: "Append a validated entry to the progress log",
|
|
2356
|
+
args: z.object({
|
|
2357
|
+
json: arg(z.string(), { description: "JSON payload (ProgressInput schema)" }),
|
|
2358
|
+
"dry-run": arg(z.boolean().default(false), { description: "Validate without writing" })
|
|
2359
|
+
}),
|
|
2360
|
+
run: (args) => {
|
|
2361
|
+
return executeCommand(() => {
|
|
2362
|
+
return runProgressLog(args.json, args["dry-run"], cwd$2);
|
|
2363
|
+
});
|
|
2364
|
+
}
|
|
2365
|
+
}),
|
|
2366
|
+
schema: defineCommand({
|
|
2367
|
+
name: "schema",
|
|
2368
|
+
description: "Output JSON Schema for progress log input",
|
|
2369
|
+
args: z.object({}),
|
|
2370
|
+
run: () => {
|
|
2371
|
+
return executeCommand(() => {
|
|
2372
|
+
return runProgressSchema();
|
|
2373
|
+
});
|
|
2374
|
+
}
|
|
2375
|
+
})
|
|
2376
|
+
}
|
|
2377
|
+
});
|
|
1961
2378
|
//#endregion
|
|
1962
2379
|
//#region src/commands/app/index.ts
|
|
1963
2380
|
const cwd$1 = process.cwd();
|
|
@@ -2063,7 +2480,8 @@ const appCommand = defineCommand({
|
|
|
2063
2480
|
check: checkCommand,
|
|
2064
2481
|
"sync-check": syncCheckCommand,
|
|
2065
2482
|
init: initCommand$1,
|
|
2066
|
-
generate: generateCommand
|
|
2483
|
+
generate: generateCommand,
|
|
2484
|
+
progress: progressCommand
|
|
2067
2485
|
}
|
|
2068
2486
|
});
|
|
2069
2487
|
//#endregion
|