@tienne/gestalt 0.92.0 → 0.93.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 (37) hide show
  1. package/README.md +2 -0
  2. package/dist/package.json +1 -1
  3. package/dist/plugin/skills/architecture/SKILL.md +8 -4
  4. package/dist/schemas/architecture-ir.schema.json +34 -1
  5. package/dist/src/architecture/flow-layout.d.ts +16 -1
  6. package/dist/src/architecture/flow-layout.d.ts.map +1 -1
  7. package/dist/src/architecture/flow-layout.js +108 -28
  8. package/dist/src/architecture/flow-layout.js.map +1 -1
  9. package/dist/src/architecture/html-client.d.ts +2 -0
  10. package/dist/src/architecture/html-client.d.ts.map +1 -1
  11. package/dist/src/architecture/html-client.js +25 -4
  12. package/dist/src/architecture/html-client.js.map +1 -1
  13. package/dist/src/architecture/html-renderer.d.ts.map +1 -1
  14. package/dist/src/architecture/html-renderer.js +65 -22
  15. package/dist/src/architecture/html-renderer.js.map +1 -1
  16. package/dist/src/architecture/html-theme.d.ts +5 -0
  17. package/dist/src/architecture/html-theme.d.ts.map +1 -1
  18. package/dist/src/architecture/html-theme.js +36 -0
  19. package/dist/src/architecture/html-theme.js.map +1 -1
  20. package/dist/src/architecture/ir-schema.d.ts +58 -1
  21. package/dist/src/architecture/ir-schema.d.ts.map +1 -1
  22. package/dist/src/architecture/ir-schema.js +15 -2
  23. package/dist/src/architecture/ir-schema.js.map +1 -1
  24. package/dist/src/architecture/types.d.ts +10 -1
  25. package/dist/src/architecture/types.d.ts.map +1 -1
  26. package/dist/src/architecture/types.js +2 -0
  27. package/dist/src/architecture/types.js.map +1 -1
  28. package/dist/src/architecture/validator.d.ts.map +1 -1
  29. package/dist/src/architecture/validator.js +35 -0
  30. package/dist/src/architecture/validator.js.map +1 -1
  31. package/dist/src/mcp/schemas.d.ts +6 -6
  32. package/package.json +1 -1
  33. package/plugin/.codex-plugin/plugin.json +1 -1
  34. package/plugin/.mcp.json +1 -1
  35. package/plugin/mcp.json +1 -1
  36. package/plugin/skills/architecture/SKILL.md +8 -4
  37. package/schemas/architecture-ir.schema.json +34 -1
@@ -1 +1 @@
1
- {"version":3,"file":"html-client.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qCAAqC;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2XD,eAAO,MAAM,QAAQ,iXAOpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAI9D,eAAO,MAAM,iBAAiB,sNAKxB,CAAC;AAEP;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAgtD7D"}
1
+ {"version":3,"file":"html-client.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qCAAqC;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAiZD,eAAO,MAAM,QAAQ,iXAOpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAI9D,eAAO,MAAM,iBAAiB,sNAKxB,CAAC;AAEP;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAgtD7D"}
@@ -7,6 +7,27 @@ import { FRAME_PAD, NODE_DESC_LINE } from './layout.js';
7
7
  const COMPONENT_DKIND = "n.kind === 'component' ? 'cx_' + (n.renderClass || 'service') : ";
8
8
  const COMPONENT_CHIP = "(n.kind === 'component' && n.displayKind) || ";
9
9
  const ROOT_FLOWS = "current === 'root' ? flows.filter(function (f) { return !f.service; }) : []";
10
+ // 갈림길과 누른 것, 조건 조각. 그런 흐름이 있는 그림에만 싣는다. 늘 실으면 예전 흐름 그림의 바이트가 바뀐다
11
+ const BRANCH_STEP_CHIP = "st.kind === 'decision' ? '갈림길' : ";
12
+ const BRANCH_TRANSITION_SUB = 't.trigger || ';
13
+ const BRANCH_STEP_OUTS = ` if (st.kind === 'decision') {
14
+ var outs = f.transitions.filter(function (t) { return t.from === id && !!transitions[t.id]; });
15
+ if (outs.length) {
16
+ body.appendChild(el('h3', null, '나뉘는 길 ' + outs.length + '개'));
17
+ refButtons(body, outs.map(function (t) { return t.id; }), function (tid) {
18
+ var g = [].filter.call(active.querySelectorAll('.link.flow-t'), function (x) { return x.getAttribute('data-transition-id') === tid; })[0];
19
+ if (g) activateTransition(g); else renderTransitionPanel(transitions[tid]);
20
+ }, function () { return 'u-flow'; }, function (tid) {
21
+ var t = transitions[tid];
22
+ return (t.condition || t.label || '조건 없음') + ' → ' + label(t.to);
23
+ });
24
+ }
25
+ }
26
+ `;
27
+ const BRANCH_TRANSITION_FACTS = ` if (t.trigger) factRow(facts, '누른 것', t.trigger);
28
+ if (t.condition) factRow(facts, '조건', t.condition);
29
+ if ((t.trigger || t.condition) && t.label) factRow(facts, '메모', t.label);
30
+ `;
10
31
  // 근거가 섞인 묶음 조각. 그런 묶음이 있는 그림에만 싣는다. 문구는 html-renderer.ts의 inferredNote와 같다
11
32
  const MIXED_NOTE = " + (e.inferred !== undefined ? ' (문서 근거만 있는 연결 ' + e.inferred + '개 포함)' : '')";
12
33
  const MIXED_PANEL_NOTE = " + (bundle.inferred !== undefined ? ' (문서 근거만 있는 연결 ' + bundle.inferred + '개 포함)' : '')";
@@ -665,7 +686,7 @@ ${FOCUS_SOURCE}
665
686
  var st = n.step;
666
687
  var f = stepFlow[id];
667
688
  panel.textContent = '';
668
- panel.appendChild(panelHead(st.path === 'side' ? 'flow side' : 'flow', 'u-flow', '흐름 단계', f.title, st.label));
689
+ panel.appendChild(panelHead(st.path === 'side' ? 'flow side' : 'flow', 'u-flow', ${c.flowBranches ? BRANCH_STEP_CHIP : ''}'흐름 단계', f.title, st.label));
669
690
  var body = el('div', 'dr-body');
670
691
  var facts = el('ul', 'facts');
671
692
  if (n.actor) factRow(facts, '누가', n.actor.label);
@@ -678,7 +699,7 @@ ${FOCUS_SOURCE}
678
699
  body.appendChild(facts);
679
700
  if (st.description) body.appendChild(el('p', 'desc', st.description));
680
701
  questionList(body, st.questions);
681
- var refs = (st.refs || []).filter(function (r) { return !!nodes[r]; });
702
+ ${c.flowBranches ? BRANCH_STEP_OUTS : ''} var refs = (st.refs || []).filter(function (r) { return !!nodes[r]; });
682
703
  if (refs.length) {
683
704
  var web = refs.every(function (r) { return nodes[r].kind === 'screen' || nodes[r].kind === 'endpoint'; });
684
705
  body.appendChild(el('h3', null, (web ? '이어진 화면과 API ' : '이어진 카드 ') + refs.length + '개'));
@@ -692,10 +713,10 @@ ${FOCUS_SOURCE}
692
713
  syncFocusBtn();
693
714
  panel.textContent = '';
694
715
  var title = label(t.from) + ' → ' + label(t.to);
695
- panel.appendChild(panelHead(t.path === 'side' ? 'flow side' : 'flow', 'u-flow', '상태 전이', t.label || '', title));
716
+ panel.appendChild(panelHead(t.path === 'side' ? 'flow side' : 'flow', 'u-flow', '상태 전이', ${c.flowBranches ? BRANCH_TRANSITION_SUB : ''}t.label || '', title));
696
717
  var body = el('div', 'dr-body');
697
718
  var facts = el('ul', 'facts');
698
- var f = stepFlow[t.from];
719
+ ${c.flowBranches ? BRANCH_TRANSITION_FACTS : ''} var f = stepFlow[t.from];
699
720
  if (t.actors && f) {
700
721
  factRow(facts, '누가', t.actors.map(function (a) {
701
722
  var actor = f.actors.filter(function (x) { return x.id === a; })[0];
@@ -1 +1 @@
1
- {"version":3,"file":"html-client.js","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html-client.js","sourceRoot":"","sources":["../../../src/architecture/html-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-renderer.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA6BnG,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAgCrB,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AA+ED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AA2VD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AA06CD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAsJR"}
1
+ {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../src/architecture/html-renderer.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA8BnG,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAiCrB,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAkFD,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AA2VD,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AA+9CD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAsJR"}
@@ -1,7 +1,7 @@
1
1
  import { BAND_LINE_X, BAND_LINE_Y, BAND_TITLE_HALF, BAND_TITLE_X, CANVAS_PAD_TOP, CANVAS_PAD_X, LANE_INSET_Y, routeCanvas, } from './canvas-geometry.js';
2
2
  import { flowCountByService, ROOT_LEVEL_ID } from './drilldown.js';
3
3
  import { renderClientScript, THEME_BOOT_SCRIPT } from './html-client.js';
4
- import { datastoreEngine, iconUse, PRODUCT_COLORS, renderCss, renderIconSprite, VIEW_CSS, DOC_CSS, SEQ_VIEW_CSS, } from './html-theme.js';
4
+ import { datastoreEngine, iconUse, PRODUCT_COLORS, renderCss, renderIconSprite, VIEW_CSS, DOC_CSS, FLOW_BRANCH_CSS, SEQ_VIEW_CSS, } from './html-theme.js';
5
5
  import { EDGE_KIND_ABOUT, LANE_ABOUT, LANE_TITLES, NODE_KIND_ABOUT, STAGE_LANE_ABOUT, flowBadgeText, MICRO_HOST_SHORT, NODE_KIND_SHORT, PLATFORM_CHIP_TEXT, PLATFORM_NAME, WEB_HOSTING_CHIP_TEXT, WEB_HOSTING_NAME, platformChipText, platformName, } from './kind-text.js';
6
6
  import { compareEnvironment, FLAT_BACKWARD_EDGE_KINDS, textUnits, } from './layout.js';
7
7
  import { indexMicroApps } from './micro-app.js';
@@ -58,6 +58,9 @@ const FLOW_TEXT = {
58
58
  side: '옆 흐름',
59
59
  back: '앞 단계로 되돌아감',
60
60
  end: '흐름 끝',
61
+ decision: '갈림길',
62
+ trigger: '누른 것',
63
+ condition: '조건',
61
64
  person: '사람',
62
65
  system: '시스템',
63
66
  };
@@ -568,13 +571,19 @@ function renderFlowSection(level, flow, questionCount, drawableNodes) {
568
571
  `y1="${round2(laneTop + FLOW_PAD)}" y2="${round2(laneBottom + FLOW_PAD)}"/>`)
569
572
  .join('');
570
573
  const stageHeads = layout.stages
571
- .map((st) => `<div class="fstage${st.side ? ' side' : named(st.label)}" style="left:${round2(st.x + FLOW_PAD + 8)}px;top:${FLOW_PAD}px;width:${round2(st.width - 16)}px" ` +
574
+ .map((st) => `<div class="fstage${st.side ? ' side' : named(st.label)}" style="left:${round2(st.x + FLOW_PAD + 8)}px;top:${FLOW_PAD + layout.stageTop}px;width:${round2(st.width - 16)}px" ` +
572
575
  `title="${escapeHtml(st.side ? st.label : stateText(st.label))}"><span>${escapeHtml(st.side ? st.label : stateText(st.label))}</span></div>`)
573
576
  .join('');
574
- const heads = layout.lanes
575
- .map((l) => `<div class="flane-title a-${l.actor.kind}" style="left:${FLOW_PAD + 12}px;top:${round2(l.y + FLOW_PAD + 12)}px">` +
576
- `${iconUse(l.actor.kind === 'person' ? 'u-person' : l.actor.kind === 'agent' ? 'i-agent' : 'u-system')}<span>${escapeHtml(l.actor.label)}</span></div>`)
577
- .join('');
577
+ const actorIcon = (kind) => iconUse(kind === 'person' ? 'u-person' : kind === 'agent' ? 'i-agent' : 'u-system');
578
+ // 행위자가 한 명이면 머리 칸이 없다. 누가 하는 흐름인지는 맨 위 띠의 칩 하나로 알린다
579
+ const solo = layout.headWidth === 0 ? layout.lanes[0] : undefined;
580
+ const heads = solo !== undefined
581
+ ? `<div class="flane-actor a-${solo.actor.kind}" style="left:${FLOW_PAD + 4}px;top:${FLOW_PAD}px">` +
582
+ `${actorIcon(solo.actor.kind)}<span>${escapeHtml(solo.actor.label)}</span></div>`
583
+ : layout.lanes
584
+ .map((l) => `<div class="flane-title a-${l.actor.kind}" style="left:${FLOW_PAD + 12}px;top:${round2(l.y + FLOW_PAD + 12)}px">` +
585
+ `${actorIcon(l.actor.kind)}<span>${escapeHtml(l.actor.label)}</span></div>`)
586
+ .join('');
578
587
  const labelOf = (id) => stepById.get(id)?.label ?? id;
579
588
  const links = layout.transitions
580
589
  .map((r) => {
@@ -586,17 +595,32 @@ function renderFlowSection(level, flow, questionCount, drawableNodes) {
586
595
  const who = actorNames.join(', ');
587
596
  // 선 위에는 괄호 앞 이름만 싣는다. "고객 (앱, QR, 알림톡 웹)"을 다 쓰면 선 글자가 카드 폭을 넘는다
588
597
  const whoShort = actorNames.map((n) => n.replace(/\s*\([^)]*\)\s*$/, '')).join(', ');
598
+ // 누른 것이나 조건이 있으면 선에는 그 둘을 찍고 label은 서랍의 메모로만 보인다
599
+ const rich = t.trigger !== undefined || t.condition !== undefined;
600
+ const richParts = [
601
+ ...(t.condition !== undefined ? [`${FLOW_TEXT.condition} ${t.condition}`] : []),
602
+ ...(t.trigger !== undefined ? [`${FLOW_TEXT.trigger} ${t.trigger}`] : []),
603
+ ];
589
604
  const name = `${FLOW_TEXT[r.path]}${r.back ? `, ${FLOW_TEXT.back}` : ''}: ${labelOf(r.from)} → ${labelOf(r.to)}` +
590
- (t.label !== undefined ? ` (${t.label})` : '') +
605
+ (rich ? ` (${richParts.join(', ')})` : t.label !== undefined ? ` (${t.label})` : '') +
591
606
  (who !== '' ? `, 누가 ${who}` : '');
607
+ const richText = (t.condition !== undefined
608
+ ? `<tspan class="t-cond">${escapeHtml(t.condition)}${t.trigger !== undefined ? ' ' : ''}</tspan>`
609
+ : '') + (t.trigger !== undefined ? escapeHtml(t.trigger) : '');
592
610
  const text = r.labelAt
593
- ? `<text class="t-label" x="${round2(r.labelAt.x + FLOW_PAD)}" y="${round2(r.labelAt.y + FLOW_PAD - 5)}">` +
594
- (r.back ? '<tspan class="t-back">↩ </tspan>' : '') +
595
- (t.label !== undefined ? escapeHtml(t.label) : '') +
596
- (whoShort !== ''
597
- ? `<tspan class="t-who">${t.label !== undefined ? ' · ' : ''}${escapeHtml(whoShort)}</tspan>`
598
- : '') +
599
- `</text>`
611
+ ? rich
612
+ ? `<text class="t-label${r.labelAnchor === 'start' ? ' at-start' : ''}" x="${round2(r.labelAt.x + FLOW_PAD)}" y="${round2(r.labelAt.y + FLOW_PAD - 5)}">` +
613
+ (r.back ? '<tspan class="t-back">↩ </tspan>' : '') +
614
+ richText +
615
+ (whoShort !== '' ? `<tspan class="t-who"> · ${escapeHtml(whoShort)}</tspan>` : '') +
616
+ `</text>`
617
+ : `<text class="t-label${r.labelAnchor === 'start' ? ' at-start' : ''}" x="${round2(r.labelAt.x + FLOW_PAD)}" y="${round2(r.labelAt.y + FLOW_PAD - 5)}">` +
618
+ (r.back ? '<tspan class="t-back">↩ </tspan>' : '') +
619
+ (t.label !== undefined ? escapeHtml(t.label) : '') +
620
+ (whoShort !== ''
621
+ ? `<tspan class="t-who">${t.label !== undefined ? ' · ' : ''}${escapeHtml(whoShort)}</tspan>`
622
+ : '') +
623
+ `</text>`
600
624
  : '';
601
625
  return (`<g class="link flow-t p-${r.path}${r.back ? ' back' : ''}" data-from="${escapeHtml(r.from)}" data-to="${escapeHtml(r.to)}" ` +
602
626
  `data-transition-id="${escapeHtml(r.id)}" tabindex="0" role="button" aria-label="${escapeHtml(name)}">` +
@@ -611,16 +635,23 @@ function renderFlowSection(level, flow, questionCount, drawableNodes) {
611
635
  const refs = (st.refs ?? []).filter((id) => drawableNodes.has(id));
612
636
  const qs = questionCount.get(st.id) ?? 0;
613
637
  const dashed = st.evidence.every((ev) => ev.type !== 'code' && ev.type !== 'spec');
638
+ const decision = b.shape === 'diamond';
614
639
  const cls = ['node', 'flow-step', `p-${b.path}`];
640
+ if (decision)
641
+ cls.push('decision');
615
642
  if (dashed)
616
643
  cls.push('doc-only');
617
- const aria = `${st.label}, ${FLOW_TEXT.step}, ${actor?.label ?? st.actor}` +
644
+ const aria = `${st.label}, ${decision ? FLOW_TEXT.decision : FLOW_TEXT.step}, ${actor?.label ?? st.actor}` +
618
645
  (st.state !== undefined ? `, 상태 ${stateText(st.state)}` : '') +
619
646
  (st.terminal ? `, ${FLOW_TEXT.end}` : '') +
620
647
  (dashed ? ', 문서로만 확인' : '');
621
648
  return (`<div class="${cls.join(' ')}" data-node-id="${escapeHtml(st.id)}" role="button" tabindex="0" ` +
622
649
  `aria-label="${escapeHtml(aria)}" title="${escapeHtml(st.description ?? st.label)}" ` +
623
650
  `style="left:${round2(b.x + FLOW_PAD)}px;top:${round2(b.y + FLOW_PAD)}px;width:${b.width}px;height:${b.height}px">` +
651
+ (decision
652
+ ? `<svg class="dshape" viewBox="0 0 ${b.width} ${b.height}" preserveAspectRatio="none" aria-hidden="true">` +
653
+ `<polygon points="${b.width / 2},1 ${b.width - 1},${b.height / 2} ${b.width / 2},${b.height - 1} 1,${b.height / 2}"/></svg>`
654
+ : '') +
624
655
  `<span class="nm"><span class="t">${escapeHtml(st.label)}</span></span>` +
625
656
  `<span class="l2">` +
626
657
  (st.state !== undefined
@@ -637,7 +668,7 @@ function renderFlowSection(level, flow, questionCount, drawableNodes) {
637
668
  })
638
669
  .join('');
639
670
  return (`<section class="level flow-level" data-level-id="${escapeHtml(level.id)}" data-flow-id="${escapeHtml(level.flowId)}" ` +
640
- `aria-label="${escapeHtml(flow.title)}" data-w="${width}" data-h="${height}" style="width:${width}px;height:${height}px" hidden>` +
671
+ `aria-label="${escapeHtml(solo !== undefined ? `${flow.title}, 행위자 ${solo.actor.label}` : flow.title)}" data-w="${width}" data-h="${height}" style="width:${width}px;height:${height}px" hidden>` +
641
672
  `<svg class="links" xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" ` +
642
673
  `role="group" aria-label="${escapeHtml(`${flow.title} 전이`)}"><g class="lanes">${lanes}${dividers}</g><g class="edges">${links}</g></svg>` +
643
674
  `${stageHeads}${heads}${cards}</section>`);
@@ -1113,7 +1144,7 @@ function flowPayload(levels, flows, questions) {
1113
1144
  };
1114
1145
  });
1115
1146
  }
1116
- function renderLegend(nodes, edges, drill, generatedAt, nodeCount, edgeCount, hasFlows = false) {
1147
+ function renderLegend(nodes, edges, drill, generatedAt, nodeCount, edgeCount, hasFlows = false, hasDecisions = false) {
1117
1148
  const nodeById = new Map(nodes.map((n) => [n.id, n]));
1118
1149
  const line = (extra) => `<svg width="36" height="12" aria-hidden="true"><line x1="3" y1="6" x2="33" y2="6" ${extra}/></svg>`;
1119
1150
  const kinds = [...new Set(nodes.map(displayKindOf))]
@@ -1134,6 +1165,9 @@ function renderLegend(nodes, edges, drill, generatedAt, nodeCount, edgeCount, ha
1134
1165
  ? `<li>${line('stroke-width="2" class="side-line"')}주황 선: 흐름에서 정상 흐름을 벗어나는 옆 흐름</li>` +
1135
1166
  `<li><span class="swatch-step"></span>점선 테두리 카드: 기획 문서로만 확인한 흐름 단계</li>`
1136
1167
  : '') +
1168
+ (hasDecisions
1169
+ ? `<li><span class="swatch-decision"></span>마름모: 조건에 따라 길이 갈리는 갈림길</li>`
1170
+ : '') +
1137
1171
  `</ul>` +
1138
1172
  (kinds ? `<h3>항목</h3><ul class="legend-kinds">${kinds}</ul>` : '') +
1139
1173
  `<p class="foot">만든 시각 ${escapeHtml(generatedAt)}<br>항목 ${nodeCount}개, 연결 ${edgeCount}개</p></div>`);
@@ -1258,8 +1292,8 @@ function renderBar(title, drill, generatedAt, nodeCount, edgeCount, questionCoun
1258
1292
  }
1259
1293
  const clientScripts = new Map();
1260
1294
  /** 칩 글자와 설명, 레인 제목은 IR이 쓰는 팩 것만 싣는다. 팩을 더해도 그 팩을 안 쓰는 그림의 바이트가 그대로다 */
1261
- function clientScriptFor(vocab, rootFlows, views, mixedBundles, sequences) {
1262
- const key = `${vocab.packIds.join(',')}|${rootFlows}|${views}|${mixedBundles}|${sequences}`;
1295
+ function clientScriptFor(vocab, rootFlows, views, mixedBundles, sequences, flowBranches) {
1296
+ const key = `${vocab.packIds.join(',')}|${rootFlows}|${views}|${mixedBundles}|${sequences}|${flowBranches}`;
1263
1297
  const hit = clientScripts.get(key);
1264
1298
  if (hit !== undefined)
1265
1299
  return hit;
@@ -1292,6 +1326,7 @@ function clientScriptFor(vocab, rootFlows, views, mixedBundles, sequences) {
1292
1326
  views,
1293
1327
  mixedBundles,
1294
1328
  sequences,
1329
+ ...(flowBranches ? { flowBranches } : {}),
1295
1330
  docs: vocab.packIds.includes('knowledge'),
1296
1331
  });
1297
1332
  clientScripts.set(key, script);
@@ -1312,6 +1347,14 @@ function renderPage({ ir, payload, sections, drill, flows, views, mixedBundles =
1312
1347
  const hasFlows = flows !== undefined && flows.flows.length > 0;
1313
1348
  const hasViews = views !== undefined && views.length > 0;
1314
1349
  const hasSequences = sequences.length > 0;
1350
+ const drawnFlows = flows?.flows ?? [];
1351
+ const hasDecisions = drawnFlows.some((f) => f.steps.some((st) => st.kind === 'decision' && flows.drawnSteps.has(st.id)));
1352
+ // 누른 것과 조건, 갈림길, 행위자 한 명 띠는 그 흐름이 있을 때만 CSS와 코드를 싣는다. 예전 흐름 그림의 바이트를 지키려고서다
1353
+ const flowBranches = hasDecisions ||
1354
+ drawnFlows.some((f) => f.transitions.some((t) => (t.trigger !== undefined || t.condition !== undefined) &&
1355
+ flows.drawnSteps.has(t.from) &&
1356
+ flows.drawnSteps.has(t.to)));
1357
+ const soloActor = drawnFlows.some((f) => f.actors.length === 1);
1315
1358
  return [
1316
1359
  '<!doctype html>',
1317
1360
  '<html lang="ko">',
@@ -1320,7 +1363,7 @@ function renderPage({ ir, payload, sections, drill, flows, views, mixedBundles =
1320
1363
  '<meta name="viewport" content="width=device-width, initial-scale=1">',
1321
1364
  `<title>${escapeHtml(title)}</title>`,
1322
1365
  `<script>${THEME_BOOT_SCRIPT}</script>`,
1323
- `<style>${renderCss(vocab)}${hasViews ? `\n${VIEW_CSS}` : ''}${hasSequences ? `\n${SEQ_VIEW_CSS}` : ''}${vocab.packIds.includes('knowledge') ? `\n${DOC_CSS}` : ''}</style>`,
1366
+ `<style>${renderCss(vocab)}${hasViews ? `\n${VIEW_CSS}` : ''}${hasSequences ? `\n${SEQ_VIEW_CSS}` : ''}${vocab.packIds.includes('knowledge') ? `\n${DOC_CSS}` : ''}${flowBranches || soloActor ? `\n${FLOW_BRANCH_CSS}` : ''}</style>`,
1324
1367
  '</head>',
1325
1368
  '<body>',
1326
1369
  renderIconSprite(vocab),
@@ -1341,13 +1384,13 @@ function renderPage({ ir, payload, sections, drill, flows, views, mixedBundles =
1341
1384
  `<button type="button" id="drawer-close" class="btn icon dr-close" aria-label="닫기">${iconUse('u-close')}</button>` +
1342
1385
  '<div id="panel" class="panel" aria-live="polite"></div></aside>',
1343
1386
  '</div>',
1344
- renderLegend(payload.nodes, payload.edges, drill, ir.generatedAt, payload.nodes.length, payload.edges.length, hasFlows),
1387
+ renderLegend(payload.nodes, payload.edges, drill, ir.generatedAt, payload.nodes.length, payload.edges.length, hasFlows, hasDecisions),
1345
1388
  renderQuestions(payload.unresolved, nodeById, ir.edges, flows?.flows ?? [], flows?.drawnSteps ?? new Set(), views?.flatMap((v) => v.projection.messages)),
1346
1389
  (hasFlows
1347
1390
  ? '<div id="flow-pop" class="pop" role="dialog" aria-label="흐름 고르기" tabindex="-1" hidden><h3>흐름</h3><ul class="flow-list"></ul></div>'
1348
1391
  : '') + (hasViews ? `\n${renderViewsPop(views)}` : ''),
1349
1392
  `<script id="ir" type="application/json">${embedJson(stableStringify(payload))}</script>`,
1350
- `<script>${clientScriptFor(vocab, hasFlows && flows.flows.some((f) => f.service === undefined), hasViews, mixedBundles, hasSequences)}</script>`,
1393
+ `<script>${clientScriptFor(vocab, hasFlows && flows.flows.some((f) => f.service === undefined), hasViews, mixedBundles, hasSequences, flowBranches)}</script>`,
1351
1394
  '</body>',
1352
1395
  '</html>',
1353
1396
  '',