@boshu2/vibe-check 1.6.2 → 1.8.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 (156) hide show
  1. package/.agents/bundles/actionable-coaching-plan-2025-12-02.md +209 -0
  2. package/.agents/bundles/automatic-learning-cadence-plan-2025-12-02.md +1297 -0
  3. package/.agents/bundles/automatic-learning-cadence-research-2025-12-02.md +481 -0
  4. package/.agents/bundles/dashboard-data-quality-plan.md +458 -0
  5. package/.agents/bundles/rating-scoring-alignment-plan.md +427 -0
  6. package/.agents/bundles/rpi-session-capture-plan-2025-12-02.md +693 -0
  7. package/.agents/bundles/rpi-session-capture-research-2025-12-02.md +433 -0
  8. package/.agents/bundles/session-integration-plan-2025-12-02.md +144 -0
  9. package/.agents/plans/git-forensics-enhancement-2025-12-05.md +493 -0
  10. package/.claude/skills/typescript-review.md +152 -0
  11. package/CHANGELOG.md +53 -0
  12. package/CLAUDE.md +79 -3
  13. package/Makefile +160 -0
  14. package/README.md +141 -155
  15. package/SECURITY.md +5 -1
  16. package/assets/logo-dark.svg +47 -0
  17. package/assets/logo.svg +47 -0
  18. package/claude-progress.json +54 -4
  19. package/claude-progress.txt +114 -0
  20. package/dashboard/app.js +699 -66
  21. package/dashboard/chart.min.js +20 -0
  22. package/dashboard/dashboard-data.js +764 -0
  23. package/dashboard/dashboard-data.json +182 -71
  24. package/dashboard/index.html +139 -14
  25. package/dashboard/styles.css +579 -4
  26. package/dist/analyzers/patterns.d.ts +62 -0
  27. package/dist/analyzers/patterns.d.ts.map +1 -0
  28. package/dist/analyzers/patterns.js +103 -0
  29. package/dist/analyzers/patterns.js.map +1 -0
  30. package/dist/analyzers/quality.d.ts +58 -0
  31. package/dist/analyzers/quality.d.ts.map +1 -0
  32. package/dist/analyzers/quality.js +114 -0
  33. package/dist/analyzers/quality.js.map +1 -0
  34. package/dist/analyzers/sessions.d.ts +45 -0
  35. package/dist/analyzers/sessions.d.ts.map +1 -0
  36. package/dist/analyzers/sessions.js +123 -0
  37. package/dist/analyzers/sessions.js.map +1 -0
  38. package/dist/cli.js +5 -1
  39. package/dist/cli.js.map +1 -1
  40. package/dist/commands/analyze.d.ts.map +1 -1
  41. package/dist/commands/analyze.js +43 -2
  42. package/dist/commands/analyze.js.map +1 -1
  43. package/dist/commands/dashboard.js +4 -1
  44. package/dist/commands/dashboard.js.map +1 -1
  45. package/dist/commands/forensics.d.ts +29 -0
  46. package/dist/commands/forensics.d.ts.map +1 -0
  47. package/dist/commands/forensics.js +213 -0
  48. package/dist/commands/forensics.js.map +1 -0
  49. package/dist/commands/index.d.ts +5 -1
  50. package/dist/commands/index.d.ts.map +1 -1
  51. package/dist/commands/index.js +13 -3
  52. package/dist/commands/index.js.map +1 -1
  53. package/dist/commands/insights.d.ts +3 -0
  54. package/dist/commands/insights.d.ts.map +1 -0
  55. package/dist/commands/insights.js +120 -0
  56. package/dist/commands/insights.js.map +1 -0
  57. package/dist/commands/learn.d.ts +3 -0
  58. package/dist/commands/learn.d.ts.map +1 -0
  59. package/dist/commands/learn.js +161 -0
  60. package/dist/commands/learn.js.map +1 -0
  61. package/dist/commands/lesson.d.ts +8 -0
  62. package/dist/commands/lesson.d.ts.map +1 -0
  63. package/dist/commands/lesson.js +206 -0
  64. package/dist/commands/lesson.js.map +1 -0
  65. package/dist/commands/pipeline.d.ts +3 -0
  66. package/dist/commands/pipeline.d.ts.map +1 -0
  67. package/dist/commands/pipeline.js +485 -0
  68. package/dist/commands/pipeline.js.map +1 -0
  69. package/dist/commands/profile.d.ts +0 -1
  70. package/dist/commands/profile.d.ts.map +1 -1
  71. package/dist/commands/profile.js +3 -206
  72. package/dist/commands/profile.js.map +1 -1
  73. package/dist/commands/session.d.ts +51 -0
  74. package/dist/commands/session.d.ts.map +1 -0
  75. package/dist/commands/session.js +599 -0
  76. package/dist/commands/session.js.map +1 -0
  77. package/dist/commands/sessions.d.ts +20 -0
  78. package/dist/commands/sessions.d.ts.map +1 -0
  79. package/dist/commands/sessions.js +201 -0
  80. package/dist/commands/sessions.js.map +1 -0
  81. package/dist/commands/watch.d.ts.map +1 -1
  82. package/dist/commands/watch.js +48 -7
  83. package/dist/commands/watch.js.map +1 -1
  84. package/dist/gamification/index.d.ts +1 -3
  85. package/dist/gamification/index.d.ts.map +1 -1
  86. package/dist/gamification/index.js +2 -5
  87. package/dist/gamification/index.js.map +1 -1
  88. package/dist/gamification/pattern-memory.d.ts +1 -1
  89. package/dist/gamification/pattern-memory.d.ts.map +1 -1
  90. package/dist/gamification/pattern-memory.js.map +1 -1
  91. package/dist/gamification/profile.d.ts +2 -2
  92. package/dist/gamification/profile.d.ts.map +1 -1
  93. package/dist/gamification/profile.js +2 -15
  94. package/dist/gamification/profile.js.map +1 -1
  95. package/dist/gamification/types.d.ts +8 -2
  96. package/dist/gamification/types.d.ts.map +1 -1
  97. package/dist/gamification/types.js.map +1 -1
  98. package/dist/insights/index.d.ts.map +1 -1
  99. package/dist/insights/index.js +16 -4
  100. package/dist/insights/index.js.map +1 -1
  101. package/dist/insights/types.d.ts +14 -0
  102. package/dist/insights/types.d.ts.map +1 -1
  103. package/dist/learning/cadence.d.ts +15 -0
  104. package/dist/learning/cadence.d.ts.map +1 -0
  105. package/dist/learning/cadence.js +130 -0
  106. package/dist/learning/cadence.js.map +1 -0
  107. package/dist/learning/index.d.ts +19 -0
  108. package/dist/learning/index.d.ts.map +1 -0
  109. package/dist/learning/index.js +35 -0
  110. package/dist/learning/index.js.map +1 -0
  111. package/dist/learning/lessons-storage.d.ts +48 -0
  112. package/dist/learning/lessons-storage.d.ts.map +1 -0
  113. package/dist/learning/lessons-storage.js +266 -0
  114. package/dist/learning/lessons-storage.js.map +1 -0
  115. package/dist/learning/lessons-types.d.ts +83 -0
  116. package/dist/learning/lessons-types.d.ts.map +1 -0
  117. package/dist/learning/lessons-types.js +15 -0
  118. package/dist/learning/lessons-types.js.map +1 -0
  119. package/dist/learning/nudges.d.ts +20 -0
  120. package/dist/learning/nudges.d.ts.map +1 -0
  121. package/dist/learning/nudges.js +68 -0
  122. package/dist/learning/nudges.js.map +1 -0
  123. package/dist/learning/retrospective.d.ts +27 -0
  124. package/dist/learning/retrospective.d.ts.map +1 -0
  125. package/dist/learning/retrospective.js +184 -0
  126. package/dist/learning/retrospective.js.map +1 -0
  127. package/dist/learning/storage.d.ts +44 -0
  128. package/dist/learning/storage.d.ts.map +1 -0
  129. package/dist/learning/storage.js +194 -0
  130. package/dist/learning/storage.js.map +1 -0
  131. package/dist/learning/surfacing.d.ts +36 -0
  132. package/dist/learning/surfacing.d.ts.map +1 -0
  133. package/dist/learning/surfacing.js +255 -0
  134. package/dist/learning/surfacing.js.map +1 -0
  135. package/dist/learning/synthesis.d.ts +17 -0
  136. package/dist/learning/synthesis.d.ts.map +1 -0
  137. package/dist/learning/synthesis.js +293 -0
  138. package/dist/learning/synthesis.js.map +1 -0
  139. package/dist/learning/types.d.ts +60 -0
  140. package/dist/learning/types.d.ts.map +1 -0
  141. package/dist/learning/types.js +17 -0
  142. package/dist/learning/types.js.map +1 -0
  143. package/dist/storage/index.d.ts +1 -0
  144. package/dist/storage/index.d.ts.map +1 -1
  145. package/dist/storage/index.js +11 -1
  146. package/dist/storage/index.js.map +1 -1
  147. package/dist/storage/spiral-history.d.ts +62 -0
  148. package/dist/storage/spiral-history.d.ts.map +1 -0
  149. package/dist/storage/spiral-history.js +265 -0
  150. package/dist/storage/spiral-history.js.map +1 -0
  151. package/docs/ARCHITECTURE.md +2 -10
  152. package/docs/GAMIFICATION.md +19 -266
  153. package/docs/METRICS.md +528 -0
  154. package/docs/VIBE-ECOSYSTEM.md +12 -78
  155. package/feature-list.json +141 -68
  156. 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
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pattern Detection Analyzer (VIBE-045)
3
+ *
4
+ * Analyzes git history to detect failure patterns:
5
+ * - Debug spirals ("take N" pattern)
6
+ * - Vague commits (<20 chars)
7
+ * - Context amnesia (repeated scope visits)
8
+ *
9
+ * Proven algorithm from release-engineering retrospective (475 commits analyzed).
10
+ */
11
+ import { Commit } from '../types';
12
+ export interface DebugSpiral {
13
+ count: number;
14
+ durationMinutes: number;
15
+ commits: string[];
16
+ dates: string[];
17
+ }
18
+ export interface VagueCommitInfo {
19
+ count: number;
20
+ percentage: number;
21
+ threshold: number;
22
+ examples: string[];
23
+ }
24
+ export interface ContextAmnesiaInfo {
25
+ scopes: {
26
+ name: string;
27
+ visits: number;
28
+ }[];
29
+ }
30
+ export interface PatternDetectionResult {
31
+ debugSpirals: DebugSpiral | null;
32
+ vagueCommits: VagueCommitInfo;
33
+ contextAmnesia: ContextAmnesiaInfo;
34
+ }
35
+ /**
36
+ * Detect "take N" pattern indicating debug spirals.
37
+ *
38
+ * A debug spiral is detected when 3+ commits match the pattern "take N" or similar
39
+ * retry patterns, indicating the developer is stuck in a fix-retry loop.
40
+ */
41
+ export declare function detectDebugSpirals(commits: Commit[]): DebugSpiral | null;
42
+ /**
43
+ * Detect vague commits - messages that are too short to be meaningful.
44
+ *
45
+ * Threshold: < 20 characters is considered vague.
46
+ * Examples: "ci", "v3", "blah", "take 2", "fix"
47
+ */
48
+ export declare function detectVagueCommits(commits: Commit[], threshold?: number): VagueCommitInfo;
49
+ /**
50
+ * Detect context amnesia - repeatedly returning to the same scope/component.
51
+ *
52
+ * This indicates the developer keeps revisiting the same area, possibly
53
+ * due to incomplete understanding or forgotten context.
54
+ *
55
+ * Reports scopes that appear in 5+ commits.
56
+ */
57
+ export declare function detectContextAmnesia(commits: Commit[], minVisits?: number): ContextAmnesiaInfo;
58
+ /**
59
+ * Run all pattern detection on a set of commits.
60
+ */
61
+ export declare function detectPatterns(commits: Commit[]): PatternDetectionResult;
62
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/analyzers/patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,eAAe,CAAC;IAC9B,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CAoCxE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,GAAE,MAAW,GACrB,eAAe,CAmBjB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,GAAE,MAAU,GACpB,kBAAkB,CAiBpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAMxE"}