@lwelliott/cortex-cli 1.0.3

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 (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/cli/audit.d.ts +3 -0
  4. package/dist/cli/audit.d.ts.map +1 -0
  5. package/dist/cli/audit.js +78 -0
  6. package/dist/cli/audit.js.map +1 -0
  7. package/dist/cli/doc.d.ts +3 -0
  8. package/dist/cli/doc.d.ts.map +1 -0
  9. package/dist/cli/doc.js +291 -0
  10. package/dist/cli/doc.js.map +1 -0
  11. package/dist/cli/entity.d.ts +3 -0
  12. package/dist/cli/entity.d.ts.map +1 -0
  13. package/dist/cli/entity.js +135 -0
  14. package/dist/cli/entity.js.map +1 -0
  15. package/dist/cli/format-selector.d.ts +30 -0
  16. package/dist/cli/format-selector.d.ts.map +1 -0
  17. package/dist/cli/format-selector.js +101 -0
  18. package/dist/cli/format-selector.js.map +1 -0
  19. package/dist/cli/formatters/audit-formatter.d.ts +33 -0
  20. package/dist/cli/formatters/audit-formatter.d.ts.map +1 -0
  21. package/dist/cli/formatters/audit-formatter.js +204 -0
  22. package/dist/cli/formatters/audit-formatter.js.map +1 -0
  23. package/dist/cli/formatters/json.d.ts +10 -0
  24. package/dist/cli/formatters/json.d.ts.map +1 -0
  25. package/dist/cli/formatters/json.js +31 -0
  26. package/dist/cli/formatters/json.js.map +1 -0
  27. package/dist/cli/formatters/markdown.d.ts +12 -0
  28. package/dist/cli/formatters/markdown.d.ts.map +1 -0
  29. package/dist/cli/formatters/markdown.js +341 -0
  30. package/dist/cli/formatters/markdown.js.map +1 -0
  31. package/dist/cli/formatters/quiet.d.ts +15 -0
  32. package/dist/cli/formatters/quiet.d.ts.map +1 -0
  33. package/dist/cli/formatters/quiet.js +75 -0
  34. package/dist/cli/formatters/quiet.js.map +1 -0
  35. package/dist/cli/formatters/table.d.ts +11 -0
  36. package/dist/cli/formatters/table.d.ts.map +1 -0
  37. package/dist/cli/formatters/table.js +726 -0
  38. package/dist/cli/formatters/table.js.map +1 -0
  39. package/dist/cli/graph.d.ts +3 -0
  40. package/dist/cli/graph.d.ts.map +1 -0
  41. package/dist/cli/graph.js +209 -0
  42. package/dist/cli/graph.js.map +1 -0
  43. package/dist/cli/index.d.ts +3 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/dist/cli/index.js +144 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/cli/lesson.d.ts +3 -0
  48. package/dist/cli/lesson.d.ts.map +1 -0
  49. package/dist/cli/lesson.js +85 -0
  50. package/dist/cli/lesson.js.map +1 -0
  51. package/dist/cli/project-resolver.d.ts +17 -0
  52. package/dist/cli/project-resolver.d.ts.map +1 -0
  53. package/dist/cli/project-resolver.js +25 -0
  54. package/dist/cli/project-resolver.js.map +1 -0
  55. package/dist/cli/project.d.ts +12 -0
  56. package/dist/cli/project.d.ts.map +1 -0
  57. package/dist/cli/project.js +169 -0
  58. package/dist/cli/project.js.map +1 -0
  59. package/dist/cli/relation.d.ts +3 -0
  60. package/dist/cli/relation.d.ts.map +1 -0
  61. package/dist/cli/relation.js +128 -0
  62. package/dist/cli/relation.js.map +1 -0
  63. package/dist/cli/review.d.ts +3 -0
  64. package/dist/cli/review.d.ts.map +1 -0
  65. package/dist/cli/review.js +131 -0
  66. package/dist/cli/review.js.map +1 -0
  67. package/dist/cli/router.d.ts +38 -0
  68. package/dist/cli/router.d.ts.map +1 -0
  69. package/dist/cli/router.js +49 -0
  70. package/dist/cli/router.js.map +1 -0
  71. package/dist/cli/schema.d.ts +3 -0
  72. package/dist/cli/schema.d.ts.map +1 -0
  73. package/dist/cli/schema.js +94 -0
  74. package/dist/cli/schema.js.map +1 -0
  75. package/dist/cli/sprint.d.ts +12 -0
  76. package/dist/cli/sprint.d.ts.map +1 -0
  77. package/dist/cli/sprint.js +200 -0
  78. package/dist/cli/sprint.js.map +1 -0
  79. package/dist/cli/task.d.ts +12 -0
  80. package/dist/cli/task.d.ts.map +1 -0
  81. package/dist/cli/task.js +252 -0
  82. package/dist/cli/task.js.map +1 -0
  83. package/dist/cli/test-report.d.ts +3 -0
  84. package/dist/cli/test-report.d.ts.map +1 -0
  85. package/dist/cli/test-report.js +134 -0
  86. package/dist/cli/test-report.js.map +1 -0
  87. package/dist/cli/validate.d.ts +8 -0
  88. package/dist/cli/validate.d.ts.map +1 -0
  89. package/dist/cli/validate.js +86 -0
  90. package/dist/cli/validate.js.map +1 -0
  91. package/dist/config/config.d.ts +18 -0
  92. package/dist/config/config.d.ts.map +1 -0
  93. package/dist/config/config.js +70 -0
  94. package/dist/config/config.js.map +1 -0
  95. package/dist/config/registry.d.ts +52 -0
  96. package/dist/config/registry.d.ts.map +1 -0
  97. package/dist/config/registry.js +193 -0
  98. package/dist/config/registry.js.map +1 -0
  99. package/dist/config/resolver.d.ts +26 -0
  100. package/dist/config/resolver.d.ts.map +1 -0
  101. package/dist/config/resolver.js +87 -0
  102. package/dist/config/resolver.js.map +1 -0
  103. package/dist/db/builtin-schema-constants.d.ts +109 -0
  104. package/dist/db/builtin-schema-constants.d.ts.map +1 -0
  105. package/dist/db/builtin-schema-constants.js +32 -0
  106. package/dist/db/builtin-schema-constants.js.map +1 -0
  107. package/dist/db/connection.d.ts +34 -0
  108. package/dist/db/connection.d.ts.map +1 -0
  109. package/dist/db/connection.js +140 -0
  110. package/dist/db/connection.js.map +1 -0
  111. package/dist/db/generated/schema-types.d.ts +134 -0
  112. package/dist/db/generated/schema-types.d.ts.map +1 -0
  113. package/dist/db/generated/schema-types.js +31 -0
  114. package/dist/db/generated/schema-types.js.map +1 -0
  115. package/dist/db/locks.d.ts +106 -0
  116. package/dist/db/locks.d.ts.map +1 -0
  117. package/dist/db/locks.js +211 -0
  118. package/dist/db/locks.js.map +1 -0
  119. package/dist/db/migration.d.ts +65 -0
  120. package/dist/db/migration.d.ts.map +1 -0
  121. package/dist/db/migration.js +233 -0
  122. package/dist/db/migration.js.map +1 -0
  123. package/dist/db/retry.d.ts +26 -0
  124. package/dist/db/retry.d.ts.map +1 -0
  125. package/dist/db/retry.js +71 -0
  126. package/dist/db/retry.js.map +1 -0
  127. package/dist/db/schema.d.ts +21 -0
  128. package/dist/db/schema.d.ts.map +1 -0
  129. package/dist/db/schema.js +830 -0
  130. package/dist/db/schema.js.map +1 -0
  131. package/dist/models/common.d.ts +27 -0
  132. package/dist/models/common.d.ts.map +1 -0
  133. package/dist/models/common.js +4 -0
  134. package/dist/models/common.js.map +1 -0
  135. package/dist/models/document.d.ts +89 -0
  136. package/dist/models/document.d.ts.map +1 -0
  137. package/dist/models/document.js +5 -0
  138. package/dist/models/document.js.map +1 -0
  139. package/dist/models/entity-model.d.ts +30 -0
  140. package/dist/models/entity-model.d.ts.map +1 -0
  141. package/dist/models/entity-model.js +99 -0
  142. package/dist/models/entity-model.js.map +1 -0
  143. package/dist/models/entity.d.ts +88 -0
  144. package/dist/models/entity.d.ts.map +1 -0
  145. package/dist/models/entity.js +5 -0
  146. package/dist/models/entity.js.map +1 -0
  147. package/dist/models/graph-schema.d.ts +43 -0
  148. package/dist/models/graph-schema.d.ts.map +1 -0
  149. package/dist/models/graph-schema.js +76 -0
  150. package/dist/models/graph-schema.js.map +1 -0
  151. package/dist/models/project.d.ts +49 -0
  152. package/dist/models/project.d.ts.map +1 -0
  153. package/dist/models/project.js +18 -0
  154. package/dist/models/project.js.map +1 -0
  155. package/dist/models/relation.d.ts +35 -0
  156. package/dist/models/relation.d.ts.map +1 -0
  157. package/dist/models/relation.js +212 -0
  158. package/dist/models/relation.js.map +1 -0
  159. package/dist/models/review.d.ts +86 -0
  160. package/dist/models/review.d.ts.map +1 -0
  161. package/dist/models/review.js +5 -0
  162. package/dist/models/review.js.map +1 -0
  163. package/dist/models/sprint.d.ts +38 -0
  164. package/dist/models/sprint.d.ts.map +1 -0
  165. package/dist/models/sprint.js +4 -0
  166. package/dist/models/sprint.js.map +1 -0
  167. package/dist/models/task.d.ts +75 -0
  168. package/dist/models/task.d.ts.map +1 -0
  169. package/dist/models/task.js +4 -0
  170. package/dist/models/task.js.map +1 -0
  171. package/dist/models/validation.d.ts +25 -0
  172. package/dist/models/validation.d.ts.map +1 -0
  173. package/dist/models/validation.js +4 -0
  174. package/dist/models/validation.js.map +1 -0
  175. package/dist/services/audit-check-service.d.ts +16 -0
  176. package/dist/services/audit-check-service.d.ts.map +1 -0
  177. package/dist/services/audit-check-service.js +137 -0
  178. package/dist/services/audit-check-service.js.map +1 -0
  179. package/dist/services/audit-checks/dangling-relations-check.d.ts +7 -0
  180. package/dist/services/audit-checks/dangling-relations-check.d.ts.map +1 -0
  181. package/dist/services/audit-checks/dangling-relations-check.js +52 -0
  182. package/dist/services/audit-checks/dangling-relations-check.js.map +1 -0
  183. package/dist/services/audit-checks/duplicate-ids-check.d.ts +4 -0
  184. package/dist/services/audit-checks/duplicate-ids-check.d.ts.map +1 -0
  185. package/dist/services/audit-checks/duplicate-ids-check.js +49 -0
  186. package/dist/services/audit-checks/duplicate-ids-check.js.map +1 -0
  187. package/dist/services/audit-checks/fix-engine.d.ts +24 -0
  188. package/dist/services/audit-checks/fix-engine.d.ts.map +1 -0
  189. package/dist/services/audit-checks/fix-engine.js +114 -0
  190. package/dist/services/audit-checks/fix-engine.js.map +1 -0
  191. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts +9 -0
  192. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts.map +1 -0
  193. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js +56 -0
  194. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js.map +1 -0
  195. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts +10 -0
  196. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts.map +1 -0
  197. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js +57 -0
  198. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js.map +1 -0
  199. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts +9 -0
  200. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts.map +1 -0
  201. package/dist/services/audit-checks/fs-nfs-to-ts-check.js +56 -0
  202. package/dist/services/audit-checks/fs-nfs-to-ts-check.js.map +1 -0
  203. package/dist/services/audit-checks/inverse-consistency-check.d.ts +7 -0
  204. package/dist/services/audit-checks/inverse-consistency-check.d.ts.map +1 -0
  205. package/dist/services/audit-checks/inverse-consistency-check.js +54 -0
  206. package/dist/services/audit-checks/inverse-consistency-check.js.map +1 -0
  207. package/dist/services/audit-checks/mapping-check.d.ts +4 -0
  208. package/dist/services/audit-checks/mapping-check.d.ts.map +1 -0
  209. package/dist/services/audit-checks/mapping-check.js +74 -0
  210. package/dist/services/audit-checks/mapping-check.js.map +1 -0
  211. package/dist/services/audit-checks/orphan-documents-check.d.ts +9 -0
  212. package/dist/services/audit-checks/orphan-documents-check.d.ts.map +1 -0
  213. package/dist/services/audit-checks/orphan-documents-check.js +54 -0
  214. package/dist/services/audit-checks/orphan-documents-check.js.map +1 -0
  215. package/dist/services/audit-checks/orphan-entities-check.d.ts +4 -0
  216. package/dist/services/audit-checks/orphan-entities-check.d.ts.map +1 -0
  217. package/dist/services/audit-checks/orphan-entities-check.js +39 -0
  218. package/dist/services/audit-checks/orphan-entities-check.js.map +1 -0
  219. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts +9 -0
  220. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts.map +1 -0
  221. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js +56 -0
  222. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js.map +1 -0
  223. package/dist/services/audit-checks/sprint-consistency-check.d.ts +4 -0
  224. package/dist/services/audit-checks/sprint-consistency-check.d.ts.map +1 -0
  225. package/dist/services/audit-checks/sprint-consistency-check.js +80 -0
  226. package/dist/services/audit-checks/sprint-consistency-check.js.map +1 -0
  227. package/dist/services/audit-checks/src-filesystem-only-check.d.ts +10 -0
  228. package/dist/services/audit-checks/src-filesystem-only-check.d.ts.map +1 -0
  229. package/dist/services/audit-checks/src-filesystem-only-check.js +106 -0
  230. package/dist/services/audit-checks/src-filesystem-only-check.js.map +1 -0
  231. package/dist/services/audit-checks/ts-to-tc-check.d.ts +10 -0
  232. package/dist/services/audit-checks/ts-to-tc-check.d.ts.map +1 -0
  233. package/dist/services/audit-checks/ts-to-tc-check.js +58 -0
  234. package/dist/services/audit-checks/ts-to-tc-check.js.map +1 -0
  235. package/dist/services/audit-checks/type-mismatch-check.d.ts +4 -0
  236. package/dist/services/audit-checks/type-mismatch-check.d.ts.map +1 -0
  237. package/dist/services/audit-checks/type-mismatch-check.js +55 -0
  238. package/dist/services/audit-checks/type-mismatch-check.js.map +1 -0
  239. package/dist/services/audit-checks/types.d.ts +66 -0
  240. package/dist/services/audit-checks/types.d.ts.map +1 -0
  241. package/dist/services/audit-checks/types.js +30 -0
  242. package/dist/services/audit-checks/types.js.map +1 -0
  243. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts +9 -0
  244. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts.map +1 -0
  245. package/dist/services/audit-checks/us-to-fr-nfr-check.js +56 -0
  246. package/dist/services/audit-checks/us-to-fr-nfr-check.js.map +1 -0
  247. package/dist/services/doc-entity-mapping.d.ts +19 -0
  248. package/dist/services/doc-entity-mapping.d.ts.map +1 -0
  249. package/dist/services/doc-entity-mapping.js +35 -0
  250. package/dist/services/doc-entity-mapping.js.map +1 -0
  251. package/dist/services/document-service.d.ts +58 -0
  252. package/dist/services/document-service.d.ts.map +1 -0
  253. package/dist/services/document-service.js +409 -0
  254. package/dist/services/document-service.js.map +1 -0
  255. package/dist/services/graph-export-service.d.ts +12 -0
  256. package/dist/services/graph-export-service.d.ts.map +1 -0
  257. package/dist/services/graph-export-service.js +112 -0
  258. package/dist/services/graph-export-service.js.map +1 -0
  259. package/dist/services/graph-service.d.ts +21 -0
  260. package/dist/services/graph-service.d.ts.map +1 -0
  261. package/dist/services/graph-service.js +49 -0
  262. package/dist/services/graph-service.js.map +1 -0
  263. package/dist/services/graph-validation-service.d.ts +13 -0
  264. package/dist/services/graph-validation-service.d.ts.map +1 -0
  265. package/dist/services/graph-validation-service.js +171 -0
  266. package/dist/services/graph-validation-service.js.map +1 -0
  267. package/dist/services/project.d.ts +80 -0
  268. package/dist/services/project.d.ts.map +1 -0
  269. package/dist/services/project.js +256 -0
  270. package/dist/services/project.js.map +1 -0
  271. package/dist/services/review-service.d.ts +81 -0
  272. package/dist/services/review-service.d.ts.map +1 -0
  273. package/dist/services/review-service.js +242 -0
  274. package/dist/services/review-service.js.map +1 -0
  275. package/dist/services/schema-migration-service.d.ts +44 -0
  276. package/dist/services/schema-migration-service.d.ts.map +1 -0
  277. package/dist/services/schema-migration-service.js +894 -0
  278. package/dist/services/schema-migration-service.js.map +1 -0
  279. package/dist/services/sprint.d.ts +71 -0
  280. package/dist/services/sprint.d.ts.map +1 -0
  281. package/dist/services/sprint.js +238 -0
  282. package/dist/services/sprint.js.map +1 -0
  283. package/dist/services/stage-validator.d.ts +36 -0
  284. package/dist/services/stage-validator.d.ts.map +1 -0
  285. package/dist/services/stage-validator.js +78 -0
  286. package/dist/services/stage-validator.js.map +1 -0
  287. package/dist/services/task.d.ts +75 -0
  288. package/dist/services/task.d.ts.map +1 -0
  289. package/dist/services/task.js +487 -0
  290. package/dist/services/task.js.map +1 -0
  291. package/dist/services/validation.d.ts +24 -0
  292. package/dist/services/validation.d.ts.map +1 -0
  293. package/dist/services/validation.js +53 -0
  294. package/dist/services/validation.js.map +1 -0
  295. package/dist/state-machines/sprint-state.d.ts +25 -0
  296. package/dist/state-machines/sprint-state.d.ts.map +1 -0
  297. package/dist/state-machines/sprint-state.js +64 -0
  298. package/dist/state-machines/sprint-state.js.map +1 -0
  299. package/dist/state-machines/task-state.d.ts +31 -0
  300. package/dist/state-machines/task-state.d.ts.map +1 -0
  301. package/dist/state-machines/task-state.js +83 -0
  302. package/dist/state-machines/task-state.js.map +1 -0
  303. package/dist/utils/errors.d.ts +673 -0
  304. package/dist/utils/errors.d.ts.map +1 -0
  305. package/dist/utils/errors.js +1447 -0
  306. package/dist/utils/errors.js.map +1 -0
  307. package/dist/utils/format.d.ts +52 -0
  308. package/dist/utils/format.d.ts.map +1 -0
  309. package/dist/utils/format.js +65 -0
  310. package/dist/utils/format.js.map +1 -0
  311. package/dist/validators/board-integrity.d.ts +25 -0
  312. package/dist/validators/board-integrity.d.ts.map +1 -0
  313. package/dist/validators/board-integrity.js +102 -0
  314. package/dist/validators/board-integrity.js.map +1 -0
  315. package/dist/validators/board-shape.d.ts +13 -0
  316. package/dist/validators/board-shape.d.ts.map +1 -0
  317. package/dist/validators/board-shape.js +74 -0
  318. package/dist/validators/board-shape.js.map +1 -0
  319. package/dist/validators/owner-validator.d.ts +30 -0
  320. package/dist/validators/owner-validator.d.ts.map +1 -0
  321. package/dist/validators/owner-validator.js +70 -0
  322. package/dist/validators/owner-validator.js.map +1 -0
  323. package/dist/validators/spawn-legality.d.ts +19 -0
  324. package/dist/validators/spawn-legality.d.ts.map +1 -0
  325. package/dist/validators/spawn-legality.js +77 -0
  326. package/dist/validators/spawn-legality.js.map +1 -0
  327. package/dist/validators/state-field-checker.d.ts +8 -0
  328. package/dist/validators/state-field-checker.d.ts.map +1 -0
  329. package/dist/validators/state-field-checker.js +47 -0
  330. package/dist/validators/state-field-checker.js.map +1 -0
  331. package/dist/validators/state-field-recorder.d.ts +39 -0
  332. package/dist/validators/state-field-recorder.d.ts.map +1 -0
  333. package/dist/validators/state-field-recorder.js +62 -0
  334. package/dist/validators/state-field-recorder.js.map +1 -0
  335. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/db/retry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AASD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,CAAC,CAsDnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,CAAC,CAKhG"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ // Busy retry handler with exponential backoff
3
+ // Implements AD-0003: WAL Mode with Busy Timeout and Exponential Backoff
4
+ // + FS-SS-003-0005 (retry on busy), FS-SS-003-0007 (error codes)
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.withRetry = withRetry;
7
+ exports.withTransaction = withTransaction;
8
+ const errors_1 = require("../utils/errors");
9
+ const DEFAULT_RETRY_OPTIONS = {
10
+ maxRetries: 5,
11
+ baseMs: 50,
12
+ maxMs: 1000,
13
+ maxTotalWaitMs: 30000,
14
+ };
15
+ /**
16
+ * Execute a function with retry on SQLITE_BUSY using exponential backoff.
17
+ * Each retry doubles the delay, capped at maxMs.
18
+ * Total wait time is capped by maxTotalWaitMs per FS-SS-003-0005 VR-007.
19
+ *
20
+ * @param fn - The function to execute (typically a DB write operation)
21
+ * @param options - Retry configuration
22
+ * @throws DatabaseBusyError (ERR-LOCK-001) if all retries are exhausted
23
+ */
24
+ function withRetry(fn, options) {
25
+ const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };
26
+ let lastError;
27
+ const startTime = Date.now();
28
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
29
+ try {
30
+ return fn();
31
+ }
32
+ catch (err) {
33
+ // Check if this is a SQLITE_BUSY error
34
+ if (err instanceof Error && (err.message.includes('SQLITE_BUSY') || err.message.includes('database is locked'))) {
35
+ lastError = err;
36
+ if (attempt < opts.maxRetries) {
37
+ // Check maxTotalWaitMs cap (VR-007)
38
+ const elapsed = Date.now() - startTime;
39
+ const delay = Math.min(opts.baseMs * Math.pow(2, attempt), opts.maxMs);
40
+ if (elapsed + delay >= opts.maxTotalWaitMs) {
41
+ // Would exceed total wait cap — abort
42
+ throw new errors_1.LockRetryExhaustedError('database', 'unknown', attempt, elapsed);
43
+ }
44
+ // Synchronous delay
45
+ const end = Date.now() + delay;
46
+ while (Date.now() < end) {
47
+ // busy-wait
48
+ }
49
+ continue;
50
+ }
51
+ // Retries exhausted on a busy error
52
+ const totalMs = Date.now() - startTime;
53
+ throw new errors_1.LockRetryExhaustedError('database', 'unknown', opts.maxRetries, totalMs);
54
+ }
55
+ // Not a busy error — rethrow immediately
56
+ throw err;
57
+ }
58
+ }
59
+ // Should not reach here, but safety fallback
60
+ throw new errors_1.DatabaseBusyError(`Database busy after ${opts.maxRetries} retries`, { maxRetries: opts.maxRetries, baseMs: opts.baseMs, originalError: lastError });
61
+ }
62
+ /**
63
+ * Execute a database operation within a transaction with retry on busy.
64
+ */
65
+ function withTransaction(db, fn, options) {
66
+ return withRetry(() => {
67
+ const transaction = db.transaction(fn);
68
+ return transaction();
69
+ }, options);
70
+ }
71
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/db/retry.ts"],"names":[],"mappings":";AAAA,8CAA8C;AAC9C,yEAAyE;AACzE,iEAAiE;;AAgCjE,8BAsDC;AAKD,0CAKC;AA7FD,4CAA6E;AAa7E,MAAM,qBAAqB,GAA2B;IACpD,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,IAAI;IACX,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAgB,SAAS,CAAI,EAAW,EAAE,OAAsB;IAC9D,MAAM,IAAI,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,OAAO,EAAE,CAAC;IACtD,IAAI,SAAkB,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,uCAAuC;YACvC,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC;gBAChH,SAAS,GAAG,GAAG,CAAC;gBAEhB,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC9B,oCAAoC;oBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEvE,IAAI,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC3C,sCAAsC;wBACtC,MAAM,IAAI,gCAAuB,CAC/B,UAAU,EACV,SAAS,EACT,OAAO,EACP,OAAO,CACR,CAAC;oBACJ,CAAC;oBAED,oBAAoB;oBACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;oBAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;wBACxB,YAAY;oBACd,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,oCAAoC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACvC,MAAM,IAAI,gCAAuB,CAC/B,UAAU,EACV,SAAS,EACT,IAAI,CAAC,UAAU,EACf,OAAO,CACR,CAAC;YACJ,CAAC;YACD,yCAAyC;YACzC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,IAAI,0BAAiB,CACzB,uBAAuB,IAAI,CAAC,UAAU,UAAU,EAChD,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAC/E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAI,EAAqB,EAAE,EAAW,EAAE,OAAsB;IAC3F,OAAO,SAAS,CAAC,GAAG,EAAE;QACpB,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC,EAAE,OAAO,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** Single migration definition */
2
+ export interface Migration {
3
+ version: number;
4
+ description: string;
5
+ sql: string;
6
+ }
7
+ /** All DDL for the initial schema (migration version 1) */
8
+ export declare const INITIAL_SCHEMA_SQL = "\n-- \u2500\u2500\u2500 Sprints \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS sprints (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'PLANNING'\n CHECK (status IN ('PLANNING','IN EXECUTION','CLOSING','CLOSED')),\n goal TEXT,\n started_at TEXT,\n closed_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- \u2500\u2500\u2500 Tasks \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT NOT NULL,\n sprint_id TEXT NOT NULL REFERENCES sprints(id),\n parent_id TEXT,\n description TEXT NOT NULL,\n task_type TEXT NOT NULL DEFAULT 'Feature'\n CHECK (task_type IN ('Feature','Bug','Chore')),\n priority TEXT NOT NULL DEFAULT 'P2'\n CHECK (priority IN ('P0','P1','P2')),\n owner TEXT NOT NULL,\n points INTEGER DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'Backlog'\n CHECK (status IN ('Backlog','To Do','In Progress','In Review','Done','Dropped')),\n stage TEXT NOT NULL DEFAULT 'Planning'\n CHECK (stage IN ('Planning','Requirement','Specification','Design','Test Plan','Implementation','Testing','Release')),\n session_key TEXT,\n started_at TEXT,\n completed_at TEXT,\n scope_in TEXT,\n scope_out TEXT,\n decisions TEXT,\n dependencies TEXT,\n acceptance TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (sprint_id, id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_sprint ON tasks(sprint_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_parent ON tasks(parent_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(sprint_id, status);\nCREATE INDEX IF NOT EXISTS idx_tasks_owner ON tasks(sprint_id, owner);\n\n-- \u2500\u2500\u2500 Graph: Entity Types \u2500\u2500\u2500\n-- builtin:3.0 (Sprint 31): entity_types table DROPPED. Doc types are the sole source of truth.\n-- Do NOT recreate this table.\n\n-- \u2500\u2500\u2500 Graph: Entities \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS entities (\n id TEXT PRIMARY KEY,\n type_name TEXT NOT NULL,\n properties TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type_name);\n\n-- \u2500\u2500\u2500 Graph: Relation Types \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS relation_types (\n name TEXT PRIMARY KEY,\n from_types TEXT NOT NULL DEFAULT '[]',\n to_types TEXT NOT NULL DEFAULT '[]',\n cardinality TEXT DEFAULT 'many_to_many',\n inverse_of TEXT REFERENCES relation_types(name),\n description TEXT\n);\n\n-- \u2500\u2500\u2500 Graph: Relations \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS relations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_id TEXT NOT NULL REFERENCES entities(id),\n rel_type TEXT NOT NULL REFERENCES relation_types(name),\n to_id TEXT NOT NULL REFERENCES entities(id),\n properties TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(from_id, rel_type, to_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_id, rel_type);\nCREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_id, rel_type);\nCREATE INDEX IF NOT EXISTS idx_relations_type ON relations(rel_type);\n\n-- \u2500\u2500\u2500 Graph: Schema Version \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS graph_schema (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- \u2500\u2500\u2500 Reviews \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS reviews (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n review_num TEXT NOT NULL,\n sprint_id TEXT NOT NULL REFERENCES sprints(id),\n asset_name TEXT NOT NULL,\n review_type TEXT NOT NULL\n CHECK (review_type IN ('requirements','architecture','code','test','document')),\n verdict TEXT NOT NULL\n CHECK (verdict IN ('APPROVED','NEEDS_REWORK','OPEN_QUESTION')),\n critical_count INTEGER NOT NULL DEFAULT 0,\n major_count INTEGER NOT NULL DEFAULT 0,\n minor_count INTEGER NOT NULL DEFAULT 0,\n suggestion_count INTEGER NOT NULL DEFAULT 0,\n open_questions_count INTEGER NOT NULL DEFAULT 0,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_reviews_sprint ON reviews(sprint_id);\nCREATE INDEX IF NOT EXISTS idx_reviews_verdict ON reviews(verdict);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_reviews_sprint_num ON reviews(sprint_id, review_num);\n\n-- \u2500\u2500\u2500 Documents (canonical artifact registry) \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n title TEXT NOT NULL,\n path TEXT,\n status TEXT DEFAULT 'Draft',\n module_id TEXT,\n sprint_id TEXT REFERENCES sprints(id),\n content_hash TEXT,\n content_storage TEXT NOT NULL DEFAULT 'filesystem'\n CHECK (content_storage IN ('filesystem', 'db')),\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_documents_type ON documents(type);\nCREATE INDEX IF NOT EXISTS idx_documents_module ON documents(module_id);\nCREATE INDEX IF NOT EXISTS idx_documents_sprint ON documents(sprint_id);\n\n-- \u2500\u2500\u2500 Document Contents (DB-stored content + FTS5) \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS document_contents (\n document_id TEXT PRIMARY KEY REFERENCES documents(id),\n content TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS document_contents_fts USING fts5(\n document_id,\n content,\n content='document_contents',\n content_rowid='rowid'\n);\n\n-- FTS sync triggers\nCREATE TRIGGER IF NOT EXISTS document_contents_ai AFTER INSERT ON document_contents BEGIN\n INSERT INTO document_contents_fts(rowid, document_id, content)\n VALUES (new.rowid, new.document_id, new.content);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS document_contents_ad AFTER DELETE ON document_contents BEGIN\n INSERT INTO document_contents_fts(document_contents_fts, rowid, document_id, content)\n VALUES ('delete', old.rowid, old.document_id, old.content);\nEND;\n\nCREATE TRIGGER IF NOT EXISTS document_contents_au AFTER UPDATE ON document_contents BEGIN\n INSERT INTO document_contents_fts(document_contents_fts, rowid, document_id, content)\n VALUES ('delete', old.rowid, old.document_id, old.content);\n INSERT INTO document_contents_fts(rowid, document_id, content)\n VALUES (new.rowid, new.document_id, new.content);\nEND;\n\n-- \u2500\u2500\u2500 Test Execution Reports \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS test_reports (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n sprint_id TEXT NOT NULL REFERENCES sprints(id),\n task_id TEXT REFERENCES tasks(id),\n run_number INTEGER NOT NULL,\n total INTEGER NOT NULL,\n passed INTEGER NOT NULL,\n failed INTEGER NOT NULL,\n skipped INTEGER NOT NULL,\n blocked INTEGER NOT NULL DEFAULT 0,\n result TEXT NOT NULL CHECK (result IN ('PASS','FAIL','BLOCKED')),\n command TEXT,\n duration_s REAL,\n report_path TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- \u2500\u2500\u2500 Lessons \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS lessons (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n sprint_id TEXT REFERENCES sprints(id),\n category TEXT NOT NULL\n CHECK (category IN ('Process','Technical','Tool','Model')),\n title TEXT NOT NULL,\n description TEXT NOT NULL,\n severity TEXT DEFAULT 'minor' CHECK (severity IN ('critical','major','minor','suggestion')),\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- \u2500\u2500\u2500 Advisory Locks \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS locks (\n name TEXT PRIMARY KEY,\n owner TEXT NOT NULL,\n acquired_at TEXT NOT NULL,\n last_heartbeat TEXT\n);\n\n-- \u2500\u2500\u2500 Migrations \u2500\u2500\u2500\nCREATE TABLE IF NOT EXISTS _migrations (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL DEFAULT (datetime('now')),\n checksum TEXT NOT NULL DEFAULT ''\n);\n";
9
+ /**
10
+ * Sequential versioned migrations.
11
+ * Version 1 is the initial schema applied on fresh database creation.
12
+ * Future migrations add entries here with incrementing version numbers.
13
+ */
14
+ export declare const MIGRATIONS: Migration[];
15
+ /** Current latest migration version */
16
+ export declare const LATEST_VERSION: number;
17
+ /** List of all table names expected in the schema */
18
+ export declare const EXPECTED_TABLES: readonly ["_migrations", "locks", "sprints", "tasks", "relation_types", "relations", "graph_schema", "reviews", "documents", "document_contents", "document_contents_fts", "test_reports", "lessons"];
19
+ /** List of all index names expected in the schema */
20
+ export declare const EXPECTED_INDEXES: readonly ["idx_tasks_sprint", "idx_tasks_parent", "idx_tasks_status", "idx_tasks_owner", "idx_relations_from", "idx_relations_to", "idx_relations_type", "idx_reviews_sprint", "idx_reviews_verdict", "idx_reviews_sprint_num", "idx_documents_type", "idx_reviews_type", "idx_test_reports_sprint", "idx_test_reports_module", "idx_tasks_sprint_id_id", "idx_reviews_sprint_id_id", "idx_test_reports_sprint_id_id"];
21
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAGA,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,g1QAuN9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,EAijBjC,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,cAAc,QAA4C,CAAC;AAExE,qDAAqD;AACrD,eAAO,MAAM,eAAe,uMAgBlB,CAAC;AAEX,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,wZAkBnB,CAAC"}