harness-mcp-v2 3.2.7 → 3.2.8

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 (116) hide show
  1. package/README.md +7 -24
  2. package/build/registry/index.d.ts.map +1 -1
  3. package/build/registry/index.js +0 -2
  4. package/build/registry/index.js.map +1 -1
  5. package/build/registry/toolsets/ansible.d.ts.map +1 -1
  6. package/build/registry/toolsets/ansible.js +2 -3
  7. package/build/registry/toolsets/ansible.js.map +1 -1
  8. package/build/registry/toolsets/ccm.d.ts.map +1 -1
  9. package/build/registry/toolsets/ccm.js +3 -3
  10. package/build/registry/toolsets/ccm.js.map +1 -1
  11. package/build/registry/toolsets/iacm.d.ts.map +1 -1
  12. package/build/registry/toolsets/iacm.js +2 -3
  13. package/build/registry/toolsets/iacm.js.map +1 -1
  14. package/build/registry/toolsets/sto.d.ts.map +1 -1
  15. package/build/registry/toolsets/sto.js +4 -8
  16. package/build/registry/toolsets/sto.js.map +1 -1
  17. package/build/registry/types.d.ts +11 -3
  18. package/build/registry/types.d.ts.map +1 -1
  19. package/build/registry/types.js.map +1 -1
  20. package/build/tools/harness-diagnose.d.ts.map +1 -1
  21. package/build/tools/harness-diagnose.js +2 -57
  22. package/build/tools/harness-diagnose.js.map +1 -1
  23. package/build/tools/harness-get.d.ts.map +1 -1
  24. package/build/tools/harness-get.js +1 -0
  25. package/build/tools/harness-get.js.map +1 -1
  26. package/build/tools/harness-list.d.ts.map +1 -1
  27. package/build/tools/harness-list.js +1 -23
  28. package/build/tools/harness-list.js.map +1 -1
  29. package/build/tools/harness-status.d.ts.map +1 -1
  30. package/build/tools/harness-status.js +1 -16
  31. package/build/tools/harness-status.js.map +1 -1
  32. package/build/tools/output-schemas.d.ts +0 -1
  33. package/build/tools/output-schemas.d.ts.map +1 -1
  34. package/build/tools/output-schemas.js +0 -1
  35. package/build/tools/output-schemas.js.map +1 -1
  36. package/build/utils/response-formatter.d.ts +0 -10
  37. package/build/utils/response-formatter.d.ts.map +1 -1
  38. package/build/utils/response-formatter.js +0 -21
  39. package/build/utils/response-formatter.js.map +1 -1
  40. package/package.json +1 -2
  41. package/build/registry/toolsets/visualizations.d.ts +0 -8
  42. package/build/registry/toolsets/visualizations.d.ts.map +0 -1
  43. package/build/registry/toolsets/visualizations.js +0 -116
  44. package/build/registry/toolsets/visualizations.js.map +0 -1
  45. package/build/utils/svg/architecture.d.ts +0 -40
  46. package/build/utils/svg/architecture.d.ts.map +0 -1
  47. package/build/utils/svg/architecture.js +0 -354
  48. package/build/utils/svg/architecture.js.map +0 -1
  49. package/build/utils/svg/charts/bar.d.ts +0 -11
  50. package/build/utils/svg/charts/bar.d.ts.map +0 -1
  51. package/build/utils/svg/charts/bar.js +0 -93
  52. package/build/utils/svg/charts/bar.js.map +0 -1
  53. package/build/utils/svg/charts/index.d.ts +0 -8
  54. package/build/utils/svg/charts/index.d.ts.map +0 -1
  55. package/build/utils/svg/charts/index.js +0 -4
  56. package/build/utils/svg/charts/index.js.map +0 -1
  57. package/build/utils/svg/charts/pie.d.ts +0 -10
  58. package/build/utils/svg/charts/pie.d.ts.map +0 -1
  59. package/build/utils/svg/charts/pie.js +0 -105
  60. package/build/utils/svg/charts/pie.js.map +0 -1
  61. package/build/utils/svg/charts/scatter.d.ts +0 -11
  62. package/build/utils/svg/charts/scatter.d.ts.map +0 -1
  63. package/build/utils/svg/charts/scatter.js +0 -101
  64. package/build/utils/svg/charts/scatter.js.map +0 -1
  65. package/build/utils/svg/charts/types.d.ts +0 -39
  66. package/build/utils/svg/charts/types.d.ts.map +0 -1
  67. package/build/utils/svg/charts/types.js +0 -5
  68. package/build/utils/svg/charts/types.js.map +0 -1
  69. package/build/utils/svg/colors.d.ts +0 -25
  70. package/build/utils/svg/colors.d.ts.map +0 -1
  71. package/build/utils/svg/colors.js +0 -66
  72. package/build/utils/svg/colors.js.map +0 -1
  73. package/build/utils/svg/escape.d.ts +0 -6
  74. package/build/utils/svg/escape.d.ts.map +0 -1
  75. package/build/utils/svg/escape.js +0 -20
  76. package/build/utils/svg/escape.js.map +0 -1
  77. package/build/utils/svg/executions-timeseries.d.ts +0 -12
  78. package/build/utils/svg/executions-timeseries.d.ts.map +0 -1
  79. package/build/utils/svg/executions-timeseries.js +0 -99
  80. package/build/utils/svg/executions-timeseries.js.map +0 -1
  81. package/build/utils/svg/index.d.ts +0 -15
  82. package/build/utils/svg/index.d.ts.map +0 -1
  83. package/build/utils/svg/index.js +0 -12
  84. package/build/utils/svg/index.js.map +0 -1
  85. package/build/utils/svg/list-visuals.d.ts +0 -15
  86. package/build/utils/svg/list-visuals.d.ts.map +0 -1
  87. package/build/utils/svg/list-visuals.js +0 -141
  88. package/build/utils/svg/list-visuals.js.map +0 -1
  89. package/build/utils/svg/mappers.d.ts +0 -16
  90. package/build/utils/svg/mappers.d.ts.map +0 -1
  91. package/build/utils/svg/mappers.js +0 -93
  92. package/build/utils/svg/mappers.js.map +0 -1
  93. package/build/utils/svg/render-png-child.d.ts +0 -2
  94. package/build/utils/svg/render-png-child.d.ts.map +0 -1
  95. package/build/utils/svg/render-png-child.js +0 -30
  96. package/build/utils/svg/render-png-child.js.map +0 -1
  97. package/build/utils/svg/render-png.d.ts +0 -17
  98. package/build/utils/svg/render-png.d.ts.map +0 -1
  99. package/build/utils/svg/render-png.js +0 -112
  100. package/build/utils/svg/render-png.js.map +0 -1
  101. package/build/utils/svg/stage-flow.d.ts +0 -11
  102. package/build/utils/svg/stage-flow.d.ts.map +0 -1
  103. package/build/utils/svg/stage-flow.js +0 -93
  104. package/build/utils/svg/stage-flow.js.map +0 -1
  105. package/build/utils/svg/status-summary.d.ts +0 -10
  106. package/build/utils/svg/status-summary.d.ts.map +0 -1
  107. package/build/utils/svg/status-summary.js +0 -73
  108. package/build/utils/svg/status-summary.js.map +0 -1
  109. package/build/utils/svg/timeline.d.ts +0 -12
  110. package/build/utils/svg/timeline.d.ts.map +0 -1
  111. package/build/utils/svg/timeline.js +0 -132
  112. package/build/utils/svg/timeline.js.map +0 -1
  113. package/build/utils/svg/types.d.ts +0 -63
  114. package/build/utils/svg/types.d.ts.map +0 -1
  115. package/build/utils/svg/types.js +0 -6
  116. package/build/utils/svg/types.js.map +0 -1
@@ -1,40 +0,0 @@
1
- /**
2
- * Pipeline Architecture Diagram — multi-level hierarchy from pipeline YAML.
3
- * Shows: Pipeline → Stages → Step Groups → Steps, with deployment strategy,
4
- * rollback paths, service/infra refs, and failure handling.
5
- */
6
- interface ParsedStep {
7
- name: string;
8
- type: string;
9
- timeout?: string;
10
- status?: string;
11
- }
12
- interface ParsedStepGroup {
13
- name: string;
14
- steps: ParsedStep[];
15
- }
16
- interface ParsedStage {
17
- name: string;
18
- type: string;
19
- strategy?: string;
20
- service?: string;
21
- environment?: string;
22
- infrastructure?: string;
23
- stepGroups: ParsedStepGroup[];
24
- rollbackSteps: ParsedStep[];
25
- failureStrategy?: string;
26
- status?: string;
27
- }
28
- interface ParsedPipeline {
29
- name: string;
30
- identifier: string;
31
- stages: ParsedStage[];
32
- }
33
- export declare function parsePipelineYaml(yamlObj: unknown): ParsedPipeline | null;
34
- export interface ArchitectureOptions {
35
- width?: number;
36
- maxSteps?: number;
37
- }
38
- export declare function renderArchitectureSvg(pipeline: ParsedPipeline, options?: ArchitectureOptions): string;
39
- export {};
40
- //# sourceMappingURL=architecture.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/architecture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AA6ED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAgFzE;AAID,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4BD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA6LrG"}
@@ -1,354 +0,0 @@
1
- /**
2
- * Pipeline Architecture Diagram — multi-level hierarchy from pipeline YAML.
3
- * Shows: Pipeline → Stages → Step Groups → Steps, with deployment strategy,
4
- * rollback paths, service/infra refs, and failure handling.
5
- */
6
- import { getStatusColor, FONT_FAMILY, SURFACE_COLOR, BORDER_COLOR, TEXT_PRIMARY, TEXT_SECONDARY, TEXT_MUTED, CHART_PALETTE, svgDefs, } from "./colors.js";
7
- import { escapeXml, truncateLabel } from "./escape.js";
8
- // ─── YAML parser ────────────────────────────────────────────────────────────
9
- function extractSteps(stepsArray) {
10
- const groups = [];
11
- const ungrouped = [];
12
- for (const entry of stepsArray) {
13
- if (!entry || typeof entry !== "object")
14
- continue;
15
- const e = entry;
16
- if (e.stepGroup && typeof e.stepGroup === "object") {
17
- const sg = e.stepGroup;
18
- const steps = [];
19
- if (Array.isArray(sg.steps)) {
20
- for (const s of sg.steps) {
21
- if (s && typeof s === "object" && s.step) {
22
- const step = s.step;
23
- steps.push({
24
- name: String(step.name ?? step.identifier ?? "Step"),
25
- type: String(step.type ?? "Unknown"),
26
- timeout: step.timeout ? String(step.timeout) : undefined,
27
- });
28
- }
29
- }
30
- }
31
- groups.push({ name: String(sg.name ?? sg.identifier ?? "Step Group"), steps });
32
- }
33
- else if (e.step && typeof e.step === "object") {
34
- const step = e.step;
35
- ungrouped.push({
36
- name: String(step.name ?? step.identifier ?? "Step"),
37
- type: String(step.type ?? "Unknown"),
38
- timeout: step.timeout ? String(step.timeout) : undefined,
39
- });
40
- }
41
- else if (e.parallel && Array.isArray(e.parallel)) {
42
- // Parallel steps — flatten into a single group
43
- const steps = [];
44
- for (const p of e.parallel) {
45
- if (p && typeof p === "object" && p.step) {
46
- const step = p.step;
47
- steps.push({
48
- name: String(step.name ?? step.identifier ?? "Step"),
49
- type: String(step.type ?? "Unknown"),
50
- });
51
- }
52
- }
53
- if (steps.length > 0)
54
- groups.push({ name: "Parallel", steps });
55
- }
56
- }
57
- return { groups, ungrouped };
58
- }
59
- function extractRollback(stepsArray) {
60
- const steps = [];
61
- for (const entry of stepsArray) {
62
- if (!entry || typeof entry !== "object")
63
- continue;
64
- const e = entry;
65
- if (e.step && typeof e.step === "object") {
66
- const step = e.step;
67
- steps.push({
68
- name: String(step.name ?? step.identifier ?? "Step"),
69
- type: String(step.type ?? "Unknown"),
70
- });
71
- }
72
- }
73
- return steps;
74
- }
75
- function extractFailureStrategy(strategies) {
76
- if (!Array.isArray(strategies) || strategies.length === 0)
77
- return undefined;
78
- const first = strategies[0];
79
- const onFailure = first?.onFailure;
80
- const action = onFailure?.action;
81
- return action?.type ? String(action.type) : undefined;
82
- }
83
- export function parsePipelineYaml(yamlObj) {
84
- if (!yamlObj || typeof yamlObj !== "object")
85
- return null;
86
- const root = yamlObj;
87
- const pipeline = (root.pipeline ?? root);
88
- if (!pipeline.stages && !pipeline.name)
89
- return null;
90
- const name = String(pipeline.name ?? pipeline.identifier ?? "Pipeline");
91
- const identifier = String(pipeline.identifier ?? "");
92
- const stagesArray = Array.isArray(pipeline.stages) ? pipeline.stages : [];
93
- const stages = [];
94
- for (const entry of stagesArray) {
95
- if (!entry || typeof entry !== "object")
96
- continue;
97
- const e = entry;
98
- const stageObj = (e.stage ?? e);
99
- const spec = (stageObj.spec ?? {});
100
- const execution = (spec.execution ?? {});
101
- const stageType = String(stageObj.type ?? "Custom");
102
- let strategy;
103
- let service;
104
- let environment;
105
- let infrastructure;
106
- // Deployment metadata
107
- if (stageType === "Deployment") {
108
- const strat = execution.strategy;
109
- strategy = strat?.type ? String(strat.type) : undefined;
110
- const svcConfig = spec.serviceConfig;
111
- const svc = svcConfig?.service;
112
- service = svc?.serviceRef ? String(svc.serviceRef) : (svc?.name ? String(svc.name) : undefined);
113
- // Also check spec.service directly (newer YAML format)
114
- if (!service) {
115
- const svcDirect = spec.service;
116
- service = svcDirect?.serviceRef ? String(svcDirect.serviceRef) : undefined;
117
- }
118
- const infra = spec.infrastructure;
119
- environment = infra?.environmentRef ? String(infra.environmentRef) : undefined;
120
- const infraDef = infra?.infrastructureDefinition;
121
- infrastructure = infraDef?.type ? String(infraDef.type) : undefined;
122
- if (!environment) {
123
- const envDirect = spec.environment;
124
- environment = envDirect?.environmentRef ? String(envDirect.environmentRef) : undefined;
125
- infrastructure = envDirect?.infrastructureDefinitions ? "Infra" : infrastructure;
126
- }
127
- }
128
- const stepsArr = Array.isArray(execution.steps) ? execution.steps : [];
129
- const { groups, ungrouped } = extractSteps(stepsArr);
130
- // If ungrouped steps exist, create a default group
131
- const stepGroups = [...groups];
132
- if (ungrouped.length > 0) {
133
- stepGroups.unshift({ name: "Steps", steps: ungrouped });
134
- }
135
- const rollbackArr = Array.isArray(execution.rollbackSteps) ? execution.rollbackSteps : [];
136
- const rollbackSteps = extractRollback(rollbackArr);
137
- const failureStrategy = extractFailureStrategy(Array.isArray(stageObj.failureStrategies) ? stageObj.failureStrategies : []);
138
- stages.push({
139
- name: String(stageObj.name ?? stageObj.identifier ?? "Stage"),
140
- type: stageType,
141
- strategy,
142
- service,
143
- environment,
144
- infrastructure,
145
- stepGroups,
146
- rollbackSteps,
147
- failureStrategy,
148
- });
149
- }
150
- return { name, identifier, stages };
151
- }
152
- const STAGE_COLORS = {
153
- CI: "#6366f1",
154
- Deployment: "#10b981",
155
- Approval: "#f59e0b",
156
- Custom: "#a855f7",
157
- SecurityTests: "#06b6d4",
158
- Pipeline: "#ec4899",
159
- };
160
- const STEP_TYPE_ICONS = {
161
- Run: "\u25B6",
162
- K8sCanaryDeploy: "\u{1F680}",
163
- K8sRollingDeploy: "\u{1F680}",
164
- K8sBlueGreenDeploy: "\u{1F680}",
165
- K8sCanaryDelete: "\u{1F5D1}",
166
- K8sRollingRollback: "\u21A9",
167
- HarnessApproval: "\u2714",
168
- BuildAndPushDockerRegistry: "\u{1F4E6}",
169
- ShellScript: "\u{1F4BB}",
170
- Http: "\u{1F310}",
171
- };
172
- function stepIcon(type) {
173
- return STEP_TYPE_ICONS[type] ?? "\u25AA";
174
- }
175
- export function renderArchitectureSvg(pipeline, options) {
176
- const W = options?.width ?? 900;
177
- const maxSteps = options?.maxSteps ?? 15;
178
- const PAD = 24;
179
- const HDR_H = 52;
180
- const STAGE_HDR = 44;
181
- const GROUP_HDR = 28;
182
- const STEP_H = 22;
183
- const STEP_GAP = 4;
184
- const STAGE_GAP = 16;
185
- const ROLLBACK_HDR = 24;
186
- const META_LINE = 16;
187
- const STAGE_PAD = 12;
188
- // Pre-calculate height
189
- let totalH = HDR_H + PAD;
190
- for (const stage of pipeline.stages) {
191
- let stageH = STAGE_HDR + STAGE_PAD;
192
- // Meta lines (service, env, strategy)
193
- const metaLines = [];
194
- if (stage.type === "Deployment") {
195
- if (stage.strategy)
196
- metaLines.push(`Strategy: ${stage.strategy}`);
197
- if (stage.service)
198
- metaLines.push(`Service: ${stage.service}`);
199
- if (stage.environment)
200
- metaLines.push(`Env: ${stage.environment}`);
201
- }
202
- stageH += metaLines.length * META_LINE;
203
- if (metaLines.length > 0)
204
- stageH += 4;
205
- for (const group of stage.stepGroups) {
206
- stageH += GROUP_HDR;
207
- const stepCount = Math.min(group.steps.length, maxSteps);
208
- stageH += stepCount * (STEP_H + STEP_GAP);
209
- if (group.steps.length > maxSteps)
210
- stageH += STEP_H;
211
- stageH += 8;
212
- }
213
- if (stage.rollbackSteps.length > 0) {
214
- stageH += ROLLBACK_HDR + stage.rollbackSteps.length * (STEP_H + STEP_GAP) + 8;
215
- }
216
- if (stage.failureStrategy)
217
- stageH += META_LINE + 4;
218
- totalH += stageH + STAGE_GAP;
219
- }
220
- totalH += PAD;
221
- const STAGE_W = W - PAD * 2;
222
- const GROUP_W = STAGE_W - STAGE_PAD * 2;
223
- const elements = [];
224
- let y = HDR_H + PAD;
225
- for (let si = 0; si < pipeline.stages.length; si++) {
226
- const stage = pipeline.stages[si];
227
- const stageColor = STAGE_COLORS[stage.type] ?? CHART_PALETTE[si % CHART_PALETTE.length];
228
- const stageY = y;
229
- // Calculate this stage's height
230
- let stageContentH = STAGE_HDR;
231
- const metaLines = [];
232
- if (stage.type === "Deployment") {
233
- if (stage.strategy)
234
- metaLines.push(`Strategy: ${stage.strategy}`);
235
- if (stage.service)
236
- metaLines.push(`Svc: ${stage.service}`);
237
- if (stage.environment)
238
- metaLines.push(`Env: ${stage.environment}`);
239
- if (stage.infrastructure)
240
- metaLines.push(`Infra: ${stage.infrastructure}`);
241
- }
242
- stageContentH += metaLines.length * META_LINE;
243
- if (metaLines.length > 0)
244
- stageContentH += 4;
245
- for (const group of stage.stepGroups) {
246
- stageContentH += GROUP_HDR;
247
- const stepCount = Math.min(group.steps.length, maxSteps);
248
- stageContentH += stepCount * (STEP_H + STEP_GAP);
249
- if (group.steps.length > maxSteps)
250
- stageContentH += STEP_H;
251
- stageContentH += 8;
252
- }
253
- if (stage.rollbackSteps.length > 0) {
254
- stageContentH += ROLLBACK_HDR + stage.rollbackSteps.length * (STEP_H + STEP_GAP) + 8;
255
- }
256
- if (stage.failureStrategy)
257
- stageContentH += META_LINE + 4;
258
- stageContentH += STAGE_PAD;
259
- // Stage container
260
- elements.push(`<rect x="${PAD}" y="${stageY}" width="${STAGE_W}" height="${stageContentH}" rx="10" fill="${SURFACE_COLOR}" stroke="${stageColor}" stroke-width="2" filter="url(#shadow)"/>`);
261
- // Stage header bar
262
- elements.push(`<rect x="${PAD}" y="${stageY}" width="${STAGE_W}" height="${STAGE_HDR}" rx="10" fill="${stageColor}" opacity="0.12"/>`);
263
- elements.push(`<rect x="${PAD}" y="${stageY + STAGE_HDR - 2}" width="${STAGE_W}" height="2" fill="${stageColor}" opacity="0.12"/>`);
264
- // Stage badge
265
- elements.push(`<rect x="${PAD + 12}" y="${stageY + 10}" width="${stage.type.length * 7 + 16}" height="22" rx="4" fill="${stageColor}" opacity="0.2" stroke="${stageColor}" stroke-width="1"/>`);
266
- elements.push(`<text x="${PAD + 20}" y="${stageY + 26}" fill="${stageColor}" font-size="10" font-weight="700" font-family="${FONT_FAMILY}">${escapeXml(stage.type.toUpperCase())}</text>`);
267
- // Stage name
268
- const badgeW = stage.type.length * 7 + 32;
269
- elements.push(`<text x="${PAD + badgeW}" y="${stageY + 26}" fill="${TEXT_PRIMARY}" font-size="13" font-weight="700" font-family="${FONT_FAMILY}">${escapeXml(truncateLabel(stage.name, 40))}</text>`);
270
- // Status if available
271
- if (stage.status) {
272
- const sc = getStatusColor(stage.status);
273
- elements.push(`<circle cx="${PAD + STAGE_W - 20}" cy="${stageY + 22}" r="6" fill="${sc}"/>`);
274
- }
275
- let innerY = stageY + STAGE_HDR + 4;
276
- // Meta lines
277
- for (const meta of metaLines) {
278
- elements.push(`<text x="${PAD + STAGE_PAD + 8}" y="${innerY + 12}" fill="${TEXT_MUTED}" font-size="9" font-weight="500" font-family="${FONT_FAMILY}">${escapeXml(meta)}</text>`);
279
- innerY += META_LINE;
280
- }
281
- if (metaLines.length > 0)
282
- innerY += 4;
283
- // Step groups
284
- for (let gi = 0; gi < stage.stepGroups.length; gi++) {
285
- const group = stage.stepGroups[gi];
286
- const groupX = PAD + STAGE_PAD;
287
- const groupColor = CHART_PALETTE[(si * 3 + gi) % CHART_PALETTE.length];
288
- // Group header
289
- elements.push(`<rect x="${groupX}" y="${innerY}" width="${GROUP_W}" height="${GROUP_HDR}" rx="6" fill="${groupColor}" opacity="0.08"/>`);
290
- elements.push(`<rect x="${groupX}" y="${innerY + 2}" width="3" height="${GROUP_HDR - 4}" rx="1" fill="${groupColor}"/>`);
291
- elements.push(`<text x="${groupX + 12}" y="${innerY + 18}" fill="${TEXT_SECONDARY}" font-size="11" font-weight="600" font-family="${FONT_FAMILY}">${escapeXml(truncateLabel(group.name, 35))}</text>`);
292
- elements.push(`<text x="${groupX + GROUP_W - 8}" y="${innerY + 18}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" text-anchor="end">${group.steps.length} step${group.steps.length !== 1 ? "s" : ""}</text>`);
293
- innerY += GROUP_HDR;
294
- // Steps
295
- const displaySteps = group.steps.slice(0, maxSteps);
296
- for (const step of displaySteps) {
297
- const icon = stepIcon(step.type);
298
- const stepColor = step.status ? getStatusColor(step.status) : TEXT_MUTED;
299
- elements.push(`<text x="${groupX + 16}" y="${innerY + 15}" fill="${stepColor}" font-size="10" font-family="${FONT_FAMILY}">${icon}</text>`);
300
- elements.push(`<text x="${groupX + 30}" y="${innerY + 15}" fill="${TEXT_PRIMARY}" font-size="10" font-family="${FONT_FAMILY}">${escapeXml(truncateLabel(step.name, 30))}</text>`);
301
- elements.push(`<text x="${groupX + GROUP_W - 8}" y="${innerY + 15}" fill="${TEXT_MUTED}" font-size="8" font-family="${FONT_FAMILY}" text-anchor="end">${escapeXml(step.type)}${step.timeout ? ` \u00b7 ${step.timeout}` : ""}</text>`);
302
- innerY += STEP_H + STEP_GAP;
303
- }
304
- if (group.steps.length > maxSteps) {
305
- elements.push(`<text x="${groupX + 30}" y="${innerY + 15}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" font-style="italic">\u2026 +${group.steps.length - maxSteps} more steps</text>`);
306
- innerY += STEP_H;
307
- }
308
- innerY += 8;
309
- }
310
- // Rollback section
311
- if (stage.rollbackSteps.length > 0) {
312
- const rbX = PAD + STAGE_PAD;
313
- elements.push(`<rect x="${rbX}" y="${innerY}" width="${GROUP_W}" height="${ROLLBACK_HDR}" rx="6" fill="#f43f5e" opacity="0.08"/>`);
314
- elements.push(`<rect x="${rbX}" y="${innerY + 2}" width="3" height="${ROLLBACK_HDR - 4}" rx="1" fill="#f43f5e"/>`);
315
- elements.push(`<text x="${rbX + 12}" y="${innerY + 17}" fill="#f43f5e" font-size="10" font-weight="600" font-family="${FONT_FAMILY}">\u21A9 Rollback</text>`);
316
- innerY += ROLLBACK_HDR;
317
- for (const step of stage.rollbackSteps) {
318
- elements.push(`<text x="${rbX + 16}" y="${innerY + 15}" fill="${TEXT_MUTED}" font-size="10" font-family="${FONT_FAMILY}">${stepIcon(step.type)}</text>`);
319
- elements.push(`<text x="${rbX + 30}" y="${innerY + 15}" fill="${TEXT_SECONDARY}" font-size="10" font-family="${FONT_FAMILY}">${escapeXml(truncateLabel(step.name, 30))}</text>`);
320
- elements.push(`<text x="${rbX + GROUP_W - 8}" y="${innerY + 15}" fill="${TEXT_MUTED}" font-size="8" font-family="${FONT_FAMILY}" text-anchor="end">${escapeXml(step.type)}</text>`);
321
- innerY += STEP_H + STEP_GAP;
322
- }
323
- innerY += 8;
324
- }
325
- // Failure strategy
326
- if (stage.failureStrategy) {
327
- elements.push(`<text x="${PAD + STAGE_PAD + 8}" y="${innerY + 12}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}">On failure: ${escapeXml(stage.failureStrategy)}</text>`);
328
- }
329
- y += stageContentH + STAGE_GAP;
330
- // Arrow between stages
331
- if (si < pipeline.stages.length - 1) {
332
- const arrowX = W / 2;
333
- const arrowY1 = y - STAGE_GAP;
334
- const arrowY2 = y;
335
- elements.push(`<line x1="${arrowX}" y1="${arrowY1}" x2="${arrowX}" y2="${arrowY2 - 4}" stroke="${BORDER_COLOR}" stroke-width="2" marker-end="url(#varrow)"/>`);
336
- }
337
- }
338
- // Title
339
- const title = escapeXml(truncateLabel(pipeline.name, 50));
340
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${totalH}" viewBox="0 0 ${W} ${totalH}">
341
- ${svgDefs(W, totalH)}
342
- <defs>
343
- <marker id="varrow" markerWidth="10" markerHeight="8" refX="5" refY="8" orient="auto">
344
- <polygon points="0 0, 10 0, 5 8" fill="${BORDER_COLOR}"/>
345
- </marker>
346
- </defs>
347
- <rect width="${W}" height="${totalH}" rx="12" fill="url(#bgGrad)"/>
348
- <rect x="${PAD}" y="${PAD}" width="${W - PAD * 2}" height="${HDR_H - PAD}" rx="8" fill="${SURFACE_COLOR}" stroke="${BORDER_COLOR}" stroke-width="1" filter="url(#shadow)"/>
349
- <text x="${PAD + 16}" y="${PAD + 20}" fill="${TEXT_PRIMARY}" font-size="15" font-weight="700" font-family="${FONT_FAMILY}">${title}</text>
350
- <text x="${W - PAD - 12}" y="${PAD + 20}" fill="${TEXT_MUTED}" font-size="10" font-family="${FONT_FAMILY}" text-anchor="end">${pipeline.stages.length} stage${pipeline.stages.length !== 1 ? "s" : ""}</text>
351
- ${elements.join("\n")}
352
- </svg>`;
353
- }
354
- //# sourceMappingURL=architecture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../../src/utils/svg/architecture.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Horizontal bar chart — rich version with grid, value axis, gradient bars, labels.
3
- */
4
- import type { BarChartData } from "./types.js";
5
- export interface BarChartOptions {
6
- width?: number;
7
- barHeight?: number;
8
- maxItems?: number;
9
- }
10
- export declare function renderBarChartSvg(data: BarChartData, options?: BarChartOptions): string;
11
- //# sourceMappingURL=bar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../../../src/utils/svg/charts/bar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ/C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CA6FvF"}
@@ -1,93 +0,0 @@
1
- /**
2
- * Horizontal bar chart — rich version with grid, value axis, gradient bars, labels.
3
- */
4
- import { FONT_FAMILY, SURFACE_COLOR, BORDER_COLOR, TEXT_PRIMARY, TEXT_SECONDARY, TEXT_MUTED, GRID_COLOR, CHART_PALETTE, svgDefs, } from "../colors.js";
5
- import { escapeXml, truncateLabel } from "../escape.js";
6
- function fmtVal(n) {
7
- if (n >= 1000000)
8
- return `${(n / 1000000).toFixed(1)}M`;
9
- if (n >= 1000)
10
- return `${(n / 1000).toFixed(1)}K`;
11
- return String(n);
12
- }
13
- export function renderBarChartSvg(data, options) {
14
- const W = options?.width ?? 720;
15
- const barH = options?.barHeight ?? 30;
16
- const maxItems = options?.maxItems ?? 25;
17
- const PAD = 24;
18
- const LABEL_W = 140;
19
- const VALUE_W = 50;
20
- const HDR_H = data.subtitle ? 68 : 52;
21
- const FTR_H = 32;
22
- const BAR_X = PAD + LABEL_W;
23
- const BAR_W = W - BAR_X - PAD - VALUE_W;
24
- const GAP = 6;
25
- let items = data.items;
26
- let truncated = 0;
27
- if (items.length > maxItems) {
28
- truncated = items.length - maxItems;
29
- items = items.slice(0, maxItems);
30
- }
31
- const maxVal = Math.max(1, ...items.map((i) => i.value));
32
- const chartH = items.length * (barH + GAP) + (truncated > 0 ? 24 : 0);
33
- const H = HDR_H + chartH + FTR_H + PAD * 2;
34
- const total = items.reduce((s, i) => s + i.value, 0);
35
- // Grid lines (5 vertical)
36
- const grid = [];
37
- for (let i = 0; i <= 4; i++) {
38
- const x = BAR_X + (i / 4) * BAR_W;
39
- const val = (maxVal * i) / 4;
40
- grid.push(`<line x1="${x}" y1="${HDR_H + PAD}" x2="${x}" y2="${HDR_H + PAD + chartH}" stroke="${GRID_COLOR}" stroke-width="1" stroke-dasharray="3,3"/>`);
41
- grid.push(`<text x="${x}" y="${HDR_H + PAD + chartH + 14}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" text-anchor="middle">${fmtVal(val)}</text>`);
42
- }
43
- // X-axis label
44
- if (data.xLabel) {
45
- grid.push(`<text x="${BAR_X + BAR_W / 2}" y="${HDR_H + PAD + chartH + 28}" fill="${TEXT_SECONDARY}" font-size="10" font-family="${FONT_FAMILY}" text-anchor="middle">${escapeXml(data.xLabel)}</text>`);
46
- }
47
- // Bars
48
- const bars = [];
49
- items.forEach((item, i) => {
50
- const y = HDR_H + PAD + i * (barH + GAP);
51
- const w = Math.max(6, (item.value / maxVal) * BAR_W);
52
- const color = item.color ?? CHART_PALETTE[i % CHART_PALETTE.length];
53
- const label = escapeXml(truncateLabel(item.label, 20));
54
- const pct = total > 0 ? Math.round((item.value / total) * 100) : 0;
55
- const gradId = `bg${i}`;
56
- // Gradient
57
- bars.push(`<linearGradient id="${gradId}" x1="0" y1="0" x2="1" y2="0"><stop offset="0%" stop-color="${color}" stop-opacity="0.9"/><stop offset="100%" stop-color="${color}" stop-opacity="0.6"/></linearGradient>`);
58
- // Row stripe
59
- if (i % 2 === 0) {
60
- bars.push(`<rect x="${PAD}" y="${y}" width="${W - PAD * 2}" height="${barH}" rx="4" fill="${SURFACE_COLOR}" opacity="0.25"/>`);
61
- }
62
- // Label
63
- bars.push(`<text x="${PAD + 4}" y="${y + barH / 2 + 4}" fill="${TEXT_PRIMARY}" font-size="11" font-weight="500" font-family="${FONT_FAMILY}">${label}</text>`);
64
- // Bar
65
- bars.push(`<rect x="${BAR_X}" y="${y + 5}" width="${w}" height="${barH - 10}" rx="5" fill="url(#${gradId})" filter="url(#shadow)"/>`);
66
- // Value + percentage
67
- bars.push(`<text x="${BAR_X + w + 8}" y="${y + barH / 2 + 4}" fill="${TEXT_SECONDARY}" font-size="10" font-weight="600" font-family="${FONT_FAMILY}">${item.value} <tspan fill="${TEXT_MUTED}" font-weight="400">(${pct}%)</tspan></text>`);
68
- });
69
- if (truncated > 0) {
70
- const y = HDR_H + PAD + items.length * (barH + GAP);
71
- bars.push(`<text x="${PAD + 4}" y="${y + 12}" fill="${TEXT_MUTED}" font-size="10" font-family="${FONT_FAMILY}" font-style="italic">\u2026 and ${truncated} more</text>`);
72
- }
73
- // Header
74
- const title = escapeXml(truncateLabel(data.title, 45));
75
- const subtitle = data.subtitle
76
- ? `<text x="${PAD + 16}" y="${PAD + 38}" fill="${TEXT_MUTED}" font-size="11" font-family="${FONT_FAMILY}">${escapeXml(data.subtitle)}</text>`
77
- : "";
78
- // Footer
79
- const footerY = HDR_H + PAD + chartH + 24;
80
- const footer = `<text x="${W - PAD}" y="${footerY}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" text-anchor="end">Total: ${fmtVal(total)} \u00b7 ${items.length} items</text>`;
81
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}">
82
- ${svgDefs(W, H)}
83
- <rect width="${W}" height="${H}" rx="12" fill="url(#bgGrad)"/>
84
- <rect x="${PAD}" y="${PAD}" width="${W - PAD * 2}" height="${HDR_H - PAD}" rx="8" fill="${SURFACE_COLOR}" stroke="${BORDER_COLOR}" stroke-width="1" filter="url(#shadow)"/>
85
- <text x="${PAD + 16}" y="${PAD + 22}" fill="${TEXT_PRIMARY}" font-size="15" font-weight="700" font-family="${FONT_FAMILY}">${title}</text>
86
- ${subtitle}
87
- ${grid.join("\n")}
88
- ${bars.filter((b) => !b.startsWith("<linearGradient")).join("\n")}
89
- ${footer}
90
- <defs>${bars.filter((b) => b.startsWith("<linearGradient")).join("")}</defs>
91
- </svg>`;
92
- }
93
- //# sourceMappingURL=bar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bar.js","sourceRoot":"","sources":["../../../../src/utils/svg/charts/bar.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export type { BarChartData, BarChartItem, PieChartData, PieChartSlice, ScatterChartData, ScatterPoint } from "./types.js";
2
- export { renderBarChartSvg } from "./bar.js";
3
- export type { BarChartOptions } from "./bar.js";
4
- export { renderPieChartSvg } from "./pie.js";
5
- export type { PieChartOptions } from "./pie.js";
6
- export { renderScatterChartSvg } from "./scatter.js";
7
- export type { ScatterChartOptions } from "./scatter.js";
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/svg/charts/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1H,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,4 +0,0 @@
1
- export { renderBarChartSvg } from "./bar.js";
2
- export { renderPieChartSvg } from "./pie.js";
3
- export { renderScatterChartSvg } from "./scatter.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/svg/charts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Pie / donut chart renderer — rich version with gradient slices, labels, legend.
3
- */
4
- import type { PieChartData } from "./types.js";
5
- export interface PieChartOptions {
6
- width?: number;
7
- donut?: boolean;
8
- }
9
- export declare function renderPieChartSvg(data: PieChartData, options?: PieChartOptions): string;
10
- //# sourceMappingURL=pie.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pie.d.ts","sourceRoot":"","sources":["../../../../src/utils/svg/charts/pie.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAuFvF"}