@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.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +78 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/doc.d.ts +3 -0
- package/dist/cli/doc.d.ts.map +1 -0
- package/dist/cli/doc.js +291 -0
- package/dist/cli/doc.js.map +1 -0
- package/dist/cli/entity.d.ts +3 -0
- package/dist/cli/entity.d.ts.map +1 -0
- package/dist/cli/entity.js +135 -0
- package/dist/cli/entity.js.map +1 -0
- package/dist/cli/format-selector.d.ts +30 -0
- package/dist/cli/format-selector.d.ts.map +1 -0
- package/dist/cli/format-selector.js +101 -0
- package/dist/cli/format-selector.js.map +1 -0
- package/dist/cli/formatters/audit-formatter.d.ts +33 -0
- package/dist/cli/formatters/audit-formatter.d.ts.map +1 -0
- package/dist/cli/formatters/audit-formatter.js +204 -0
- package/dist/cli/formatters/audit-formatter.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +10 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +31 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/markdown.d.ts +12 -0
- package/dist/cli/formatters/markdown.d.ts.map +1 -0
- package/dist/cli/formatters/markdown.js +341 -0
- package/dist/cli/formatters/markdown.js.map +1 -0
- package/dist/cli/formatters/quiet.d.ts +15 -0
- package/dist/cli/formatters/quiet.d.ts.map +1 -0
- package/dist/cli/formatters/quiet.js +75 -0
- package/dist/cli/formatters/quiet.js.map +1 -0
- package/dist/cli/formatters/table.d.ts +11 -0
- package/dist/cli/formatters/table.d.ts.map +1 -0
- package/dist/cli/formatters/table.js +726 -0
- package/dist/cli/formatters/table.js.map +1 -0
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.d.ts.map +1 -0
- package/dist/cli/graph.js +209 -0
- package/dist/cli/graph.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +144 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lesson.d.ts +3 -0
- package/dist/cli/lesson.d.ts.map +1 -0
- package/dist/cli/lesson.js +85 -0
- package/dist/cli/lesson.js.map +1 -0
- package/dist/cli/project-resolver.d.ts +17 -0
- package/dist/cli/project-resolver.d.ts.map +1 -0
- package/dist/cli/project-resolver.js +25 -0
- package/dist/cli/project-resolver.js.map +1 -0
- package/dist/cli/project.d.ts +12 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +169 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/relation.d.ts +3 -0
- package/dist/cli/relation.d.ts.map +1 -0
- package/dist/cli/relation.js +128 -0
- package/dist/cli/relation.js.map +1 -0
- package/dist/cli/review.d.ts +3 -0
- package/dist/cli/review.d.ts.map +1 -0
- package/dist/cli/review.js +131 -0
- package/dist/cli/review.js.map +1 -0
- package/dist/cli/router.d.ts +38 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +49 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/schema.d.ts +3 -0
- package/dist/cli/schema.d.ts.map +1 -0
- package/dist/cli/schema.js +94 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/cli/sprint.d.ts +12 -0
- package/dist/cli/sprint.d.ts.map +1 -0
- package/dist/cli/sprint.js +200 -0
- package/dist/cli/sprint.js.map +1 -0
- package/dist/cli/task.d.ts +12 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +252 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/test-report.d.ts +3 -0
- package/dist/cli/test-report.d.ts.map +1 -0
- package/dist/cli/test-report.js +134 -0
- package/dist/cli/test-report.js.map +1 -0
- package/dist/cli/validate.d.ts +8 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +86 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/config/config.d.ts +18 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +70 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/registry.d.ts +52 -0
- package/dist/config/registry.d.ts.map +1 -0
- package/dist/config/registry.js +193 -0
- package/dist/config/registry.js.map +1 -0
- package/dist/config/resolver.d.ts +26 -0
- package/dist/config/resolver.d.ts.map +1 -0
- package/dist/config/resolver.js +87 -0
- package/dist/config/resolver.js.map +1 -0
- package/dist/db/builtin-schema-constants.d.ts +109 -0
- package/dist/db/builtin-schema-constants.d.ts.map +1 -0
- package/dist/db/builtin-schema-constants.js +32 -0
- package/dist/db/builtin-schema-constants.js.map +1 -0
- package/dist/db/connection.d.ts +34 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +140 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/generated/schema-types.d.ts +134 -0
- package/dist/db/generated/schema-types.d.ts.map +1 -0
- package/dist/db/generated/schema-types.js +31 -0
- package/dist/db/generated/schema-types.js.map +1 -0
- package/dist/db/locks.d.ts +106 -0
- package/dist/db/locks.d.ts.map +1 -0
- package/dist/db/locks.js +211 -0
- package/dist/db/locks.js.map +1 -0
- package/dist/db/migration.d.ts +65 -0
- package/dist/db/migration.d.ts.map +1 -0
- package/dist/db/migration.js +233 -0
- package/dist/db/migration.js.map +1 -0
- package/dist/db/retry.d.ts +26 -0
- package/dist/db/retry.d.ts.map +1 -0
- package/dist/db/retry.js +71 -0
- package/dist/db/retry.js.map +1 -0
- package/dist/db/schema.d.ts +21 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +830 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/models/common.d.ts +27 -0
- package/dist/models/common.d.ts.map +1 -0
- package/dist/models/common.js +4 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/document.d.ts +89 -0
- package/dist/models/document.d.ts.map +1 -0
- package/dist/models/document.js +5 -0
- package/dist/models/document.js.map +1 -0
- package/dist/models/entity-model.d.ts +30 -0
- package/dist/models/entity-model.d.ts.map +1 -0
- package/dist/models/entity-model.js +99 -0
- package/dist/models/entity-model.js.map +1 -0
- package/dist/models/entity.d.ts +88 -0
- package/dist/models/entity.d.ts.map +1 -0
- package/dist/models/entity.js +5 -0
- package/dist/models/entity.js.map +1 -0
- package/dist/models/graph-schema.d.ts +43 -0
- package/dist/models/graph-schema.d.ts.map +1 -0
- package/dist/models/graph-schema.js +76 -0
- package/dist/models/graph-schema.js.map +1 -0
- package/dist/models/project.d.ts +49 -0
- package/dist/models/project.d.ts.map +1 -0
- package/dist/models/project.js +18 -0
- package/dist/models/project.js.map +1 -0
- package/dist/models/relation.d.ts +35 -0
- package/dist/models/relation.d.ts.map +1 -0
- package/dist/models/relation.js +212 -0
- package/dist/models/relation.js.map +1 -0
- package/dist/models/review.d.ts +86 -0
- package/dist/models/review.d.ts.map +1 -0
- package/dist/models/review.js +5 -0
- package/dist/models/review.js.map +1 -0
- package/dist/models/sprint.d.ts +38 -0
- package/dist/models/sprint.d.ts.map +1 -0
- package/dist/models/sprint.js +4 -0
- package/dist/models/sprint.js.map +1 -0
- package/dist/models/task.d.ts +75 -0
- package/dist/models/task.d.ts.map +1 -0
- package/dist/models/task.js +4 -0
- package/dist/models/task.js.map +1 -0
- package/dist/models/validation.d.ts +25 -0
- package/dist/models/validation.d.ts.map +1 -0
- package/dist/models/validation.js +4 -0
- package/dist/models/validation.js.map +1 -0
- package/dist/services/audit-check-service.d.ts +16 -0
- package/dist/services/audit-check-service.d.ts.map +1 -0
- package/dist/services/audit-check-service.js +137 -0
- package/dist/services/audit-check-service.js.map +1 -0
- package/dist/services/audit-checks/dangling-relations-check.d.ts +7 -0
- package/dist/services/audit-checks/dangling-relations-check.d.ts.map +1 -0
- package/dist/services/audit-checks/dangling-relations-check.js +52 -0
- package/dist/services/audit-checks/dangling-relations-check.js.map +1 -0
- package/dist/services/audit-checks/duplicate-ids-check.d.ts +4 -0
- package/dist/services/audit-checks/duplicate-ids-check.d.ts.map +1 -0
- package/dist/services/audit-checks/duplicate-ids-check.js +49 -0
- package/dist/services/audit-checks/duplicate-ids-check.js.map +1 -0
- package/dist/services/audit-checks/fix-engine.d.ts +24 -0
- package/dist/services/audit-checks/fix-engine.d.ts.map +1 -0
- package/dist/services/audit-checks/fix-engine.js +114 -0
- package/dist/services/audit-checks/fix-engine.js.map +1 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts +9 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js +56 -0
- package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts +10 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js +57 -0
- package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts +9 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts.map +1 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.js +56 -0
- package/dist/services/audit-checks/fs-nfs-to-ts-check.js.map +1 -0
- package/dist/services/audit-checks/inverse-consistency-check.d.ts +7 -0
- package/dist/services/audit-checks/inverse-consistency-check.d.ts.map +1 -0
- package/dist/services/audit-checks/inverse-consistency-check.js +54 -0
- package/dist/services/audit-checks/inverse-consistency-check.js.map +1 -0
- package/dist/services/audit-checks/mapping-check.d.ts +4 -0
- package/dist/services/audit-checks/mapping-check.d.ts.map +1 -0
- package/dist/services/audit-checks/mapping-check.js +74 -0
- package/dist/services/audit-checks/mapping-check.js.map +1 -0
- package/dist/services/audit-checks/orphan-documents-check.d.ts +9 -0
- package/dist/services/audit-checks/orphan-documents-check.d.ts.map +1 -0
- package/dist/services/audit-checks/orphan-documents-check.js +54 -0
- package/dist/services/audit-checks/orphan-documents-check.js.map +1 -0
- package/dist/services/audit-checks/orphan-entities-check.d.ts +4 -0
- package/dist/services/audit-checks/orphan-entities-check.d.ts.map +1 -0
- package/dist/services/audit-checks/orphan-entities-check.js +39 -0
- package/dist/services/audit-checks/orphan-entities-check.js.map +1 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts +9 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts.map +1 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js +56 -0
- package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js.map +1 -0
- package/dist/services/audit-checks/sprint-consistency-check.d.ts +4 -0
- package/dist/services/audit-checks/sprint-consistency-check.d.ts.map +1 -0
- package/dist/services/audit-checks/sprint-consistency-check.js +80 -0
- package/dist/services/audit-checks/sprint-consistency-check.js.map +1 -0
- package/dist/services/audit-checks/src-filesystem-only-check.d.ts +10 -0
- package/dist/services/audit-checks/src-filesystem-only-check.d.ts.map +1 -0
- package/dist/services/audit-checks/src-filesystem-only-check.js +106 -0
- package/dist/services/audit-checks/src-filesystem-only-check.js.map +1 -0
- package/dist/services/audit-checks/ts-to-tc-check.d.ts +10 -0
- package/dist/services/audit-checks/ts-to-tc-check.d.ts.map +1 -0
- package/dist/services/audit-checks/ts-to-tc-check.js +58 -0
- package/dist/services/audit-checks/ts-to-tc-check.js.map +1 -0
- package/dist/services/audit-checks/type-mismatch-check.d.ts +4 -0
- package/dist/services/audit-checks/type-mismatch-check.d.ts.map +1 -0
- package/dist/services/audit-checks/type-mismatch-check.js +55 -0
- package/dist/services/audit-checks/type-mismatch-check.js.map +1 -0
- package/dist/services/audit-checks/types.d.ts +66 -0
- package/dist/services/audit-checks/types.d.ts.map +1 -0
- package/dist/services/audit-checks/types.js +30 -0
- package/dist/services/audit-checks/types.js.map +1 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts +9 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts.map +1 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.js +56 -0
- package/dist/services/audit-checks/us-to-fr-nfr-check.js.map +1 -0
- package/dist/services/doc-entity-mapping.d.ts +19 -0
- package/dist/services/doc-entity-mapping.d.ts.map +1 -0
- package/dist/services/doc-entity-mapping.js +35 -0
- package/dist/services/doc-entity-mapping.js.map +1 -0
- package/dist/services/document-service.d.ts +58 -0
- package/dist/services/document-service.d.ts.map +1 -0
- package/dist/services/document-service.js +409 -0
- package/dist/services/document-service.js.map +1 -0
- package/dist/services/graph-export-service.d.ts +12 -0
- package/dist/services/graph-export-service.d.ts.map +1 -0
- package/dist/services/graph-export-service.js +112 -0
- package/dist/services/graph-export-service.js.map +1 -0
- package/dist/services/graph-service.d.ts +21 -0
- package/dist/services/graph-service.d.ts.map +1 -0
- package/dist/services/graph-service.js +49 -0
- package/dist/services/graph-service.js.map +1 -0
- package/dist/services/graph-validation-service.d.ts +13 -0
- package/dist/services/graph-validation-service.d.ts.map +1 -0
- package/dist/services/graph-validation-service.js +171 -0
- package/dist/services/graph-validation-service.js.map +1 -0
- package/dist/services/project.d.ts +80 -0
- package/dist/services/project.d.ts.map +1 -0
- package/dist/services/project.js +256 -0
- package/dist/services/project.js.map +1 -0
- package/dist/services/review-service.d.ts +81 -0
- package/dist/services/review-service.d.ts.map +1 -0
- package/dist/services/review-service.js +242 -0
- package/dist/services/review-service.js.map +1 -0
- package/dist/services/schema-migration-service.d.ts +44 -0
- package/dist/services/schema-migration-service.d.ts.map +1 -0
- package/dist/services/schema-migration-service.js +894 -0
- package/dist/services/schema-migration-service.js.map +1 -0
- package/dist/services/sprint.d.ts +71 -0
- package/dist/services/sprint.d.ts.map +1 -0
- package/dist/services/sprint.js +238 -0
- package/dist/services/sprint.js.map +1 -0
- package/dist/services/stage-validator.d.ts +36 -0
- package/dist/services/stage-validator.d.ts.map +1 -0
- package/dist/services/stage-validator.js +78 -0
- package/dist/services/stage-validator.js.map +1 -0
- package/dist/services/task.d.ts +75 -0
- package/dist/services/task.d.ts.map +1 -0
- package/dist/services/task.js +487 -0
- package/dist/services/task.js.map +1 -0
- package/dist/services/validation.d.ts +24 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/services/validation.js +53 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/state-machines/sprint-state.d.ts +25 -0
- package/dist/state-machines/sprint-state.d.ts.map +1 -0
- package/dist/state-machines/sprint-state.js +64 -0
- package/dist/state-machines/sprint-state.js.map +1 -0
- package/dist/state-machines/task-state.d.ts +31 -0
- package/dist/state-machines/task-state.d.ts.map +1 -0
- package/dist/state-machines/task-state.js +83 -0
- package/dist/state-machines/task-state.js.map +1 -0
- package/dist/utils/errors.d.ts +673 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +1447 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format.d.ts +52 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +65 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/validators/board-integrity.d.ts +25 -0
- package/dist/validators/board-integrity.d.ts.map +1 -0
- package/dist/validators/board-integrity.js +102 -0
- package/dist/validators/board-integrity.js.map +1 -0
- package/dist/validators/board-shape.d.ts +13 -0
- package/dist/validators/board-shape.d.ts.map +1 -0
- package/dist/validators/board-shape.js +74 -0
- package/dist/validators/board-shape.js.map +1 -0
- package/dist/validators/owner-validator.d.ts +30 -0
- package/dist/validators/owner-validator.d.ts.map +1 -0
- package/dist/validators/owner-validator.js +70 -0
- package/dist/validators/owner-validator.js.map +1 -0
- package/dist/validators/spawn-legality.d.ts +19 -0
- package/dist/validators/spawn-legality.d.ts.map +1 -0
- package/dist/validators/spawn-legality.js +77 -0
- package/dist/validators/spawn-legality.js.map +1 -0
- package/dist/validators/state-field-checker.d.ts +8 -0
- package/dist/validators/state-field-checker.d.ts.map +1 -0
- package/dist/validators/state-field-checker.js +47 -0
- package/dist/validators/state-field-checker.js.map +1 -0
- package/dist/validators/state-field-recorder.d.ts +39 -0
- package/dist/validators/state-field-recorder.d.ts.map +1 -0
- package/dist/validators/state-field-recorder.js +62 -0
- package/dist/validators/state-field-recorder.js.map +1 -0
- 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"}
|