@boshu2/vibe-check 1.0.2 → 1.2.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 (133) 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 +47 -0
  10. package/CLAUDE.md +178 -0
  11. package/README.md +222 -7
  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 +31 -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 +5 -0
  35. package/dist/commands/index.d.ts.map +1 -0
  36. package/dist/commands/index.js +13 -0
  37. package/dist/commands/index.js.map +1 -0
  38. package/dist/commands/init-hook.d.ts +3 -0
  39. package/dist/commands/init-hook.d.ts.map +1 -0
  40. package/dist/commands/init-hook.js +161 -0
  41. package/dist/commands/init-hook.js.map +1 -0
  42. package/dist/commands/level.d.ts +3 -0
  43. package/dist/commands/level.d.ts.map +1 -0
  44. package/dist/commands/level.js +277 -0
  45. package/dist/commands/level.js.map +1 -0
  46. package/dist/commands/profile.d.ts +4 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +143 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/gamification/achievements.d.ts +15 -0
  51. package/dist/gamification/achievements.d.ts.map +1 -0
  52. package/dist/gamification/achievements.js +273 -0
  53. package/dist/gamification/achievements.js.map +1 -0
  54. package/dist/gamification/index.d.ts +8 -0
  55. package/dist/gamification/index.d.ts.map +1 -0
  56. package/dist/gamification/index.js +30 -0
  57. package/dist/gamification/index.js.map +1 -0
  58. package/dist/gamification/profile.d.ts +46 -0
  59. package/dist/gamification/profile.d.ts.map +1 -0
  60. package/dist/gamification/profile.js +272 -0
  61. package/dist/gamification/profile.js.map +1 -0
  62. package/dist/gamification/streaks.d.ts +26 -0
  63. package/dist/gamification/streaks.d.ts.map +1 -0
  64. package/dist/gamification/streaks.js +132 -0
  65. package/dist/gamification/streaks.js.map +1 -0
  66. package/dist/gamification/types.d.ts +111 -0
  67. package/dist/gamification/types.d.ts.map +1 -0
  68. package/dist/gamification/types.js +26 -0
  69. package/dist/gamification/types.js.map +1 -0
  70. package/dist/gamification/xp.d.ts +37 -0
  71. package/dist/gamification/xp.d.ts.map +1 -0
  72. package/dist/gamification/xp.js +115 -0
  73. package/dist/gamification/xp.js.map +1 -0
  74. package/dist/git.d.ts +11 -0
  75. package/dist/git.d.ts.map +1 -1
  76. package/dist/git.js +52 -0
  77. package/dist/git.js.map +1 -1
  78. package/dist/metrics/code-stability.d.ts +13 -0
  79. package/dist/metrics/code-stability.d.ts.map +1 -0
  80. package/dist/metrics/code-stability.js +74 -0
  81. package/dist/metrics/code-stability.js.map +1 -0
  82. package/dist/metrics/file-churn.d.ts +8 -0
  83. package/dist/metrics/file-churn.d.ts.map +1 -0
  84. package/dist/metrics/file-churn.js +75 -0
  85. package/dist/metrics/file-churn.js.map +1 -0
  86. package/dist/metrics/time-spiral.d.ts +8 -0
  87. package/dist/metrics/time-spiral.d.ts.map +1 -0
  88. package/dist/metrics/time-spiral.js +69 -0
  89. package/dist/metrics/time-spiral.js.map +1 -0
  90. package/dist/metrics/velocity-anomaly.d.ts +13 -0
  91. package/dist/metrics/velocity-anomaly.d.ts.map +1 -0
  92. package/dist/metrics/velocity-anomaly.js +67 -0
  93. package/dist/metrics/velocity-anomaly.js.map +1 -0
  94. package/dist/output/index.d.ts +6 -3
  95. package/dist/output/index.d.ts.map +1 -1
  96. package/dist/output/index.js +4 -3
  97. package/dist/output/index.js.map +1 -1
  98. package/dist/output/json.d.ts +2 -2
  99. package/dist/output/json.d.ts.map +1 -1
  100. package/dist/output/json.js +54 -0
  101. package/dist/output/json.js.map +1 -1
  102. package/dist/output/markdown.d.ts +2 -2
  103. package/dist/output/markdown.d.ts.map +1 -1
  104. package/dist/output/markdown.js +34 -1
  105. package/dist/output/markdown.js.map +1 -1
  106. package/dist/output/terminal.d.ts +6 -2
  107. package/dist/output/terminal.d.ts.map +1 -1
  108. package/dist/output/terminal.js +131 -3
  109. package/dist/output/terminal.js.map +1 -1
  110. package/dist/recommend/index.d.ts +3 -0
  111. package/dist/recommend/index.d.ts.map +1 -0
  112. package/dist/recommend/index.js +14 -0
  113. package/dist/recommend/index.js.map +1 -0
  114. package/dist/recommend/ordered-logistic.d.ts +49 -0
  115. package/dist/recommend/ordered-logistic.d.ts.map +1 -0
  116. package/dist/recommend/ordered-logistic.js +153 -0
  117. package/dist/recommend/ordered-logistic.js.map +1 -0
  118. package/dist/recommend/questions.d.ts +19 -0
  119. package/dist/recommend/questions.d.ts.map +1 -0
  120. package/dist/recommend/questions.js +73 -0
  121. package/dist/recommend/questions.js.map +1 -0
  122. package/dist/score/index.d.ts +21 -0
  123. package/dist/score/index.d.ts.map +1 -0
  124. package/dist/score/index.js +48 -0
  125. package/dist/score/index.js.map +1 -0
  126. package/dist/score/weights.d.ts +16 -0
  127. package/dist/score/weights.d.ts.map +1 -0
  128. package/dist/score/weights.js +28 -0
  129. package/dist/score/weights.js.map +1 -0
  130. package/dist/types.d.ts +83 -0
  131. package/dist/types.d.ts.map +1 -1
  132. package/hooks/pre-push +103 -0
  133. package/package.json +10 -9
@@ -0,0 +1,16 @@
1
+ export interface ScoreWeights {
2
+ fileChurn: number;
3
+ timeSpiral: number;
4
+ velocityAnomaly: number;
5
+ codeStability: number;
6
+ }
7
+ /**
8
+ * Default weights based on research.
9
+ * Will be calibrated over time.
10
+ */
11
+ export declare const DEFAULT_WEIGHTS: ScoreWeights;
12
+ /**
13
+ * Normalize weights to sum to 1.0.
14
+ */
15
+ export declare function normalizeWeights(weights: ScoreWeights): ScoreWeights;
16
+ //# sourceMappingURL=weights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weights.d.ts","sourceRoot":"","sources":["../../src/score/weights.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,YAK7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAUpE"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_WEIGHTS = void 0;
4
+ exports.normalizeWeights = normalizeWeights;
5
+ /**
6
+ * Default weights based on research.
7
+ * Will be calibrated over time.
8
+ */
9
+ exports.DEFAULT_WEIGHTS = {
10
+ fileChurn: 0.30, // Strongest signal
11
+ timeSpiral: 0.25, // Frustrated iteration
12
+ velocityAnomaly: 0.20, // Unusual patterns
13
+ codeStability: 0.25, // Long-term quality
14
+ };
15
+ /**
16
+ * Normalize weights to sum to 1.0.
17
+ */
18
+ function normalizeWeights(weights) {
19
+ const sum = weights.fileChurn + weights.timeSpiral +
20
+ weights.velocityAnomaly + weights.codeStability;
21
+ return {
22
+ fileChurn: weights.fileChurn / sum,
23
+ timeSpiral: weights.timeSpiral / sum,
24
+ velocityAnomaly: weights.velocityAnomaly / sum,
25
+ codeStability: weights.codeStability / sum,
26
+ };
27
+ }
28
+ //# sourceMappingURL=weights.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weights.js","sourceRoot":"","sources":["../../src/score/weights.ts"],"names":[],"mappings":";;;AAqBA,4CAUC;AAxBD;;;GAGG;AACU,QAAA,eAAe,GAAiB;IAC3C,SAAS,EAAE,IAAI,EAAQ,mBAAmB;IAC1C,UAAU,EAAE,IAAI,EAAO,uBAAuB;IAC9C,eAAe,EAAE,IAAI,EAAE,mBAAmB;IAC1C,aAAa,EAAE,IAAI,EAAI,oBAAoB;CAC5C,CAAC;AAEF;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAqB;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU;QACtC,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;IAE5D,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,GAAG;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,GAAG;QACpC,eAAe,EAAE,OAAO,CAAC,eAAe,GAAG,GAAG;QAC9C,aAAa,EAAE,OAAO,CAAC,aAAa,GAAG,GAAG;KAC3C,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -59,5 +59,88 @@ export interface CliOptions {
59
59
  format: OutputFormat;
60
60
  repo: string;
61
61
  verbose: boolean;
62
+ score?: boolean;
63
+ recommend?: boolean;
64
+ calibrate?: string;
65
+ }
66
+ export interface FileChurnResult extends MetricResult {
67
+ churnedFiles: number;
68
+ totalFiles: number;
69
+ }
70
+ export interface TimeSpiralResult extends MetricResult {
71
+ spiralCommits: number;
72
+ totalCommits: number;
73
+ }
74
+ export interface VelocityAnomalyResult extends MetricResult {
75
+ currentVelocity: number;
76
+ baselineMean: number;
77
+ baselineStdDev: number;
78
+ zScore: number;
79
+ }
80
+ export interface CodeStabilityResult extends MetricResult {
81
+ linesAdded: number;
82
+ linesSurviving: number;
83
+ }
84
+ export interface VibeScore {
85
+ value: number;
86
+ components: {
87
+ fileChurn: number;
88
+ timeSpiral: number;
89
+ velocityAnomaly: number;
90
+ codeStability: number;
91
+ };
92
+ weights: {
93
+ fileChurn: number;
94
+ timeSpiral: number;
95
+ velocityAnomaly: number;
96
+ codeStability: number;
97
+ };
98
+ }
99
+ export interface VibeLevelRecommendation {
100
+ level: 0 | 1 | 2 | 3 | 4 | 5;
101
+ confidence: number;
102
+ probabilities: number[];
103
+ ci: [number, number];
104
+ questions: QuestionResponses;
105
+ }
106
+ export interface QuestionResponses {
107
+ reversibility: -2 | -1 | 0 | 1;
108
+ blastRadius: -2 | -1 | 0 | 1;
109
+ verificationCost: -2 | -1 | 0 | 1;
110
+ domainComplexity: -2 | -1 | 0 | 1;
111
+ aiTrackRecord: -2 | -1 | 0 | 1;
112
+ }
113
+ export interface CalibrationSample {
114
+ timestamp: Date;
115
+ vibeScore: number;
116
+ declaredLevel: 0 | 1 | 2 | 3 | 4 | 5;
117
+ outcome: 'correct' | 'too_high' | 'too_low';
118
+ features: number[];
119
+ modelVersion: string;
120
+ }
121
+ export interface CalibrationState {
122
+ samples: CalibrationSample[];
123
+ weights: number[];
124
+ thresholds: number[];
125
+ ece: number;
126
+ lastUpdated: Date;
127
+ version: string;
128
+ }
129
+ export interface VibeCheckResultV2 extends VibeCheckResult {
130
+ vibeScore?: VibeScore;
131
+ recommendation?: VibeLevelRecommendation;
132
+ semanticMetrics: {
133
+ iterationVelocity: MetricResult;
134
+ reworkRatio: MetricResult;
135
+ trustPassRate: MetricResult;
136
+ debugSpiralDuration: MetricResult;
137
+ flowEfficiency: MetricResult;
138
+ };
139
+ semanticFreeMetrics?: {
140
+ fileChurn: FileChurnResult;
141
+ timeSpiral: TimeSpiralResult;
142
+ velocityAnomaly: VelocityAnomalyResult;
143
+ codeStability: CodeStabilityResult;
144
+ };
62
145
  }
63
146
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AACzD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAClF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QACN,IAAI,EAAE,IAAI,CAAC;QACX,EAAE,EAAE,IAAI,CAAC;QACT,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,EAAE;QACP,iBAAiB,EAAE,YAAY,CAAC;QAChC,WAAW,EAAE,YAAY,CAAC;QAC1B,aAAa,EAAE,YAAY,CAAC;QAC5B,mBAAmB,EAAE,YAAY,CAAC;QAClC,cAAc,EAAE,YAAY,CAAC;KAC9B,CAAC;IACF,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/hooks/pre-push ADDED
@@ -0,0 +1,103 @@
1
+ #!/bin/bash
2
+ # vibe-check pre-push hook
3
+ # Runs vibe-check on commits being pushed and displays metrics
4
+ #
5
+ # Installation:
6
+ # cp hooks/pre-push .git/hooks/pre-push
7
+ # chmod +x .git/hooks/pre-push
8
+ #
9
+ # Or run: npx @boshu2/vibe-check init-hook
10
+
11
+ # Colors
12
+ RED='\033[0;31m'
13
+ YELLOW='\033[1;33m'
14
+ GREEN='\033[0;32m'
15
+ CYAN='\033[0;36m'
16
+ NC='\033[0m' # No Color
17
+
18
+ # Configuration (set these env vars to customize)
19
+ VIBE_CHECK_BLOCK_LOW=${VIBE_CHECK_BLOCK_LOW:-false} # Set to "true" to block push on LOW rating
20
+ VIBE_CHECK_SIMPLE=${VIBE_CHECK_SIMPLE:-true} # Use simple output by default
21
+ VIBE_CHECK_SCORE=${VIBE_CHECK_SCORE:-true} # Include vibe score
22
+
23
+ echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
24
+ echo -e "${CYAN} 🎯 Running vibe-check before push...${NC}"
25
+ echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
26
+ echo
27
+
28
+ # Read stdin for push info
29
+ while read local_ref local_sha remote_ref remote_sha; do
30
+ # Skip if deleting branch
31
+ if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then
32
+ continue
33
+ fi
34
+
35
+ # Determine the range of commits
36
+ if [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
37
+ # New branch - check all commits
38
+ RANGE="$local_sha"
39
+ SINCE_FLAG=""
40
+ else
41
+ # Existing branch - check commits since last push
42
+ RANGE="$remote_sha..$local_sha"
43
+ # Get the date of the remote SHA
44
+ SINCE_DATE=$(git log -1 --format=%ci "$remote_sha" 2>/dev/null)
45
+ if [ -n "$SINCE_DATE" ]; then
46
+ SINCE_FLAG="--since \"$SINCE_DATE\""
47
+ else
48
+ SINCE_FLAG=""
49
+ fi
50
+ fi
51
+
52
+ # Count commits being pushed
53
+ COMMIT_COUNT=$(git rev-list --count "$RANGE" 2>/dev/null || echo "0")
54
+
55
+ if [ "$COMMIT_COUNT" = "0" ]; then
56
+ echo -e "${YELLOW}No new commits to analyze${NC}"
57
+ continue
58
+ fi
59
+
60
+ echo -e "Analyzing ${GREEN}$COMMIT_COUNT${NC} commit(s) on ${CYAN}$local_ref${NC}"
61
+ echo
62
+
63
+ # Build vibe-check command
64
+ VIBE_CMD="npx @boshu2/vibe-check"
65
+
66
+ if [ "$VIBE_CHECK_SIMPLE" = "true" ]; then
67
+ VIBE_CMD="$VIBE_CMD --simple"
68
+ fi
69
+
70
+ if [ "$VIBE_CHECK_SCORE" = "true" ]; then
71
+ VIBE_CMD="$VIBE_CMD --score"
72
+ fi
73
+
74
+ # Run vibe-check and capture output
75
+ if [ -n "$SINCE_FLAG" ]; then
76
+ OUTPUT=$(eval "$VIBE_CMD $SINCE_FLAG" 2>&1)
77
+ else
78
+ OUTPUT=$(eval "$VIBE_CMD --since '1 week ago'" 2>&1)
79
+ fi
80
+
81
+ EXIT_CODE=$?
82
+
83
+ # Display output
84
+ echo "$OUTPUT"
85
+ echo
86
+
87
+ # Check if we should block on LOW rating
88
+ if [ "$VIBE_CHECK_BLOCK_LOW" = "true" ] && [ $EXIT_CODE -eq 1 ]; then
89
+ echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
90
+ echo -e "${RED} ⛔ Push blocked: LOW vibe rating${NC}"
91
+ echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
92
+ echo
93
+ echo -e "To push anyway, set: ${YELLOW}VIBE_CHECK_BLOCK_LOW=false git push${NC}"
94
+ exit 1
95
+ fi
96
+ done
97
+
98
+ echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
99
+ echo -e "${GREEN} ✓ Vibe check complete, proceeding with push${NC}"
100
+ echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
101
+ echo
102
+
103
+ exit 0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@boshu2/vibe-check",
3
- "version": "1.0.2",
4
- "description": "Measure vibe coding effectiveness with git commit analysis",
3
+ "version": "1.2.0",
4
+ "description": "Track git commit patterns during AI-assisted coding (experimental)",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
7
7
  "vibe-check": "bin/vibe-check.js"
@@ -29,17 +29,18 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "chalk": "^4.1.2",
32
- "commander": "^12.1.0",
33
- "date-fns": "^3.6.0",
34
- "simple-git": "^3.27.0"
32
+ "commander": "^14.0.0",
33
+ "date-fns": "^4.1.0",
34
+ "enquirer": "^2.4.1",
35
+ "simple-git": "^3.30.0"
35
36
  },
36
37
  "devDependencies": {
37
- "@types/node": "^20.17.6",
38
+ "@types/node": "^22.0.0",
38
39
  "ts-node": "^10.9.2",
39
- "typescript": "^5.6.3",
40
- "vitest": "^4.0.14"
40
+ "typescript": "^5.9.0",
41
+ "vitest": "^4.0.0"
41
42
  },
42
43
  "engines": {
43
- "node": ">=18.0.0"
44
+ "node": ">=20.0.0"
44
45
  }
45
46
  }