maestro-flow 0.3.5 → 0.3.7

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 (71) hide show
  1. package/.claude/commands/maestro-brainstorm.md +10 -1
  2. package/.claude/commands/maestro-milestone-audit.md +1 -1
  3. package/.claude/commands/maestro-milestone-complete.md +2 -1
  4. package/.claude/commands/maestro-milestone-release.md +96 -0
  5. package/.claude/commands/maestro-phase-add.md +9 -1
  6. package/.claude/commands/maestro-phase-transition.md +9 -1
  7. package/.claude/commands/maestro.md +6 -0
  8. package/.claude/commands/manage-codebase-rebuild.md +76 -50
  9. package/.claude/commands/manage-codebase-refresh.md +9 -1
  10. package/.claude/commands/quality-refactor.md +1 -1
  11. package/.claude/commands/quality-sync.md +9 -1
  12. package/.claude/commands/spec-setup.md +1 -1
  13. package/.codex/skills/maestro-coordinate/SKILL.md +20 -6
  14. package/.codex/skills/manage-issue-analyze/SKILL.md +1 -1
  15. package/.codex/skills/quality-retrospective/SKILL.md +3 -3
  16. package/.codex/skills/team-coordinate/SKILL.md +1 -1
  17. package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +19 -10
  18. package/.codex/skills/team-coordinate/roles/coordinator/role.md +2 -2
  19. package/.codex/skills/team-executor/SKILL.md +1 -1
  20. package/.codex/skills/team-executor/roles/executor/commands/monitor.md +20 -9
  21. package/.codex/skills/team-lifecycle-v4/SKILL.md +2 -2
  22. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +31 -12
  23. package/.codex/skills/team-lifecycle-v4/roles/coordinator/role.md +1 -1
  24. package/.codex/skills/team-quality-assurance/SKILL.md +1 -1
  25. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +20 -9
  26. package/.codex/skills/team-quality-assurance/roles/coordinator/role.md +1 -1
  27. package/.codex/skills/team-review/SKILL.md +1 -1
  28. package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +20 -9
  29. package/.codex/skills/team-review/roles/coordinator/role.md +1 -1
  30. package/.codex/skills/team-tech-debt/SKILL.md +1 -1
  31. package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +20 -9
  32. package/.codex/skills/team-tech-debt/roles/coordinator/role.md +1 -1
  33. package/.codex/skills/team-testing/SKILL.md +2 -2
  34. package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +20 -9
  35. package/.codex/skills/team-testing/roles/coordinator/role.md +1 -1
  36. package/chains/singles/spec-map.json +2 -2
  37. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +1 -1
  38. package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
  39. package/dashboard/dist-server/src/commands/delegate.d.ts +23 -0
  40. package/dashboard/dist-server/src/commands/delegate.js +91 -55
  41. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  42. package/dist/src/brainstorm-visualize/frame.d.ts +8 -0
  43. package/dist/src/brainstorm-visualize/frame.d.ts.map +1 -0
  44. package/dist/src/brainstorm-visualize/frame.js +655 -0
  45. package/dist/src/brainstorm-visualize/frame.js.map +1 -0
  46. package/dist/src/brainstorm-visualize/server.d.ts +2 -0
  47. package/dist/src/brainstorm-visualize/server.d.ts.map +1 -0
  48. package/dist/src/brainstorm-visualize/server.js +180 -0
  49. package/dist/src/brainstorm-visualize/server.js.map +1 -0
  50. package/dist/src/cli.js +11 -1
  51. package/dist/src/cli.js.map +1 -1
  52. package/dist/src/commands/brainstorm-visualize.d.ts +3 -0
  53. package/dist/src/commands/brainstorm-visualize.d.ts.map +1 -0
  54. package/dist/src/commands/brainstorm-visualize.js +337 -0
  55. package/dist/src/commands/brainstorm-visualize.js.map +1 -0
  56. package/dist/src/commands/core-memory.d.ts +3 -0
  57. package/dist/src/commands/core-memory.d.ts.map +1 -0
  58. package/dist/src/commands/core-memory.js +101 -0
  59. package/dist/src/commands/core-memory.js.map +1 -0
  60. package/dist/src/commands/delegate.d.ts +23 -0
  61. package/dist/src/commands/delegate.d.ts.map +1 -1
  62. package/dist/src/commands/delegate.js +91 -55
  63. package/dist/src/commands/delegate.js.map +1 -1
  64. package/dist/src/mcp/delegate-channel-relay.d.ts.map +1 -1
  65. package/dist/src/mcp/delegate-channel-relay.js +6 -0
  66. package/dist/src/mcp/delegate-channel-relay.js.map +1 -1
  67. package/dist/src/mcp/server.d.ts.map +1 -1
  68. package/dist/src/mcp/server.js +27 -0
  69. package/dist/src/mcp/server.js.map +1 -1
  70. package/package.json +1 -1
  71. package/.claude/commands/spec-map.md +0 -82
@@ -0,0 +1,655 @@
1
+ // ---------------------------------------------------------------------------
2
+ // HTML frame + inline styles for the brainstorm visualizer.
3
+ //
4
+ // Design system aligned with dashboard (Notion-style warm palette, Inter +
5
+ // JetBrains Mono, light/dark via prefers-color-scheme + data-theme).
6
+ //
7
+ // Semantic class names (.options, .cards, .mockup, .split, .pros-cons) are
8
+ // used by the agent when writing prototype fragments; the CSS below is the
9
+ // canonical styling. Full-document prototypes are served as-is.
10
+ // ---------------------------------------------------------------------------
11
+ const STYLES = `
12
+ /* ===== Reset ===== */
13
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
14
+
15
+ /* ===== Light mode (default) ===== */
16
+ :root, [data-theme="light"] {
17
+ --bg-primary: #FAF8F5;
18
+ --bg-secondary: #F3F0EA;
19
+ --bg-card: #FFFFFF;
20
+ --bg-elevated: #FFFFFF;
21
+ --bg-hover: rgba(55, 53, 47, 0.04);
22
+ --bg-active: rgba(55, 53, 47, 0.08);
23
+ --bg-tertiary: #EBE8E1;
24
+
25
+ --text-primary: #2D2A26;
26
+ --text-secondary: #78756F;
27
+ --text-tertiary: #A09D97;
28
+ --text-placeholder: #D1CEC8;
29
+
30
+ --border: #E8E5DE;
31
+ --border-divider: #ECEAE4;
32
+
33
+ --accent-blue: #5B8DB8;
34
+ --accent-green: #5A9E78;
35
+ --accent-orange: #C8863A;
36
+ --accent-yellow: #B89540;
37
+ --accent-purple: #9178B5;
38
+ --accent-red: #C46555;
39
+
40
+ --brand: #10a37f;
41
+ --brand-light: #e8faf4;
42
+
43
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.06), 0 0 0 1px rgba(15,15,15,0.05);
44
+ --shadow-md: 0 4px 8px rgba(0,0,0,0.08), 0 0 0 1px rgba(15,15,15,0.04);
45
+ --shadow-lg: 0 8px 24px rgba(0,0,0,0.12), 0 0 0 1px rgba(15,15,15,0.03);
46
+
47
+ --code-bg: #2C2723;
48
+ --code-text: #D9D0C4;
49
+
50
+ --scrollbar-thumb: rgba(55, 53, 47, 0.16);
51
+ --scrollbar-thumb-hover: rgba(55, 53, 47, 0.28);
52
+ }
53
+
54
+ /* ===== Dark mode ===== */
55
+ @media (prefers-color-scheme: dark) {
56
+ :root:not([data-theme="light"]) {
57
+ --bg-primary: #191919;
58
+ --bg-secondary: #202020;
59
+ --bg-card: #252525;
60
+ --bg-elevated: #2F2F2F;
61
+ --bg-hover: rgba(255,255,255,0.055);
62
+ --bg-active: rgba(255,255,255,0.08);
63
+ --bg-tertiary: #2A2A2A;
64
+
65
+ --text-primary: rgba(255,255,255,0.9);
66
+ --text-secondary: rgba(255,255,255,0.6);
67
+ --text-tertiary: rgba(255,255,255,0.4);
68
+ --text-placeholder: rgba(255,255,255,0.3);
69
+
70
+ --border: rgba(255,255,255,0.08);
71
+ --border-divider: rgba(255,255,255,0.06);
72
+
73
+ --accent-blue: #529CCA;
74
+ --accent-green: #3A8660;
75
+ --accent-orange: #C47539;
76
+ --accent-yellow: #C4963A;
77
+ --accent-purple: #8E6FBF;
78
+ --accent-red: #C4554D;
79
+
80
+ --brand: #10a37f;
81
+ --brand-light: #0f2b22;
82
+
83
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.04);
84
+ --shadow-md: 0 4px 8px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.04);
85
+ --shadow-lg: 0 8px 24px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04);
86
+
87
+ --code-bg: #1a1a1a;
88
+ --code-text: #D9D0C4;
89
+
90
+ --scrollbar-thumb: rgba(255,255,255,0.12);
91
+ --scrollbar-thumb-hover: rgba(255,255,255,0.22);
92
+ }
93
+ }
94
+ [data-theme="dark"] {
95
+ --bg-primary: #191919;
96
+ --bg-secondary: #202020;
97
+ --bg-card: #252525;
98
+ --bg-elevated: #2F2F2F;
99
+ --bg-hover: rgba(255,255,255,0.055);
100
+ --bg-active: rgba(255,255,255,0.08);
101
+ --bg-tertiary: #2A2A2A;
102
+ --text-primary: rgba(255,255,255,0.9);
103
+ --text-secondary: rgba(255,255,255,0.6);
104
+ --text-tertiary: rgba(255,255,255,0.4);
105
+ --text-placeholder: rgba(255,255,255,0.3);
106
+ --border: rgba(255,255,255,0.08);
107
+ --border-divider: rgba(255,255,255,0.06);
108
+ --accent-blue: #529CCA;
109
+ --accent-green: #3A8660;
110
+ --accent-orange: #C47539;
111
+ --accent-yellow: #C4963A;
112
+ --accent-purple: #8E6FBF;
113
+ --accent-red: #C4554D;
114
+ --brand: #10a37f;
115
+ --brand-light: #0f2b22;
116
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.04);
117
+ --shadow-md: 0 4px 8px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.04);
118
+ --shadow-lg: 0 8px 24px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04);
119
+ --code-bg: #1a1a1a;
120
+ --code-text: #D9D0C4;
121
+ --scrollbar-thumb: rgba(255,255,255,0.12);
122
+ --scrollbar-thumb-hover: rgba(255,255,255,0.22);
123
+ }
124
+
125
+ /* ===== Base ===== */
126
+ body {
127
+ font-family: 'Inter', ui-sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
128
+ font-size: 0.875rem;
129
+ line-height: 1.5;
130
+ background: var(--bg-primary);
131
+ color: var(--text-primary);
132
+ -webkit-font-smoothing: antialiased;
133
+ -moz-osx-font-smoothing: grayscale;
134
+ }
135
+
136
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
137
+ ::-webkit-scrollbar-track { background: transparent; }
138
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 4px; }
139
+ ::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-thumb-hover); }
140
+
141
+ .wrap { max-width: 960px; margin: 0 auto; padding: 40px 28px; }
142
+
143
+ /* ===== Header ===== */
144
+ header {
145
+ display: flex; justify-content: space-between; align-items: baseline;
146
+ padding-bottom: 16px; border-bottom: 1px solid var(--border-divider); margin-bottom: 28px;
147
+ }
148
+ header h1 {
149
+ margin: 0; font-size: 0.8125rem; font-weight: 500;
150
+ color: var(--text-secondary); letter-spacing: -0.01em;
151
+ }
152
+ header .status {
153
+ font-size: 0.6875rem; color: var(--text-tertiary);
154
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
155
+ font-variant-numeric: tabular-nums;
156
+ }
157
+ header .status.live::before { content: "● "; color: var(--accent-green); }
158
+ header .status.idle::before { content: "○ "; color: var(--text-tertiary); }
159
+
160
+ /* ===== Typography ===== */
161
+ h1, h2, h3 { color: var(--text-primary); margin-top: 0; }
162
+ h2 { font-size: 1.25rem; font-weight: 600; letter-spacing: -0.02em; margin-bottom: 6px; }
163
+ .subtitle { color: var(--text-secondary); font-size: 0.8125rem; margin: -2px 0 22px; }
164
+ .section { margin: 28px 0; }
165
+ .label {
166
+ font-size: 0.6875rem; color: var(--text-tertiary);
167
+ text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 10px;
168
+ }
169
+
170
+ /* ===== Options (A/B/C) ===== */
171
+ .options { display: flex; flex-direction: column; gap: 8px; }
172
+ .option {
173
+ padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px;
174
+ cursor: pointer; background: var(--bg-card);
175
+ box-shadow: var(--shadow-sm);
176
+ transition: border-color 150ms cubic-bezier(0.2,0,0,1), background 150ms cubic-bezier(0.2,0,0,1), transform 100ms;
177
+ }
178
+ .option:hover { border-color: var(--accent-blue); background: var(--bg-hover); }
179
+ .option.selected { border-color: var(--accent-green); background: var(--brand-light); }
180
+ .option.selected::before { content: "✓ "; color: var(--accent-green); font-weight: 600; }
181
+ .option[data-choice]::after {
182
+ content: attr(data-choice); float: right; color: var(--text-tertiary);
183
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.6875rem;
184
+ }
185
+ .option.selected[data-choice]::after { color: var(--accent-green); }
186
+
187
+ /* ===== Cards ===== */
188
+ .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 12px; }
189
+ .card {
190
+ padding: 16px; border: 1px solid var(--border); border-radius: 12px;
191
+ cursor: pointer; background: var(--bg-card);
192
+ box-shadow: var(--shadow-sm);
193
+ transition: border-color 150ms, background 150ms, transform 200ms cubic-bezier(0.2,0,0,1), box-shadow 200ms;
194
+ }
195
+ .card:hover { border-color: var(--accent-blue); background: var(--bg-hover); transform: translateY(-1px); box-shadow: var(--shadow-md); }
196
+ .card.selected { border-color: var(--accent-green); background: var(--brand-light); }
197
+ .card h3 { margin: 0 0 6px; font-size: 0.875rem; font-weight: 600; }
198
+ .card p { margin: 0; color: var(--text-secondary); font-size: 0.8125rem; }
199
+
200
+ /* ===== Mockup ===== */
201
+ .mockup {
202
+ border: 1px solid var(--border); border-radius: 12px; overflow: hidden;
203
+ background: var(--bg-secondary); margin: 12px 0; box-shadow: var(--shadow-sm);
204
+ }
205
+ .mockup-header {
206
+ padding: 10px 14px; background: var(--bg-tertiary); border-bottom: 1px solid var(--border-divider);
207
+ font-size: 0.6875rem; color: var(--text-tertiary);
208
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
209
+ }
210
+ .mockup-body { padding: 16px; min-height: 160px; }
211
+
212
+ /* ===== Split comparison ===== */
213
+ .split { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
214
+ @media (max-width: 720px) { .split { grid-template-columns: 1fr; } }
215
+
216
+ /* ===== Pros/Cons ===== */
217
+ .pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 14px 0; }
218
+ .pros, .cons {
219
+ padding: 14px 16px; border-radius: 8px;
220
+ border: 1px solid var(--border);
221
+ }
222
+ .pros { background: rgba(90, 158, 120, 0.08); border-color: rgba(90, 158, 120, 0.2); }
223
+ .cons { background: rgba(196, 101, 85, 0.08); border-color: rgba(196, 101, 85, 0.2); }
224
+ .pros h4, .cons h4 { margin: 0 0 8px; font-size: 0.6875rem; letter-spacing: 0.05em; text-transform: uppercase; }
225
+ .pros h4 { color: var(--accent-green); }
226
+ .cons h4 { color: var(--accent-red); }
227
+ .pros ul, .cons ul { margin: 0; padding-left: 18px; font-size: 0.8125rem; color: var(--text-secondary); }
228
+
229
+ /* ===== Wireframe primitives ===== */
230
+ .mock-nav {
231
+ display: flex; gap: 16px; padding: 10px 16px;
232
+ border-bottom: 1px solid var(--border-divider); color: var(--text-tertiary); font-size: 0.8125rem;
233
+ }
234
+ .mock-sidebar {
235
+ width: 180px; padding: 16px; border-right: 1px solid var(--border-divider);
236
+ color: var(--text-tertiary); font-size: 0.8125rem; display: inline-block; vertical-align: top;
237
+ }
238
+ .mock-content { padding: 16px; display: inline-block; color: var(--text-secondary); font-size: 0.8125rem; vertical-align: top; }
239
+ .mock-button {
240
+ display: inline-block; padding: 6px 14px; border-radius: 6px;
241
+ background: var(--brand); color: #fff; font-size: 0.8125rem; font-weight: 500;
242
+ border: none;
243
+ }
244
+ .mock-input {
245
+ display: inline-block; padding: 6px 10px; border-radius: 6px;
246
+ background: var(--bg-secondary); border: 1px solid var(--border); color: var(--text-tertiary);
247
+ font-size: 0.8125rem; min-width: 180px;
248
+ }
249
+ .placeholder {
250
+ background: var(--bg-tertiary);
251
+ border-radius: 6px; min-height: 60px; display: block;
252
+ }
253
+
254
+ /* ===== Screen list (index) ===== */
255
+ .screen-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
256
+ .screen-list li { margin: 0; }
257
+ .screen-list a {
258
+ display: block; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px;
259
+ background: var(--bg-card); color: var(--text-primary); text-decoration: none;
260
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.8125rem;
261
+ box-shadow: var(--shadow-sm);
262
+ transition: border-color 150ms, background 150ms, box-shadow 150ms;
263
+ }
264
+ .screen-list a:hover { border-color: var(--accent-blue); background: var(--bg-hover); box-shadow: var(--shadow-md); }
265
+ .back-link {
266
+ display: inline-block; margin-bottom: 18px; color: var(--text-tertiary);
267
+ text-decoration: none; font-size: 0.8125rem;
268
+ transition: color 150ms;
269
+ }
270
+ .back-link:hover { color: var(--accent-blue); }
271
+
272
+ /* ===== Compare toolbar ===== */
273
+ .compare-toolbar {
274
+ position: sticky; top: 0; z-index: 10;
275
+ display: flex; justify-content: space-between; align-items: center;
276
+ padding: 10px 0; margin-bottom: 16px;
277
+ border-bottom: 1px solid var(--border-divider);
278
+ background: var(--bg-primary);
279
+ }
280
+ .compare-toolbar .label { margin-bottom: 0; }
281
+ .layout-controls { display: flex; gap: 4px; }
282
+ .layout-btn {
283
+ appearance: none; border: 1px solid var(--border); background: var(--bg-card);
284
+ width: 32px; height: 28px; border-radius: 6px; cursor: pointer;
285
+ display: flex; align-items: center; justify-content: center; gap: 2px;
286
+ color: var(--text-tertiary); transition: all 150ms;
287
+ }
288
+ .layout-btn:hover { border-color: var(--accent-blue); color: var(--text-secondary); }
289
+ .layout-btn.active { border-color: var(--accent-blue); background: var(--bg-active); color: var(--accent-blue); }
290
+ .layout-btn .col-bar {
291
+ width: 4px; height: 14px; border-radius: 1px; background: currentColor;
292
+ }
293
+
294
+ /* ===== Compare grid ===== */
295
+ .compare-grid { display: grid; gap: 16px; }
296
+ .compare-panel {
297
+ border: 1px solid var(--border); border-radius: 12px; overflow: hidden;
298
+ background: var(--bg-card); box-shadow: var(--shadow-sm);
299
+ transition: border-color 200ms, box-shadow 200ms, transform 200ms cubic-bezier(0.2,0,0,1);
300
+ animation: card-enter 300ms cubic-bezier(0.2,0,0,1) backwards;
301
+ }
302
+ .compare-panel:hover { border-color: var(--accent-blue); box-shadow: var(--shadow-md); transform: translateY(-1px); }
303
+ @keyframes card-enter {
304
+ from { opacity: 0; transform: translateY(5px) scale(0.98); }
305
+ to { opacity: 1; transform: translateY(0) scale(1); }
306
+ }
307
+ .compare-label {
308
+ padding: 8px 14px; background: var(--bg-tertiary); border-bottom: 1px solid var(--border-divider);
309
+ font-size: 0.6875rem; color: var(--text-tertiary);
310
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
311
+ display: flex; align-items: center; justify-content: space-between;
312
+ }
313
+ .compare-label .panel-id {
314
+ display: inline-flex; align-items: center; justify-content: center;
315
+ width: 20px; height: 20px; border-radius: 4px;
316
+ background: var(--accent-blue); color: #fff;
317
+ font-size: 0.625rem; font-weight: 600; margin-right: 8px; flex-shrink: 0;
318
+ }
319
+ .compare-label-actions { display: flex; gap: 4px; }
320
+ .compare-label-actions a, .compare-label-actions button {
321
+ appearance: none; border: none; background: var(--bg-hover); cursor: pointer;
322
+ width: 24px; height: 24px; border-radius: 4px;
323
+ display: inline-flex; align-items: center; justify-content: center;
324
+ color: var(--text-tertiary); font-size: 12px; text-decoration: none;
325
+ transition: background 150ms, color 150ms;
326
+ }
327
+ .compare-label-actions a:hover, .compare-label-actions button:hover {
328
+ background: var(--bg-active); color: var(--text-primary);
329
+ }
330
+ .compare-body { padding: 16px; min-height: 200px; }
331
+
332
+ /* ===== Expand overlay ===== */
333
+ .expand-overlay {
334
+ position: fixed; inset: 0; z-index: 100;
335
+ background: rgba(0,0,0,0.5); backdrop-filter: blur(4px);
336
+ display: none; align-items: center; justify-content: center;
337
+ animation: overlay-in 200ms;
338
+ }
339
+ .expand-overlay.visible { display: flex; }
340
+ @keyframes overlay-in { from { opacity: 0; } to { opacity: 1; } }
341
+ .expand-content {
342
+ width: 90vw; max-width: 1100px; max-height: 90vh;
343
+ background: var(--bg-card); border-radius: 12px; overflow: auto;
344
+ box-shadow: var(--shadow-lg);
345
+ animation: modal-enter 250ms cubic-bezier(0.2,0,0,1);
346
+ }
347
+ @keyframes modal-enter {
348
+ from { opacity: 0; transform: scale(0.95) translateY(-10px); }
349
+ to { opacity: 1; transform: scale(1) translateY(0); }
350
+ }
351
+ .expand-header {
352
+ position: sticky; top: 0; z-index: 1;
353
+ display: flex; justify-content: space-between; align-items: center;
354
+ padding: 12px 16px; background: var(--bg-tertiary); border-bottom: 1px solid var(--border-divider);
355
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.8125rem; color: var(--text-secondary);
356
+ }
357
+ .expand-close {
358
+ appearance: none; border: none; background: var(--bg-hover); cursor: pointer;
359
+ width: 28px; height: 28px; border-radius: 6px;
360
+ color: var(--text-tertiary); font-size: 16px; transition: background 150ms;
361
+ }
362
+ .expand-close:hover { background: var(--bg-active); color: var(--text-primary); }
363
+ .expand-body { padding: 24px; }
364
+
365
+ /* ===== Code blocks ===== */
366
+ code, .mono {
367
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.8125rem;
368
+ }
369
+
370
+ /* ===== Empty state ===== */
371
+ .empty {
372
+ padding: 60px 20px; text-align: center; color: var(--text-tertiary);
373
+ border: 1px dashed var(--border); border-radius: 12px;
374
+ }
375
+
376
+ /* ===== Theme toggle ===== */
377
+ .theme-toggle {
378
+ appearance: none; border: none; background: var(--bg-hover); cursor: pointer;
379
+ width: 28px; height: 28px; border-radius: 6px; display: flex; align-items: center; justify-content: center;
380
+ color: var(--text-tertiary); font-size: 14px; transition: background 150ms;
381
+ }
382
+ .theme-toggle:hover { background: var(--bg-active); }
383
+
384
+ /* ===== Entrance animation ===== */
385
+ @keyframes fade-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
386
+ .wrap { animation: fade-in 300ms cubic-bezier(0.2,0,0,1); }
387
+ @media (prefers-reduced-motion: reduce) { .wrap { animation: none; } }
388
+ `.trim();
389
+ const TITLE = 'Maestro Brainstorm Visualizer';
390
+ const FONTS = `<link rel="preconnect" href="https://fonts.googleapis.com">
391
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
392
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">`;
393
+ const THEME_SCRIPT = `<script>
394
+ (function(){
395
+ var t = localStorage.getItem('bv-theme');
396
+ if (t) document.documentElement.setAttribute('data-theme', t);
397
+ window.__toggleTheme = function() {
398
+ var cur = document.documentElement.getAttribute('data-theme');
399
+ var next = cur === 'dark' ? 'light' : 'dark';
400
+ if (!cur) next = 'dark';
401
+ document.documentElement.setAttribute('data-theme', next);
402
+ localStorage.setItem('bv-theme', next);
403
+ var btn = document.querySelector('.theme-toggle');
404
+ if (btn) btn.textContent = next === 'dark' ? '☀' : '☾';
405
+ };
406
+ })();
407
+ </script>`;
408
+ function themeButton() {
409
+ return `<button class="theme-toggle" onclick="__toggleTheme()" title="Toggle theme">☾</button>`;
410
+ }
411
+ export function emptyPage() {
412
+ return `<!doctype html>
413
+ <html lang="en">
414
+ <head>
415
+ <meta charset="utf-8">
416
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
417
+ <title>${TITLE}</title>
418
+ ${FONTS}
419
+ <style>${STYLES}</style>
420
+ ${THEME_SCRIPT}
421
+ </head>
422
+ <body>
423
+ <div class="wrap">
424
+ <header>
425
+ <h1>${TITLE}</h1>
426
+ <div style="display:flex;align-items:center;gap:10px;">
427
+ <span class="status idle">waiting</span>
428
+ ${themeButton()}
429
+ </div>
430
+ </header>
431
+ <div class="empty">
432
+ <p>No screen files in this session yet.</p>
433
+ <p class="subtitle">Write <code>*.html</code> files into the screen directory, then reload.</p>
434
+ </div>
435
+ </div>
436
+ </body>
437
+ </html>`;
438
+ }
439
+ export function indexPage(screens) {
440
+ const items = screens.map((s) => {
441
+ const href = `/screen/${encodeURIComponent(s)}`;
442
+ return ` <li><a href="${href}">${escapeHtml(s)}</a></li>`;
443
+ }).join('\n');
444
+ const compareHref = `/compare?files=${screens.map(encodeURIComponent).join(',')}`;
445
+ return `<!doctype html>
446
+ <html lang="en">
447
+ <head>
448
+ <meta charset="utf-8">
449
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
450
+ <title>${TITLE}</title>
451
+ ${FONTS}
452
+ <style>${STYLES}</style>
453
+ ${THEME_SCRIPT}
454
+ </head>
455
+ <body>
456
+ <div class="wrap">
457
+ <header>
458
+ <h1>${TITLE}</h1>
459
+ <div style="display:flex;align-items:center;gap:10px;">
460
+ <span class="status live">${screens.length} screen${screens.length === 1 ? '' : 's'}</span>
461
+ ${themeButton()}
462
+ </div>
463
+ </header>
464
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;">
465
+ <div class="label" style="margin-bottom:0;">Screens</div>
466
+ <a href="${compareHref}" style="font-size:0.8125rem;color:var(--accent-blue);text-decoration:none;">Compare all →</a>
467
+ </div>
468
+ <ul class="screen-list">
469
+ ${items}
470
+ </ul>
471
+ </div>
472
+ </body>
473
+ </html>`;
474
+ }
475
+ export function wrapScreen(screenName, body) {
476
+ // Full HTML documents are served as-is.
477
+ if (/^\s*<!doctype/i.test(body) || /^\s*<html/i.test(body)) {
478
+ return body;
479
+ }
480
+ return `<!doctype html>
481
+ <html lang="en">
482
+ <head>
483
+ <meta charset="utf-8">
484
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
485
+ <title>${TITLE} — ${escapeHtml(screenName)}</title>
486
+ ${FONTS}
487
+ <style>${STYLES}</style>
488
+ ${THEME_SCRIPT}
489
+ </head>
490
+ <body>
491
+ <div class="wrap">
492
+ <header>
493
+ <h1>${TITLE}</h1>
494
+ <div style="display:flex;align-items:center;gap:10px;">
495
+ <span class="status live">${escapeHtml(screenName)}</span>
496
+ ${themeButton()}
497
+ </div>
498
+ </header>
499
+ <a href="/" class="back-link">← back to index</a>
500
+ ${body}
501
+ </div>
502
+ </body>
503
+ </html>`;
504
+ }
505
+ export function comparePage(screens) {
506
+ const defaultCols = screens.length <= 2 ? screens.length : screens.length <= 4 ? 2 : 3;
507
+ const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
508
+ const panels = screens.map((s, i) => {
509
+ const letter = letters[i] ?? String(i + 1);
510
+ const isFullDoc = /^\s*<!doctype/i.test(s.body) || /^\s*<html/i.test(s.body);
511
+ const content = isFullDoc
512
+ ? `<iframe srcdoc="${escapeAttr(s.body)}" style="width:100%;height:100%;border:0;min-height:400px;background:var(--bg-primary);border-radius:6px;"></iframe>`
513
+ : s.body;
514
+ const singleHref = `/screen/${encodeURIComponent(s.name)}`;
515
+ return ` <div class="compare-panel" style="animation-delay:${i * 60}ms" data-panel="${letter}">
516
+ <div class="compare-label">
517
+ <span><span class="panel-id">${letter}</span>${escapeHtml(s.name)}</span>
518
+ <span class="compare-label-actions">
519
+ <button onclick="__expand('${letter}')" title="Expand">⤢</button>
520
+ <a href="${singleHref}" title="Open full page">↗</a>
521
+ </span>
522
+ </div>
523
+ <div class="compare-body">${content}</div>
524
+ </div>`;
525
+ }).join('\n');
526
+ // Build layout button SVGs (1/2/3 col indicators using simple bars)
527
+ const layoutBtns = [1, 2, 3].map((n) => {
528
+ const bars = Array.from({ length: n }, () => '<span class="col-bar"></span>').join('');
529
+ const active = n === defaultCols ? ' active' : '';
530
+ return `<button class="layout-btn${active}" onclick="__setLayout(${n})" title="${n} column${n > 1 ? 's' : ''}">${bars}</button>`;
531
+ }).join('\n ');
532
+ // Build expand overlay panel contents (hidden, shown on click)
533
+ const expandPanels = screens.map((s, i) => {
534
+ const letter = letters[i] ?? String(i + 1);
535
+ const isFullDoc = /^\s*<!doctype/i.test(s.body) || /^\s*<html/i.test(s.body);
536
+ const content = isFullDoc
537
+ ? `<iframe srcdoc="${escapeAttr(s.body)}" style="width:100%;height:70vh;border:0;background:var(--bg-primary);border-radius:6px;"></iframe>`
538
+ : s.body;
539
+ return `<div class="expand-panel" data-expand="${letter}" style="display:none;">
540
+ <div class="expand-header">
541
+ <span>${letter} — ${escapeHtml(s.name)}</span>
542
+ <div style="display:flex;gap:6px;align-items:center;">
543
+ <button class="expand-close" onclick="__expandNav(-1)" title="Previous">←</button>
544
+ <span style="font-size:0.6875rem;color:var(--text-tertiary);">${i + 1} / ${screens.length}</span>
545
+ <button class="expand-close" onclick="__expandNav(1)" title="Next">→</button>
546
+ <button class="expand-close" onclick="__closeExpand()" title="Close">✕</button>
547
+ </div>
548
+ </div>
549
+ <div class="expand-body">${content}</div>
550
+ </div>`;
551
+ }).join('\n ');
552
+ const compareScript = `<script>
553
+ (function(){
554
+ var grid = document.querySelector('.compare-grid');
555
+ var wrap = document.querySelector('.wrap');
556
+ var overlay = document.querySelector('.expand-overlay');
557
+ var panels = ${JSON.stringify(screens.map((_, i) => letters[i] ?? String(i + 1)))};
558
+ var currentIdx = 0;
559
+
560
+ window.__setLayout = function(cols) {
561
+ grid.style.gridTemplateColumns = 'repeat(' + cols + ', 1fr)';
562
+ wrap.style.maxWidth = cols > 2 ? '1400px' : '960px';
563
+ document.querySelectorAll('.layout-btn').forEach(function(b, i) {
564
+ b.classList.toggle('active', i + 1 === cols);
565
+ });
566
+ };
567
+
568
+ window.__expand = function(letter) {
569
+ currentIdx = panels.indexOf(letter);
570
+ showPanel(letter);
571
+ overlay.classList.add('visible');
572
+ document.addEventListener('keydown', onKey);
573
+ };
574
+
575
+ window.__closeExpand = function() {
576
+ overlay.classList.remove('visible');
577
+ document.querySelectorAll('.expand-panel').forEach(function(p) { p.style.display = 'none'; });
578
+ document.removeEventListener('keydown', onKey);
579
+ };
580
+
581
+ window.__expandNav = function(dir) {
582
+ currentIdx = (currentIdx + dir + panels.length) % panels.length;
583
+ showPanel(panels[currentIdx]);
584
+ };
585
+
586
+ function showPanel(letter) {
587
+ document.querySelectorAll('.expand-panel').forEach(function(p) {
588
+ p.style.display = p.dataset.expand === letter ? 'block' : 'none';
589
+ });
590
+ }
591
+
592
+ function onKey(e) {
593
+ if (e.key === 'Escape') __closeExpand();
594
+ else if (e.key === 'ArrowLeft') __expandNav(-1);
595
+ else if (e.key === 'ArrowRight') __expandNav(1);
596
+ }
597
+
598
+ overlay.addEventListener('click', function(e) {
599
+ if (e.target === overlay) __closeExpand();
600
+ });
601
+ })();
602
+ </script>`;
603
+ return `<!doctype html>
604
+ <html lang="en">
605
+ <head>
606
+ <meta charset="utf-8">
607
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
608
+ <title>${TITLE} — Compare</title>
609
+ ${FONTS}
610
+ <style>${STYLES}
611
+ .compare-grid { grid-template-columns: repeat(${defaultCols}, 1fr); }
612
+ @media (max-width: 720px) { .compare-grid { grid-template-columns: 1fr; } }
613
+ </style>
614
+ ${THEME_SCRIPT}
615
+ </head>
616
+ <body>
617
+ <div class="wrap" style="max-width:${defaultCols > 2 ? 1400 : 960}px;">
618
+ <header>
619
+ <h1>${TITLE}</h1>
620
+ <div style="display:flex;align-items:center;gap:10px;">
621
+ <span class="status live">${screens.length} screen${screens.length === 1 ? '' : 's'}</span>
622
+ ${themeButton()}
623
+ </div>
624
+ </header>
625
+ <a href="/" class="back-link">← back to index</a>
626
+ <div class="compare-toolbar">
627
+ <div class="label">Comparing ${screens.length} screens</div>
628
+ <div class="layout-controls">
629
+ ${layoutBtns}
630
+ </div>
631
+ </div>
632
+ <div class="compare-grid">
633
+ ${panels}
634
+ </div>
635
+ </div>
636
+ <div class="expand-overlay">
637
+ <div class="expand-content">
638
+ ${expandPanels}
639
+ </div>
640
+ </div>
641
+ ${compareScript}
642
+ </body>
643
+ </html>`;
644
+ }
645
+ function escapeAttr(s) {
646
+ return s.replace(/[&"]/g, (c) => c === '&' ? '&amp;' : '&quot;');
647
+ }
648
+ function escapeHtml(s) {
649
+ return s.replace(/[&<>"']/g, (c) => (c === '&' ? '&amp;' :
650
+ c === '<' ? '&lt;' :
651
+ c === '>' ? '&gt;' :
652
+ c === '"' ? '&quot;' :
653
+ '&#39;'));
654
+ }
655
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/brainstorm-visualize/frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/brainstorm-visualize/server.ts"],"names":[],"mappings":""}