@boshu2/vibe-check 1.0.1 → 1.1.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 (128) hide show
  1. package/.agents/bundles/ml-learning-loop-complete-plan-2025-11-28.md +908 -0
  2. package/.agents/bundles/unified-vibe-system-plan-phase1-2025-11-28.md +962 -0
  3. package/.agents/bundles/unified-vibe-system-research-2025-11-28.md +1003 -0
  4. package/.agents/bundles/vibe-check-ecosystem-plan-2025-11-29.md +635 -0
  5. package/.agents/bundles/vibe-check-gamification-complete-2025-11-29.md +132 -0
  6. package/.agents/bundles/vibe-score-scientific-framework-2025-11-28.md +602 -0
  7. package/.vibe-check/calibration.json +38 -0
  8. package/.vibe-check/latest.json +114 -0
  9. package/CHANGELOG.md +46 -0
  10. package/CLAUDE.md +178 -0
  11. package/README.md +265 -63
  12. package/action.yml +270 -0
  13. package/dashboard/app.js +494 -0
  14. package/dashboard/index.html +235 -0
  15. package/dashboard/styles.css +647 -0
  16. package/dist/calibration/ece.d.ts +26 -0
  17. package/dist/calibration/ece.d.ts.map +1 -0
  18. package/dist/calibration/ece.js +93 -0
  19. package/dist/calibration/ece.js.map +1 -0
  20. package/dist/calibration/index.d.ts +3 -0
  21. package/dist/calibration/index.d.ts.map +1 -0
  22. package/dist/calibration/index.js +15 -0
  23. package/dist/calibration/index.js.map +1 -0
  24. package/dist/calibration/storage.d.ts +34 -0
  25. package/dist/calibration/storage.d.ts.map +1 -0
  26. package/dist/calibration/storage.js +188 -0
  27. package/dist/calibration/storage.js.map +1 -0
  28. package/dist/cli.js +30 -76
  29. package/dist/cli.js.map +1 -1
  30. package/dist/commands/analyze.d.ts +16 -0
  31. package/dist/commands/analyze.d.ts.map +1 -0
  32. package/dist/commands/analyze.js +256 -0
  33. package/dist/commands/analyze.js.map +1 -0
  34. package/dist/commands/index.d.ts +4 -0
  35. package/dist/commands/index.d.ts.map +1 -0
  36. package/dist/commands/index.js +11 -0
  37. package/dist/commands/index.js.map +1 -0
  38. package/dist/commands/level.d.ts +3 -0
  39. package/dist/commands/level.d.ts.map +1 -0
  40. package/dist/commands/level.js +277 -0
  41. package/dist/commands/level.js.map +1 -0
  42. package/dist/commands/profile.d.ts +4 -0
  43. package/dist/commands/profile.d.ts.map +1 -0
  44. package/dist/commands/profile.js +143 -0
  45. package/dist/commands/profile.js.map +1 -0
  46. package/dist/gamification/achievements.d.ts +15 -0
  47. package/dist/gamification/achievements.d.ts.map +1 -0
  48. package/dist/gamification/achievements.js +273 -0
  49. package/dist/gamification/achievements.js.map +1 -0
  50. package/dist/gamification/index.d.ts +8 -0
  51. package/dist/gamification/index.d.ts.map +1 -0
  52. package/dist/gamification/index.js +30 -0
  53. package/dist/gamification/index.js.map +1 -0
  54. package/dist/gamification/profile.d.ts +46 -0
  55. package/dist/gamification/profile.d.ts.map +1 -0
  56. package/dist/gamification/profile.js +272 -0
  57. package/dist/gamification/profile.js.map +1 -0
  58. package/dist/gamification/streaks.d.ts +26 -0
  59. package/dist/gamification/streaks.d.ts.map +1 -0
  60. package/dist/gamification/streaks.js +132 -0
  61. package/dist/gamification/streaks.js.map +1 -0
  62. package/dist/gamification/types.d.ts +111 -0
  63. package/dist/gamification/types.d.ts.map +1 -0
  64. package/dist/gamification/types.js +26 -0
  65. package/dist/gamification/types.js.map +1 -0
  66. package/dist/gamification/xp.d.ts +37 -0
  67. package/dist/gamification/xp.d.ts.map +1 -0
  68. package/dist/gamification/xp.js +115 -0
  69. package/dist/gamification/xp.js.map +1 -0
  70. package/dist/git.d.ts +11 -0
  71. package/dist/git.d.ts.map +1 -1
  72. package/dist/git.js +52 -0
  73. package/dist/git.js.map +1 -1
  74. package/dist/metrics/code-stability.d.ts +13 -0
  75. package/dist/metrics/code-stability.d.ts.map +1 -0
  76. package/dist/metrics/code-stability.js +74 -0
  77. package/dist/metrics/code-stability.js.map +1 -0
  78. package/dist/metrics/file-churn.d.ts +8 -0
  79. package/dist/metrics/file-churn.d.ts.map +1 -0
  80. package/dist/metrics/file-churn.js +75 -0
  81. package/dist/metrics/file-churn.js.map +1 -0
  82. package/dist/metrics/time-spiral.d.ts +8 -0
  83. package/dist/metrics/time-spiral.d.ts.map +1 -0
  84. package/dist/metrics/time-spiral.js +69 -0
  85. package/dist/metrics/time-spiral.js.map +1 -0
  86. package/dist/metrics/velocity-anomaly.d.ts +13 -0
  87. package/dist/metrics/velocity-anomaly.d.ts.map +1 -0
  88. package/dist/metrics/velocity-anomaly.js +67 -0
  89. package/dist/metrics/velocity-anomaly.js.map +1 -0
  90. package/dist/output/index.d.ts +6 -3
  91. package/dist/output/index.d.ts.map +1 -1
  92. package/dist/output/index.js +4 -3
  93. package/dist/output/index.js.map +1 -1
  94. package/dist/output/json.d.ts +2 -2
  95. package/dist/output/json.d.ts.map +1 -1
  96. package/dist/output/json.js +54 -0
  97. package/dist/output/json.js.map +1 -1
  98. package/dist/output/markdown.d.ts +2 -2
  99. package/dist/output/markdown.d.ts.map +1 -1
  100. package/dist/output/markdown.js +34 -1
  101. package/dist/output/markdown.js.map +1 -1
  102. package/dist/output/terminal.d.ts +6 -2
  103. package/dist/output/terminal.d.ts.map +1 -1
  104. package/dist/output/terminal.js +131 -3
  105. package/dist/output/terminal.js.map +1 -1
  106. package/dist/recommend/index.d.ts +3 -0
  107. package/dist/recommend/index.d.ts.map +1 -0
  108. package/dist/recommend/index.js +14 -0
  109. package/dist/recommend/index.js.map +1 -0
  110. package/dist/recommend/ordered-logistic.d.ts +49 -0
  111. package/dist/recommend/ordered-logistic.d.ts.map +1 -0
  112. package/dist/recommend/ordered-logistic.js +153 -0
  113. package/dist/recommend/ordered-logistic.js.map +1 -0
  114. package/dist/recommend/questions.d.ts +19 -0
  115. package/dist/recommend/questions.d.ts.map +1 -0
  116. package/dist/recommend/questions.js +73 -0
  117. package/dist/recommend/questions.js.map +1 -0
  118. package/dist/score/index.d.ts +21 -0
  119. package/dist/score/index.d.ts.map +1 -0
  120. package/dist/score/index.js +48 -0
  121. package/dist/score/index.js.map +1 -0
  122. package/dist/score/weights.d.ts +16 -0
  123. package/dist/score/weights.d.ts.map +1 -0
  124. package/dist/score/weights.js +28 -0
  125. package/dist/score/weights.js.map +1 -0
  126. package/dist/types.d.ts +83 -0
  127. package/dist/types.d.ts.map +1 -1
  128. package/package.json +10 -9
@@ -0,0 +1,647 @@
1
+ /* Vibe-Check Dashboard - Styles */
2
+ /* Based on GitHub Dark Theme */
3
+
4
+ * {
5
+ margin: 0;
6
+ padding: 0;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ :root {
11
+ /* GitHub Dark Theme Colors */
12
+ --bg-primary: #0d1117;
13
+ --bg-secondary: #161b22;
14
+ --bg-tertiary: #1c2128;
15
+ --bg-overlay: #21262d;
16
+ --bg-card: #161b22;
17
+
18
+ --text-primary: #e6edf3;
19
+ --text-secondary: #7d8590;
20
+ --text-muted: #484f58;
21
+
22
+ --border-primary: #30363d;
23
+ --border-secondary: #21262d;
24
+
25
+ /* Vibe-Check Accent Colors */
26
+ --accent-primary: #58a6ff;
27
+ --accent-hover: #79b8ff;
28
+ --accent-success: #3fb950;
29
+ --accent-warning: #d29922;
30
+ --accent-danger: #f85149;
31
+
32
+ /* Rating Colors */
33
+ --elite: #a371f7;
34
+ --high: #3fb950;
35
+ --medium: #d29922;
36
+ --low: #f85149;
37
+
38
+ /* Spacing */
39
+ --spacing-xs: 0.25rem;
40
+ --spacing-sm: 0.5rem;
41
+ --spacing-md: 1rem;
42
+ --spacing-lg: 1.5rem;
43
+ --spacing-xl: 2rem;
44
+
45
+ /* Sidebar */
46
+ --sidebar-width: 260px;
47
+ --sidebar-collapsed-width: 60px;
48
+
49
+ /* Transitions */
50
+ --transition-fast: 150ms ease;
51
+ --transition-normal: 250ms ease;
52
+
53
+ /* Shadows */
54
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
55
+ --shadow-lg: 0 10px 20px rgba(0, 0, 0, 0.5);
56
+ }
57
+
58
+ body {
59
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
60
+ background: var(--bg-primary);
61
+ color: var(--text-primary);
62
+ line-height: 1.6;
63
+ -webkit-font-smoothing: antialiased;
64
+ }
65
+
66
+ /* Layout */
67
+ .app-container {
68
+ display: flex;
69
+ min-height: 100vh;
70
+ }
71
+
72
+ /* ==================== SIDEBAR ==================== */
73
+ .sidebar {
74
+ width: var(--sidebar-width);
75
+ background: var(--bg-secondary);
76
+ border-right: 1px solid var(--border-primary);
77
+ display: flex;
78
+ flex-direction: column;
79
+ position: fixed;
80
+ top: 0;
81
+ left: 0;
82
+ height: 100vh;
83
+ z-index: 100;
84
+ transition: width var(--transition-normal);
85
+ }
86
+
87
+ .sidebar-header {
88
+ padding: var(--spacing-lg);
89
+ border-bottom: 1px solid var(--border-primary);
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: space-between;
93
+ }
94
+
95
+ .sidebar-logo {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: var(--spacing-md);
99
+ }
100
+
101
+ .logo-icon {
102
+ font-size: 1.75rem;
103
+ }
104
+
105
+ .logo-text {
106
+ font-size: 1.25rem;
107
+ font-weight: 600;
108
+ color: var(--text-primary);
109
+ }
110
+
111
+ .sidebar-toggle {
112
+ background: transparent;
113
+ border: 1px solid var(--border-primary);
114
+ color: var(--text-secondary);
115
+ padding: var(--spacing-sm);
116
+ border-radius: 6px;
117
+ cursor: pointer;
118
+ transition: all var(--transition-fast);
119
+ }
120
+
121
+ .sidebar-toggle:hover {
122
+ background: var(--bg-tertiary);
123
+ color: var(--text-primary);
124
+ }
125
+
126
+ /* Profile Summary */
127
+ .sidebar-profile {
128
+ padding: var(--spacing-lg);
129
+ border-bottom: 1px solid var(--border-primary);
130
+ }
131
+
132
+ .profile-level {
133
+ display: flex;
134
+ align-items: center;
135
+ gap: var(--spacing-md);
136
+ margin-bottom: var(--spacing-md);
137
+ }
138
+
139
+ .level-icon {
140
+ font-size: 2rem;
141
+ }
142
+
143
+ .level-info {
144
+ flex: 1;
145
+ }
146
+
147
+ .level-name {
148
+ font-size: 0.875rem;
149
+ font-weight: 600;
150
+ color: var(--text-primary);
151
+ }
152
+
153
+ .xp-bar {
154
+ height: 6px;
155
+ background: var(--bg-tertiary);
156
+ border-radius: 3px;
157
+ margin: var(--spacing-xs) 0;
158
+ overflow: hidden;
159
+ }
160
+
161
+ .xp-fill {
162
+ height: 100%;
163
+ background: linear-gradient(90deg, var(--accent-primary), var(--accent-success));
164
+ border-radius: 3px;
165
+ transition: width var(--transition-normal);
166
+ }
167
+
168
+ .xp-text {
169
+ font-size: 0.75rem;
170
+ color: var(--text-secondary);
171
+ }
172
+
173
+ .profile-streak {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: var(--spacing-sm);
177
+ font-size: 0.875rem;
178
+ color: var(--text-secondary);
179
+ }
180
+
181
+ .streak-icon {
182
+ font-size: 1.25rem;
183
+ }
184
+
185
+ /* Navigation */
186
+ .sidebar-nav {
187
+ flex: 1;
188
+ padding: var(--spacing-md);
189
+ }
190
+
191
+ .nav-item {
192
+ display: flex;
193
+ align-items: center;
194
+ gap: var(--spacing-md);
195
+ width: 100%;
196
+ padding: var(--spacing-md);
197
+ background: transparent;
198
+ border: none;
199
+ border-radius: 8px;
200
+ color: var(--text-secondary);
201
+ font-size: 0.9375rem;
202
+ cursor: pointer;
203
+ transition: all var(--transition-fast);
204
+ }
205
+
206
+ .nav-item:hover {
207
+ background: var(--bg-tertiary);
208
+ color: var(--text-primary);
209
+ }
210
+
211
+ .nav-item.active {
212
+ background: var(--bg-tertiary);
213
+ color: var(--accent-primary);
214
+ }
215
+
216
+ .nav-icon {
217
+ font-size: 1.25rem;
218
+ }
219
+
220
+ /* Sidebar Footer */
221
+ .sidebar-footer {
222
+ padding: var(--spacing-lg);
223
+ border-top: 1px solid var(--border-primary);
224
+ }
225
+
226
+ .sidebar-link {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: var(--spacing-sm);
230
+ color: var(--text-secondary);
231
+ text-decoration: none;
232
+ font-size: 0.875rem;
233
+ padding: var(--spacing-sm) 0;
234
+ transition: color var(--transition-fast);
235
+ }
236
+
237
+ .sidebar-link:hover {
238
+ color: var(--text-primary);
239
+ }
240
+
241
+ .sidebar-version {
242
+ font-size: 0.75rem;
243
+ color: var(--text-muted);
244
+ margin-top: var(--spacing-sm);
245
+ }
246
+
247
+ /* ==================== MAIN CONTENT ==================== */
248
+ .main-content {
249
+ flex: 1;
250
+ margin-left: var(--sidebar-width);
251
+ padding: var(--spacing-xl);
252
+ min-height: 100vh;
253
+ }
254
+
255
+ /* Pages */
256
+ .page {
257
+ display: none;
258
+ }
259
+
260
+ .page.active {
261
+ display: block;
262
+ }
263
+
264
+ .page-header {
265
+ display: flex;
266
+ align-items: center;
267
+ justify-content: space-between;
268
+ margin-bottom: var(--spacing-xl);
269
+ }
270
+
271
+ .page-title {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: var(--spacing-md);
275
+ font-size: 1.5rem;
276
+ font-weight: 600;
277
+ }
278
+
279
+ .title-icon {
280
+ font-size: 1.75rem;
281
+ }
282
+
283
+ /* Stats Grid */
284
+ .stats-grid {
285
+ display: grid;
286
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
287
+ gap: var(--spacing-lg);
288
+ margin-bottom: var(--spacing-xl);
289
+ }
290
+
291
+ .stat-card {
292
+ background: var(--bg-card);
293
+ border: 1px solid var(--border-primary);
294
+ border-radius: 12px;
295
+ padding: var(--spacing-lg);
296
+ display: flex;
297
+ align-items: center;
298
+ gap: var(--spacing-lg);
299
+ transition: all var(--transition-fast);
300
+ }
301
+
302
+ .stat-card:hover {
303
+ border-color: var(--border-secondary);
304
+ transform: translateY(-2px);
305
+ }
306
+
307
+ .stat-card.highlight {
308
+ border-color: var(--accent-primary);
309
+ background: linear-gradient(135deg, rgba(88, 166, 255, 0.1), transparent);
310
+ }
311
+
312
+ .stat-icon {
313
+ font-size: 2.5rem;
314
+ }
315
+
316
+ .stat-value {
317
+ font-size: 1.75rem;
318
+ font-weight: 700;
319
+ color: var(--text-primary);
320
+ }
321
+
322
+ .stat-label {
323
+ font-size: 0.875rem;
324
+ color: var(--text-secondary);
325
+ }
326
+
327
+ /* Charts Section */
328
+ .charts-section {
329
+ display: grid;
330
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
331
+ gap: var(--spacing-lg);
332
+ margin-bottom: var(--spacing-xl);
333
+ }
334
+
335
+ .chart-card {
336
+ background: var(--bg-card);
337
+ border: 1px solid var(--border-primary);
338
+ border-radius: 12px;
339
+ padding: var(--spacing-lg);
340
+ }
341
+
342
+ .chart-card.wide {
343
+ grid-column: 1 / -1;
344
+ }
345
+
346
+ .chart-header {
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: space-between;
350
+ margin-bottom: var(--spacing-lg);
351
+ }
352
+
353
+ .chart-header h3 {
354
+ font-size: 1rem;
355
+ font-weight: 600;
356
+ }
357
+
358
+ .chart-controls {
359
+ display: flex;
360
+ gap: var(--spacing-xs);
361
+ }
362
+
363
+ .chart-btn {
364
+ background: var(--bg-tertiary);
365
+ border: 1px solid var(--border-primary);
366
+ color: var(--text-secondary);
367
+ padding: var(--spacing-xs) var(--spacing-sm);
368
+ border-radius: 4px;
369
+ font-size: 0.75rem;
370
+ cursor: pointer;
371
+ transition: all var(--transition-fast);
372
+ }
373
+
374
+ .chart-btn:hover {
375
+ color: var(--text-primary);
376
+ }
377
+
378
+ .chart-btn.active {
379
+ background: var(--accent-primary);
380
+ border-color: var(--accent-primary);
381
+ color: white;
382
+ }
383
+
384
+ .chart-container {
385
+ height: 250px;
386
+ position: relative;
387
+ }
388
+
389
+ .chart-placeholder {
390
+ width: 100%;
391
+ height: 100%;
392
+ }
393
+
394
+ /* Recent Sessions */
395
+ .recent-section {
396
+ background: var(--bg-card);
397
+ border: 1px solid var(--border-primary);
398
+ border-radius: 12px;
399
+ padding: var(--spacing-lg);
400
+ }
401
+
402
+ .section-header {
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: space-between;
406
+ margin-bottom: var(--spacing-lg);
407
+ }
408
+
409
+ .section-header h3 {
410
+ font-size: 1rem;
411
+ font-weight: 600;
412
+ }
413
+
414
+ .view-all {
415
+ color: var(--accent-primary);
416
+ text-decoration: none;
417
+ font-size: 0.875rem;
418
+ }
419
+
420
+ .sessions-list {
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: var(--spacing-sm);
424
+ }
425
+
426
+ .session-item {
427
+ display: flex;
428
+ align-items: center;
429
+ justify-content: space-between;
430
+ padding: var(--spacing-md);
431
+ background: var(--bg-tertiary);
432
+ border-radius: 8px;
433
+ transition: background var(--transition-fast);
434
+ }
435
+
436
+ .session-item:hover {
437
+ background: var(--bg-overlay);
438
+ }
439
+
440
+ .session-date {
441
+ font-size: 0.875rem;
442
+ color: var(--text-secondary);
443
+ }
444
+
445
+ .session-score {
446
+ font-size: 1.125rem;
447
+ font-weight: 600;
448
+ }
449
+
450
+ .session-rating {
451
+ padding: var(--spacing-xs) var(--spacing-sm);
452
+ border-radius: 4px;
453
+ font-size: 0.75rem;
454
+ font-weight: 600;
455
+ text-transform: uppercase;
456
+ }
457
+
458
+ .session-rating.elite { background: var(--elite); color: white; }
459
+ .session-rating.high { background: var(--high); color: white; }
460
+ .session-rating.medium { background: var(--medium); color: black; }
461
+ .session-rating.low { background: var(--low); color: white; }
462
+
463
+ /* Empty State */
464
+ .empty-state {
465
+ text-align: center;
466
+ padding: var(--spacing-xl);
467
+ color: var(--text-secondary);
468
+ }
469
+
470
+ .empty-icon {
471
+ font-size: 3rem;
472
+ display: block;
473
+ margin-bottom: var(--spacing-md);
474
+ }
475
+
476
+ .empty-state code {
477
+ background: var(--bg-tertiary);
478
+ padding: var(--spacing-xs) var(--spacing-sm);
479
+ border-radius: 4px;
480
+ font-family: monospace;
481
+ }
482
+
483
+ /* Achievements Grid */
484
+ .achievements-grid {
485
+ display: grid;
486
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
487
+ gap: var(--spacing-lg);
488
+ }
489
+
490
+ .achievement-card {
491
+ background: var(--bg-card);
492
+ border: 1px solid var(--border-primary);
493
+ border-radius: 12px;
494
+ padding: var(--spacing-lg);
495
+ display: flex;
496
+ align-items: flex-start;
497
+ gap: var(--spacing-lg);
498
+ transition: all var(--transition-fast);
499
+ }
500
+
501
+ .achievement-card.locked {
502
+ opacity: 0.5;
503
+ filter: grayscale(100%);
504
+ }
505
+
506
+ .achievement-card.unlocked {
507
+ border-color: var(--accent-success);
508
+ }
509
+
510
+ .achievement-icon-wrapper {
511
+ font-size: 2.5rem;
512
+ }
513
+
514
+ .achievement-info h4 {
515
+ font-size: 1rem;
516
+ margin-bottom: var(--spacing-xs);
517
+ }
518
+
519
+ .achievement-info p {
520
+ font-size: 0.875rem;
521
+ color: var(--text-secondary);
522
+ }
523
+
524
+ .achievement-date {
525
+ font-size: 0.75rem;
526
+ color: var(--text-muted);
527
+ margin-top: var(--spacing-sm);
528
+ }
529
+
530
+ /* Toast */
531
+ .toast {
532
+ position: fixed;
533
+ bottom: var(--spacing-xl);
534
+ right: var(--spacing-xl);
535
+ background: var(--bg-overlay);
536
+ border: 1px solid var(--border-primary);
537
+ border-radius: 8px;
538
+ padding: var(--spacing-md) var(--spacing-lg);
539
+ display: flex;
540
+ align-items: center;
541
+ gap: var(--spacing-sm);
542
+ transform: translateY(100px);
543
+ opacity: 0;
544
+ transition: all var(--transition-normal);
545
+ z-index: 1000;
546
+ }
547
+
548
+ .toast.show {
549
+ transform: translateY(0);
550
+ opacity: 1;
551
+ }
552
+
553
+ /* Modal */
554
+ .modal-overlay {
555
+ position: fixed;
556
+ inset: 0;
557
+ background: rgba(0, 0, 0, 0.8);
558
+ display: none;
559
+ align-items: center;
560
+ justify-content: center;
561
+ z-index: 1000;
562
+ }
563
+
564
+ .modal-overlay.show {
565
+ display: flex;
566
+ }
567
+
568
+ .modal-container {
569
+ background: var(--bg-secondary);
570
+ border: 1px solid var(--border-primary);
571
+ border-radius: 16px;
572
+ padding: var(--spacing-xl);
573
+ max-width: 400px;
574
+ text-align: center;
575
+ }
576
+
577
+ .achievement-celebration {
578
+ display: flex;
579
+ flex-direction: column;
580
+ align-items: center;
581
+ gap: var(--spacing-md);
582
+ }
583
+
584
+ .achievement-celebration .achievement-icon {
585
+ font-size: 4rem;
586
+ animation: bounce 0.5s ease infinite alternate;
587
+ }
588
+
589
+ @keyframes bounce {
590
+ from { transform: translateY(0); }
591
+ to { transform: translateY(-10px); }
592
+ }
593
+
594
+ .btn-primary {
595
+ background: var(--accent-primary);
596
+ border: none;
597
+ color: white;
598
+ padding: var(--spacing-md) var(--spacing-xl);
599
+ border-radius: 8px;
600
+ font-size: 1rem;
601
+ font-weight: 600;
602
+ cursor: pointer;
603
+ transition: background var(--transition-fast);
604
+ }
605
+
606
+ .btn-primary:hover {
607
+ background: var(--accent-hover);
608
+ }
609
+
610
+ .btn-refresh {
611
+ background: transparent;
612
+ border: 1px solid var(--border-primary);
613
+ color: var(--text-secondary);
614
+ padding: var(--spacing-sm);
615
+ border-radius: 6px;
616
+ cursor: pointer;
617
+ transition: all var(--transition-fast);
618
+ }
619
+
620
+ .btn-refresh:hover {
621
+ background: var(--bg-tertiary);
622
+ color: var(--text-primary);
623
+ }
624
+
625
+ /* Responsive */
626
+ @media (max-width: 768px) {
627
+ .sidebar {
628
+ transform: translateX(-100%);
629
+ }
630
+
631
+ .sidebar.open {
632
+ transform: translateX(0);
633
+ }
634
+
635
+ .main-content {
636
+ margin-left: 0;
637
+ padding: var(--spacing-md);
638
+ }
639
+
640
+ .stats-grid {
641
+ grid-template-columns: 1fr 1fr;
642
+ }
643
+
644
+ .chart-card.wide {
645
+ grid-column: 1;
646
+ }
647
+ }
@@ -0,0 +1,26 @@
1
+ import { CalibrationSample } from '../types';
2
+ /**
3
+ * Expected Calibration Error (ECE).
4
+ * Measures how well predicted levels match declared levels.
5
+ *
6
+ * ECE = Σᵢ (nᵢ/N) × |accuracy(binᵢ) - confidence(binᵢ)|
7
+ */
8
+ export declare function calculateECE(samples: CalibrationSample[]): number;
9
+ /**
10
+ * Assess if a score matches the expected range for a level.
11
+ */
12
+ export declare function assessOutcome(vibeScore: number, declaredLevel: number): 'correct' | 'too_high' | 'too_low';
13
+ /**
14
+ * Infer the "true" vibe level from an actual vibe score.
15
+ * This is used to generate training labels for the model.
16
+ *
17
+ * Maps score ranges to levels:
18
+ * - 0.90-1.00 → 5 (Elite flow)
19
+ * - 0.80-0.90 → 4 (High flow)
20
+ * - 0.65-0.80 → 3 (Balanced)
21
+ * - 0.50-0.65 → 2 (AI-Augmented)
22
+ * - 0.30-0.50 → 1 (Human-Led)
23
+ * - 0.00-0.30 → 0 (Manual)
24
+ */
25
+ export declare function inferTrueLevel(vibeScore: number): 0 | 1 | 2 | 3 | 4 | 5;
26
+ //# sourceMappingURL=ece.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ece.d.ts","sourceRoot":"","sources":["../../src/calibration/ece.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAoCjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,UAAU,GAAG,SAAS,CAmBpC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAOvE"}