@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,277 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createLevelCommand = createLevelCommand;
40
+ const commander_1 = require("commander");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const questions_1 = require("../recommend/questions");
43
+ const recommend_1 = require("../recommend");
44
+ const calibration_1 = require("../calibration");
45
+ const git_1 = require("../git");
46
+ const file_churn_1 = require("../metrics/file-churn");
47
+ const time_spiral_1 = require("../metrics/time-spiral");
48
+ const velocity_anomaly_1 = require("../metrics/velocity-anomaly");
49
+ const code_stability_1 = require("../metrics/code-stability");
50
+ function createLevelCommand() {
51
+ const cmd = new commander_1.Command('level')
52
+ .description('Classify vibe level for upcoming work (interactive)')
53
+ .option('--quick', 'Non-interactive mode with neutral defaults', false)
54
+ .option('--json', 'Output as JSON', false)
55
+ .option('-r, --repo <path>', 'Repository path for metrics', process.cwd())
56
+ .option('--since <date>', 'Git history start for metrics (default: 30 days ago)', '30 days ago')
57
+ .option('--answers <responses>', 'Pre-filled answers as JSON (e.g., \'{"reversibility":1,"blastRadius":0}\')')
58
+ .action(async (options) => {
59
+ await runLevel(options);
60
+ });
61
+ return cmd;
62
+ }
63
+ async function runLevel(options) {
64
+ let responses;
65
+ if (options.quick) {
66
+ // Non-interactive: use defaults or provided answers
67
+ responses = {
68
+ reversibility: 0,
69
+ blastRadius: 0,
70
+ verificationCost: 0,
71
+ domainComplexity: 0,
72
+ aiTrackRecord: 0,
73
+ };
74
+ if (options.answers) {
75
+ try {
76
+ const provided = JSON.parse(options.answers);
77
+ responses = { ...responses, ...provided };
78
+ }
79
+ catch {
80
+ console.error(chalk_1.default.red('Invalid --answers JSON'));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ }
85
+ else {
86
+ // Interactive mode
87
+ if (!process.stdin.isTTY) {
88
+ console.error(chalk_1.default.yellow('Non-interactive terminal detected. Use --quick for non-interactive mode.'));
89
+ process.exit(1);
90
+ }
91
+ responses = await askQuestions();
92
+ }
93
+ const result = await classifyLevel(responses, options.repo, options.since);
94
+ if (options.json) {
95
+ console.log(JSON.stringify(result, null, 2));
96
+ }
97
+ else {
98
+ displayResult(result);
99
+ }
100
+ }
101
+ async function askQuestions() {
102
+ // Dynamic import for enquirer
103
+ const Enquirer = (await Promise.resolve().then(() => __importStar(require('enquirer')))).default;
104
+ const responses = {};
105
+ console.log('');
106
+ console.log(chalk_1.default.bold.cyan('═'.repeat(60)));
107
+ console.log(chalk_1.default.bold.cyan(' VIBE LEVEL CLASSIFICATION'));
108
+ console.log(chalk_1.default.bold.cyan('═'.repeat(60)));
109
+ console.log('');
110
+ console.log(chalk_1.default.gray('Answer 5 questions to determine the appropriate vibe level.'));
111
+ console.log(chalk_1.default.gray('Use ↑/↓ arrows to select, Enter to confirm.'));
112
+ console.log('');
113
+ for (const question of questions_1.VIBE_QUESTIONS) {
114
+ const answer = await Enquirer.prompt({
115
+ type: 'select',
116
+ name: 'answer',
117
+ message: question.text,
118
+ choices: question.options.map((opt) => ({
119
+ name: opt.label,
120
+ message: `${opt.label} ${chalk_1.default.gray('- ' + opt.description)}`,
121
+ value: String(opt.value),
122
+ })),
123
+ });
124
+ const selected = question.options.find((o) => o.label === answer.answer);
125
+ responses[question.id] = (selected?.value ?? 0);
126
+ console.log('');
127
+ }
128
+ return responses;
129
+ }
130
+ async function classifyLevel(responses, repoPath, since) {
131
+ // Try to get real metrics from git history
132
+ let metricsFeatures = [0.7, 0.7, 0.7, 0.7]; // Defaults if no git history
133
+ let source = 'fallback';
134
+ try {
135
+ if (await (0, git_1.isGitRepo)(repoPath)) {
136
+ const commits = await (0, git_1.getCommits)(repoPath, since);
137
+ if (commits.length >= 3) {
138
+ const fileStats = await (0, git_1.getFileStats)(repoPath, since);
139
+ const fileChurn = (0, file_churn_1.calculateFileChurn)(commits, fileStats.filesPerCommit);
140
+ const timeSpiral = (0, time_spiral_1.calculateTimeSpiral)(commits);
141
+ const velocityAnomaly = (0, velocity_anomaly_1.calculateVelocityAnomaly)(commits);
142
+ const codeStability = (0, code_stability_1.calculateCodeStability)(commits, fileStats.lineStats);
143
+ metricsFeatures = [
144
+ fileChurn.value / 100,
145
+ timeSpiral.value / 100,
146
+ velocityAnomaly.value / 100,
147
+ codeStability.value / 100,
148
+ ];
149
+ source = 'ml';
150
+ }
151
+ }
152
+ }
153
+ catch {
154
+ // Fall back to defaults if git fails
155
+ }
156
+ // Load calibration state (contains learned weights)
157
+ const calibration = (0, calibration_1.loadCalibration)(repoPath);
158
+ // Build full feature vector: 5 questions + 4 metrics
159
+ const features = [
160
+ responses.reversibility,
161
+ responses.blastRadius,
162
+ responses.verificationCost,
163
+ responses.domainComplexity,
164
+ responses.aiTrackRecord,
165
+ ...metricsFeatures,
166
+ ];
167
+ // Use ML model with learned weights
168
+ const model = {
169
+ weights: calibration.weights,
170
+ thresholds: calibration.thresholds,
171
+ };
172
+ const prediction = (0, recommend_1.predictWithConfidence)(features, model);
173
+ // Use ML prediction (NOT additive formula)
174
+ const level = prediction.level;
175
+ const confidence = prediction.confidence;
176
+ // Build reasoning
177
+ const reasoning = [];
178
+ if (source === 'ml') {
179
+ reasoning.push(`Based on ${since} git history + your answers`);
180
+ if (metricsFeatures[0] < 0.7)
181
+ reasoning.push('File churn detected - code needed rework');
182
+ if (metricsFeatures[1] < 0.7)
183
+ reasoning.push('Time spirals detected - rapid fix commits');
184
+ }
185
+ else {
186
+ reasoning.push('No git history available - using question answers only');
187
+ }
188
+ if (responses.reversibility <= -1)
189
+ reasoning.push('Low reversibility requires careful review');
190
+ if (responses.blastRadius <= -1)
191
+ reasoning.push('Wide blast radius increases risk');
192
+ if (responses.verificationCost <= -1)
193
+ reasoning.push('High verification cost needs extra attention');
194
+ if (responses.domainComplexity <= -1)
195
+ reasoning.push('Domain complexity may cause AI errors');
196
+ if (responses.aiTrackRecord <= -1)
197
+ reasoning.push('AI track record suggests caution');
198
+ if (reasoning.length === 0) {
199
+ reasoning.push('Standard risk profile - proceed with appropriate level');
200
+ }
201
+ return {
202
+ level,
203
+ confidence,
204
+ responses,
205
+ reasoning,
206
+ source,
207
+ ece: calibration.ece,
208
+ sampleCount: calibration.samples.length,
209
+ };
210
+ }
211
+ function displayResult(result) {
212
+ const levelDescriptions = {
213
+ 5: { name: 'Full Automation', trust: '95%', verify: 'Final review only' },
214
+ 4: { name: 'High Trust', trust: '80%', verify: 'Spot check' },
215
+ 3: { name: 'Balanced', trust: '60%', verify: 'Review key outputs' },
216
+ 2: { name: 'AI-Augmented', trust: '40%', verify: 'Review every change' },
217
+ 1: { name: 'Human-Led', trust: '20%', verify: 'Review every line' },
218
+ 0: { name: 'Manual Only', trust: '0%', verify: 'No AI assistance' },
219
+ };
220
+ const desc = levelDescriptions[result.level];
221
+ console.log('');
222
+ console.log(chalk_1.default.bold.cyan('═'.repeat(60)));
223
+ console.log('');
224
+ // Level display with color coding
225
+ const levelColor = result.level >= 4 ? chalk_1.default.green : result.level >= 2 ? chalk_1.default.yellow : chalk_1.default.red;
226
+ console.log(` ${chalk_1.default.bold('RECOMMENDED LEVEL:')} ${levelColor.bold(`${result.level} - ${desc.name}`)}`);
227
+ console.log('');
228
+ console.log(` ${chalk_1.default.gray('Trust:')} ${desc.trust}`);
229
+ console.log(` ${chalk_1.default.gray('Verify:')} ${desc.verify}`);
230
+ // Show confidence appropriately based on value
231
+ if (result.confidence >= 0.6) {
232
+ console.log(` ${chalk_1.default.gray('Confidence:')} ${chalk_1.default.green((result.confidence * 100).toFixed(0) + '%')}`);
233
+ }
234
+ else if (result.confidence >= 0.4) {
235
+ console.log(` ${chalk_1.default.gray('Confidence:')} ${chalk_1.default.yellow((result.confidence * 100).toFixed(0) + '% (building...)')}`);
236
+ }
237
+ else {
238
+ // Low confidence - explain why and what to do
239
+ const sampleCount = result.sampleCount || 0;
240
+ const needed = Math.max(0, 20 - sampleCount);
241
+ console.log(` ${chalk_1.default.gray('Confidence:')} ${chalk_1.default.gray('Low (needs more data)')}`);
242
+ if (needed > 0) {
243
+ console.log(chalk_1.default.gray(` Run ${needed} more sessions to improve accuracy`));
244
+ }
245
+ }
246
+ console.log('');
247
+ // Model info
248
+ if (result.source === 'ml') {
249
+ const sampleCount = result.sampleCount || 0;
250
+ const sampleWord = sampleCount === 1 ? 'sample' : 'samples';
251
+ if (sampleCount < 20) {
252
+ console.log(chalk_1.default.yellow(` ⚠ Limited calibration data (${sampleCount} ${sampleWord})`));
253
+ console.log(chalk_1.default.gray(` Recommendation requires 20+ samples for reliability`));
254
+ }
255
+ else {
256
+ console.log(chalk_1.default.green(` ✓ Using ML model with ${sampleCount} calibration ${sampleWord}`));
257
+ }
258
+ if (result.ece !== undefined && result.ece > 0) {
259
+ console.log(chalk_1.default.gray(` ECE: ${(result.ece * 100).toFixed(1)}%`));
260
+ }
261
+ }
262
+ else {
263
+ console.log(chalk_1.default.yellow(` ⚠ Fallback mode (no git history available)`));
264
+ }
265
+ console.log('');
266
+ console.log(chalk_1.default.bold.yellow(' REASONING:'));
267
+ for (const reason of result.reasoning) {
268
+ console.log(chalk_1.default.yellow(` • ${reason}`));
269
+ }
270
+ console.log('');
271
+ console.log(chalk_1.default.bold.cyan('═'.repeat(60)));
272
+ console.log('');
273
+ console.log(chalk_1.default.gray(` After your work, run:`));
274
+ console.log(chalk_1.default.white(` vibe-check --score --calibrate ${result.level}`));
275
+ console.log('');
276
+ }
277
+ //# sourceMappingURL=level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.js","sourceRoot":"","sources":["../../src/commands/level.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProfileCommand(): Command;
3
+ export declare function runProfile2(options: any): Promise<void>;
4
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,IAAI,OAAO,CAW9C;AAqJD,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
@@ -0,0 +1,143 @@
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.createProfileCommand = createProfileCommand;
7
+ exports.runProfile2 = runProfile2;
8
+ const commander_1 = require("commander");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const profile_1 = require("../gamification/profile");
11
+ const xp_1 = require("../gamification/xp");
12
+ const types_1 = require("../gamification/types");
13
+ const achievements_1 = require("../gamification/achievements");
14
+ function createProfileCommand() {
15
+ const cmd = new commander_1.Command('profile')
16
+ .description('View your vibe-check profile, stats, and achievements')
17
+ .option('--achievements', 'Show all achievements', false)
18
+ .option('--stats', 'Show detailed stats', false)
19
+ .option('--json', 'Output as JSON', false)
20
+ .action(async (options) => {
21
+ await runProfile(options);
22
+ });
23
+ return cmd;
24
+ }
25
+ async function runProfile(options) {
26
+ const profile = (0, profile_1.loadProfile)();
27
+ if (options.json) {
28
+ console.log(JSON.stringify(profile, null, 2));
29
+ return;
30
+ }
31
+ const { xp, streak, achievements, stats } = profile;
32
+ const levelInfo = types_1.LEVELS.find(l => l.level === xp.level);
33
+ const achievementCounts = (0, profile_1.getAchievementCounts)(profile);
34
+ const recentSessions = (0, profile_1.getRecentSessions)(profile, 30);
35
+ // Header
36
+ console.log();
37
+ console.log(chalk_1.default.cyan('╭─────────────────────────────────────────────╮'));
38
+ console.log(chalk_1.default.cyan('│') + chalk_1.default.bold.white(' Your Vibe Profile ') + chalk_1.default.cyan('│'));
39
+ console.log(chalk_1.default.cyan('├─────────────────────────────────────────────┤'));
40
+ // Level
41
+ const levelBar = createProgressBar((0, xp_1.getLevelProgress)(xp), 20);
42
+ console.log(chalk_1.default.cyan('│') + ` ${levelInfo.icon} ${chalk_1.default.bold(`Level ${xp.level} ${xp.levelName}`)}`.padEnd(52) + chalk_1.default.cyan('│'));
43
+ console.log(chalk_1.default.cyan('│') + ` ${levelBar} ${chalk_1.default.gray(`${xp.currentLevelXP}/${xp.nextLevelXP} XP`)}`.padEnd(60) + chalk_1.default.cyan('│'));
44
+ console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
45
+ // Streak
46
+ const streakDisplay = streak.current > 0
47
+ ? `🔥 Current Streak: ${chalk_1.default.bold(streak.current.toString())} days${streak.current === streak.longest ? chalk_1.default.yellow(' (Best!)') : ''}`
48
+ : '🔥 No active streak';
49
+ console.log(chalk_1.default.cyan('│') + ` ${streakDisplay}`.padEnd(52) + chalk_1.default.cyan('│'));
50
+ const weeklyBar = createProgressBar((streak.weeklyProgress / streak.weeklyGoal) * 100, 5);
51
+ console.log(chalk_1.default.cyan('│') + ` 📅 Weekly Goal: ${streak.weeklyProgress}/${streak.weeklyGoal} ${weeklyBar}`.padEnd(52) + chalk_1.default.cyan('│'));
52
+ console.log(chalk_1.default.cyan('│') + ` 🏆 Achievements: ${achievementCounts.unlocked}/${achievementCounts.total} unlocked`.padEnd(52) + chalk_1.default.cyan('│'));
53
+ console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
54
+ // 30-Day Stats
55
+ console.log(chalk_1.default.cyan('│') + chalk_1.default.bold(' 📊 30-Day Stats').padEnd(52) + chalk_1.default.cyan('│'));
56
+ const avgScore = recentSessions.length > 0
57
+ ? Math.round(recentSessions.reduce((sum, s) => sum + s.vibeScore, 0) / recentSessions.length)
58
+ : 0;
59
+ const totalCommits = recentSessions.reduce((sum, s) => sum + s.commits, 0);
60
+ console.log(chalk_1.default.cyan('│') + ` ├─ Avg Vibe Score: ${chalk_1.default.bold(avgScore.toString())}%`.padEnd(52) + chalk_1.default.cyan('│'));
61
+ console.log(chalk_1.default.cyan('│') + ` ├─ Sessions: ${chalk_1.default.bold(recentSessions.length.toString())}`.padEnd(52) + chalk_1.default.cyan('│'));
62
+ console.log(chalk_1.default.cyan('│') + ` ├─ Commits Analyzed: ${chalk_1.default.bold(totalCommits.toString())}`.padEnd(52) + chalk_1.default.cyan('│'));
63
+ const spiralsAvoided = recentSessions.filter(s => s.spirals === 0 && s.commits >= 10).length;
64
+ console.log(chalk_1.default.cyan('│') + ` └─ Zero-Spiral Sessions: ${chalk_1.default.bold(spiralsAvoided.toString())}`.padEnd(52) + chalk_1.default.cyan('│'));
65
+ console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
66
+ // Recent achievements
67
+ const recentAchievements = achievements.slice(-3).reverse();
68
+ if (recentAchievements.length > 0) {
69
+ console.log(chalk_1.default.cyan('│') + chalk_1.default.bold(' Recent Achievements:').padEnd(52) + chalk_1.default.cyan('│'));
70
+ for (const ach of recentAchievements) {
71
+ const dateStr = ach.unlockedAt
72
+ ? new Date(ach.unlockedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
73
+ : '';
74
+ console.log(chalk_1.default.cyan('│') + ` ${ach.icon} ${ach.name} ${chalk_1.default.gray(`(${dateStr})`)}`.padEnd(52) + chalk_1.default.cyan('│'));
75
+ }
76
+ }
77
+ console.log(chalk_1.default.cyan('╰─────────────────────────────────────────────╯'));
78
+ console.log();
79
+ // Show all achievements if requested
80
+ if (options.achievements) {
81
+ showAllAchievements(achievements);
82
+ }
83
+ // Show detailed stats if requested
84
+ if (options.stats) {
85
+ showDetailedStats(profile);
86
+ }
87
+ }
88
+ function createProgressBar(percent, length) {
89
+ const filled = Math.round((percent / 100) * length);
90
+ const empty = length - filled;
91
+ return chalk_1.default.green('█'.repeat(filled)) + chalk_1.default.gray('░'.repeat(empty));
92
+ }
93
+ function showAllAchievements(unlockedAchievements) {
94
+ const allAchievements = (0, achievements_1.getAllAchievements)(unlockedAchievements);
95
+ const unlockedIds = new Set(unlockedAchievements.map(a => a.id));
96
+ console.log(chalk_1.default.bold('\n🏆 All Achievements\n'));
97
+ const categories = ['streak', 'score', 'sessions', 'special'];
98
+ const categoryNames = {
99
+ streak: '🔥 Streak',
100
+ score: '📈 Score',
101
+ sessions: '📊 Sessions',
102
+ special: '⭐ Special',
103
+ };
104
+ for (const category of categories) {
105
+ const categoryAchievements = allAchievements.filter(a => a.category === category);
106
+ if (categoryAchievements.length === 0)
107
+ continue;
108
+ console.log(chalk_1.default.bold(categoryNames[category]));
109
+ for (const ach of categoryAchievements) {
110
+ const isUnlocked = unlockedIds.has(ach.id);
111
+ const icon = isUnlocked ? ach.icon : (ach.hidden ? '❓' : '🔒');
112
+ const name = isUnlocked || !ach.hidden ? ach.name : '???';
113
+ const desc = isUnlocked || !ach.hidden ? ach.description : 'Keep playing to unlock!';
114
+ const status = isUnlocked
115
+ ? chalk_1.default.green('✓')
116
+ : chalk_1.default.gray('○');
117
+ console.log(` ${status} ${icon} ${isUnlocked ? chalk_1.default.white(name) : chalk_1.default.gray(name)}`);
118
+ console.log(` ${chalk_1.default.gray(desc)}`);
119
+ }
120
+ console.log();
121
+ }
122
+ }
123
+ function showDetailedStats(profile) {
124
+ const { stats, xp, streak } = profile;
125
+ console.log(chalk_1.default.bold('\n📊 Detailed Statistics\n'));
126
+ console.log(chalk_1.default.bold('Lifetime'));
127
+ console.log(` Total Sessions: ${chalk_1.default.bold(stats.totalSessions)}`);
128
+ console.log(` Commits Analyzed: ${chalk_1.default.bold(stats.totalCommitsAnalyzed.toLocaleString())}`);
129
+ console.log(` Average Score: ${chalk_1.default.bold(stats.avgVibeScore)}%`);
130
+ console.log(` Best Score: ${chalk_1.default.bold(stats.bestVibeScore)}%`);
131
+ console.log(` Total Spirals: ${chalk_1.default.bold(stats.totalSpiralsDetected)}`);
132
+ console.log(` Zero-Spiral Sessions: ${chalk_1.default.bold(stats.spiralsAvoided)}`);
133
+ console.log();
134
+ console.log(chalk_1.default.bold('Progress'));
135
+ console.log(` Total XP: ${chalk_1.default.bold(xp.total)}`);
136
+ console.log(` Current Level: ${chalk_1.default.bold(`${xp.level} (${xp.levelName})`)}`);
137
+ console.log(` Longest Streak: ${chalk_1.default.bold(streak.longest)} days`);
138
+ console.log();
139
+ }
140
+ async function runProfile2(options) {
141
+ return runProfile(options);
142
+ }
143
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":";;;;;AAYA,oDAWC;AAqJD,kCAEC;AA9KD,yCAAoC;AACpC,kDAA0B;AAC1B,qDAIiC;AAEjC,2CAAqF;AACrF,iDAA+C;AAC/C,+DAAkE;AAElE,SAAgB,oBAAoB;IAClC,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;SAC/B,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,gBAAgB,EAAE,uBAAuB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAIzB;IACC,MAAM,OAAO,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,SAAS,GAAG,cAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAE,CAAC;IAC1D,MAAM,iBAAiB,GAAG,IAAA,8BAAoB,EAAC,OAAO,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAA,2BAAiB,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAEtD,SAAS;IACT,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAE3E,QAAQ;IACR,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAA,qBAAgB,EAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,IAAI,IAAI,eAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrI,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxI,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/D,SAAS;IACT,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC;QACtC,CAAC,CAAC,sBAAsB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;QACxI,CAAC,CAAC,qBAAqB,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,qBAAqB,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3I,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,sBAAsB,iBAAiB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/D,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5F,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;QAC7F,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,wBAAwB,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,kBAAkB,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7H,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,0BAA0B,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5H,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,8BAA8B,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClI,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/D,sBAAsB;IACtB,MAAM,kBAAkB,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjG,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU;gBAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBAC1F,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,eAAK,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,qCAAqC;IACrC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAAc;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAAC,oBAAuF;IAClH,MAAM,eAAe,GAAG,IAAA,iCAAkB,EAAC,oBAA2B,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,aAAa,GAA2B;QAC5C,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,WAAW;KACrB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,oBAAoB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAClF,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEhD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEjD,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1D,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC;YAErF,MAAM,MAAM,GAAG,UAAU;gBACvB,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEpB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,SAAS,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAY;IACrC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,iBAAiB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,2BAA2B,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAE3E,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,eAAe,eAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,OAAY;IAC5C,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Achievement, SessionRecord, StreakState, XPState } from './types';
2
+ export declare const ACHIEVEMENTS: Omit<Achievement, 'unlockedAt' | 'progress'>[];
3
+ /**
4
+ * Check which achievements are newly unlocked based on current state
5
+ */
6
+ export declare function checkAchievements(sessions: SessionRecord[], streak: StreakState, xp: XPState, currentSession: SessionRecord, unlockedIds: string[]): Achievement[];
7
+ /**
8
+ * Get achievement by ID
9
+ */
10
+ export declare function getAchievement(id: string): Achievement | undefined;
11
+ /**
12
+ * Get all achievements with unlock status
13
+ */
14
+ export declare function getAllAchievements(unlockedAchievements: Achievement[]): Achievement[];
15
+ //# sourceMappingURL=achievements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.d.ts","sourceRoot":"","sources":["../../src/gamification/achievements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAG3E,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,UAAU,CAAC,EAoKtE,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,OAAO,EACX,cAAc,EAAE,aAAa,EAC7B,WAAW,EAAE,MAAM,EAAE,GACpB,WAAW,EAAE,CAyBf;AAyFD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,oBAAoB,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAOrF"}