@boshu2/vibe-check 1.6.2 → 1.7.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 (107) hide show
  1. package/.agents/bundles/automatic-learning-cadence-plan-2025-12-02.md +1297 -0
  2. package/.agents/bundles/automatic-learning-cadence-research-2025-12-02.md +481 -0
  3. package/.agents/bundles/dashboard-data-quality-plan.md +458 -0
  4. package/.agents/bundles/rating-scoring-alignment-plan.md +427 -0
  5. package/.agents/bundles/rpi-session-capture-plan-2025-12-02.md +693 -0
  6. package/.agents/bundles/rpi-session-capture-research-2025-12-02.md +433 -0
  7. package/.agents/bundles/session-integration-plan-2025-12-02.md +144 -0
  8. package/CHANGELOG.md +17 -0
  9. package/CLAUDE.md +74 -2
  10. package/Makefile +173 -0
  11. package/README.md +33 -0
  12. package/claude-progress.json +34 -5
  13. package/claude-progress.txt +66 -0
  14. package/dashboard/app.js +699 -66
  15. package/dashboard/chart.min.js +20 -0
  16. package/dashboard/dashboard-data.js +764 -0
  17. package/dashboard/dashboard-data.json +182 -71
  18. package/dashboard/index.html +139 -14
  19. package/dashboard/styles.css +579 -4
  20. package/dist/cli.js +1 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/analyze.d.ts.map +1 -1
  23. package/dist/commands/analyze.js +38 -2
  24. package/dist/commands/analyze.js.map +1 -1
  25. package/dist/commands/dashboard.js +4 -1
  26. package/dist/commands/dashboard.js.map +1 -1
  27. package/dist/commands/index.d.ts +1 -1
  28. package/dist/commands/index.d.ts.map +1 -1
  29. package/dist/commands/index.js +3 -3
  30. package/dist/commands/index.js.map +1 -1
  31. package/dist/commands/learn.d.ts +3 -0
  32. package/dist/commands/learn.d.ts.map +1 -0
  33. package/dist/commands/learn.js +161 -0
  34. package/dist/commands/learn.js.map +1 -0
  35. package/dist/commands/lesson.d.ts +8 -0
  36. package/dist/commands/lesson.d.ts.map +1 -0
  37. package/dist/commands/lesson.js +206 -0
  38. package/dist/commands/lesson.js.map +1 -0
  39. package/dist/commands/profile.d.ts.map +1 -1
  40. package/dist/commands/profile.js +3 -202
  41. package/dist/commands/profile.js.map +1 -1
  42. package/dist/commands/session.d.ts +51 -0
  43. package/dist/commands/session.d.ts.map +1 -0
  44. package/dist/commands/session.js +561 -0
  45. package/dist/commands/session.js.map +1 -0
  46. package/dist/gamification/index.d.ts +1 -3
  47. package/dist/gamification/index.d.ts.map +1 -1
  48. package/dist/gamification/index.js +2 -5
  49. package/dist/gamification/index.js.map +1 -1
  50. package/dist/gamification/pattern-memory.d.ts +1 -1
  51. package/dist/gamification/pattern-memory.d.ts.map +1 -1
  52. package/dist/gamification/pattern-memory.js.map +1 -1
  53. package/dist/gamification/profile.d.ts +2 -2
  54. package/dist/gamification/profile.d.ts.map +1 -1
  55. package/dist/gamification/profile.js +2 -15
  56. package/dist/gamification/profile.js.map +1 -1
  57. package/dist/gamification/types.d.ts +8 -2
  58. package/dist/gamification/types.d.ts.map +1 -1
  59. package/dist/gamification/types.js.map +1 -1
  60. package/dist/insights/index.d.ts.map +1 -1
  61. package/dist/insights/index.js +16 -4
  62. package/dist/insights/index.js.map +1 -1
  63. package/dist/insights/types.d.ts +14 -0
  64. package/dist/insights/types.d.ts.map +1 -1
  65. package/dist/learning/cadence.d.ts +15 -0
  66. package/dist/learning/cadence.d.ts.map +1 -0
  67. package/dist/learning/cadence.js +130 -0
  68. package/dist/learning/cadence.js.map +1 -0
  69. package/dist/learning/index.d.ts +19 -0
  70. package/dist/learning/index.d.ts.map +1 -0
  71. package/dist/learning/index.js +35 -0
  72. package/dist/learning/index.js.map +1 -0
  73. package/dist/learning/lessons-storage.d.ts +48 -0
  74. package/dist/learning/lessons-storage.d.ts.map +1 -0
  75. package/dist/learning/lessons-storage.js +266 -0
  76. package/dist/learning/lessons-storage.js.map +1 -0
  77. package/dist/learning/lessons-types.d.ts +83 -0
  78. package/dist/learning/lessons-types.d.ts.map +1 -0
  79. package/dist/learning/lessons-types.js +15 -0
  80. package/dist/learning/lessons-types.js.map +1 -0
  81. package/dist/learning/nudges.d.ts +20 -0
  82. package/dist/learning/nudges.d.ts.map +1 -0
  83. package/dist/learning/nudges.js +68 -0
  84. package/dist/learning/nudges.js.map +1 -0
  85. package/dist/learning/retrospective.d.ts +27 -0
  86. package/dist/learning/retrospective.d.ts.map +1 -0
  87. package/dist/learning/retrospective.js +184 -0
  88. package/dist/learning/retrospective.js.map +1 -0
  89. package/dist/learning/storage.d.ts +44 -0
  90. package/dist/learning/storage.d.ts.map +1 -0
  91. package/dist/learning/storage.js +194 -0
  92. package/dist/learning/storage.js.map +1 -0
  93. package/dist/learning/surfacing.d.ts +36 -0
  94. package/dist/learning/surfacing.d.ts.map +1 -0
  95. package/dist/learning/surfacing.js +255 -0
  96. package/dist/learning/surfacing.js.map +1 -0
  97. package/dist/learning/synthesis.d.ts +17 -0
  98. package/dist/learning/synthesis.d.ts.map +1 -0
  99. package/dist/learning/synthesis.js +293 -0
  100. package/dist/learning/synthesis.js.map +1 -0
  101. package/dist/learning/types.d.ts +60 -0
  102. package/dist/learning/types.d.ts.map +1 -0
  103. package/dist/learning/types.js +17 -0
  104. package/dist/learning/types.js.map +1 -0
  105. package/docs/METRICS.md +528 -0
  106. package/feature-list.json +21 -0
  107. package/package.json +1 -1
@@ -263,11 +263,17 @@ body {
263
263
 
264
264
  .page-header {
265
265
  display: flex;
266
- align-items: center;
266
+ align-items: flex-start;
267
267
  justify-content: space-between;
268
268
  margin-bottom: var(--spacing-xl);
269
269
  }
270
270
 
271
+ .page-title-group {
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: var(--spacing-xs);
275
+ }
276
+
271
277
  .page-title {
272
278
  display: flex;
273
279
  align-items: center;
@@ -280,6 +286,29 @@ body {
280
286
  font-size: 1.75rem;
281
287
  }
282
288
 
289
+ .repo-name {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: var(--spacing-sm);
293
+ font-size: 0.875rem;
294
+ color: var(--text-secondary);
295
+ padding: var(--spacing-xs) var(--spacing-sm);
296
+ background: var(--bg-tertiary);
297
+ border-radius: 4px;
298
+ font-family: monospace;
299
+ }
300
+
301
+ .repo-icon {
302
+ font-size: 1rem;
303
+ }
304
+
305
+ .repo-path {
306
+ max-width: 400px;
307
+ overflow: hidden;
308
+ text-overflow: ellipsis;
309
+ white-space: nowrap;
310
+ }
311
+
283
312
  /* Stats Grid */
284
313
  .stats-grid {
285
314
  display: grid;
@@ -324,6 +353,14 @@ body {
324
353
  color: var(--text-secondary);
325
354
  }
326
355
 
356
+ .stat-hint {
357
+ font-size: 0.625rem;
358
+ color: var(--text-muted);
359
+ display: block;
360
+ margin-top: 2px;
361
+ cursor: help;
362
+ }
363
+
327
364
  /* Charts Section */
328
365
  .charts-section {
329
366
  display: grid;
@@ -386,9 +423,9 @@ body {
386
423
  position: relative;
387
424
  }
388
425
 
389
- .chart-placeholder {
390
- width: 100%;
391
- height: 100%;
426
+ .chart-container canvas {
427
+ width: 100% !important;
428
+ height: 100% !important;
392
429
  }
393
430
 
394
431
  /* Recent Sessions */
@@ -706,3 +743,541 @@ body {
706
743
  font-size: 0.75rem;
707
744
  color: var(--accent-primary);
708
745
  }
746
+
747
+ /* ==================== SESSION DETAIL MODAL ==================== */
748
+ .session-modal {
749
+ max-width: 500px;
750
+ width: 90%;
751
+ }
752
+
753
+ .modal-header {
754
+ display: flex;
755
+ justify-content: space-between;
756
+ align-items: center;
757
+ margin-bottom: var(--spacing-lg);
758
+ padding-bottom: var(--spacing-md);
759
+ border-bottom: 1px solid var(--border-primary);
760
+ }
761
+
762
+ .modal-header h2 {
763
+ font-size: 1.25rem;
764
+ font-weight: 600;
765
+ }
766
+
767
+ .modal-close {
768
+ background: none;
769
+ border: none;
770
+ color: var(--text-secondary);
771
+ font-size: 1.5rem;
772
+ cursor: pointer;
773
+ padding: var(--spacing-xs);
774
+ line-height: 1;
775
+ transition: color var(--transition-fast);
776
+ }
777
+
778
+ .modal-close:hover {
779
+ color: var(--text-primary);
780
+ }
781
+
782
+ .session-detail-hero {
783
+ display: flex;
784
+ align-items: center;
785
+ gap: var(--spacing-xl);
786
+ margin-bottom: var(--spacing-xl);
787
+ }
788
+
789
+ .detail-score-ring {
790
+ width: 120px;
791
+ height: 120px;
792
+ border-radius: 50%;
793
+ background: conic-gradient(var(--accent-primary) calc(var(--score, 0) * 3.6deg), var(--bg-tertiary) 0);
794
+ display: flex;
795
+ flex-direction: column;
796
+ align-items: center;
797
+ justify-content: center;
798
+ position: relative;
799
+ }
800
+
801
+ .detail-score-ring::before {
802
+ content: '';
803
+ position: absolute;
804
+ inset: 8px;
805
+ background: var(--bg-secondary);
806
+ border-radius: 50%;
807
+ }
808
+
809
+ .detail-score, .detail-rating {
810
+ position: relative;
811
+ z-index: 1;
812
+ }
813
+
814
+ .detail-score {
815
+ font-size: 2rem;
816
+ font-weight: 700;
817
+ }
818
+
819
+ .detail-rating {
820
+ font-size: 0.75rem;
821
+ text-transform: uppercase;
822
+ color: var(--text-secondary);
823
+ }
824
+
825
+ .detail-meta {
826
+ flex: 1;
827
+ }
828
+
829
+ .detail-date {
830
+ font-size: 1.25rem;
831
+ font-weight: 600;
832
+ margin-bottom: var(--spacing-xs);
833
+ }
834
+
835
+ .detail-xp {
836
+ color: var(--accent-success);
837
+ font-weight: 600;
838
+ }
839
+
840
+ .detail-metrics-grid {
841
+ display: grid;
842
+ grid-template-columns: repeat(4, 1fr);
843
+ gap: var(--spacing-md);
844
+ margin-bottom: var(--spacing-xl);
845
+ }
846
+
847
+ .detail-metric {
848
+ text-align: center;
849
+ padding: var(--spacing-md);
850
+ background: var(--bg-tertiary);
851
+ border-radius: 8px;
852
+ }
853
+
854
+ .detail-metric .metric-icon {
855
+ font-size: 1.5rem;
856
+ display: block;
857
+ margin-bottom: var(--spacing-xs);
858
+ }
859
+
860
+ .detail-metric .metric-value {
861
+ font-size: 1.25rem;
862
+ font-weight: 700;
863
+ display: block;
864
+ }
865
+
866
+ .detail-metric .metric-label {
867
+ font-size: 0.75rem;
868
+ color: var(--text-secondary);
869
+ }
870
+
871
+ .detail-chart-container {
872
+ background: var(--bg-tertiary);
873
+ border-radius: 8px;
874
+ padding: var(--spacing-lg);
875
+ }
876
+
877
+ .detail-chart-container h4 {
878
+ margin-bottom: var(--spacing-md);
879
+ font-size: 0.875rem;
880
+ color: var(--text-secondary);
881
+ }
882
+
883
+ .detail-chart-container canvas {
884
+ max-height: 200px;
885
+ }
886
+
887
+ /* ==================== HISTORY CONTROLS ==================== */
888
+ .history-controls {
889
+ display: flex;
890
+ flex-wrap: wrap;
891
+ gap: var(--spacing-lg);
892
+ align-items: flex-end;
893
+ margin-bottom: var(--spacing-xl);
894
+ padding: var(--spacing-lg);
895
+ background: var(--bg-card);
896
+ border: 1px solid var(--border-primary);
897
+ border-radius: 12px;
898
+ }
899
+
900
+ .filter-group {
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: var(--spacing-xs);
904
+ }
905
+
906
+ .filter-group label {
907
+ font-size: 0.75rem;
908
+ color: var(--text-secondary);
909
+ text-transform: uppercase;
910
+ letter-spacing: 0.05em;
911
+ }
912
+
913
+ .filter-select {
914
+ background: var(--bg-tertiary);
915
+ border: 1px solid var(--border-primary);
916
+ color: var(--text-primary);
917
+ padding: var(--spacing-sm) var(--spacing-md);
918
+ border-radius: 6px;
919
+ font-size: 0.875rem;
920
+ cursor: pointer;
921
+ min-width: 150px;
922
+ }
923
+
924
+ .filter-select:focus {
925
+ outline: none;
926
+ border-color: var(--accent-primary);
927
+ }
928
+
929
+ .history-stats {
930
+ margin-left: auto;
931
+ display: flex;
932
+ gap: var(--spacing-lg);
933
+ font-size: 0.875rem;
934
+ color: var(--text-secondary);
935
+ }
936
+
937
+ .history-stats span {
938
+ padding: var(--spacing-sm) var(--spacing-md);
939
+ background: var(--bg-tertiary);
940
+ border-radius: 6px;
941
+ }
942
+
943
+ /* ==================== HISTORY CHARTS ==================== */
944
+ .history-charts {
945
+ display: grid;
946
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
947
+ gap: var(--spacing-lg);
948
+ margin-bottom: var(--spacing-xl);
949
+ }
950
+
951
+ /* ==================== ACTIVITY HEATMAP ==================== */
952
+ .heatmap-container {
953
+ padding: var(--spacing-md);
954
+ }
955
+
956
+ .heatmap-grid {
957
+ display: grid;
958
+ grid-template-columns: 50px repeat(24, 1fr);
959
+ gap: 2px;
960
+ font-size: 0.625rem;
961
+ }
962
+
963
+ .heatmap-label {
964
+ color: var(--text-secondary);
965
+ display: flex;
966
+ align-items: center;
967
+ justify-content: flex-end;
968
+ padding-right: var(--spacing-sm);
969
+ }
970
+
971
+ .heatmap-hour {
972
+ text-align: center;
973
+ color: var(--text-muted);
974
+ padding-bottom: var(--spacing-xs);
975
+ }
976
+
977
+ .heatmap-cell {
978
+ aspect-ratio: 1;
979
+ border-radius: 2px;
980
+ background: var(--bg-tertiary);
981
+ cursor: pointer;
982
+ transition: transform var(--transition-fast);
983
+ }
984
+
985
+ .heatmap-cell:hover {
986
+ transform: scale(1.2);
987
+ z-index: 1;
988
+ }
989
+
990
+ .heatmap-cell.level-0 { background: var(--bg-tertiary); }
991
+ .heatmap-cell.level-1 { background: rgba(63, 185, 80, 0.2); }
992
+ .heatmap-cell.level-2 { background: rgba(63, 185, 80, 0.4); }
993
+ .heatmap-cell.level-3 { background: rgba(63, 185, 80, 0.6); }
994
+ .heatmap-cell.level-4 { background: rgba(63, 185, 80, 0.8); }
995
+ .heatmap-cell.level-5 { background: var(--accent-success); }
996
+
997
+ .heatmap-legend {
998
+ display: flex;
999
+ align-items: center;
1000
+ justify-content: flex-end;
1001
+ gap: var(--spacing-xs);
1002
+ margin-top: var(--spacing-md);
1003
+ font-size: 0.75rem;
1004
+ color: var(--text-secondary);
1005
+ }
1006
+
1007
+ .heatmap-legend-cell {
1008
+ width: 12px;
1009
+ height: 12px;
1010
+ border-radius: 2px;
1011
+ }
1012
+
1013
+ /* ==================== CLICKABLE SESSIONS ==================== */
1014
+ .session-item {
1015
+ cursor: pointer;
1016
+ }
1017
+
1018
+ .session-item:hover {
1019
+ background: var(--bg-overlay);
1020
+ border-left: 3px solid var(--accent-primary);
1021
+ padding-left: calc(var(--spacing-md) - 3px);
1022
+ }
1023
+
1024
+ .session-item .session-commits {
1025
+ font-size: 0.75rem;
1026
+ color: var(--text-muted);
1027
+ }
1028
+
1029
+ /* ==================== TREND INDICATORS ==================== */
1030
+ .trend-indicator {
1031
+ display: inline-flex;
1032
+ align-items: center;
1033
+ gap: var(--spacing-xs);
1034
+ font-size: 0.75rem;
1035
+ padding: 2px 6px;
1036
+ border-radius: 4px;
1037
+ }
1038
+
1039
+ .trend-indicator.up {
1040
+ color: var(--accent-success);
1041
+ background: rgba(63, 185, 80, 0.1);
1042
+ }
1043
+
1044
+ .trend-indicator.down {
1045
+ color: var(--accent-danger);
1046
+ background: rgba(248, 81, 73, 0.1);
1047
+ }
1048
+
1049
+ .trend-indicator.neutral {
1050
+ color: var(--text-secondary);
1051
+ background: var(--bg-tertiary);
1052
+ }
1053
+
1054
+ /* ==================== RESPONSIVE ADJUSTMENTS ==================== */
1055
+ @media (max-width: 768px) {
1056
+ .history-controls {
1057
+ flex-direction: column;
1058
+ align-items: stretch;
1059
+ }
1060
+
1061
+ .history-stats {
1062
+ margin-left: 0;
1063
+ justify-content: center;
1064
+ }
1065
+
1066
+ .detail-metrics-grid {
1067
+ grid-template-columns: repeat(2, 1fr);
1068
+ }
1069
+
1070
+ .session-detail-hero {
1071
+ flex-direction: column;
1072
+ text-align: center;
1073
+ }
1074
+
1075
+ .heatmap-grid {
1076
+ grid-template-columns: 40px repeat(12, 1fr);
1077
+ }
1078
+ }
1079
+
1080
+ /* =====================================================
1081
+ Rating Badge in Stats Card
1082
+ ===================================================== */
1083
+
1084
+ .stat-value.rating-badge {
1085
+ font-size: 1.1rem;
1086
+ font-weight: 700;
1087
+ padding: 6px 14px;
1088
+ border-radius: 8px;
1089
+ text-transform: uppercase;
1090
+ letter-spacing: 0.5px;
1091
+ }
1092
+
1093
+ .rating-badge.rating-elite {
1094
+ background: linear-gradient(135deg, #a371f7, #8957e5);
1095
+ color: white;
1096
+ box-shadow: 0 2px 8px rgba(163, 113, 247, 0.3);
1097
+ }
1098
+
1099
+ .rating-badge.rating-high {
1100
+ background: linear-gradient(135deg, #3fb950, #2ea043);
1101
+ color: white;
1102
+ box-shadow: 0 2px 8px rgba(63, 185, 80, 0.3);
1103
+ }
1104
+
1105
+ .rating-badge.rating-medium {
1106
+ background: linear-gradient(135deg, #d29922, #bb8009);
1107
+ color: white;
1108
+ box-shadow: 0 2px 8px rgba(210, 153, 34, 0.3);
1109
+ }
1110
+
1111
+ .rating-badge.rating-low {
1112
+ background: linear-gradient(135deg, #f85149, #da3633);
1113
+ color: white;
1114
+ box-shadow: 0 2px 8px rgba(248, 81, 73, 0.3);
1115
+ }
1116
+
1117
+ /* Clickable hints */
1118
+ .stat-hint.clickable {
1119
+ cursor: pointer;
1120
+ text-decoration: underline;
1121
+ text-decoration-style: dotted;
1122
+ text-underline-offset: 2px;
1123
+ }
1124
+
1125
+ .stat-hint.clickable:hover {
1126
+ color: var(--accent-primary);
1127
+ }
1128
+
1129
+ /* =====================================================
1130
+ Metrics Help Modal
1131
+ ===================================================== */
1132
+
1133
+ .metrics-modal {
1134
+ max-width: 700px;
1135
+ max-height: 85vh;
1136
+ overflow-y: auto;
1137
+ }
1138
+
1139
+ .metrics-help-content {
1140
+ padding: var(--spacing-lg);
1141
+ }
1142
+
1143
+ .metrics-help-section {
1144
+ color: var(--text-primary);
1145
+ }
1146
+
1147
+ .metrics-intro {
1148
+ font-size: 1rem;
1149
+ line-height: 1.6;
1150
+ margin-bottom: var(--spacing-lg);
1151
+ color: var(--text-secondary);
1152
+ }
1153
+
1154
+ .metrics-intro strong {
1155
+ color: var(--text-primary);
1156
+ }
1157
+
1158
+ .metrics-help-section h3 {
1159
+ font-size: 1rem;
1160
+ color: var(--text-primary);
1161
+ margin: var(--spacing-lg) 0 var(--spacing-md);
1162
+ padding-bottom: var(--spacing-xs);
1163
+ border-bottom: 1px solid var(--border-primary);
1164
+ }
1165
+
1166
+ .metric-card {
1167
+ background: var(--bg-tertiary);
1168
+ border: 1px solid var(--border-primary);
1169
+ border-radius: 8px;
1170
+ padding: var(--spacing-md);
1171
+ margin-bottom: var(--spacing-md);
1172
+ }
1173
+
1174
+ .metric-header {
1175
+ display: flex;
1176
+ justify-content: space-between;
1177
+ align-items: center;
1178
+ margin-bottom: var(--spacing-sm);
1179
+ }
1180
+
1181
+ .metric-name {
1182
+ font-weight: 600;
1183
+ color: var(--accent-primary);
1184
+ font-size: 0.95rem;
1185
+ }
1186
+
1187
+ .metric-formula,
1188
+ .metric-weight {
1189
+ font-family: 'SF Mono', 'Monaco', monospace;
1190
+ font-size: 0.75rem;
1191
+ color: var(--text-muted);
1192
+ background: var(--bg-overlay);
1193
+ padding: 2px 8px;
1194
+ border-radius: 4px;
1195
+ }
1196
+
1197
+ .metric-card > p {
1198
+ font-size: 0.875rem;
1199
+ color: var(--text-secondary);
1200
+ line-height: 1.5;
1201
+ margin-bottom: var(--spacing-sm);
1202
+ }
1203
+
1204
+ .metric-card > .metric-formula {
1205
+ display: block;
1206
+ margin-bottom: var(--spacing-sm);
1207
+ padding: var(--spacing-sm);
1208
+ text-align: center;
1209
+ }
1210
+
1211
+ .metric-thresholds {
1212
+ display: flex;
1213
+ flex-wrap: wrap;
1214
+ gap: var(--spacing-xs);
1215
+ }
1216
+
1217
+ .threshold {
1218
+ font-size: 0.7rem;
1219
+ font-weight: 600;
1220
+ padding: 3px 8px;
1221
+ border-radius: 4px;
1222
+ font-family: 'SF Mono', 'Monaco', monospace;
1223
+ }
1224
+
1225
+ .threshold.elite {
1226
+ background: rgba(163, 113, 247, 0.2);
1227
+ color: #a371f7;
1228
+ }
1229
+
1230
+ .threshold.high {
1231
+ background: rgba(63, 185, 80, 0.2);
1232
+ color: #3fb950;
1233
+ }
1234
+
1235
+ .threshold.medium {
1236
+ background: rgba(210, 153, 34, 0.2);
1237
+ color: #d29922;
1238
+ }
1239
+
1240
+ .threshold.low {
1241
+ background: rgba(248, 81, 73, 0.2);
1242
+ color: #f85149;
1243
+ }
1244
+
1245
+ .formula-box {
1246
+ background: var(--bg-overlay);
1247
+ border: 1px solid var(--border-primary);
1248
+ border-radius: 6px;
1249
+ padding: var(--spacing-md);
1250
+ font-family: 'SF Mono', 'Monaco', monospace;
1251
+ font-size: 0.8rem;
1252
+ color: var(--text-secondary);
1253
+ text-align: center;
1254
+ margin-top: var(--spacing-sm);
1255
+ }
1256
+
1257
+ /* Empty chart state */
1258
+ .empty-chart-state {
1259
+ display: flex;
1260
+ flex-direction: column;
1261
+ align-items: center;
1262
+ justify-content: center;
1263
+ height: 200px;
1264
+ color: var(--text-muted);
1265
+ text-align: center;
1266
+ }
1267
+
1268
+ .empty-chart-state .empty-icon {
1269
+ font-size: 2rem;
1270
+ margin-bottom: var(--spacing-sm);
1271
+ opacity: 0.5;
1272
+ }
1273
+
1274
+ .empty-chart-state p {
1275
+ font-size: 0.875rem;
1276
+ }
1277
+
1278
+ .empty-chart-state code {
1279
+ background: var(--bg-overlay);
1280
+ padding: 2px 6px;
1281
+ border-radius: 4px;
1282
+ font-size: 0.8rem;
1283
+ }
package/dist/cli.js CHANGED
@@ -18,10 +18,10 @@ program.addCommand((0, commands_1.createStartCommand)());
18
18
  program.addCommand((0, commands_1.createProfileCommand)());
19
19
  program.addCommand((0, commands_1.createInitHookCommand)());
20
20
  program.addCommand((0, commands_1.createWatchCommand)());
21
- program.addCommand((0, commands_1.createInterveneCommand)());
22
21
  program.addCommand((0, commands_1.createTimelineCommand)());
23
22
  program.addCommand((0, commands_1.createCacheCommand)());
24
23
  program.addCommand((0, commands_1.createDashboardCommand)());
24
+ program.addCommand((0, commands_1.createSessionCommand)());
25
25
  // Default behavior: if no subcommand, run analyze with passed options
26
26
  // This maintains backwards compatibility with v1.x usage
27
27
  program
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,yCAA8O;AAE9O,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC;KAChB,uBAAuB,EAAE;KACzB,kBAAkB,EAAE,CAAC;AAExB,kBAAkB;AAClB,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,gCAAqB,GAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,iCAAsB,GAAE,CAAC,CAAC;AAC7C,OAAO,CAAC,UAAU,CAAC,IAAA,gCAAqB,GAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,iCAAsB,GAAE,CAAC,CAAC;AAE7C,sEAAsE;AACtE,yDAAyD;AACzD,OAAO;KACJ,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,EAAE,UAAU,CAAC;KACpF,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC7D,MAAM,CAAC,eAAe,EAAE,qBAAqB,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,4CAA4C,EAAE,KAAK,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,cAAc,EAAE,mCAAmC,EAAE,KAAK,CAAC;KAClE,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC;KAChF,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;KACpF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,wDAAwD;IACxD,MAAM,IAAA,qBAAU,EAAC;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,yCAA4O;AAE5O,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC;KAChB,uBAAuB,EAAE;KACzB,kBAAkB,EAAE,CAAC;AAExB,kBAAkB;AAClB,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,IAAA,gCAAqB,GAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,gCAAqB,GAAE,CAAC,CAAC;AAC5C,OAAO,CAAC,UAAU,CAAC,IAAA,6BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,iCAAsB,GAAE,CAAC,CAAC;AAC7C,OAAO,CAAC,UAAU,CAAC,IAAA,+BAAoB,GAAE,CAAC,CAAC;AAE3C,sEAAsE;AACtE,yDAAyD;AACzD,OAAO;KACJ,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,CAAC;KACxE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,EAAE,UAAU,CAAC;KACpF,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC7D,MAAM,CAAC,eAAe,EAAE,qBAAqB,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,4CAA4C,EAAE,KAAK,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KAC3D,MAAM,CAAC,cAAc,EAAE,mCAAmC,EAAE,KAAK,CAAC;KAClE,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC;KAChF,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;KACpF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,wDAAwD;IACxD,MAAM,IAAA,qBAAU,EAAC;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAkB9C;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6UvE"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAkB9C;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsXvE"}
@@ -243,8 +243,16 @@ async function runAnalyze(options) {
243
243
  // Record session and show gamification (only for terminal format with score)
244
244
  if (format === 'terminal' && resultV2.vibeScore) {
245
245
  const vibeScorePercent = Math.round(resultV2.vibeScore.value * 100);
246
- const gamificationResult = (0, profile_1.recordSession)(vibeScorePercent, result.overall, commits.length, spiralCount, result.period.from, result.period.to, result.fixChains // Pass fix chains for pattern memory
247
- );
246
+ // Use metric-based rating (quality grade) for session recording
247
+ const gamificationResult = (0, profile_1.recordSession)(vibeScorePercent, result.overall, commits.length, spiralCount, result.period.from, result.period.to, result.fixChains, // Pass fix chains for pattern memory
248
+ // Pass real metrics for dashboard visualization
249
+ {
250
+ iterationVelocity: result.metrics.iterationVelocity.value,
251
+ reworkRatio: result.metrics.reworkRatio.value,
252
+ trustPassRate: result.metrics.trustPassRate.value,
253
+ flowEfficiency: result.metrics.flowEfficiency.value,
254
+ debugSpiralDuration: result.metrics.debugSpiralDuration.value,
255
+ });
248
256
  // Show gamification summary
249
257
  console.log();
250
258
  console.log(chalk_1.default.cyan('─'.repeat(64)));
@@ -289,6 +297,34 @@ async function runAnalyze(options) {
289
297
  }
290
298
  }
291
299
  console.log(chalk_1.default.cyan('─'.repeat(64)));
300
+ // Display pending nudges from learning system
301
+ const { formatNudgesForCli } = require('../learning/nudges');
302
+ const nudgeLines = formatNudgesForCli(2);
303
+ if (nudgeLines.length > 0) {
304
+ for (const line of nudgeLines) {
305
+ console.log(line);
306
+ }
307
+ console.log(chalk_1.default.cyan('─'.repeat(64)));
308
+ }
309
+ // Surface relevant lessons if spirals were detected
310
+ if (spiralCount > 0) {
311
+ const { surfaceLessonsForPattern, formatSurfacedLesson } = require('../learning/surfacing');
312
+ // Get patterns from detected spirals
313
+ const spiralPatterns = result.fixChains
314
+ .filter(fc => fc.isSpiral && fc.pattern)
315
+ .map(fc => fc.pattern);
316
+ const uniquePatterns = [...new Set(spiralPatterns)];
317
+ for (const pattern of uniquePatterns.slice(0, 2)) {
318
+ const surfaced = surfaceLessonsForPattern(pattern);
319
+ if (surfaced.length > 0) {
320
+ const lessonLines = formatSurfacedLesson(surfaced[0]);
321
+ for (const line of lessonLines) {
322
+ console.log(line);
323
+ }
324
+ console.log(chalk_1.default.cyan('─'.repeat(64)));
325
+ }
326
+ }
327
+ }
292
328
  console.log(chalk_1.default.gray(` Run ${chalk_1.default.white('vibe-check profile')} to see your full stats`));
293
329
  console.log();
294
330
  }