@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,137 @@
1
+ "use strict";
2
+ // AuditCheckService: orchestrates the 11 audit checks (SAD-0037: expanded to 11)
3
+ // SAD-0036: Four-Check Architecture with orphan-documents and inverse-consistency
4
+ // SAD-0037: 7 Traceability Checks (us-to-fr-nfr through src-filesystem-only)
5
+ // MOD-023: CLI Audit Command
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.FixEngine = exports.ALL_CHECK_NAMES = void 0;
8
+ exports.runAudit = runAudit;
9
+ const types_1 = require("./audit-checks/types");
10
+ Object.defineProperty(exports, "ALL_CHECK_NAMES", { enumerable: true, get: function () { return types_1.ALL_CHECK_NAMES; } });
11
+ const dangling_relations_check_1 = require("./audit-checks/dangling-relations-check");
12
+ const duplicate_ids_check_1 = require("./audit-checks/duplicate-ids-check");
13
+ const orphan_documents_check_1 = require("./audit-checks/orphan-documents-check");
14
+ const inverse_consistency_check_1 = require("./audit-checks/inverse-consistency-check");
15
+ const us_to_fr_nfr_check_1 = require("./audit-checks/us-to-fr-nfr-check");
16
+ const fr_nfr_to_fs_nfs_check_1 = require("./audit-checks/fr-nfr-to-fs-nfs-check");
17
+ const fs_nfs_to_sad_ad_qa_check_1 = require("./audit-checks/fs-nfs-to-sad-ad-qa-check");
18
+ const fs_nfs_to_ts_check_1 = require("./audit-checks/fs-nfs-to-ts-check");
19
+ const ts_to_tc_check_1 = require("./audit-checks/ts-to-tc-check");
20
+ const sad_ad_qa_tc_to_src_check_1 = require("./audit-checks/sad-ad-qa-tc-to-src-check");
21
+ const src_filesystem_only_check_1 = require("./audit-checks/src-filesystem-only-check");
22
+ const fix_engine_1 = require("./audit-checks/fix-engine");
23
+ Object.defineProperty(exports, "FixEngine", { enumerable: true, get: function () { return fix_engine_1.FixEngine; } });
24
+ const errors_1 = require("../utils/errors");
25
+ /** Map check names to their runner functions (SAD-0037: 11 entries) */
26
+ const CHECK_RUNNERS = {
27
+ // Existing 4 integrity checks (SAD-0036):
28
+ 'dangling-relations': dangling_relations_check_1.danglingRelationsCheck,
29
+ 'duplicate-ids': duplicate_ids_check_1.duplicateIdsCheck,
30
+ 'orphan-documents': orphan_documents_check_1.orphanDocumentsCheck,
31
+ 'inverse-consistency': inverse_consistency_check_1.inverseConsistencyCheck,
32
+ // New 7 traceability checks (SAD-0037):
33
+ 'us-to-fr-nfr': us_to_fr_nfr_check_1.usToFrNfrCheck,
34
+ 'fr-nfr-to-fs-nfs': fr_nfr_to_fs_nfs_check_1.frNfrToFsNfsCheck,
35
+ 'fs-nfs-to-sad-ad-qa': fs_nfs_to_sad_ad_qa_check_1.fsNfsToSadAdQaCheck,
36
+ 'fs-nfs-to-ts': fs_nfs_to_ts_check_1.fsNfsToTsCheck,
37
+ 'ts-to-tc': ts_to_tc_check_1.tsToTcCheck,
38
+ 'sad-ad-qa-tc-to-src': sad_ad_qa_tc_to_src_check_1.sadAdQaTcToSrcCheck,
39
+ 'src-filesystem-only': src_filesystem_only_check_1.srcFilesystemOnlyCheck,
40
+ };
41
+ /**
42
+ * Run a full audit with the given options.
43
+ *
44
+ * @param db - Database connection
45
+ * @param opts - Audit options (checks, sprintId, fix, fixDryRun)
46
+ * @returns AuditReport with results and exit code
47
+ * @throws AuditUnknownCheckError if unknown check name
48
+ * @throws AuditSprintNotFoundError if sprint not found
49
+ */
50
+ function runAudit(db, opts) {
51
+ // Validate sprint exists if provided
52
+ if (opts.sprintId) {
53
+ const sprint = db.prepare('SELECT id FROM sprints WHERE id = ?').get(opts.sprintId);
54
+ if (!sprint) {
55
+ throw new errors_1.AuditSprintNotFoundError(opts.sprintId);
56
+ }
57
+ }
58
+ // Determine check list
59
+ let checkNames;
60
+ if (opts.checks && opts.checks.length > 0) {
61
+ checkNames = opts.checks.map(types_1.normalizeCheckName);
62
+ for (const name of checkNames) {
63
+ if (!CHECK_RUNNERS[name]) {
64
+ throw new errors_1.AuditUnknownCheckError(name, [...types_1.ALL_CHECK_NAMES]);
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ checkNames = [...types_1.ALL_CHECK_NAMES];
70
+ }
71
+ // Resolve project folder for src-filesystem-only check (SAD-0037 §4)
72
+ const projectFolder = opts.projectFolder ?? process.cwd();
73
+ // Run checks in order
74
+ const results = [];
75
+ for (const name of checkNames) {
76
+ const runner = CHECK_RUNNERS[name];
77
+ let result;
78
+ if (name === 'src-filesystem-only') {
79
+ // Thread projectFolder for filesystem-only check (SAD-0037 §4.3)
80
+ result = runner(db, projectFolder, opts.sprintId);
81
+ }
82
+ else {
83
+ result = runner(db, opts.sprintId);
84
+ }
85
+ results.push(result);
86
+ }
87
+ // Apply fixes if requested
88
+ let fixApplied = false;
89
+ if (opts.fix || opts.fixDryRun) {
90
+ const failingResults = results.filter(r => r.status === 'FAIL');
91
+ if (failingResults.length > 0) {
92
+ const fixEngine = new fix_engine_1.FixEngine();
93
+ const fixResult = fixEngine.applyFixes(db, failingResults, opts.fixDryRun === true);
94
+ if (fixResult.count > 0) {
95
+ // Only mark fixes as applied for actual (non-dry-run) mode
96
+ if (!opts.fixDryRun) {
97
+ fixApplied = true;
98
+ }
99
+ // Update results to reflect fixes
100
+ for (const result of failingResults) {
101
+ const appliedForCheck = fixResult.applied.filter(f => f.check === result.checkName);
102
+ if (appliedForCheck.length > 0) {
103
+ result.fixApplied = `${appliedForCheck.length} fix(es) ${opts.fixDryRun ? 'would be ' : ''}applied`;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ // Populate fixCount on each CheckResult when fixDryRun is active (SAD-0036)
110
+ if (opts.fixDryRun) {
111
+ for (const result of results) {
112
+ if (result.status === 'FAIL') {
113
+ result.fixCount = result.issues.filter(i => i.fixable).length;
114
+ }
115
+ }
116
+ }
117
+ // Compute exit code
118
+ const failedCount = results.filter(r => r.status === 'FAIL').length;
119
+ let exitCode;
120
+ if (fixApplied) {
121
+ exitCode = 2;
122
+ }
123
+ else if (failedCount > 0) {
124
+ exitCode = 1;
125
+ }
126
+ else {
127
+ exitCode = 0;
128
+ }
129
+ return {
130
+ generatedAt: new Date().toISOString(),
131
+ sprintFilter: opts.sprintId ?? null,
132
+ checks: results,
133
+ exitCode,
134
+ fixApplied,
135
+ };
136
+ }
137
+ //# sourceMappingURL=audit-check-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-check-service.js","sourceRoot":"","sources":["../../src/services/audit-check-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult } from './types';
3
+ /** Shared SQL constants — identical to queries in graph-validation-service.ts */
4
+ export declare const DANGLING_FROM_SQL = "\n SELECT r.id, r.from_id, r.rel_type, r.to_id\n FROM relations r\n LEFT JOIN documents d ON r.from_id = d.id\n WHERE d.id IS NULL\n";
5
+ export declare const DANGLING_TO_SQL = "\n SELECT r.id, r.from_id, r.rel_type, r.to_id\n FROM relations r\n LEFT JOIN documents d ON r.to_id = d.id\n WHERE d.id IS NULL\n";
6
+ export declare function danglingRelationsCheck(db: Database.Database, _sprintId?: string): CheckResult;
7
+ //# sourceMappingURL=dangling-relations-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangling-relations-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/dangling-relations-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,6IAK7B,CAAC;AAEF,eAAO,MAAM,eAAe,2IAK3B,CAAC;AASF,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAiC7F"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ // dangling-relations audit check: relations referencing missing documents
3
+ // FS-SS-023-0003: Detect relations where from_id or to_id points to non-existent document
4
+ // SAD-0035: Updated to check documents(id) instead of entities(id)
5
+ // MOD-023: CLI Audit Command
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DANGLING_TO_SQL = exports.DANGLING_FROM_SQL = void 0;
8
+ exports.danglingRelationsCheck = danglingRelationsCheck;
9
+ /** Shared SQL constants — identical to queries in graph-validation-service.ts */
10
+ exports.DANGLING_FROM_SQL = `
11
+ SELECT r.id, r.from_id, r.rel_type, r.to_id
12
+ FROM relations r
13
+ LEFT JOIN documents d ON r.from_id = d.id
14
+ WHERE d.id IS NULL
15
+ `;
16
+ exports.DANGLING_TO_SQL = `
17
+ SELECT r.id, r.from_id, r.rel_type, r.to_id
18
+ FROM relations r
19
+ LEFT JOIN documents d ON r.to_id = d.id
20
+ WHERE d.id IS NULL
21
+ `;
22
+ function danglingRelationsCheck(db, _sprintId) {
23
+ const issues = [];
24
+ const danglingFrom = db.prepare(exports.DANGLING_FROM_SQL).all();
25
+ for (const rel of danglingFrom) {
26
+ issues.push({
27
+ issueId: 'DANGLING_SOURCE',
28
+ relationId: rel.id,
29
+ relationSide: 'source',
30
+ entityId: rel.from_id,
31
+ detail: `Relation ${rel.id}: from_id "${rel.from_id}" (type: ${rel.rel_type}) references non-existent document`,
32
+ fixable: true,
33
+ });
34
+ }
35
+ const danglingTo = db.prepare(exports.DANGLING_TO_SQL).all();
36
+ for (const rel of danglingTo) {
37
+ issues.push({
38
+ issueId: 'DANGLING_TARGET',
39
+ relationId: rel.id,
40
+ relationSide: 'target',
41
+ entityId: rel.to_id,
42
+ detail: `Relation ${rel.id}: to_id "${rel.to_id}" (type: ${rel.rel_type}) references non-existent document`,
43
+ fixable: true,
44
+ });
45
+ }
46
+ const status = issues.length === 0 ? 'PASS' : 'FAIL';
47
+ const summary = status === 'PASS'
48
+ ? 'No dangling relations found'
49
+ : `${issues.length} dangling relations found (${danglingFrom.length} source-side, ${danglingTo.length} target-side)`;
50
+ return { checkName: 'dangling-relations', status, summary, issues };
51
+ }
52
+ //# sourceMappingURL=dangling-relations-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangling-relations-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/dangling-relations-check.ts"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,0FAA0F;AAC1F,mEAAmE;AACnE,6BAA6B;;;AA2B7B,wDAiCC;AAvDD,iFAAiF;AACpE,QAAA,iBAAiB,GAAG;;;;;CAKhC,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;CAK9B,CAAC;AASF,SAAgB,sBAAsB,CAAC,EAAqB,EAAE,SAAkB;IAC9E,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,yBAAiB,CAAC,CAAC,GAAG,EAAmB,CAAC;IAC1E,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,GAAG,CAAC,EAAE;YAClB,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,OAAO;YACrB,MAAM,EAAE,YAAY,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,OAAO,YAAY,GAAG,CAAC,QAAQ,oCAAoC;YAC/G,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAe,CAAC,CAAC,GAAG,EAAmB,CAAC;IACtE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,GAAG,CAAC,EAAE;YAClB,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,KAAK;YACnB,MAAM,EAAE,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,KAAK,YAAY,GAAG,CAAC,QAAQ,oCAAoC;YAC3G,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM;QAC/B,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,8BAA8B,YAAY,CAAC,MAAM,iBAAiB,UAAU,CAAC,MAAM,eAAe,CAAC;IAEvH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult } from './types';
3
+ export declare function duplicateIdsCheck(db: Database.Database, sprintId?: string): CheckResult;
4
+ //# sourceMappingURL=duplicate-ids-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-ids-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/duplicate-ids-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CA4CvF"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // duplicate-ids audit check: duplicate document IDs
3
+ // FS-SS-023-0006: Detect duplicate IDs within sprint-scoped subset or full database
4
+ // SAD-0035: Entity duplicate IDs check removed — entities table dropped
5
+ // MOD-023: CLI Audit Command
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.duplicateIdsCheck = duplicateIdsCheck;
8
+ function duplicateIdsCheck(db, sprintId) {
9
+ const issues = [];
10
+ // Duplicate document IDs
11
+ if (sprintId) {
12
+ // Sprint scoping via task ID matching (URD-G001 removed documents.sprint_id)
13
+ const dupDocs = db.prepare(`
14
+ SELECT d.id, COUNT(*) as cnt
15
+ FROM documents d
16
+ WHERE d.id IN (SELECT t.id FROM tasks t WHERE t.sprint_id = ?)
17
+ GROUP BY d.id HAVING cnt > 1
18
+ `).all(sprintId);
19
+ for (const row of dupDocs) {
20
+ issues.push({
21
+ issueId: 'DUPLICATE_DOC_ID',
22
+ docId: row.id,
23
+ detail: `Duplicate document ID "${row.id}" (appears ${row.cnt} times)`,
24
+ count: row.cnt,
25
+ fixable: false,
26
+ });
27
+ }
28
+ }
29
+ else {
30
+ const dupDocs = db.prepare(`
31
+ SELECT id, COUNT(*) as cnt FROM documents GROUP BY id HAVING cnt > 1
32
+ `).all();
33
+ for (const row of dupDocs) {
34
+ issues.push({
35
+ issueId: 'DUPLICATE_DOC_ID',
36
+ docId: row.id,
37
+ detail: `Duplicate document ID "${row.id}" (appears ${row.cnt} times)`,
38
+ count: row.cnt,
39
+ fixable: false,
40
+ });
41
+ }
42
+ }
43
+ const status = issues.length === 0 ? 'PASS' : 'FAIL';
44
+ const summary = status === 'PASS'
45
+ ? 'No duplicate IDs found'
46
+ : `${issues.length} duplicate document IDs found`;
47
+ return { checkName: 'duplicate-ids', status, summary, issues };
48
+ }
49
+ //# sourceMappingURL=duplicate-ids-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-ids-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/duplicate-ids-check.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,oFAAoF;AACpF,wEAAwE;AACxE,6BAA6B;;AAK7B,8CA4CC;AA5CD,SAAgB,iBAAiB,CAAC,EAAqB,EAAE,QAAiB;IACxE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,yBAAyB;IACzB,IAAI,QAAQ,EAAE,CAAC;QACb,6EAA6E;QAC7E,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;KAK1B,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAuC,CAAC;QAEvD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,kBAAkB;gBAC3B,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,MAAM,EAAE,0BAA0B,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,GAAG,SAAS;gBACtE,KAAK,EAAE,GAAG,CAAC,GAAG;gBACd,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;KAE1B,CAAC,CAAC,GAAG,EAAwC,CAAC;QAE/C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,kBAAkB;gBAC3B,KAAK,EAAE,GAAG,CAAC,EAAE;gBACb,MAAM,EAAE,0BAA0B,GAAG,CAAC,EAAE,cAAc,GAAG,CAAC,GAAG,SAAS;gBACtE,KAAK,EAAE,GAAG,CAAC,GAAG;gBACd,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM;QAC/B,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,+BAA+B,CAAC;IAEpD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult, FixResult } from './types';
3
+ export declare class FixEngine {
4
+ /**
5
+ * Apply fixes for all fixable issues in the given check results.
6
+ * All fixes run inside a single transaction (db.transaction).
7
+ *
8
+ * @param db - Database connection
9
+ * @param results - Check results containing fixable issues
10
+ * @param dryRun - If true, simulate fixes without writing
11
+ * @returns FixResult with list of applied fixes
12
+ */
13
+ applyFixes(db: Database.Database, results: CheckResult[], dryRun: boolean): FixResult;
14
+ /**
15
+ * Simulate fixes without applying them.
16
+ * Returns what would be done in a FixResult.
17
+ */
18
+ private simulateFixes;
19
+ /**
20
+ * Apply a single fix. Uses raw DML within the caller's transaction scope.
21
+ */
22
+ private applyFix;
23
+ }
24
+ //# sourceMappingURL=fix-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-engine.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/fix-engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,SAAS,CAAC;AAGlE,qBAAa,SAAS;IACpB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS;IAkCrF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;CAwCjB"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ // FixEngine: atomic fix application for audit check results
3
+ // FS-SS-023-0011: Transaction-safe batch fixes with --fix and --fix-dry-run
4
+ // NFS-SS-023-0005: All fixes run in a single transaction; any failure rolls back
5
+ // MOD-023: CLI Audit Command
6
+ //
7
+ // Implementation note (REVIEW-0051 m-1): SAD-023 §3.8 references deleteEntity()
8
+ // and deleteRelation() helper functions for fix actions. The actual implementation
9
+ // uses raw DML (DELETE FROM entities/relations WHERE id = ?) because these helpers
10
+ // do not accept an optional `db` parameter to participate in the caller's transaction
11
+ // scope. Per SAD-023 §3.8 design note: "If a helper does not support transaction
12
+ // participation, use raw db.prepare() DML within the transaction block instead."
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.FixEngine = void 0;
15
+ const errors_1 = require("../../utils/errors");
16
+ class FixEngine {
17
+ /**
18
+ * Apply fixes for all fixable issues in the given check results.
19
+ * All fixes run inside a single transaction (db.transaction).
20
+ *
21
+ * @param db - Database connection
22
+ * @param results - Check results containing fixable issues
23
+ * @param dryRun - If true, simulate fixes without writing
24
+ * @returns FixResult with list of applied fixes
25
+ */
26
+ applyFixes(db, results, dryRun) {
27
+ if (dryRun) {
28
+ return this.simulateFixes(results);
29
+ }
30
+ try {
31
+ const fixFn = db.transaction(() => {
32
+ const applied = [];
33
+ for (const result of results) {
34
+ if (result.status !== 'FAIL')
35
+ continue;
36
+ for (const issue of result.issues) {
37
+ if (!issue.fixable)
38
+ continue;
39
+ this.applyFix(db, result.checkName, issue);
40
+ applied.push({
41
+ check: result.checkName,
42
+ issueId: issue.issueId,
43
+ targetId: issue.entityId ?? issue.docId ?? String(issue.relationId ?? ''),
44
+ });
45
+ }
46
+ }
47
+ return { applied, count: applied.length };
48
+ });
49
+ return fixFn();
50
+ }
51
+ catch (err) {
52
+ const message = err instanceof Error ? err.message : String(err);
53
+ throw new errors_1.AuditFixError(message);
54
+ }
55
+ }
56
+ /**
57
+ * Simulate fixes without applying them.
58
+ * Returns what would be done in a FixResult.
59
+ */
60
+ simulateFixes(results) {
61
+ const applied = [];
62
+ for (const result of results) {
63
+ if (result.status !== 'FAIL')
64
+ continue;
65
+ for (const issue of result.issues) {
66
+ if (!issue.fixable)
67
+ continue;
68
+ applied.push({
69
+ check: result.checkName,
70
+ issueId: issue.issueId,
71
+ targetId: issue.entityId ?? issue.docId ?? String(issue.relationId ?? ''),
72
+ });
73
+ }
74
+ }
75
+ return { applied, count: applied.length };
76
+ }
77
+ /**
78
+ * Apply a single fix. Uses raw DML within the caller's transaction scope.
79
+ */
80
+ applyFix(db, _checkName, issue) {
81
+ switch (issue.issueId) {
82
+ case 'DANGLING_SOURCE':
83
+ case 'DANGLING_TARGET': {
84
+ // Delete the dangling relation
85
+ if (issue.relationId !== undefined) {
86
+ db.prepare('DELETE FROM relations WHERE id = ?').run(issue.relationId);
87
+ }
88
+ break;
89
+ }
90
+ case 'MISSING_INVERSE': {
91
+ // Create the missing inverse relation.
92
+ // entityTypeExpected holds the original to_id (→ new from_id)
93
+ // entityId holds the original from_id (→ new to_id)
94
+ // entityTypeFound holds the inverse relation type name
95
+ if (issue.entityTypeExpected && issue.entityId && issue.entityTypeFound) {
96
+ const newFromId = issue.entityTypeExpected;
97
+ const newToId = issue.entityId;
98
+ const inverseRelType = issue.entityTypeFound;
99
+ // Idempotency guard: only insert if the inverse doesn't already exist
100
+ const existing = db.prepare('SELECT id FROM relations WHERE from_id = ? AND rel_type = ? AND to_id = ?').get(newFromId, inverseRelType, newToId);
101
+ if (!existing) {
102
+ db.prepare('INSERT INTO relations (from_id, rel_type, to_id, properties, created_at, updated_at) VALUES (?, ?, ?, ?, datetime(\'now\'), datetime(\'now\'))').run(newFromId, inverseRelType, newToId, '{}');
103
+ }
104
+ }
105
+ break;
106
+ }
107
+ default:
108
+ // Unknown fixable issue — skip safely
109
+ break;
110
+ }
111
+ }
112
+ }
113
+ exports.FixEngine = FixEngine;
114
+ //# sourceMappingURL=fix-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-engine.js","sourceRoot":"","sources":["../../../src/services/audit-checks/fix-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult } from './types';
3
+ /**
4
+ * Verify every FR or NFR document has at least one outgoing realized_by relation
5
+ * to a Functional Specification (FS) or Non-Functional Specification (NFS).
6
+ * Non-fixable — reports missing traceability only.
7
+ */
8
+ export declare function frNfrToFsNfsCheck(db: Database.Database, sprintId?: string): CheckResult;
9
+ //# sourceMappingURL=fr-nfr-to-fs-nfs-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr-nfr-to-fs-nfs-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/fr-nfr-to-fs-nfs-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgDvF"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ // fr-nfr-to-fs-nfs audit check: FR/NFR→FS/NFS traceability
3
+ // SAD-0037 §3.3: FR/NFR documents without realized_by relation to FS/NFS
4
+ // FS-SS-036-0002: FR/NFR→FS/NFS Traceability Check Implementation
5
+ // MOD-023: CLI Audit Command
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.frNfrToFsNfsCheck = frNfrToFsNfsCheck;
8
+ /**
9
+ * Verify every FR or NFR document has at least one outgoing realized_by relation
10
+ * to a Functional Specification (FS) or Non-Functional Specification (NFS).
11
+ * Non-fixable — reports missing traceability only.
12
+ */
13
+ function frNfrToFsNfsCheck(db, sprintId) {
14
+ let sql = `
15
+ SELECT d.id, d.type, d.title
16
+ FROM documents d
17
+ WHERE d.type IN ('FR', 'NFR')
18
+ AND NOT EXISTS (
19
+ SELECT 1 FROM relations r
20
+ WHERE r.from_id = d.id
21
+ AND r.rel_type = 'realized_by'
22
+ )
23
+ `;
24
+ const params = [];
25
+ if (sprintId) {
26
+ sql = `
27
+ SELECT d.id, d.type, d.title
28
+ FROM documents d
29
+ WHERE d.type IN ('FR', 'NFR')
30
+ AND NOT EXISTS (
31
+ SELECT 1 FROM relations r
32
+ WHERE r.from_id = d.id
33
+ AND r.rel_type = 'realized_by'
34
+ )
35
+ AND d.id IN (SELECT id FROM tasks WHERE sprint_id = ?)
36
+ `;
37
+ params.push(sprintId);
38
+ }
39
+ sql += ' ORDER BY d.id';
40
+ const rows = db.prepare(sql).all(...params);
41
+ const issues = rows.map(row => ({
42
+ issueId: 'MISSING_FS_NFS',
43
+ docId: row.id,
44
+ docType: row.type,
45
+ detail: `FR/NFR document '${row.id}' has no realized_by relation to any FS or NFS`,
46
+ severity: 'warning',
47
+ fixable: false,
48
+ }));
49
+ const status = issues.length === 0 ? 'PASS' : 'FAIL';
50
+ const scope = sprintId ? ` in sprint ${sprintId}` : '';
51
+ const summary = status === 'PASS'
52
+ ? `All FR/NFR documents have FS/NFS traceability${scope}`
53
+ : `${issues.length} FR/NFR document(s) missing FS/NFS traceability${scope}`;
54
+ return { checkName: 'fr-nfr-to-fs-nfs', status, summary, issues };
55
+ }
56
+ //# sourceMappingURL=fr-nfr-to-fs-nfs-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr-nfr-to-fs-nfs-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/fr-nfr-to-fs-nfs-check.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,yEAAyE;AACzE,kEAAkE;AAClE,6BAA6B;;AAU7B,8CAgDC;AArDD;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,EAAqB,EAAE,QAAiB;IACxE,IAAI,GAAG,GAAG;;;;;;;;;GAST,CAAC;IAEF,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,GAAG;;;;;;;;;;KAUL,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,GAAG,IAAI,gBAAgB,CAAC;IAExB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAuD,CAAC;IAElG,MAAM,MAAM,GAAiB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAAE,gDAAgD;QAClF,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM;QAC/B,CAAC,CAAC,gDAAgD,KAAK,EAAE;QACzD,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,kDAAkD,KAAK,EAAE,CAAC;IAE9E,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult } from './types';
3
+ /**
4
+ * Verify every FS or NFS document has at least one outgoing covered_by relation
5
+ * to a Software Architecture Document (SAD), Architecture Decision (AD),
6
+ * or Quality Assurance (QA) artifact.
7
+ * Non-fixable — reports missing traceability only.
8
+ */
9
+ export declare function fsNfsToSadAdQaCheck(db: Database.Database, sprintId?: string): CheckResult;
10
+ //# sourceMappingURL=fs-nfs-to-sad-ad-qa-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-nfs-to-sad-ad-qa-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/fs-nfs-to-sad-ad-qa-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgDzF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // fs-nfs-to-sad-ad-qa audit check: FS/NFS→SAD/AD/QA traceability
3
+ // SAD-0037 §3.4: FS/NFS documents without covered_by relation to SAD/AD/QA
4
+ // FS-SS-036-0003: FS/NFS→SAD/AD/QA Traceability Check Implementation
5
+ // MOD-023: CLI Audit Command
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.fsNfsToSadAdQaCheck = fsNfsToSadAdQaCheck;
8
+ /**
9
+ * Verify every FS or NFS document has at least one outgoing covered_by relation
10
+ * to a Software Architecture Document (SAD), Architecture Decision (AD),
11
+ * or Quality Assurance (QA) artifact.
12
+ * Non-fixable — reports missing traceability only.
13
+ */
14
+ function fsNfsToSadAdQaCheck(db, sprintId) {
15
+ let sql = `
16
+ SELECT d.id, d.type, d.title
17
+ FROM documents d
18
+ WHERE d.type IN ('FS', 'NFS')
19
+ AND NOT EXISTS (
20
+ SELECT 1 FROM relations r
21
+ WHERE r.from_id = d.id
22
+ AND r.rel_type = 'covered_by'
23
+ )
24
+ `;
25
+ const params = [];
26
+ if (sprintId) {
27
+ sql = `
28
+ SELECT d.id, d.type, d.title
29
+ FROM documents d
30
+ WHERE d.type IN ('FS', 'NFS')
31
+ AND NOT EXISTS (
32
+ SELECT 1 FROM relations r
33
+ WHERE r.from_id = d.id
34
+ AND r.rel_type = 'covered_by'
35
+ )
36
+ AND d.id IN (SELECT id FROM tasks WHERE sprint_id = ?)
37
+ `;
38
+ params.push(sprintId);
39
+ }
40
+ sql += ' ORDER BY d.id';
41
+ const rows = db.prepare(sql).all(...params);
42
+ const issues = rows.map(row => ({
43
+ issueId: 'MISSING_SAD_AD_QA',
44
+ docId: row.id,
45
+ docType: row.type,
46
+ detail: `FS/NFS document '${row.id}' has no covered_by relation to any SAD, AD, or QA artifact`,
47
+ severity: 'warning',
48
+ fixable: false,
49
+ }));
50
+ const status = issues.length === 0 ? 'PASS' : 'FAIL';
51
+ const scope = sprintId ? ` in sprint ${sprintId}` : '';
52
+ const summary = status === 'PASS'
53
+ ? `All FS/NFS documents have SAD/AD/QA traceability${scope}`
54
+ : `${issues.length} FS/NFS document(s) missing SAD/AD/QA traceability${scope}`;
55
+ return { checkName: 'fs-nfs-to-sad-ad-qa', status, summary, issues };
56
+ }
57
+ //# sourceMappingURL=fs-nfs-to-sad-ad-qa-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-nfs-to-sad-ad-qa-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/fs-nfs-to-sad-ad-qa-check.ts"],"names":[],"mappings":";AAAA,iEAAiE;AACjE,2EAA2E;AAC3E,qEAAqE;AACrE,6BAA6B;;AAW7B,kDAgDC;AAtDD;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAAqB,EAAE,QAAiB;IAC1E,IAAI,GAAG,GAAG;;;;;;;;;GAST,CAAC;IAEF,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,GAAG;;;;;;;;;;KAUL,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,GAAG,IAAI,gBAAgB,CAAC;IAExB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAuD,CAAC;IAElG,MAAM,MAAM,GAAiB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAAE,6DAA6D;QAC/F,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM;QAC/B,CAAC,CAAC,mDAAmD,KAAK,EAAE;QAC5D,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,qDAAqD,KAAK,EAAE,CAAC;IAEjF,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { CheckResult } from './types';
3
+ /**
4
+ * Verify every FS or NFS document has at least one outgoing verified_by relation
5
+ * to a Test Suite (TS) document.
6
+ * Non-fixable — reports missing traceability only.
7
+ */
8
+ export declare function fsNfsToTsCheck(db: Database.Database, sprintId?: string): CheckResult;
9
+ //# sourceMappingURL=fs-nfs-to-ts-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-nfs-to-ts-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/fs-nfs-to-ts-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgDpF"}