@tienne/gestalt 0.96.0 → 0.97.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 (73) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/skills/architecture/SKILL.md +31 -5
  3. package/dist/plugin/skills/architecture/references/domain-flow.md +1 -0
  4. package/dist/plugin/skills/architecture/references/projections.md +56 -0
  5. package/dist/plugin/skills/architecture/references/rerun.md +3 -1
  6. package/dist/schemas/architecture-ir.schema.json +51 -3
  7. package/dist/src/architecture/blueprint-layout.d.ts +105 -0
  8. package/dist/src/architecture/blueprint-layout.d.ts.map +1 -0
  9. package/dist/src/architecture/blueprint-layout.js +297 -0
  10. package/dist/src/architecture/blueprint-layout.js.map +1 -0
  11. package/dist/src/architecture/delta-renderer.d.ts +35 -0
  12. package/dist/src/architecture/delta-renderer.d.ts.map +1 -0
  13. package/dist/src/architecture/delta-renderer.js +329 -0
  14. package/dist/src/architecture/delta-renderer.js.map +1 -0
  15. package/dist/src/architecture/delta.d.ts +70 -0
  16. package/dist/src/architecture/delta.d.ts.map +1 -0
  17. package/dist/src/architecture/delta.js +342 -0
  18. package/dist/src/architecture/delta.js.map +1 -0
  19. package/dist/src/architecture/drilldown.d.ts +19 -1
  20. package/dist/src/architecture/drilldown.d.ts.map +1 -1
  21. package/dist/src/architecture/drilldown.js +5 -5
  22. package/dist/src/architecture/drilldown.js.map +1 -1
  23. package/dist/src/architecture/er-layout.d.ts +97 -0
  24. package/dist/src/architecture/er-layout.d.ts.map +1 -0
  25. package/dist/src/architecture/er-layout.js +344 -0
  26. package/dist/src/architecture/er-layout.js.map +1 -0
  27. package/dist/src/architecture/flow-layout.d.ts +22 -1
  28. package/dist/src/architecture/flow-layout.d.ts.map +1 -1
  29. package/dist/src/architecture/flow-layout.js +13 -9
  30. package/dist/src/architecture/flow-layout.js.map +1 -1
  31. package/dist/src/architecture/html-renderer.d.ts +4 -0
  32. package/dist/src/architecture/html-renderer.d.ts.map +1 -1
  33. package/dist/src/architecture/html-renderer.js +462 -20
  34. package/dist/src/architecture/html-renderer.js.map +1 -1
  35. package/dist/src/architecture/html-theme.d.ts +18 -0
  36. package/dist/src/architecture/html-theme.d.ts.map +1 -1
  37. package/dist/src/architecture/html-theme.js +101 -1
  38. package/dist/src/architecture/html-theme.js.map +1 -1
  39. package/dist/src/architecture/ir-schema.d.ts +358 -117
  40. package/dist/src/architecture/ir-schema.d.ts.map +1 -1
  41. package/dist/src/architecture/ir-schema.js +33 -1
  42. package/dist/src/architecture/ir-schema.js.map +1 -1
  43. package/dist/src/architecture/lifecycle-layout.d.ts +94 -0
  44. package/dist/src/architecture/lifecycle-layout.d.ts.map +1 -0
  45. package/dist/src/architecture/lifecycle-layout.js +471 -0
  46. package/dist/src/architecture/lifecycle-layout.js.map +1 -0
  47. package/dist/src/architecture/merge.d.ts.map +1 -1
  48. package/dist/src/architecture/merge.js +72 -2
  49. package/dist/src/architecture/merge.js.map +1 -1
  50. package/dist/src/architecture/store.d.ts +6 -1
  51. package/dist/src/architecture/store.d.ts.map +1 -1
  52. package/dist/src/architecture/store.js +75 -8
  53. package/dist/src/architecture/store.js.map +1 -1
  54. package/dist/src/architecture/types.d.ts +35 -3
  55. package/dist/src/architecture/types.d.ts.map +1 -1
  56. package/dist/src/architecture/types.js +13 -1
  57. package/dist/src/architecture/types.js.map +1 -1
  58. package/dist/src/architecture/validator.d.ts +27 -3
  59. package/dist/src/architecture/validator.d.ts.map +1 -1
  60. package/dist/src/architecture/validator.js +331 -8
  61. package/dist/src/architecture/validator.js.map +1 -1
  62. package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -1
  63. package/dist/src/mcp/tools/architecture-passthrough.js +91 -2
  64. package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -1
  65. package/package.json +1 -1
  66. package/plugin/.codex-plugin/plugin.json +1 -1
  67. package/plugin/.mcp.json +1 -1
  68. package/plugin/mcp.json +1 -1
  69. package/plugin/skills/architecture/SKILL.md +31 -5
  70. package/plugin/skills/architecture/references/domain-flow.md +1 -0
  71. package/plugin/skills/architecture/references/projections.md +56 -0
  72. package/plugin/skills/architecture/references/rerun.md +3 -1
  73. package/schemas/architecture-ir.schema.json +51 -3
@@ -0,0 +1,329 @@
1
+ import { CANVAS_PAD_TOP, CANVAS_PAD_X, LANE_INSET_Y, routeCanvas } from './canvas-geometry.js';
2
+ import { DELTA_CHANGES, } from './delta.js';
3
+ import { THEME_BOOT_SCRIPT } from './html-client.js';
4
+ import { escapeHtml, viewTitle } from './html-renderer.js';
5
+ import { renderTokenCss } from './html-theme.js';
6
+ import { NODE_KIND_SHORT } from './kind-text.js';
7
+ import { computeGraphLayout, environmentRank, FLAT_BACKWARD_EDGE_KINDS, laneOfNode, NODE_TEXT_LEFT, PARTITION_RANK, textUnits, } from './layout.js';
8
+ import { chipTextOverride, displayKindOf } from './types.js';
9
+ const EDGE_WIDTH = 1.5;
10
+ const ADDED_EDGE_WIDTH = 2.5;
11
+ const DASHED = '6 4';
12
+ const DOTTED = '1.5 4';
13
+ const BADGE_H = 18;
14
+ const BADGE_CHAR = 6.5;
15
+ const BADGE_PAD = 8;
16
+ const BADGE_GAP = 4;
17
+ const MARK_R = 8;
18
+ const CHIP_CHAR = 6.5;
19
+ const CHIP_GAP = 8;
20
+ const LEDGER_W = 320;
21
+ // 패널을 이보다 좁히면 카드 글자가 10px 아래로 내려가 읽히지 않는다. 그 밑은 가로 스크롤로 넘긴다
22
+ const MIN_SCALE = 0.75;
23
+ // 칸 사이 틈과 좌우 여백. 창이 세 칸 최소 폭보다 좁을 때만 옆으로 밀라는 안내가 보인다
24
+ const PAGE_CHROME = 80;
25
+ const BADGE_TEXT = {
26
+ ADDED: '+ 생김',
27
+ REMOVED: '− 빠짐',
28
+ CHANGED: 'Δ 변경',
29
+ MOVED: '→ 이동',
30
+ REWIRED: '↻ 다시 이음',
31
+ };
32
+ const MARK_TEXT = {
33
+ ADDED: '+',
34
+ REMOVED: '−',
35
+ CHANGED: 'Δ',
36
+ MOVED: '→',
37
+ REWIRED: '↻',
38
+ };
39
+ const COUNT_WORD = {
40
+ ADDED: '생김',
41
+ REMOVED: '빠짐',
42
+ CHANGED: '변경',
43
+ MOVED: '이동',
44
+ REWIRED: '다시 이음',
45
+ };
46
+ function r2(v) {
47
+ return Math.round(v * 100) / 100;
48
+ }
49
+ function nameOf(node) {
50
+ return node.displayName ?? node.label;
51
+ }
52
+ function routesOf(delta, scope) {
53
+ const out = [];
54
+ for (const e of delta.edges) {
55
+ if (!scope.edgeIds.has(e.id))
56
+ continue;
57
+ const { before: b, after: a, changes } = e;
58
+ if (b !== undefined && a !== undefined && b.from === a.from && b.to === a.to) {
59
+ out.push({ key: e.id, edgeId: e.id, panel: 'both', edge: a, changes });
60
+ continue;
61
+ }
62
+ if (b !== undefined)
63
+ out.push({ key: `before:${b.id}`, edgeId: e.id, panel: 'before', edge: b, changes });
64
+ if (a !== undefined)
65
+ out.push({ key: `after:${a.id}`, edgeId: e.id, panel: 'after', edge: a, changes });
66
+ }
67
+ return out;
68
+ }
69
+ /**
70
+ * 두 패널이 같이 쓰는 좌표. 합집합에 배치를 한 번만 돌린다.
71
+ * 패널마다 따로 돌리면 바뀌지 않은 노드까지 자리가 흔들려 없는 이동이 생긴 것처럼 읽힌다
72
+ */
73
+ export async function computeDeltaLayout(delta, scope) {
74
+ const nodes = delta.nodes
75
+ .filter((n) => scope.nodeIds.has(n.id))
76
+ .map((n) => {
77
+ const node = (n.after ?? n.before);
78
+ // 표시 이름이 바뀐 카드는 두 이름 중 긴 쪽으로 재야 두 패널의 카드 크기가 같다
79
+ const names = [n.before, n.after].flatMap((x) => (x ? [nameOf(x)] : []));
80
+ const longest = names.reduce((a, b) => (textUnits(b) > textUnits(a) ? b : a));
81
+ return {
82
+ id: n.id,
83
+ label: node.label,
84
+ ...(longest !== node.label ? { displayName: longest } : {}),
85
+ rank: PARTITION_RANK[node.kind],
86
+ lane: laneOfNode(node),
87
+ kind: displayKindOf(node),
88
+ ...(chipTextOverride(node) !== undefined ? { chip: chipTextOverride(node) } : {}),
89
+ ...(node.environment !== undefined ? { order: environmentRank(node.environment) } : {}),
90
+ secondLine: n.id,
91
+ };
92
+ });
93
+ const routes = routesOf(delta, scope);
94
+ const edges = routes.map((r) => ({
95
+ id: r.key,
96
+ from: r.edge.from,
97
+ to: r.edge.to,
98
+ ...(FLAT_BACKWARD_EDGE_KINDS.has(r.edge.kind) ? { backward: true } : {}),
99
+ }));
100
+ const layout = await computeGraphLayout(nodes, edges);
101
+ const canvas = routeCanvas(layout, routes.map((r) => ({
102
+ id: r.key,
103
+ from: r.edge.from,
104
+ to: r.edge.to,
105
+ width: r.changes.includes('ADDED') ? ADDED_EDGE_WIDTH : EDGE_WIDTH,
106
+ ...(FLAT_BACKWARD_EDGE_KINDS.has(r.edge.kind) ? { backward: true } : {}),
107
+ })));
108
+ return { layout, canvas, routes };
109
+ }
110
+ /**
111
+ * 공유본 배치. 가린 사본도 노드와 선 구성이 같으면 비공개본 좌표를 그대로 쓴다.
112
+ * 카드 폭이 원문 이름으로 잡히는 건 메인 공유본과 같은 기준이다. 구성이 다르면 다시 배치한다
113
+ */
114
+ export async function reuseDeltaLayout(base, delta, scope) {
115
+ const routes = routesOf(delta, scope);
116
+ const sig = (r) => `${r.key}|${r.edge.from}|${r.edge.to}|${r.changes.includes('ADDED') ? 1 : 0}`;
117
+ const baseRoutes = new Set(base.routes.map(sig));
118
+ const baseNodes = new Set(base.layout.nodes.map((n) => n.id));
119
+ const nodeIds = delta.nodes.filter((n) => scope.nodeIds.has(n.id)).map((n) => n.id);
120
+ const same = nodeIds.length === baseNodes.size &&
121
+ nodeIds.every((id) => baseNodes.has(id)) &&
122
+ routes.length === baseRoutes.size &&
123
+ routes.every((r) => baseRoutes.has(sig(r)));
124
+ if (!same)
125
+ return computeDeltaLayout(delta, scope);
126
+ return { layout: base.layout, canvas: base.canvas, routes };
127
+ }
128
+ /** 이전 | 변경 목록 | 이번 세 칸. 정적 페이지라 스크립트는 테마 고정 한 줄뿐이다 */
129
+ export function renderDeltaHtml(delta, scope, laid, opts) {
130
+ const title = `${viewTitle(delta.after.ir)} 구조 변경`;
131
+ const { canvas } = laid;
132
+ const minW = Math.ceil(canvas.width * MIN_SCALE);
133
+ const counts = DELTA_CHANGES.map((c) => [c, delta.ledger.filter((e) => e.change === c).length])
134
+ .filter(([, n]) => n > 0)
135
+ .map(([c, n]) => `${COUNT_WORD[c]} ${n}`)
136
+ .join(', ');
137
+ const scopeNote = scope.scoped
138
+ ? `<p class="dl-note">전체 구성 요소 ${scope.total.components}개 가운데 바뀐 것과 바로 이웃한 ${scope.nodeIds.size}개만 그렸어요.</p>`
139
+ : '';
140
+ return [
141
+ '<!doctype html>',
142
+ '<html lang="ko">',
143
+ '<head>',
144
+ '<meta charset="utf-8">',
145
+ '<meta name="viewport" content="width=device-width, initial-scale=1">',
146
+ `<title>${escapeHtml(title)}</title>`,
147
+ `<script>${THEME_BOOT_SCRIPT}</script>`,
148
+ `<style>${renderTokenCss()}\n${DELTA_CSS}\n@media (min-width: ${2 * minW + LEDGER_W + PAGE_CHROME}px) { .dl-hint { display: none; } }</style>`,
149
+ '</head>',
150
+ `<body data-audience="${opts.audience}">`,
151
+ '<header class="dl-head">',
152
+ `<h1>${escapeHtml(title)}</h1>`,
153
+ `<p class="dl-sum">${escapeHtml(counts)}</p>`,
154
+ scopeNote,
155
+ renderLegend(),
156
+ '</header>',
157
+ `<div class="dl-scroll" role="region" aria-label="구조 변경 비교" tabindex="0">`,
158
+ `<div class="dl-grid" style="grid-template-columns:minmax(${minW}px,${canvas.width}px) ${LEDGER_W}px minmax(${minW}px,${canvas.width}px)">`,
159
+ renderPanel(delta, laid, 'before'),
160
+ renderLedger(delta),
161
+ renderPanel(delta, laid, 'after'),
162
+ '</div>',
163
+ '</div>',
164
+ '<p class="dl-hint">화면이 좁으면 비교 칸을 옆으로 밀어 보세요.</p>',
165
+ '</body>',
166
+ '</html>',
167
+ '',
168
+ ].join('\n');
169
+ }
170
+ function renderLegend() {
171
+ const item = (cls, text, about) => `<li><span class="dl-badge ${cls}">${escapeHtml(text)}</span>${escapeHtml(about)}</li>`;
172
+ return ('<ul class="dl-legend" aria-label="읽는 법">' +
173
+ item('b-added', BADGE_TEXT.ADDED, '이번에만 있음, 굵은 테두리') +
174
+ item('b-removed', BADGE_TEXT.REMOVED, '이전에만 있음, 점 테두리') +
175
+ item('b-changed', BADGE_TEXT.CHANGED, '속성이 바뀜, 왼쪽 굵은 줄') +
176
+ item('b-moved', BADGE_TEXT.MOVED, '부모나 계정, 구간이 바뀜') +
177
+ item('b-rewired', BADGE_TEXT.REWIRED, '연결 끝이 바뀜') +
178
+ '<li><svg width="28" height="8" aria-hidden="true"><path d="M1 4H27" class="dl-edge" stroke-dasharray="6 4"/></svg>문서로만 확인한 연결</li>' +
179
+ '</ul>');
180
+ }
181
+ function panelDate(iso) {
182
+ return iso.slice(0, 16).replace('T', ' ');
183
+ }
184
+ function renderPanel(delta, laid, panel) {
185
+ const { layout, canvas, routes } = laid;
186
+ const snap = panel === 'before' ? delta.before : delta.after;
187
+ const label = panel === 'before' ? '이전' : '이번';
188
+ const boxes = new Map(layout.nodes.map((n) => [n.id, n]));
189
+ const lanes = layout.lanes
190
+ .map((l) => `<rect class="dl-lane" x="${r2(l.x + CANVAS_PAD_X)}" y="${LANE_INSET_Y}" width="${l.width}" height="${r2(canvas.height - LANE_INSET_Y * 2)}" rx="14"/>` +
191
+ `<text class="dl-lane-t" x="${r2(l.x + CANVAS_PAD_X + l.width / 2)}" y="${LANE_INSET_Y + 24}">${escapeHtml(l.title)}</text>`)
192
+ .join('');
193
+ const links = routes
194
+ .filter((r) => r.panel === 'both' || r.panel === panel)
195
+ .map((r) => {
196
+ const route = canvas.edges.get(r.key);
197
+ if (route === undefined)
198
+ return '';
199
+ const shown = r.changes;
200
+ const removed = shown.includes('REMOVED');
201
+ const added = shown.includes('ADDED');
202
+ const dash = removed
203
+ ? ` stroke-dasharray="${DOTTED}"`
204
+ : r.edge.lineStyle === 'dashed'
205
+ ? ` stroke-dasharray="${DASHED}"`
206
+ : '';
207
+ const cls = ['dl-edge', ...shown.map((c) => `c-${c.toLowerCase()}`)].join(' ');
208
+ const width = added ? ADDED_EDGE_WIDTH : EDGE_WIDTH;
209
+ const mark = shown.length > 0
210
+ ? `<g class="dl-mark"><circle cx="${route.mid.x}" cy="${route.mid.y}" r="${MARK_R}"/>` +
211
+ `<text x="${route.mid.x}" y="${r2(route.mid.y + 4)}">${shown.map((c) => MARK_TEXT[c]).join('')}</text></g>`
212
+ : '';
213
+ return (`<g class="dl-link" data-object-id="${escapeHtml(r.edgeId)}" data-status="${escapeHtml(shown.map((c) => c.toLowerCase()).join(' ') || 'unchanged')}" ` +
214
+ `data-from="${escapeHtml(r.edge.from)}" data-to="${escapeHtml(r.edge.to)}">` +
215
+ `<path class="${cls}" d="${route.d}" stroke-width="${width}"${dash}/><path class="dl-tip${removed ? ' c-removed' : ''}" d="${route.tip}"/>${mark}</g>`);
216
+ })
217
+ .join('');
218
+ let drawn = 0;
219
+ const cards = delta.nodes
220
+ .map((n) => {
221
+ const node = panel === 'before' ? n.before : n.after;
222
+ const box = boxes.get(n.id);
223
+ if (node === undefined || box === undefined)
224
+ return '';
225
+ drawn += 1;
226
+ return renderCard(node, box, n.changes, panel);
227
+ })
228
+ .join('');
229
+ // 그림 안 카드와 선은 role="img"에 가려 읽히지 않는다. 개수만 알리고 내용은 변경 목록으로 넘긴다
230
+ const svgLabel = `${label} 구조도, 구성 요소 ${drawn}개, 변경 ${delta.ledger.length}건. 자세한 내용은 변경 목록 참고`;
231
+ return (`<section class="dl-panel" data-snapshot="${panel}" aria-label="${label} 구조">` +
232
+ `<h2>${label}<span>${escapeHtml(panelDate(snap.ir.generatedAt))}</span></h2>` +
233
+ `<svg class="dl-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${canvas.width} ${canvas.height}" role="img" aria-label="${escapeHtml(svgLabel)}">` +
234
+ `<g>${lanes}</g><g>${links}</g><g>${cards}</g></svg></section>`);
235
+ }
236
+ function renderCard(node, box, changes, panel) {
237
+ const x = r2(box.x + CANVAS_PAD_X);
238
+ const y = r2(box.y + CANVAS_PAD_TOP);
239
+ const { width: w, height: h } = box;
240
+ const dk = displayKindOf(node);
241
+ const chip = chipTextOverride(node) ?? NODE_KIND_SHORT[dk];
242
+ // 이 카드에는 칩 아이콘이 없다. 레이아웃이 아이콘 몫까지 잰 폭은 이름 뒤 여백으로 남긴다
243
+ const nameX = r2(x + NODE_TEXT_LEFT + textUnits(chip) * CHIP_CHAR + CHIP_GAP);
244
+ const status = changes.length === 0 ? 'unchanged' : changes.map((c) => c.toLowerCase()).join(' ');
245
+ const cls = ['dl-card', ...changes.map((c) => `c-${c.toLowerCase()}`)].join(' ');
246
+ const inset = changes.includes('CHANGED')
247
+ ? `<rect class="dl-inset" x="${x}" y="${y}" width="5" height="${h}" rx="2"/>`
248
+ : '';
249
+ let bx = x + w - BADGE_PAD;
250
+ const badges = changes
251
+ .filter((c) => c === 'ADDED' ? panel === 'after' : c === 'REMOVED' ? panel === 'before' : true)
252
+ .slice()
253
+ .reverse()
254
+ .map((c) => {
255
+ const bw = Math.ceil(textUnits(BADGE_TEXT[c]) * BADGE_CHAR + 12);
256
+ bx -= bw;
257
+ const out = `<g class="dl-badge-g b-${c.toLowerCase()}"><rect x="${r2(bx)}" y="${r2(y - BADGE_H / 2)}" width="${bw}" height="${BADGE_H}" rx="9"/>` +
258
+ `<text x="${r2(bx + bw / 2)}" y="${r2(y + 4)}">${escapeHtml(BADGE_TEXT[c])}</text></g>`;
259
+ bx -= BADGE_GAP;
260
+ return out;
261
+ })
262
+ .join('');
263
+ const name = nameOf(node);
264
+ return (`<g class="dl-node" data-object-id="${escapeHtml(node.id)}" data-status="${escapeHtml(status)}">` +
265
+ `<title>${escapeHtml(`${name} (${node.id})`)}</title>` +
266
+ `<rect class="${cls}" x="${x}" y="${y}" width="${w}" height="${h}" rx="10"/>${inset}` +
267
+ `<text class="dl-chip" x="${r2(x + NODE_TEXT_LEFT)}" y="${r2(y + 25)}">${escapeHtml(chip)}</text>` +
268
+ `<text class="dl-name" x="${nameX}" y="${r2(y + 25)}">${escapeHtml(name)}</text>` +
269
+ `<text class="dl-id" x="${r2(x + NODE_TEXT_LEFT)}" y="${r2(y + 45)}">${escapeHtml(node.id)}</text>` +
270
+ `${badges}</g>`);
271
+ }
272
+ function renderLedger(delta) {
273
+ const items = delta.ledger
274
+ .map((e) => `<li data-change="${e.change}" data-target="${escapeHtml(e.target)}">` +
275
+ `<span class="dl-word">${e.change}</span> <code>${escapeHtml(e.target)}</code>` +
276
+ `<p>${escapeHtml(e.text)}</p></li>`)
277
+ .join('');
278
+ return ('<section class="dl-ledger" aria-label="변경 목록">' +
279
+ `<h2>변경 목록<span>${delta.ledger.length}건</span></h2>` +
280
+ (items !== ''
281
+ ? `<ol>${items}</ol>`
282
+ : '<p class="dl-empty">이 사본에서 보이는 변경은 없어요.</p>') +
283
+ '</section>');
284
+ }
285
+ const DELTA_CSS = `* { box-sizing: border-box; }
286
+ body { margin: 0; background: var(--bg); color: var(--text); font: 14px/1.5 var(--font); -webkit-font-smoothing: antialiased; }
287
+ .dl-head { padding: 20px 24px 8px; }
288
+ .dl-head h1 { margin: 0; font-size: 18px; font-weight: 700; }
289
+ .dl-sum { margin: 4px 0 0; color: var(--muted); font-size: 13px; }
290
+ .dl-note { margin: 4px 0 0; color: var(--warn); font-size: 13px; }
291
+ .dl-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 12px 0 0; padding: 0; list-style: none; font-size: 12px; color: var(--muted); }
292
+ .dl-legend li { display: inline-flex; align-items: center; gap: 6px; }
293
+ .dl-badge { display: inline-block; padding: 0 7px; border-radius: 9px; font-size: 11px; line-height: 18px; color: var(--text); background: var(--surface); border: 1px solid var(--border-strong); }
294
+ .dl-badge.b-removed { border-style: dashed; }
295
+ .dl-scroll { overflow-x: auto; padding: 8px 24px 16px; }
296
+ .dl-scroll:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
297
+ .dl-grid { display: grid; gap: 16px; align-items: start; }
298
+ .dl-panel, .dl-ledger { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; min-width: 0; }
299
+ .dl-panel h2, .dl-ledger h2 { display: flex; align-items: baseline; gap: 8px; margin: 0; padding: 12px 16px; font-size: 14px; font-weight: 700; border-bottom: 1px solid var(--border); }
300
+ .dl-panel h2 span, .dl-ledger h2 span { font-size: 12px; font-weight: 400; color: var(--muted); }
301
+ .dl-svg { display: block; width: 100%; height: auto; }
302
+ .dl-lane { fill: var(--lane); stroke: var(--lane-line); stroke-width: 1; }
303
+ .dl-lane-t { fill: var(--muted); font-size: 12px; font-weight: 600; text-anchor: middle; }
304
+ .dl-edge { fill: none; stroke: var(--edge); stroke-linecap: round; }
305
+ .dl-edge.c-added { stroke: var(--edge-strong); }
306
+ .dl-edge.c-removed { opacity: 0.8; }
307
+ .dl-tip { fill: var(--edge); stroke: none; }
308
+ .dl-tip.c-removed { opacity: 0.8; }
309
+ .dl-mark circle { fill: var(--surface); stroke: var(--edge-strong); stroke-width: 1.25; }
310
+ .dl-mark text { fill: var(--text); font-size: 11px; font-weight: 700; text-anchor: middle; }
311
+ .dl-card { fill: var(--surface); stroke: var(--border-strong); stroke-width: 1; }
312
+ .dl-card.c-added { stroke: var(--edge-strong); stroke-width: 2.5; }
313
+ .dl-card.c-removed { fill: var(--surface-2); stroke: var(--edge-strong); stroke-width: 1.5; stroke-dasharray: 2 4; stroke-linecap: round; }
314
+ .dl-inset { fill: var(--edge-strong); }
315
+ .dl-chip { fill: var(--muted); font-size: 10.5px; font-weight: 600; }
316
+ .dl-name { fill: var(--text); font-size: 13px; font-weight: 650; }
317
+ .dl-id { fill: var(--muted); font: 11px var(--mono); }
318
+ .dl-badge-g rect { fill: var(--surface); stroke: var(--edge-strong); stroke-width: 1; }
319
+ .dl-badge-g.b-removed rect { stroke-dasharray: 3 2; }
320
+ .dl-badge-g text { fill: var(--text); font-size: 10.5px; font-weight: 650; text-anchor: middle; }
321
+ .dl-ledger ol { margin: 0; padding: 4px 0; list-style: none; }
322
+ .dl-ledger li { padding: 10px 16px; border-bottom: 1px solid var(--border); }
323
+ .dl-ledger li:last-child { border-bottom: 0; }
324
+ .dl-word { font-weight: 800; font-size: 12px; letter-spacing: 0.04em; color: var(--accent); }
325
+ .dl-ledger code { font: 12px var(--mono); color: var(--text); word-break: break-all; }
326
+ .dl-ledger p { margin: 4px 0 0; font-size: 13px; color: var(--text); overflow-wrap: anywhere; }
327
+ .dl-empty { margin: 0; padding: 12px 16px; font-size: 13px; color: var(--muted); }
328
+ .dl-hint { margin: 0 24px 16px; font-size: 12px; color: var(--muted); }`;
329
+ //# sourceMappingURL=delta-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-renderer.js","sourceRoot":"","sources":["../../../src/architecture/delta-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { ArchitectureEdge, ArchitectureIr, ArchitectureNode } from './types.js';
2
+ export type DeltaChange = 'ADDED' | 'REMOVED' | 'CHANGED' | 'MOVED' | 'REWIRED';
3
+ /** 원장 정렬 순서. 대상 id보다 먼저 본다 */
4
+ export declare const DELTA_CHANGES: readonly DeltaChange[];
5
+ /** 그림 한 장의 한쪽. 그려지는 것만 비교해야 화면에 없던 노드가 "생겼다"로 잡히지 않는다 */
6
+ export interface DeltaSnapshot {
7
+ ir: ArchitectureIr;
8
+ nodeIds: ReadonlySet<string>;
9
+ edgeIds: ReadonlySet<string>;
10
+ }
11
+ export interface DeltaNode {
12
+ id: string;
13
+ before?: ArchitectureNode;
14
+ after?: ArchitectureNode;
15
+ changes: DeltaChange[];
16
+ }
17
+ export interface DeltaEdge {
18
+ /** 원장 대상 id. 다시 이은 엣지는 이번 쪽 id다 */
19
+ id: string;
20
+ before?: ArchitectureEdge;
21
+ after?: ArchitectureEdge;
22
+ changes: DeltaChange[];
23
+ }
24
+ export interface DeltaEntry {
25
+ change: DeltaChange;
26
+ target: string;
27
+ object: 'node' | 'edge';
28
+ /** 대문자 변경어 뒤에 붙는 설명 */
29
+ text: string;
30
+ }
31
+ export interface ArchitectureDelta {
32
+ before: DeltaSnapshot;
33
+ after: DeltaSnapshot;
34
+ /** 두 쪽 합집합. id 순 */
35
+ nodes: DeltaNode[];
36
+ edges: DeltaEdge[];
37
+ ledger: DeltaEntry[];
38
+ }
39
+ /** 참고 자료의 한 장 예산. 남는 id는 한 번만 센다 */
40
+ export declare const DELTA_BUDGET: {
41
+ readonly components: 8;
42
+ readonly relationships: 10;
43
+ readonly ledger: 8;
44
+ };
45
+ export type DeltaCounts = Record<keyof typeof DELTA_BUDGET, number>;
46
+ /**
47
+ * 이전 그림과 이번 그림을 id로 맞춰 바뀐 것을 뽑는다.
48
+ * render가 병합으로 이전 id를 물려준 뒤라 같은 것은 같은 id다. label이 병합 키라 이름을 바꾸면 빠짐과 생김 두 건이 된다.
49
+ */
50
+ export declare function computeArchitectureDelta(before: DeltaSnapshot, after: DeltaSnapshot): ArchitectureDelta;
51
+ export interface DeltaScope {
52
+ nodeIds: Set<string>;
53
+ /** DeltaEdge id */
54
+ edgeIds: Set<string>;
55
+ /** 전체가 예산을 넘어 바뀐 노드와 그 이웃만 남겼으면 true */
56
+ scoped: boolean;
57
+ /** 좁히기 전 합집합 크기 */
58
+ total: {
59
+ components: number;
60
+ relationships: number;
61
+ };
62
+ }
63
+ /**
64
+ * 그릴 범위. 합집합이 예산 안이면 전부 그린다. 넘으면 바뀐 노드와 바뀐 엣지의 끝, 그 1홉 이웃만 남긴다.
65
+ * 바뀌지 않은 먼 노드까지 그리면 큰 그림에서 변경이 묻힌다
66
+ */
67
+ export declare function deltaScope(delta: ArchitectureDelta): DeltaScope;
68
+ export declare function deltaCounts(delta: ArchitectureDelta, scope: DeltaScope): DeltaCounts;
69
+ export declare function deltaOverBudget(counts: DeltaCounts): string[];
70
+ //# sourceMappingURL=delta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../../src/architecture/delta.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAc,MAAM,YAAY,CAAC;AAGjG,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhF,8BAA8B;AAC9B,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAM/C,CAAC;AAEF,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,oBAAoB;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,oCAAoC;AACpC,eAAO,MAAM,YAAY;;;;CAA2D,CAAC;AAErF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,OAAO,YAAY,EAAE,MAAM,CAAC,CAAC;AA4GpE;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,GACnB,iBAAiB,CA4GnB;AA2FD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,mBAAmB;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB;IACnB,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU,CAuB/D;AAWD,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,CAMpF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAI7D"}