@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.
Files changed (30) hide show
  1. package/dist/cli/commands/dashboard.d.ts.map +1 -1
  2. package/dist/cli/commands/dashboard.js +40 -0
  3. package/dist/cli/commands/dashboard.js.map +1 -1
  4. package/dist/dashboard/dependency-graph.d.ts +19 -0
  5. package/dist/dashboard/dependency-graph.d.ts.map +1 -0
  6. package/dist/dashboard/dependency-graph.js +180 -0
  7. package/dist/dashboard/dependency-graph.js.map +1 -0
  8. package/dist/dashboard/dependency-graph.test.d.ts +2 -0
  9. package/dist/dashboard/dependency-graph.test.d.ts.map +1 -0
  10. package/dist/dashboard/dependency-graph.test.js +409 -0
  11. package/dist/dashboard/dependency-graph.test.js.map +1 -0
  12. package/dist/dashboard/generator.d.ts +46 -0
  13. package/dist/dashboard/generator.d.ts.map +1 -1
  14. package/dist/dashboard/generator.js +1 -0
  15. package/dist/dashboard/generator.js.map +1 -1
  16. package/dist/dashboard/multi-service.test.js +257 -1
  17. package/dist/dashboard/multi-service.test.js.map +1 -1
  18. package/dist/dashboard/template.d.ts +13 -0
  19. package/dist/dashboard/template.d.ts.map +1 -1
  20. package/dist/dashboard/template.js +176 -0
  21. package/dist/dashboard/template.js.map +1 -1
  22. package/dist/e2e/dashboard-cross-service-graph-wiring.test.d.ts +2 -0
  23. package/dist/e2e/dashboard-cross-service-graph-wiring.test.d.ts.map +1 -0
  24. package/dist/e2e/dashboard-cross-service-graph-wiring.test.js +130 -0
  25. package/dist/e2e/dashboard-cross-service-graph-wiring.test.js.map +1 -0
  26. package/dist/e2e/dashboard-cross-service-graph.test.d.ts +2 -0
  27. package/dist/e2e/dashboard-cross-service-graph.test.d.ts.map +1 -0
  28. package/dist/e2e/dashboard-cross-service-graph.test.js +216 -0
  29. package/dist/e2e/dashboard-cross-service-graph.test.js.map +1 -0
  30. 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;AA4B1C,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,CAyL3E,CAAA;AAED,eAAe,gBAAgB,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dependency-graph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.test.d.ts","sourceRoot":"","sources":["../../src/dashboard/dependency-graph.test.ts"],"names":[],"mappings":""}