@tienne/gestalt 0.17.0 → 0.18.2

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 (173) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/role-agents/presentation-designer/AGENT.md +262 -0
  3. package/dist/role-agents/presentation-designer/templates/broadside.html +292 -0
  4. package/dist/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
  5. package/dist/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
  6. package/dist/role-agents/presentation-designer/templates/neo-grid.html +407 -0
  7. package/dist/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
  8. package/dist/role-agents/presentation-designer/templates/pink-script.html +241 -0
  9. package/dist/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
  10. package/dist/role-agents/presentation-designer/templates/signal.html +403 -0
  11. package/dist/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
  12. package/dist/role-agents/presentation-designer/templates/studio.html +379 -0
  13. package/dist/role-agents/technical-writer/AGENT.md +38 -0
  14. package/dist/skills/agent/SKILL.md +2 -0
  15. package/dist/skills/seed/SKILL.md +92 -0
  16. package/dist/src/cli/commands/monitor.d.ts +2 -0
  17. package/dist/src/cli/commands/monitor.d.ts.map +1 -0
  18. package/dist/src/cli/commands/monitor.js +13 -0
  19. package/dist/src/cli/commands/monitor.js.map +1 -0
  20. package/dist/src/cli/commands/seed.d.ts +4 -0
  21. package/dist/src/cli/commands/seed.d.ts.map +1 -0
  22. package/dist/src/cli/commands/seed.js +34 -0
  23. package/dist/src/cli/commands/seed.js.map +1 -0
  24. package/dist/src/interview/ambiguity.d.ts +8 -0
  25. package/dist/src/interview/ambiguity.d.ts.map +1 -0
  26. package/dist/src/interview/ambiguity.js +69 -0
  27. package/dist/src/interview/ambiguity.js.map +1 -0
  28. package/dist/src/mcp/tools/seed-passthrough.d.ts +5 -0
  29. package/dist/src/mcp/tools/seed-passthrough.d.ts.map +1 -0
  30. package/dist/src/mcp/tools/seed-passthrough.js +29 -0
  31. package/dist/src/mcp/tools/seed-passthrough.js.map +1 -0
  32. package/dist/src/mcp/tools/seed.d.ts +5 -0
  33. package/dist/src/mcp/tools/seed.d.ts.map +1 -0
  34. package/dist/src/mcp/tools/seed.js +19 -0
  35. package/dist/src/mcp/tools/seed.js.map +1 -0
  36. package/dist/src/recording/agg-converter.d.ts +25 -0
  37. package/dist/src/recording/agg-converter.d.ts.map +1 -0
  38. package/dist/src/recording/agg-converter.js +80 -0
  39. package/dist/src/recording/agg-converter.js.map +1 -0
  40. package/dist/src/recording/agg-installer.d.ts +6 -0
  41. package/dist/src/recording/agg-installer.d.ts.map +1 -0
  42. package/dist/src/recording/agg-installer.js +50 -0
  43. package/dist/src/recording/agg-installer.js.map +1 -0
  44. package/dist/src/recording/asciinema-installer.d.ts +6 -0
  45. package/dist/src/recording/asciinema-installer.d.ts.map +1 -0
  46. package/dist/src/recording/asciinema-installer.js +50 -0
  47. package/dist/src/recording/asciinema-installer.js.map +1 -0
  48. package/dist/src/recording/asciinema-recorder.d.ts +26 -0
  49. package/dist/src/recording/asciinema-recorder.d.ts.map +1 -0
  50. package/dist/src/recording/asciinema-recorder.js +52 -0
  51. package/dist/src/recording/asciinema-recorder.js.map +1 -0
  52. package/dist/src/recording/cast-generator.d.ts +7 -0
  53. package/dist/src/recording/cast-generator.d.ts.map +1 -0
  54. package/dist/src/recording/cast-generator.js +97 -0
  55. package/dist/src/recording/cast-generator.js.map +1 -0
  56. package/dist/src/recording/filename-generator.d.ts +19 -0
  57. package/dist/src/recording/filename-generator.d.ts.map +1 -0
  58. package/dist/src/recording/filename-generator.js +67 -0
  59. package/dist/src/recording/filename-generator.js.map +1 -0
  60. package/dist/src/recording/gif-generator.d.ts +21 -0
  61. package/dist/src/recording/gif-generator.d.ts.map +1 -0
  62. package/dist/src/recording/gif-generator.js +121 -0
  63. package/dist/src/recording/gif-generator.js.map +1 -0
  64. package/dist/src/recording/recording-dir.d.ts +5 -0
  65. package/dist/src/recording/recording-dir.d.ts.map +1 -0
  66. package/dist/src/recording/recording-dir.js +13 -0
  67. package/dist/src/recording/recording-dir.js.map +1 -0
  68. package/dist/src/recording/recording-orchestrator.d.ts +50 -0
  69. package/dist/src/recording/recording-orchestrator.d.ts.map +1 -0
  70. package/dist/src/recording/recording-orchestrator.js +98 -0
  71. package/dist/src/recording/recording-orchestrator.js.map +1 -0
  72. package/dist/src/recording/resume-detector.d.ts +10 -0
  73. package/dist/src/recording/resume-detector.d.ts.map +1 -0
  74. package/dist/src/recording/resume-detector.js +14 -0
  75. package/dist/src/recording/resume-detector.js.map +1 -0
  76. package/dist/src/recording/segment-merger.d.ts +27 -0
  77. package/dist/src/recording/segment-merger.d.ts.map +1 -0
  78. package/dist/src/recording/segment-merger.js +65 -0
  79. package/dist/src/recording/segment-merger.js.map +1 -0
  80. package/dist/src/recording/terminal-recorder.d.ts +31 -0
  81. package/dist/src/recording/terminal-recorder.d.ts.map +1 -0
  82. package/dist/src/recording/terminal-recorder.js +111 -0
  83. package/dist/src/recording/terminal-recorder.js.map +1 -0
  84. package/dist/src/scripts/postinstall.d.ts +2 -0
  85. package/dist/src/scripts/postinstall.d.ts.map +1 -0
  86. package/dist/src/scripts/postinstall.js +29 -0
  87. package/dist/src/scripts/postinstall.js.map +1 -0
  88. package/dist/src/seed/extractor.d.ts +15 -0
  89. package/dist/src/seed/extractor.d.ts.map +1 -0
  90. package/dist/src/seed/extractor.js +88 -0
  91. package/dist/src/seed/extractor.js.map +1 -0
  92. package/dist/src/seed/generator.d.ts +12 -0
  93. package/dist/src/seed/generator.d.ts.map +1 -0
  94. package/dist/src/seed/generator.js +66 -0
  95. package/dist/src/seed/generator.js.map +1 -0
  96. package/dist/src/seed/passthrough-generator.d.ts +31 -0
  97. package/dist/src/seed/passthrough-generator.d.ts.map +1 -0
  98. package/dist/src/seed/passthrough-generator.js +80 -0
  99. package/dist/src/seed/passthrough-generator.js.map +1 -0
  100. package/dist/src/seed/schema.d.ts +145 -0
  101. package/dist/src/seed/schema.d.ts.map +1 -0
  102. package/dist/src/seed/schema.js +37 -0
  103. package/dist/src/seed/schema.js.map +1 -0
  104. package/dist/src/tui/components/TUIApp.d.ts +20 -0
  105. package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
  106. package/dist/src/tui/components/TUIApp.js +84 -0
  107. package/dist/src/tui/components/TUIApp.js.map +1 -0
  108. package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
  109. package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
  110. package/dist/src/tui/hooks/event-store-reader.js +141 -0
  111. package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
  112. package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
  113. package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
  114. package/dist/src/tui/hooks/useEventStorePoller.js +84 -0
  115. package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
  116. package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
  117. package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
  118. package/dist/src/tui/screens/DashboardScreen.js +132 -0
  119. package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
  120. package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
  121. package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
  122. package/dist/src/tui/screens/DebugScreen.js +40 -0
  123. package/dist/src/tui/screens/DebugScreen.js.map +1 -0
  124. package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
  125. package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
  126. package/dist/src/tui/screens/EvolutionScreen.js +136 -0
  127. package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
  128. package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
  129. package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
  130. package/dist/src/tui/screens/HUDPanel.js +13 -0
  131. package/dist/src/tui/screens/HUDPanel.js.map +1 -0
  132. package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
  133. package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
  134. package/dist/src/tui/screens/InterviewScreen.js +103 -0
  135. package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
  136. package/dist/src/tui/screens/LogScreen.d.ts +4 -0
  137. package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
  138. package/dist/src/tui/screens/LogScreen.js +83 -0
  139. package/dist/src/tui/screens/LogScreen.js.map +1 -0
  140. package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
  141. package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
  142. package/dist/src/tui/screens/SessionListScreen.js +71 -0
  143. package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
  144. package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
  145. package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
  146. package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
  147. package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
  148. package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
  149. package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
  150. package/dist/src/tui/widgets/DriftMeter.js +27 -0
  151. package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
  152. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
  153. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
  154. package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
  155. package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
  156. package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
  157. package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
  158. package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
  159. package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
  160. package/package.json +1 -1
  161. package/role-agents/presentation-designer/AGENT.md +262 -0
  162. package/role-agents/presentation-designer/templates/broadside.html +292 -0
  163. package/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
  164. package/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
  165. package/role-agents/presentation-designer/templates/neo-grid.html +407 -0
  166. package/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
  167. package/role-agents/presentation-designer/templates/pink-script.html +241 -0
  168. package/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
  169. package/role-agents/presentation-designer/templates/signal.html +403 -0
  170. package/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
  171. package/role-agents/presentation-designer/templates/studio.html +379 -0
  172. package/role-agents/technical-writer/AGENT.md +38 -0
  173. package/skills/agent/SKILL.md +2 -0
@@ -0,0 +1,379 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ko">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Studio — Reveal.js</title>
6
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
8
+ <link href="https://fonts.googleapis.com/css2?family=Barlow:wght@400;500;700;800;900&family=IBM+Plex+Mono:wght@300;400;500&display=swap" rel="stylesheet" />
9
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reveal.js@5/dist/reveal.css" />
10
+ <style>
11
+ /* ── DESIGN TOKENS ────────────────────────────────────────────── */
12
+ :root {
13
+ --c-bg: #1c1c1c;
14
+ --c-bg-alt: #242422;
15
+ --c-bg-light: #f5d200;
16
+ --c-bg-light-alt: #f0cc00;
17
+ --c-fg: #f5d200;
18
+ --c-fg-2: rgba(245, 210, 0, 0.58);
19
+ --c-fg-3: rgba(245, 210, 0, 0.32);
20
+ --c-fg-light: #1c1c1c;
21
+ --c-fg-light-2: rgba(28, 28, 28, 0.62);
22
+ --c-fg-light-3: rgba(28, 28, 28, 0.35);
23
+ --c-accent: #f5d200;
24
+ --c-border: #2e2e2c;
25
+ --c-border-light: rgba(28, 28, 28, 0.18);
26
+ --f-display: "Barlow", sans-serif;
27
+ --f-body: "Barlow", sans-serif;
28
+ --f-mono: "IBM Plex Mono", monospace;
29
+ --sz-display: 12vw;
30
+ --sz-h1: 7.5vw;
31
+ --sz-h2: 4.8vw;
32
+ --sz-h3: 2.8vw;
33
+ --sz-lead: 1.6vw;
34
+ --sz-body: 1.15vw;
35
+ --sz-caption: 0.85vw;
36
+ --sz-label: 0.72vw;
37
+ --pad-x: 5vw;
38
+ --pad-y: 5vh;
39
+ --gap-lg: 3.5vh;
40
+ --gap-md: 2vh;
41
+ --gap-sm: 1vh;
42
+ --ease-enter: cubic-bezier(0.16, 1, 0.3, 1);
43
+ }
44
+
45
+ /* ── REVEAL RESET ─────────────────────────────────────────────── */
46
+ .reveal { font-family: var(--f-body); }
47
+ .reveal .slides { text-align: left; }
48
+ .reveal .slides section {
49
+ box-sizing: border-box;
50
+ width: 100%;
51
+ height: 100%;
52
+ padding: var(--pad-y) var(--pad-x);
53
+ display: grid;
54
+ grid-template-rows: auto 1fr auto;
55
+ overflow: hidden;
56
+ top: 0 !important;
57
+ left: 0 !important;
58
+ }
59
+ .reveal h1, .reveal h2, .reveal h3, .reveal h4,
60
+ .reveal p, .reveal ul, .reveal ol { margin: 0; }
61
+ .reveal .slides section.dark { background: var(--c-bg); color: var(--c-fg); }
62
+ .reveal .slides section.light { background: var(--c-bg-light); color: var(--c-fg-light); }
63
+
64
+ /* ── CHROME / FOOTER ──────────────────────────────────────────── */
65
+ .slide-chrome, .slide-foot {
66
+ display: flex;
67
+ justify-content: space-between;
68
+ align-items: center;
69
+ position: relative;
70
+ z-index: 1;
71
+ }
72
+ .dark .slide-chrome { border-bottom: 1px solid var(--c-border); padding-bottom: var(--gap-sm); margin-bottom: var(--gap-md); }
73
+ .dark .slide-foot { border-top: 1px solid var(--c-border); padding-top: var(--gap-sm); margin-top: var(--gap-md); }
74
+ .light .slide-chrome { border-bottom: 1px solid var(--c-border-light); padding-bottom: var(--gap-sm); margin-bottom: var(--gap-md); }
75
+ .light .slide-foot { border-top: 1px solid var(--c-border-light); padding-top: var(--gap-sm); margin-top: var(--gap-md); }
76
+ .slide-body { min-height: 0; }
77
+
78
+ /* ── SLIDE VARIANTS ───────────────────────────────────────────── */
79
+ .slide--cover, .slide--chapter, .slide--quote, .slide--end, .slide--statement {
80
+ display: flex !important;
81
+ flex-direction: column;
82
+ }
83
+ .slide--cover .slide-chrome, .slide--cover .slide-foot,
84
+ .slide--chapter .slide-chrome, .slide--chapter .slide-foot,
85
+ .slide--quote .slide-chrome, .slide--quote .slide-foot,
86
+ .slide--end .slide-chrome, .slide--end .slide-foot,
87
+ .slide--statement .slide-chrome, .slide--statement .slide-foot { display: none; }
88
+
89
+ .slide--cover { justify-content: flex-end; }
90
+ .slide--chapter { justify-content: flex-end; }
91
+ .slide--statement { justify-content: center; }
92
+ .slide--quote { justify-content: center; }
93
+ .slide--end { justify-content: space-between; }
94
+
95
+ .slide--split .slide-body { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap-md); align-items: center; }
96
+ .slide--stats .slide-body { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--gap-md); }
97
+ .slide--list .slide-body { display: grid; grid-template-columns: 2fr 3fr; gap: var(--gap-md); }
98
+ .slide--compare .slide-body { display: grid; grid-template-columns: 1fr 1fr; height: 100%; }
99
+
100
+ /* ── TYPOGRAPHY ───────────────────────────────────────────────── */
101
+ .display { font-size: var(--sz-display); font-weight: 900; line-height: 0.9; letter-spacing: -0.02em; text-transform: uppercase; }
102
+ .h1 { font-size: var(--sz-h1); font-weight: 900; line-height: 0.92; letter-spacing: -0.02em; text-transform: uppercase; }
103
+ .h2 { font-size: var(--sz-h2); font-weight: 900; line-height: 0.95; letter-spacing: -0.01em; text-transform: uppercase; }
104
+ .h3 { font-size: var(--sz-h3); font-weight: 700; line-height: 1.1; text-transform: uppercase; }
105
+ .lead { font-size: var(--sz-lead); font-weight: 500; line-height: 1.45; }
106
+ .body { font-size: var(--sz-body); font-weight: 400; line-height: 1.6; }
107
+ .caption { font-size: var(--sz-caption); line-height: 1.5; }
108
+ .label { font-family: var(--f-mono); font-size: var(--sz-label); font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; }
109
+ .kicker { font-family: var(--f-mono); font-size: var(--sz-label); letter-spacing: 0.12em; text-transform: uppercase; color: var(--c-accent); display: block; margin-bottom: var(--gap-sm); }
110
+ .dark .kicker { color: var(--c-accent); }
111
+ .light .kicker { color: var(--c-fg-light-2); }
112
+ .muted { opacity: 0.55; }
113
+ .accent { color: var(--c-accent); }
114
+
115
+ /* ── COMPONENTS ───────────────────────────────────────────────── */
116
+ .rule { width: 36px; height: 2px; background: var(--c-accent); margin: var(--gap-sm) 0; }
117
+ .light .rule { background: var(--c-fg-light); }
118
+
119
+ .img-placeholder {
120
+ background: var(--c-bg-alt);
121
+ width: 100%; height: 100%; min-height: 25vh;
122
+ display: flex; align-items: center; justify-content: center;
123
+ font-family: var(--f-mono); font-size: var(--sz-label); letter-spacing: 0.1em;
124
+ color: var(--c-fg-3);
125
+ }
126
+
127
+ .bullet-list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: var(--gap-sm); }
128
+ .bullet-list li { display: flex; gap: 0.75em; font-size: var(--sz-body); line-height: 1.6; }
129
+ .dark .bullet-list li::before { content: "—"; color: var(--c-accent); flex-shrink: 0; }
130
+ .light .bullet-list li::before { content: "—"; color: var(--c-fg-light); flex-shrink: 0; }
131
+
132
+ .stat-val { font-size: 6vw; font-weight: 900; line-height: 1; }
133
+ .stat-unit { font-size: 2.5vw; font-weight: 900; }
134
+
135
+ /* ── BAR CHART ────────────────────────────────────────────────── */
136
+ .bar-chart { display: flex; align-items: flex-end; gap: 1.5vw; height: 22vh; }
137
+ .bar-col { display: flex; flex-direction: column; align-items: center; gap: 0.5vh; flex: 1; }
138
+ .bar-track { flex: 1; width: 100%; display: flex; align-items: flex-end; border-left: 2px solid var(--c-fg-3); }
139
+ .bar-fill { width: 100%; background: var(--c-fg-3); transition: height 0.6s var(--ease-enter); }
140
+ .bar-fill.hi { background: var(--c-accent); }
141
+ .bar-label { font-family: var(--f-mono); font-size: 0.65vw; text-align: center; opacity: 0.6; }
142
+
143
+ /* ── ANIMATIONS ───────────────────────────────────────────────── */
144
+ [data-anim] { opacity: 0; animation-fill-mode: forwards; animation-timing-function: var(--ease-enter); animation-duration: 0.55s; }
145
+ [data-anim][data-delay="0"] { animation-delay: 0s; }
146
+ [data-anim][data-delay="1"] { animation-delay: 0.08s; }
147
+ [data-anim][data-delay="2"] { animation-delay: 0.18s; }
148
+ [data-anim][data-delay="3"] { animation-delay: 0.3s; }
149
+ [data-anim][data-delay="4"] { animation-delay: 0.44s; }
150
+ [data-anim][data-delay="5"] { animation-delay: 0.6s; }
151
+ .reveal .present [data-anim="fade-up"] { animation-name: kFadeUp; }
152
+ .reveal .present [data-anim="fade-in"] { animation-name: kFadeIn; }
153
+ .reveal .present [data-anim="reveal-right"] { animation-name: kRevealRight; opacity: 1; }
154
+ .reveal .present [data-anim="scale-in"] { animation-name: kScaleIn; }
155
+ @keyframes kFadeUp { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: none; } }
156
+ @keyframes kFadeIn { from { opacity: 0; } to { opacity: 1; } }
157
+ @keyframes kRevealRight { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
158
+ @keyframes kScaleIn { from { opacity: 0; transform: scale(0.94); } to { opacity: 1; transform: none; } }
159
+
160
+ /* ── REVEAL UI OVERRIDES ──────────────────────────────────────── */
161
+ .reveal .controls { color: var(--c-accent); }
162
+ .reveal .progress { color: var(--c-accent); }
163
+ .reveal .slide-number { font-family: var(--f-mono); background: transparent; color: var(--c-fg-3); font-size: 0.6em; }
164
+ </style>
165
+ </head>
166
+ <body style="margin:0;background:#111">
167
+ <div class="reveal">
168
+ <div class="slides">
169
+
170
+ <!-- ════════════════════════════════════════════════
171
+ COVER — image + overlay text
172
+ ════════════════════════════════════════════════ -->
173
+ <section class="dark slide--cover">
174
+ <div style="flex:1;position:relative">
175
+ <div class="img-placeholder">IMAGE</div>
176
+ </div>
177
+ <div class="slide-body" style="padding-top:var(--gap-md)">
178
+ <span class="kicker" data-anim="fade-in" data-delay="0">{{ORGANIZATION}}</span>
179
+ <div class="display" data-anim="fade-up" data-delay="1">{{TITLE}}</div>
180
+ <div class="rule" data-anim="reveal-right" data-delay="2" style="margin-top:1.5vh"></div>
181
+ <div style="display:flex;justify-content:space-between;margin-top:1.5vh" data-anim="fade-in" data-delay="3">
182
+ <span class="label muted">{{DATE}}</span>
183
+ <span class="label muted">{{AUTHOR}}</span>
184
+ </div>
185
+ </div>
186
+ </section>
187
+
188
+ <!-- ════════════════════════════════════════════════
189
+ CHAPTER DIVIDER (light background)
190
+ ════════════════════════════════════════════════ -->
191
+ <section class="light slide--chapter">
192
+ <div class="slide-body" style="display:flex;flex-direction:column;justify-content:flex-end;gap:var(--gap-sm)">
193
+ <span class="kicker" data-anim="fade-in" data-delay="0">01 — 섹션명</span>
194
+ <div class="h1" data-anim="fade-up" data-delay="1">챕터<br>제목</div>
195
+ <div class="rule" data-anim="reveal-right" data-delay="2"></div>
196
+ <p class="body muted" data-anim="fade-up" data-delay="3">서브 설명</p>
197
+ </div>
198
+ </section>
199
+
200
+ <!-- ════════════════════════════════════════════════
201
+ STATS — 3-column (dark)
202
+ ════════════════════════════════════════════════ -->
203
+ <section class="dark">
204
+ <div class="slide-chrome">
205
+ <span class="label muted">{{SECTION_LABEL}}</span>
206
+ <span class="label muted">01 / 지표</span>
207
+ </div>
208
+ <div class="slide-body slide--stats">
209
+ <div style="border-top:1px solid var(--c-border);padding-top:var(--gap-sm)" data-anim="fade-up" data-delay="1">
210
+ <div class="stat-val accent">98<span class="stat-unit">%</span></div>
211
+ <div class="rule"></div>
212
+ <p class="body" style="margin-top:var(--gap-sm)">지표명</p>
213
+ <p class="caption muted">전기 대비 +12%p</p>
214
+ </div>
215
+ <div style="border-top:1px solid var(--c-border);padding-top:var(--gap-sm)" data-anim="fade-up" data-delay="2">
216
+ <div class="stat-val accent">2.4<span class="stat-unit">s</span></div>
217
+ <div class="rule"></div>
218
+ <p class="body" style="margin-top:var(--gap-sm)">지표명</p>
219
+ <p class="caption muted">목표치 3s 달성</p>
220
+ </div>
221
+ <div style="border-top:1px solid var(--c-border);padding-top:var(--gap-sm)" data-anim="fade-up" data-delay="3">
222
+ <div class="stat-val accent">41</div>
223
+ <div class="rule"></div>
224
+ <p class="body" style="margin-top:var(--gap-sm)">지표명</p>
225
+ <p class="caption muted">누적 총 186개</p>
226
+ </div>
227
+ </div>
228
+ <div class="slide-foot">
229
+ <span class="label muted">{{ORG}} · {{DATE}}</span>
230
+ </div>
231
+ </section>
232
+
233
+ <!-- ════════════════════════════════════════════════
234
+ SPLIT — text + list (light)
235
+ ════════════════════════════════════════════════ -->
236
+ <section class="light">
237
+ <div class="slide-chrome">
238
+ <span class="label" style="color:var(--c-fg-light-2)">{{SECTION_LABEL}}</span>
239
+ <span class="label" style="color:var(--c-fg-light-3)">01 / 분석</span>
240
+ </div>
241
+ <div class="slide-body slide--split">
242
+ <div data-anim="fade-up" data-delay="1">
243
+ <span class="kicker">Topic</span>
244
+ <div class="h2">슬라이드<br>제목</div>
245
+ <div class="rule"></div>
246
+ </div>
247
+ <div data-anim="fade-up" data-delay="2">
248
+ <ul class="bullet-list">
249
+ <li>항목 1 — 설명</li>
250
+ <li>항목 2 — 설명</li>
251
+ <li>항목 3 — 설명</li>
252
+ <li>항목 4 — 설명</li>
253
+ </ul>
254
+ </div>
255
+ </div>
256
+ <div class="slide-foot" style="border-color:var(--c-border-light)">
257
+ <span class="label" style="color:var(--c-fg-light-3)">{{ORG}} · {{DATE}}</span>
258
+ </div>
259
+ </section>
260
+
261
+ <!-- ════════════════════════════════════════════════
262
+ BAR CHART (dark)
263
+ ════════════════════════════════════════════════ -->
264
+ <section class="dark">
265
+ <div class="slide-chrome">
266
+ <span class="label muted">{{SECTION_LABEL}}</span>
267
+ <span class="label muted">01 / 데이터</span>
268
+ </div>
269
+ <div class="slide-body" style="display:flex;flex-direction:column;justify-content:flex-end;gap:var(--gap-lg)">
270
+ <div data-anim="fade-up" data-delay="0">
271
+ <span class="kicker">Chart Title</span>
272
+ <div class="h2">데이터 비교</div>
273
+ </div>
274
+ <div class="bar-chart" data-anim="scale-in" data-delay="2">
275
+ <div class="bar-col"><div class="bar-track"><div class="bar-fill" style="height:85%"></div></div><span class="bar-label">항목 A</span></div>
276
+ <div class="bar-col"><div class="bar-track"><div class="bar-fill hi" style="height:60%"></div></div><span class="bar-label">항목 B</span></div>
277
+ <div class="bar-col"><div class="bar-track"><div class="bar-fill" style="height:48%"></div></div><span class="bar-label">항목 C</span></div>
278
+ <div class="bar-col"><div class="bar-track"><div class="bar-fill" style="height:38%"></div></div><span class="bar-label">항목 D</span></div>
279
+ </div>
280
+ </div>
281
+ <div class="slide-foot">
282
+ <span class="label muted">{{ORG}} · {{DATE}}</span>
283
+ </div>
284
+ </section>
285
+
286
+ <!-- ════════════════════════════════════════════════
287
+ LIST — heading + bullets (dark)
288
+ ════════════════════════════════════════════════ -->
289
+ <section class="dark">
290
+ <div class="slide-chrome">
291
+ <span class="label muted">{{SECTION_LABEL}}</span>
292
+ <span class="label muted">02 / 계획</span>
293
+ </div>
294
+ <div class="slide-body slide--list">
295
+ <div data-anim="fade-up" data-delay="1">
296
+ <span class="kicker">{{PERIOD}}</span>
297
+ <div class="h2">주요<br>과제</div>
298
+ <div class="rule"></div>
299
+ </div>
300
+ <div data-anim="fade-up" data-delay="2">
301
+ <ul class="bullet-list">
302
+ <li>할 일 1</li>
303
+ <li>할 일 2</li>
304
+ <li>할 일 3</li>
305
+ <li>할 일 4</li>
306
+ <li>할 일 5</li>
307
+ </ul>
308
+ </div>
309
+ </div>
310
+ <div class="slide-foot">
311
+ <span class="label muted">{{ORG}} · {{DATE}}</span>
312
+ </div>
313
+ </section>
314
+
315
+ <!-- ════════════════════════════════════════════════
316
+ STATEMENT — full-screen (dark)
317
+ ════════════════════════════════════════════════ -->
318
+ <section class="dark slide--statement">
319
+ <div class="slide-body" style="display:flex;flex-direction:column;justify-content:center">
320
+ <div class="display" data-anim="fade-up" data-delay="0">선언문<br>또는 테제</div>
321
+ <div class="rule" data-anim="reveal-right" data-delay="2" style="margin-top:2vh"></div>
322
+ <p class="body muted" data-anim="fade-up" data-delay="3" style="margin-top:var(--gap-sm)">— 출처 / 맥락</p>
323
+ </div>
324
+ </section>
325
+
326
+ <!-- ════════════════════════════════════════════════
327
+ QUOTE (dark)
328
+ ════════════════════════════════════════════════ -->
329
+ <section class="dark slide--quote">
330
+ <div class="slide-body" style="display:flex;flex-direction:column;justify-content:center;gap:var(--gap-md)">
331
+ <div class="rule" data-anim="reveal-right" data-delay="0"></div>
332
+ <div class="h1" data-anim="fade-up" data-delay="1">"인용문을<br>크게 보여줄 때"</div>
333
+ <p class="label muted" data-anim="fade-in" data-delay="3">— 발언자, 맥락</p>
334
+ </div>
335
+ </section>
336
+
337
+ <!-- ════════════════════════════════════════════════
338
+ END / Q&A (light)
339
+ ════════════════════════════════════════════════ -->
340
+ <section class="light slide--end">
341
+ <div style="padding-top:var(--pad-y)" data-anim="fade-up" data-delay="0">
342
+ <span class="kicker">감사합니다</span>
343
+ <div class="display">Q&amp;A</div>
344
+ <div class="rule" style="margin-top:2vh"></div>
345
+ </div>
346
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-md);padding-bottom:var(--pad-y)" data-anim="fade-up" data-delay="2">
347
+ <div>
348
+ <p class="label" style="color:var(--c-fg-light-2)">이메일</p>
349
+ <p class="body">{{EMAIL}}</p>
350
+ </div>
351
+ <div>
352
+ <p class="label" style="color:var(--c-fg-light-2)">소속</p>
353
+ <p class="body">{{ORG}}</p>
354
+ </div>
355
+ </div>
356
+ </section>
357
+
358
+ </div>
359
+ </div>
360
+ <script src="https://cdn.jsdelivr.net/npm/reveal.js@5/dist/reveal.js"></script>
361
+ <script src="https://cdn.jsdelivr.net/npm/reveal.js@5/plugin/notes/notes.js"></script>
362
+ <script>
363
+ Reveal.initialize({
364
+ hash: true,
365
+ width: 1600,
366
+ height: 900,
367
+ margin: 0,
368
+ minScale: 0.1,
369
+ maxScale: 1.5,
370
+ controls: true,
371
+ progress: true,
372
+ slideNumber: 'c/t',
373
+ transition: 'fade',
374
+ backgroundTransition: 'fade',
375
+ plugins: [RevealNotes],
376
+ });
377
+ </script>
378
+ </body>
379
+ </html>
@@ -274,6 +274,44 @@ Apply these principles when structuring any document:
274
274
 
275
275
  위반 항목이 있으면 해당 구간만 수정 후 재검증.
276
276
 
277
+ ## Collaboration Protocol — presentation-designer와 협업
278
+
279
+ 프레젠테이션 작성 요청 시 `technical-writer`는 **Phase 1 (워딩 초안)** 을 담당한다.
280
+
281
+ ### 프레젠테이션 워딩 초안 작성 원칙
282
+
283
+ 일반 문서와 다른 슬라이드 카피의 규칙:
284
+
285
+ **제목 작성:**
286
+ - ❌ "Q2 성과" → ✅ "Q2에서 증명한 것"
287
+ - ❌ "번들 최적화" → ✅ "번들을 32% 줄인 세 가지 결정"
288
+ - 제목은 명사형이 아니라 주장·결론형으로
289
+
290
+ **수치 작성:**
291
+ - ❌ "98%" → ✅ "목표 90% 대비 98% — 8%p 초과 달성"
292
+ - ❌ "2.4s" → ✅ "LCP 2.4s, 업계 권고 기준(3s) 달성"
293
+ - 숫자는 반드시 기준값과 함께
294
+
295
+ **슬라이드 밀도:**
296
+ - 슬라이드당 핵심 포인트 최대 1개
297
+ - 불릿 3개 초과 시 슬라이드 분리 권고
298
+ - 청중이 읽는 시간: 슬라이드당 20초 이내
299
+
300
+ ### 워딩 초안 출력 형식
301
+
302
+ `presentation-designer`에게 전달할 워딩 초안은 아래 형식으로 구조화:
303
+
304
+ ```
305
+ [슬라이드 N] {슬라이드 타입 제안: cover/stats/split/statement/...}
306
+ 제목: "제목 텍스트"
307
+ 핵심 포인트:
308
+ - 포인트 1 (수치 있으면 맥락 포함)
309
+ - 포인트 2
310
+ 발표자 노트: 청중에게 강조할 말, 슬라이드에 없는 맥락
311
+ ```
312
+
313
+ ---
314
+
277
315
  ## Output Format
278
316
 
279
317
  When writing documentation, produce:
@@ -35,6 +35,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
35
35
  /agent backend-developer "is this REST API design consistent?"
36
36
  /agent qa-engineer "what edge cases am I missing for this login flow?"
37
37
  /agent frontend-developer "review this React component for accessibility issues"
38
+ /agent presentation-designer "분기 실적 발표용 Reveal.js 슬라이드 구조 설계해줘"
38
39
 
39
40
  # Run a Review Agent
40
41
  /agent security-reviewer "check this authentication code for vulnerabilities"
@@ -53,6 +54,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
53
54
  | `backend-developer` | API, database, authentication, server |
54
55
  | `frontend-developer` | UI, React, accessibility |
55
56
  | `designer` | UX/UI, design systems, interaction |
57
+ | `presentation-designer` | Reveal.js slides, storytelling, visual design for decks |
56
58
  | `qa-engineer` | Testing, edge cases, quality |
57
59
  | `devops-engineer` | CI/CD, infrastructure, monitoring |
58
60
  | `product-planner` | Requirements, roadmap, user stories |
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: seed
3
+ version: "1.0.0"
4
+ description: "Generate a Seed specification from a completed interview"
5
+ triggers:
6
+ - "generate seed"
7
+ - "create spec"
8
+ - "build seed"
9
+ inputs:
10
+ sessionId:
11
+ type: string
12
+ required: true
13
+ description: "The interview session ID to generate a seed from"
14
+ force:
15
+ type: boolean
16
+ required: false
17
+ description: "Force generation even if ambiguity threshold is not met"
18
+ outputs:
19
+ - seed
20
+ ---
21
+
22
+ # Seed Generation Skill
23
+
24
+ This skill transforms completed interview data into a structured project specification (Seed).
25
+
26
+ ## Output Structure
27
+
28
+ - **Goal**: Clear project objective
29
+ - **Constraints**: Technical and business constraints
30
+ - **Acceptance Criteria**: Measurable success conditions
31
+ - **Ontology Schema**: Entity-relationship model
32
+ - **Gestalt Analysis**: Findings from each principle applied
33
+
34
+ ## Requirements
35
+
36
+ - Interview session must be in `completed` status
37
+ - Ambiguity score must be ≤ 0.2 (unless `force` is true)
38
+
39
+ ## Passthrough Mode
40
+
41
+ API 키 없이 MCP 서버 실행 시 자동 활성화. Seed 생성을 caller가 직접 수행한다.
42
+
43
+ ### 추가 Input 파라미터
44
+
45
+ | 파라미터 | 타입 | 필수 | 설명 |
46
+ |---------|------|------|------|
47
+ | `seed` | object | 2단계에서 필수 | caller가 생성한 Seed JSON |
48
+ | `seed.goal` | string | 필수 | 프로젝트 목표 |
49
+ | `seed.constraints` | string[] | 필수 | 기술/비즈니스 제약조건 |
50
+ | `seed.acceptanceCriteria` | string[] | 필수 | 수용 기준 |
51
+ | `seed.ontologySchema` | object | 필수 | 엔티티-관계 모델 |
52
+ | `seed.gestaltAnalysis` | array | 필수 | 게슈탈트 분석 결과 |
53
+
54
+ ### 2단계 플로우
55
+
56
+ **1단계: SeedContext 요청**
57
+ ```
58
+ ges_generate_seed({ sessionId: "<id>" })
59
+ ```
60
+ → `{ status: "prompt", seedContext, message }` 반환
61
+
62
+ SeedContext 필드:
63
+ - `systemPrompt`: Seed 생성용 시스템 프롬프트
64
+ - `seedPrompt`: 인터뷰 내용 기반 Seed 생성 프롬프트
65
+ - `allRounds[]`: `{ roundNumber, question, response, gestaltFocus }`
66
+
67
+ **2단계: Seed 제출 및 검증**
68
+ ```
69
+ ges_generate_seed({
70
+ sessionId: "<id>",
71
+ seed: {
72
+ goal: "명확한 프로젝트 목표",
73
+ constraints: ["TypeScript 사용", "REST API"],
74
+ acceptanceCriteria: ["응답 시간 200ms 이하"],
75
+ ontologySchema: {
76
+ entities: [{ name: "User", description: "...", attributes: ["id", "email"] }],
77
+ relations: [{ from: "User", to: "Order", type: "has_many" }]
78
+ },
79
+ gestaltAnalysis: [
80
+ { principle: "closure", finding: "인증 요구사항 완전히 파악됨", confidence: 0.9 }
81
+ ]
82
+ }
83
+ })
84
+ ```
85
+ → `{ status: "generated", seed }` (metadata 자동 생성 포함) 또는 `{ error }` 반환
86
+
87
+ ### Seed 검증 스키마 (Zod)
88
+
89
+ - `gestaltAnalysis[].principle`: `closure | proximity | similarity | figure_ground | continuity`
90
+ - `gestaltAnalysis[].confidence`: 0.0 ~ 1.0
91
+ - `ontologySchema.entities[]`: `{ name: string(min 1), description: string, attributes: string[] }`
92
+ - `ontologySchema.relations[]`: `{ from: string(min 1), to: string(min 1), type: string(min 1) }`
@@ -0,0 +1,2 @@
1
+ export declare function monitorCommand(sessionId?: string): Promise<void>;
2
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { render } from 'ink';
3
+ import { loadConfig } from '../../core/config.js';
4
+ import { TUIApp } from '../../tui/components/TUIApp.js';
5
+ export async function monitorCommand(sessionId) {
6
+ const config = loadConfig();
7
+ const { waitUntilExit } = render(React.createElement(TUIApp, {
8
+ dbPath: config.dbPath,
9
+ initialSessionId: sessionId,
10
+ }));
11
+ await waitUntilExit();
12
+ }
13
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAkB;IACrD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,gBAAgB,EAAE,SAAS;KAC5B,CAAC,CACH,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function seedCommand(sessionId: string, options: {
2
+ force?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/seed.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG"}
@@ -0,0 +1,34 @@
1
+ import { loadConfig } from '../../core/config.js';
2
+ import { EventStore } from '../../events/store.js';
3
+ import { AnthropicAdapter } from '../../llm/adapter.js';
4
+ import { InterviewEngine } from '../../interview/engine.js';
5
+ import { SeedGenerator } from '../../seed/generator.js';
6
+ export async function seedCommand(sessionId, options) {
7
+ const config = loadConfig();
8
+ if (!config.anthropicApiKey) {
9
+ console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
10
+ process.exit(1);
11
+ }
12
+ const eventStore = new EventStore(config.dbPath);
13
+ const llm = new AnthropicAdapter(config.anthropicApiKey, config.model);
14
+ const engine = new InterviewEngine(llm, eventStore);
15
+ const generator = new SeedGenerator(llm, eventStore);
16
+ try {
17
+ const session = engine.getSession(sessionId);
18
+ console.log(`\n🌱 Generating seed for session: ${session.topic}\n`);
19
+ const result = await generator.generate(session, options.force ?? false);
20
+ if (!result.ok) {
21
+ console.error(`Error: ${result.error.message}`);
22
+ return;
23
+ }
24
+ console.log(JSON.stringify(result.value, null, 2));
25
+ console.log('\n✅ Seed generated successfully.\n');
26
+ }
27
+ catch (e) {
28
+ console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);
29
+ }
30
+ finally {
31
+ eventStore.close();
32
+ }
33
+ }
34
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../src/cli/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,OAA4B;IAC/E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AmbiguityScore, InterviewRound, ProjectType } from '../core/types.js';
2
+ import type { LLMAdapter } from '../llm/types.js';
3
+ export declare class AmbiguityScorer {
4
+ private llm;
5
+ constructor(llm: LLMAdapter);
6
+ score(topic: string, rounds: InterviewRound[], projectType: ProjectType): Promise<AmbiguityScore>;
7
+ }
8
+ //# sourceMappingURL=ambiguity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ambiguity.d.ts","sourceRoot":"","sources":["../../../src/interview/ambiguity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,eAAe;IACd,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU;IAE7B,KAAK,CACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,cAAc,CAAC;CA4B3B"}