@tienne/gestalt 0.95.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.
- package/CLAUDE.md +5 -3
- package/README.ko.md +1 -0
- package/README.md +1 -0
- package/dist/package.json +4 -3
- package/dist/plugin/skills/_shared/agent-model.md +5 -3
- package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
- package/dist/plugin/skills/agent/SKILL.md +1 -1
- package/dist/plugin/skills/architecture/SKILL.md +31 -5
- package/dist/plugin/skills/architecture/references/domain-flow.md +1 -0
- package/dist/plugin/skills/architecture/references/projections.md +56 -0
- package/dist/plugin/skills/architecture/references/rerun.md +3 -1
- package/dist/plugin/skills/blast-radius/SKILL.md +1 -1
- package/dist/plugin/skills/build-graph/SKILL.md +1 -1
- package/dist/plugin/skills/doubt/SKILL.md +229 -0
- package/dist/plugin/skills/execute/SKILL.md +13 -1
- package/dist/plugin/skills/explain/SKILL.md +1 -1
- package/dist/plugin/skills/interview/SKILL.md +1 -1
- package/dist/plugin/skills/local-pr/SKILL.md +14 -1
- package/dist/plugin/skills/pr/SKILL.md +14 -1
- package/dist/plugin/skills/review/SKILL.md +14 -1
- package/dist/plugin/skills/review-loop/SKILL.md +13 -0
- package/dist/plugin/skills/review-reply/SKILL.md +13 -0
- package/dist/plugin/skills/ship/SKILL.md +14 -1
- package/dist/plugin/skills/solve/SKILL.md +1 -1
- package/dist/plugin/skills/spec/SKILL.md +1 -1
- package/dist/schemas/architecture-ir.schema.json +51 -3
- package/dist/schemas/gestalt.schema.json +12 -0
- package/dist/src/architecture/blueprint-layout.d.ts +105 -0
- package/dist/src/architecture/blueprint-layout.d.ts.map +1 -0
- package/dist/src/architecture/blueprint-layout.js +297 -0
- package/dist/src/architecture/blueprint-layout.js.map +1 -0
- package/dist/src/architecture/delta-renderer.d.ts +35 -0
- package/dist/src/architecture/delta-renderer.d.ts.map +1 -0
- package/dist/src/architecture/delta-renderer.js +329 -0
- package/dist/src/architecture/delta-renderer.js.map +1 -0
- package/dist/src/architecture/delta.d.ts +70 -0
- package/dist/src/architecture/delta.d.ts.map +1 -0
- package/dist/src/architecture/delta.js +342 -0
- package/dist/src/architecture/delta.js.map +1 -0
- package/dist/src/architecture/drilldown.d.ts +19 -1
- package/dist/src/architecture/drilldown.d.ts.map +1 -1
- package/dist/src/architecture/drilldown.js +5 -5
- package/dist/src/architecture/drilldown.js.map +1 -1
- package/dist/src/architecture/er-layout.d.ts +97 -0
- package/dist/src/architecture/er-layout.d.ts.map +1 -0
- package/dist/src/architecture/er-layout.js +344 -0
- package/dist/src/architecture/er-layout.js.map +1 -0
- package/dist/src/architecture/flow-layout.d.ts +22 -1
- package/dist/src/architecture/flow-layout.d.ts.map +1 -1
- package/dist/src/architecture/flow-layout.js +13 -9
- package/dist/src/architecture/flow-layout.js.map +1 -1
- package/dist/src/architecture/html-renderer.d.ts +4 -0
- package/dist/src/architecture/html-renderer.d.ts.map +1 -1
- package/dist/src/architecture/html-renderer.js +462 -20
- package/dist/src/architecture/html-renderer.js.map +1 -1
- package/dist/src/architecture/html-theme.d.ts +18 -0
- package/dist/src/architecture/html-theme.d.ts.map +1 -1
- package/dist/src/architecture/html-theme.js +101 -1
- package/dist/src/architecture/html-theme.js.map +1 -1
- package/dist/src/architecture/ir-schema.d.ts +358 -117
- package/dist/src/architecture/ir-schema.d.ts.map +1 -1
- package/dist/src/architecture/ir-schema.js +33 -1
- package/dist/src/architecture/ir-schema.js.map +1 -1
- package/dist/src/architecture/lifecycle-layout.d.ts +94 -0
- package/dist/src/architecture/lifecycle-layout.d.ts.map +1 -0
- package/dist/src/architecture/lifecycle-layout.js +471 -0
- package/dist/src/architecture/lifecycle-layout.js.map +1 -0
- package/dist/src/architecture/merge.d.ts.map +1 -1
- package/dist/src/architecture/merge.js +72 -2
- package/dist/src/architecture/merge.js.map +1 -1
- package/dist/src/architecture/store.d.ts +6 -1
- package/dist/src/architecture/store.d.ts.map +1 -1
- package/dist/src/architecture/store.js +75 -8
- package/dist/src/architecture/store.js.map +1 -1
- package/dist/src/architecture/types.d.ts +35 -3
- package/dist/src/architecture/types.d.ts.map +1 -1
- package/dist/src/architecture/types.js +13 -1
- package/dist/src/architecture/types.js.map +1 -1
- package/dist/src/architecture/validator.d.ts +27 -3
- package/dist/src/architecture/validator.d.ts.map +1 -1
- package/dist/src/architecture/validator.js +331 -8
- package/dist/src/architecture/validator.js.map +1 -1
- package/dist/src/core/config.d.ts +18 -0
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +14 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/hooks-env.d.ts +7 -2
- package/dist/src/core/hooks-env.d.ts.map +1 -1
- package/dist/src/core/hooks-env.js +7 -2
- package/dist/src/core/hooks-env.js.map +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.js +91 -2
- package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -1
- package/package.json +4 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/skills/_shared/agent-model.md +5 -3
- package/plugin/skills/_shared/proactive-routing.md +1 -0
- package/plugin/skills/agent/SKILL.md +1 -1
- package/plugin/skills/architecture/SKILL.md +31 -5
- package/plugin/skills/architecture/references/domain-flow.md +1 -0
- package/plugin/skills/architecture/references/projections.md +56 -0
- package/plugin/skills/architecture/references/rerun.md +3 -1
- package/plugin/skills/blast-radius/SKILL.md +1 -1
- package/plugin/skills/build-graph/SKILL.md +1 -1
- package/plugin/skills/doubt/SKILL.md +229 -0
- package/plugin/skills/execute/SKILL.md +13 -1
- package/plugin/skills/explain/SKILL.md +1 -1
- package/plugin/skills/interview/SKILL.md +1 -1
- package/plugin/skills/local-pr/SKILL.md +14 -1
- package/plugin/skills/pr/SKILL.md +14 -1
- package/plugin/skills/review/SKILL.md +14 -1
- package/plugin/skills/review-loop/SKILL.md +13 -0
- package/plugin/skills/review-reply/SKILL.md +13 -0
- package/plugin/skills/ship/SKILL.md +14 -1
- package/plugin/skills/solve/SKILL.md +1 -1
- package/plugin/skills/spec/SKILL.md +1 -1
- package/schemas/architecture-ir.schema.json +51 -3
- package/schemas/gestalt.schema.json +12 -0
|
@@ -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"}
|