@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,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 @@
|
|
|
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"}
|