@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,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// fs-nfs-to-ts audit check: FS/NFS→TS traceability
|
|
3
|
+
// SAD-0037 §3.5: FS/NFS documents without verified_by relation to TS
|
|
4
|
+
// FS-SS-036-0004: FS/NFS→TS Traceability Check Implementation
|
|
5
|
+
// MOD-023: CLI Audit Command
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.fsNfsToTsCheck = fsNfsToTsCheck;
|
|
8
|
+
/**
|
|
9
|
+
* Verify every FS or NFS document has at least one outgoing verified_by relation
|
|
10
|
+
* to a Test Suite (TS) document.
|
|
11
|
+
* Non-fixable — reports missing traceability only.
|
|
12
|
+
*/
|
|
13
|
+
function fsNfsToTsCheck(db, sprintId) {
|
|
14
|
+
let sql = `
|
|
15
|
+
SELECT d.id, d.type, d.title
|
|
16
|
+
FROM documents d
|
|
17
|
+
WHERE d.type IN ('FS', 'NFS')
|
|
18
|
+
AND NOT EXISTS (
|
|
19
|
+
SELECT 1 FROM relations r
|
|
20
|
+
WHERE r.from_id = d.id
|
|
21
|
+
AND r.rel_type = 'verified_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 ('FS', 'NFS')
|
|
30
|
+
AND NOT EXISTS (
|
|
31
|
+
SELECT 1 FROM relations r
|
|
32
|
+
WHERE r.from_id = d.id
|
|
33
|
+
AND r.rel_type = 'verified_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_TS',
|
|
43
|
+
docId: row.id,
|
|
44
|
+
docType: row.type,
|
|
45
|
+
detail: `FS/NFS document '${row.id}' has no verified_by relation to any Test Suite`,
|
|
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 FS/NFS documents have TS traceability${scope}`
|
|
53
|
+
: `${issues.length} FS/NFS document(s) missing TS traceability${scope}`;
|
|
54
|
+
return { checkName: 'fs-nfs-to-ts', status, summary, issues };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=fs-nfs-to-ts-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-nfs-to-ts-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/fs-nfs-to-ts-check.ts"],"names":[],"mappings":";AAAA,mDAAmD;AACnD,qEAAqE;AACrE,8DAA8D;AAC9D,6BAA6B;;AAU7B,wCAgDC;AArDD;;;;GAIG;AACH,SAAgB,cAAc,CAAC,EAAqB,EAAE,QAAiB;IACrE,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,YAAY;QACrB,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,MAAM,EAAE,oBAAoB,GAAG,CAAC,EAAE,iDAAiD;QACnF,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,4CAA4C,KAAK,EAAE;QACrD,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,8CAA8C,KAAK,EAAE,CAAC;IAE1E,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { CheckResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Detect relations where the inverse is missing.
|
|
5
|
+
*/
|
|
6
|
+
export declare function inverseConsistencyCheck(db: Database.Database, _sprintId?: string): CheckResult;
|
|
7
|
+
//# sourceMappingURL=inverse-consistency-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inverse-consistency-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/inverse-consistency-check.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAUvD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CA0C9F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// inverse-consistency audit check: missing inverse relations
|
|
3
|
+
// SAD-0036: Four-Check Architecture — inverse-consistency check
|
|
4
|
+
// MOD-023: CLI Audit Command
|
|
5
|
+
//
|
|
6
|
+
// Detects relations where the relation type defines `inverse_of` but the
|
|
7
|
+
// corresponding inverse relation does not exist in the graph.
|
|
8
|
+
// Not sprint-scoped (relations span across sprint boundaries).
|
|
9
|
+
// Fixable via FixEngine (MISSING_INVERSE).
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.inverseConsistencyCheck = inverseConsistencyCheck;
|
|
12
|
+
/**
|
|
13
|
+
* Detect relations where the inverse is missing.
|
|
14
|
+
*/
|
|
15
|
+
function inverseConsistencyCheck(db, _sprintId) {
|
|
16
|
+
const issues = [];
|
|
17
|
+
const rows = db.prepare(`
|
|
18
|
+
SELECT
|
|
19
|
+
r.id AS relation_id,
|
|
20
|
+
r.from_id,
|
|
21
|
+
r.rel_type,
|
|
22
|
+
r.to_id,
|
|
23
|
+
rt.inverse_of
|
|
24
|
+
FROM relations r
|
|
25
|
+
JOIN relation_types rt ON r.rel_type = rt.name
|
|
26
|
+
WHERE rt.inverse_of IS NOT NULL
|
|
27
|
+
AND NOT EXISTS (
|
|
28
|
+
SELECT 1 FROM relations ri
|
|
29
|
+
WHERE ri.rel_type = rt.inverse_of
|
|
30
|
+
AND ri.from_id = r.to_id
|
|
31
|
+
AND ri.to_id = r.from_id
|
|
32
|
+
)
|
|
33
|
+
ORDER BY r.id
|
|
34
|
+
`).all();
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
issues.push({
|
|
37
|
+
issueId: 'MISSING_INVERSE',
|
|
38
|
+
relationId: row.relation_id,
|
|
39
|
+
relationSide: 'target',
|
|
40
|
+
entityId: row.from_id,
|
|
41
|
+
detail: `Relation ${row.relation_id}: "${row.from_id}" --[${row.rel_type}]--> "${row.to_id}" is missing inverse relation "[${row.inverse_of}]"`,
|
|
42
|
+
fixable: true,
|
|
43
|
+
// Store extra info needed for the fix via closure
|
|
44
|
+
entityTypeFound: row.inverse_of,
|
|
45
|
+
entityTypeExpected: row.to_id, // we stash the to_id here for the fix engine
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const status = issues.length === 0 ? 'PASS' : 'FAIL';
|
|
49
|
+
const summary = status === 'PASS'
|
|
50
|
+
? 'All inverse relations are consistent'
|
|
51
|
+
: `${issues.length} missing inverse relations found`;
|
|
52
|
+
return { checkName: 'inverse-consistency', status, summary, issues };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=inverse-consistency-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inverse-consistency-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/inverse-consistency-check.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,gEAAgE;AAChE,6BAA6B;AAC7B,EAAE;AACF,yEAAyE;AACzE,8DAA8D;AAC9D,+DAA+D;AAC/D,2CAA2C;;AAgB3C,0DA0CC;AA7CD;;GAEG;AACH,SAAgB,uBAAuB,CAAC,EAAqB,EAAE,SAAkB;IAC/E,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;GAiBvB,CAAC,CAAC,GAAG,EAAuB,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,OAAO;YACrB,MAAM,EAAE,YAAY,GAAG,CAAC,WAAW,MAAM,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC,QAAQ,SAAS,GAAG,CAAC,KAAK,mCAAmC,GAAG,CAAC,UAAU,IAAI;YAC/I,OAAO,EAAE,IAAI;YACb,kDAAkD;YAClD,eAAe,EAAE,GAAG,CAAC,UAAU;YAC/B,kBAAkB,EAAE,GAAG,CAAC,KAAK,EAAE,6CAA6C;SAC7E,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,sCAAsC;QACxC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,kCAAkC,CAAC;IAEvD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/mapping-check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAKvD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAwElF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// mapping audit check: doc→entity-type mapping validation
|
|
3
|
+
// FS-SS-023-0001: Verify every document has a valid entity-type mapping
|
|
4
|
+
// FS-SS-023-0012 v2: Sprint scoping via task/doc ID matching (URD-G001 removed documents.sprint_id)
|
|
5
|
+
// MOD-023: CLI Audit Command
|
|
6
|
+
// builtin:3.0 (Sprint 31): entity_types table dropped; doc types ARE entity type names
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.mappingCheck = mappingCheck;
|
|
9
|
+
/** Canonical document types in builtin:3.0 (SAD-0033 §2) */
|
|
10
|
+
const CANONICAL_DOC_TYPES = new Set(['AD', 'FR', 'FS', 'MDL', 'NFR', 'NFS', 'QA', 'SAD', 'SRC', 'TC', 'TR', 'TS', 'US']);
|
|
11
|
+
function mappingCheck(db, sprintId) {
|
|
12
|
+
let docs;
|
|
13
|
+
if (sprintId) {
|
|
14
|
+
// Sprint scoping via task ID matching (URD-G001 removed documents.sprint_id)
|
|
15
|
+
// Documents whose ID matches a task ID in the given sprint
|
|
16
|
+
const sprintDocIds = db.prepare(`
|
|
17
|
+
SELECT DISTINCT d.id FROM documents d
|
|
18
|
+
WHERE d.id IN (SELECT t.id FROM tasks t WHERE t.sprint_id = ?)
|
|
19
|
+
`).all(sprintId);
|
|
20
|
+
const sprintDocIdSet = new Set(sprintDocIds.map(r => r.id));
|
|
21
|
+
const allDocs = db.prepare('SELECT id, type, title FROM documents').all();
|
|
22
|
+
docs = allDocs.filter(d => sprintDocIdSet.has(d.id));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
docs = db.prepare('SELECT id, type, title FROM documents').all();
|
|
26
|
+
}
|
|
27
|
+
const issues = [];
|
|
28
|
+
for (const doc of docs) {
|
|
29
|
+
// builtin:3.0: doc type IS entity type name (no mapping needed).
|
|
30
|
+
const expectedEntityType = doc.type;
|
|
31
|
+
if (!expectedEntityType) {
|
|
32
|
+
issues.push({
|
|
33
|
+
issueId: 'MISSING_MAPPING',
|
|
34
|
+
docId: doc.id,
|
|
35
|
+
docType: doc.type,
|
|
36
|
+
detail: `Document "${doc.id}" (type: ${doc.type}) has no known entity-type mapping`,
|
|
37
|
+
fixable: false,
|
|
38
|
+
});
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// builtin:3.0: entity_types table dropped.
|
|
42
|
+
// Validate against canonical doc types instead.
|
|
43
|
+
if (!CANONICAL_DOC_TYPES.has(doc.type)) {
|
|
44
|
+
issues.push({
|
|
45
|
+
issueId: 'INVALID_ENTITY_TYPE',
|
|
46
|
+
docId: doc.id,
|
|
47
|
+
docType: doc.type,
|
|
48
|
+
detail: `Document "${doc.id}" (type: ${doc.type}) is not a canonical document type`,
|
|
49
|
+
fixable: false,
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Check if corresponding entity exists and has correct type_name
|
|
54
|
+
const entity = db.prepare('SELECT type_name FROM entities WHERE id = ?').get(doc.id);
|
|
55
|
+
if (entity !== undefined && entity.type_name !== expectedEntityType) {
|
|
56
|
+
issues.push({
|
|
57
|
+
issueId: 'TYPE_MISMATCH',
|
|
58
|
+
docId: doc.id,
|
|
59
|
+
docType: doc.type,
|
|
60
|
+
entityId: doc.id,
|
|
61
|
+
entityTypeFound: entity.type_name,
|
|
62
|
+
entityTypeExpected: expectedEntityType,
|
|
63
|
+
detail: `Document "${doc.id}" (type: ${doc.type}) has entity "${doc.id}" with type_name "${entity.type_name}" but expected "${expectedEntityType}"`,
|
|
64
|
+
fixable: false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const status = issues.length === 0 ? 'PASS' : 'FAIL';
|
|
69
|
+
const summary = status === 'PASS'
|
|
70
|
+
? `All ${docs.length} documents have valid entity-type mappings`
|
|
71
|
+
: `${issues.length} documents have mapping issues (${issues.filter(i => i.issueId === 'MISSING_MAPPING').length} missing, ${issues.filter(i => i.issueId === 'INVALID_ENTITY_TYPE').length} invalid, ${issues.filter(i => i.issueId === 'TYPE_MISMATCH').length} type mismatch)`;
|
|
72
|
+
return { checkName: 'mapping', status, summary, issues };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=mapping-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/mapping-check.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
|
+
* Detect documents that have zero relations in the graph.
|
|
5
|
+
* Optionally sprint-scoped when sprintId is provided.
|
|
6
|
+
* Non-fixable — reports only.
|
|
7
|
+
*/
|
|
8
|
+
export declare function orphanDocumentsCheck(db: Database.Database, sprintId?: string): CheckResult;
|
|
9
|
+
//# sourceMappingURL=orphan-documents-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-documents-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/orphan-documents-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CA6C1F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// orphan-documents audit check: documents with zero graph relations
|
|
3
|
+
// SAD-0036: Four-Check Architecture — orphan-documents check
|
|
4
|
+
// MOD-023: CLI Audit Command
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.orphanDocumentsCheck = orphanDocumentsCheck;
|
|
7
|
+
/**
|
|
8
|
+
* Detect documents that have zero relations in the graph.
|
|
9
|
+
* Optionally sprint-scoped when sprintId is provided.
|
|
10
|
+
* Non-fixable — reports only.
|
|
11
|
+
*/
|
|
12
|
+
function orphanDocumentsCheck(db, sprintId) {
|
|
13
|
+
const issues = [];
|
|
14
|
+
let rows;
|
|
15
|
+
if (sprintId) {
|
|
16
|
+
// Sprint-scoped: check only documents linked to tasks in the given sprint
|
|
17
|
+
rows = db.prepare(`
|
|
18
|
+
SELECT d.id, d.type, d.title
|
|
19
|
+
FROM documents d
|
|
20
|
+
JOIN tasks t ON t.id = d.id
|
|
21
|
+
WHERE t.sprint_id = ?
|
|
22
|
+
AND d.id NOT IN (SELECT from_id FROM relations)
|
|
23
|
+
AND d.id NOT IN (SELECT to_id FROM relations)
|
|
24
|
+
ORDER BY d.id
|
|
25
|
+
`).all(sprintId);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Full scope: check all documents
|
|
29
|
+
rows = db.prepare(`
|
|
30
|
+
SELECT d.id, d.type, d.title
|
|
31
|
+
FROM documents d
|
|
32
|
+
WHERE d.id NOT IN (SELECT from_id FROM relations)
|
|
33
|
+
AND d.id NOT IN (SELECT to_id FROM relations)
|
|
34
|
+
ORDER BY d.id
|
|
35
|
+
`).all();
|
|
36
|
+
}
|
|
37
|
+
for (const row of rows) {
|
|
38
|
+
issues.push({
|
|
39
|
+
issueId: 'ORPHAN_DOCUMENT',
|
|
40
|
+
docId: row.id,
|
|
41
|
+
docType: row.type,
|
|
42
|
+
detail: `Document "${row.id}" (${row.type}) has zero graph relations`,
|
|
43
|
+
severity: 'warning',
|
|
44
|
+
fixable: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const status = issues.length === 0 ? 'PASS' : 'FAIL';
|
|
48
|
+
const scope = sprintId ? ` in sprint ${sprintId}` : '';
|
|
49
|
+
const summary = status === 'PASS'
|
|
50
|
+
? `No orphan documents found${scope}`
|
|
51
|
+
: `${issues.length} orphan documents found${scope}`;
|
|
52
|
+
return { checkName: 'orphan-documents', status, summary, issues };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=orphan-documents-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-documents-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/orphan-documents-check.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,6DAA6D;AAC7D,6BAA6B;;AAU7B,oDA6CC;AAlDD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,EAAqB,EAAE,QAAiB;IAC3E,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,IAAI,IAAwD,CAAC;IAE7D,IAAI,QAAQ,EAAE,CAAC;QACb,0EAA0E;QAC1E,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQjB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAuD,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAMjB,CAAC,CAAC,GAAG,EAAwD,CAAC;IACjE,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,iBAAiB;YAC1B,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,OAAO,EAAE,GAAG,CAAC,IAAI;YACjB,MAAM,EAAE,aAAa,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,4BAA4B;YACrE,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,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,4BAA4B,KAAK,EAAE;QACrC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,0BAA0B,KAAK,EAAE,CAAC;IAEtD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-entities-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/orphan-entities-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAsCzF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// orphan-entities audit check: entities with no graph relations
|
|
3
|
+
// FS-SS-023-0002: Detect entities with zero relations, classify fixability
|
|
4
|
+
// MOD-023: CLI Audit Command
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.orphanEntitiesCheck = orphanEntitiesCheck;
|
|
7
|
+
function orphanEntitiesCheck(db, sprintId) {
|
|
8
|
+
// Find entities with no relations
|
|
9
|
+
const orphans = db.prepare(`
|
|
10
|
+
SELECT e.id, e.type_name,
|
|
11
|
+
(SELECT COUNT(*) FROM documents d WHERE d.id = e.id) as doc_count
|
|
12
|
+
FROM entities e
|
|
13
|
+
WHERE (SELECT COUNT(*) FROM relations r WHERE r.from_id = e.id OR r.to_id = e.id) = 0
|
|
14
|
+
`).all();
|
|
15
|
+
let issues = [];
|
|
16
|
+
for (const entity of orphans) {
|
|
17
|
+
const hasDoc = entity.doc_count > 0;
|
|
18
|
+
issues.push({
|
|
19
|
+
issueId: hasDoc ? 'ORPHAN_ENTITY_WITH_DOC' : 'ORPHAN_ENTITY_NO_DOC',
|
|
20
|
+
entityId: entity.id,
|
|
21
|
+
detail: hasDoc
|
|
22
|
+
? `Entity "${entity.id}" (type: ${entity.type_name}) has no relations but has an associated document`
|
|
23
|
+
: `Entity "${entity.id}" (type: ${entity.type_name}) has no relations and no associated document`,
|
|
24
|
+
fixable: !hasDoc,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Sprint scoping via task ID matching (URD-G001 removed documents.sprint_id)
|
|
28
|
+
if (sprintId) {
|
|
29
|
+
const sprintDocIds = new Set(db.prepare('SELECT DISTINCT d.id FROM documents d WHERE d.id IN (SELECT t.id FROM tasks t WHERE t.sprint_id = ?)').all(sprintId).map(r => r.id));
|
|
30
|
+
issues = issues.filter(i => i.entityId && sprintDocIds.has(i.entityId));
|
|
31
|
+
}
|
|
32
|
+
const status = issues.length === 0 ? 'PASS' : 'FAIL';
|
|
33
|
+
const fixableCount = issues.filter(i => i.fixable).length;
|
|
34
|
+
const summary = status === 'PASS'
|
|
35
|
+
? 'No orphan entities found'
|
|
36
|
+
: `${issues.length} orphan entities found (${fixableCount} fixable)`;
|
|
37
|
+
return { checkName: 'orphan-entities', status, summary, issues };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=orphan-entities-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphan-entities-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/orphan-entities-check.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,2EAA2E;AAC3E,6BAA6B;;AAK7B,kDAsCC;AAtCD,SAAgB,mBAAmB,CAAC,EAAqB,EAAE,QAAiB;IAC1E,kCAAkC;IAClC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK1B,CAAC,CAAC,GAAG,EAAiE,CAAC;IAExE,IAAI,MAAM,GAAiB,EAAE,CAAC;IAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB;YACnE,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM;gBACZ,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,YAAY,MAAM,CAAC,SAAS,mDAAmD;gBACrG,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,YAAY,MAAM,CAAC,SAAS,+CAA+C;YACnG,OAAO,EAAE,CAAC,MAAM;SACjB,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,IAAI,GAAG,CACzB,EAAE,CAAC,OAAO,CAAC,sGAAsG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3K,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM;QAC/B,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,2BAA2B,YAAY,WAAW,CAAC;IAEvE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { CheckResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Verify every SAD, AD, QA, or TC document has at least one outgoing
|
|
5
|
+
* implemented_by relation to a Source Code (SRC) document.
|
|
6
|
+
* Non-fixable — reports missing traceability only.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sadAdQaTcToSrcCheck(db: Database.Database, sprintId?: string): CheckResult;
|
|
9
|
+
//# sourceMappingURL=sad-ad-qa-tc-to-src-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sad-ad-qa-tc-to-src-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/sad-ad-qa-tc-to-src-check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgDzF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// sad-ad-qa-tc-to-src audit check: SAD/AD/QA/TC→SRC traceability
|
|
3
|
+
// SAD-0037 §3.7: SAD/AD/QA/TC documents without implemented_by relation to SRC
|
|
4
|
+
// FS-SS-036-0006: SAD/AD/QA/TC→SRC Traceability Check Implementation
|
|
5
|
+
// MOD-023: CLI Audit Command
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.sadAdQaTcToSrcCheck = sadAdQaTcToSrcCheck;
|
|
8
|
+
/**
|
|
9
|
+
* Verify every SAD, AD, QA, or TC document has at least one outgoing
|
|
10
|
+
* implemented_by relation to a Source Code (SRC) document.
|
|
11
|
+
* Non-fixable — reports missing traceability only.
|
|
12
|
+
*/
|
|
13
|
+
function sadAdQaTcToSrcCheck(db, sprintId) {
|
|
14
|
+
let sql = `
|
|
15
|
+
SELECT d.id, d.type, d.title
|
|
16
|
+
FROM documents d
|
|
17
|
+
WHERE d.type IN ('SAD', 'AD', 'QA', 'TC')
|
|
18
|
+
AND NOT EXISTS (
|
|
19
|
+
SELECT 1 FROM relations r
|
|
20
|
+
WHERE r.from_id = d.id
|
|
21
|
+
AND r.rel_type = 'implemented_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 ('SAD', 'AD', 'QA', 'TC')
|
|
30
|
+
AND NOT EXISTS (
|
|
31
|
+
SELECT 1 FROM relations r
|
|
32
|
+
WHERE r.from_id = d.id
|
|
33
|
+
AND r.rel_type = 'implemented_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.type, d.id';
|
|
40
|
+
const rows = db.prepare(sql).all(...params);
|
|
41
|
+
const issues = rows.map(row => ({
|
|
42
|
+
issueId: 'MISSING_SRC',
|
|
43
|
+
docId: row.id,
|
|
44
|
+
docType: row.type,
|
|
45
|
+
detail: `'${row.type}' document '${row.id}' has no implemented_by relation to any SRC artifact`,
|
|
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 SAD/AD/QA/TC documents have SRC traceability${scope}`
|
|
53
|
+
: `${issues.length} SAD/AD/QA/TC document(s) missing SRC traceability${scope}`;
|
|
54
|
+
return { checkName: 'sad-ad-qa-tc-to-src', status, summary, issues };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sad-ad-qa-tc-to-src-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sad-ad-qa-tc-to-src-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/sad-ad-qa-tc-to-src-check.ts"],"names":[],"mappings":";AAAA,iEAAiE;AACjE,+EAA+E;AAC/E,qEAAqE;AACrE,6BAA6B;;AAU7B,kDAgDC;AArDD;;;;GAIG;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,wBAAwB,CAAC;IAEhC,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,aAAa;QACtB,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,sDAAsD;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 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-consistency-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/sprint-consistency-check.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAkBvD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CA2D5F"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// sprint-consistency audit check: sprint-scoped doc types with missing sprint
|
|
3
|
+
// FS-SS-023-0004: Verify REVIEW, TEST-REPORT, TASK documents have sprint_id
|
|
4
|
+
// MOD-023: CLI Audit Command
|
|
5
|
+
//
|
|
6
|
+
// Note: TASK here refers to documents.type = 'TASK', not kanban tasks
|
|
7
|
+
//
|
|
8
|
+
// Backward compatibility: Documents created before MOD-022e enforcement date
|
|
9
|
+
// receive a warning (severity: warning) rather than a MISSING_SPRINT error,
|
|
10
|
+
// to avoid false positives for pre-enforcement legacy documents.
|
|
11
|
+
// FS-SS-023-0004 backward-compatibility scope (per SAD-023 §3.5).
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.sprintConsistencyCheck = sprintConsistencyCheck;
|
|
14
|
+
/** Document types that must be sprint-scoped */
|
|
15
|
+
const SPRINT_SCOPED_TYPES = ['REVIEW', 'TEST-REPORT', 'TASK'];
|
|
16
|
+
/**
|
|
17
|
+
* MOD-022e deployment cutoff date.
|
|
18
|
+
* Documents created before this date are exempt from MISSING_SPRINT errors
|
|
19
|
+
* because sprint-scoping enforcement was not yet active.
|
|
20
|
+
*
|
|
21
|
+
* This date is derived from the MOD-022e migration deployment (sprint-2026051101).
|
|
22
|
+
* It can be adjusted if the actual deployment timestamp differs.
|
|
23
|
+
*
|
|
24
|
+
* To disable backward-compatibility discrimination entirely, set to a date
|
|
25
|
+
* far in the past (e.g., '1970-01-01T00:00:00Z').
|
|
26
|
+
*/
|
|
27
|
+
const MOD_022E_CUTOFF_DATE = '2026-05-09T00:00:00Z';
|
|
28
|
+
function sprintConsistencyCheck(db, sprintId) {
|
|
29
|
+
let docs;
|
|
30
|
+
if (sprintId) {
|
|
31
|
+
docs = db.prepare(`SELECT id, type, sprint_id, created_at FROM documents WHERE sprint_id = ? AND type IN (${SPRINT_SCOPED_TYPES.map(() => '?').join(',')})`).all(sprintId, ...SPRINT_SCOPED_TYPES);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
docs = db.prepare(`SELECT id, type, sprint_id, created_at FROM documents WHERE type IN (${SPRINT_SCOPED_TYPES.map(() => '?').join(',')})`).all(...SPRINT_SCOPED_TYPES);
|
|
35
|
+
}
|
|
36
|
+
const issues = [];
|
|
37
|
+
for (const doc of docs) {
|
|
38
|
+
if (doc.sprint_id === null) {
|
|
39
|
+
const isPreEnforcement = doc.created_at < MOD_022E_CUTOFF_DATE;
|
|
40
|
+
if (isPreEnforcement) {
|
|
41
|
+
// Pre-enforcement document: flag as informational warning, not error
|
|
42
|
+
issues.push({
|
|
43
|
+
issueId: 'MISSING_SPRINT',
|
|
44
|
+
severity: 'warning',
|
|
45
|
+
docId: doc.id,
|
|
46
|
+
docType: doc.type,
|
|
47
|
+
detail: `Document "${doc.id}" (type: ${doc.type}, created: ${doc.created_at}) is sprint-scoped but has no sprint_id — created before MOD-022e enforcement (${MOD_022E_CUTOFF_DATE}); informational only`,
|
|
48
|
+
fixable: false,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Post-enforcement document: real error
|
|
53
|
+
issues.push({
|
|
54
|
+
issueId: 'MISSING_SPRINT',
|
|
55
|
+
severity: 'error',
|
|
56
|
+
docId: doc.id,
|
|
57
|
+
docType: doc.type,
|
|
58
|
+
detail: `Document "${doc.id}" (type: ${doc.type}) is sprint-scoped but has no sprint_id`,
|
|
59
|
+
fixable: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Determine status: warnings alone don't cause FAIL — only actual errors do
|
|
65
|
+
const errorIssues = issues.filter(i => i.severity !== 'warning' && i.severity !== 'info');
|
|
66
|
+
const warningCount = issues.filter(i => i.severity === 'warning').length;
|
|
67
|
+
const status = errorIssues.length === 0 ? (issues.length === 0 ? 'PASS' : 'PASS') : 'FAIL';
|
|
68
|
+
const summaryParts = [];
|
|
69
|
+
if (errorIssues.length > 0) {
|
|
70
|
+
summaryParts.push(`${errorIssues.length} sprint-scoped documents missing sprint_id`);
|
|
71
|
+
}
|
|
72
|
+
if (warningCount > 0) {
|
|
73
|
+
summaryParts.push(`${warningCount} pre-enforcement documents with missing sprint_id (informational)`);
|
|
74
|
+
}
|
|
75
|
+
const summary = summaryParts.length > 0
|
|
76
|
+
? summaryParts.join('; ')
|
|
77
|
+
: 'All sprint-scoped documents have valid sprint_id';
|
|
78
|
+
return { checkName: 'sprint-consistency', status, summary, issues };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sprint-consistency-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-consistency-check.js","sourceRoot":"","sources":["../../../src/services/audit-checks/sprint-consistency-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { CheckResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Verify every SRC document has a corresponding file on the filesystem.
|
|
5
|
+
* SRC documents with a path field are verified for existence; absolute paths
|
|
6
|
+
* are used directly, relative paths are resolved against projectFolder.
|
|
7
|
+
* Non-fixable — reports missing files only.
|
|
8
|
+
*/
|
|
9
|
+
export declare function srcFilesystemOnlyCheck(db: Database.Database, projectFolder: string, sprintId?: string): CheckResult;
|
|
10
|
+
//# sourceMappingURL=src-filesystem-only-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-filesystem-only-check.d.ts","sourceRoot":"","sources":["../../../src/services/audit-checks/src-filesystem-only-check.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,GAChB,WAAW,CA6Db"}
|