@tailor-platform/erp-kit 0.6.0 → 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 +14 -0
- package/README.md +10 -10
- package/dist/cli.mjs +407 -69
- 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 +12 -0
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +12 -0
- package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -1
- 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/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/lib/discovery.test.ts +5 -7
- package/src/commands/lib/discovery.ts +8 -8
- 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 +43 -0
- package/src/commands/lib/sync-check-tests.ts +20 -2
- package/src/commands/sync-check.ts +3 -0
- package/src/generator/generate-app-code.test.ts +0 -6
- package/src/generator/generate-app-code.ts +3 -13
- package/src/generator/generate-code.test.ts +10 -40
- package/src/generator/generate-code.ts +6 -12
- package/src/generator/stub-templates.test.ts +0 -7
- package/src/generator/stub-templates.ts +0 -14
- 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/progress/schema.test.ts +161 -0
- package/src/progress/schema.ts +316 -0
- package/templates/scaffold/app/backend/package.json +1 -3
- package/templates/scaffold/app/backend/vitest.config.ts +4 -21
- package/src/generator/generate-stubs.ts +0 -35
package/dist/cli.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { z } from "zod";
|
|
|
5
5
|
import chalk from "chalk";
|
|
6
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";
|
|
@@ -488,8 +488,8 @@ function moduleCategories(root) {
|
|
|
488
488
|
function appComposeCategories(root) {
|
|
489
489
|
return [{
|
|
490
490
|
name: "resolver",
|
|
491
|
-
sourcePattern: `${root}
|
|
492
|
-
docPattern: `${root}
|
|
491
|
+
sourcePattern: `${root}/backend/src/resolvers/*.ts`,
|
|
492
|
+
docPattern: `${root}/${APP_PATHS.docs.resolver}/*.md`,
|
|
493
493
|
exclusions: [/\.test\.ts$/, /^index\.ts$/]
|
|
494
494
|
}];
|
|
495
495
|
}
|
|
@@ -535,22 +535,22 @@ function buildCheckTargets(config) {
|
|
|
535
535
|
if (config.appRoot) {
|
|
536
536
|
const a = config.appRoot;
|
|
537
537
|
targets.push({
|
|
538
|
-
glob: `${a}/
|
|
538
|
+
glob: `${a}/README.md`,
|
|
539
539
|
schemaKey: "app"
|
|
540
540
|
}, {
|
|
541
|
-
glob: `${a}
|
|
541
|
+
glob: `${a}/${APP_PATHS.docs.actors}/*.md`,
|
|
542
542
|
schemaKey: "actors"
|
|
543
543
|
}, {
|
|
544
|
-
glob: `${a}
|
|
544
|
+
glob: `${a}/${APP_PATHS.docs.businessFlow}/*/README.md`,
|
|
545
545
|
schemaKey: "business-flow"
|
|
546
546
|
}, {
|
|
547
|
-
glob: `${a}
|
|
547
|
+
glob: `${a}/${APP_PATHS.docs.businessFlow}/*/${APP_PATHS.docs.story}/*.md`,
|
|
548
548
|
schemaKey: "story"
|
|
549
549
|
}, {
|
|
550
|
-
glob: `${a}
|
|
550
|
+
glob: `${a}/${APP_PATHS.docs.screen}/*.md`,
|
|
551
551
|
schemaKey: "screen"
|
|
552
552
|
}, {
|
|
553
|
-
glob: `${a}
|
|
553
|
+
glob: `${a}/${APP_PATHS.docs.resolver}/*.md`,
|
|
554
554
|
schemaKey: "resolver"
|
|
555
555
|
});
|
|
556
556
|
}
|
|
@@ -630,6 +630,12 @@ async function runInitAppWithReadme(name, dir, cwd) {
|
|
|
630
630
|
function success() {
|
|
631
631
|
return { exitCode: 0 };
|
|
632
632
|
}
|
|
633
|
+
function failure(message, exitCode = 1) {
|
|
634
|
+
return {
|
|
635
|
+
exitCode,
|
|
636
|
+
message
|
|
637
|
+
};
|
|
638
|
+
}
|
|
633
639
|
function silentFailure(exitCode = 1) {
|
|
634
640
|
return {
|
|
635
641
|
exitCode,
|
|
@@ -766,7 +772,16 @@ async function runModuleTestCaseSyncCheck(root, cwd) {
|
|
|
766
772
|
const testFileName = `${toCamelCase(docBasename)}.test.ts`;
|
|
767
773
|
const testPath = path.join(modulePath, category.testDir, testFileName);
|
|
768
774
|
const testFullPath = path.join(cwd, testPath);
|
|
769
|
-
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
|
+
}
|
|
770
785
|
const itDescriptions = parseItDescriptionsFromTest(fs.readFileSync(testFullPath, "utf-8"));
|
|
771
786
|
const docSet = new Set(docTestCases);
|
|
772
787
|
const testSet = new Set(itDescriptions);
|
|
@@ -805,7 +820,16 @@ async function runAppTestCaseSyncCheck(appRoot, cwd) {
|
|
|
805
820
|
const testPath = resolveStoryTestPath(docPath, config.testDir);
|
|
806
821
|
if (!testPath) continue;
|
|
807
822
|
const testFullPath = path.join(cwd, testPath);
|
|
808
|
-
if (!fs.existsSync(testFullPath))
|
|
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
|
+
}
|
|
809
833
|
const itDescriptions = parseItDescriptionsFromTest(fs.readFileSync(testFullPath, "utf-8"));
|
|
810
834
|
const docSet = new Set(docTestCases);
|
|
811
835
|
const testSet = new Set(itDescriptions);
|
|
@@ -867,6 +891,9 @@ function formatSyncCheckReport(result) {
|
|
|
867
891
|
} else if (error.type === "extra-test-case") {
|
|
868
892
|
lines.push(` ${chalk.red(error.sourcePath)}`);
|
|
869
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}`);
|
|
870
897
|
}
|
|
871
898
|
lines.push("");
|
|
872
899
|
}
|
|
@@ -1130,18 +1157,6 @@ export default createResolver({
|
|
|
1130
1157
|
})
|
|
1131
1158
|
.description("${toPascal(name)} response"),
|
|
1132
1159
|
});
|
|
1133
|
-
`;
|
|
1134
|
-
} },
|
|
1135
|
-
resolverTest: { render: (name) => {
|
|
1136
|
-
return `import { describe, expect, it } from "vitest";
|
|
1137
|
-
|
|
1138
|
-
describe("${name}", () => {
|
|
1139
|
-
it("should be implemented", async () => {
|
|
1140
|
-
const resolver = await import("./${name}");
|
|
1141
|
-
expect(resolver.default).toBeDefined();
|
|
1142
|
-
expect(resolver.default.name).toBe("${name}");
|
|
1143
|
-
});
|
|
1144
|
-
});
|
|
1145
1160
|
`;
|
|
1146
1161
|
} },
|
|
1147
1162
|
storyTest: { render: (name, testCases) => {
|
|
@@ -1161,32 +1176,6 @@ function renderStub(type, name, testCases) {
|
|
|
1161
1176
|
return templates[type].render(name);
|
|
1162
1177
|
}
|
|
1163
1178
|
//#endregion
|
|
1164
|
-
//#region src/generator/generate-stubs.ts
|
|
1165
|
-
function generateCommandStub(doc) {
|
|
1166
|
-
return renderStub("command", doc.commandName);
|
|
1167
|
-
}
|
|
1168
|
-
function generateTestStub(doc) {
|
|
1169
|
-
return renderStub("commandTest", doc.commandName);
|
|
1170
|
-
}
|
|
1171
|
-
function generateQueryStub(doc) {
|
|
1172
|
-
return renderStub("query", doc.commandName);
|
|
1173
|
-
}
|
|
1174
|
-
function generateQueryTestStub(doc) {
|
|
1175
|
-
return renderStub("queryTest", doc.commandName);
|
|
1176
|
-
}
|
|
1177
|
-
function generateDbStub(modelName) {
|
|
1178
|
-
return renderStub("db", modelName);
|
|
1179
|
-
}
|
|
1180
|
-
function generateResolverStub(resolverName) {
|
|
1181
|
-
return renderStub("resolver", resolverName);
|
|
1182
|
-
}
|
|
1183
|
-
function generateResolverTestStub(resolverName) {
|
|
1184
|
-
return renderStub("resolverTest", resolverName);
|
|
1185
|
-
}
|
|
1186
|
-
function generateStoryTestStub(name, testCases) {
|
|
1187
|
-
return renderStub("storyTest", name, testCases);
|
|
1188
|
-
}
|
|
1189
|
-
//#endregion
|
|
1190
1179
|
//#region src/generator/scaffold.ts
|
|
1191
1180
|
function copyTemplateDir(srcDir, destDir, replacements, placeholderFiles) {
|
|
1192
1181
|
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
@@ -1291,12 +1280,12 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1291
1280
|
console.log(` wrote ${path.relative(modulePath, shellFile)}`);
|
|
1292
1281
|
generated++;
|
|
1293
1282
|
if (!fs.existsSync(implFile)) {
|
|
1294
|
-
fs.writeFileSync(implFile,
|
|
1283
|
+
fs.writeFileSync(implFile, renderStub("command", doc.commandName));
|
|
1295
1284
|
console.log(` scaffolded ${path.relative(modulePath, implFile)}`);
|
|
1296
1285
|
}
|
|
1297
1286
|
const testFile = path.join(commandDir, `${doc.commandName}.test.ts`);
|
|
1298
1287
|
if (!fs.existsSync(testFile)) {
|
|
1299
|
-
fs.writeFileSync(testFile,
|
|
1288
|
+
fs.writeFileSync(testFile, renderStub("commandTest", doc.commandName));
|
|
1300
1289
|
console.log(` scaffolded ${path.relative(modulePath, testFile)}`);
|
|
1301
1290
|
}
|
|
1302
1291
|
}
|
|
@@ -1314,12 +1303,12 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1314
1303
|
generated++;
|
|
1315
1304
|
const implFile = path.join(queryDir, `${doc.commandName}.ts`);
|
|
1316
1305
|
if (!fs.existsSync(implFile)) {
|
|
1317
|
-
fs.writeFileSync(implFile,
|
|
1306
|
+
fs.writeFileSync(implFile, renderStub("query", doc.commandName));
|
|
1318
1307
|
console.log(` scaffolded ${path.relative(modulePath, implFile)}`);
|
|
1319
1308
|
}
|
|
1320
1309
|
const testFile = path.join(queryDir, `${doc.commandName}.test.ts`);
|
|
1321
1310
|
if (!fs.existsSync(testFile)) {
|
|
1322
|
-
fs.writeFileSync(testFile,
|
|
1311
|
+
fs.writeFileSync(testFile, renderStub("queryTest", doc.commandName));
|
|
1323
1312
|
console.log(` scaffolded ${path.relative(modulePath, testFile)}`);
|
|
1324
1313
|
}
|
|
1325
1314
|
}
|
|
@@ -1336,7 +1325,7 @@ function runGenerateCode(modulePath, moduleName) {
|
|
|
1336
1325
|
const camelName = modelName.charAt(0).toLowerCase() + modelName.slice(1);
|
|
1337
1326
|
const dbFile = path.join(dbDir, `${camelName}.ts`);
|
|
1338
1327
|
if (!fs.existsSync(dbFile)) {
|
|
1339
|
-
fs.writeFileSync(dbFile,
|
|
1328
|
+
fs.writeFileSync(dbFile, renderStub("db", camelName));
|
|
1340
1329
|
console.log(` scaffolded ${path.relative(modulePath, dbFile)}`);
|
|
1341
1330
|
}
|
|
1342
1331
|
}
|
|
@@ -1416,7 +1405,7 @@ async function runGenerateDoc(type, name, modulePath, cwd) {
|
|
|
1416
1405
|
}
|
|
1417
1406
|
//#endregion
|
|
1418
1407
|
//#region src/commands/module/generate.ts
|
|
1419
|
-
const cwd$
|
|
1408
|
+
const cwd$4 = process.cwd();
|
|
1420
1409
|
const pathArgs$2 = z.object({ path: arg(z.string(), {
|
|
1421
1410
|
alias: "p",
|
|
1422
1411
|
description: "Path to the module directory"
|
|
@@ -1440,7 +1429,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1440
1429
|
}),
|
|
1441
1430
|
run: (args) => {
|
|
1442
1431
|
return executeCommand(async () => {
|
|
1443
|
-
const exitCode = await runGenerateDoc(args.type, args.name, args.path, cwd$
|
|
1432
|
+
const exitCode = await runGenerateDoc(args.type, args.name, args.path, cwd$4);
|
|
1444
1433
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1445
1434
|
});
|
|
1446
1435
|
}
|
|
@@ -1451,7 +1440,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1451
1440
|
args: pathArgs$2,
|
|
1452
1441
|
run: (args) => {
|
|
1453
1442
|
return executeCommand(() => {
|
|
1454
|
-
const modulePath = path.resolve(cwd$
|
|
1443
|
+
const modulePath = path.resolve(cwd$4, args.path);
|
|
1455
1444
|
const moduleName = path.basename(modulePath);
|
|
1456
1445
|
console.log(`Generating code for ${moduleName}...`);
|
|
1457
1446
|
const exitCode = runGenerateCode(modulePath, moduleName);
|
|
@@ -1463,7 +1452,7 @@ const generateCommand$1 = defineCommand({
|
|
|
1463
1452
|
});
|
|
1464
1453
|
//#endregion
|
|
1465
1454
|
//#region src/commands/module/index.ts
|
|
1466
|
-
const cwd$
|
|
1455
|
+
const cwd$3 = process.cwd();
|
|
1467
1456
|
const pathArgs$1 = z.object({ path: arg(z.string(), {
|
|
1468
1457
|
alias: "p",
|
|
1469
1458
|
description: "Path to modules directory"
|
|
@@ -1474,7 +1463,7 @@ const checkCommand$1 = defineCommand({
|
|
|
1474
1463
|
args: pathArgs$1,
|
|
1475
1464
|
run: (args) => {
|
|
1476
1465
|
return executeCommand(async () => {
|
|
1477
|
-
const exitCode = await runCheck({ modulesRoot: args.path }, cwd$
|
|
1466
|
+
const exitCode = await runCheck({ modulesRoot: args.path }, cwd$3);
|
|
1478
1467
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1479
1468
|
});
|
|
1480
1469
|
}
|
|
@@ -1485,7 +1474,7 @@ const syncCheckCommand$1 = defineCommand({
|
|
|
1485
1474
|
args: pathArgs$1,
|
|
1486
1475
|
run: (args) => {
|
|
1487
1476
|
return executeCommand(async () => {
|
|
1488
|
-
const result = await runSyncCheck({ modulesRoot: args.path }, cwd$
|
|
1477
|
+
const result = await runSyncCheck({ modulesRoot: args.path }, cwd$3);
|
|
1489
1478
|
console.log(formatSyncCheckReport(result));
|
|
1490
1479
|
return result.exitCode === 0 ? success() : silentFailure(result.exitCode);
|
|
1491
1480
|
});
|
|
@@ -1506,7 +1495,7 @@ const initCommand$2 = defineCommand({
|
|
|
1506
1495
|
}),
|
|
1507
1496
|
run: (args) => {
|
|
1508
1497
|
return executeCommand(async () => {
|
|
1509
|
-
const exitCode = await runInitModuleWithReadme(args.name, args.dir, cwd$
|
|
1498
|
+
const exitCode = await runInitModuleWithReadme(args.name, args.dir, cwd$3);
|
|
1510
1499
|
return exitCode === 0 ? success() : silentFailure(exitCode);
|
|
1511
1500
|
});
|
|
1512
1501
|
}
|
|
@@ -1622,15 +1611,10 @@ function generateResolverStubs(appPath, appName) {
|
|
|
1622
1611
|
const doc = parseResolverDoc(path.basename(file, ".md"), content);
|
|
1623
1612
|
const implFile = path.join(resolverDir, `${doc.resolverName}.ts`);
|
|
1624
1613
|
if (!fs.existsSync(implFile)) {
|
|
1625
|
-
fs.writeFileSync(implFile,
|
|
1614
|
+
fs.writeFileSync(implFile, renderStub("resolver", doc.resolverName));
|
|
1626
1615
|
console.log(` scaffolded ${path.relative(appPath, implFile)}`);
|
|
1627
1616
|
generated++;
|
|
1628
1617
|
}
|
|
1629
|
-
const testFile = path.join(resolverDir, `${doc.resolverName}.test.ts`);
|
|
1630
|
-
if (!fs.existsSync(testFile)) {
|
|
1631
|
-
fs.writeFileSync(testFile, generateResolverTestStub(doc.resolverName));
|
|
1632
|
-
console.log(` scaffolded ${path.relative(appPath, testFile)}`);
|
|
1633
|
-
}
|
|
1634
1618
|
}
|
|
1635
1619
|
if (generated > 0) console.log(`Scaffolded ${generated} resolver(s) for ${appName}`);
|
|
1636
1620
|
}
|
|
@@ -1647,7 +1631,7 @@ function generateStoryTestStubs(appPath, appName) {
|
|
|
1647
1631
|
const testFile = path.join(testDir, `${storyName}.test.ts`);
|
|
1648
1632
|
if (fs.existsSync(testFile)) continue;
|
|
1649
1633
|
fs.mkdirSync(testDir, { recursive: true });
|
|
1650
|
-
fs.writeFileSync(testFile,
|
|
1634
|
+
fs.writeFileSync(testFile, renderStub("storyTest", storyName, testCases));
|
|
1651
1635
|
console.log(` scaffolded ${path.relative(appPath, testFile)}`);
|
|
1652
1636
|
generated++;
|
|
1653
1637
|
}
|
|
@@ -2038,6 +2022,359 @@ function runGenerateSeed(appPath) {
|
|
|
2038
2022
|
console.log(`Generated ${written} file(s), skipped ${skipped} existing`);
|
|
2039
2023
|
return 0;
|
|
2040
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
|
+
});
|
|
2041
2378
|
//#endregion
|
|
2042
2379
|
//#region src/commands/app/index.ts
|
|
2043
2380
|
const cwd$1 = process.cwd();
|
|
@@ -2143,7 +2480,8 @@ const appCommand = defineCommand({
|
|
|
2143
2480
|
check: checkCommand,
|
|
2144
2481
|
"sync-check": syncCheckCommand,
|
|
2145
2482
|
init: initCommand$1,
|
|
2146
|
-
generate: generateCommand
|
|
2483
|
+
generate: generateCommand,
|
|
2484
|
+
progress: progressCommand
|
|
2147
2485
|
}
|
|
2148
2486
|
});
|
|
2149
2487
|
//#endregion
|