@duckcodeailabs/dql-cli 0.5.2 → 0.7.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 (62) hide show
  1. package/dist/args.d.ts +1 -0
  2. package/dist/args.d.ts.map +1 -1
  3. package/dist/args.js +4 -0
  4. package/dist/args.js.map +1 -1
  5. package/dist/assets/dql-notebook/assets/index-B_X7pyPz.js +510 -0
  6. package/dist/assets/dql-notebook/index.html +1 -1
  7. package/dist/assets/templates/dashboard/README.md +30 -0
  8. package/dist/assets/templates/dashboard/blocks/.gitkeep +1 -0
  9. package/dist/assets/templates/dashboard/dashboards/pipeline_overview.dql +23 -0
  10. package/dist/assets/templates/dashboard/data/pipeline.csv +7 -0
  11. package/dist/assets/templates/dashboard/dql.config.json +18 -0
  12. package/dist/assets/templates/dashboard/semantic-layer/.gitkeep +1 -0
  13. package/dist/assets/templates/duckdb-local/README.md +30 -0
  14. package/dist/assets/templates/duckdb-local/blocks/orders_by_region.dql +24 -0
  15. package/dist/assets/templates/duckdb-local/data/orders.csv +7 -0
  16. package/dist/assets/templates/duckdb-local/dql.config.json +18 -0
  17. package/dist/assets/templates/duckdb-local/semantic-layer/.gitkeep +1 -0
  18. package/dist/assets/templates/ecommerce/README.md +7 -1
  19. package/dist/assets/templates/finance-kpi/README.md +31 -0
  20. package/dist/assets/templates/finance-kpi/blocks/arr_kpi.dql +21 -0
  21. package/dist/assets/templates/finance-kpi/data/revenue.csv +7 -0
  22. package/dist/assets/templates/finance-kpi/dql.config.json +18 -0
  23. package/dist/assets/templates/finance-kpi/semantic-layer/.gitkeep +1 -0
  24. package/dist/assets/templates/saas/README.md +13 -1
  25. package/dist/assets/templates/starter/README.md +4 -10
  26. package/dist/assets/templates/taxi/README.md +13 -1
  27. package/dist/assets/templates/workbook/README.md +30 -0
  28. package/dist/assets/templates/workbook/blocks/.gitkeep +1 -0
  29. package/dist/assets/templates/workbook/data/finance.csv +7 -0
  30. package/dist/assets/templates/workbook/dql.config.json +18 -0
  31. package/dist/assets/templates/workbook/semantic-layer/.gitkeep +1 -0
  32. package/dist/assets/templates/workbook/workbooks/quarterly_business_review.dql +32 -0
  33. package/dist/commands/build.test.js +1 -0
  34. package/dist/commands/build.test.js.map +1 -1
  35. package/dist/commands/certify.d.ts.map +1 -1
  36. package/dist/commands/certify.js +168 -2
  37. package/dist/commands/certify.js.map +1 -1
  38. package/dist/commands/compile.d.ts +15 -0
  39. package/dist/commands/compile.d.ts.map +1 -0
  40. package/dist/commands/compile.js +123 -0
  41. package/dist/commands/compile.js.map +1 -0
  42. package/dist/commands/doctor.test.js +1 -0
  43. package/dist/commands/doctor.test.js.map +1 -1
  44. package/dist/commands/init.test.js +1 -0
  45. package/dist/commands/init.test.js.map +1 -1
  46. package/dist/commands/lineage.d.ts +20 -0
  47. package/dist/commands/lineage.d.ts.map +1 -0
  48. package/dist/commands/lineage.js +551 -0
  49. package/dist/commands/lineage.js.map +1 -0
  50. package/dist/commands/new.test.js +7 -0
  51. package/dist/commands/new.test.js.map +1 -1
  52. package/dist/commands/test.d.ts.map +1 -1
  53. package/dist/commands/test.js +16 -8
  54. package/dist/commands/test.js.map +1 -1
  55. package/dist/index.js +13 -3
  56. package/dist/index.js.map +1 -1
  57. package/dist/local-runtime.d.ts.map +1 -1
  58. package/dist/local-runtime.js +249 -11
  59. package/dist/local-runtime.js.map +1 -1
  60. package/dist/package.json +7 -7
  61. package/package.json +7 -7
  62. package/dist/assets/dql-notebook/assets/index-Dp-Vko5m.js +0 -477
@@ -0,0 +1,551 @@
1
+ /**
2
+ * `dql lineage` — Answer-layer lineage analysis.
3
+ *
4
+ * Shows how data flows from source tables through blocks, semantic metrics,
5
+ * domains, and charts. Tracks trust chains and cross-domain impacts.
6
+ *
7
+ * Usage:
8
+ * dql lineage [path] Show full lineage graph summary
9
+ * dql lineage <name> [path] Show upstream/downstream for a block, table, or metric
10
+ * dql lineage --table <name> [path] Show lineage for a specific source table
11
+ * dql lineage --metric <name> [path] Show lineage for a specific metric
12
+ * dql lineage --domain <name> [path] Show lineage within a domain
13
+ * dql lineage --impact <name> [path] Impact analysis: what breaks if this node changes?
14
+ * dql lineage --trust-chain <from> <to> Show trust chain between two blocks
15
+ * dql lineage --export [path] Export lineage as JSON
16
+ * dql lineage --no-manifest Force live scan (skip dql-manifest.json)
17
+ */
18
+ import { readdirSync, readFileSync, existsSync } from 'node:fs';
19
+ import { join, extname, resolve } from 'node:path';
20
+ import { Parser, loadSemanticLayerFromDir, buildLineageGraph, analyzeImpact, buildTrustChain, detectDomainFlows, getDomainTrustOverview, LineageGraph, } from '@duckcodeailabs/dql-core';
21
+ export async function runLineage(blockNameOrPath, rest, flags) {
22
+ // Collect all args and separate flags from positional args
23
+ const allArgs = [...(blockNameOrPath ? [blockNameOrPath] : []), ...rest];
24
+ const noManifest = allArgs.includes('--no-manifest');
25
+ const positionalArgs = allArgs.filter((a) => !a.startsWith('-'));
26
+ const flagArgs = allArgs.filter((a) => a.startsWith('-'));
27
+ // Re-derive blockNameOrPath from the first non-flag positional arg
28
+ const effectiveBlockArg = positionalArgs[0] ?? null;
29
+ // Determine project root — check for dql.config.json
30
+ const candidateRoot = resolve(positionalArgs.find((r) => existsSync(join(resolve(r), 'dql.config.json')))
31
+ ?? '.');
32
+ const projectRoot = existsSync(join(candidateRoot, 'dql.config.json'))
33
+ ? candidateRoot
34
+ : resolve('.');
35
+ if (!existsSync(join(projectRoot, 'dql.config.json'))) {
36
+ console.error('No DQL project found (missing dql.config.json). Run from a project root or pass a project path.');
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ // Build the lineage graph — prefer manifest if available
41
+ const graph = noManifest
42
+ ? buildProjectLineage(projectRoot)
43
+ : loadFromManifestOrScan(projectRoot);
44
+ if (graph.nodeCount === 0) {
45
+ console.log('\n No lineage data found.');
46
+ console.log(' Run `dql compile` to generate the project manifest, or add blocks in blocks/.\n');
47
+ return;
48
+ }
49
+ // Route to the right subcommand based on flags
50
+ if (flags.format === 'json' || allArgs.includes('--export')) {
51
+ console.log(JSON.stringify(graph.toJSON(), null, 2));
52
+ return;
53
+ }
54
+ // --impact <name>
55
+ const impactIdx = allArgs.indexOf('--impact');
56
+ if (impactIdx >= 0 && allArgs[impactIdx + 1]) {
57
+ const nodeId = resolveNodeId(graph, allArgs[impactIdx + 1]);
58
+ if (!nodeId) {
59
+ console.error(`"${allArgs[impactIdx + 1]}" not found in lineage graph.`);
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ return printImpactAnalysis(graph, nodeId, flags);
64
+ }
65
+ // --trust-chain <from> <to>
66
+ const trustIdx = allArgs.indexOf('--trust-chain');
67
+ if (trustIdx >= 0 && allArgs[trustIdx + 1] && allArgs[trustIdx + 2]) {
68
+ return printTrustChain(graph, allArgs[trustIdx + 1], allArgs[trustIdx + 2], flags);
69
+ }
70
+ // --domain <name>
71
+ if (flags.domain) {
72
+ return printDomainLineage(graph, flags.domain, flags);
73
+ }
74
+ // --table <name>
75
+ const tableIdx = allArgs.indexOf('--table');
76
+ if (tableIdx >= 0 && allArgs[tableIdx + 1]) {
77
+ return printNodeLineage(graph, `table:${allArgs[tableIdx + 1]}`, flags);
78
+ }
79
+ // --metric <name>
80
+ const metricIdx = allArgs.indexOf('--metric');
81
+ if (metricIdx >= 0 && allArgs[metricIdx + 1]) {
82
+ return printNodeLineage(graph, `metric:${allArgs[metricIdx + 1]}`, flags);
83
+ }
84
+ // Specific node — smart lookup: try block, then table, then metric
85
+ if (effectiveBlockArg && resolve(effectiveBlockArg) !== projectRoot) {
86
+ const nodeId = resolveNodeId(graph, effectiveBlockArg);
87
+ if (!nodeId) {
88
+ console.error(`"${effectiveBlockArg}" not found in lineage graph.`);
89
+ console.error(' Hint: use --table <name> or --metric <name> for explicit lookup.');
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ return printNodeLineage(graph, nodeId, flags);
94
+ }
95
+ // Default: show full summary
96
+ return printSummary(graph, flags);
97
+ }
98
+ /** Load lineage from dql-manifest.json if available, otherwise scan live. */
99
+ function loadFromManifestOrScan(projectRoot) {
100
+ const manifestPath = join(projectRoot, 'dql-manifest.json');
101
+ if (existsSync(manifestPath)) {
102
+ try {
103
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
104
+ if (manifest.lineage?.nodes && manifest.lineage?.edges) {
105
+ return LineageGraph.fromJSON({
106
+ nodes: manifest.lineage.nodes,
107
+ edges: manifest.lineage.edges,
108
+ });
109
+ }
110
+ }
111
+ catch {
112
+ // Fall through to live scan
113
+ }
114
+ }
115
+ return buildProjectLineage(projectRoot);
116
+ }
117
+ /** Discover all blocks and semantic layer definitions and build the lineage graph. */
118
+ function buildProjectLineage(projectRoot) {
119
+ const blocks = [];
120
+ const metrics = [];
121
+ const dimensions = [];
122
+ // Scan .dql files
123
+ const dirs = ['blocks', 'dashboards', 'workbooks'];
124
+ for (const dir of dirs) {
125
+ const dirPath = join(projectRoot, dir);
126
+ if (!existsSync(dirPath))
127
+ continue;
128
+ for (const entry of readdirSync(dirPath, { withFileTypes: true })) {
129
+ if (!entry.isFile() || extname(entry.name) !== '.dql')
130
+ continue;
131
+ const filePath = join(dirPath, entry.name);
132
+ try {
133
+ const source = readFileSync(filePath, 'utf-8');
134
+ const parser = new Parser(source, `${dir}/${entry.name}`);
135
+ const ast = parser.parse();
136
+ for (const stmt of ast.statements) {
137
+ const block = stmt;
138
+ if (block.kind !== 'BlockDecl')
139
+ continue;
140
+ blocks.push({
141
+ name: block.name,
142
+ sql: block.query?.rawSQL ?? '',
143
+ domain: extractBlockProperty(block, 'domain'),
144
+ owner: extractBlockProperty(block, 'owner'),
145
+ status: extractBlockProperty(block, 'status'),
146
+ blockType: block.blockType,
147
+ metricRef: block.metricRef,
148
+ chartType: extractVisualizationChart(block),
149
+ });
150
+ }
151
+ }
152
+ catch {
153
+ // Skip unparseable files
154
+ }
155
+ }
156
+ }
157
+ // Load semantic layer
158
+ const semanticDir = join(projectRoot, 'semantic-layer');
159
+ if (existsSync(semanticDir)) {
160
+ try {
161
+ const layer = loadSemanticLayerFromDir(semanticDir);
162
+ for (const metric of layer.listMetrics()) {
163
+ metrics.push({
164
+ name: metric.name,
165
+ table: metric.table,
166
+ domain: metric.domain,
167
+ type: metric.type,
168
+ });
169
+ }
170
+ for (const dim of layer.listDimensions()) {
171
+ dimensions.push({
172
+ name: dim.name,
173
+ table: dim.table,
174
+ });
175
+ }
176
+ }
177
+ catch {
178
+ // Non-fatal
179
+ }
180
+ }
181
+ return buildLineageGraph(blocks, metrics, dimensions);
182
+ }
183
+ /** Extract a property value from a block — checks direct AST fields first, then properties array. */
184
+ function extractBlockProperty(block, propName) {
185
+ // The parser puts well-known fields (domain, owner, type) directly on the AST node
186
+ if (block[propName] !== undefined && block[propName] !== null) {
187
+ return String(block[propName]);
188
+ }
189
+ // Fall back to properties array for custom/extended properties
190
+ if (!block.properties)
191
+ return undefined;
192
+ for (const prop of block.properties) {
193
+ if (prop.key === propName && prop.value?.kind === 'Literal') {
194
+ return String(prop.value.value);
195
+ }
196
+ }
197
+ return undefined;
198
+ }
199
+ /** Extract chart type from a block's visualization config. */
200
+ function extractVisualizationChart(block) {
201
+ if (!block.visualization)
202
+ return undefined;
203
+ for (const prop of block.visualization.properties ?? []) {
204
+ if (prop.key === 'chart' && prop.value?.kind === 'Literal') {
205
+ return String(prop.value.value);
206
+ }
207
+ }
208
+ return undefined;
209
+ }
210
+ // ---- Output formatters ----
211
+ function printSummary(graph, _flags) {
212
+ const nodes = graph.getAllNodes();
213
+ const edges = graph.getAllEdges();
214
+ const domains = graph.getDomains();
215
+ const sourceTables = graph.getNodesByType('source_table');
216
+ const blocks = graph.getNodesByType('block');
217
+ const metrics = graph.getNodesByType('metric');
218
+ const dimensions = graph.getNodesByType('dimension');
219
+ const charts = graph.getNodesByType('chart');
220
+ console.log('\n DQL Lineage Summary');
221
+ console.log(' ' + '='.repeat(50));
222
+ // Overview counts
223
+ console.log(`\n ${nodes.length} nodes, ${edges.length} edges, ${domains.length} domain(s)`);
224
+ // Source Tables
225
+ if (sourceTables.length > 0) {
226
+ console.log(`\n Source Tables (${sourceTables.length}):`);
227
+ for (const t of sourceTables.sort((a, b) => a.name.localeCompare(b.name))) {
228
+ const downstream = graph.getOutgoingEdges(t.id);
229
+ const targets = [...new Set(downstream.map((e) => graph.getNode(e.target)?.name).filter(Boolean))];
230
+ const arrow = targets.length > 0 ? ` -> ${targets.join(', ')}` : '';
231
+ console.log(` ${t.name}${arrow}`);
232
+ }
233
+ }
234
+ // Blocks
235
+ if (blocks.length > 0) {
236
+ console.log(`\n Blocks (${blocks.length}):`);
237
+ for (const b of blocks.sort((a, b) => a.name.localeCompare(b.name))) {
238
+ const parts = [];
239
+ if (b.domain)
240
+ parts.push(`domain: ${b.domain}`);
241
+ if (b.owner)
242
+ parts.push(`owner: ${b.owner}`);
243
+ if (b.status)
244
+ parts.push(b.status);
245
+ const meta = parts.length > 0 ? ` (${parts.join(', ')})` : '';
246
+ console.log(` ${b.name}${meta}`);
247
+ // Show what this block reads from (upstream) — deduplicate by node id
248
+ const incoming = graph.getIncomingEdges(b.id);
249
+ const upstreamNames = [...new Set(incoming
250
+ .map((e) => graph.getNode(e.source))
251
+ .filter((n) => n !== undefined && n.type !== 'domain')
252
+ .map((n) => n.name))];
253
+ if (upstreamNames.length > 0) {
254
+ console.log(` reads from: ${upstreamNames.join(', ')}`);
255
+ }
256
+ // Show what this block feeds into (downstream) — deduplicate by node id
257
+ const outgoing = graph.getOutgoingEdges(b.id);
258
+ const downstreamNames = [...new Set(outgoing
259
+ .map((e) => graph.getNode(e.target))
260
+ .filter((n) => n !== undefined && n.type !== 'domain')
261
+ .map((n) => n.name))];
262
+ if (downstreamNames.length > 0) {
263
+ console.log(` feeds into: ${downstreamNames.join(', ')}`);
264
+ }
265
+ }
266
+ }
267
+ // Metrics
268
+ if (metrics.length > 0) {
269
+ console.log(`\n Metrics (${metrics.length}):`);
270
+ for (const m of metrics.sort((a, b) => a.name.localeCompare(b.name))) {
271
+ const incoming = graph.getIncomingEdges(m.id);
272
+ const sources = incoming.map((e) => graph.getNode(e.source)?.name).filter(Boolean);
273
+ const from = sources.length > 0 ? ` <- ${sources.join(', ')}` : '';
274
+ const domain = m.domain ? ` (${m.domain})` : '';
275
+ console.log(` ${m.name}${domain}${from}`);
276
+ }
277
+ }
278
+ // Dimensions
279
+ if (dimensions.length > 0) {
280
+ console.log(`\n Dimensions (${dimensions.length}):`);
281
+ for (const d of dimensions.sort((a, b) => a.name.localeCompare(b.name))) {
282
+ console.log(` ${d.name}`);
283
+ }
284
+ }
285
+ // Charts
286
+ if (charts.length > 0) {
287
+ console.log(`\n Charts (${charts.length}):`);
288
+ for (const c of charts.sort((a, b) => a.name.localeCompare(b.name))) {
289
+ const incoming = graph.getIncomingEdges(c.id);
290
+ const sources = incoming.map((e) => graph.getNode(e.source)?.name).filter(Boolean);
291
+ const from = sources.length > 0 ? ` <- ${sources.join(', ')}` : '';
292
+ console.log(` ${c.name}${from}`);
293
+ }
294
+ }
295
+ // Data Flow DAG
296
+ console.log('\n Data Flow:');
297
+ console.log(' ' + '-'.repeat(50));
298
+ // Find root nodes (no incoming edges, excluding domain nodes)
299
+ const roots = nodes.filter((n) => n.type !== 'domain' && (graph.getIncomingEdges(n.id).length === 0));
300
+ const printed = new Set();
301
+ for (const root of roots.sort((a, b) => a.name.localeCompare(b.name))) {
302
+ printDAGNode(graph, root, 0, printed);
303
+ }
304
+ // Print any remaining nodes not reachable from roots (cycles or disconnected)
305
+ for (const node of nodes) {
306
+ if (!printed.has(node.id) && node.type !== 'domain') {
307
+ printDAGNode(graph, node, 0, printed);
308
+ }
309
+ }
310
+ // Cross-domain flows
311
+ const flows = detectDomainFlows(graph);
312
+ if (flows.length > 0) {
313
+ console.log('\n Cross-Domain Flows:');
314
+ for (const flow of flows) {
315
+ console.log(` ${flow.from} -> ${flow.to} (${flow.edges.length} edge(s))`);
316
+ }
317
+ }
318
+ // Domain trust overview
319
+ if (domains.length > 0) {
320
+ console.log('\n Domain Trust:');
321
+ for (const domain of domains.sort()) {
322
+ const overview = getDomainTrustOverview(graph, domain);
323
+ if (overview.totalBlocks === 0)
324
+ continue;
325
+ const score = (overview.trustScore * 100).toFixed(0);
326
+ console.log(` ${domain}: ${overview.certified}/${overview.totalBlocks} certified (${score}% trust)`);
327
+ }
328
+ }
329
+ console.log('');
330
+ }
331
+ /** Recursively print DAG tree from a node. */
332
+ function printDAGNode(graph, node, depth, printed) {
333
+ if (printed.has(node.id))
334
+ return;
335
+ printed.add(node.id);
336
+ const indent = ' ' + ' '.repeat(depth);
337
+ const prefix = depth === 0 ? '' : '└── ';
338
+ const typeLabel = node.type === 'source_table' ? 'table' : node.type;
339
+ const badge = node.status === 'certified' ? ' ✓' : '';
340
+ const domain = node.domain ? ` [${node.domain}]` : '';
341
+ console.log(`${indent}${prefix}${typeLabel}:${node.name}${domain}${badge}`);
342
+ // Get non-domain downstream
343
+ const outgoing = graph.getOutgoingEdges(node.id);
344
+ const children = outgoing
345
+ .map((e) => graph.getNode(e.target))
346
+ .filter((n) => n !== undefined && n.type !== 'domain' && !printed.has(n.id));
347
+ for (const child of children) {
348
+ printDAGNode(graph, child, depth + 1, printed);
349
+ }
350
+ }
351
+ /**
352
+ * Resolve a user-provided name to a node ID by trying multiple type prefixes.
353
+ * Priority: block > source_table > metric > dimension > chart > exact match.
354
+ */
355
+ function resolveNodeId(graph, name) {
356
+ // If the name already contains a colon, try it as-is
357
+ if (name.includes(':') && graph.getNode(name))
358
+ return name;
359
+ // Try common type prefixes in priority order
360
+ const prefixes = ['block', 'table', 'metric', 'dimension', 'chart', 'domain'];
361
+ for (const prefix of prefixes) {
362
+ const id = `${prefix}:${name}`;
363
+ if (graph.getNode(id))
364
+ return id;
365
+ }
366
+ // Fuzzy match: search all nodes for a name match
367
+ for (const node of graph.getAllNodes()) {
368
+ if (node.name === name)
369
+ return node.id;
370
+ }
371
+ return null;
372
+ }
373
+ function printNodeLineage(graph, nodeId, _flags) {
374
+ const node = graph.getNode(nodeId);
375
+ if (!node) {
376
+ console.error(`Node "${nodeId}" not found in lineage graph.`);
377
+ process.exitCode = 1;
378
+ return;
379
+ }
380
+ const typeLabel = node.type === 'source_table' ? 'Table' : node.type.charAt(0).toUpperCase() + node.type.slice(1);
381
+ const ancestors = graph.ancestors(nodeId);
382
+ const descendants = graph.descendants(nodeId);
383
+ console.log(`\n ${typeLabel} Lineage: ${node.name}`);
384
+ console.log(' ' + '='.repeat(50));
385
+ // Metadata
386
+ const meta = [];
387
+ if (node.type !== 'source_table')
388
+ meta.push(`Type: ${node.type}`);
389
+ if (node.domain)
390
+ meta.push(`Domain: ${node.domain}`);
391
+ if (node.status)
392
+ meta.push(`Status: ${node.status}`);
393
+ if (node.owner)
394
+ meta.push(`Owner: ${node.owner}`);
395
+ if (meta.length > 0) {
396
+ for (const m of meta)
397
+ console.log(` ${m}`);
398
+ }
399
+ // Direct connections (immediate neighbors)
400
+ const inEdges = graph.getIncomingEdges(nodeId);
401
+ const outEdges = graph.getOutgoingEdges(nodeId);
402
+ const directUpstream = [...new Set(inEdges
403
+ .map((e) => graph.getNode(e.source))
404
+ .filter((n) => n !== undefined && n.type !== 'domain'))];
405
+ const directDownstream = [...new Set(outEdges
406
+ .map((e) => graph.getNode(e.target))
407
+ .filter((n) => n !== undefined && n.type !== 'domain'))];
408
+ if (directUpstream.length > 0) {
409
+ console.log(`\n Direct Upstream (${directUpstream.length}):`);
410
+ for (const n of directUpstream) {
411
+ const badge = n.status === 'certified' ? ' [certified]' : '';
412
+ const typePfx = n.type === 'source_table' ? 'table' : n.type;
413
+ console.log(` ${typePfx}:${n.name}${badge}${n.domain ? ` (${n.domain})` : ''}`);
414
+ }
415
+ }
416
+ if (directDownstream.length > 0) {
417
+ console.log(`\n Direct Downstream (${directDownstream.length}):`);
418
+ for (const n of directDownstream) {
419
+ const badge = n.status === 'certified' ? ' [certified]' : '';
420
+ const typePfx = n.type === 'source_table' ? 'table' : n.type;
421
+ console.log(` ${typePfx}:${n.name}${badge}${n.domain ? ` (${n.domain})` : ''}`);
422
+ }
423
+ }
424
+ // Full transitive upstream/downstream (if different from direct)
425
+ const transitiveUp = ancestors.filter((n) => n.type !== 'domain');
426
+ const transitiveDown = descendants.filter((n) => n.type !== 'domain');
427
+ if (transitiveUp.length > directUpstream.length) {
428
+ console.log(`\n All Upstream (${transitiveUp.length}):`);
429
+ for (const a of transitiveUp) {
430
+ const badge = a.status === 'certified' ? ' [certified]' : '';
431
+ const typePfx = a.type === 'source_table' ? 'table' : a.type;
432
+ const direct = directUpstream.some((d) => d.id === a.id) ? ' *' : '';
433
+ console.log(` ${typePfx}:${a.name}${badge}${a.domain ? ` (${a.domain})` : ''}${direct}`);
434
+ }
435
+ }
436
+ if (transitiveDown.length > directDownstream.length) {
437
+ console.log(`\n All Downstream (${transitiveDown.length}):`);
438
+ for (const d of transitiveDown) {
439
+ const badge = d.status === 'certified' ? ' [certified]' : '';
440
+ const typePfx = d.type === 'source_table' ? 'table' : d.type;
441
+ const direct = directDownstream.some((dd) => dd.id === d.id) ? ' *' : '';
442
+ console.log(` ${typePfx}:${d.name}${badge}${d.domain ? ` (${d.domain})` : ''}${direct}`);
443
+ }
444
+ }
445
+ // Data flow tree from this node
446
+ if (transitiveDown.length > 0) {
447
+ console.log('\n Data Flow:');
448
+ console.log(' ' + '-'.repeat(50));
449
+ const printed = new Set();
450
+ printDAGNode(graph, node, 0, printed);
451
+ }
452
+ console.log('');
453
+ }
454
+ function printDomainLineage(graph, domain, _flags) {
455
+ const nodes = graph.getNodesByDomain(domain);
456
+ const overview = getDomainTrustOverview(graph, domain);
457
+ const flows = detectDomainFlows(graph);
458
+ console.log(`\n Domain Lineage: ${domain}`);
459
+ console.log(' ' + '='.repeat(40));
460
+ console.log(`\n Blocks: ${overview.totalBlocks}`);
461
+ console.log(` Certified: ${overview.certified}`);
462
+ console.log(` Trust Score: ${(overview.trustScore * 100).toFixed(0)}%`);
463
+ console.log(`\n Nodes in domain (${nodes.length}):`);
464
+ for (const node of nodes) {
465
+ const badge = node.status === 'certified' ? ' [certified]' : '';
466
+ console.log(` ${node.type}:${node.name}${badge}`);
467
+ }
468
+ const inFlows = flows.filter((f) => f.to === domain);
469
+ const outFlows = flows.filter((f) => f.from === domain);
470
+ if (inFlows.length > 0) {
471
+ console.log('\n Data flows IN from:');
472
+ for (const f of inFlows) {
473
+ console.log(` ${f.from} (${f.edges.length} edge(s))`);
474
+ }
475
+ }
476
+ if (outFlows.length > 0) {
477
+ console.log('\n Data flows OUT to:');
478
+ for (const f of outFlows) {
479
+ console.log(` ${f.to} (${f.edges.length} edge(s))`);
480
+ }
481
+ }
482
+ console.log('');
483
+ }
484
+ function printImpactAnalysis(graph, nodeId, _flags) {
485
+ const node = graph.getNode(nodeId);
486
+ if (!node) {
487
+ console.error(`"${nodeId}" not found.`);
488
+ process.exitCode = 1;
489
+ return;
490
+ }
491
+ const impact = analyzeImpact(graph, nodeId);
492
+ console.log(`\n Impact Analysis: ${node.name}`);
493
+ console.log(' ' + '='.repeat(40));
494
+ console.log(`\n Total downstream affected: ${impact.totalAffected}`);
495
+ if (impact.domainImpacts.length > 0) {
496
+ console.log('\n By domain:');
497
+ for (const di of impact.domainImpacts) {
498
+ console.log(` ${di.domain}: ${di.affectedNodes.length} node(s), ${di.certifiedBlocksAffected} certified`);
499
+ for (const n of di.affectedNodes) {
500
+ const badge = n.status === 'certified' ? ' [certified]' : '';
501
+ console.log(` - ${n.name}${badge}`);
502
+ }
503
+ }
504
+ }
505
+ if (impact.domainCrossings.length > 0) {
506
+ console.log('\n Domain boundaries crossed:');
507
+ for (const dc of impact.domainCrossings) {
508
+ console.log(` ${dc.from} -> ${dc.to} (${dc.edgeCount} edge(s))`);
509
+ }
510
+ }
511
+ console.log('');
512
+ }
513
+ function printTrustChain(graph, fromBlock, toBlock, _flags) {
514
+ const fromId = `block:${fromBlock}`;
515
+ const toId = `block:${toBlock}`;
516
+ if (!graph.getNode(fromId)) {
517
+ console.error(`Block "${fromBlock}" not found.`);
518
+ process.exitCode = 1;
519
+ return;
520
+ }
521
+ if (!graph.getNode(toId)) {
522
+ console.error(`Block "${toBlock}" not found.`);
523
+ process.exitCode = 1;
524
+ return;
525
+ }
526
+ const chain = buildTrustChain(graph, fromId, toId);
527
+ if (!chain) {
528
+ console.log(`\n No path found from "${fromBlock}" to "${toBlock}".`);
529
+ return;
530
+ }
531
+ console.log(`\n Trust Chain: ${fromBlock} -> ${toBlock}`);
532
+ console.log(' ' + '='.repeat(40));
533
+ console.log(`\n Trust Score: ${(chain.trustScore * 100).toFixed(0)}% (${chain.certifiedCount}/${chain.nodes.length} certified)`);
534
+ console.log('\n Chain:');
535
+ for (let i = 0; i < chain.nodes.length; i++) {
536
+ const n = chain.nodes[i];
537
+ const icon = n.isTrustCheckpoint ? '[CERTIFIED]' : '[ ]';
538
+ const domain = n.domain ? ` (${n.domain})` : '';
539
+ const owner = n.owner ? ` — ${n.owner}` : '';
540
+ const prefix = i === 0 ? ' ' : ' -> ';
541
+ console.log(` ${prefix}${icon} ${n.name}${domain}${owner}`);
542
+ }
543
+ if (chain.domainCrossings.length > 0) {
544
+ console.log('\n Domain boundaries:');
545
+ for (const dc of chain.domainCrossings) {
546
+ console.log(` ${dc.from} -> ${dc.to}`);
547
+ }
548
+ }
549
+ console.log('');
550
+ }
551
+ //# sourceMappingURL=lineage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage.js","sourceRoot":"","sources":["../../src/commands/lineage.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ describe('runNew', () => {
24
24
  template: 'starter',
25
25
  connection: '',
26
26
  verbose: false,
27
+ skipTests: false,
27
28
  });
28
29
  try {
29
30
  process.chdir(projectDir);
@@ -42,6 +43,7 @@ describe('runNew', () => {
42
43
  template: 'starter',
43
44
  connection: '',
44
45
  verbose: false,
46
+ skipTests: false,
45
47
  });
46
48
  const blockPath = join(projectDir, 'blocks', 'pipeline_health.dql');
47
49
  expect(existsSync(blockPath)).toBe(true);
@@ -75,6 +77,7 @@ describe('runNew', () => {
75
77
  template: 'starter',
76
78
  connection: '',
77
79
  verbose: false,
80
+ skipTests: false,
78
81
  });
79
82
  try {
80
83
  process.chdir(projectDir);
@@ -93,6 +96,7 @@ describe('runNew', () => {
93
96
  template: 'starter',
94
97
  connection: '',
95
98
  verbose: false,
99
+ skipTests: false,
96
100
  });
97
101
  await runNew('workbook', ['Quarterly Review'], {
98
102
  check: false,
@@ -109,6 +113,7 @@ describe('runNew', () => {
109
113
  template: 'starter',
110
114
  connection: '',
111
115
  verbose: false,
116
+ skipTests: false,
112
117
  });
113
118
  const dashboardPath = join(projectDir, 'dashboards', 'revenue_overview.dql');
114
119
  const workbookPath = join(projectDir, 'workbooks', 'quarterly_review.dql');
@@ -144,6 +149,7 @@ describe('runNew', () => {
144
149
  template: 'starter',
145
150
  connection: '',
146
151
  verbose: false,
152
+ skipTests: false,
147
153
  });
148
154
  try {
149
155
  process.chdir(projectDir);
@@ -162,6 +168,7 @@ describe('runNew', () => {
162
168
  template: 'starter',
163
169
  connection: '',
164
170
  verbose: false,
171
+ skipTests: false,
165
172
  });
166
173
  const blockPath = join(projectDir, 'blocks', 'arr_growth.dql');
167
174
  const metricPath = join(projectDir, 'semantic-layer', 'metrics', 'arr_growth_metric.yaml');