@zigrivers/scaffold 3.21.0 → 3.22.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/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +40 -0
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/dashboard/dependency-graph.d.ts +19 -0
- package/dist/dashboard/dependency-graph.d.ts.map +1 -0
- package/dist/dashboard/dependency-graph.js +180 -0
- package/dist/dashboard/dependency-graph.js.map +1 -0
- package/dist/dashboard/dependency-graph.test.d.ts +2 -0
- package/dist/dashboard/dependency-graph.test.d.ts.map +1 -0
- package/dist/dashboard/dependency-graph.test.js +409 -0
- package/dist/dashboard/dependency-graph.test.js.map +1 -0
- package/dist/dashboard/generator.d.ts +46 -0
- package/dist/dashboard/generator.d.ts.map +1 -1
- package/dist/dashboard/generator.js +1 -0
- package/dist/dashboard/generator.js.map +1 -1
- package/dist/dashboard/multi-service.test.js +257 -1
- package/dist/dashboard/multi-service.test.js.map +1 -1
- package/dist/dashboard/template.d.ts +13 -0
- package/dist/dashboard/template.d.ts.map +1 -1
- package/dist/dashboard/template.js +176 -0
- package/dist/dashboard/template.js.map +1 -1
- package/dist/e2e/dashboard-cross-service-graph-wiring.test.d.ts +2 -0
- package/dist/e2e/dashboard-cross-service-graph-wiring.test.d.ts.map +1 -0
- package/dist/e2e/dashboard-cross-service-graph-wiring.test.js +130 -0
- package/dist/e2e/dashboard-cross-service-graph-wiring.test.js.map +1 -0
- package/dist/e2e/dashboard-cross-service-graph.test.d.ts +2 -0
- package/dist/e2e/dashboard-cross-service-graph.test.d.ts.map +1 -0
- package/dist/e2e/dashboard-cross-service-graph.test.js +216 -0
- package/dist/e2e/dashboard-cross-service-graph.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAgC1C,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAkCD,QAAA,MAAM,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAkO3E,CAAA;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -17,6 +17,9 @@ import { ensureV3Migration } from '../../state/ensure-v3-migration.js';
|
|
|
17
17
|
import { generateDashboardData, generateHtml, generateMultiServiceDashboardData, generateMultiServiceHtml, } from '../../dashboard/generator.js';
|
|
18
18
|
import { discoverMetaPrompts } from '../../core/assembly/meta-prompt-loader.js';
|
|
19
19
|
import { getPackagePipelineDir, atomicWriteFile } from '../../utils/fs.js';
|
|
20
|
+
import { loadPipelineContext } from '../../core/pipeline/context.js';
|
|
21
|
+
import { resolvePipeline } from '../../core/pipeline/resolver.js';
|
|
22
|
+
import { buildDependencyGraph } from '../../dashboard/dependency-graph.js';
|
|
20
23
|
/**
|
|
21
24
|
* Write HTML to the requested path (or a tmpfile), then optionally open it in
|
|
22
25
|
* the system browser. Shared between single-service and multi-service modes.
|
|
@@ -92,12 +95,40 @@ const dashboardCommand = {
|
|
|
92
95
|
if (isMultiServiceMode) {
|
|
93
96
|
// Load meta-prompts ONCE and share across all services.
|
|
94
97
|
const metaPrompts = discoverMetaPrompts(getPackagePipelineDir(projectRoot));
|
|
98
|
+
// NEW: load pipeline context once (shared across all services). Default
|
|
99
|
+
// includeTools: false — tool meta-prompts aren't pipeline participants;
|
|
100
|
+
// their crossReads would leak into overlay.crossReads and into the graph.
|
|
101
|
+
const pipelineContext = loadPipelineContext(projectRoot);
|
|
102
|
+
// NEW: per-service overlay map populated alongside loadedServices below.
|
|
103
|
+
const perServiceOverlay = new Map();
|
|
104
|
+
let capturedGlobalSteps;
|
|
95
105
|
// Methodology resolution: prefer config.methodology.preset; else fall back to
|
|
96
106
|
// the first loaded service state's config_methodology; else 'unknown'.
|
|
97
107
|
const configMethodology = config?.methodology?.preset;
|
|
98
108
|
const loadedServices = [];
|
|
99
109
|
let fallbackStateMethodology;
|
|
100
110
|
for (const svc of configuredServices) {
|
|
111
|
+
// NEW: resolve pipeline per service to capture overlay + globalSteps.
|
|
112
|
+
// Wrap in try/catch mirroring loadState's STATE_MISSING fallback — a
|
|
113
|
+
// malformed overlay for one service must not crash the multi-service
|
|
114
|
+
// dashboard. On failure, warn + skip this service's outgoing graph
|
|
115
|
+
// contribution; the service's card still renders because the
|
|
116
|
+
// loadState block below has its own fallback. Incoming edges FROM
|
|
117
|
+
// other services INTO this service are still rendered — only this
|
|
118
|
+
// service's OWN outgoing declarations are lost.
|
|
119
|
+
try {
|
|
120
|
+
const svcPipeline = resolvePipeline(pipelineContext, { output, serviceId: svc.name });
|
|
121
|
+
perServiceOverlay.set(svc.name, svcPipeline.overlay);
|
|
122
|
+
if (!capturedGlobalSteps)
|
|
123
|
+
capturedGlobalSteps = svcPipeline.globalSteps;
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
output.warn(`Could not resolve pipeline for service '${svc.name}' — `
|
|
127
|
+
+ 'outgoing graph edges from this service omitted '
|
|
128
|
+
+ '(incoming edges from other services are still rendered) '
|
|
129
|
+
+ `(${err.message})`);
|
|
130
|
+
}
|
|
131
|
+
// Existing state-loading block (unchanged from HEAD):
|
|
101
132
|
const svcResolver = new StatePathResolver(projectRoot, svc.name);
|
|
102
133
|
const svcStateManager = new StateManager(projectRoot, () => [], () => config ?? undefined, svcResolver, new Set(), undefined);
|
|
103
134
|
let svcState;
|
|
@@ -138,9 +169,18 @@ const dashboardCommand = {
|
|
|
138
169
|
});
|
|
139
170
|
}
|
|
140
171
|
const methodology = configMethodology ?? fallbackStateMethodology ?? 'unknown';
|
|
172
|
+
// NEW: build the dependency graph (returns null if no edges after filtering).
|
|
173
|
+
const dependencyGraph = buildDependencyGraph({
|
|
174
|
+
config: config,
|
|
175
|
+
projectRoot,
|
|
176
|
+
services: configuredServices.map(s => ({ name: s.name, projectType: s.projectType })),
|
|
177
|
+
perServiceOverlay,
|
|
178
|
+
globalSteps: capturedGlobalSteps,
|
|
179
|
+
});
|
|
141
180
|
const dashboardData = generateMultiServiceDashboardData({
|
|
142
181
|
services: loadedServices,
|
|
143
182
|
methodology,
|
|
183
|
+
dependencyGraph, // NEW — threaded into generator
|
|
144
184
|
});
|
|
145
185
|
if (argv['json-only']) {
|
|
146
186
|
output.result(dashboardData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ScaffoldConfig } from '../types/index.js';
|
|
2
|
+
import type { OverlayState } from '../core/assembly/overlay-state-resolver.js';
|
|
3
|
+
import type { DependencyGraphData } from './generator.js';
|
|
4
|
+
export declare const NODE_WIDTH = 140;
|
|
5
|
+
export declare const NODE_HEIGHT = 44;
|
|
6
|
+
export interface BuildGraphInput {
|
|
7
|
+
config: ScaffoldConfig;
|
|
8
|
+
projectRoot: string;
|
|
9
|
+
services: Array<{
|
|
10
|
+
name: string;
|
|
11
|
+
projectType: string;
|
|
12
|
+
}>;
|
|
13
|
+
/** Per-service resolved overlay. Key: service name. */
|
|
14
|
+
perServiceOverlay: Map<string, OverlayState>;
|
|
15
|
+
/** Optional: set of global step slugs for short-circuit in readiness. */
|
|
16
|
+
globalSteps?: Set<string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function buildDependencyGraph(input: BuildGraphInput): DependencyGraphData | null;
|
|
19
|
+
//# sourceMappingURL=dependency-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../../src/dashboard/dependency-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAA;AAE9E,OAAO,KAAK,EACV,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAIvB,eAAO,MAAM,UAAU,MAAM,CAAA;AAC7B,eAAO,MAAM,WAAW,KAAK,CAAA;AAQ7B,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD,uDAAuD;IACvD,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAC5C,yEAAyE;IACzE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,GAAG,IAAI,CAoEvF"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { resolveCrossReadReadiness } from '../core/assembly/cross-reads.js';
|
|
2
|
+
// Exported so template.ts (§4.3) imports them — single source of truth for
|
|
3
|
+
// node dimensions. Tasks 3/4 use these; Task 2 only needs them declared.
|
|
4
|
+
export const NODE_WIDTH = 140;
|
|
5
|
+
export const NODE_HEIGHT = 44;
|
|
6
|
+
// Module-private layout constants (template.ts imports only NODE_WIDTH/NODE_HEIGHT
|
|
7
|
+
// since those align text/box positioning; the rest are layout-internal).
|
|
8
|
+
const LAYER_GAP = 80;
|
|
9
|
+
const NODE_GAP = 16;
|
|
10
|
+
const PADDING = 24;
|
|
11
|
+
export function buildDependencyGraph(input) {
|
|
12
|
+
const { services, perServiceOverlay, config, projectRoot, globalSteps } = input;
|
|
13
|
+
// Service-name set — drop edges targeting services not in config BEFORE layout,
|
|
14
|
+
// since layoutGraph does byName.get(producer)! and would crash on unknowns.
|
|
15
|
+
const knownServices = new Set(services.map(s => s.name));
|
|
16
|
+
// Shared foreign-state cache across all readiness lookups — one foreign
|
|
17
|
+
// state.json read per service per graph build. Derive the cache type from
|
|
18
|
+
// resolveCrossReadReadiness's signature so we don't silently land on Map<any,
|
|
19
|
+
// any> (cross-reads.ts doesn't export ForeignStateCacheEntry as of v3.22.0).
|
|
20
|
+
const readinessCache = new Map();
|
|
21
|
+
// 1. Aggregate step-level cross-reads into service-level edges.
|
|
22
|
+
// Filters applied at aggregation time:
|
|
23
|
+
// (a) skip self-references (cr.service === svc.name)
|
|
24
|
+
// (b) skip cross-reads whose target service is not in config
|
|
25
|
+
// (c) skip cross-reads declared on DISABLED consumer steps
|
|
26
|
+
const edgeMap = new Map(); // key: `${consumer}|${producer}`
|
|
27
|
+
for (const svc of services) {
|
|
28
|
+
const overlay = perServiceOverlay.get(svc.name);
|
|
29
|
+
if (!overlay)
|
|
30
|
+
continue;
|
|
31
|
+
for (const [consumerStep, crossReads] of Object.entries(overlay.crossReads)) {
|
|
32
|
+
// (c) Disabled-step filter
|
|
33
|
+
if (overlay.steps[consumerStep]?.enabled === false)
|
|
34
|
+
continue;
|
|
35
|
+
for (const cr of crossReads) {
|
|
36
|
+
if (cr.service === svc.name)
|
|
37
|
+
continue; // (a) self-reference
|
|
38
|
+
if (!knownServices.has(cr.service))
|
|
39
|
+
continue; // (b) unknown producer
|
|
40
|
+
const [readiness] = resolveCrossReadReadiness([cr], config, projectRoot, globalSteps, readinessCache);
|
|
41
|
+
const key = `${svc.name}|${cr.service}`;
|
|
42
|
+
const existing = edgeMap.get(key) ?? [];
|
|
43
|
+
existing.push({
|
|
44
|
+
consumerStep,
|
|
45
|
+
producerStep: cr.step,
|
|
46
|
+
status: readiness.status,
|
|
47
|
+
});
|
|
48
|
+
edgeMap.set(key, existing);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (edgeMap.size === 0)
|
|
53
|
+
return null; // Q7 — hide section entirely.
|
|
54
|
+
// 2. Build nodes for ALL services (Q9), layer stubbed to 0.
|
|
55
|
+
const nodes = services.map(svc => ({
|
|
56
|
+
name: svc.name,
|
|
57
|
+
projectType: svc.projectType,
|
|
58
|
+
layer: 0,
|
|
59
|
+
x: 0, y: 0,
|
|
60
|
+
}));
|
|
61
|
+
assignLayers(nodes, edgeMap);
|
|
62
|
+
// 3. Build edges array (step detail already aggregated). Sort explicitly by
|
|
63
|
+
// `consumer|producer` so SVG z-order is deterministic across runs — Map
|
|
64
|
+
// iteration preserves insertion order, which depends on Object.entries
|
|
65
|
+
// ordering of overlay.crossReads upstream. Explicit sort breaks that
|
|
66
|
+
// implicit coupling.
|
|
67
|
+
const edges = [...edgeMap.entries()]
|
|
68
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
69
|
+
.map(([key, steps]) => {
|
|
70
|
+
const [consumer, producer] = key.split('|');
|
|
71
|
+
return { consumer, producer, steps, svgPath: '' };
|
|
72
|
+
});
|
|
73
|
+
// 4. Run layout.
|
|
74
|
+
return layoutGraph(nodes, edges);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Assign `layer` to each node. Layer 0 = no upstream (orphans + root producers).
|
|
78
|
+
* Uses longest-path: node.layer = 1 + max(layer of producers it consumes).
|
|
79
|
+
*
|
|
80
|
+
* Cycle handling: if Kahn-style pull leaves nodes unassigned, all remaining
|
|
81
|
+
* nodes (cycle participants + any downstream, see §3.4 cascade limitation)
|
|
82
|
+
* get the current max layer. Deterministic, no failure.
|
|
83
|
+
*/
|
|
84
|
+
function assignLayers(nodes, edgeMap) {
|
|
85
|
+
const byName = new Map(nodes.map(n => [n.name, n]));
|
|
86
|
+
const producers = new Map(); // consumer -> producers list
|
|
87
|
+
for (const key of edgeMap.keys()) {
|
|
88
|
+
const [consumer, producer] = key.split('|');
|
|
89
|
+
const list = producers.get(consumer) ?? [];
|
|
90
|
+
list.push(producer);
|
|
91
|
+
producers.set(consumer, list);
|
|
92
|
+
}
|
|
93
|
+
const assigned = new Set();
|
|
94
|
+
let currentLayer = 0;
|
|
95
|
+
while (assigned.size < nodes.length) {
|
|
96
|
+
const ready = nodes.filter(n => {
|
|
97
|
+
if (assigned.has(n.name))
|
|
98
|
+
return false;
|
|
99
|
+
const producersList = producers.get(n.name) ?? [];
|
|
100
|
+
return producersList.every(p => assigned.has(p) || !byName.has(p));
|
|
101
|
+
});
|
|
102
|
+
if (ready.length === 0) {
|
|
103
|
+
// Cycle breakdown: assign all remaining to current layer.
|
|
104
|
+
for (const n of nodes) {
|
|
105
|
+
if (!assigned.has(n.name)) {
|
|
106
|
+
n.layer = currentLayer;
|
|
107
|
+
assigned.add(n.name);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
for (const n of ready) {
|
|
113
|
+
n.layer = currentLayer;
|
|
114
|
+
assigned.add(n.name);
|
|
115
|
+
}
|
|
116
|
+
currentLayer++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Position nodes in layered columns (one column per layer, alphabetical
|
|
121
|
+
* within layer). Compute cubic-bezier edge paths from consumer's left edge to
|
|
122
|
+
* producer's right edge. Deterministic output: same input → same bytes.
|
|
123
|
+
*/
|
|
124
|
+
function layoutGraph(nodes, edges) {
|
|
125
|
+
const maxLayer = Math.max(...nodes.map(n => n.layer), 0);
|
|
126
|
+
const byLayer = Array.from({ length: maxLayer + 1 }, () => []);
|
|
127
|
+
for (const n of nodes)
|
|
128
|
+
byLayer[n.layer].push(n);
|
|
129
|
+
// Deterministic within-layer ordering (alphabetical by service name).
|
|
130
|
+
for (const layer of byLayer)
|
|
131
|
+
layer.sort((a, b) => a.name.localeCompare(b.name));
|
|
132
|
+
const width = PADDING * 2 + (maxLayer + 1) * NODE_WIDTH + maxLayer * LAYER_GAP;
|
|
133
|
+
const tallestLayer = Math.max(...byLayer.map(l => l.length));
|
|
134
|
+
const height = PADDING * 2 + tallestLayer * NODE_HEIGHT + Math.max(0, tallestLayer - 1) * NODE_GAP;
|
|
135
|
+
// Position nodes — each layer is a column, vertically centered.
|
|
136
|
+
for (let li = 0; li <= maxLayer; li++) {
|
|
137
|
+
const layerNodes = byLayer[li];
|
|
138
|
+
const layerHeight = layerNodes.length * NODE_HEIGHT
|
|
139
|
+
+ Math.max(0, layerNodes.length - 1) * NODE_GAP;
|
|
140
|
+
const offsetY = PADDING + (height - PADDING * 2 - layerHeight) / 2;
|
|
141
|
+
const x = PADDING + li * (NODE_WIDTH + LAYER_GAP);
|
|
142
|
+
for (let ni = 0; ni < layerNodes.length; ni++) {
|
|
143
|
+
layerNodes[ni].x = x;
|
|
144
|
+
layerNodes[ni].y = offsetY + ni * (NODE_HEIGHT + NODE_GAP);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Edge paths — cubic bezier. For normal acyclic edges (consumer at higher
|
|
148
|
+
// layer than producer), route consumer-left → producer-right so the
|
|
149
|
+
// arrowhead tangent points leftward into the producer's right face. For
|
|
150
|
+
// same-layer cycle edges (A ↔ B), both nodes share a column; the normal
|
|
151
|
+
// routing would send the bezier horizontally through both nodes and the
|
|
152
|
+
// arrowhead would end pointing AWAY from the producer. Route cycle edges
|
|
153
|
+
// via an arc OUTSIDE the column (consumer-right → producer-right, control
|
|
154
|
+
// points displaced rightward by LAYER_GAP/2) so the tangent at the end
|
|
155
|
+
// still points leftward into the producer. Matches spec §3.4 "graceful
|
|
156
|
+
// failure" framing while keeping the arrow direction meaningful.
|
|
157
|
+
const byName = new Map(nodes.map(n => [n.name, n]));
|
|
158
|
+
for (const edge of edges) {
|
|
159
|
+
const consumer = byName.get(edge.consumer);
|
|
160
|
+
const producer = byName.get(edge.producer);
|
|
161
|
+
if (consumer.layer === producer.layer) {
|
|
162
|
+
const x1 = consumer.x + NODE_WIDTH; // consumer right
|
|
163
|
+
const y1 = consumer.y + NODE_HEIGHT / 2;
|
|
164
|
+
const x2 = producer.x + NODE_WIDTH; // producer right
|
|
165
|
+
const y2 = producer.y + NODE_HEIGHT / 2;
|
|
166
|
+
const cx = x2 + LAYER_GAP / 2; // arc outside the column
|
|
167
|
+
edge.svgPath = `M ${x1} ${y1} C ${cx} ${y1}, ${cx} ${y2}, ${x2} ${y2}`;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const x1 = consumer.x; // consumer left
|
|
171
|
+
const y1 = consumer.y + NODE_HEIGHT / 2;
|
|
172
|
+
const x2 = producer.x + NODE_WIDTH; // producer right
|
|
173
|
+
const y2 = producer.y + NODE_HEIGHT / 2;
|
|
174
|
+
const cx = (x1 + x2) / 2;
|
|
175
|
+
edge.svgPath = `M ${x1} ${y1} C ${cx} ${y1}, ${cx} ${y2}, ${x2} ${y2}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { nodes, edges, viewBox: { width, height } };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=dependency-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.js","sourceRoot":"","sources":["../../src/dashboard/dependency-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-graph.test.d.ts","sourceRoot":"","sources":["../../src/dashboard/dependency-graph.test.ts"],"names":[],"mappings":""}
|