@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,726 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Table formatter using cli-table3
|
|
3
|
+
// Implements AD-0013: Strategy Pattern for Output Formatters
|
|
4
|
+
// + FS-SS-007-0005 (table output formatter)
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.formatAsTable = formatAsTable;
|
|
10
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
/**
|
|
13
|
+
* Render sprint result as a table.
|
|
14
|
+
*/
|
|
15
|
+
function formatSprintAsTable(data) {
|
|
16
|
+
const table = new cli_table3_1.default({
|
|
17
|
+
head: [chalk_1.default.bold('Field'), chalk_1.default.bold('Value')],
|
|
18
|
+
colWidths: [20, 60],
|
|
19
|
+
});
|
|
20
|
+
for (const [key, value] of Object.entries(data)) {
|
|
21
|
+
const displayValue = value === null ? chalk_1.default.dim('(null)') : value === undefined ? chalk_1.default.dim('(undefined)') : String(value);
|
|
22
|
+
table.push([key, displayValue]);
|
|
23
|
+
}
|
|
24
|
+
return table.toString();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Render task result as a table.
|
|
28
|
+
*/
|
|
29
|
+
function formatTaskAsTable(data) {
|
|
30
|
+
const table = new cli_table3_1.default({
|
|
31
|
+
head: [chalk_1.default.bold('Field'), chalk_1.default.bold('Value')],
|
|
32
|
+
colWidths: [20, 60],
|
|
33
|
+
});
|
|
34
|
+
// Order fields for readability
|
|
35
|
+
const orderedKeys = ['id', 'sprint_id', 'parent_id', 'description', 'status', 'owner', 'task_type', 'priority', 'points', 'session_key', 'stage', 'started_at', 'completed_at'];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const key of orderedKeys) {
|
|
38
|
+
if (key in data) {
|
|
39
|
+
const value = data[key];
|
|
40
|
+
const displayValue = value === null ? chalk_1.default.dim('(null)') : value === undefined ? '' : String(value);
|
|
41
|
+
table.push([key, displayValue]);
|
|
42
|
+
seen.add(key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const [key, value] of Object.entries(data)) {
|
|
46
|
+
if (seen.has(key))
|
|
47
|
+
continue;
|
|
48
|
+
const displayValue = value === null ? chalk_1.default.dim('(null)') : String(value);
|
|
49
|
+
table.push([key, displayValue]);
|
|
50
|
+
}
|
|
51
|
+
return table.toString();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Render a document list as a table.
|
|
55
|
+
* Columns: ID, Type, Title, Updated
|
|
56
|
+
*/
|
|
57
|
+
function formatDocumentListAsTable(docs) {
|
|
58
|
+
if (docs.length === 0) {
|
|
59
|
+
return chalk_1.default.dim('No documents found.');
|
|
60
|
+
}
|
|
61
|
+
const table = new cli_table3_1.default({
|
|
62
|
+
head: [
|
|
63
|
+
chalk_1.default.bold('ID'),
|
|
64
|
+
chalk_1.default.bold('Type'),
|
|
65
|
+
chalk_1.default.bold('Title'),
|
|
66
|
+
chalk_1.default.bold('Updated'),
|
|
67
|
+
],
|
|
68
|
+
colWidths: [20, 12, 35, 24],
|
|
69
|
+
wordWrap: true,
|
|
70
|
+
});
|
|
71
|
+
for (const doc of docs) {
|
|
72
|
+
table.push([
|
|
73
|
+
String(doc.id ?? ''),
|
|
74
|
+
String(doc.type ?? ''),
|
|
75
|
+
String(doc.title ?? ''),
|
|
76
|
+
String(doc.updated_at ?? ''),
|
|
77
|
+
]);
|
|
78
|
+
}
|
|
79
|
+
return table.toString();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Render a task list as a table.
|
|
83
|
+
*/
|
|
84
|
+
const MAX_DESC_LENGTH = 50;
|
|
85
|
+
function formatTaskListAsTable(tasks) {
|
|
86
|
+
if (tasks.length === 0) {
|
|
87
|
+
return chalk_1.default.dim('No tasks found.');
|
|
88
|
+
}
|
|
89
|
+
const table = new cli_table3_1.default({
|
|
90
|
+
head: [
|
|
91
|
+
chalk_1.default.bold('ID'),
|
|
92
|
+
chalk_1.default.bold('Status'),
|
|
93
|
+
chalk_1.default.bold('Owner'),
|
|
94
|
+
chalk_1.default.bold('Description'),
|
|
95
|
+
],
|
|
96
|
+
colWidths: [15, 14, 10, 55],
|
|
97
|
+
});
|
|
98
|
+
for (const task of tasks) {
|
|
99
|
+
const rawDesc = task.description;
|
|
100
|
+
const displayDesc = typeof rawDesc === 'string'
|
|
101
|
+
? (rawDesc.length > MAX_DESC_LENGTH
|
|
102
|
+
? rawDesc.substring(0, MAX_DESC_LENGTH) + '...'
|
|
103
|
+
: rawDesc)
|
|
104
|
+
: String(rawDesc ?? '');
|
|
105
|
+
table.push([
|
|
106
|
+
String(task.id ?? ''),
|
|
107
|
+
String(task.status ?? ''),
|
|
108
|
+
String(task.owner ?? ''),
|
|
109
|
+
displayDesc,
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
return table.toString();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Render search results as a table.
|
|
116
|
+
* Columns: Document ID, Title, Type, Rank
|
|
117
|
+
*/
|
|
118
|
+
function formatSearchResultAsTable(results) {
|
|
119
|
+
if (results.length === 0) {
|
|
120
|
+
return chalk_1.default.dim('No results found.');
|
|
121
|
+
}
|
|
122
|
+
const table = new cli_table3_1.default({
|
|
123
|
+
head: [
|
|
124
|
+
chalk_1.default.bold('Document ID'),
|
|
125
|
+
chalk_1.default.bold('Title'),
|
|
126
|
+
chalk_1.default.bold('Type'),
|
|
127
|
+
chalk_1.default.bold('Rank'),
|
|
128
|
+
],
|
|
129
|
+
colWidths: [20, 40, 12, 10],
|
|
130
|
+
wordWrap: true,
|
|
131
|
+
});
|
|
132
|
+
for (const result of results) {
|
|
133
|
+
table.push([
|
|
134
|
+
String(result.documentId ?? ''),
|
|
135
|
+
String(result.title ?? ''),
|
|
136
|
+
String(result.type ?? ''),
|
|
137
|
+
String(result.rank ?? ''),
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
return table.toString();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Render a sprint overview as a table.
|
|
144
|
+
*/
|
|
145
|
+
function formatSprintOverviewAsTable(data) {
|
|
146
|
+
const lines = [];
|
|
147
|
+
lines.push(chalk_1.default.bold(`Sprint: ${data.id}`));
|
|
148
|
+
lines.push(` Name: ${data.name}`);
|
|
149
|
+
lines.push(` Status: ${data.status}`);
|
|
150
|
+
if (data.goal) {
|
|
151
|
+
lines.push(` Goal: ${data.goal}`);
|
|
152
|
+
}
|
|
153
|
+
lines.push(` Created: ${data.created_at}`);
|
|
154
|
+
if (data.closed_at) {
|
|
155
|
+
lines.push(` Closed: ${data.closed_at}`);
|
|
156
|
+
}
|
|
157
|
+
lines.push('');
|
|
158
|
+
// Task counts by status
|
|
159
|
+
const taskCounts = data.taskCounts;
|
|
160
|
+
if (taskCounts) {
|
|
161
|
+
lines.push(chalk_1.default.bold('Tasks'));
|
|
162
|
+
const table = new cli_table3_1.default({
|
|
163
|
+
head: [
|
|
164
|
+
chalk_1.default.bold('Status'),
|
|
165
|
+
chalk_1.default.bold('Count'),
|
|
166
|
+
],
|
|
167
|
+
colWidths: [20, 10],
|
|
168
|
+
});
|
|
169
|
+
for (const [status, count] of Object.entries(taskCounts)) {
|
|
170
|
+
table.push([status, String(count)]);
|
|
171
|
+
}
|
|
172
|
+
table.push([chalk_1.default.bold('Total'), chalk_1.default.bold(String(data.totalTasks ?? 0))]);
|
|
173
|
+
lines.push(table.toString());
|
|
174
|
+
}
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Render entity type list as a table.
|
|
179
|
+
* Columns: Name, Documents
|
|
180
|
+
*/
|
|
181
|
+
function formatEntityTypeListAsTable(entities) {
|
|
182
|
+
if (entities.length === 0) {
|
|
183
|
+
return chalk_1.default.dim('No entity types found.');
|
|
184
|
+
}
|
|
185
|
+
const table = new cli_table3_1.default({
|
|
186
|
+
head: [
|
|
187
|
+
chalk_1.default.bold('Name'),
|
|
188
|
+
chalk_1.default.bold('Documents'),
|
|
189
|
+
],
|
|
190
|
+
colWidths: [24, 12],
|
|
191
|
+
wordWrap: true,
|
|
192
|
+
});
|
|
193
|
+
for (const e of entities) {
|
|
194
|
+
table.push([
|
|
195
|
+
String(e.name ?? ''),
|
|
196
|
+
String(e.doc_count ?? 0),
|
|
197
|
+
]);
|
|
198
|
+
}
|
|
199
|
+
return table.toString();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Render review list as a table.
|
|
203
|
+
* Columns: Review#, Sprint, Asset, Type, Verdict, Created
|
|
204
|
+
*/
|
|
205
|
+
function formatReviewListAsTable(reviews) {
|
|
206
|
+
if (reviews.length === 0) {
|
|
207
|
+
return chalk_1.default.dim('No reviews found.');
|
|
208
|
+
}
|
|
209
|
+
const table = new cli_table3_1.default({
|
|
210
|
+
head: [
|
|
211
|
+
chalk_1.default.bold('Review#'),
|
|
212
|
+
chalk_1.default.bold('Sprint'),
|
|
213
|
+
chalk_1.default.bold('Asset'),
|
|
214
|
+
chalk_1.default.bold('Type'),
|
|
215
|
+
chalk_1.default.bold('Verdict'),
|
|
216
|
+
chalk_1.default.bold('Created'),
|
|
217
|
+
],
|
|
218
|
+
colWidths: [12, 18, 20, 12, 12, 24],
|
|
219
|
+
wordWrap: true,
|
|
220
|
+
});
|
|
221
|
+
for (const r of reviews) {
|
|
222
|
+
// asset_name renders as empty string when null (not '(null)')
|
|
223
|
+
const assetName = r.asset_name === null || r.asset_name === undefined ? '' : String(r.asset_name);
|
|
224
|
+
table.push([
|
|
225
|
+
String(r.review_num ?? ''),
|
|
226
|
+
String(r.sprint_id ?? ''),
|
|
227
|
+
assetName,
|
|
228
|
+
String(r.review_type ?? ''),
|
|
229
|
+
String(r.verdict ?? ''),
|
|
230
|
+
String(r.created_at ?? ''),
|
|
231
|
+
]);
|
|
232
|
+
}
|
|
233
|
+
return table.toString();
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Render lesson list as a table.
|
|
237
|
+
* Columns: Category, Severity, Title, Created
|
|
238
|
+
*/
|
|
239
|
+
function formatLessonListAsTable(lessons) {
|
|
240
|
+
if (lessons.length === 0) {
|
|
241
|
+
return chalk_1.default.dim('No lessons found.');
|
|
242
|
+
}
|
|
243
|
+
const table = new cli_table3_1.default({
|
|
244
|
+
head: [
|
|
245
|
+
chalk_1.default.bold('Category'),
|
|
246
|
+
chalk_1.default.bold('Severity'),
|
|
247
|
+
chalk_1.default.bold('Title'),
|
|
248
|
+
chalk_1.default.bold('Created'),
|
|
249
|
+
],
|
|
250
|
+
colWidths: [16, 12, 40, 24],
|
|
251
|
+
wordWrap: true,
|
|
252
|
+
});
|
|
253
|
+
for (const l of lessons) {
|
|
254
|
+
table.push([
|
|
255
|
+
String(l.category ?? ''),
|
|
256
|
+
String(l.severity ?? ''),
|
|
257
|
+
String(l.title ?? ''),
|
|
258
|
+
String(l.created_at ?? ''),
|
|
259
|
+
]);
|
|
260
|
+
}
|
|
261
|
+
return table.toString();
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Render test report list as a table.
|
|
265
|
+
* SAD-0031 Part B: Task column removed. Columns: ID, Sprint, Result, Total, Pass, Fail, Blocked, Skip, Created
|
|
266
|
+
*/
|
|
267
|
+
function formatTestReportListAsTable(reports) {
|
|
268
|
+
if (reports.length === 0) {
|
|
269
|
+
return chalk_1.default.dim('No test reports found.');
|
|
270
|
+
}
|
|
271
|
+
const table = new cli_table3_1.default({
|
|
272
|
+
head: [
|
|
273
|
+
chalk_1.default.bold('ID'),
|
|
274
|
+
chalk_1.default.bold('Sprint'),
|
|
275
|
+
chalk_1.default.bold('Result'),
|
|
276
|
+
chalk_1.default.bold('Total'),
|
|
277
|
+
chalk_1.default.bold('Pass'),
|
|
278
|
+
chalk_1.default.bold('Fail'),
|
|
279
|
+
chalk_1.default.bold('Blocked'),
|
|
280
|
+
chalk_1.default.bold('Skip'),
|
|
281
|
+
chalk_1.default.bold('Created'),
|
|
282
|
+
],
|
|
283
|
+
colWidths: [8, 18, 10, 8, 8, 8, 8, 8, 24],
|
|
284
|
+
wordWrap: true,
|
|
285
|
+
});
|
|
286
|
+
for (const r of reports) {
|
|
287
|
+
table.push([
|
|
288
|
+
String(r.id ?? ''),
|
|
289
|
+
String(r.sprint_id ?? ''),
|
|
290
|
+
String(r.result ?? ''),
|
|
291
|
+
String(r.total ?? ''),
|
|
292
|
+
String(r.passed ?? ''),
|
|
293
|
+
String(r.failed ?? ''),
|
|
294
|
+
String(r.blocked ?? ''),
|
|
295
|
+
String(r.skipped ?? ''),
|
|
296
|
+
String(r.created_at ?? ''),
|
|
297
|
+
]);
|
|
298
|
+
}
|
|
299
|
+
return table.toString();
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Render entity list as a table.
|
|
303
|
+
* Columns: ID, Type, Properties, Created, Updated
|
|
304
|
+
*/
|
|
305
|
+
function formatEntityListAsTable(entities) {
|
|
306
|
+
if (entities.length === 0) {
|
|
307
|
+
return chalk_1.default.dim('No entities found.');
|
|
308
|
+
}
|
|
309
|
+
const table = new cli_table3_1.default({
|
|
310
|
+
head: [
|
|
311
|
+
chalk_1.default.bold('ID'),
|
|
312
|
+
chalk_1.default.bold('Type'),
|
|
313
|
+
chalk_1.default.bold('Properties'),
|
|
314
|
+
chalk_1.default.bold('Created'),
|
|
315
|
+
chalk_1.default.bold('Updated'),
|
|
316
|
+
],
|
|
317
|
+
colWidths: [20, 16, 24, 24, 24],
|
|
318
|
+
wordWrap: true,
|
|
319
|
+
});
|
|
320
|
+
for (const e of entities) {
|
|
321
|
+
// properties: render as "{n} props" or "{}"
|
|
322
|
+
let propsDisplay;
|
|
323
|
+
const rawProps = e.properties;
|
|
324
|
+
if (rawProps === null || rawProps === undefined) {
|
|
325
|
+
propsDisplay = '{}';
|
|
326
|
+
}
|
|
327
|
+
else if (typeof rawProps === 'string') {
|
|
328
|
+
// properties may be stored as JSON string
|
|
329
|
+
try {
|
|
330
|
+
const parsed = JSON.parse(rawProps);
|
|
331
|
+
if (parsed && typeof parsed === 'object' && Object.keys(parsed).length > 0) {
|
|
332
|
+
propsDisplay = `${Object.keys(parsed).length} props`;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
propsDisplay = '{}';
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
propsDisplay = '{}';
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else if (typeof rawProps === 'object' && Object.keys(rawProps).length > 0) {
|
|
343
|
+
propsDisplay = `${Object.keys(rawProps).length} props`;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
propsDisplay = '{}';
|
|
347
|
+
}
|
|
348
|
+
table.push([
|
|
349
|
+
String(e.id ?? ''),
|
|
350
|
+
String(e.type_name ?? ''),
|
|
351
|
+
propsDisplay,
|
|
352
|
+
String(e.created_at ?? ''),
|
|
353
|
+
String(e.updated_at ?? ''),
|
|
354
|
+
]);
|
|
355
|
+
}
|
|
356
|
+
return table.toString();
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Render relation list as a table.
|
|
360
|
+
* Columns: ID, From, Type, To, Created
|
|
361
|
+
*/
|
|
362
|
+
function formatRelationListAsTable(relations) {
|
|
363
|
+
if (relations.length === 0) {
|
|
364
|
+
return chalk_1.default.dim('No relations found.');
|
|
365
|
+
}
|
|
366
|
+
const table = new cli_table3_1.default({
|
|
367
|
+
head: [
|
|
368
|
+
chalk_1.default.bold('ID'),
|
|
369
|
+
chalk_1.default.bold('From'),
|
|
370
|
+
chalk_1.default.bold('Type'),
|
|
371
|
+
chalk_1.default.bold('To'),
|
|
372
|
+
chalk_1.default.bold('Created'),
|
|
373
|
+
],
|
|
374
|
+
colWidths: [8, 20, 18, 20, 24],
|
|
375
|
+
wordWrap: true,
|
|
376
|
+
});
|
|
377
|
+
for (const r of relations) {
|
|
378
|
+
table.push([
|
|
379
|
+
String(r.id ?? ''),
|
|
380
|
+
String(r.from_id ?? ''),
|
|
381
|
+
String(r.rel_type ?? ''),
|
|
382
|
+
String(r.to_id ?? ''),
|
|
383
|
+
String(r.created_at ?? ''),
|
|
384
|
+
]);
|
|
385
|
+
}
|
|
386
|
+
return table.toString();
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Render related documents as a table.
|
|
390
|
+
* SAD-0035: Updated to use docId/docType (documents table) instead of entity.id/entity.type_name.
|
|
391
|
+
* Columns: Doc ID, Type, Relation, Direction
|
|
392
|
+
*/
|
|
393
|
+
function formatRelationRelatedAsTable(related, parentEntityId) {
|
|
394
|
+
if (related.length === 0) {
|
|
395
|
+
return chalk_1.default.dim('No relations found.');
|
|
396
|
+
}
|
|
397
|
+
const table = new cli_table3_1.default({
|
|
398
|
+
head: [
|
|
399
|
+
chalk_1.default.bold('Doc ID'),
|
|
400
|
+
chalk_1.default.bold('Type'),
|
|
401
|
+
chalk_1.default.bold('Relation'),
|
|
402
|
+
chalk_1.default.bold('Direction'),
|
|
403
|
+
],
|
|
404
|
+
colWidths: [20, 16, 18, 12],
|
|
405
|
+
wordWrap: true,
|
|
406
|
+
});
|
|
407
|
+
for (const item of related) {
|
|
408
|
+
const rel = item.relation;
|
|
409
|
+
// Compute direction from parentEntityId
|
|
410
|
+
let direction;
|
|
411
|
+
if (parentEntityId === undefined || parentEntityId === null) {
|
|
412
|
+
direction = '?';
|
|
413
|
+
}
|
|
414
|
+
else if (rel && String(rel.from_id) === parentEntityId) {
|
|
415
|
+
direction = 'outgoing';
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
direction = 'incoming';
|
|
419
|
+
}
|
|
420
|
+
table.push([
|
|
421
|
+
String(item.docId ?? ''),
|
|
422
|
+
String(item.docType ?? ''),
|
|
423
|
+
String(rel?.rel_type ?? ''),
|
|
424
|
+
direction,
|
|
425
|
+
]);
|
|
426
|
+
}
|
|
427
|
+
return table.toString();
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Render relation type list as a table.
|
|
431
|
+
* Columns: Name, From Types, To Types, Cardinality, Inverse Of, Description
|
|
432
|
+
*/
|
|
433
|
+
function formatRelationTypeListAsTable(relations) {
|
|
434
|
+
if (relations.length === 0) {
|
|
435
|
+
return chalk_1.default.dim('No relation types found.');
|
|
436
|
+
}
|
|
437
|
+
const table = new cli_table3_1.default({
|
|
438
|
+
head: [
|
|
439
|
+
chalk_1.default.bold('Name'),
|
|
440
|
+
chalk_1.default.bold('From Types'),
|
|
441
|
+
chalk_1.default.bold('To Types'),
|
|
442
|
+
chalk_1.default.bold('Cardinality'),
|
|
443
|
+
chalk_1.default.bold('Inverse Of'),
|
|
444
|
+
chalk_1.default.bold('Description'),
|
|
445
|
+
],
|
|
446
|
+
colWidths: [18, 22, 22, 16, 16, 24],
|
|
447
|
+
wordWrap: true,
|
|
448
|
+
});
|
|
449
|
+
for (const r of relations) {
|
|
450
|
+
let fromTypes = r.from_types;
|
|
451
|
+
let toTypes = r.to_types;
|
|
452
|
+
if (typeof fromTypes === 'string') {
|
|
453
|
+
try {
|
|
454
|
+
fromTypes = JSON.parse(fromTypes);
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
fromTypes = [];
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (typeof toTypes === 'string') {
|
|
461
|
+
try {
|
|
462
|
+
toTypes = JSON.parse(toTypes);
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
toTypes = [];
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
table.push([
|
|
469
|
+
String(r.name ?? ''),
|
|
470
|
+
Array.isArray(fromTypes) ? fromTypes.join(', ') : String(fromTypes ?? ''),
|
|
471
|
+
Array.isArray(toTypes) ? toTypes.join(', ') : String(toTypes ?? ''),
|
|
472
|
+
String(r.cardinality ?? ''),
|
|
473
|
+
String(r.inverse_of ?? ''),
|
|
474
|
+
String(r.description ?? ''),
|
|
475
|
+
]);
|
|
476
|
+
}
|
|
477
|
+
return table.toString();
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Render a sprint list as a table.
|
|
481
|
+
*/
|
|
482
|
+
function formatSprintListAsTable(sprints) {
|
|
483
|
+
if (sprints.length === 0) {
|
|
484
|
+
return chalk_1.default.dim('No sprints found.');
|
|
485
|
+
}
|
|
486
|
+
const table = new cli_table3_1.default({
|
|
487
|
+
head: [
|
|
488
|
+
chalk_1.default.bold('ID'),
|
|
489
|
+
chalk_1.default.bold('Name'),
|
|
490
|
+
chalk_1.default.bold('Status'),
|
|
491
|
+
chalk_1.default.bold('Created'),
|
|
492
|
+
],
|
|
493
|
+
colWidths: [20, 20, 16, 24],
|
|
494
|
+
});
|
|
495
|
+
for (const sprint of sprints) {
|
|
496
|
+
table.push([
|
|
497
|
+
String(sprint.id ?? ''),
|
|
498
|
+
String(sprint.name ?? ''),
|
|
499
|
+
String(sprint.status ?? ''),
|
|
500
|
+
String(sprint.created_at ?? ''),
|
|
501
|
+
]);
|
|
502
|
+
}
|
|
503
|
+
return table.toString();
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Render a single project object as a 2-column key-value table.
|
|
507
|
+
*/
|
|
508
|
+
function formatSingleProjectAsTable(data) {
|
|
509
|
+
const table = new cli_table3_1.default({
|
|
510
|
+
head: [chalk_1.default.bold('Property'), chalk_1.default.bold('Value')],
|
|
511
|
+
colWidths: [20, 60],
|
|
512
|
+
wordWrap: true,
|
|
513
|
+
});
|
|
514
|
+
const rows = [];
|
|
515
|
+
if ('name' in data)
|
|
516
|
+
rows.push(['Name', String(data.name ?? '')]);
|
|
517
|
+
if ('folder' in data)
|
|
518
|
+
rows.push(['Folder', String(data.folder ?? '')]);
|
|
519
|
+
if ('dbPath' in data)
|
|
520
|
+
rows.push(['Database', String(data.dbPath ?? '')]);
|
|
521
|
+
if ('isNew' in data)
|
|
522
|
+
rows.push(['New', data.isNew ? 'Yes' : 'No']);
|
|
523
|
+
if ('isDefault' in data)
|
|
524
|
+
rows.push(['Default', data.isDefault ? 'Yes' : 'No']);
|
|
525
|
+
if ('sprintCount' in data) {
|
|
526
|
+
const sprintCount = data.sprintCount ?? 0;
|
|
527
|
+
const activeCount = data.activeSprintCount ?? 0;
|
|
528
|
+
rows.push(['Sprints', `${sprintCount} (${activeCount} active)`]);
|
|
529
|
+
}
|
|
530
|
+
if ('taskCount' in data)
|
|
531
|
+
rows.push(['Tasks', String(data.taskCount ?? 0)]);
|
|
532
|
+
if ('docCount' in data)
|
|
533
|
+
rows.push(['Documents', String(data.docCount ?? 0)]);
|
|
534
|
+
if ('preserved' in data)
|
|
535
|
+
rows.push(['Database Preserved', 'Yes']);
|
|
536
|
+
if ('defaultProject' in data) {
|
|
537
|
+
rows.push(['Default Project', String(data.defaultProject ?? chalk_1.default.dim('(none)'))]);
|
|
538
|
+
}
|
|
539
|
+
for (const [key, value] of rows) {
|
|
540
|
+
table.push([key, value]);
|
|
541
|
+
}
|
|
542
|
+
return table.toString();
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Render a project list array as a 3-column table.
|
|
546
|
+
* Columns: Name, Folder, Default (✓ for default).
|
|
547
|
+
*/
|
|
548
|
+
function formatProjectListAsTable(projects) {
|
|
549
|
+
if (projects.length === 0) {
|
|
550
|
+
return chalk_1.default.dim('No projects registered.');
|
|
551
|
+
}
|
|
552
|
+
const table = new cli_table3_1.default({
|
|
553
|
+
head: [chalk_1.default.bold('Name'), chalk_1.default.bold('Folder'), chalk_1.default.bold('Default')],
|
|
554
|
+
colWidths: [20, 50, 10],
|
|
555
|
+
wordWrap: true,
|
|
556
|
+
});
|
|
557
|
+
for (const p of projects) {
|
|
558
|
+
table.push([
|
|
559
|
+
String(p.name ?? ''),
|
|
560
|
+
String(p.folder ?? ''),
|
|
561
|
+
p.isDefault ? '✓' : '',
|
|
562
|
+
]);
|
|
563
|
+
}
|
|
564
|
+
return table.toString();
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Render validation results as a table.
|
|
568
|
+
*/
|
|
569
|
+
function formatValidationAsTable(data) {
|
|
570
|
+
const lines = [];
|
|
571
|
+
const isValid = data.isValid === true;
|
|
572
|
+
lines.push(chalk_1.default.bold(`Sprint: ${data.sprint_id}`));
|
|
573
|
+
lines.push(` Valid: ${isValid ? chalk_1.default.green('✓ Yes') : chalk_1.default.red('✗ No')}`);
|
|
574
|
+
lines.push('');
|
|
575
|
+
const issues = data.issues;
|
|
576
|
+
if (!issues || issues.length === 0) {
|
|
577
|
+
lines.push(chalk_1.default.green(' No issues found.'));
|
|
578
|
+
return lines.join('\n');
|
|
579
|
+
}
|
|
580
|
+
const table = new cli_table3_1.default({
|
|
581
|
+
head: [
|
|
582
|
+
chalk_1.default.bold('Severity'),
|
|
583
|
+
chalk_1.default.bold('Category'),
|
|
584
|
+
chalk_1.default.bold('Entity'),
|
|
585
|
+
chalk_1.default.bold('Message'),
|
|
586
|
+
],
|
|
587
|
+
colWidths: [10, 14, 14, 50],
|
|
588
|
+
wordWrap: true,
|
|
589
|
+
});
|
|
590
|
+
for (const issue of issues) {
|
|
591
|
+
const severity = issue.severity === 'error' ? chalk_1.default.red(String(issue.severity)) :
|
|
592
|
+
issue.severity === 'warning' ? chalk_1.default.yellow(String(issue.severity)) :
|
|
593
|
+
chalk_1.default.blue(String(issue.severity));
|
|
594
|
+
table.push([
|
|
595
|
+
severity,
|
|
596
|
+
String(issue.category ?? ''),
|
|
597
|
+
String(issue.entity ?? ''),
|
|
598
|
+
String(issue.message ?? ''),
|
|
599
|
+
]);
|
|
600
|
+
}
|
|
601
|
+
lines.push(table.toString());
|
|
602
|
+
return lines.join('\n');
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Format structured data as a table, dispatching on entity type.
|
|
606
|
+
*/
|
|
607
|
+
function formatAsTable(data, entityType, options) {
|
|
608
|
+
if (data === null || data === undefined) {
|
|
609
|
+
return chalk_1.default.dim('No data.');
|
|
610
|
+
}
|
|
611
|
+
if (typeof data === 'string') {
|
|
612
|
+
return data;
|
|
613
|
+
}
|
|
614
|
+
if (Array.isArray(data)) {
|
|
615
|
+
if (data.length === 0) {
|
|
616
|
+
// Determine entity type from content
|
|
617
|
+
if (entityType === 'document-search')
|
|
618
|
+
return chalk_1.default.dim('No results found.');
|
|
619
|
+
if (entityType === 'tasks')
|
|
620
|
+
return chalk_1.default.dim('No tasks found.');
|
|
621
|
+
if (entityType === 'sprints')
|
|
622
|
+
return chalk_1.default.dim('No sprints found.');
|
|
623
|
+
if (entityType === 'review')
|
|
624
|
+
return chalk_1.default.dim('No reviews found.');
|
|
625
|
+
if (entityType === 'lesson')
|
|
626
|
+
return chalk_1.default.dim('No lessons found.');
|
|
627
|
+
if (entityType === 'test-report')
|
|
628
|
+
return chalk_1.default.dim('No test reports found.');
|
|
629
|
+
if (entityType === 'entity')
|
|
630
|
+
return chalk_1.default.dim('No entities found.');
|
|
631
|
+
if (entityType === 'relation')
|
|
632
|
+
return chalk_1.default.dim('No relations found.');
|
|
633
|
+
if (entityType === 'relation-related')
|
|
634
|
+
return chalk_1.default.dim('No relations found.');
|
|
635
|
+
if (entityType === 'entity-types')
|
|
636
|
+
return chalk_1.default.dim('No entity types found.');
|
|
637
|
+
if (entityType === 'relation-types')
|
|
638
|
+
return chalk_1.default.dim('No relation types found.');
|
|
639
|
+
if (entityType === 'project')
|
|
640
|
+
return chalk_1.default.dim('No projects registered.');
|
|
641
|
+
return chalk_1.default.dim('No results.');
|
|
642
|
+
}
|
|
643
|
+
// Check first item to determine type
|
|
644
|
+
const first = data[0];
|
|
645
|
+
// Priority 0: explicit entity type for project list
|
|
646
|
+
if (entityType === 'project') {
|
|
647
|
+
return formatProjectListAsTable(data);
|
|
648
|
+
}
|
|
649
|
+
// Priority 1: explicit entity type for search results
|
|
650
|
+
if (entityType === 'document-search') {
|
|
651
|
+
return formatSearchResultAsTable(data);
|
|
652
|
+
}
|
|
653
|
+
// Priority 2: explicit entity type for document list
|
|
654
|
+
if (entityType === 'document') {
|
|
655
|
+
return formatDocumentListAsTable(data);
|
|
656
|
+
}
|
|
657
|
+
// Priority 3: explicit entity type for entity-type list
|
|
658
|
+
if (entityType === 'entity-types') {
|
|
659
|
+
return formatEntityTypeListAsTable(data);
|
|
660
|
+
}
|
|
661
|
+
// Priority 4: explicit entity type for relation-type list
|
|
662
|
+
if (entityType === 'relation-types') {
|
|
663
|
+
return formatRelationTypeListAsTable(data);
|
|
664
|
+
}
|
|
665
|
+
// Priority 5: explicit entity type for review list
|
|
666
|
+
if (entityType === 'review') {
|
|
667
|
+
return formatReviewListAsTable(data);
|
|
668
|
+
}
|
|
669
|
+
// Priority 6: explicit entity type for lesson list
|
|
670
|
+
if (entityType === 'lesson') {
|
|
671
|
+
return formatLessonListAsTable(data);
|
|
672
|
+
}
|
|
673
|
+
// Priority 7: explicit entity type for test-report list
|
|
674
|
+
if (entityType === 'test-report') {
|
|
675
|
+
return formatTestReportListAsTable(data);
|
|
676
|
+
}
|
|
677
|
+
// Priority 8: explicit entity type for entity list
|
|
678
|
+
if (entityType === 'entity') {
|
|
679
|
+
return formatEntityListAsTable(data);
|
|
680
|
+
}
|
|
681
|
+
// Priority 9: explicit entity type for relation list
|
|
682
|
+
if (entityType === 'relation') {
|
|
683
|
+
return formatRelationListAsTable(data);
|
|
684
|
+
}
|
|
685
|
+
// Priority 10: explicit entity type for relation-related list
|
|
686
|
+
if (entityType === 'relation-related') {
|
|
687
|
+
return formatRelationRelatedAsTable(data, options?.parentEntityId);
|
|
688
|
+
}
|
|
689
|
+
if ('owner' in first || 'task_type' in first) {
|
|
690
|
+
return formatTaskListAsTable(data);
|
|
691
|
+
}
|
|
692
|
+
if ('status' in first && ('goal' in first || first.status === 'PLANNING' || first.status === 'IN EXECUTION')) {
|
|
693
|
+
return formatSprintListAsTable(data);
|
|
694
|
+
}
|
|
695
|
+
// Priority 4 (fallback): array introspection for search results
|
|
696
|
+
if ('documentId' in first && 'rank' in first) {
|
|
697
|
+
return formatSearchResultAsTable(data);
|
|
698
|
+
}
|
|
699
|
+
// Generic table for other arrays
|
|
700
|
+
return formatTaskListAsTable(data);
|
|
701
|
+
}
|
|
702
|
+
// Single object
|
|
703
|
+
if (typeof data === 'object') {
|
|
704
|
+
const obj = data;
|
|
705
|
+
// Explicit entity type for project single-object
|
|
706
|
+
if (entityType === 'project') {
|
|
707
|
+
return formatSingleProjectAsTable(obj);
|
|
708
|
+
}
|
|
709
|
+
if ('isValid' in obj && 'issues' in obj) {
|
|
710
|
+
return formatValidationAsTable(obj);
|
|
711
|
+
}
|
|
712
|
+
if ('taskCounts' in obj) {
|
|
713
|
+
return formatSprintOverviewAsTable(obj);
|
|
714
|
+
}
|
|
715
|
+
if ('owner' in obj && 'task_type' in obj && 'description' in obj) {
|
|
716
|
+
return formatTaskAsTable(obj);
|
|
717
|
+
}
|
|
718
|
+
// Check for sprint data
|
|
719
|
+
if ('status' in obj && ('goal' in obj || !('owner' in obj))) {
|
|
720
|
+
return formatSprintAsTable(obj);
|
|
721
|
+
}
|
|
722
|
+
return formatSprintAsTable(obj);
|
|
723
|
+
}
|
|
724
|
+
return String(data);
|
|
725
|
+
}
|
|
726
|
+
//# sourceMappingURL=table.js.map
|