@kb-labs/shared 1.1.0

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 (232) hide show
  1. package/.cursorrules +32 -0
  2. package/.github/workflows/ci.yml +13 -0
  3. package/.github/workflows/deploy.yml +28 -0
  4. package/.github/workflows/docker-build.yml +25 -0
  5. package/.github/workflows/drift-check.yml +10 -0
  6. package/.github/workflows/profiles-validate.yml +16 -0
  7. package/.github/workflows/release.yml +8 -0
  8. package/.kb/devkit/agents/devkit-maintainer/context.globs +15 -0
  9. package/.kb/devkit/agents/devkit-maintainer/permissions.yml +17 -0
  10. package/.kb/devkit/agents/devkit-maintainer/prompt.md +28 -0
  11. package/.kb/devkit/agents/devkit-maintainer/runbook.md +31 -0
  12. package/.kb/devkit/agents/docs-crafter/prompt.md +24 -0
  13. package/.kb/devkit/agents/docs-crafter/runbook.md +18 -0
  14. package/.kb/devkit/agents/release-manager/context.globs +7 -0
  15. package/.kb/devkit/agents/release-manager/prompt.md +27 -0
  16. package/.kb/devkit/agents/release-manager/runbook.md +17 -0
  17. package/.kb/devkit/agents/test-generator/context.globs +7 -0
  18. package/.kb/devkit/agents/test-generator/prompt.md +27 -0
  19. package/.kb/devkit/agents/test-generator/runbook.md +18 -0
  20. package/.vscode/settings.json +23 -0
  21. package/CHANGELOG.md +33 -0
  22. package/CONTRIBUTING.md +117 -0
  23. package/LICENSE +21 -0
  24. package/README.md +306 -0
  25. package/docs/DECLARATIVE-FLAGS-AND-ENV.md +622 -0
  26. package/docs/DOCUMENTATION.md +70 -0
  27. package/docs/adr/0000-template.md +52 -0
  28. package/docs/adr/0001-architecture-and-repository-layout.md +31 -0
  29. package/docs/adr/0002-plugins-and-extensibility.md +44 -0
  30. package/docs/adr/0003-package-and-module-boundaries.md +35 -0
  31. package/docs/adr/0004-versioning-and-release-policy.md +36 -0
  32. package/docs/adr/0005-reactive-loader-pattern.md +179 -0
  33. package/docs/adr/0006-declarative-flags-and-env-systems.md +376 -0
  34. package/eslint.config.js +27 -0
  35. package/kb-labs.config.json +5 -0
  36. package/package.json +88 -0
  37. package/package.json.bin +25 -0
  38. package/package.json.lib +30 -0
  39. package/packages/shared-cli-ui/CHANGELOG.md +20 -0
  40. package/packages/shared-cli-ui/README.md +342 -0
  41. package/packages/shared-cli-ui/docs/ARCHITECTURE.md +105 -0
  42. package/packages/shared-cli-ui/eslint.config.js +27 -0
  43. package/packages/shared-cli-ui/package.json +72 -0
  44. package/packages/shared-cli-ui/src/__tests__/artifacts-display.spec.ts +89 -0
  45. package/packages/shared-cli-ui/src/__tests__/format.spec.ts +44 -0
  46. package/packages/shared-cli-ui/src/__tests__/loader-json-mode.test.ts +119 -0
  47. package/packages/shared-cli-ui/src/artifacts-display.ts +266 -0
  48. package/packages/shared-cli-ui/src/cli-auto-discovery.ts +120 -0
  49. package/packages/shared-cli-ui/src/colors.ts +142 -0
  50. package/packages/shared-cli-ui/src/command-discovery.ts +72 -0
  51. package/packages/shared-cli-ui/src/command-output.ts +153 -0
  52. package/packages/shared-cli-ui/src/command-result.ts +267 -0
  53. package/packages/shared-cli-ui/src/command-runner.ts +310 -0
  54. package/packages/shared-cli-ui/src/command-suggestions.ts +204 -0
  55. package/packages/shared-cli-ui/src/debug/components/output.ts +141 -0
  56. package/packages/shared-cli-ui/src/debug/components/trace.ts +101 -0
  57. package/packages/shared-cli-ui/src/debug/components/tree.ts +88 -0
  58. package/packages/shared-cli-ui/src/debug/formatters/ai.ts +17 -0
  59. package/packages/shared-cli-ui/src/debug/formatters/human.ts +98 -0
  60. package/packages/shared-cli-ui/src/debug/formatters/timeline.ts +94 -0
  61. package/packages/shared-cli-ui/src/debug/index.ts +56 -0
  62. package/packages/shared-cli-ui/src/debug/types.ts +57 -0
  63. package/packages/shared-cli-ui/src/debug/utilities.ts +203 -0
  64. package/packages/shared-cli-ui/src/dynamic-command-discovery.ts +131 -0
  65. package/packages/shared-cli-ui/src/format.ts +412 -0
  66. package/packages/shared-cli-ui/src/index.ts +34 -0
  67. package/packages/shared-cli-ui/src/loader.ts +196 -0
  68. package/packages/shared-cli-ui/src/manifest-parser.ts +151 -0
  69. package/packages/shared-cli-ui/src/modern-format.ts +271 -0
  70. package/packages/shared-cli-ui/src/multi-cli-suggestions.ts +159 -0
  71. package/packages/shared-cli-ui/src/table.ts +134 -0
  72. package/packages/shared-cli-ui/src/timing-tracker.ts +68 -0
  73. package/packages/shared-cli-ui/src/utils/context.ts +12 -0
  74. package/packages/shared-cli-ui/src/utils/env.ts +164 -0
  75. package/packages/shared-cli-ui/src/utils/flags.ts +269 -0
  76. package/packages/shared-cli-ui/src/utils/path.ts +8 -0
  77. package/packages/shared-cli-ui/tsconfig.build.json +15 -0
  78. package/packages/shared-cli-ui/tsconfig.json +9 -0
  79. package/packages/shared-cli-ui/tsup.config.ts +11 -0
  80. package/packages/shared-cli-ui/vitest.config.ts +15 -0
  81. package/packages/shared-command-kit/CHANGELOG.md +20 -0
  82. package/packages/shared-command-kit/LICENSE +22 -0
  83. package/packages/shared-command-kit/README.md +1030 -0
  84. package/packages/shared-command-kit/docs/HIGH-LEVEL-API.md +89 -0
  85. package/packages/shared-command-kit/docs/LOW-LEVEL-API.md +105 -0
  86. package/packages/shared-command-kit/docs/MIGRATION-GUIDE.md +135 -0
  87. package/packages/shared-command-kit/eslint.config.js +27 -0
  88. package/packages/shared-command-kit/eslint.config.ts +14 -0
  89. package/packages/shared-command-kit/package.json +76 -0
  90. package/packages/shared-command-kit/prettierrc.json +5 -0
  91. package/packages/shared-command-kit/src/__tests__/define-command.spec.ts +294 -0
  92. package/packages/shared-command-kit/src/__tests__/define-route.test.ts +285 -0
  93. package/packages/shared-command-kit/src/__tests__/define-system-command.spec.ts +508 -0
  94. package/packages/shared-command-kit/src/__tests__/define-webhook.test.ts +156 -0
  95. package/packages/shared-command-kit/src/__tests__/define-websocket.test.ts +316 -0
  96. package/packages/shared-command-kit/src/__tests__/errors.spec.ts +45 -0
  97. package/packages/shared-command-kit/src/__tests__/flags.spec.ts +353 -0
  98. package/packages/shared-command-kit/src/__tests__/platform-api.test.ts +135 -0
  99. package/packages/shared-command-kit/src/__tests__/plugin-context-v3.snapshot.spec.ts +240 -0
  100. package/packages/shared-command-kit/src/__tests__/ws-types.test.ts +359 -0
  101. package/packages/shared-command-kit/src/analytics/index.ts +6 -0
  102. package/packages/shared-command-kit/src/analytics/with-analytics.ts +195 -0
  103. package/packages/shared-command-kit/src/define-action.ts +100 -0
  104. package/packages/shared-command-kit/src/define-command.ts +113 -0
  105. package/packages/shared-command-kit/src/define-route.ts +113 -0
  106. package/packages/shared-command-kit/src/define-system-command.ts +362 -0
  107. package/packages/shared-command-kit/src/define-webhook.ts +115 -0
  108. package/packages/shared-command-kit/src/define-websocket.ts +308 -0
  109. package/packages/shared-command-kit/src/errors/factory.ts +282 -0
  110. package/packages/shared-command-kit/src/errors/format-validation.ts +144 -0
  111. package/packages/shared-command-kit/src/errors/format.ts +92 -0
  112. package/packages/shared-command-kit/src/errors/index.ts +9 -0
  113. package/packages/shared-command-kit/src/errors/types.ts +32 -0
  114. package/packages/shared-command-kit/src/flags/define.ts +92 -0
  115. package/packages/shared-command-kit/src/flags/index.ts +9 -0
  116. package/packages/shared-command-kit/src/flags/types.ts +153 -0
  117. package/packages/shared-command-kit/src/flags/validate.ts +358 -0
  118. package/packages/shared-command-kit/src/helpers/context.ts +8 -0
  119. package/packages/shared-command-kit/src/helpers/flags.ts +84 -0
  120. package/packages/shared-command-kit/src/helpers/index.ts +42 -0
  121. package/packages/shared-command-kit/src/helpers/patterns.ts +464 -0
  122. package/packages/shared-command-kit/src/helpers/platform.ts +335 -0
  123. package/packages/shared-command-kit/src/helpers/use-analytics.ts +95 -0
  124. package/packages/shared-command-kit/src/helpers/use-cache.ts +97 -0
  125. package/packages/shared-command-kit/src/helpers/use-config.ts +99 -0
  126. package/packages/shared-command-kit/src/helpers/use-embeddings.ts +49 -0
  127. package/packages/shared-command-kit/src/helpers/use-llm.ts +316 -0
  128. package/packages/shared-command-kit/src/helpers/use-logger.ts +77 -0
  129. package/packages/shared-command-kit/src/helpers/use-platform.ts +111 -0
  130. package/packages/shared-command-kit/src/helpers/use-resource-broker.ts +106 -0
  131. package/packages/shared-command-kit/src/helpers/use-storage.ts +71 -0
  132. package/packages/shared-command-kit/src/helpers/use-vector-store.ts +49 -0
  133. package/packages/shared-command-kit/src/helpers/validation.ts +398 -0
  134. package/packages/shared-command-kit/src/index.ts +410 -0
  135. package/packages/shared-command-kit/src/jobs.ts +132 -0
  136. package/packages/shared-command-kit/src/lifecycle/define-handlers.ts +366 -0
  137. package/packages/shared-command-kit/src/lifecycle/index.ts +6 -0
  138. package/packages/shared-command-kit/src/manifest.ts +127 -0
  139. package/packages/shared-command-kit/src/rest/define-handler.ts +187 -0
  140. package/packages/shared-command-kit/src/rest/index.ts +11 -0
  141. package/packages/shared-command-kit/src/studio/index.ts +12 -0
  142. package/packages/shared-command-kit/src/validation/index.ts +6 -0
  143. package/packages/shared-command-kit/src/validation/schema-builders.ts +409 -0
  144. package/packages/shared-command-kit/src/ws-types.ts +106 -0
  145. package/packages/shared-command-kit/tsconfig.build.json +15 -0
  146. package/packages/shared-command-kit/tsconfig.json +9 -0
  147. package/packages/shared-command-kit/tsup.config.ts +30 -0
  148. package/packages/shared-command-kit/vitest.config.ts +4 -0
  149. package/packages/shared-http/package.json +67 -0
  150. package/packages/shared-http/src/__tests__/log-correlation.test.ts +81 -0
  151. package/packages/shared-http/src/__tests__/operation-metrics-tracker.test.ts +55 -0
  152. package/packages/shared-http/src/http-observability-collector.ts +363 -0
  153. package/packages/shared-http/src/index.ts +36 -0
  154. package/packages/shared-http/src/log-correlation.ts +89 -0
  155. package/packages/shared-http/src/operation-metrics-tracker.ts +107 -0
  156. package/packages/shared-http/src/register-openapi.ts +108 -0
  157. package/packages/shared-http/src/resolve-schema-ref.ts +75 -0
  158. package/packages/shared-http/src/schemas.ts +29 -0
  159. package/packages/shared-http/src/service-observability.ts +63 -0
  160. package/packages/shared-http/tsconfig.build.json +15 -0
  161. package/packages/shared-http/tsconfig.json +9 -0
  162. package/packages/shared-http/tsup.config.ts +23 -0
  163. package/packages/shared-http/vitest.config.ts +13 -0
  164. package/packages/shared-perm-presets/CHANGELOG.md +20 -0
  165. package/packages/shared-perm-presets/README.md +78 -0
  166. package/packages/shared-perm-presets/eslint.config.js +27 -0
  167. package/packages/shared-perm-presets/package.json +45 -0
  168. package/packages/shared-perm-presets/src/__tests__/combine.test.ts +403 -0
  169. package/packages/shared-perm-presets/src/__tests__/presets.test.ts +205 -0
  170. package/packages/shared-perm-presets/src/combine.ts +278 -0
  171. package/packages/shared-perm-presets/src/index.ts +18 -0
  172. package/packages/shared-perm-presets/src/presets/ci-environment.ts +34 -0
  173. package/packages/shared-perm-presets/src/presets/full-env.ts +16 -0
  174. package/packages/shared-perm-presets/src/presets/git-workflow.ts +40 -0
  175. package/packages/shared-perm-presets/src/presets/index.ts +8 -0
  176. package/packages/shared-perm-presets/src/presets/kb-platform.ts +30 -0
  177. package/packages/shared-perm-presets/src/presets/llm-access.ts +29 -0
  178. package/packages/shared-perm-presets/src/presets/minimal.ts +21 -0
  179. package/packages/shared-perm-presets/src/presets/npm-publish.ts +48 -0
  180. package/packages/shared-perm-presets/src/presets/vector-store.ts +40 -0
  181. package/packages/shared-perm-presets/src/types.ts +192 -0
  182. package/packages/shared-perm-presets/tsconfig.build.json +15 -0
  183. package/packages/shared-perm-presets/tsconfig.json +9 -0
  184. package/packages/shared-perm-presets/tsup.config.ts +8 -0
  185. package/packages/shared-perm-presets/vitest.config.ts +9 -0
  186. package/packages/shared-testing/CHANGELOG.md +20 -0
  187. package/packages/shared-testing/README.md +430 -0
  188. package/packages/shared-testing/package.json +51 -0
  189. package/packages/shared-testing/src/__tests__/create-test-context.test.ts +199 -0
  190. package/packages/shared-testing/src/__tests__/mock-cache.test.ts +174 -0
  191. package/packages/shared-testing/src/__tests__/mock-llm.test.ts +212 -0
  192. package/packages/shared-testing/src/__tests__/setup-platform.test.ts +90 -0
  193. package/packages/shared-testing/src/__tests__/test-command.test.ts +557 -0
  194. package/packages/shared-testing/src/create-test-context.ts +550 -0
  195. package/packages/shared-testing/src/index.ts +77 -0
  196. package/packages/shared-testing/src/mock-cache.ts +179 -0
  197. package/packages/shared-testing/src/mock-llm.ts +319 -0
  198. package/packages/shared-testing/src/mock-logger.ts +97 -0
  199. package/packages/shared-testing/src/mock-storage.ts +108 -0
  200. package/packages/shared-testing/src/setup-platform.ts +101 -0
  201. package/packages/shared-testing/src/test-command.ts +288 -0
  202. package/packages/shared-testing/tsconfig.build.json +15 -0
  203. package/packages/shared-testing/tsconfig.json +9 -0
  204. package/packages/shared-testing/tsup.config.ts +20 -0
  205. package/packages/shared-testing/vitest.config.ts +3 -0
  206. package/packages/shared-tool-kit/CHANGELOG.md +20 -0
  207. package/packages/shared-tool-kit/package.json +47 -0
  208. package/packages/shared-tool-kit/src/__tests__/factory.test.ts +103 -0
  209. package/packages/shared-tool-kit/src/__tests__/mock-tool.test.ts +95 -0
  210. package/packages/shared-tool-kit/src/factory.ts +126 -0
  211. package/packages/shared-tool-kit/src/index.ts +32 -0
  212. package/packages/shared-tool-kit/src/testing/index.ts +84 -0
  213. package/packages/shared-tool-kit/tsconfig.build.json +15 -0
  214. package/packages/shared-tool-kit/tsconfig.json +9 -0
  215. package/packages/shared-tool-kit/tsup.config.ts +21 -0
  216. package/pnpm-workspace.yaml +11070 -0
  217. package/prettierrc.json +1 -0
  218. package/scripts/devkit-sync.mjs +37 -0
  219. package/scripts/hooks/post-push +9 -0
  220. package/scripts/hooks/pre-commit +9 -0
  221. package/scripts/hooks/pre-push +9 -0
  222. package/tsconfig.base.json +9 -0
  223. package/tsconfig.build.json +15 -0
  224. package/tsconfig.json +9 -0
  225. package/tsconfig.paths.json +50 -0
  226. package/tsconfig.tools.json +18 -0
  227. package/tsup.config.bin.ts +34 -0
  228. package/tsup.config.cli.ts +41 -0
  229. package/tsup.config.dual.ts +46 -0
  230. package/tsup.config.ts +36 -0
  231. package/tsup.external.json +104 -0
  232. package/vitest.config.ts +48 -0
@@ -0,0 +1,203 @@
1
+ import { formatDebugEntriesHuman } from './formatters/human';
2
+ import { formatDebugEntriesAI } from './formatters/ai';
3
+ import { formatTimelineWithSummary } from './formatters/timeline';
4
+ import type { DebugEntry, DebugExportOptions, DebugFilterOptions, DebugTreeNode } from './types';
5
+
6
+ function toRegex(pattern: string): RegExp {
7
+ if (!pattern.includes('*')) {
8
+ return new RegExp(`^${pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`, 'i');
9
+ }
10
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
11
+ return new RegExp(`^${escaped}$`, 'i');
12
+ }
13
+
14
+ export function filterByNamespace(entries: DebugEntry[], pattern: string | RegExp): DebugEntry[] {
15
+ const matcher = typeof pattern === 'string' ? toRegex(pattern) : pattern;
16
+ return entries.filter((entry) => matcher.test(entry.namespace));
17
+ }
18
+
19
+ export function filterByLevel(entries: DebugEntry[], level: string | string[]): DebugEntry[] {
20
+ const allowed = Array.isArray(level) ? new Set(level) : new Set([level]);
21
+ return entries.filter((entry) => allowed.has(entry.level));
22
+ }
23
+
24
+ export function filterByTimeRange(entries: DebugEntry[], from?: number, to?: number): DebugEntry[] {
25
+ return entries.filter((entry) => {
26
+ if (from !== undefined && entry.timestamp < from) {
27
+ return false;
28
+ }
29
+ if (to !== undefined && entry.timestamp > to) {
30
+ return false;
31
+ }
32
+ return true;
33
+ });
34
+ }
35
+
36
+ export function searchInLogs(entries: DebugEntry[], query: string): DebugEntry[] {
37
+ const lowered = query.toLowerCase();
38
+ return entries.filter((entry) => {
39
+ if (entry.message.toLowerCase().includes(lowered)) {
40
+ return true;
41
+ }
42
+ if (entry.namespace.toLowerCase().includes(lowered)) {
43
+ return true;
44
+ }
45
+ if (entry.meta) {
46
+ const metaString = JSON.stringify(entry.meta).toLowerCase();
47
+ if (metaString.includes(lowered)) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ });
53
+ }
54
+
55
+ export function filterDebugEntries(entries: DebugEntry[], options: DebugFilterOptions): DebugEntry[] {
56
+ let filtered = [...entries];
57
+
58
+ if (options.namespace) {
59
+ filtered = filterByNamespace(filtered, options.namespace);
60
+ }
61
+
62
+ if (options.level) {
63
+ filtered = filterByLevel(filtered, options.level);
64
+ }
65
+
66
+ if (options.timeRange) {
67
+ filtered = filterByTimeRange(filtered, options.timeRange.from, options.timeRange.to);
68
+ }
69
+
70
+ if (options.search) {
71
+ filtered = searchInLogs(filtered, options.search);
72
+ }
73
+
74
+ if (options.traceId) {
75
+ filtered = filtered.filter((entry) => entry.traceId === options.traceId);
76
+ }
77
+
78
+ return filtered;
79
+ }
80
+
81
+ export function groupByNamespace(entries: DebugEntry[]): Map<string, DebugEntry[]> {
82
+ const map = new Map<string, DebugEntry[]>();
83
+ for (const entry of entries) {
84
+ if (!map.has(entry.namespace)) {
85
+ map.set(entry.namespace, []);
86
+ }
87
+ map.get(entry.namespace)!.push(entry);
88
+ }
89
+ return map;
90
+ }
91
+
92
+ export function groupByGroup(entries: DebugEntry[]): Map<string, DebugEntry[]> {
93
+ const map = new Map<string, DebugEntry[]>();
94
+ for (const entry of entries) {
95
+ const group = entry.group ?? 'default';
96
+ if (!map.has(group)) {
97
+ map.set(group, []);
98
+ }
99
+ map.get(group)!.push(entry);
100
+ }
101
+ return map;
102
+ }
103
+
104
+ export function createDebugTree(entries: DebugEntry[]): DebugTreeNode | null {
105
+ if (entries.length === 0) {
106
+ return null;
107
+ }
108
+
109
+ const sorted = [...entries].sort((a, b) => a.timestamp - b.timestamp);
110
+ const nodes = new Map<string, DebugTreeNode>();
111
+ let root: DebugTreeNode | null = null;
112
+
113
+ function ensureNode(entry: DebugEntry): DebugTreeNode {
114
+ if (entry.spanId && nodes.has(entry.spanId)) {
115
+ return nodes.get(entry.spanId)!;
116
+ }
117
+ const node: DebugTreeNode = { entry, children: [], depth: 0 };
118
+ if (entry.spanId) {
119
+ nodes.set(entry.spanId, node);
120
+ }
121
+ return node;
122
+ }
123
+
124
+ for (const entry of sorted) {
125
+ const node = ensureNode(entry);
126
+
127
+ if (entry.parentSpanId && nodes.has(entry.parentSpanId)) {
128
+ const parent = nodes.get(entry.parentSpanId)!;
129
+ node.depth = parent.depth + 1;
130
+ parent.children.push(node);
131
+ } else if (root === null) {
132
+ root = node;
133
+ } else {
134
+ // Fallback: attach additional roots under primary root to preserve output
135
+ node.depth = root.depth + 1;
136
+ root.children.push(node);
137
+ }
138
+ }
139
+
140
+ return root;
141
+ }
142
+
143
+ export function exportToJSON(entries: DebugEntry[], options: DebugExportOptions = {}): string {
144
+ const filtered = options.filter ? filterDebugEntries(entries, options.filter) : entries;
145
+ if (options.includeMeta === false) {
146
+ return JSON.stringify(
147
+ filtered.map(({ meta, ...rest }) => rest),
148
+ null,
149
+ 2,
150
+ );
151
+ }
152
+ return JSON.stringify(filtered, null, 2);
153
+ }
154
+
155
+ export function exportToChromeFormat(entries: DebugEntry[], options: DebugExportOptions = {}): string {
156
+ const filtered = options.filter ? filterDebugEntries(entries, options.filter) : entries;
157
+ const traceEvents = filtered.map((entry) => ({
158
+ name: entry.message,
159
+ cat: entry.namespace,
160
+ ph: entry.level === 'error' ? 'E' : entry.level === 'warn' ? 'W' : 'X',
161
+ ts: entry.timestamp * 1000,
162
+ dur: (entry.duration ?? 0) * 1000,
163
+ pid: 1,
164
+ tid: entry.spanId ?? entry.namespace,
165
+ args: entry.meta ?? {},
166
+ }));
167
+
168
+ return JSON.stringify({ traceEvents }, null, 2);
169
+ }
170
+
171
+ export function exportToPlainText(entries: DebugEntry[], options: DebugExportOptions = {}): string {
172
+ const filtered = options.filter ? filterDebugEntries(entries, options.filter) : entries;
173
+ return formatDebugEntriesHuman(filtered, { groupBy: 'namespace', showTimestamp: true, showDuration: true });
174
+ }
175
+
176
+ export function exportDebugEntries(entries: DebugEntry[], options: DebugExportOptions): string {
177
+ const format = options.format ?? 'json';
178
+ switch (format) {
179
+ case 'chrome':
180
+ return exportToChromeFormat(entries, options);
181
+ case 'text':
182
+ return exportToPlainText(entries, options);
183
+ case 'json':
184
+ default:
185
+ return exportToJSON(entries, options);
186
+ }
187
+ }
188
+
189
+ export function describeEntriesHuman(entries: DebugEntry[], options: DebugFilterOptions = {}): string {
190
+ const filtered = filterDebugEntries(entries, options);
191
+ return formatDebugEntriesHuman(filtered, { showTimestamp: true, showDuration: true, groupBy: 'namespace' });
192
+ }
193
+
194
+ export function describeEntriesAI(entries: DebugEntry[], options: DebugFilterOptions = {}): string {
195
+ const filtered = filterDebugEntries(entries, options);
196
+ return formatDebugEntriesAI(filtered);
197
+ }
198
+
199
+ export function describeEntriesTimeline(entries: DebugEntry[], options: DebugFilterOptions = {}): string {
200
+ const filtered = filterDebugEntries(entries, options);
201
+ return formatTimelineWithSummary(filtered);
202
+ }
203
+
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Dynamic command discovery that loads commands from actual manifests
3
+ */
4
+
5
+ import type { CommandDiscovery} from './command-discovery';
6
+ import { type CommandInfo } from './command-discovery';
7
+
8
+ export interface ManifestLoader {
9
+ loadManifest(packageName: string): Promise<any[]>;
10
+ }
11
+
12
+ /**
13
+ * Dynamic command discovery that loads commands from manifests
14
+ */
15
+ export class DynamicCommandDiscovery implements CommandDiscovery {
16
+ private manifestCache = new Map<string, any[]>();
17
+ private commandCache = new Map<string, CommandInfo>();
18
+
19
+ constructor(
20
+ private manifestLoader: ManifestLoader,
21
+ private packageNames: string[]
22
+ ) {}
23
+
24
+ async getAvailableCommands(): Promise<string[]> {
25
+ const allCommands: string[] = [];
26
+
27
+ for (const packageName of this.packageNames) {
28
+ try {
29
+ const manifest = await this.loadManifest(packageName);
30
+ const commands = manifest.map(cmd => cmd.id);
31
+ allCommands.push(...commands);
32
+ } catch (error) {
33
+ console.warn(`Failed to load manifest for ${packageName}:`, error);
34
+ }
35
+ }
36
+
37
+ return allCommands;
38
+ }
39
+
40
+ async getCommandInfo(commandId: string): Promise<CommandInfo | null> {
41
+ // Check cache first
42
+ if (this.commandCache.has(commandId)) {
43
+ return this.commandCache.get(commandId)!;
44
+ }
45
+
46
+ // Search through all packages
47
+ for (const packageName of this.packageNames) {
48
+ try {
49
+ const manifest = await this.loadManifest(packageName);
50
+ const command = manifest.find(cmd => cmd.id === commandId);
51
+
52
+ if (command) {
53
+ const [group, name] = commandId.split(':');
54
+ const info: CommandInfo = {
55
+ id: commandId,
56
+ group: group || 'unknown',
57
+ name: name || commandId,
58
+ description: command.describe || `Execute ${commandId}`,
59
+ available: true
60
+ };
61
+
62
+ this.commandCache.set(commandId, info);
63
+ return info;
64
+ }
65
+ } catch (error) {
66
+ console.warn(`Failed to load manifest for ${packageName}:`, error);
67
+ }
68
+ }
69
+
70
+ return null;
71
+ }
72
+
73
+ async isCommandAvailable(commandId: string): Promise<boolean> {
74
+ const info = await this.getCommandInfo(commandId);
75
+ return info !== null;
76
+ }
77
+
78
+ private async loadManifest(packageName: string): Promise<any[]> {
79
+ if (this.manifestCache.has(packageName)) {
80
+ return this.manifestCache.get(packageName)!;
81
+ }
82
+
83
+ const manifest = await this.manifestLoader.loadManifest(packageName);
84
+ this.manifestCache.set(packageName, manifest);
85
+ return manifest;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Create a dynamic command discovery for KB Labs packages
91
+ */
92
+ export function createKBLabsCommandDiscovery(): DynamicCommandDiscovery {
93
+ const manifestLoader: ManifestLoader = {
94
+ async loadManifest(packageName: string): Promise<any[]> {
95
+ try {
96
+ // Try to load from different possible locations
97
+ const possiblePaths = [
98
+ `@kb-labs/${packageName}/cli.manifest.js`,
99
+ `@kb-labs/${packageName}/dist/cli.manifest.js`,
100
+ `@kb-labs/${packageName}/src/cli.manifest.js`
101
+ ];
102
+
103
+ for (const path of possiblePaths) {
104
+ try {
105
+ const manifest = await import(path);
106
+ if (manifest.commands && Array.isArray(manifest.commands)) {
107
+ return manifest.commands;
108
+ }
109
+ } catch {
110
+ // Try next path
111
+ continue;
112
+ }
113
+ }
114
+
115
+ throw new Error(`No manifest found for ${packageName}`);
116
+ } catch (error) {
117
+ console.warn(`Failed to load manifest for ${packageName}:`, error);
118
+ return [];
119
+ }
120
+ }
121
+ };
122
+
123
+ const packageNames = [
124
+ 'devlink-core',
125
+ 'mind-cli',
126
+ 'tox-cli',
127
+ 'core-cli'
128
+ ];
129
+
130
+ return new DynamicCommandDiscovery(manifestLoader, packageNames);
131
+ }