@tailor-platform/erp-kit 0.5.1 → 0.7.0

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