@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.
Files changed (120) hide show
  1. package/CLAUDE.md +5 -3
  2. package/README.ko.md +1 -0
  3. package/README.md +1 -0
  4. package/dist/package.json +4 -3
  5. package/dist/plugin/skills/_shared/agent-model.md +5 -3
  6. package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
  7. package/dist/plugin/skills/agent/SKILL.md +1 -1
  8. package/dist/plugin/skills/architecture/SKILL.md +31 -5
  9. package/dist/plugin/skills/architecture/references/domain-flow.md +1 -0
  10. package/dist/plugin/skills/architecture/references/projections.md +56 -0
  11. package/dist/plugin/skills/architecture/references/rerun.md +3 -1
  12. package/dist/plugin/skills/blast-radius/SKILL.md +1 -1
  13. package/dist/plugin/skills/build-graph/SKILL.md +1 -1
  14. package/dist/plugin/skills/doubt/SKILL.md +229 -0
  15. package/dist/plugin/skills/execute/SKILL.md +13 -1
  16. package/dist/plugin/skills/explain/SKILL.md +1 -1
  17. package/dist/plugin/skills/interview/SKILL.md +1 -1
  18. package/dist/plugin/skills/local-pr/SKILL.md +14 -1
  19. package/dist/plugin/skills/pr/SKILL.md +14 -1
  20. package/dist/plugin/skills/review/SKILL.md +14 -1
  21. package/dist/plugin/skills/review-loop/SKILL.md +13 -0
  22. package/dist/plugin/skills/review-reply/SKILL.md +13 -0
  23. package/dist/plugin/skills/ship/SKILL.md +14 -1
  24. package/dist/plugin/skills/solve/SKILL.md +1 -1
  25. package/dist/plugin/skills/spec/SKILL.md +1 -1
  26. package/dist/schemas/architecture-ir.schema.json +51 -3
  27. package/dist/schemas/gestalt.schema.json +12 -0
  28. package/dist/src/architecture/blueprint-layout.d.ts +105 -0
  29. package/dist/src/architecture/blueprint-layout.d.ts.map +1 -0
  30. package/dist/src/architecture/blueprint-layout.js +297 -0
  31. package/dist/src/architecture/blueprint-layout.js.map +1 -0
  32. package/dist/src/architecture/delta-renderer.d.ts +35 -0
  33. package/dist/src/architecture/delta-renderer.d.ts.map +1 -0
  34. package/dist/src/architecture/delta-renderer.js +329 -0
  35. package/dist/src/architecture/delta-renderer.js.map +1 -0
  36. package/dist/src/architecture/delta.d.ts +70 -0
  37. package/dist/src/architecture/delta.d.ts.map +1 -0
  38. package/dist/src/architecture/delta.js +342 -0
  39. package/dist/src/architecture/delta.js.map +1 -0
  40. package/dist/src/architecture/drilldown.d.ts +19 -1
  41. package/dist/src/architecture/drilldown.d.ts.map +1 -1
  42. package/dist/src/architecture/drilldown.js +5 -5
  43. package/dist/src/architecture/drilldown.js.map +1 -1
  44. package/dist/src/architecture/er-layout.d.ts +97 -0
  45. package/dist/src/architecture/er-layout.d.ts.map +1 -0
  46. package/dist/src/architecture/er-layout.js +344 -0
  47. package/dist/src/architecture/er-layout.js.map +1 -0
  48. package/dist/src/architecture/flow-layout.d.ts +22 -1
  49. package/dist/src/architecture/flow-layout.d.ts.map +1 -1
  50. package/dist/src/architecture/flow-layout.js +13 -9
  51. package/dist/src/architecture/flow-layout.js.map +1 -1
  52. package/dist/src/architecture/html-renderer.d.ts +4 -0
  53. package/dist/src/architecture/html-renderer.d.ts.map +1 -1
  54. package/dist/src/architecture/html-renderer.js +462 -20
  55. package/dist/src/architecture/html-renderer.js.map +1 -1
  56. package/dist/src/architecture/html-theme.d.ts +18 -0
  57. package/dist/src/architecture/html-theme.d.ts.map +1 -1
  58. package/dist/src/architecture/html-theme.js +101 -1
  59. package/dist/src/architecture/html-theme.js.map +1 -1
  60. package/dist/src/architecture/ir-schema.d.ts +358 -117
  61. package/dist/src/architecture/ir-schema.d.ts.map +1 -1
  62. package/dist/src/architecture/ir-schema.js +33 -1
  63. package/dist/src/architecture/ir-schema.js.map +1 -1
  64. package/dist/src/architecture/lifecycle-layout.d.ts +94 -0
  65. package/dist/src/architecture/lifecycle-layout.d.ts.map +1 -0
  66. package/dist/src/architecture/lifecycle-layout.js +471 -0
  67. package/dist/src/architecture/lifecycle-layout.js.map +1 -0
  68. package/dist/src/architecture/merge.d.ts.map +1 -1
  69. package/dist/src/architecture/merge.js +72 -2
  70. package/dist/src/architecture/merge.js.map +1 -1
  71. package/dist/src/architecture/store.d.ts +6 -1
  72. package/dist/src/architecture/store.d.ts.map +1 -1
  73. package/dist/src/architecture/store.js +75 -8
  74. package/dist/src/architecture/store.js.map +1 -1
  75. package/dist/src/architecture/types.d.ts +35 -3
  76. package/dist/src/architecture/types.d.ts.map +1 -1
  77. package/dist/src/architecture/types.js +13 -1
  78. package/dist/src/architecture/types.js.map +1 -1
  79. package/dist/src/architecture/validator.d.ts +27 -3
  80. package/dist/src/architecture/validator.d.ts.map +1 -1
  81. package/dist/src/architecture/validator.js +331 -8
  82. package/dist/src/architecture/validator.js.map +1 -1
  83. package/dist/src/core/config.d.ts +18 -0
  84. package/dist/src/core/config.d.ts.map +1 -1
  85. package/dist/src/core/config.js +14 -1
  86. package/dist/src/core/config.js.map +1 -1
  87. package/dist/src/core/hooks-env.d.ts +7 -2
  88. package/dist/src/core/hooks-env.d.ts.map +1 -1
  89. package/dist/src/core/hooks-env.js +7 -2
  90. package/dist/src/core/hooks-env.js.map +1 -1
  91. package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -1
  92. package/dist/src/mcp/tools/architecture-passthrough.js +91 -2
  93. package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -1
  94. package/package.json +4 -3
  95. package/plugin/.codex-plugin/plugin.json +1 -1
  96. package/plugin/.mcp.json +1 -1
  97. package/plugin/mcp.json +1 -1
  98. package/plugin/skills/_shared/agent-model.md +5 -3
  99. package/plugin/skills/_shared/proactive-routing.md +1 -0
  100. package/plugin/skills/agent/SKILL.md +1 -1
  101. package/plugin/skills/architecture/SKILL.md +31 -5
  102. package/plugin/skills/architecture/references/domain-flow.md +1 -0
  103. package/plugin/skills/architecture/references/projections.md +56 -0
  104. package/plugin/skills/architecture/references/rerun.md +3 -1
  105. package/plugin/skills/blast-radius/SKILL.md +1 -1
  106. package/plugin/skills/build-graph/SKILL.md +1 -1
  107. package/plugin/skills/doubt/SKILL.md +229 -0
  108. package/plugin/skills/execute/SKILL.md +13 -1
  109. package/plugin/skills/explain/SKILL.md +1 -1
  110. package/plugin/skills/interview/SKILL.md +1 -1
  111. package/plugin/skills/local-pr/SKILL.md +14 -1
  112. package/plugin/skills/pr/SKILL.md +14 -1
  113. package/plugin/skills/review/SKILL.md +14 -1
  114. package/plugin/skills/review-loop/SKILL.md +13 -0
  115. package/plugin/skills/review-reply/SKILL.md +13 -0
  116. package/plugin/skills/ship/SKILL.md +14 -1
  117. package/plugin/skills/solve/SKILL.md +1 -1
  118. package/plugin/skills/spec/SKILL.md +1 -1
  119. package/schemas/architecture-ir.schema.json +51 -3
  120. package/schemas/gestalt.schema.json +12 -0
@@ -0,0 +1,471 @@
1
+ import { columnsOf, stepPathOf } from './flow-layout.js';
2
+ import { textUnits } from './layout.js';
3
+ export const LIFECYCLE_BAND_TEXT = {
4
+ rail: '진행 단계',
5
+ recovery: '대기와 복구',
6
+ terminal: '끝 상태',
7
+ };
8
+ /** 상태 흐름 한 장의 예산. 넘으면 그리긴 하되 경고로 흐름을 나누라고 알린다 */
9
+ export const LIFECYCLE_BUDGET = {
10
+ phases: 5,
11
+ recovery: 2,
12
+ terminal: 2,
13
+ states: 9,
14
+ transitions: 10,
15
+ };
16
+ const COUNT_TEXT = {
17
+ phases: '진행 단계',
18
+ recovery: '대기와 복구',
19
+ terminal: '끝 상태',
20
+ states: '전체 상태',
21
+ transitions: '전이',
22
+ };
23
+ function transitionText(t) {
24
+ if (t.trigger !== undefined || t.condition !== undefined) {
25
+ return [t.condition, t.trigger].filter((x) => x !== undefined).join(' ');
26
+ }
27
+ return t.label ?? '';
28
+ }
29
+ /**
30
+ * 흐름에서 상태와 상태 사이 전이를 뽑는다. state가 없는 단계는 건너뛰고 그 앞뒤 전이를 이어 붙인다.
31
+ * 알림 발송처럼 상태를 안 바꾸는 단계가 상태 흐름에 끼면 대상이 거치는 상태가 아니라 일의 순서가 된다
32
+ */
33
+ export function deriveLifecycle(flow, drawableSteps, drawableTransitions) {
34
+ const steps = flow.steps.filter((s) => drawableSteps.has(s.id));
35
+ const stepById = new Map(steps.map((s) => [s.id, s]));
36
+ const transitions = flow.transitions.filter((t) => drawableTransitions.has(t.id) && stepById.has(t.from) && stepById.has(t.to));
37
+ const pathOf = stepPathOf(transitions);
38
+ const { column, back } = columnsOf(steps, transitions, (id) => pathOf(id) === 'main');
39
+ const out = new Map();
40
+ for (const t of transitions)
41
+ out.set(t.from, [...(out.get(t.from) ?? []), t]);
42
+ const grouped = new Map();
43
+ for (const s of steps) {
44
+ if (s.state === undefined)
45
+ continue;
46
+ grouped.set(s.state, [...(grouped.get(s.state) ?? []), s]);
47
+ }
48
+ const declared = [...grouped.keys()];
49
+ const merged = new Map();
50
+ for (const src of steps) {
51
+ if (src.state === undefined)
52
+ continue;
53
+ const seen = new Set([src.id]);
54
+ const record = (from, dest, chain) => {
55
+ const texts = chain.map(transitionText).filter((x) => x !== '');
56
+ const label = texts.length > 0 ? texts.join(', ') : dest.label;
57
+ const solid = chain.every((t) => t.lineStyle === 'solid');
58
+ const main = chain.every((t) => t.path === 'main');
59
+ const lead = chain.find((t) => transitionText(t) !== '') ?? chain[chain.length - 1];
60
+ const key = `${from}\u0000${dest.state}`;
61
+ const prev = merged.get(key);
62
+ if (prev === undefined) {
63
+ merged.set(key, {
64
+ id: lead.id,
65
+ from,
66
+ to: dest.state,
67
+ label,
68
+ borrowed: texts.length === 0,
69
+ transitions: chain.map((t) => t.id),
70
+ path: main ? 'main' : 'side',
71
+ lineStyle: solid ? 'solid' : 'dashed',
72
+ });
73
+ return;
74
+ }
75
+ const labels = prev.borrowed ? [] : prev.label.split(', ');
76
+ if (texts.length > 0) {
77
+ for (const x of texts)
78
+ if (!labels.includes(x))
79
+ labels.push(x);
80
+ }
81
+ merged.set(key, {
82
+ ...prev,
83
+ label: labels.length > 0 ? labels.join(', ') : prev.label,
84
+ borrowed: labels.length === 0,
85
+ transitions: [...new Set([...prev.transitions, ...chain.map((t) => t.id)])],
86
+ path: prev.path === 'main' || main ? 'main' : 'side',
87
+ lineStyle: prev.lineStyle === 'solid' || solid ? 'solid' : 'dashed',
88
+ });
89
+ };
90
+ const walk = (at, chain) => {
91
+ for (const t of out.get(at) ?? []) {
92
+ const next = [...chain, t];
93
+ const dest = stepById.get(t.to);
94
+ if (dest.state === undefined) {
95
+ if (seen.has(dest.id))
96
+ continue;
97
+ seen.add(dest.id);
98
+ walk(dest.id, next);
99
+ continue;
100
+ }
101
+ // 같은 상태 안에서 앞으로만 간 건 상태가 안 바뀐 것이다. 되돌아와 다시 들어간 것만 고리로 남긴다
102
+ if (dest.state === src.state && dest.id !== src.id && !next.some((x) => back.has(x.id))) {
103
+ continue;
104
+ }
105
+ record(src.state, dest, next);
106
+ }
107
+ };
108
+ walk(src.id, []);
109
+ }
110
+ const states = declared.map((state) => {
111
+ const list = grouped.get(state);
112
+ const end = list.find((s) => s.terminal === true);
113
+ const main = list.some((s) => pathOf(s.id) === 'main');
114
+ const outcome = end?.outcome;
115
+ const band = end !== undefined
116
+ ? main && (outcome === undefined || outcome === 'done')
117
+ ? 'rail'
118
+ : 'terminal'
119
+ : main
120
+ ? 'rail'
121
+ : 'recovery';
122
+ return {
123
+ state,
124
+ band,
125
+ terminal: end !== undefined,
126
+ ...(outcome !== undefined ? { outcome } : {}),
127
+ steps: list.map((s) => s.id),
128
+ rep: list[0].id,
129
+ docOnly: list.every((s) => s.evidence.every((ev) => ev.type !== 'code' && ev.type !== 'spec')),
130
+ };
131
+ });
132
+ // 진행 줄은 흐름의 열 순서를 따르고 정상 완료는 그 끝에 선다
133
+ const colOf = (s) => Math.min(...s.steps.map((id) => column.get(id)));
134
+ const rank = new Map(declared.map((s, i) => [s, i]));
135
+ states.sort((a, b) => Number(a.terminal) - Number(b.terminal) ||
136
+ colOf(a) - colOf(b) ||
137
+ rank.get(a.state) - rank.get(b.state));
138
+ const order = new Map(states.map((s, i) => [s.state, i]));
139
+ const lifecycleTransitions = [...merged.values()].sort((a, b) => order.get(a.from) - order.get(b.from) ||
140
+ order.get(a.to) - order.get(b.to) ||
141
+ (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
142
+ return { states, transitions: lifecycleTransitions };
143
+ }
144
+ // 띠 단위로 센다. 정상 완료는 진행 단계 띠 끝에 서므로 끝 상태 예산이 아니라 진행 단계 예산을 쓴다
145
+ export function lifecycleCounts(model) {
146
+ return {
147
+ phases: model.states.filter((s) => s.band === 'rail').length,
148
+ recovery: model.states.filter((s) => s.band === 'recovery').length,
149
+ terminal: model.states.filter((s) => s.band === 'terminal').length,
150
+ states: model.states.length,
151
+ transitions: model.transitions.length,
152
+ };
153
+ }
154
+ /** 예산을 넘은 항목을 사람이 읽는 글로. 안 넘었으면 빈 배열이다 */
155
+ export function lifecycleOverBudget(counts) {
156
+ return Object.keys(LIFECYCLE_BUDGET)
157
+ .filter((k) => counts[k] > LIFECYCLE_BUDGET[k])
158
+ .map((k) => `${COUNT_TEXT[k]} ${counts[k]}개 (예산 ${LIFECYCLE_BUDGET[k]})`);
159
+ }
160
+ // 끝 상태 카드는 결과 배지, 상태 코드, 단계 이름을 한 줄에 싣는다. 168이면 영문 코드가 잘린다
161
+ export const LIFECYCLE_BOX_W = 196;
162
+ export const LIFECYCLE_BOX_H = 60;
163
+ const PAD_X = 24;
164
+ const BAND_HEAD = 34;
165
+ const BAND_PAD_BOTTOM = 20;
166
+ const BAND_GAP_MIN = 40;
167
+ const TRACK = 22;
168
+ const LANE = 22;
169
+ const COL_GAP_MIN = 72;
170
+ const COL_GAP_MAX = 240;
171
+ const LOWER_GAP = 40;
172
+ const LABEL_UNIT = 6;
173
+ const TIP_LENGTH = 8;
174
+ const TIP_HALF = 4.5;
175
+ function round2(v) {
176
+ return Math.round(v * 100) / 100;
177
+ }
178
+ function labelWidth(text) {
179
+ return textUnits(text) * LABEL_UNIT;
180
+ }
181
+ /** 구간 여럿을 겹치지 않게 줄에 나눠 담는다. 짧은 구간부터 아래 줄을 차지해 긴 구간이 바깥을 감싼다 */
182
+ function assignTracks(spans) {
183
+ const rows = [];
184
+ const out = new Map();
185
+ const sorted = [...spans].sort((a, b) => a.hi - a.lo - (b.hi - b.lo) || a.lo - b.lo || (a.key < b.key ? -1 : 1));
186
+ for (const s of sorted) {
187
+ let row = rows.findIndex((r) => r.every((o) => s.hi + 8 < o.lo || s.lo - 8 > o.hi));
188
+ if (row === -1) {
189
+ rows.push([]);
190
+ row = rows.length - 1;
191
+ }
192
+ rows[row].push(s);
193
+ out.set(s.key, row);
194
+ }
195
+ return out;
196
+ }
197
+ function tipOf(points) {
198
+ const q = points[points.length - 1];
199
+ const p = points[points.length - 2];
200
+ const len = Math.hypot(q.x - p.x, q.y - p.y) || 1;
201
+ const dx = (q.x - p.x) / len;
202
+ const dy = (q.y - p.y) / len;
203
+ const base = { x: q.x - dx * TIP_LENGTH, y: q.y - dy * TIP_LENGTH };
204
+ const tip = [
205
+ { x: round2(q.x), y: round2(q.y) },
206
+ { x: round2(base.x - dy * TIP_HALF), y: round2(base.y + dx * TIP_HALF) },
207
+ { x: round2(base.x + dy * TIP_HALF), y: round2(base.y - dx * TIP_HALF) },
208
+ ];
209
+ const line = [...points.slice(0, -1), { x: round2(base.x), y: round2(base.y) }];
210
+ return { points: line.map((pt) => ({ x: round2(pt.x), y: round2(pt.y) })), tip };
211
+ }
212
+ /**
213
+ * 상태 흐름 좌표. 진행 단계 줄, 대기와 복구 띠, 끝 상태 띠를 위에서부터 쌓는다. elkjs 없이 격자로 놓는다.
214
+ * 아래 두 띠의 상자는 가로 자리를 서로 나눠 쓴다. 진행 줄에서 끝 상태로 내려가는 선이 대기 띠 상자를 뚫지 않게 하려고다
215
+ */
216
+ export function computeLifecycleLayout(model) {
217
+ const W = LIFECYCLE_BOX_W;
218
+ const H = LIFECYCLE_BOX_H;
219
+ const byState = new Map(model.states.map((s) => [s.state, s]));
220
+ const rail = model.states.filter((s) => s.band === 'rail');
221
+ const lower = model.states.filter((s) => s.band !== 'rail');
222
+ const bandsUsed = ['rail', 'recovery', 'terminal'].filter((b) => model.states.some((s) => s.band === b));
223
+ const bandIndex = new Map(bandsUsed.map((b, i) => [b, i]));
224
+ // 진행 줄 이웃끼리 가는 선은 사이에 글자가 앉으니 그 폭만큼 벌린다
225
+ const x = new Map();
226
+ let cx = PAD_X;
227
+ rail.forEach((s, i) => {
228
+ if (i > 0) {
229
+ const prev = rail[i - 1];
230
+ const between = model.transitions.filter((t) => (t.from === prev.state && t.to === s.state) ||
231
+ (t.from === s.state && t.to === prev.state));
232
+ const need = Math.max(0, ...between.map((t) => labelWidth(t.label) + 24));
233
+ cx += Math.min(COL_GAP_MAX, Math.max(COL_GAP_MIN, need));
234
+ }
235
+ x.set(s.state, cx);
236
+ cx += W;
237
+ });
238
+ const railRight = cx;
239
+ // 아래 띠 상자는 처음 들어오는 상태 바로 오른쪽 아래를 노린다. 자리가 차 있으면 오른쪽으로 민다
240
+ const taken = [];
241
+ const fit = (want) => {
242
+ let at = Math.max(PAD_X, want);
243
+ for (;;) {
244
+ const clash = taken.find((o) => at < o.hi + LOWER_GAP && at + W + LOWER_GAP > o.lo);
245
+ if (clash === undefined)
246
+ return at;
247
+ at = clash.hi + LOWER_GAP;
248
+ }
249
+ };
250
+ for (const band of ['recovery', 'terminal']) {
251
+ const pending = lower.filter((s) => s.band === band);
252
+ const wantOf = (s) => {
253
+ const from = model.transitions
254
+ .filter((t) => t.to === s.state && t.from !== s.state && x.has(t.from))
255
+ .map((t) => x.get(t.from));
256
+ return from.length > 0 ? Math.min(...from) + W / 2 + 12 : railRight;
257
+ };
258
+ // 아직 자리가 없는 상태에서만 들어오는 상자는 앞 상자가 놓인 뒤에 다시 잰다
259
+ const placed = new Set();
260
+ while (placed.size < pending.length) {
261
+ const ready = pending.filter((s) => !placed.has(s.state));
262
+ const known = ready.filter((s) => model.transitions.some((t) => t.to === s.state && t.from !== s.state && x.has(t.from)));
263
+ const next = (known.length > 0 ? known : ready).sort((a, b) => wantOf(a) - wantOf(b) || model.states.indexOf(a) - model.states.indexOf(b))[0];
264
+ const at = fit(wantOf(next));
265
+ x.set(next.state, at);
266
+ taken.push({ lo: at, hi: at + W });
267
+ placed.add(next.state);
268
+ }
269
+ }
270
+ const route = model.transitions.map((t) => ({
271
+ t,
272
+ a: byState.get(t.from),
273
+ b: byState.get(t.to),
274
+ }));
275
+ const bandOrder = (s) => model.states
276
+ .filter((o) => o.band === s.band)
277
+ .sort((p, q) => x.get(p.state) - x.get(q.state))
278
+ .map((o) => o.state);
279
+ const kindOf = (a, b) => {
280
+ if (a.state === b.state)
281
+ return 'self';
282
+ const ia = bandIndex.get(a.band);
283
+ const ib = bandIndex.get(b.band);
284
+ if (ia < ib)
285
+ return 'down';
286
+ if (ia > ib)
287
+ return 'up';
288
+ const row = bandOrder(a);
289
+ return row.indexOf(b.state) === row.indexOf(a.state) + 1 ? 'next' : 'arc';
290
+ };
291
+ const kinds = route.map((r) => kindOf(r.a, r.b));
292
+ // 상자 위아래 변에 선 끝을 고르게 나눠 꽂는다. 다른 끝이 왼쪽인 선이 왼쪽 자리를 받아 서로 덜 엇갈린다
293
+ const ports = new Map();
294
+ const addPort = (state, side, key, other) => {
295
+ const k = `${state}\u0000${side}`;
296
+ ports.set(k, [...(ports.get(k) ?? []), { key, other }]);
297
+ };
298
+ route.forEach((r, i) => {
299
+ const xa = x.get(r.a.state);
300
+ const xb = x.get(r.b.state);
301
+ const k = kinds[i];
302
+ if (k === 'self') {
303
+ addPort(r.a.state, 'top', `${i}:out`, xa + W);
304
+ addPort(r.a.state, 'top', `${i}:in`, xa - 1);
305
+ }
306
+ else if (k === 'arc') {
307
+ addPort(r.a.state, 'top', `${i}:out`, xb);
308
+ addPort(r.b.state, 'top', `${i}:in`, xa);
309
+ }
310
+ else if (k === 'down') {
311
+ addPort(r.a.state, 'bottom', `${i}:out`, xb);
312
+ addPort(r.b.state, 'top', `${i}:in`, xa);
313
+ }
314
+ else if (k === 'up') {
315
+ addPort(r.a.state, 'top', `${i}:out`, xb);
316
+ addPort(r.b.state, 'bottom', `${i}:in`, xa);
317
+ }
318
+ });
319
+ const portX = new Map();
320
+ for (const [k, list] of ports) {
321
+ const state = k.split('\u0000')[0];
322
+ const left = x.get(state);
323
+ const sorted = [...list].sort((p, q) => p.other - q.other || (p.key < q.key ? -1 : 1));
324
+ sorted.forEach((p, j) => portX.set(p.key, round2(left + (W * (j + 1)) / (sorted.length + 1))));
325
+ }
326
+ // 같은 띠 위로 넘어가는 선의 줄, 띠 사이 틈의 줄
327
+ const laneOf = assignTracks(route.flatMap((r, i) => kinds[i] === 'self' || kinds[i] === 'arc'
328
+ ? [
329
+ {
330
+ key: `${r.a.band}\u0000${i}`,
331
+ lo: Math.min(portX.get(`${i}:out`), portX.get(`${i}:in`)),
332
+ hi: Math.max(portX.get(`${i}:out`), portX.get(`${i}:in`)),
333
+ },
334
+ ]
335
+ : []));
336
+ const lanesPerBand = new Map();
337
+ route.forEach((r, i) => {
338
+ const lane = laneOf.get(`${r.a.band}\u0000${i}`);
339
+ if (lane === undefined)
340
+ return;
341
+ lanesPerBand.set(r.a.band, Math.max(lanesPerBand.get(r.a.band) ?? 0, lane + 1));
342
+ });
343
+ // 틈 g는 띠 g와 g+1 사이다. 내려가는 선은 출발 띠 바로 아래 틈, 올라가는 선은 출발 띠 바로 위 틈을 쓴다
344
+ const gapOf = (i) => {
345
+ const r = route[i];
346
+ const ia = bandIndex.get(r.a.band);
347
+ return kinds[i] === 'down' ? ia : ia - 1;
348
+ };
349
+ const trackSpans = new Map();
350
+ route.forEach((_, i) => {
351
+ if (kinds[i] !== 'down' && kinds[i] !== 'up')
352
+ return;
353
+ const g = gapOf(i);
354
+ const a = portX.get(`${i}:out`);
355
+ const b = portX.get(`${i}:in`);
356
+ trackSpans.set(g, [
357
+ ...(trackSpans.get(g) ?? []),
358
+ { key: String(i), lo: Math.min(a, b), hi: Math.max(a, b) },
359
+ ]);
360
+ });
361
+ const trackOf = new Map();
362
+ const tracksInGap = new Map();
363
+ for (const [g, spans] of trackSpans) {
364
+ const assigned = assignTracks(spans);
365
+ for (const [key, row] of assigned)
366
+ trackOf.set(Number(key), row);
367
+ tracksInGap.set(g, Math.max(...assigned.values()) + 1);
368
+ }
369
+ // 띠를 위에서부터 쌓는다
370
+ const bands = [];
371
+ const boxTop = new Map();
372
+ const gapTop = [];
373
+ let y = 0;
374
+ bandsUsed.forEach((band, i) => {
375
+ const lanes = lanesPerBand.get(band) ?? 0;
376
+ const top = y;
377
+ const boxesAt = top + BAND_HEAD + (lanes > 0 ? lanes * LANE + 10 : 0);
378
+ boxTop.set(band, boxesAt);
379
+ const height = boxesAt + H + BAND_PAD_BOTTOM - top;
380
+ bands.push({
381
+ band,
382
+ y: top,
383
+ height,
384
+ count: model.states.filter((s) => s.band === band).length,
385
+ });
386
+ y = top + height;
387
+ if (i < bandsUsed.length - 1) {
388
+ gapTop.push(y);
389
+ y += Math.max(BAND_GAP_MIN, (tracksInGap.get(i) ?? 0) * TRACK + 18);
390
+ }
391
+ });
392
+ const height = y;
393
+ const boxes = model.states.map((s) => ({
394
+ state: s.state,
395
+ band: s.band,
396
+ x: round2(x.get(s.state)),
397
+ y: round2(boxTop.get(s.band)),
398
+ width: W,
399
+ height: H,
400
+ }));
401
+ const boxOf = new Map(boxes.map((b) => [b.state, b]));
402
+ const routes = route.map((r, i) => {
403
+ const A = boxOf.get(r.a.state);
404
+ const B = boxOf.get(r.b.state);
405
+ const k = kinds[i];
406
+ const po = portX.get(`${i}:out`) ?? 0;
407
+ const pi = portX.get(`${i}:in`) ?? 0;
408
+ let pts;
409
+ let labelAt;
410
+ let labelAnchor = 'middle';
411
+ let back = false;
412
+ if (k === 'next') {
413
+ const cy = A.y + H / 2;
414
+ pts = [
415
+ { x: A.x + W, y: cy },
416
+ { x: B.x, y: cy },
417
+ ];
418
+ labelAt = { x: (A.x + W + B.x) / 2, y: cy - 6 };
419
+ }
420
+ else if (k === 'self' || k === 'arc') {
421
+ const lane = laneOf.get(`${r.a.band}\u0000${i}`);
422
+ const ly = A.y - 14 - lane * LANE;
423
+ pts = [
424
+ { x: po, y: A.y },
425
+ { x: po, y: ly },
426
+ { x: pi, y: ly },
427
+ { x: pi, y: B.y },
428
+ ];
429
+ labelAt = { x: (po + pi) / 2, y: ly - 5 };
430
+ back = k === 'self' || B.x < A.x;
431
+ }
432
+ else {
433
+ const g = gapOf(i);
434
+ const ty = gapTop[g] + 14 + trackOf.get(i) * TRACK;
435
+ const fromY = k === 'down' ? A.y + H : A.y;
436
+ const toY = k === 'down' ? B.y : B.y + H;
437
+ pts = [
438
+ { x: po, y: fromY },
439
+ { x: po, y: ty },
440
+ { x: pi, y: ty },
441
+ { x: pi, y: toY },
442
+ ];
443
+ back = k === 'up';
444
+ const run = Math.abs(pi - po);
445
+ if (run >= Math.min(labelWidth(r.t.label) + 16, 120)) {
446
+ labelAt = { x: (po + pi) / 2, y: ty - 5 };
447
+ }
448
+ else {
449
+ // 가로로 지나는 길이 짧으면 글자를 도착 쪽 세로선 옆에 붙인다
450
+ labelAt = { x: pi + 6, y: (ty + toY) / 2 + 4 };
451
+ labelAnchor = 'start';
452
+ }
453
+ }
454
+ const { points, tip } = tipOf(pts.filter((p, j) => j === 0 || p.x !== pts[j - 1].x || p.y !== pts[j - 1].y));
455
+ return {
456
+ id: r.t.id,
457
+ from: r.a.rep,
458
+ to: r.b.rep,
459
+ points,
460
+ tip,
461
+ labelAt: { x: round2(labelAt.x), y: round2(labelAt.y) },
462
+ labelAnchor,
463
+ back,
464
+ };
465
+ });
466
+ const right = Math.max(railRight, ...boxes.map((b) => b.x + b.width), ...routes.map((r, i) => r.labelAnchor === 'start'
467
+ ? r.labelAt.x + labelWidth(model.transitions[i].label)
468
+ : r.labelAt.x + labelWidth(model.transitions[i].label) / 2));
469
+ return { width: round2(right + PAD_X), height: round2(height), bands, boxes, routes };
470
+ }
471
+ //# sourceMappingURL=lifecycle-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-layout.js","sourceRoot":"","sources":["../../../src/architecture/lifecycle-layout.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/architecture/merge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAMV,cAAc,EACd,gBAAgB,EAMjB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,oCAAoC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACrD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/F,CAAC;AAgHN;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EAAE,EACrB,IAAI,GAAE,2BAAgC,GACrC,0BAA0B,CAukB5B"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/architecture/merge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAMV,cAAc,EACd,gBAAgB,EAOjB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,oCAAoC;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACrD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/F,CAAC;AA4HN;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EAAE,EACrB,IAAI,GAAE,2BAAgC,GACrC,0BAA0B,CA4oB5B"}
@@ -60,6 +60,7 @@ const CONFLICT_QUESTION = {
60
60
  parent: (name, values) => `"${name}"가 분석마다 다른 곳에 속해 있어요 (${values.map((v) => `"${v}"`).join(', ')}). 어디에 두면 될까요?`,
61
61
  environment: (name, values) => `"${name}"의 환경이 분석마다 달라요 (${values.join(', ')}). 어느 환경이 맞나요?`,
62
62
  account: (name, values) => `"${name}"가 속한 계정이 분석마다 달라요 (${values.map((v) => `"${v}"`).join(', ')}). 어느 계정이 맞나요?`,
63
+ column: (name, values) => `"${name}" 컬럼이 분석마다 달라요 (${values.join(', ')}). 어느 쪽이 맞나요?`,
63
64
  };
64
65
  /**
65
66
  * 값이 하나로 모이면 그 값을, 갈리면 user 근거가 있는 쪽 값을 고른다.
@@ -202,7 +203,7 @@ export function mergeArchitectureIrs(irs, opts = {}) {
202
203
  const candidates = slotsByKey.get(key) ?? [];
203
204
  let slot = candidates.find((s) => !s.inputs.has(input));
204
205
  if (!slot) {
205
- const { displayName: _d, displayNameInferred: _di, parent: _p, account: _a, environment: _e, ...rest } = raw;
206
+ const { displayName: _d, displayNameInferred: _di, parent: _p, account: _a, environment: _e, columns: _c, ...rest } = raw;
206
207
  slot = {
207
208
  node: {
208
209
  ...rest,
@@ -216,6 +217,7 @@ export function mergeArchitectureIrs(irs, opts = {}) {
216
217
  parent: [],
217
218
  account: [],
218
219
  environment: [],
220
+ columns: new Map(),
219
221
  };
220
222
  candidates.push(slot);
221
223
  slotsByKey.set(key, candidates);
@@ -250,6 +252,41 @@ export function mergeArchitectureIrs(irs, opts = {}) {
250
252
  const inferred = raw.displayNameInferred === true;
251
253
  slot.displayNameInferred.set(raw.displayName, prevInferred === undefined ? inferred : prevInferred && inferred);
252
254
  }
255
+ // 컬럼은 이름으로 합친다. 근거는 합집합이고 나머지 값은 먼저 준 입력 것을 두되 비어 있던 값만 채운다
256
+ for (const c of raw.columns ?? []) {
257
+ const evidence = c.evidence !== undefined ? remapEvidence(c.evidence, map) : undefined;
258
+ const prev = slot.columns.get(c.name) ??
259
+ {
260
+ column: { ...c, ...(evidence !== undefined ? { evidence } : {}) },
261
+ refInput: input,
262
+ refClaims: [],
263
+ typeClaims: [],
264
+ };
265
+ if (c.references !== undefined) {
266
+ prev.refClaims.push({ input, table: c.references.table });
267
+ }
268
+ if (c.type !== undefined)
269
+ prev.typeClaims.push(c.type);
270
+ if (!slot.columns.has(c.name)) {
271
+ slot.columns.set(c.name, prev);
272
+ continue;
273
+ }
274
+ const col = prev.column;
275
+ if (col.type === undefined && c.type !== undefined)
276
+ col.type = c.type;
277
+ if (col.pk === undefined && c.pk !== undefined)
278
+ col.pk = c.pk;
279
+ if (col.nullable === undefined && c.nullable !== undefined)
280
+ col.nullable = c.nullable;
281
+ if (col.unique === undefined && c.unique !== undefined)
282
+ col.unique = c.unique;
283
+ if (col.references === undefined && c.references !== undefined) {
284
+ col.references = { ...c.references };
285
+ prev.refInput = input;
286
+ }
287
+ if (evidence !== undefined)
288
+ col.evidence = unionEvidence(col.evidence ?? [], evidence);
289
+ }
253
290
  if (raw.parent !== undefined)
254
291
  slot.parent.push({ input, id: raw.parent, user });
255
292
  if (raw.account !== undefined)
@@ -274,6 +311,32 @@ export function mergeArchitectureIrs(irs, opts = {}) {
274
311
  const nodes = slots.map((slot) => {
275
312
  const id = idOfSlot.get(slot);
276
313
  const node = { ...slot.node, id };
314
+ if (slot.columns.size > 0) {
315
+ node.columns = [...slot.columns.values()].map(({ column, refInput }) => column.references !== undefined
316
+ ? {
317
+ ...column,
318
+ references: {
319
+ ...column.references,
320
+ table: mapNode(refInput, column.references.table),
321
+ },
322
+ }
323
+ : column);
324
+ // 참조 대상은 입력마다 제 id라 합친 id로 바꾼 뒤에 견줘야 같은 테이블을 충돌로 안 본다
325
+ [...slot.columns.values()].forEach((cs, i) => {
326
+ const tables = [...new Set(cs.refClaims.map((r) => mapNode(r.input, r.table)))];
327
+ const refs = tables.map((t) => `참조 "${nameById.get(t) ?? t}"`);
328
+ const types = [...new Set(cs.typeClaims)].map((t) => `타입 ${t}`);
329
+ const values = [...(refs.length > 1 ? refs : []), ...(types.length > 1 ? types : [])];
330
+ if (values.length === 0)
331
+ return;
332
+ // 질문 id에 컬럼 이름을 넣으면 공유본에서 가린 이름이 id로 샌다. 순번으로 짓는다
333
+ conflictQuestions.push({
334
+ id: `merge:column:${id}:${i + 1}`,
335
+ subject: { nodeId: id },
336
+ question: CONFLICT_QUESTION.column(`${nameOf(slot)}.${cs.column.name}`, values.sort(byText)),
337
+ });
338
+ });
339
+ }
277
340
  const ask = (field, values) => {
278
341
  conflictQuestions.push({
279
342
  id: `merge:${field}:${id}`,
@@ -424,15 +487,19 @@ export function mergeArchitectureIrs(irs, opts = {}) {
424
487
  const takenStepIds = new Set();
425
488
  const stepIdOf = new Map(); // `${input}\u0000${원래 id}` → 새 id. 단계와 전이가 함께 쓴다
426
489
  const mapStep = (input, id) => stepIdOf.get(`${input}\u0000${id}`) ?? id;
490
+ // 상태 흐름 투영이 흐름을 id로 가리켜서 바뀐 흐름 id를 따로 적어 둔다
491
+ const flowIdOf = new Map();
427
492
  for (const { ir, input } of ordered) {
428
493
  const map = repoMaps.get(input);
429
494
  for (const f of ir.flows ?? []) {
430
495
  for (const item of [...f.steps, ...f.transitions]) {
431
496
  stepIdOf.set(`${input}\u0000${item.id}`, uniqueId(item.id, takenStepIds));
432
497
  }
498
+ const flowId = uniqueId(f.id, takenFlowIds);
499
+ flowIdOf.set(`${input}\u0000${f.id}`, flowId);
433
500
  flows.push({
434
501
  ...f,
435
- id: uniqueId(f.id, takenFlowIds),
502
+ id: flowId,
436
503
  ...(f.service !== undefined ? { service: mapNode(input, f.service) } : {}),
437
504
  steps: f.steps.map((st) => ({
438
505
  ...st,
@@ -466,6 +533,9 @@ export function mergeArchitectureIrs(irs, opts = {}) {
466
533
  projections.push({
467
534
  ...pr,
468
535
  id: uniqueId(pr.id, takenProjectionIds),
536
+ ...(pr.flow !== undefined
537
+ ? { flow: flowIdOf.get(`${input}\u0000${pr.flow}`) ?? pr.flow }
538
+ : {}),
469
539
  ...(pr.participants !== undefined
470
540
  ? { participants: pr.participants.map((id) => mapNode(input, id)) }
471
541
  : {}),