@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.
- package/dist/args.d.ts +1 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +4 -0
- package/dist/args.js.map +1 -1
- package/dist/assets/dql-notebook/assets/index-B_X7pyPz.js +510 -0
- package/dist/assets/dql-notebook/index.html +1 -1
- package/dist/assets/templates/dashboard/README.md +30 -0
- package/dist/assets/templates/dashboard/blocks/.gitkeep +1 -0
- package/dist/assets/templates/dashboard/dashboards/pipeline_overview.dql +23 -0
- package/dist/assets/templates/dashboard/data/pipeline.csv +7 -0
- package/dist/assets/templates/dashboard/dql.config.json +18 -0
- package/dist/assets/templates/dashboard/semantic-layer/.gitkeep +1 -0
- package/dist/assets/templates/duckdb-local/README.md +30 -0
- package/dist/assets/templates/duckdb-local/blocks/orders_by_region.dql +24 -0
- package/dist/assets/templates/duckdb-local/data/orders.csv +7 -0
- package/dist/assets/templates/duckdb-local/dql.config.json +18 -0
- package/dist/assets/templates/duckdb-local/semantic-layer/.gitkeep +1 -0
- package/dist/assets/templates/ecommerce/README.md +7 -1
- package/dist/assets/templates/finance-kpi/README.md +31 -0
- package/dist/assets/templates/finance-kpi/blocks/arr_kpi.dql +21 -0
- package/dist/assets/templates/finance-kpi/data/revenue.csv +7 -0
- package/dist/assets/templates/finance-kpi/dql.config.json +18 -0
- package/dist/assets/templates/finance-kpi/semantic-layer/.gitkeep +1 -0
- package/dist/assets/templates/saas/README.md +13 -1
- package/dist/assets/templates/starter/README.md +4 -10
- package/dist/assets/templates/taxi/README.md +13 -1
- package/dist/assets/templates/workbook/README.md +30 -0
- package/dist/assets/templates/workbook/blocks/.gitkeep +1 -0
- package/dist/assets/templates/workbook/data/finance.csv +7 -0
- package/dist/assets/templates/workbook/dql.config.json +18 -0
- package/dist/assets/templates/workbook/semantic-layer/.gitkeep +1 -0
- package/dist/assets/templates/workbook/workbooks/quarterly_business_review.dql +32 -0
- package/dist/commands/build.test.js +1 -0
- package/dist/commands/build.test.js.map +1 -1
- package/dist/commands/certify.d.ts.map +1 -1
- package/dist/commands/certify.js +168 -2
- package/dist/commands/certify.js.map +1 -1
- package/dist/commands/compile.d.ts +15 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +123 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/doctor.test.js +1 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/init.test.js +1 -0
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/lineage.d.ts +20 -0
- package/dist/commands/lineage.d.ts.map +1 -0
- package/dist/commands/lineage.js +551 -0
- package/dist/commands/lineage.js.map +1 -0
- package/dist/commands/new.test.js +7 -0
- package/dist/commands/new.test.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +16 -8
- package/dist/commands/test.js.map +1 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +249 -11
- package/dist/local-runtime.js.map +1 -1
- package/dist/package.json +7 -7
- package/package.json +7 -7
- 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');
|