@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,242 @@
1
+ "use strict";
2
+ // Review service: orchestrates review, test report, and lesson operations
3
+ // SAD-0031: Explicit Command IDs, Duplicate ID Validation, Test-Report --task Removal
4
+ // SAD-0010: Lesson singleton, review show sprint binding, content-file import
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.addReview = addReview;
7
+ exports.listReviews = listReviews;
8
+ exports.getReview = getReview;
9
+ exports.addTestReport = addTestReport;
10
+ exports.listTestReports = listTestReports;
11
+ exports.getTestReport = getTestReport;
12
+ exports.addLesson = addLesson;
13
+ exports.listLessons = listLessons;
14
+ exports.getLesson = getLesson;
15
+ exports.updateLesson = updateLesson;
16
+ const errors_1 = require("../utils/errors");
17
+ const retry_1 = require("../db/retry");
18
+ const sprint_1 = require("./sprint");
19
+ // ─── Error helper ───
20
+ function reviewError(code, message, details) {
21
+ throw new errors_1.CortexError(code, message, details);
22
+ }
23
+ // ─── ID Validation ───
24
+ const FOUR_DIGIT_ID_RE = /^\d{4}$/;
25
+ function validateFourDigitId(id, errCtor) {
26
+ if (!FOUR_DIGIT_ID_RE.test(id)) {
27
+ throw new errCtor(id);
28
+ }
29
+ }
30
+ // ─── Review API ───
31
+ /**
32
+ * Add a review with explicit caller-provided 4-digit ID.
33
+ * Content must be provided (from --content-file).
34
+ *
35
+ * SAD-0031 Part A: No advisory lock — caller provides explicit ID.
36
+ * Duplicate validation via EXISTS on composite index (sprint_id, review_num).
37
+ */
38
+ function addReview(db, sprintId, reviewId, reviewType, verdict, content, opts) {
39
+ // Validate sprint exists
40
+ (0, sprint_1.resolveSprint)(db, sprintId);
41
+ // Validate ID format: /^\d{4}$/
42
+ validateFourDigitId(reviewId, errors_1.ReviewBadIdError);
43
+ if (!content) {
44
+ throw new errors_1.ReviewContentRemovedError();
45
+ }
46
+ // Duplicate check via EXISTS on composite index (sprint_id, review_num)
47
+ const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM reviews WHERE sprint_id = ? AND review_num = ?) AS e').get(sprintId, reviewId);
48
+ if (exists.e) {
49
+ throw new errors_1.ReviewDuplicateIdError(reviewId, sprintId);
50
+ }
51
+ const now = new Date().toISOString();
52
+ const rowId = (0, retry_1.withTransaction)(db, () => {
53
+ const result = db.prepare(`INSERT INTO reviews (review_num, sprint_id, asset_name, review_type, verdict, critical_count, major_count, minor_count, suggestion_count, open_questions_count, content, asset_ref, created_at, updated_at)
54
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(reviewId, sprintId, opts?.assetName ?? '', reviewType, verdict, opts?.critical ?? 0, opts?.major ?? 0, opts?.minor ?? 0, opts?.suggestion ?? 0, 0, content, opts?.assetRef ?? null, now, now);
55
+ return Number(result.lastInsertRowid);
56
+ });
57
+ return getReviewById(db, rowId);
58
+ }
59
+ /**
60
+ * List reviews for a sprint.
61
+ */
62
+ function listReviews(db, sprintId, filters) {
63
+ const clauses = ['sprint_id = ?'];
64
+ const params = [sprintId];
65
+ if (filters?.type) {
66
+ clauses.push('review_type = ?');
67
+ params.push(filters.type);
68
+ }
69
+ if (filters?.verdict) {
70
+ clauses.push('verdict = ?');
71
+ params.push(filters.verdict);
72
+ }
73
+ return db.prepare(`SELECT * FROM reviews WHERE ${clauses.join(' AND ')} ORDER BY review_num ASC`).all(...params);
74
+ }
75
+ /**
76
+ * Show a single review by internal ID (used internally for add results).
77
+ */
78
+ function getReviewById(db, id) {
79
+ const row = db.prepare('SELECT * FROM reviews WHERE id = ?').get(id);
80
+ if (!row)
81
+ reviewError('ERR-REVIEW-002', `Review ${id} not found`, { id });
82
+ return row;
83
+ }
84
+ /**
85
+ * Get a review by review number within a sprint (SAD-0010 Part C).
86
+ * Both reviewNum and sprintId are required.
87
+ *
88
+ * @param db - Database connection
89
+ * @param reviewNum - Review number (1-based, displayed to user)
90
+ * @param sprintId - Sprint ID (required)
91
+ * @returns Review detail
92
+ * @throws ReviewNotInSprintError if review not found in the specified sprint
93
+ */
94
+ function getReview(db, reviewNum, sprintId) {
95
+ // Sprint must exist
96
+ (0, sprint_1.resolveSprint)(db, sprintId);
97
+ const numStr = String(reviewNum).padStart(4, '0');
98
+ const row = db.prepare('SELECT * FROM reviews WHERE review_num = ? AND sprint_id = ?').get(numStr, sprintId);
99
+ if (!row) {
100
+ throw new errors_1.ReviewNotInSprintError(reviewNum, sprintId);
101
+ }
102
+ return row;
103
+ }
104
+ // ─── Test Report API ───
105
+ /**
106
+ * Add a test report with explicit caller-provided 4-digit ID.
107
+ * SAD-0031 Part A: No advisory lock, no task association.
108
+ * Duplicate validation via EXISTS on composite index (sprint_id, id).
109
+ */
110
+ function addTestReport(db, sprintId, testReportId, total, passed, failed, opts) {
111
+ (0, sprint_1.resolveSprint)(db, sprintId);
112
+ // Validate ID format: /^\d{4}$/
113
+ validateFourDigitId(testReportId, errors_1.TestReportBadIdError);
114
+ const skipped = opts?.skipCount ?? 0;
115
+ // Count consistency check (FS-SS-028-0008: WRN-TEST-REPORT-001)
116
+ if (passed + failed + skipped !== total) {
117
+ console.warn(`WRN-TEST-REPORT-001: passed (${passed}) + failed (${failed}) + skipped (${skipped}) != total (${total})`);
118
+ }
119
+ const blocked = 0;
120
+ const computeResult = failed > 0 ? 'FAIL' : 'PASS';
121
+ const now = new Date().toISOString();
122
+ const reportContent = opts?.content ?? '';
123
+ // Duplicate check via EXISTS on composite index (sprint_id, id)
124
+ const exists = db.prepare('SELECT EXISTS(SELECT 1 FROM test_reports WHERE sprint_id = ? AND id = ?) AS e').get(sprintId, testReportId);
125
+ if (exists.e) {
126
+ throw new errors_1.TestReportDuplicateIdError(testReportId, sprintId);
127
+ }
128
+ (0, retry_1.withTransaction)(db, () => {
129
+ db.prepare(`INSERT INTO test_reports (id, sprint_id, total, passed, failed, skipped, blocked, result, command, duration_ms, report_path, module_id, status, content, pass_count, fail_count, skip_count, created_at, updated_at)
130
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(testReportId, sprintId, total, passed, failed, skipped, blocked, computeResult, opts?.command ?? null, opts?.duration ?? null, null, null, computeResult, reportContent, passed, failed, skipped, now, now);
131
+ });
132
+ return getTestReport(db, testReportId, sprintId);
133
+ }
134
+ /**
135
+ * List test reports. Task filter removed per SAD-0031 Part B.
136
+ */
137
+ function listTestReports(db, sprintId) {
138
+ if (sprintId) {
139
+ return db.prepare('SELECT * FROM test_reports WHERE sprint_id = ? ORDER BY created_at DESC').all(sprintId);
140
+ }
141
+ return db.prepare('SELECT * FROM test_reports ORDER BY created_at DESC').all();
142
+ }
143
+ /**
144
+ * Get a single test report by caller-provided ID and sprint.
145
+ * SAD-0031 Part A: sprint-scoped lookup by explicit ID string.
146
+ *
147
+ * @param db - Database connection
148
+ * @param testReportId - Caller-provided test report ID (e.g., "0001")
149
+ * @param sprintId - Sprint ID (required per URD-026)
150
+ * @returns Test report
151
+ * @throws error with ERR-TESTREPORT-004 if not found
152
+ */
153
+ function getTestReport(db, testReportId, sprintId) {
154
+ const row = db.prepare('SELECT * FROM test_reports WHERE id = ? AND sprint_id = ?').get(testReportId, sprintId);
155
+ if (!row) {
156
+ reviewError('ERR-TESTREPORT-004', `Test report "${testReportId}" not found in sprint "${sprintId}"`, { testReportId, sprintId });
157
+ }
158
+ return row;
159
+ }
160
+ // ─── Lesson API ───
161
+ /** Map a Lesson DB row to LessonResult (post-URD-026: content-only) */
162
+ function mapLessonResult(row) {
163
+ return {
164
+ project_id: String(row.id),
165
+ content: row.description,
166
+ created_at: row.created_at,
167
+ updated_at: row.updated_at,
168
+ };
169
+ }
170
+ /**
171
+ * Add a lesson (retained for internal use, e.g., sprint lessons-data export).
172
+ * Not CLI-facing — the CLI exposes only show and update.
173
+ * Post-URD-026: metadata removed, content-only.
174
+ */
175
+ function addLesson(db, _sprintId, _title, description, _category, _opts) {
176
+ const now = new Date().toISOString();
177
+ const content = description;
178
+ const id = (0, retry_1.withTransaction)(db, () => {
179
+ const result = db.prepare(`INSERT INTO lessons (description, text, created_at, updated_at)
180
+ VALUES (?, ?, ?, ?)`).run(content, content, now, now);
181
+ return Number(result.lastInsertRowid);
182
+ });
183
+ // Re-read to get the full row
184
+ const row = db.prepare('SELECT * FROM lessons WHERE id = ?').get(id);
185
+ if (!row)
186
+ throw new errors_1.LessonNotFoundError();
187
+ return row;
188
+ }
189
+ /**
190
+ * List lessons (retained for internal use; post-URD-026 no longer sprint-scoped).
191
+ * Not CLI-facing.
192
+ */
193
+ function listLessons(db, _sprintId) {
194
+ return db.prepare('SELECT * FROM lessons ORDER BY created_at ASC').all();
195
+ }
196
+ /**
197
+ * Get the project's single lesson (singleton pattern, SAD-0010 Part B).
198
+ * No ID argument — exactly one lesson per project.
199
+ *
200
+ * @param db - Database connection
201
+ * @returns LessonResult
202
+ * @throws LessonNotFoundError (ERR-LESSON-001) if no lesson exists
203
+ */
204
+ function getLesson(db) {
205
+ const row = db.prepare('SELECT * FROM lessons ORDER BY id LIMIT 1').get();
206
+ if (!row) {
207
+ throw new errors_1.LessonNotFoundError();
208
+ }
209
+ return mapLessonResult(row);
210
+ }
211
+ /**
212
+ * Update the project's single lesson (singleton pattern, post-URD-026).
213
+ * Upsert semantics per AD-0029: creates if absent, updates if exists.
214
+ * Content-only — all metadata fields removed (URD-026 Part B).
215
+ *
216
+ * @param db - Database connection
217
+ * @param updates - Fields to update; content required
218
+ * @returns Updated LessonResult
219
+ * @throws LessonNoUpdateFieldsError if content is empty/missing
220
+ */
221
+ function updateLesson(db, updates) {
222
+ // Validate content provided
223
+ if (updates.content === undefined || updates.content === null || updates.content.trim().length === 0) {
224
+ throw new errors_1.LessonNoUpdateFieldsError();
225
+ }
226
+ const content = updates.content.trim();
227
+ const now = new Date().toISOString();
228
+ // Upsert: check if lesson exists
229
+ const existing = db.prepare('SELECT id FROM lessons LIMIT 1').get();
230
+ (0, retry_1.withTransaction)(db, () => {
231
+ if (existing) {
232
+ // Update existing lesson
233
+ db.prepare('UPDATE lessons SET description = ?, text = ?, updated_at = ? WHERE id = ?').run(content, content, now, existing.id);
234
+ }
235
+ else {
236
+ // Create new lesson (upsert — AD-0029)
237
+ db.prepare('INSERT INTO lessons (description, text, created_at, updated_at) VALUES (?, ?, ?, ?)').run(content, content, now, now);
238
+ }
239
+ });
240
+ return getLesson(db);
241
+ }
242
+ //# sourceMappingURL=review-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-service.js","sourceRoot":"","sources":["../../src/services/review-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface MigrationResult {
3
+ success: boolean;
4
+ phases: PhaseResult[];
5
+ totalElapsedMs: number;
6
+ errors: string[];
7
+ }
8
+ export interface PhaseResult {
9
+ phase: string;
10
+ elapsedMs: number;
11
+ details: Record<string, number | string>;
12
+ error?: string;
13
+ }
14
+ export interface MigrationPhase {
15
+ name: string;
16
+ execute(db: Database.Database, projectRoot: string): PhaseResult;
17
+ validatePre(db: Database.Database): boolean;
18
+ validatePost(db: Database.Database): boolean;
19
+ }
20
+ export declare function getAvailablePhases(): string[];
21
+ /**
22
+ * Run a single named phase. Throws if phase name is unknown.
23
+ */
24
+ export declare function runPhase(db: Database.Database, phaseName: string, projectRoot: string): PhaseResult;
25
+ /**
26
+ * Run the full 9-phase Sprint 31 migration on the given database.
27
+ * Phases execute in order. Each phase runs in its own transaction.
28
+ * Idempotent: phases skip work when preconditions are already met.
29
+ *
30
+ * @param db - Database connection
31
+ * @param projectRoot - Project root directory (for YAML/script paths in Phase 8)
32
+ * @returns MigrationResult with phase details and elapsed times
33
+ */
34
+ export declare function runMigration(db: Database.Database, projectRoot: string): MigrationResult;
35
+ /**
36
+ * Pre-migration validation: check that the database has the expected pre-migration state.
37
+ * (builtin:2.0 characteristics — entity_types table, 27+ relation types)
38
+ */
39
+ export declare function validatePreMigration(db: Database.Database): void;
40
+ /**
41
+ * Post-migration validation: verify the database is in builtin:3.0 state.
42
+ */
43
+ export declare function validatePostMigration(db: Database.Database): void;
44
+ //# sourceMappingURL=schema-migration-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-migration-service.d.ts","sourceRoot":"","sources":["../../src/services/schema-migration-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAY3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC;IACjE,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5C,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC;CAC9C;AAs4BD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CAMnG;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CAmExF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAkBhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA8CjE"}