@lwelliott/cortex-cli 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/cli/audit.d.ts +3 -0
  4. package/dist/cli/audit.d.ts.map +1 -0
  5. package/dist/cli/audit.js +78 -0
  6. package/dist/cli/audit.js.map +1 -0
  7. package/dist/cli/doc.d.ts +3 -0
  8. package/dist/cli/doc.d.ts.map +1 -0
  9. package/dist/cli/doc.js +291 -0
  10. package/dist/cli/doc.js.map +1 -0
  11. package/dist/cli/entity.d.ts +3 -0
  12. package/dist/cli/entity.d.ts.map +1 -0
  13. package/dist/cli/entity.js +135 -0
  14. package/dist/cli/entity.js.map +1 -0
  15. package/dist/cli/format-selector.d.ts +30 -0
  16. package/dist/cli/format-selector.d.ts.map +1 -0
  17. package/dist/cli/format-selector.js +101 -0
  18. package/dist/cli/format-selector.js.map +1 -0
  19. package/dist/cli/formatters/audit-formatter.d.ts +33 -0
  20. package/dist/cli/formatters/audit-formatter.d.ts.map +1 -0
  21. package/dist/cli/formatters/audit-formatter.js +204 -0
  22. package/dist/cli/formatters/audit-formatter.js.map +1 -0
  23. package/dist/cli/formatters/json.d.ts +10 -0
  24. package/dist/cli/formatters/json.d.ts.map +1 -0
  25. package/dist/cli/formatters/json.js +31 -0
  26. package/dist/cli/formatters/json.js.map +1 -0
  27. package/dist/cli/formatters/markdown.d.ts +12 -0
  28. package/dist/cli/formatters/markdown.d.ts.map +1 -0
  29. package/dist/cli/formatters/markdown.js +341 -0
  30. package/dist/cli/formatters/markdown.js.map +1 -0
  31. package/dist/cli/formatters/quiet.d.ts +15 -0
  32. package/dist/cli/formatters/quiet.d.ts.map +1 -0
  33. package/dist/cli/formatters/quiet.js +75 -0
  34. package/dist/cli/formatters/quiet.js.map +1 -0
  35. package/dist/cli/formatters/table.d.ts +11 -0
  36. package/dist/cli/formatters/table.d.ts.map +1 -0
  37. package/dist/cli/formatters/table.js +726 -0
  38. package/dist/cli/formatters/table.js.map +1 -0
  39. package/dist/cli/graph.d.ts +3 -0
  40. package/dist/cli/graph.d.ts.map +1 -0
  41. package/dist/cli/graph.js +209 -0
  42. package/dist/cli/graph.js.map +1 -0
  43. package/dist/cli/index.d.ts +3 -0
  44. package/dist/cli/index.d.ts.map +1 -0
  45. package/dist/cli/index.js +144 -0
  46. package/dist/cli/index.js.map +1 -0
  47. package/dist/cli/lesson.d.ts +3 -0
  48. package/dist/cli/lesson.d.ts.map +1 -0
  49. package/dist/cli/lesson.js +85 -0
  50. package/dist/cli/lesson.js.map +1 -0
  51. package/dist/cli/project-resolver.d.ts +17 -0
  52. package/dist/cli/project-resolver.d.ts.map +1 -0
  53. package/dist/cli/project-resolver.js +25 -0
  54. package/dist/cli/project-resolver.js.map +1 -0
  55. package/dist/cli/project.d.ts +12 -0
  56. package/dist/cli/project.d.ts.map +1 -0
  57. package/dist/cli/project.js +169 -0
  58. package/dist/cli/project.js.map +1 -0
  59. package/dist/cli/relation.d.ts +3 -0
  60. package/dist/cli/relation.d.ts.map +1 -0
  61. package/dist/cli/relation.js +128 -0
  62. package/dist/cli/relation.js.map +1 -0
  63. package/dist/cli/review.d.ts +3 -0
  64. package/dist/cli/review.d.ts.map +1 -0
  65. package/dist/cli/review.js +131 -0
  66. package/dist/cli/review.js.map +1 -0
  67. package/dist/cli/router.d.ts +38 -0
  68. package/dist/cli/router.d.ts.map +1 -0
  69. package/dist/cli/router.js +49 -0
  70. package/dist/cli/router.js.map +1 -0
  71. package/dist/cli/schema.d.ts +3 -0
  72. package/dist/cli/schema.d.ts.map +1 -0
  73. package/dist/cli/schema.js +94 -0
  74. package/dist/cli/schema.js.map +1 -0
  75. package/dist/cli/sprint.d.ts +12 -0
  76. package/dist/cli/sprint.d.ts.map +1 -0
  77. package/dist/cli/sprint.js +200 -0
  78. package/dist/cli/sprint.js.map +1 -0
  79. package/dist/cli/task.d.ts +12 -0
  80. package/dist/cli/task.d.ts.map +1 -0
  81. package/dist/cli/task.js +252 -0
  82. package/dist/cli/task.js.map +1 -0
  83. package/dist/cli/test-report.d.ts +3 -0
  84. package/dist/cli/test-report.d.ts.map +1 -0
  85. package/dist/cli/test-report.js +134 -0
  86. package/dist/cli/test-report.js.map +1 -0
  87. package/dist/cli/validate.d.ts +8 -0
  88. package/dist/cli/validate.d.ts.map +1 -0
  89. package/dist/cli/validate.js +86 -0
  90. package/dist/cli/validate.js.map +1 -0
  91. package/dist/config/config.d.ts +18 -0
  92. package/dist/config/config.d.ts.map +1 -0
  93. package/dist/config/config.js +70 -0
  94. package/dist/config/config.js.map +1 -0
  95. package/dist/config/registry.d.ts +52 -0
  96. package/dist/config/registry.d.ts.map +1 -0
  97. package/dist/config/registry.js +193 -0
  98. package/dist/config/registry.js.map +1 -0
  99. package/dist/config/resolver.d.ts +26 -0
  100. package/dist/config/resolver.d.ts.map +1 -0
  101. package/dist/config/resolver.js +87 -0
  102. package/dist/config/resolver.js.map +1 -0
  103. package/dist/db/builtin-schema-constants.d.ts +109 -0
  104. package/dist/db/builtin-schema-constants.d.ts.map +1 -0
  105. package/dist/db/builtin-schema-constants.js +32 -0
  106. package/dist/db/builtin-schema-constants.js.map +1 -0
  107. package/dist/db/connection.d.ts +34 -0
  108. package/dist/db/connection.d.ts.map +1 -0
  109. package/dist/db/connection.js +140 -0
  110. package/dist/db/connection.js.map +1 -0
  111. package/dist/db/generated/schema-types.d.ts +134 -0
  112. package/dist/db/generated/schema-types.d.ts.map +1 -0
  113. package/dist/db/generated/schema-types.js +31 -0
  114. package/dist/db/generated/schema-types.js.map +1 -0
  115. package/dist/db/locks.d.ts +106 -0
  116. package/dist/db/locks.d.ts.map +1 -0
  117. package/dist/db/locks.js +211 -0
  118. package/dist/db/locks.js.map +1 -0
  119. package/dist/db/migration.d.ts +65 -0
  120. package/dist/db/migration.d.ts.map +1 -0
  121. package/dist/db/migration.js +233 -0
  122. package/dist/db/migration.js.map +1 -0
  123. package/dist/db/retry.d.ts +26 -0
  124. package/dist/db/retry.d.ts.map +1 -0
  125. package/dist/db/retry.js +71 -0
  126. package/dist/db/retry.js.map +1 -0
  127. package/dist/db/schema.d.ts +21 -0
  128. package/dist/db/schema.d.ts.map +1 -0
  129. package/dist/db/schema.js +830 -0
  130. package/dist/db/schema.js.map +1 -0
  131. package/dist/models/common.d.ts +27 -0
  132. package/dist/models/common.d.ts.map +1 -0
  133. package/dist/models/common.js +4 -0
  134. package/dist/models/common.js.map +1 -0
  135. package/dist/models/document.d.ts +89 -0
  136. package/dist/models/document.d.ts.map +1 -0
  137. package/dist/models/document.js +5 -0
  138. package/dist/models/document.js.map +1 -0
  139. package/dist/models/entity-model.d.ts +30 -0
  140. package/dist/models/entity-model.d.ts.map +1 -0
  141. package/dist/models/entity-model.js +99 -0
  142. package/dist/models/entity-model.js.map +1 -0
  143. package/dist/models/entity.d.ts +88 -0
  144. package/dist/models/entity.d.ts.map +1 -0
  145. package/dist/models/entity.js +5 -0
  146. package/dist/models/entity.js.map +1 -0
  147. package/dist/models/graph-schema.d.ts +43 -0
  148. package/dist/models/graph-schema.d.ts.map +1 -0
  149. package/dist/models/graph-schema.js +76 -0
  150. package/dist/models/graph-schema.js.map +1 -0
  151. package/dist/models/project.d.ts +49 -0
  152. package/dist/models/project.d.ts.map +1 -0
  153. package/dist/models/project.js +18 -0
  154. package/dist/models/project.js.map +1 -0
  155. package/dist/models/relation.d.ts +35 -0
  156. package/dist/models/relation.d.ts.map +1 -0
  157. package/dist/models/relation.js +212 -0
  158. package/dist/models/relation.js.map +1 -0
  159. package/dist/models/review.d.ts +86 -0
  160. package/dist/models/review.d.ts.map +1 -0
  161. package/dist/models/review.js +5 -0
  162. package/dist/models/review.js.map +1 -0
  163. package/dist/models/sprint.d.ts +38 -0
  164. package/dist/models/sprint.d.ts.map +1 -0
  165. package/dist/models/sprint.js +4 -0
  166. package/dist/models/sprint.js.map +1 -0
  167. package/dist/models/task.d.ts +75 -0
  168. package/dist/models/task.d.ts.map +1 -0
  169. package/dist/models/task.js +4 -0
  170. package/dist/models/task.js.map +1 -0
  171. package/dist/models/validation.d.ts +25 -0
  172. package/dist/models/validation.d.ts.map +1 -0
  173. package/dist/models/validation.js +4 -0
  174. package/dist/models/validation.js.map +1 -0
  175. package/dist/services/audit-check-service.d.ts +16 -0
  176. package/dist/services/audit-check-service.d.ts.map +1 -0
  177. package/dist/services/audit-check-service.js +137 -0
  178. package/dist/services/audit-check-service.js.map +1 -0
  179. package/dist/services/audit-checks/dangling-relations-check.d.ts +7 -0
  180. package/dist/services/audit-checks/dangling-relations-check.d.ts.map +1 -0
  181. package/dist/services/audit-checks/dangling-relations-check.js +52 -0
  182. package/dist/services/audit-checks/dangling-relations-check.js.map +1 -0
  183. package/dist/services/audit-checks/duplicate-ids-check.d.ts +4 -0
  184. package/dist/services/audit-checks/duplicate-ids-check.d.ts.map +1 -0
  185. package/dist/services/audit-checks/duplicate-ids-check.js +49 -0
  186. package/dist/services/audit-checks/duplicate-ids-check.js.map +1 -0
  187. package/dist/services/audit-checks/fix-engine.d.ts +24 -0
  188. package/dist/services/audit-checks/fix-engine.d.ts.map +1 -0
  189. package/dist/services/audit-checks/fix-engine.js +114 -0
  190. package/dist/services/audit-checks/fix-engine.js.map +1 -0
  191. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts +9 -0
  192. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.d.ts.map +1 -0
  193. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js +56 -0
  194. package/dist/services/audit-checks/fr-nfr-to-fs-nfs-check.js.map +1 -0
  195. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts +10 -0
  196. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.d.ts.map +1 -0
  197. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js +57 -0
  198. package/dist/services/audit-checks/fs-nfs-to-sad-ad-qa-check.js.map +1 -0
  199. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts +9 -0
  200. package/dist/services/audit-checks/fs-nfs-to-ts-check.d.ts.map +1 -0
  201. package/dist/services/audit-checks/fs-nfs-to-ts-check.js +56 -0
  202. package/dist/services/audit-checks/fs-nfs-to-ts-check.js.map +1 -0
  203. package/dist/services/audit-checks/inverse-consistency-check.d.ts +7 -0
  204. package/dist/services/audit-checks/inverse-consistency-check.d.ts.map +1 -0
  205. package/dist/services/audit-checks/inverse-consistency-check.js +54 -0
  206. package/dist/services/audit-checks/inverse-consistency-check.js.map +1 -0
  207. package/dist/services/audit-checks/mapping-check.d.ts +4 -0
  208. package/dist/services/audit-checks/mapping-check.d.ts.map +1 -0
  209. package/dist/services/audit-checks/mapping-check.js +74 -0
  210. package/dist/services/audit-checks/mapping-check.js.map +1 -0
  211. package/dist/services/audit-checks/orphan-documents-check.d.ts +9 -0
  212. package/dist/services/audit-checks/orphan-documents-check.d.ts.map +1 -0
  213. package/dist/services/audit-checks/orphan-documents-check.js +54 -0
  214. package/dist/services/audit-checks/orphan-documents-check.js.map +1 -0
  215. package/dist/services/audit-checks/orphan-entities-check.d.ts +4 -0
  216. package/dist/services/audit-checks/orphan-entities-check.d.ts.map +1 -0
  217. package/dist/services/audit-checks/orphan-entities-check.js +39 -0
  218. package/dist/services/audit-checks/orphan-entities-check.js.map +1 -0
  219. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts +9 -0
  220. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.d.ts.map +1 -0
  221. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js +56 -0
  222. package/dist/services/audit-checks/sad-ad-qa-tc-to-src-check.js.map +1 -0
  223. package/dist/services/audit-checks/sprint-consistency-check.d.ts +4 -0
  224. package/dist/services/audit-checks/sprint-consistency-check.d.ts.map +1 -0
  225. package/dist/services/audit-checks/sprint-consistency-check.js +80 -0
  226. package/dist/services/audit-checks/sprint-consistency-check.js.map +1 -0
  227. package/dist/services/audit-checks/src-filesystem-only-check.d.ts +10 -0
  228. package/dist/services/audit-checks/src-filesystem-only-check.d.ts.map +1 -0
  229. package/dist/services/audit-checks/src-filesystem-only-check.js +106 -0
  230. package/dist/services/audit-checks/src-filesystem-only-check.js.map +1 -0
  231. package/dist/services/audit-checks/ts-to-tc-check.d.ts +10 -0
  232. package/dist/services/audit-checks/ts-to-tc-check.d.ts.map +1 -0
  233. package/dist/services/audit-checks/ts-to-tc-check.js +58 -0
  234. package/dist/services/audit-checks/ts-to-tc-check.js.map +1 -0
  235. package/dist/services/audit-checks/type-mismatch-check.d.ts +4 -0
  236. package/dist/services/audit-checks/type-mismatch-check.d.ts.map +1 -0
  237. package/dist/services/audit-checks/type-mismatch-check.js +55 -0
  238. package/dist/services/audit-checks/type-mismatch-check.js.map +1 -0
  239. package/dist/services/audit-checks/types.d.ts +66 -0
  240. package/dist/services/audit-checks/types.d.ts.map +1 -0
  241. package/dist/services/audit-checks/types.js +30 -0
  242. package/dist/services/audit-checks/types.js.map +1 -0
  243. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts +9 -0
  244. package/dist/services/audit-checks/us-to-fr-nfr-check.d.ts.map +1 -0
  245. package/dist/services/audit-checks/us-to-fr-nfr-check.js +56 -0
  246. package/dist/services/audit-checks/us-to-fr-nfr-check.js.map +1 -0
  247. package/dist/services/doc-entity-mapping.d.ts +19 -0
  248. package/dist/services/doc-entity-mapping.d.ts.map +1 -0
  249. package/dist/services/doc-entity-mapping.js +35 -0
  250. package/dist/services/doc-entity-mapping.js.map +1 -0
  251. package/dist/services/document-service.d.ts +58 -0
  252. package/dist/services/document-service.d.ts.map +1 -0
  253. package/dist/services/document-service.js +409 -0
  254. package/dist/services/document-service.js.map +1 -0
  255. package/dist/services/graph-export-service.d.ts +12 -0
  256. package/dist/services/graph-export-service.d.ts.map +1 -0
  257. package/dist/services/graph-export-service.js +112 -0
  258. package/dist/services/graph-export-service.js.map +1 -0
  259. package/dist/services/graph-service.d.ts +21 -0
  260. package/dist/services/graph-service.d.ts.map +1 -0
  261. package/dist/services/graph-service.js +49 -0
  262. package/dist/services/graph-service.js.map +1 -0
  263. package/dist/services/graph-validation-service.d.ts +13 -0
  264. package/dist/services/graph-validation-service.d.ts.map +1 -0
  265. package/dist/services/graph-validation-service.js +171 -0
  266. package/dist/services/graph-validation-service.js.map +1 -0
  267. package/dist/services/project.d.ts +80 -0
  268. package/dist/services/project.d.ts.map +1 -0
  269. package/dist/services/project.js +256 -0
  270. package/dist/services/project.js.map +1 -0
  271. package/dist/services/review-service.d.ts +81 -0
  272. package/dist/services/review-service.d.ts.map +1 -0
  273. package/dist/services/review-service.js +242 -0
  274. package/dist/services/review-service.js.map +1 -0
  275. package/dist/services/schema-migration-service.d.ts +44 -0
  276. package/dist/services/schema-migration-service.d.ts.map +1 -0
  277. package/dist/services/schema-migration-service.js +894 -0
  278. package/dist/services/schema-migration-service.js.map +1 -0
  279. package/dist/services/sprint.d.ts +71 -0
  280. package/dist/services/sprint.d.ts.map +1 -0
  281. package/dist/services/sprint.js +238 -0
  282. package/dist/services/sprint.js.map +1 -0
  283. package/dist/services/stage-validator.d.ts +36 -0
  284. package/dist/services/stage-validator.d.ts.map +1 -0
  285. package/dist/services/stage-validator.js +78 -0
  286. package/dist/services/stage-validator.js.map +1 -0
  287. package/dist/services/task.d.ts +75 -0
  288. package/dist/services/task.d.ts.map +1 -0
  289. package/dist/services/task.js +487 -0
  290. package/dist/services/task.js.map +1 -0
  291. package/dist/services/validation.d.ts +24 -0
  292. package/dist/services/validation.d.ts.map +1 -0
  293. package/dist/services/validation.js +53 -0
  294. package/dist/services/validation.js.map +1 -0
  295. package/dist/state-machines/sprint-state.d.ts +25 -0
  296. package/dist/state-machines/sprint-state.d.ts.map +1 -0
  297. package/dist/state-machines/sprint-state.js +64 -0
  298. package/dist/state-machines/sprint-state.js.map +1 -0
  299. package/dist/state-machines/task-state.d.ts +31 -0
  300. package/dist/state-machines/task-state.d.ts.map +1 -0
  301. package/dist/state-machines/task-state.js +83 -0
  302. package/dist/state-machines/task-state.js.map +1 -0
  303. package/dist/utils/errors.d.ts +673 -0
  304. package/dist/utils/errors.d.ts.map +1 -0
  305. package/dist/utils/errors.js +1447 -0
  306. package/dist/utils/errors.js.map +1 -0
  307. package/dist/utils/format.d.ts +52 -0
  308. package/dist/utils/format.d.ts.map +1 -0
  309. package/dist/utils/format.js +65 -0
  310. package/dist/utils/format.js.map +1 -0
  311. package/dist/validators/board-integrity.d.ts +25 -0
  312. package/dist/validators/board-integrity.d.ts.map +1 -0
  313. package/dist/validators/board-integrity.js +102 -0
  314. package/dist/validators/board-integrity.js.map +1 -0
  315. package/dist/validators/board-shape.d.ts +13 -0
  316. package/dist/validators/board-shape.d.ts.map +1 -0
  317. package/dist/validators/board-shape.js +74 -0
  318. package/dist/validators/board-shape.js.map +1 -0
  319. package/dist/validators/owner-validator.d.ts +30 -0
  320. package/dist/validators/owner-validator.d.ts.map +1 -0
  321. package/dist/validators/owner-validator.js +70 -0
  322. package/dist/validators/owner-validator.js.map +1 -0
  323. package/dist/validators/spawn-legality.d.ts +19 -0
  324. package/dist/validators/spawn-legality.d.ts.map +1 -0
  325. package/dist/validators/spawn-legality.js +77 -0
  326. package/dist/validators/spawn-legality.js.map +1 -0
  327. package/dist/validators/state-field-checker.d.ts +8 -0
  328. package/dist/validators/state-field-checker.d.ts.map +1 -0
  329. package/dist/validators/state-field-checker.js +47 -0
  330. package/dist/validators/state-field-checker.js.map +1 -0
  331. package/dist/validators/state-field-recorder.d.ts +39 -0
  332. package/dist/validators/state-field-recorder.d.ts.map +1 -0
  333. package/dist/validators/state-field-recorder.js +62 -0
  334. package/dist/validators/state-field-recorder.js.map +1 -0
  335. package/package.json +53 -0
@@ -0,0 +1,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