@boshu2/vibe-check 1.3.2 → 1.5.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.
- package/.vibe-check/sessions.json +21 -1
- package/PLAN-ultimate-game.md +1362 -0
- package/claude-progress.json +21 -3
- package/claude-progress.txt +103 -0
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +2 -1
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/intervene.d.ts +15 -0
- package/dist/commands/intervene.d.ts.map +1 -0
- package/dist/commands/intervene.js +183 -0
- package/dist/commands/intervene.js.map +1 -0
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +250 -24
- package/dist/commands/profile.js.map +1 -1
- package/dist/gamification/badges.d.ts +29 -0
- package/dist/gamification/badges.d.ts.map +1 -0
- package/dist/gamification/badges.js +114 -0
- package/dist/gamification/badges.js.map +1 -0
- package/dist/gamification/challenges.d.ts +42 -0
- package/dist/gamification/challenges.d.ts.map +1 -0
- package/dist/gamification/challenges.js +184 -0
- package/dist/gamification/challenges.js.map +1 -0
- package/dist/gamification/hall-of-fame.d.ts +17 -0
- package/dist/gamification/hall-of-fame.d.ts.map +1 -0
- package/dist/gamification/hall-of-fame.js +64 -0
- package/dist/gamification/hall-of-fame.js.map +1 -0
- package/dist/gamification/index.d.ts +3 -0
- package/dist/gamification/index.d.ts.map +1 -1
- package/dist/gamification/index.js +5 -1
- package/dist/gamification/index.js.map +1 -1
- package/dist/gamification/intervention-memory.d.ts +61 -0
- package/dist/gamification/intervention-memory.d.ts.map +1 -0
- package/dist/gamification/intervention-memory.js +229 -0
- package/dist/gamification/intervention-memory.js.map +1 -0
- package/dist/gamification/leaderboards.d.ts +49 -0
- package/dist/gamification/leaderboards.d.ts.map +1 -0
- package/dist/gamification/leaderboards.js +179 -0
- package/dist/gamification/leaderboards.js.map +1 -0
- package/dist/gamification/pattern-memory.d.ts +45 -0
- package/dist/gamification/pattern-memory.d.ts.map +1 -0
- package/dist/gamification/pattern-memory.js +188 -0
- package/dist/gamification/pattern-memory.js.map +1 -0
- package/dist/gamification/profile.d.ts +2 -1
- package/dist/gamification/profile.d.ts.map +1 -1
- package/dist/gamification/profile.js +15 -1
- package/dist/gamification/profile.js.map +1 -1
- package/dist/gamification/share.d.ts +29 -0
- package/dist/gamification/share.d.ts.map +1 -0
- package/dist/gamification/share.js +57 -0
- package/dist/gamification/share.js.map +1 -0
- package/dist/gamification/stats.d.ts +34 -0
- package/dist/gamification/stats.d.ts.map +1 -0
- package/dist/gamification/stats.js +91 -0
- package/dist/gamification/stats.js.map +1 -0
- package/dist/gamification/streaks.d.ts +9 -1
- package/dist/gamification/streaks.d.ts.map +1 -1
- package/dist/gamification/streaks.js +37 -4
- package/dist/gamification/streaks.js.map +1 -1
- package/dist/gamification/types.d.ts +73 -0
- package/dist/gamification/types.d.ts.map +1 -1
- package/dist/gamification/types.js +11 -3
- package/dist/gamification/types.js.map +1 -1
- package/dist/gamification/xp.d.ts +6 -2
- package/dist/gamification/xp.d.ts.map +1 -1
- package/dist/gamification/xp.js +27 -5
- package/dist/gamification/xp.js.map +1 -1
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +39 -0
- package/dist/output/terminal.js.map +1 -1
- package/feature-list.json +91 -1
- package/package.json +1 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHALLENGE_DEFINITIONS = void 0;
|
|
4
|
+
exports.generateWeeklyChallenges = generateWeeklyChallenges;
|
|
5
|
+
exports.updateChallengeProgress = updateChallengeProgress;
|
|
6
|
+
exports.getCurrentChallenges = getCurrentChallenges;
|
|
7
|
+
exports.formatChallenges = formatChallenges;
|
|
8
|
+
exports.CHALLENGE_DEFINITIONS = {
|
|
9
|
+
TRUST_STREAK: {
|
|
10
|
+
name: 'Trust Gauntlet',
|
|
11
|
+
description: (n) => `Get 90%+ trust in ${n} sessions`,
|
|
12
|
+
icon: '🎯',
|
|
13
|
+
targets: [3, 5, 7],
|
|
14
|
+
rewards: [50, 100, 150],
|
|
15
|
+
},
|
|
16
|
+
ZERO_SPIRALS: {
|
|
17
|
+
name: 'Zen Mode',
|
|
18
|
+
description: (n) => `${n} sessions with 0 spirals`,
|
|
19
|
+
icon: '🧘',
|
|
20
|
+
targets: [3, 5, 7],
|
|
21
|
+
rewards: [50, 100, 150],
|
|
22
|
+
},
|
|
23
|
+
ELITE_COUNT: {
|
|
24
|
+
name: 'Elite Streak',
|
|
25
|
+
description: (n) => `Get ${n} ELITE ratings this week`,
|
|
26
|
+
icon: '✨',
|
|
27
|
+
targets: [2, 4, 6],
|
|
28
|
+
rewards: [50, 100, 150],
|
|
29
|
+
},
|
|
30
|
+
COMMIT_VOLUME: {
|
|
31
|
+
name: 'Commit Champion',
|
|
32
|
+
description: (n) => `Analyze ${n}+ commits this week`,
|
|
33
|
+
icon: '📊',
|
|
34
|
+
targets: [50, 100, 200],
|
|
35
|
+
rewards: [30, 60, 100],
|
|
36
|
+
},
|
|
37
|
+
STREAK_EXTEND: {
|
|
38
|
+
name: 'Streak Builder',
|
|
39
|
+
description: (n) => `Extend your streak by ${n} days`,
|
|
40
|
+
icon: '🔥',
|
|
41
|
+
targets: [3, 5, 7],
|
|
42
|
+
rewards: [40, 80, 120],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Generate weekly challenges based on user's weak metrics
|
|
47
|
+
*/
|
|
48
|
+
function generateWeeklyChallenges(profile) {
|
|
49
|
+
const weekStart = getWeekStartISO(new Date());
|
|
50
|
+
const recentSessions = getSessionsThisWeek(profile.sessions, weekStart);
|
|
51
|
+
// Analyze weak areas
|
|
52
|
+
const avgTrust = recentSessions.length > 0
|
|
53
|
+
? recentSessions.reduce((sum, s) => sum + (s.vibeScore || 0), 0) / recentSessions.length
|
|
54
|
+
: 50;
|
|
55
|
+
const spiralCount = recentSessions.reduce((sum, s) => sum + s.spirals, 0);
|
|
56
|
+
const eliteCount = recentSessions.filter(s => s.overall === 'ELITE').length;
|
|
57
|
+
// Pick 3 challenges (1 based on weakness, 2 random)
|
|
58
|
+
const challenges = [];
|
|
59
|
+
const usedTypes = new Set();
|
|
60
|
+
// Challenge 1: Based on weakness
|
|
61
|
+
if (avgTrust < 80) {
|
|
62
|
+
challenges.push(createChallenge('TRUST_STREAK', weekStart, 1)); // Medium
|
|
63
|
+
usedTypes.add('TRUST_STREAK');
|
|
64
|
+
}
|
|
65
|
+
else if (spiralCount > 3) {
|
|
66
|
+
challenges.push(createChallenge('ZERO_SPIRALS', weekStart, 1));
|
|
67
|
+
usedTypes.add('ZERO_SPIRALS');
|
|
68
|
+
}
|
|
69
|
+
else if (eliteCount < 2) {
|
|
70
|
+
challenges.push(createChallenge('ELITE_COUNT', weekStart, 1));
|
|
71
|
+
usedTypes.add('ELITE_COUNT');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
challenges.push(createChallenge('STREAK_EXTEND', weekStart, 1));
|
|
75
|
+
usedTypes.add('STREAK_EXTEND');
|
|
76
|
+
}
|
|
77
|
+
// Challenge 2-3: Random from remaining
|
|
78
|
+
const remainingTypes = Object.keys(exports.CHALLENGE_DEFINITIONS)
|
|
79
|
+
.filter(t => !usedTypes.has(t));
|
|
80
|
+
for (let i = 0; i < 2 && remainingTypes.length > 0; i++) {
|
|
81
|
+
const idx = Math.floor(Math.random() * remainingTypes.length);
|
|
82
|
+
const type = remainingTypes.splice(idx, 1)[0];
|
|
83
|
+
challenges.push(createChallenge(type, weekStart, 0)); // Easy difficulty
|
|
84
|
+
}
|
|
85
|
+
return challenges;
|
|
86
|
+
}
|
|
87
|
+
function createChallenge(type, weekStart, difficultyIdx) {
|
|
88
|
+
const def = exports.CHALLENGE_DEFINITIONS[type];
|
|
89
|
+
const target = def.targets[difficultyIdx];
|
|
90
|
+
const reward = def.rewards[difficultyIdx];
|
|
91
|
+
return {
|
|
92
|
+
id: `${type}-${weekStart}`,
|
|
93
|
+
type,
|
|
94
|
+
name: def.name,
|
|
95
|
+
description: def.description(target),
|
|
96
|
+
icon: def.icon,
|
|
97
|
+
target,
|
|
98
|
+
progress: 0,
|
|
99
|
+
reward,
|
|
100
|
+
weekStart,
|
|
101
|
+
completed: false,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Update challenge progress after a session
|
|
106
|
+
*/
|
|
107
|
+
function updateChallengeProgress(challenges, session, streak) {
|
|
108
|
+
const completed = [];
|
|
109
|
+
for (const challenge of challenges) {
|
|
110
|
+
if (challenge.completed)
|
|
111
|
+
continue;
|
|
112
|
+
switch (challenge.type) {
|
|
113
|
+
case 'TRUST_STREAK':
|
|
114
|
+
if (session.vibeScore >= 90)
|
|
115
|
+
challenge.progress++;
|
|
116
|
+
break;
|
|
117
|
+
case 'ZERO_SPIRALS':
|
|
118
|
+
if (session.spirals === 0 && session.commits >= 10)
|
|
119
|
+
challenge.progress++;
|
|
120
|
+
break;
|
|
121
|
+
case 'ELITE_COUNT':
|
|
122
|
+
if (session.overall === 'ELITE')
|
|
123
|
+
challenge.progress++;
|
|
124
|
+
break;
|
|
125
|
+
case 'COMMIT_VOLUME':
|
|
126
|
+
challenge.progress += session.commits;
|
|
127
|
+
break;
|
|
128
|
+
case 'STREAK_EXTEND':
|
|
129
|
+
challenge.progress = streak.current - (challenge.progress || 0);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
if (challenge.progress >= challenge.target) {
|
|
133
|
+
challenge.completed = true;
|
|
134
|
+
challenge.completedAt = new Date().toISOString();
|
|
135
|
+
completed.push(challenge);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return { challenges, completed };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get current week's challenges, generating if needed
|
|
142
|
+
*/
|
|
143
|
+
function getCurrentChallenges(profile) {
|
|
144
|
+
const weekStart = getWeekStartISO(new Date());
|
|
145
|
+
const existingChallenges = profile.challenges || [];
|
|
146
|
+
// Check if we have challenges for this week
|
|
147
|
+
const thisWeekChallenges = existingChallenges.filter(c => c.weekStart === weekStart);
|
|
148
|
+
if (thisWeekChallenges.length >= 3) {
|
|
149
|
+
return thisWeekChallenges;
|
|
150
|
+
}
|
|
151
|
+
// Generate new challenges
|
|
152
|
+
return generateWeeklyChallenges(profile);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Format challenges for display
|
|
156
|
+
*/
|
|
157
|
+
function formatChallenges(challenges) {
|
|
158
|
+
const lines = [];
|
|
159
|
+
for (const c of challenges) {
|
|
160
|
+
const progressBar = createProgressBar(c.progress, c.target, 10);
|
|
161
|
+
const status = c.completed ? '✓ COMPLETE' : `${c.progress}/${c.target}`;
|
|
162
|
+
lines.push(`${c.icon} ${c.name}: ${progressBar} ${status}`);
|
|
163
|
+
}
|
|
164
|
+
return lines.join('\n');
|
|
165
|
+
}
|
|
166
|
+
function createProgressBar(current, total, length) {
|
|
167
|
+
const pct = Math.min(current / total, 1);
|
|
168
|
+
const filled = Math.round(pct * length);
|
|
169
|
+
const empty = length - filled;
|
|
170
|
+
return '█'.repeat(filled) + '░'.repeat(empty);
|
|
171
|
+
}
|
|
172
|
+
function getWeekStartISO(date) {
|
|
173
|
+
const d = new Date(date);
|
|
174
|
+
const day = d.getDay();
|
|
175
|
+
const diff = d.getDate() - day + (day === 0 ? -6 : 1);
|
|
176
|
+
d.setDate(diff);
|
|
177
|
+
d.setHours(0, 0, 0, 0);
|
|
178
|
+
return d.toISOString().split('T')[0];
|
|
179
|
+
}
|
|
180
|
+
function getSessionsThisWeek(sessions, weekStart) {
|
|
181
|
+
const start = new Date(weekStart);
|
|
182
|
+
return sessions.filter(s => new Date(s.date) >= start);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=challenges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenges.js","sourceRoot":"","sources":["../../src/gamification/challenges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Leaderboards } from './leaderboards';
|
|
2
|
+
export interface HallOfFameRecord {
|
|
3
|
+
category: string;
|
|
4
|
+
icon: string;
|
|
5
|
+
value: string;
|
|
6
|
+
date: string;
|
|
7
|
+
context: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get Hall of Fame records from leaderboards
|
|
11
|
+
*/
|
|
12
|
+
export declare function getHallOfFame(leaderboards: Leaderboards): HallOfFameRecord[];
|
|
13
|
+
/**
|
|
14
|
+
* Format Hall of Fame for display
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatHallOfFame(records: HallOfFameRecord[]): string;
|
|
17
|
+
//# sourceMappingURL=hall-of-fame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hall-of-fame.d.ts","sourceRoot":"","sources":["../../src/gamification/hall-of-fame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,gBAAgB,EAAE,CA6C5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAcpE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getHallOfFame = getHallOfFame;
|
|
4
|
+
exports.formatHallOfFame = formatHallOfFame;
|
|
5
|
+
/**
|
|
6
|
+
* Get Hall of Fame records from leaderboards
|
|
7
|
+
*/
|
|
8
|
+
function getHallOfFame(leaderboards) {
|
|
9
|
+
const records = [];
|
|
10
|
+
const pb = leaderboards.personalBests;
|
|
11
|
+
if (pb.highestScore) {
|
|
12
|
+
records.push({
|
|
13
|
+
category: 'Best Vibe Score',
|
|
14
|
+
icon: '🏆',
|
|
15
|
+
value: `${pb.highestScore.vibeScore}%`,
|
|
16
|
+
date: pb.highestScore.date,
|
|
17
|
+
context: `${pb.highestScore.repoName} - ${pb.highestScore.overall}`,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (pb.longestStreak > 0) {
|
|
21
|
+
records.push({
|
|
22
|
+
category: 'Longest Streak',
|
|
23
|
+
icon: '🔥',
|
|
24
|
+
value: `${pb.longestStreak} days`,
|
|
25
|
+
date: 'All time',
|
|
26
|
+
context: 'Consecutive daily check-ins',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (pb.bestWeekXP) {
|
|
30
|
+
records.push({
|
|
31
|
+
category: 'Best Week XP',
|
|
32
|
+
icon: '⚡',
|
|
33
|
+
value: `${pb.bestWeekXP.xp} XP`,
|
|
34
|
+
date: pb.bestWeekXP.week,
|
|
35
|
+
context: 'Most XP earned in a single week',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (pb.mostCommits) {
|
|
39
|
+
records.push({
|
|
40
|
+
category: 'Most Commits',
|
|
41
|
+
icon: '📊',
|
|
42
|
+
value: `${pb.mostCommits.commits}`,
|
|
43
|
+
date: pb.mostCommits.date,
|
|
44
|
+
context: `${pb.mostCommits.repoName} - single session`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return records;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format Hall of Fame for display
|
|
51
|
+
*/
|
|
52
|
+
function formatHallOfFame(records) {
|
|
53
|
+
if (records.length === 0) {
|
|
54
|
+
return 'No records yet. Keep coding!';
|
|
55
|
+
}
|
|
56
|
+
const lines = ['🏛️ HALL OF FAME', ''];
|
|
57
|
+
for (const record of records) {
|
|
58
|
+
lines.push(`${record.icon} ${record.category}: ${record.value}`);
|
|
59
|
+
lines.push(` ${record.date} - ${record.context}`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
}
|
|
62
|
+
return lines.join('\n');
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=hall-of-fame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hall-of-fame.js","sourceRoot":"","sources":["../../src/gamification/hall-of-fame.ts"],"names":[],"mappings":";;AAaA,sCA6CC;AAKD,4CAcC;AAnED;;GAEG;AACH,SAAgB,aAAa,CAAC,YAA0B;IACtD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC;IAEtC,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,iBAAiB;YAC3B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,GAAG;YACtC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI;YAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,EAAE,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,gBAAgB;YAC1B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,OAAO;YACjC,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,6BAA6B;SACvC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK;YAC/B,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI;YACxB,OAAO,EAAE,iCAAiC;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;YAClC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI;YACzB,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,mBAAmB;SACvD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAA2B;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAElD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -3,6 +3,9 @@ export * from './streaks';
|
|
|
3
3
|
export * from './xp';
|
|
4
4
|
export * from './achievements';
|
|
5
5
|
export * from './profile';
|
|
6
|
+
export * from './pattern-memory';
|
|
7
|
+
export * from './intervention-memory';
|
|
6
8
|
export { LEVELS, XP_REWARDS } from './types';
|
|
7
9
|
export { ACHIEVEMENTS } from './achievements';
|
|
10
|
+
export { INTERVENTION_INFO } from './intervention-memory';
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gamification/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,MAAM,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gamification/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,MAAM,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -15,16 +15,20 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
16
16
|
};
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.ACHIEVEMENTS = exports.XP_REWARDS = exports.LEVELS = void 0;
|
|
18
|
+
exports.INTERVENTION_INFO = exports.ACHIEVEMENTS = exports.XP_REWARDS = exports.LEVELS = void 0;
|
|
19
19
|
__exportStar(require("./types"), exports);
|
|
20
20
|
__exportStar(require("./streaks"), exports);
|
|
21
21
|
__exportStar(require("./xp"), exports);
|
|
22
22
|
__exportStar(require("./achievements"), exports);
|
|
23
23
|
__exportStar(require("./profile"), exports);
|
|
24
|
+
__exportStar(require("./pattern-memory"), exports);
|
|
25
|
+
__exportStar(require("./intervention-memory"), exports);
|
|
24
26
|
// Re-export commonly used items for convenience
|
|
25
27
|
var types_1 = require("./types");
|
|
26
28
|
Object.defineProperty(exports, "LEVELS", { enumerable: true, get: function () { return types_1.LEVELS; } });
|
|
27
29
|
Object.defineProperty(exports, "XP_REWARDS", { enumerable: true, get: function () { return types_1.XP_REWARDS; } });
|
|
28
30
|
var achievements_1 = require("./achievements");
|
|
29
31
|
Object.defineProperty(exports, "ACHIEVEMENTS", { enumerable: true, get: function () { return achievements_1.ACHIEVEMENTS; } });
|
|
32
|
+
var intervention_memory_1 = require("./intervention-memory");
|
|
33
|
+
Object.defineProperty(exports, "INTERVENTION_INFO", { enumerable: true, get: function () { return intervention_memory_1.INTERVENTION_INFO; } });
|
|
30
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gamification/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;;AAEpC,0CAAwB;AACxB,4CAA0B;AAC1B,uCAAqB;AACrB,iDAA+B;AAC/B,4CAA0B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gamification/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;;AAEpC,0CAAwB;AACxB,4CAA0B;AAC1B,uCAAqB;AACrB,iDAA+B;AAC/B,4CAA0B;AAC1B,mDAAiC;AACjC,wDAAsC;AAEtC,gDAAgD;AAChD,iCAA6C;AAApC,+FAAA,MAAM,OAAA;AAAE,mGAAA,UAAU,OAAA;AAC3B,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intervention Memory - Track what breaks your spirals
|
|
3
|
+
*
|
|
4
|
+
* This module stores and aggregates intervention data to help users
|
|
5
|
+
* identify what techniques work best for breaking their debug spirals.
|
|
6
|
+
*/
|
|
7
|
+
import { InterventionMemory, InterventionRecord, InterventionType } from './types';
|
|
8
|
+
export declare const INTERVENTION_INFO: Record<InterventionType, {
|
|
9
|
+
name: string;
|
|
10
|
+
icon: string;
|
|
11
|
+
description: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Create initial empty intervention memory
|
|
15
|
+
*/
|
|
16
|
+
export declare function createInitialInterventionMemory(): InterventionMemory;
|
|
17
|
+
/**
|
|
18
|
+
* Record a new intervention and recompute aggregates
|
|
19
|
+
*/
|
|
20
|
+
export declare function recordIntervention(memory: InterventionMemory | undefined, intervention: Omit<InterventionRecord, 'date'>): InterventionMemory;
|
|
21
|
+
/**
|
|
22
|
+
* Get intervention display name
|
|
23
|
+
*/
|
|
24
|
+
export declare function getInterventionDisplayName(type: InterventionType): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get intervention icon
|
|
27
|
+
*/
|
|
28
|
+
export declare function getInterventionIcon(type: InterventionType): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get recommended intervention for a pattern based on history
|
|
31
|
+
*/
|
|
32
|
+
export declare function getRecommendedIntervention(memory: InterventionMemory | undefined, pattern: string): InterventionType | null;
|
|
33
|
+
/**
|
|
34
|
+
* Format intervention memory for display
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatInterventionMemory(memory: InterventionMemory | undefined): {
|
|
37
|
+
hasData: boolean;
|
|
38
|
+
summary: string;
|
|
39
|
+
topInterventions: Array<{
|
|
40
|
+
type: InterventionType;
|
|
41
|
+
name: string;
|
|
42
|
+
icon: string;
|
|
43
|
+
count: number;
|
|
44
|
+
}>;
|
|
45
|
+
patternRecommendations: Array<{
|
|
46
|
+
pattern: string;
|
|
47
|
+
interventions: string[];
|
|
48
|
+
}>;
|
|
49
|
+
avgTimeToIntervene: number;
|
|
50
|
+
totalInterventions: number;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Get all available intervention types
|
|
54
|
+
*/
|
|
55
|
+
export declare function getAllInterventionTypes(): Array<{
|
|
56
|
+
type: InterventionType;
|
|
57
|
+
name: string;
|
|
58
|
+
icon: string;
|
|
59
|
+
description: string;
|
|
60
|
+
}>;
|
|
61
|
+
//# sourceMappingURL=intervention-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intervention-memory.d.ts","sourceRoot":"","sources":["../../src/gamification/intervention-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAMjB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,gBAAgB,EAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAqCpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,kBAAkB,CAUpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAC7C,kBAAkB,CAiBpB;AAuDD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,OAAO,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI,CA2BzB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG;IAChF,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,KAAK,CAAC;QACtB,IAAI,EAAE,gBAAgB,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,sBAAsB,EAAE,KAAK,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAgDA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,KAAK,CAAC;IAC/C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAKD"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Intervention Memory - Track what breaks your spirals
|
|
4
|
+
*
|
|
5
|
+
* This module stores and aggregates intervention data to help users
|
|
6
|
+
* identify what techniques work best for breaking their debug spirals.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.INTERVENTION_INFO = void 0;
|
|
10
|
+
exports.createInitialInterventionMemory = createInitialInterventionMemory;
|
|
11
|
+
exports.recordIntervention = recordIntervention;
|
|
12
|
+
exports.getInterventionDisplayName = getInterventionDisplayName;
|
|
13
|
+
exports.getInterventionIcon = getInterventionIcon;
|
|
14
|
+
exports.getRecommendedIntervention = getRecommendedIntervention;
|
|
15
|
+
exports.formatInterventionMemory = formatInterventionMemory;
|
|
16
|
+
exports.getAllInterventionTypes = getAllInterventionTypes;
|
|
17
|
+
const MAX_RECORDS = 100;
|
|
18
|
+
const INTERVENTION_MEMORY_VERSION = '1.0.0';
|
|
19
|
+
// Intervention type metadata
|
|
20
|
+
exports.INTERVENTION_INFO = {
|
|
21
|
+
TRACER_TEST: {
|
|
22
|
+
name: 'Tracer Test',
|
|
23
|
+
icon: '🧪',
|
|
24
|
+
description: 'Wrote a test to validate assumptions',
|
|
25
|
+
},
|
|
26
|
+
BREAK: {
|
|
27
|
+
name: 'Take a Break',
|
|
28
|
+
icon: '☕',
|
|
29
|
+
description: 'Stepped away to clear your head',
|
|
30
|
+
},
|
|
31
|
+
DOCS: {
|
|
32
|
+
name: 'Read Docs',
|
|
33
|
+
icon: '📚',
|
|
34
|
+
description: 'Consulted documentation',
|
|
35
|
+
},
|
|
36
|
+
REFACTOR: {
|
|
37
|
+
name: 'Refactor',
|
|
38
|
+
icon: '🔄',
|
|
39
|
+
description: 'Changed approach or architecture',
|
|
40
|
+
},
|
|
41
|
+
HELP: {
|
|
42
|
+
name: 'Ask for Help',
|
|
43
|
+
icon: '🤝',
|
|
44
|
+
description: 'Asked a human or AI for assistance',
|
|
45
|
+
},
|
|
46
|
+
ROLLBACK: {
|
|
47
|
+
name: 'Rollback',
|
|
48
|
+
icon: '⏪',
|
|
49
|
+
description: 'Reverted to a known good state',
|
|
50
|
+
},
|
|
51
|
+
OTHER: {
|
|
52
|
+
name: 'Other',
|
|
53
|
+
icon: '💡',
|
|
54
|
+
description: 'Custom intervention',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Create initial empty intervention memory
|
|
59
|
+
*/
|
|
60
|
+
function createInitialInterventionMemory() {
|
|
61
|
+
return {
|
|
62
|
+
version: INTERVENTION_MEMORY_VERSION,
|
|
63
|
+
records: [],
|
|
64
|
+
typeCounts: {},
|
|
65
|
+
effectiveByPattern: {},
|
|
66
|
+
topInterventions: [],
|
|
67
|
+
avgTimeToIntervene: 0,
|
|
68
|
+
totalInterventions: 0,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Record a new intervention and recompute aggregates
|
|
73
|
+
*/
|
|
74
|
+
function recordIntervention(memory, intervention) {
|
|
75
|
+
const current = memory || createInitialInterventionMemory();
|
|
76
|
+
const newRecord = {
|
|
77
|
+
...intervention,
|
|
78
|
+
date: new Date().toISOString().split('T')[0],
|
|
79
|
+
};
|
|
80
|
+
// Add to records (keep last MAX_RECORDS)
|
|
81
|
+
const allRecords = [...current.records, newRecord];
|
|
82
|
+
const trimmedRecords = allRecords.slice(-MAX_RECORDS);
|
|
83
|
+
// Recompute all aggregates
|
|
84
|
+
return computeAggregates({
|
|
85
|
+
...current,
|
|
86
|
+
records: trimmedRecords,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Compute all aggregate statistics from records
|
|
91
|
+
*/
|
|
92
|
+
function computeAggregates(memory) {
|
|
93
|
+
const records = memory.records;
|
|
94
|
+
if (records.length === 0) {
|
|
95
|
+
return createInitialInterventionMemory();
|
|
96
|
+
}
|
|
97
|
+
// Count intervention types
|
|
98
|
+
const typeCounts = {};
|
|
99
|
+
const effectiveByPattern = {};
|
|
100
|
+
let totalDuration = 0;
|
|
101
|
+
for (const record of records) {
|
|
102
|
+
// Type counts
|
|
103
|
+
typeCounts[record.type] = (typeCounts[record.type] || 0) + 1;
|
|
104
|
+
// Track which interventions work for which patterns
|
|
105
|
+
if (record.spiralPattern) {
|
|
106
|
+
if (!effectiveByPattern[record.spiralPattern]) {
|
|
107
|
+
effectiveByPattern[record.spiralPattern] = [];
|
|
108
|
+
}
|
|
109
|
+
if (!effectiveByPattern[record.spiralPattern].includes(record.type)) {
|
|
110
|
+
effectiveByPattern[record.spiralPattern].push(record.type);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
totalDuration += record.spiralDuration;
|
|
114
|
+
}
|
|
115
|
+
// Get top 3 intervention types by frequency
|
|
116
|
+
const topInterventions = Object.entries(typeCounts)
|
|
117
|
+
.sort((a, b) => b[1] - a[1])
|
|
118
|
+
.slice(0, 3)
|
|
119
|
+
.map(([type]) => type);
|
|
120
|
+
// Average time to intervene
|
|
121
|
+
const avgTimeToIntervene = records.length > 0 ? Math.round(totalDuration / records.length) : 0;
|
|
122
|
+
return {
|
|
123
|
+
version: INTERVENTION_MEMORY_VERSION,
|
|
124
|
+
records,
|
|
125
|
+
typeCounts,
|
|
126
|
+
effectiveByPattern,
|
|
127
|
+
topInterventions,
|
|
128
|
+
avgTimeToIntervene,
|
|
129
|
+
totalInterventions: records.length,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get intervention display name
|
|
134
|
+
*/
|
|
135
|
+
function getInterventionDisplayName(type) {
|
|
136
|
+
return exports.INTERVENTION_INFO[type]?.name || type;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get intervention icon
|
|
140
|
+
*/
|
|
141
|
+
function getInterventionIcon(type) {
|
|
142
|
+
return exports.INTERVENTION_INFO[type]?.icon || '💡';
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get recommended intervention for a pattern based on history
|
|
146
|
+
*/
|
|
147
|
+
function getRecommendedIntervention(memory, pattern) {
|
|
148
|
+
if (!memory || memory.records.length === 0) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
// Check pattern-specific interventions first
|
|
152
|
+
const patternInterventions = memory.effectiveByPattern[pattern];
|
|
153
|
+
if (patternInterventions && patternInterventions.length > 0) {
|
|
154
|
+
// Return the most used intervention for this pattern
|
|
155
|
+
const counts = {};
|
|
156
|
+
for (const record of memory.records) {
|
|
157
|
+
if (record.spiralPattern === pattern) {
|
|
158
|
+
counts[record.type] = (counts[record.type] || 0) + 1;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const sorted = Object.entries(counts).sort((a, b) => b[1] - a[1]);
|
|
162
|
+
if (sorted.length > 0) {
|
|
163
|
+
return sorted[0][0];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Fall back to overall most effective intervention
|
|
167
|
+
if (memory.topInterventions.length > 0) {
|
|
168
|
+
return memory.topInterventions[0];
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Format intervention memory for display
|
|
174
|
+
*/
|
|
175
|
+
function formatInterventionMemory(memory) {
|
|
176
|
+
if (!memory || memory.records.length === 0) {
|
|
177
|
+
return {
|
|
178
|
+
hasData: false,
|
|
179
|
+
summary: 'No interventions recorded yet',
|
|
180
|
+
topInterventions: [],
|
|
181
|
+
patternRecommendations: [],
|
|
182
|
+
avgTimeToIntervene: 0,
|
|
183
|
+
totalInterventions: 0,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
const topInterventions = memory.topInterventions.map((type) => ({
|
|
187
|
+
type: type,
|
|
188
|
+
name: getInterventionDisplayName(type),
|
|
189
|
+
icon: getInterventionIcon(type),
|
|
190
|
+
count: memory.typeCounts[type] || 0,
|
|
191
|
+
}));
|
|
192
|
+
const patternRecommendations = Object.entries(memory.effectiveByPattern)
|
|
193
|
+
.slice(0, 3)
|
|
194
|
+
.map(([pattern, interventions]) => ({
|
|
195
|
+
pattern,
|
|
196
|
+
interventions: interventions.map((i) => getInterventionDisplayName(i)),
|
|
197
|
+
}));
|
|
198
|
+
// Generate summary
|
|
199
|
+
let summary;
|
|
200
|
+
if (memory.totalInterventions === 1) {
|
|
201
|
+
summary = '1 intervention recorded';
|
|
202
|
+
}
|
|
203
|
+
else if (topInterventions.length > 0) {
|
|
204
|
+
const top = topInterventions[0];
|
|
205
|
+
const pct = Math.round((top.count / memory.totalInterventions) * 100);
|
|
206
|
+
summary = `${memory.totalInterventions} interventions - ${top.name} is your go-to (${pct}%)`;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
summary = `${memory.totalInterventions} interventions recorded`;
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
hasData: true,
|
|
213
|
+
summary,
|
|
214
|
+
topInterventions,
|
|
215
|
+
patternRecommendations,
|
|
216
|
+
avgTimeToIntervene: memory.avgTimeToIntervene,
|
|
217
|
+
totalInterventions: memory.totalInterventions,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get all available intervention types
|
|
222
|
+
*/
|
|
223
|
+
function getAllInterventionTypes() {
|
|
224
|
+
return Object.keys(exports.INTERVENTION_INFO).map((type) => ({
|
|
225
|
+
type,
|
|
226
|
+
...exports.INTERVENTION_INFO[type],
|
|
227
|
+
}));
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=intervention-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intervention-memory.js","sourceRoot":"","sources":["../../src/gamification/intervention-memory.ts"],"names":[],"mappings":"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"}
|