@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.
Files changed (290) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +10 -10
  3. package/dist/cli.mjs +407 -69
  4. package/package.json +1 -1
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +33 -17
  6. package/skills/erp-kit-app-2-requirements-review/SKILL.md +12 -0
  7. package/skills/erp-kit-app-3-plan/SKILL.md +18 -4
  8. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +1 -1
  9. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +1 -1
  10. package/skills/erp-kit-app-4-plan-review/SKILL.md +12 -0
  11. package/skills/erp-kit-app-5-impl-backend/SKILL.md +12 -0
  12. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +12 -0
  13. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -1
  14. package/skills/erp-kit-app-shared/references/progress-protocol.md +77 -0
  15. package/skills/erp-kit-mock-scenario/SKILL.md +1 -1
  16. package/skills/erp-kit-module-1-requirements/SKILL.md +1 -1
  17. package/skills/erp-kit-module-3-plan/SKILL.md +3 -3
  18. package/skills/erp-kit-module-3-update-plan/SKILL.md +3 -3
  19. package/skills/erp-kit-module-5-impl/SKILL.md +1 -1
  20. package/src/commands/app/index.ts +2 -0
  21. package/src/commands/app/progress/git-context.ts +16 -0
  22. package/src/commands/app/progress/index.ts +45 -0
  23. package/src/commands/app/progress/log.ts +49 -0
  24. package/src/commands/app/progress/progress.test.ts +128 -0
  25. package/src/commands/app/progress/schema-cmd.ts +10 -0
  26. package/src/commands/check.test.ts +4 -4
  27. package/src/commands/lib/discovery.test.ts +5 -7
  28. package/src/commands/lib/discovery.ts +8 -8
  29. package/src/commands/lib/sync-check-source.test.ts +1 -1
  30. package/src/commands/lib/sync-check-source.ts +6 -1
  31. package/src/commands/lib/sync-check-tests.test.ts +43 -0
  32. package/src/commands/lib/sync-check-tests.ts +20 -2
  33. package/src/commands/sync-check.ts +3 -0
  34. package/src/generator/generate-app-code.test.ts +0 -6
  35. package/src/generator/generate-app-code.ts +3 -13
  36. package/src/generator/generate-code.test.ts +10 -40
  37. package/src/generator/generate-code.ts +6 -12
  38. package/src/generator/stub-templates.test.ts +0 -7
  39. package/src/generator/stub-templates.ts +0 -14
  40. package/src/modules/finance-ledger/README.md +50 -0
  41. package/src/modules/finance-ledger/command/.gitkeep +0 -0
  42. package/src/modules/finance-ledger/command/addJournalLine.generated.ts +6 -0
  43. package/src/modules/finance-ledger/command/addJournalLine.test.ts +438 -0
  44. package/src/modules/finance-ledger/command/addJournalLine.ts +122 -0
  45. package/src/modules/finance-ledger/command/approveAndLockPeriod.generated.ts +6 -0
  46. package/src/modules/finance-ledger/command/approveAndLockPeriod.test.ts +107 -0
  47. package/src/modules/finance-ledger/command/approveAndLockPeriod.ts +72 -0
  48. package/src/modules/finance-ledger/command/beginClose.generated.ts +6 -0
  49. package/src/modules/finance-ledger/command/beginClose.test.ts +106 -0
  50. package/src/modules/finance-ledger/command/beginClose.ts +58 -0
  51. package/src/modules/finance-ledger/command/closePeriod.generated.ts +6 -0
  52. package/src/modules/finance-ledger/command/closePeriod.test.ts +87 -0
  53. package/src/modules/finance-ledger/command/closePeriod.ts +44 -0
  54. package/src/modules/finance-ledger/command/createAccountingPeriod.generated.ts +6 -0
  55. package/src/modules/finance-ledger/command/createAccountingPeriod.test.ts +425 -0
  56. package/src/modules/finance-ledger/command/createAccountingPeriod.ts +133 -0
  57. package/src/modules/finance-ledger/command/createFiscalYear.generated.ts +6 -0
  58. package/src/modules/finance-ledger/command/createFiscalYear.test.ts +197 -0
  59. package/src/modules/finance-ledger/command/createFiscalYear.ts +70 -0
  60. package/src/modules/finance-ledger/command/createJournalEntry.generated.ts +6 -0
  61. package/src/modules/finance-ledger/command/createJournalEntry.test.ts +261 -0
  62. package/src/modules/finance-ledger/command/createJournalEntry.ts +121 -0
  63. package/src/modules/finance-ledger/command/deleteAccountingPeriod.generated.ts +6 -0
  64. package/src/modules/finance-ledger/command/deleteAccountingPeriod.test.ts +71 -0
  65. package/src/modules/finance-ledger/command/deleteAccountingPeriod.ts +55 -0
  66. package/src/modules/finance-ledger/command/deleteFiscalYear.generated.ts +6 -0
  67. package/src/modules/finance-ledger/command/deleteFiscalYear.test.ts +38 -0
  68. package/src/modules/finance-ledger/command/deleteFiscalYear.ts +34 -0
  69. package/src/modules/finance-ledger/command/deleteJournalEntry.generated.ts +6 -0
  70. package/src/modules/finance-ledger/command/deleteJournalEntry.test.ts +58 -0
  71. package/src/modules/finance-ledger/command/deleteJournalEntry.ts +43 -0
  72. package/src/modules/finance-ledger/command/executeYearEndClose.generated.ts +6 -0
  73. package/src/modules/finance-ledger/command/executeYearEndClose.test.ts +239 -0
  74. package/src/modules/finance-ledger/command/executeYearEndClose.ts +415 -0
  75. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.generated.ts +6 -0
  76. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.test.ts +102 -0
  77. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.ts +76 -0
  78. package/src/modules/finance-ledger/command/finalizeFinancialStatement.generated.ts +6 -0
  79. package/src/modules/finance-ledger/command/finalizeFinancialStatement.test.ts +73 -0
  80. package/src/modules/finance-ledger/command/finalizeFinancialStatement.ts +73 -0
  81. package/src/modules/finance-ledger/command/generateFinancialStatement.generated.ts +6 -0
  82. package/src/modules/finance-ledger/command/generateFinancialStatement.test.ts +311 -0
  83. package/src/modules/finance-ledger/command/generateFinancialStatement.ts +275 -0
  84. package/src/modules/finance-ledger/command/generatePreliminaryStatements.generated.ts +6 -0
  85. package/src/modules/finance-ledger/command/generatePreliminaryStatements.test.ts +152 -0
  86. package/src/modules/finance-ledger/command/generatePreliminaryStatements.ts +140 -0
  87. package/src/modules/finance-ledger/command/generateTrialBalance.generated.ts +6 -0
  88. package/src/modules/finance-ledger/command/generateTrialBalance.test.ts +439 -0
  89. package/src/modules/finance-ledger/command/generateTrialBalance.ts +268 -0
  90. package/src/modules/finance-ledger/command/initiatePeriodClose.generated.ts +6 -0
  91. package/src/modules/finance-ledger/command/initiatePeriodClose.test.ts +153 -0
  92. package/src/modules/finance-ledger/command/initiatePeriodClose.ts +84 -0
  93. package/src/modules/finance-ledger/command/openForAdvanceEntry.generated.ts +6 -0
  94. package/src/modules/finance-ledger/command/openForAdvanceEntry.test.ts +87 -0
  95. package/src/modules/finance-ledger/command/openForAdvanceEntry.ts +44 -0
  96. package/src/modules/finance-ledger/command/openPeriod.generated.ts +6 -0
  97. package/src/modules/finance-ledger/command/openPeriod.test.ts +90 -0
  98. package/src/modules/finance-ledger/command/openPeriod.ts +44 -0
  99. package/src/modules/finance-ledger/command/permanentlyClosePeriod.generated.ts +6 -0
  100. package/src/modules/finance-ledger/command/permanentlyClosePeriod.test.ts +87 -0
  101. package/src/modules/finance-ledger/command/permanentlyClosePeriod.ts +48 -0
  102. package/src/modules/finance-ledger/command/postAdjustingEntries.generated.ts +6 -0
  103. package/src/modules/finance-ledger/command/postAdjustingEntries.test.ts +392 -0
  104. package/src/modules/finance-ledger/command/postAdjustingEntries.ts +156 -0
  105. package/src/modules/finance-ledger/command/postJournalEntry.generated.ts +6 -0
  106. package/src/modules/finance-ledger/command/postJournalEntry.test.ts +346 -0
  107. package/src/modules/finance-ledger/command/postJournalEntry.ts +160 -0
  108. package/src/modules/finance-ledger/command/processInventoryHandoff.generated.ts +6 -0
  109. package/src/modules/finance-ledger/command/processInventoryHandoff.test.ts +211 -0
  110. package/src/modules/finance-ledger/command/processInventoryHandoff.ts +133 -0
  111. package/src/modules/finance-ledger/command/processManufacturingHandoff.generated.ts +6 -0
  112. package/src/modules/finance-ledger/command/processManufacturingHandoff.test.ts +221 -0
  113. package/src/modules/finance-ledger/command/processManufacturingHandoff.ts +133 -0
  114. package/src/modules/finance-ledger/command/processPurchaseHandoff.generated.ts +6 -0
  115. package/src/modules/finance-ledger/command/processPurchaseHandoff.test.ts +222 -0
  116. package/src/modules/finance-ledger/command/processPurchaseHandoff.ts +133 -0
  117. package/src/modules/finance-ledger/command/processSalesHandoff.generated.ts +6 -0
  118. package/src/modules/finance-ledger/command/processSalesHandoff.test.ts +257 -0
  119. package/src/modules/finance-ledger/command/processSalesHandoff.ts +135 -0
  120. package/src/modules/finance-ledger/command/regenerateFinancialStatement.generated.ts +6 -0
  121. package/src/modules/finance-ledger/command/regenerateFinancialStatement.test.ts +129 -0
  122. package/src/modules/finance-ledger/command/regenerateFinancialStatement.ts +186 -0
  123. package/src/modules/finance-ledger/command/removeJournalLine.generated.ts +6 -0
  124. package/src/modules/finance-ledger/command/removeJournalLine.test.ts +65 -0
  125. package/src/modules/finance-ledger/command/removeJournalLine.ts +39 -0
  126. package/src/modules/finance-ledger/command/reopenPeriod.generated.ts +6 -0
  127. package/src/modules/finance-ledger/command/reopenPeriod.test.ts +87 -0
  128. package/src/modules/finance-ledger/command/reopenPeriod.ts +44 -0
  129. package/src/modules/finance-ledger/command/reverseJournalEntry.generated.ts +6 -0
  130. package/src/modules/finance-ledger/command/reverseJournalEntry.test.ts +337 -0
  131. package/src/modules/finance-ledger/command/reverseJournalEntry.ts +140 -0
  132. package/src/modules/finance-ledger/command/revertSoftLock.generated.ts +6 -0
  133. package/src/modules/finance-ledger/command/revertSoftLock.test.ts +96 -0
  134. package/src/modules/finance-ledger/command/revertSoftLock.ts +67 -0
  135. package/src/modules/finance-ledger/command/updateFiscalYear.generated.ts +6 -0
  136. package/src/modules/finance-ledger/command/updateFiscalYear.test.ts +138 -0
  137. package/src/modules/finance-ledger/command/updateFiscalYear.ts +85 -0
  138. package/src/modules/finance-ledger/command/updateJournalEntry.generated.ts +6 -0
  139. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +195 -0
  140. package/src/modules/finance-ledger/command/updateJournalEntry.ts +86 -0
  141. package/src/modules/finance-ledger/command/updateJournalLine.generated.ts +6 -0
  142. package/src/modules/finance-ledger/command/updateJournalLine.test.ts +385 -0
  143. package/src/modules/finance-ledger/command/updateJournalLine.ts +155 -0
  144. package/src/modules/finance-ledger/command/verifySubledgerTransfers.generated.ts +6 -0
  145. package/src/modules/finance-ledger/command/verifySubledgerTransfers.test.ts +201 -0
  146. package/src/modules/finance-ledger/command/verifySubledgerTransfers.ts +113 -0
  147. package/src/modules/finance-ledger/command/verifyTrialBalance.generated.ts +6 -0
  148. package/src/modules/finance-ledger/command/verifyTrialBalance.test.ts +136 -0
  149. package/src/modules/finance-ledger/command/verifyTrialBalance.ts +97 -0
  150. package/src/modules/finance-ledger/db/.gitkeep +0 -0
  151. package/src/modules/finance-ledger/db/accountingPeriod.ts +58 -0
  152. package/src/modules/finance-ledger/db/financialStatement.ts +92 -0
  153. package/src/modules/finance-ledger/db/financialStatementLineItem.ts +76 -0
  154. package/src/modules/finance-ledger/db/fiscalYear.ts +41 -0
  155. package/src/modules/finance-ledger/db/journalEntry.ts +101 -0
  156. package/src/modules/finance-ledger/db/journalLine.ts +64 -0
  157. package/src/modules/finance-ledger/db/periodClose.ts +97 -0
  158. package/src/modules/finance-ledger/db/trialBalance.ts +63 -0
  159. package/src/modules/finance-ledger/db/trialBalanceLine.ts +63 -0
  160. package/src/modules/finance-ledger/docs/commands/AddJournalLine.md +74 -0
  161. package/src/modules/finance-ledger/docs/commands/ApproveAndLockPeriod.md +53 -0
  162. package/src/modules/finance-ledger/docs/commands/BeginClose.md +47 -0
  163. package/src/modules/finance-ledger/docs/commands/ClosePeriod.md +45 -0
  164. package/src/modules/finance-ledger/docs/commands/CreateAccountingPeriod.md +69 -0
  165. package/src/modules/finance-ledger/docs/commands/CreateFiscalYear.md +56 -0
  166. package/src/modules/finance-ledger/docs/commands/CreateJournalEntry.md +63 -0
  167. package/src/modules/finance-ledger/docs/commands/DeleteAccountingPeriod.md +46 -0
  168. package/src/modules/finance-ledger/docs/commands/DeleteFiscalYear.md +40 -0
  169. package/src/modules/finance-ledger/docs/commands/DeleteJournalEntry.md +44 -0
  170. package/src/modules/finance-ledger/docs/commands/ExecuteYearEndClose.md +81 -0
  171. package/src/modules/finance-ledger/docs/commands/FinalCloseAndLockPeriod.md +49 -0
  172. package/src/modules/finance-ledger/docs/commands/FinalizeFinancialStatement.md +43 -0
  173. package/src/modules/finance-ledger/docs/commands/GenerateFinancialStatement.md +86 -0
  174. package/src/modules/finance-ledger/docs/commands/GeneratePreliminaryStatements.md +53 -0
  175. package/src/modules/finance-ledger/docs/commands/GenerateTrialBalance.md +75 -0
  176. package/src/modules/finance-ledger/docs/commands/InitiatePeriodClose.md +58 -0
  177. package/src/modules/finance-ledger/docs/commands/OpenForAdvanceEntry.md +44 -0
  178. package/src/modules/finance-ledger/docs/commands/OpenPeriod.md +45 -0
  179. package/src/modules/finance-ledger/docs/commands/PermanentlyClosePeriod.md +45 -0
  180. package/src/modules/finance-ledger/docs/commands/PostAdjustingEntries.md +61 -0
  181. package/src/modules/finance-ledger/docs/commands/PostJournalEntry.md +81 -0
  182. package/src/modules/finance-ledger/docs/commands/ProcessInventoryHandoff.md +72 -0
  183. package/src/modules/finance-ledger/docs/commands/ProcessManufacturingHandoff.md +68 -0
  184. package/src/modules/finance-ledger/docs/commands/ProcessPurchaseHandoff.md +68 -0
  185. package/src/modules/finance-ledger/docs/commands/ProcessSalesHandoff.md +71 -0
  186. package/src/modules/finance-ledger/docs/commands/RegenerateFinancialStatement.md +60 -0
  187. package/src/modules/finance-ledger/docs/commands/RemoveJournalLine.md +42 -0
  188. package/src/modules/finance-ledger/docs/commands/ReopenPeriod.md +45 -0
  189. package/src/modules/finance-ledger/docs/commands/ReverseJournalEntry.md +62 -0
  190. package/src/modules/finance-ledger/docs/commands/RevertSoftLock.md +49 -0
  191. package/src/modules/finance-ledger/docs/commands/UpdateFiscalYear.md +60 -0
  192. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +50 -0
  193. package/src/modules/finance-ledger/docs/commands/UpdateJournalLine.md +61 -0
  194. package/src/modules/finance-ledger/docs/commands/VerifySubledgerTransfers.md +59 -0
  195. package/src/modules/finance-ledger/docs/commands/VerifyTrialBalance.md +53 -0
  196. package/src/modules/finance-ledger/docs/features/accounting-period-management.md +110 -0
  197. package/src/modules/finance-ledger/docs/features/financial-statement-generation.md +115 -0
  198. package/src/modules/finance-ledger/docs/features/journal-entry-management.md +138 -0
  199. package/src/modules/finance-ledger/docs/features/period-end-close.md +102 -0
  200. package/src/modules/finance-ledger/docs/features/subledger-integration.md +141 -0
  201. package/src/modules/finance-ledger/docs/features/trial-balance.md +99 -0
  202. package/src/modules/finance-ledger/docs/features/year-end-close.md +84 -0
  203. package/src/modules/finance-ledger/docs/models/AccountingPeriod.md +71 -0
  204. package/src/modules/finance-ledger/docs/models/FinancialStatement.md +76 -0
  205. package/src/modules/finance-ledger/docs/models/FinancialStatementLineItem.md +41 -0
  206. package/src/modules/finance-ledger/docs/models/FiscalYear.md +41 -0
  207. package/src/modules/finance-ledger/docs/models/JournalEntry.md +80 -0
  208. package/src/modules/finance-ledger/docs/models/JournalLine.md +47 -0
  209. package/src/modules/finance-ledger/docs/models/PeriodClose.md +83 -0
  210. package/src/modules/finance-ledger/docs/models/TrialBalance.md +56 -0
  211. package/src/modules/finance-ledger/docs/models/TrialBalanceLine.md +37 -0
  212. package/src/modules/finance-ledger/docs/queries/GetAccountingPeriod.md +35 -0
  213. package/src/modules/finance-ledger/docs/queries/GetFinancialStatement.md +38 -0
  214. package/src/modules/finance-ledger/docs/queries/GetFiscalYear.md +35 -0
  215. package/src/modules/finance-ledger/docs/queries/GetJournalEntry.md +37 -0
  216. package/src/modules/finance-ledger/docs/queries/GetPeriodByDate.md +38 -0
  217. package/src/modules/finance-ledger/docs/queries/GetPeriodClose.md +36 -0
  218. package/src/modules/finance-ledger/docs/queries/GetSubledgerTransferStatus.md +45 -0
  219. package/src/modules/finance-ledger/docs/queries/GetTrialBalance.md +38 -0
  220. package/src/modules/finance-ledger/docs/queries/ListAccountingPeriods.md +46 -0
  221. package/src/modules/finance-ledger/docs/queries/ListFinancialStatements.md +46 -0
  222. package/src/modules/finance-ledger/docs/queries/ListFiscalYears.md +42 -0
  223. package/src/modules/finance-ledger/docs/queries/ListJournalEntries.md +48 -0
  224. package/src/modules/finance-ledger/docs/queries/ListPeriodCloses.md +46 -0
  225. package/src/modules/finance-ledger/docs/queries/ListTrialBalances.md +51 -0
  226. package/src/modules/finance-ledger/executor/.gitkeep +0 -0
  227. package/src/modules/finance-ledger/generated/enums.ts +109 -0
  228. package/src/modules/finance-ledger/generated/kysely-tailordb.ts +202 -0
  229. package/src/modules/finance-ledger/index.ts +2 -0
  230. package/src/modules/finance-ledger/lib/_db_deps.ts +56 -0
  231. package/src/modules/finance-ledger/lib/errors.generated.ts +332 -0
  232. package/src/modules/finance-ledger/lib/permissions.generated.ts +41 -0
  233. package/src/modules/finance-ledger/lib/types.ts +66 -0
  234. package/src/modules/finance-ledger/module.ts +262 -0
  235. package/src/modules/finance-ledger/package.json +26 -0
  236. package/src/modules/finance-ledger/permissions.ts +3 -0
  237. package/src/modules/finance-ledger/query/.gitkeep +0 -0
  238. package/src/modules/finance-ledger/query/getAccountingPeriod.generated.ts +5 -0
  239. package/src/modules/finance-ledger/query/getAccountingPeriod.test.ts +31 -0
  240. package/src/modules/finance-ledger/query/getAccountingPeriod.ts +21 -0
  241. package/src/modules/finance-ledger/query/getFinancialStatement.generated.ts +5 -0
  242. package/src/modules/finance-ledger/query/getFinancialStatement.test.ts +35 -0
  243. package/src/modules/finance-ledger/query/getFinancialStatement.ts +29 -0
  244. package/src/modules/finance-ledger/query/getFiscalYear.generated.ts +5 -0
  245. package/src/modules/finance-ledger/query/getFiscalYear.test.ts +31 -0
  246. package/src/modules/finance-ledger/query/getFiscalYear.ts +21 -0
  247. package/src/modules/finance-ledger/query/getJournalEntry.generated.ts +5 -0
  248. package/src/modules/finance-ledger/query/getJournalEntry.test.ts +35 -0
  249. package/src/modules/finance-ledger/query/getJournalEntry.ts +29 -0
  250. package/src/modules/finance-ledger/query/getPeriodByDate.generated.ts +5 -0
  251. package/src/modules/finance-ledger/query/getPeriodByDate.test.ts +53 -0
  252. package/src/modules/finance-ledger/query/getPeriodByDate.ts +27 -0
  253. package/src/modules/finance-ledger/query/getPeriodClose.generated.ts +5 -0
  254. package/src/modules/finance-ledger/query/getPeriodClose.test.ts +31 -0
  255. package/src/modules/finance-ledger/query/getPeriodClose.ts +21 -0
  256. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.generated.ts +5 -0
  257. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.test.ts +101 -0
  258. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.ts +68 -0
  259. package/src/modules/finance-ledger/query/getTrialBalance.generated.ts +5 -0
  260. package/src/modules/finance-ledger/query/getTrialBalance.test.ts +33 -0
  261. package/src/modules/finance-ledger/query/getTrialBalance.ts +30 -0
  262. package/src/modules/finance-ledger/query/listAccountingPeriods.generated.ts +5 -0
  263. package/src/modules/finance-ledger/query/listAccountingPeriods.test.ts +81 -0
  264. package/src/modules/finance-ledger/query/listAccountingPeriods.ts +61 -0
  265. package/src/modules/finance-ledger/query/listFinancialStatements.generated.ts +5 -0
  266. package/src/modules/finance-ledger/query/listFinancialStatements.test.ts +76 -0
  267. package/src/modules/finance-ledger/query/listFinancialStatements.ts +62 -0
  268. package/src/modules/finance-ledger/query/listFiscalYears.generated.ts +5 -0
  269. package/src/modules/finance-ledger/query/listFiscalYears.test.ts +63 -0
  270. package/src/modules/finance-ledger/query/listFiscalYears.ts +45 -0
  271. package/src/modules/finance-ledger/query/listJournalEntries.generated.ts +5 -0
  272. package/src/modules/finance-ledger/query/listJournalEntries.test.ts +91 -0
  273. package/src/modules/finance-ledger/query/listJournalEntries.ts +64 -0
  274. package/src/modules/finance-ledger/query/listPeriodCloses.generated.ts +5 -0
  275. package/src/modules/finance-ledger/query/listPeriodCloses.test.ts +63 -0
  276. package/src/modules/finance-ledger/query/listPeriodCloses.ts +64 -0
  277. package/src/modules/finance-ledger/query/listTrialBalances.generated.ts +5 -0
  278. package/src/modules/finance-ledger/query/listTrialBalances.test.ts +78 -0
  279. package/src/modules/finance-ledger/query/listTrialBalances.ts +56 -0
  280. package/src/modules/finance-ledger/seed/index.ts +19 -0
  281. package/src/modules/finance-ledger/tailor.config.ts +13 -0
  282. package/src/modules/finance-ledger/tailor.d.ts +13 -0
  283. package/src/modules/finance-ledger/testing/commandTestUtils.ts +35 -0
  284. package/src/modules/finance-ledger/testing/fixtures.ts +382 -0
  285. package/src/modules/finance-ledger/tsconfig.json +16 -0
  286. package/src/progress/schema.test.ts +161 -0
  287. package/src/progress/schema.ts +316 -0
  288. package/templates/scaffold/app/backend/package.json +1 -3
  289. package/templates/scaffold/app/backend/vitest.config.ts +4 -21
  290. 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}/*/backend/src/resolvers/*.ts`,
492
- docPattern: `${root}/*/${APP_PATHS.docs.resolver}/*.md`,
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}/[a-zA-Z]*/README.md`,
538
+ glob: `${a}/README.md`,
539
539
  schemaKey: "app"
540
540
  }, {
541
- glob: `${a}/[a-zA-Z]*/${APP_PATHS.docs.actors}/*.md`,
541
+ glob: `${a}/${APP_PATHS.docs.actors}/*.md`,
542
542
  schemaKey: "actors"
543
543
  }, {
544
- glob: `${a}/[a-zA-Z]*/${APP_PATHS.docs.businessFlow}/*/README.md`,
544
+ glob: `${a}/${APP_PATHS.docs.businessFlow}/*/README.md`,
545
545
  schemaKey: "business-flow"
546
546
  }, {
547
- glob: `${a}/[a-zA-Z]*/${APP_PATHS.docs.businessFlow}/*/${APP_PATHS.docs.story}/*.md`,
547
+ glob: `${a}/${APP_PATHS.docs.businessFlow}/*/${APP_PATHS.docs.story}/*.md`,
548
548
  schemaKey: "story"
549
549
  }, {
550
- glob: `${a}/[a-zA-Z]*/${APP_PATHS.docs.screen}/*.md`,
550
+ glob: `${a}/${APP_PATHS.docs.screen}/*.md`,
551
551
  schemaKey: "screen"
552
552
  }, {
553
- glob: `${a}/[a-zA-Z]*/${APP_PATHS.docs.resolver}/*.md`,
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)) continue;
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)) continue;
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, generateCommandStub(doc));
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, generateTestStub(doc));
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, generateQueryStub(doc));
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, generateQueryTestStub(doc));
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, generateDbStub(camelName));
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$3 = process.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$3);
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$3, args.path);
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$2 = process.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$2);
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$2);
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$2);
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, generateResolverStub(doc.resolverName));
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, generateStoryTestStub(storyName, testCases));
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tailor-platform/erp-kit",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Opinionated ERP toolkit for building business applications on Tailor Platform",
5
5
  "license": "MIT",
6
6
  "bin": {