@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,256 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createAnalyzeCommand = createAnalyzeCommand;
7
+ exports.runAnalyze = runAnalyze;
8
+ const commander_1 = require("commander");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const fs_1 = require("fs");
11
+ const git_1 = require("../git");
12
+ const metrics_1 = require("../metrics");
13
+ const output_1 = require("../output");
14
+ const json_1 = require("../output/json");
15
+ const file_churn_1 = require("../metrics/file-churn");
16
+ const time_spiral_1 = require("../metrics/time-spiral");
17
+ const velocity_anomaly_1 = require("../metrics/velocity-anomaly");
18
+ const code_stability_1 = require("../metrics/code-stability");
19
+ const score_1 = require("../score");
20
+ const recommend_1 = require("../recommend");
21
+ const calibration_1 = require("../calibration");
22
+ const profile_1 = require("../gamification/profile");
23
+ const types_1 = require("../gamification/types");
24
+ function createAnalyzeCommand() {
25
+ const cmd = new commander_1.Command('analyze')
26
+ .description('Analyze git history for vibe coding metrics')
27
+ .option('--since <date>', 'Start date for analysis (e.g., "1 week ago")')
28
+ .option('--until <date>', 'End date for analysis (default: now)')
29
+ .option('-f, --format <type>', 'Output format: terminal, json, markdown', 'terminal')
30
+ .option('-r, --repo <path>', 'Repository path', process.cwd())
31
+ .option('-v, --verbose', 'Show verbose output', false)
32
+ .option('--score', 'Include VibeScore and code pattern metrics', false)
33
+ .option('--recommend', 'Include level recommendation', false)
34
+ .option('--calibrate <level>', 'Record calibration sample with declared level (0-5)')
35
+ .option('-o, --output <file>', 'Write JSON results to file')
36
+ .option('-s, --simple', 'Simplified output (fewer details)', false)
37
+ .action(async (options) => {
38
+ await runAnalyze(options);
39
+ });
40
+ return cmd;
41
+ }
42
+ async function runAnalyze(options) {
43
+ try {
44
+ const { since, until, format, repo, verbose, score, recommend, calibrate, output, simple } = options;
45
+ // Validate format
46
+ const validFormats = ['terminal', 'json', 'markdown'];
47
+ if (!validFormats.includes(format)) {
48
+ console.error(chalk_1.default.red(`Invalid format: ${format}`));
49
+ console.error(chalk_1.default.gray(`Valid formats: ${validFormats.join(', ')}`));
50
+ process.exit(1);
51
+ }
52
+ // Check if repo is valid
53
+ if (!(await (0, git_1.isGitRepo)(repo))) {
54
+ console.error(chalk_1.default.red(`Not a git repository: ${repo}`));
55
+ process.exit(1);
56
+ }
57
+ if (verbose) {
58
+ console.error(chalk_1.default.gray(`Analyzing repository: ${repo}`));
59
+ if (since)
60
+ console.error(chalk_1.default.gray(`Since: ${since}`));
61
+ if (until)
62
+ console.error(chalk_1.default.gray(`Until: ${until}`));
63
+ }
64
+ // Get commits
65
+ const commits = await (0, git_1.getCommits)(repo, since, until);
66
+ if (commits.length === 0) {
67
+ if (format === 'terminal') {
68
+ console.log(chalk_1.default.yellow('\nNo commits found in the specified range.\n'));
69
+ if (!since) {
70
+ console.log(chalk_1.default.gray('Try specifying a date range:'));
71
+ console.log(chalk_1.default.gray(' vibe-check --since "1 week ago"'));
72
+ console.log(chalk_1.default.gray(' vibe-check --since "2025-11-01"'));
73
+ }
74
+ }
75
+ else if (format === 'json') {
76
+ console.log(JSON.stringify({ error: 'No commits found', commits: 0 }));
77
+ }
78
+ else {
79
+ console.log('# Vibe-Check Report\n\nNo commits found in the specified range.');
80
+ }
81
+ process.exit(0);
82
+ }
83
+ if (verbose) {
84
+ console.error(chalk_1.default.gray(`Found ${commits.length} commits`));
85
+ }
86
+ // Analyze commits (semantic metrics)
87
+ const result = (0, metrics_1.analyzeCommits)(commits);
88
+ // Build enhanced result
89
+ const resultV2 = {
90
+ ...result,
91
+ semanticMetrics: result.metrics,
92
+ };
93
+ // Enhanced analysis if requested
94
+ if (score || recommend || calibrate !== undefined) {
95
+ if (verbose) {
96
+ console.error(chalk_1.default.gray('Computing semantic-free metrics...'));
97
+ }
98
+ // Get file stats for semantic-free metrics
99
+ const fileStats = await (0, git_1.getFileStats)(repo, since, until);
100
+ // Calculate semantic-free metrics
101
+ const fileChurn = (0, file_churn_1.calculateFileChurn)(commits, fileStats.filesPerCommit);
102
+ const timeSpiral = (0, time_spiral_1.calculateTimeSpiral)(commits);
103
+ const velocityAnomaly = (0, velocity_anomaly_1.calculateVelocityAnomaly)(commits);
104
+ const codeStability = (0, code_stability_1.calculateCodeStability)(commits, fileStats.lineStats);
105
+ resultV2.semanticFreeMetrics = {
106
+ fileChurn,
107
+ timeSpiral,
108
+ velocityAnomaly,
109
+ codeStability,
110
+ };
111
+ // Calculate VibeScore
112
+ const vibeScore = (0, score_1.calculateVibeScore)({
113
+ fileChurn,
114
+ timeSpiral,
115
+ velocityAnomaly,
116
+ codeStability,
117
+ });
118
+ resultV2.vibeScore = vibeScore;
119
+ if (recommend) {
120
+ // Default questions (neutral for now)
121
+ const defaultQuestions = {
122
+ reversibility: 0,
123
+ blastRadius: 0,
124
+ verificationCost: 0,
125
+ domainComplexity: 0,
126
+ aiTrackRecord: 0,
127
+ };
128
+ const features = [
129
+ defaultQuestions.reversibility,
130
+ defaultQuestions.blastRadius,
131
+ defaultQuestions.verificationCost,
132
+ defaultQuestions.domainComplexity,
133
+ defaultQuestions.aiTrackRecord,
134
+ fileChurn.value / 100,
135
+ timeSpiral.value / 100,
136
+ velocityAnomaly.value / 100,
137
+ codeStability.value / 100,
138
+ ];
139
+ const prediction = (0, recommend_1.predictWithConfidence)(features);
140
+ resultV2.recommendation = {
141
+ level: prediction.level,
142
+ confidence: Math.round(prediction.confidence * 100) / 100,
143
+ probabilities: prediction.probs,
144
+ ci: prediction.ci,
145
+ questions: defaultQuestions,
146
+ };
147
+ }
148
+ if (calibrate !== undefined) {
149
+ const declaredLevel = parseInt(calibrate, 10);
150
+ if (declaredLevel >= 0 && declaredLevel <= 5) {
151
+ const outcome = (0, calibration_1.assessOutcome)(vibeScore.value, declaredLevel);
152
+ const sample = {
153
+ timestamp: new Date(),
154
+ vibeScore: vibeScore.value,
155
+ declaredLevel: declaredLevel,
156
+ outcome,
157
+ features: [
158
+ fileChurn.value / 100,
159
+ timeSpiral.value / 100,
160
+ velocityAnomaly.value / 100,
161
+ codeStability.value / 100,
162
+ ],
163
+ modelVersion: '2.0.0',
164
+ };
165
+ (0, calibration_1.addSample)(repo, sample);
166
+ if (verbose) {
167
+ console.error(chalk_1.default.gray(`Calibration sample recorded: Level ${declaredLevel} → Score ${vibeScore.value} (${outcome})`));
168
+ }
169
+ }
170
+ else {
171
+ console.error(chalk_1.default.yellow(`Warning: Invalid calibrate level ${calibrate}, must be 0-5`));
172
+ }
173
+ }
174
+ }
175
+ // Write to file if requested (always JSON format)
176
+ if (output) {
177
+ const jsonOutput = (0, json_1.formatJson)(resultV2);
178
+ (0, fs_1.writeFileSync)(output, jsonOutput);
179
+ if (verbose) {
180
+ console.error(chalk_1.default.gray(`Results written to: ${output}`));
181
+ }
182
+ }
183
+ // Output result to console
184
+ const formattedOutput = (0, output_1.formatOutput)(resultV2, format, { simple });
185
+ console.log(formattedOutput);
186
+ // Record session and show gamification (only for terminal format with score)
187
+ if (format === 'terminal' && resultV2.vibeScore) {
188
+ const spiralCount = result.fixChains.filter(fc => fc.isSpiral).length;
189
+ const vibeScorePercent = Math.round(resultV2.vibeScore.value * 100);
190
+ const gamificationResult = (0, profile_1.recordSession)(vibeScorePercent, result.overall, commits.length, spiralCount, result.period.from, result.period.to);
191
+ // Show gamification summary
192
+ console.log();
193
+ console.log(chalk_1.default.cyan('─'.repeat(64)));
194
+ const levelInfo = types_1.LEVELS.find(l => l.level === gamificationResult.profile.xp.level);
195
+ const { streak, xp } = gamificationResult.profile;
196
+ // Handle duplicate analysis (no XP awarded)
197
+ if (gamificationResult.isDuplicate) {
198
+ const streakFire = '🔥'.repeat(Math.min(streak.current, 5));
199
+ const streakText = streak.current > 0 ? `${streakFire} ${streak.current}-day streak` : '';
200
+ console.log(` ${streakText}`);
201
+ console.log(` ${levelInfo.icon} Level ${xp.level} ${xp.levelName} ${chalk_1.default.gray(`(${xp.currentLevelXP}/${xp.nextLevelXP} XP)`)}`);
202
+ console.log(chalk_1.default.gray(` ℹ Already analyzed this period (no XP awarded)`));
203
+ console.log(chalk_1.default.gray(` Make new commits to earn XP!`));
204
+ console.log(chalk_1.default.cyan('─'.repeat(64)));
205
+ console.log();
206
+ return;
207
+ }
208
+ // Streak line
209
+ const streakFire = '🔥'.repeat(Math.min(streak.current, 5));
210
+ const streakText = streak.current > 0
211
+ ? `${streakFire} ${streak.current}-day streak${gamificationResult.streakExtended ? chalk_1.default.yellow(' (+1!)') : ''}`
212
+ : chalk_1.default.gray('Start a streak by running vibe-check daily!');
213
+ console.log(` ${streakText}`);
214
+ // XP line
215
+ const xpGained = gamificationResult.xpEarned;
216
+ console.log(` ${levelInfo.icon} Level ${xp.level} ${xp.levelName} ${chalk_1.default.gray(`(${xp.currentLevelXP}/${xp.nextLevelXP} XP)`)} ${chalk_1.default.green(`+${xpGained} XP`)}`);
217
+ // Level up celebration
218
+ if (gamificationResult.leveledUp) {
219
+ console.log();
220
+ console.log(chalk_1.default.bold.magenta(` 🎉 LEVEL UP! You are now ${gamificationResult.newLevel}!`));
221
+ }
222
+ // Personal best
223
+ if (gamificationResult.isPersonalBest) {
224
+ console.log(chalk_1.default.bold.yellow(` 🏆 NEW PERSONAL BEST: ${vibeScorePercent}%`));
225
+ }
226
+ // Achievement unlocks
227
+ if (gamificationResult.achievementsUnlocked.length > 0) {
228
+ console.log();
229
+ for (const ach of gamificationResult.achievementsUnlocked) {
230
+ console.log(chalk_1.default.bold.green(` 🏆 ACHIEVEMENT UNLOCKED: ${ach.icon} ${ach.name}`));
231
+ console.log(chalk_1.default.gray(` ${ach.description}`));
232
+ }
233
+ }
234
+ console.log(chalk_1.default.cyan('─'.repeat(64)));
235
+ console.log(chalk_1.default.gray(` Run ${chalk_1.default.white('vibe-check profile')} to see your full stats`));
236
+ console.log();
237
+ }
238
+ // Exit with appropriate code based on overall rating
239
+ if (result.overall === 'LOW') {
240
+ process.exit(1);
241
+ }
242
+ }
243
+ catch (error) {
244
+ if (error instanceof Error) {
245
+ console.error(chalk_1.default.red(`Error: ${error.message}`));
246
+ if (options.verbose) {
247
+ console.error(chalk_1.default.gray(error.stack));
248
+ }
249
+ }
250
+ else {
251
+ console.error(chalk_1.default.red('An unexpected error occurred'));
252
+ }
253
+ process.exit(1);
254
+ }
255
+ }
256
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { createAnalyzeCommand, runAnalyze, AnalyzeOptions } from './analyze';
2
+ export { createLevelCommand } from './level';
3
+ export { createProfileCommand } from './profile';
4
+ export { createInitHookCommand } from './init-hook';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInitHookCommand = exports.createProfileCommand = exports.createLevelCommand = exports.runAnalyze = exports.createAnalyzeCommand = void 0;
4
+ var analyze_1 = require("./analyze");
5
+ Object.defineProperty(exports, "createAnalyzeCommand", { enumerable: true, get: function () { return analyze_1.createAnalyzeCommand; } });
6
+ Object.defineProperty(exports, "runAnalyze", { enumerable: true, get: function () { return analyze_1.runAnalyze; } });
7
+ var level_1 = require("./level");
8
+ Object.defineProperty(exports, "createLevelCommand", { enumerable: true, get: function () { return level_1.createLevelCommand; } });
9
+ var profile_1 = require("./profile");
10
+ Object.defineProperty(exports, "createProfileCommand", { enumerable: true, get: function () { return profile_1.createProfileCommand; } });
11
+ var init_hook_1 = require("./init-hook");
12
+ Object.defineProperty(exports, "createInitHookCommand", { enumerable: true, get: function () { return init_hook_1.createInitHookCommand; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA,qCAA6E;AAApE,+GAAA,oBAAoB,OAAA;AAAE,qGAAA,UAAU,OAAA;AACzC,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,qCAAiD;AAAxC,+GAAA,oBAAoB,OAAA;AAC7B,yCAAoD;AAA3C,kHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createInitHookCommand(): Command;
3
+ //# sourceMappingURL=init-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-hook.d.ts","sourceRoot":"","sources":["../../src/commands/init-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwGpC,wBAAgB,qBAAqB,IAAI,OAAO,CAU/C"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createInitHookCommand = createInitHookCommand;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const PRE_PUSH_HOOK = `#!/bin/bash
12
+ # vibe-check pre-push hook
13
+ # Runs vibe-check on commits being pushed and displays metrics
14
+
15
+ # Colors
16
+ RED='\\033[0;31m'
17
+ YELLOW='\\033[1;33m'
18
+ GREEN='\\033[0;32m'
19
+ CYAN='\\033[0;36m'
20
+ NC='\\033[0m' # No Color
21
+
22
+ # Configuration (set these env vars to customize)
23
+ VIBE_CHECK_BLOCK_LOW=\${VIBE_CHECK_BLOCK_LOW:-false} # Set to "true" to block push on LOW rating
24
+ VIBE_CHECK_SIMPLE=\${VIBE_CHECK_SIMPLE:-true} # Use simple output by default
25
+ VIBE_CHECK_SCORE=\${VIBE_CHECK_SCORE:-true} # Include vibe score
26
+
27
+ echo -e "\${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
28
+ echo -e "\${CYAN} 🎯 Running vibe-check before push...\${NC}"
29
+ echo -e "\${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
30
+ echo
31
+
32
+ # Read stdin for push info
33
+ while read local_ref local_sha remote_ref remote_sha; do
34
+ # Skip if deleting branch
35
+ if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then
36
+ continue
37
+ fi
38
+
39
+ # Determine the range of commits
40
+ if [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
41
+ # New branch - check all commits
42
+ RANGE="$local_sha"
43
+ SINCE_FLAG=""
44
+ else
45
+ # Existing branch - check commits since last push
46
+ RANGE="$remote_sha..$local_sha"
47
+ # Get the date of the remote SHA
48
+ SINCE_DATE=$(git log -1 --format=%ci "$remote_sha" 2>/dev/null)
49
+ if [ -n "$SINCE_DATE" ]; then
50
+ SINCE_FLAG="--since \\"$SINCE_DATE\\""
51
+ else
52
+ SINCE_FLAG=""
53
+ fi
54
+ fi
55
+
56
+ # Count commits being pushed
57
+ COMMIT_COUNT=$(git rev-list --count "$RANGE" 2>/dev/null || echo "0")
58
+
59
+ if [ "$COMMIT_COUNT" = "0" ]; then
60
+ echo -e "\${YELLOW}No new commits to analyze\${NC}"
61
+ continue
62
+ fi
63
+
64
+ echo -e "Analyzing \${GREEN}$COMMIT_COUNT\${NC} commit(s) on \${CYAN}$local_ref\${NC}"
65
+ echo
66
+
67
+ # Build vibe-check command
68
+ VIBE_CMD="npx @boshu2/vibe-check"
69
+
70
+ if [ "$VIBE_CHECK_SIMPLE" = "true" ]; then
71
+ VIBE_CMD="$VIBE_CMD --simple"
72
+ fi
73
+
74
+ if [ "$VIBE_CHECK_SCORE" = "true" ]; then
75
+ VIBE_CMD="$VIBE_CMD --score"
76
+ fi
77
+
78
+ # Run vibe-check and capture output
79
+ if [ -n "$SINCE_FLAG" ]; then
80
+ OUTPUT=$(eval "$VIBE_CMD $SINCE_FLAG" 2>&1)
81
+ else
82
+ OUTPUT=$(eval "$VIBE_CMD --since '1 week ago'" 2>&1)
83
+ fi
84
+
85
+ EXIT_CODE=$?
86
+
87
+ # Display output
88
+ echo "$OUTPUT"
89
+ echo
90
+
91
+ # Check if we should block on LOW rating
92
+ if [ "$VIBE_CHECK_BLOCK_LOW" = "true" ] && [ $EXIT_CODE -eq 1 ]; then
93
+ echo -e "\${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
94
+ echo -e "\${RED} ⛔ Push blocked: LOW vibe rating\${NC}"
95
+ echo -e "\${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
96
+ echo
97
+ echo -e "To push anyway, set: \${YELLOW}VIBE_CHECK_BLOCK_LOW=false git push\${NC}"
98
+ exit 1
99
+ fi
100
+ done
101
+
102
+ echo -e "\${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
103
+ echo -e "\${GREEN} ✓ Vibe check complete, proceeding with push\${NC}"
104
+ echo -e "\${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}"
105
+ echo
106
+
107
+ exit 0
108
+ `;
109
+ function createInitHookCommand() {
110
+ const cmd = new commander_1.Command('init-hook')
111
+ .description('Install vibe-check git hook in current repository')
112
+ .option('-f, --force', 'Overwrite existing hook', false)
113
+ .option('--block-low', 'Configure hook to block pushes on LOW rating', false)
114
+ .action(async (options) => {
115
+ await runInitHook(options);
116
+ });
117
+ return cmd;
118
+ }
119
+ async function runInitHook(options) {
120
+ const cwd = process.cwd();
121
+ const gitDir = (0, path_1.join)(cwd, '.git');
122
+ const hooksDir = (0, path_1.join)(gitDir, 'hooks');
123
+ const hookPath = (0, path_1.join)(hooksDir, 'pre-push');
124
+ // Check if we're in a git repo
125
+ if (!(0, fs_1.existsSync)(gitDir)) {
126
+ console.error(chalk_1.default.red('Error: Not a git repository'));
127
+ console.error(chalk_1.default.gray('Run this command from the root of a git repository'));
128
+ process.exit(1);
129
+ }
130
+ // Check if hook already exists
131
+ if ((0, fs_1.existsSync)(hookPath) && !options.force) {
132
+ console.error(chalk_1.default.yellow('pre-push hook already exists'));
133
+ console.error(chalk_1.default.gray('Use --force to overwrite'));
134
+ process.exit(1);
135
+ }
136
+ // Create hooks directory if needed
137
+ if (!(0, fs_1.existsSync)(hooksDir)) {
138
+ (0, fs_1.mkdirSync)(hooksDir, { recursive: true });
139
+ }
140
+ // Modify hook content if blocking is enabled
141
+ let hookContent = PRE_PUSH_HOOK;
142
+ if (options.blockLow) {
143
+ hookContent = hookContent.replace('VIBE_CHECK_BLOCK_LOW=${VIBE_CHECK_BLOCK_LOW:-false}', 'VIBE_CHECK_BLOCK_LOW=${VIBE_CHECK_BLOCK_LOW:-true}');
144
+ }
145
+ // Write the hook
146
+ (0, fs_1.writeFileSync)(hookPath, hookContent);
147
+ (0, fs_1.chmodSync)(hookPath, 0o755);
148
+ console.log();
149
+ console.log(chalk_1.default.green('✓ vibe-check pre-push hook installed'));
150
+ console.log();
151
+ console.log(chalk_1.default.gray('Location:'), hookPath);
152
+ console.log();
153
+ console.log(chalk_1.default.bold('Configuration:'));
154
+ console.log(chalk_1.default.gray(' VIBE_CHECK_BLOCK_LOW=true Block push on LOW rating'));
155
+ console.log(chalk_1.default.gray(' VIBE_CHECK_SIMPLE=false Show full output'));
156
+ console.log(chalk_1.default.gray(' VIBE_CHECK_SCORE=false Hide vibe score'));
157
+ console.log();
158
+ console.log(chalk_1.default.cyan('The hook will run automatically on every git push'));
159
+ console.log();
160
+ }
161
+ //# sourceMappingURL=init-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-hook.js","sourceRoot":"","sources":["../../src/commands/init-hook.ts"],"names":[],"mappings":";;;;;AAwGA,sDAUC;AAlHD,yCAAoC;AACpC,kDAA0B;AAC1B,2BAAqE;AACrE,+BAA4B;AAE5B,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGrB,CAAC;AAEF,SAAgB,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;SACjC,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,8CAA8C,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAA8C;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE5C,+BAA+B;IAC/B,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,IAAA,cAAS,EAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,6CAA6C;IAC7C,IAAI,WAAW,GAAG,aAAa,CAAC;IAChC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,qDAAqD,EACrD,oDAAoD,CACrD,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAA,kBAAa,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrC,IAAA,cAAS,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createLevelCommand(): Command;
3
+ //# sourceMappingURL=level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../src/commands/level.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,kBAAkB,IAAI,OAAO,CAgB5C"}