@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,49 @@
|
|
|
1
|
+
import { SessionRecord } from './types';
|
|
2
|
+
export interface LeaderboardEntry {
|
|
3
|
+
date: string;
|
|
4
|
+
repoPath: string;
|
|
5
|
+
repoName: string;
|
|
6
|
+
vibeScore: number;
|
|
7
|
+
overall: string;
|
|
8
|
+
commits: number;
|
|
9
|
+
xpEarned: number;
|
|
10
|
+
}
|
|
11
|
+
export interface Leaderboards {
|
|
12
|
+
version: string;
|
|
13
|
+
entries: LeaderboardEntry[];
|
|
14
|
+
byRepo: Record<string, LeaderboardEntry[]>;
|
|
15
|
+
personalBests: {
|
|
16
|
+
highestScore: LeaderboardEntry | null;
|
|
17
|
+
longestStreak: number;
|
|
18
|
+
bestWeekXP: {
|
|
19
|
+
week: string;
|
|
20
|
+
xp: number;
|
|
21
|
+
} | null;
|
|
22
|
+
mostCommits: LeaderboardEntry | null;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get leaderboards file path
|
|
27
|
+
*/
|
|
28
|
+
export declare function getLeaderboardsPath(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Load leaderboards from disk
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadLeaderboards(): Leaderboards;
|
|
33
|
+
/**
|
|
34
|
+
* Save leaderboards to disk
|
|
35
|
+
*/
|
|
36
|
+
export declare function saveLeaderboards(leaderboards: Leaderboards): void;
|
|
37
|
+
/**
|
|
38
|
+
* Create initial leaderboards
|
|
39
|
+
*/
|
|
40
|
+
export declare function createInitialLeaderboards(): Leaderboards;
|
|
41
|
+
/**
|
|
42
|
+
* Record a session to leaderboards
|
|
43
|
+
*/
|
|
44
|
+
export declare function recordToLeaderboard(session: SessionRecord, repoPath: string, xpEarned: number, streak: number): Leaderboards;
|
|
45
|
+
/**
|
|
46
|
+
* Format leaderboard for display
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatLeaderboard(leaderboards: Leaderboards, repoPath?: string): string;
|
|
49
|
+
//# sourceMappingURL=leaderboards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboards.d.ts","sourceRoot":"","sources":["../../src/gamification/leaderboards.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIxC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC3C,aAAa,EAAE;QACb,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;QACtC,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAChD,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACtC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAY/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CASjE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,YAAY,CAYxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,YAAY,CAuDd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBvF"}
|
|
@@ -0,0 +1,179 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getLeaderboardsPath = getLeaderboardsPath;
|
|
37
|
+
exports.loadLeaderboards = loadLeaderboards;
|
|
38
|
+
exports.saveLeaderboards = saveLeaderboards;
|
|
39
|
+
exports.createInitialLeaderboards = createInitialLeaderboards;
|
|
40
|
+
exports.recordToLeaderboard = recordToLeaderboard;
|
|
41
|
+
exports.formatLeaderboard = formatLeaderboard;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const LEADERBOARD_FILE = 'leaderboards.json';
|
|
46
|
+
/**
|
|
47
|
+
* Get leaderboards file path
|
|
48
|
+
*/
|
|
49
|
+
function getLeaderboardsPath() {
|
|
50
|
+
return path.join(os.homedir(), '.vibe-check', LEADERBOARD_FILE);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Load leaderboards from disk
|
|
54
|
+
*/
|
|
55
|
+
function loadLeaderboards() {
|
|
56
|
+
const filePath = getLeaderboardsPath();
|
|
57
|
+
if (fs.existsSync(filePath)) {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return createInitialLeaderboards();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return createInitialLeaderboards();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Save leaderboards to disk
|
|
69
|
+
*/
|
|
70
|
+
function saveLeaderboards(leaderboards) {
|
|
71
|
+
const filePath = getLeaderboardsPath();
|
|
72
|
+
const dir = path.dirname(filePath);
|
|
73
|
+
if (!fs.existsSync(dir)) {
|
|
74
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
fs.writeFileSync(filePath, JSON.stringify(leaderboards, null, 2));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create initial leaderboards
|
|
80
|
+
*/
|
|
81
|
+
function createInitialLeaderboards() {
|
|
82
|
+
return {
|
|
83
|
+
version: '1.0.0',
|
|
84
|
+
entries: [],
|
|
85
|
+
byRepo: {},
|
|
86
|
+
personalBests: {
|
|
87
|
+
highestScore: null,
|
|
88
|
+
longestStreak: 0,
|
|
89
|
+
bestWeekXP: null,
|
|
90
|
+
mostCommits: null,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Record a session to leaderboards
|
|
96
|
+
*/
|
|
97
|
+
function recordToLeaderboard(session, repoPath, xpEarned, streak) {
|
|
98
|
+
const leaderboards = loadLeaderboards();
|
|
99
|
+
const repoName = path.basename(repoPath);
|
|
100
|
+
const entry = {
|
|
101
|
+
date: session.date,
|
|
102
|
+
repoPath,
|
|
103
|
+
repoName,
|
|
104
|
+
vibeScore: session.vibeScore,
|
|
105
|
+
overall: session.overall,
|
|
106
|
+
commits: session.commits,
|
|
107
|
+
xpEarned,
|
|
108
|
+
};
|
|
109
|
+
// Add to global entries (sorted by score, top 100)
|
|
110
|
+
leaderboards.entries.push(entry);
|
|
111
|
+
leaderboards.entries.sort((a, b) => b.vibeScore - a.vibeScore);
|
|
112
|
+
leaderboards.entries = leaderboards.entries.slice(0, 100);
|
|
113
|
+
// Add to repo-specific entries (top 10)
|
|
114
|
+
if (!leaderboards.byRepo[repoPath]) {
|
|
115
|
+
leaderboards.byRepo[repoPath] = [];
|
|
116
|
+
}
|
|
117
|
+
leaderboards.byRepo[repoPath].push(entry);
|
|
118
|
+
leaderboards.byRepo[repoPath].sort((a, b) => b.vibeScore - a.vibeScore);
|
|
119
|
+
leaderboards.byRepo[repoPath] = leaderboards.byRepo[repoPath].slice(0, 10);
|
|
120
|
+
// Update personal bests
|
|
121
|
+
if (!leaderboards.personalBests.highestScore ||
|
|
122
|
+
session.vibeScore > leaderboards.personalBests.highestScore.vibeScore) {
|
|
123
|
+
leaderboards.personalBests.highestScore = entry;
|
|
124
|
+
}
|
|
125
|
+
if (streak > leaderboards.personalBests.longestStreak) {
|
|
126
|
+
leaderboards.personalBests.longestStreak = streak;
|
|
127
|
+
}
|
|
128
|
+
if (!leaderboards.personalBests.mostCommits ||
|
|
129
|
+
session.commits > leaderboards.personalBests.mostCommits.commits) {
|
|
130
|
+
leaderboards.personalBests.mostCommits = entry;
|
|
131
|
+
}
|
|
132
|
+
// Track weekly XP
|
|
133
|
+
const weekStart = getWeekStartISO(new Date(session.date));
|
|
134
|
+
const currentWeekXP = leaderboards.personalBests.bestWeekXP;
|
|
135
|
+
if (!currentWeekXP || currentWeekXP.week !== weekStart) {
|
|
136
|
+
// New week - check if we beat previous best
|
|
137
|
+
// (simplified - in practice would need to sum week's XP)
|
|
138
|
+
leaderboards.personalBests.bestWeekXP = { week: weekStart, xp: xpEarned };
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
currentWeekXP.xp += xpEarned;
|
|
142
|
+
}
|
|
143
|
+
saveLeaderboards(leaderboards);
|
|
144
|
+
return leaderboards;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Format leaderboard for display
|
|
148
|
+
*/
|
|
149
|
+
function formatLeaderboard(leaderboards, repoPath) {
|
|
150
|
+
const lines = [];
|
|
151
|
+
if (repoPath && leaderboards.byRepo[repoPath]) {
|
|
152
|
+
const repoEntries = leaderboards.byRepo[repoPath];
|
|
153
|
+
lines.push(`📊 Top Scores - ${path.basename(repoPath)}`);
|
|
154
|
+
lines.push('');
|
|
155
|
+
for (let i = 0; i < Math.min(repoEntries.length, 5); i++) {
|
|
156
|
+
const e = repoEntries[i];
|
|
157
|
+
const medal = i === 0 ? '🥇' : i === 1 ? '🥈' : i === 2 ? '🥉' : ' ';
|
|
158
|
+
lines.push(`${medal} ${e.vibeScore}% ${e.overall.padEnd(6)} ${e.date}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
lines.push('🏆 All-Time Top Scores');
|
|
163
|
+
lines.push('');
|
|
164
|
+
for (let i = 0; i < Math.min(leaderboards.entries.length, 10); i++) {
|
|
165
|
+
const e = leaderboards.entries[i];
|
|
166
|
+
const medal = i === 0 ? '🥇' : i === 1 ? '🥈' : i === 2 ? '🥉' : `${i + 1}.`;
|
|
167
|
+
lines.push(`${medal} ${e.vibeScore}% ${e.overall.padEnd(6)} ${e.repoName} (${e.date})`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return lines.join('\n');
|
|
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
|
+
return d.toISOString().split('T')[0];
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=leaderboards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboards.js","sourceRoot":"","sources":["../../src/gamification/leaderboards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Memory - Track your spiral triggers over time
|
|
3
|
+
*
|
|
4
|
+
* This module stores and aggregates spiral pattern data to help users
|
|
5
|
+
* identify their most common debugging pitfalls.
|
|
6
|
+
*/
|
|
7
|
+
import { PatternMemory } from './types';
|
|
8
|
+
import { FixChain } from '../types';
|
|
9
|
+
/**
|
|
10
|
+
* Create initial empty pattern memory
|
|
11
|
+
*/
|
|
12
|
+
export declare function createInitialPatternMemory(): PatternMemory;
|
|
13
|
+
/**
|
|
14
|
+
* Add spiral records from fix chains and recompute aggregates
|
|
15
|
+
*/
|
|
16
|
+
export declare function updatePatternMemory(memory: PatternMemory | undefined, fixChains: FixChain[]): PatternMemory;
|
|
17
|
+
/**
|
|
18
|
+
* Get human-readable pattern name
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPatternDisplayName(pattern: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get pattern-specific advice
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPatternAdvice(pattern: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Format pattern memory for display
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatPatternMemory(memory: PatternMemory): {
|
|
29
|
+
hasData: boolean;
|
|
30
|
+
summary: string;
|
|
31
|
+
topPatterns: Array<{
|
|
32
|
+
pattern: string;
|
|
33
|
+
displayName: string;
|
|
34
|
+
count: number;
|
|
35
|
+
totalMinutes: number;
|
|
36
|
+
advice: string;
|
|
37
|
+
}>;
|
|
38
|
+
topComponents: Array<{
|
|
39
|
+
component: string;
|
|
40
|
+
count: number;
|
|
41
|
+
}>;
|
|
42
|
+
avgRecoveryTime: number;
|
|
43
|
+
totalSpirals: number;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=pattern-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-memory.d.ts","sourceRoot":"","sources":["../../src/gamification/pattern-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAuB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKpC;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CAY1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,SAAS,EAAE,QAAQ,EAAE,GACpB,aAAa,CA6Bf;AA8DD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,aAAa,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CA+CA"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pattern Memory - Track your spiral triggers over time
|
|
4
|
+
*
|
|
5
|
+
* This module stores and aggregates spiral pattern data to help users
|
|
6
|
+
* identify their most common debugging pitfalls.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createInitialPatternMemory = createInitialPatternMemory;
|
|
10
|
+
exports.updatePatternMemory = updatePatternMemory;
|
|
11
|
+
exports.getPatternDisplayName = getPatternDisplayName;
|
|
12
|
+
exports.getPatternAdvice = getPatternAdvice;
|
|
13
|
+
exports.formatPatternMemory = formatPatternMemory;
|
|
14
|
+
const MAX_RECORDS = 100;
|
|
15
|
+
const PATTERN_MEMORY_VERSION = '1.0.0';
|
|
16
|
+
/**
|
|
17
|
+
* Create initial empty pattern memory
|
|
18
|
+
*/
|
|
19
|
+
function createInitialPatternMemory() {
|
|
20
|
+
return {
|
|
21
|
+
version: PATTERN_MEMORY_VERSION,
|
|
22
|
+
records: [],
|
|
23
|
+
patternCounts: {},
|
|
24
|
+
componentCounts: {},
|
|
25
|
+
patternDurations: {},
|
|
26
|
+
topPatterns: [],
|
|
27
|
+
topComponents: [],
|
|
28
|
+
avgRecoveryTime: 0,
|
|
29
|
+
totalSpirals: 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add spiral records from fix chains and recompute aggregates
|
|
34
|
+
*/
|
|
35
|
+
function updatePatternMemory(memory, fixChains) {
|
|
36
|
+
const current = memory || createInitialPatternMemory();
|
|
37
|
+
// Filter to only spirals (3+ consecutive fixes)
|
|
38
|
+
const spirals = fixChains.filter((chain) => chain.isSpiral);
|
|
39
|
+
if (spirals.length === 0) {
|
|
40
|
+
return current;
|
|
41
|
+
}
|
|
42
|
+
// Create new records from fix chains
|
|
43
|
+
const today = new Date().toISOString().split('T')[0];
|
|
44
|
+
const newRecords = spirals.map((chain) => ({
|
|
45
|
+
pattern: chain.pattern || 'OTHER',
|
|
46
|
+
component: chain.component,
|
|
47
|
+
duration: chain.duration,
|
|
48
|
+
commits: chain.commits,
|
|
49
|
+
date: today,
|
|
50
|
+
}));
|
|
51
|
+
// Merge with existing records (keep last MAX_RECORDS)
|
|
52
|
+
const allRecords = [...current.records, ...newRecords];
|
|
53
|
+
const trimmedRecords = allRecords.slice(-MAX_RECORDS);
|
|
54
|
+
// Recompute all aggregates from records
|
|
55
|
+
return computeAggregates({
|
|
56
|
+
...current,
|
|
57
|
+
records: trimmedRecords,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Compute all aggregate statistics from records
|
|
62
|
+
*/
|
|
63
|
+
function computeAggregates(memory) {
|
|
64
|
+
const records = memory.records;
|
|
65
|
+
if (records.length === 0) {
|
|
66
|
+
return createInitialPatternMemory();
|
|
67
|
+
}
|
|
68
|
+
// Count patterns
|
|
69
|
+
const patternCounts = {};
|
|
70
|
+
const componentCounts = {};
|
|
71
|
+
const patternDurations = {};
|
|
72
|
+
let totalDuration = 0;
|
|
73
|
+
for (const record of records) {
|
|
74
|
+
// Pattern counts
|
|
75
|
+
patternCounts[record.pattern] = (patternCounts[record.pattern] || 0) + 1;
|
|
76
|
+
// Component counts
|
|
77
|
+
componentCounts[record.component] =
|
|
78
|
+
(componentCounts[record.component] || 0) + 1;
|
|
79
|
+
// Pattern durations
|
|
80
|
+
patternDurations[record.pattern] =
|
|
81
|
+
(patternDurations[record.pattern] || 0) + record.duration;
|
|
82
|
+
totalDuration += record.duration;
|
|
83
|
+
}
|
|
84
|
+
// Get top 3 patterns by frequency
|
|
85
|
+
const topPatterns = Object.entries(patternCounts)
|
|
86
|
+
.sort((a, b) => b[1] - a[1])
|
|
87
|
+
.slice(0, 3)
|
|
88
|
+
.map(([pattern]) => pattern);
|
|
89
|
+
// Get top 3 components by frequency
|
|
90
|
+
const topComponents = Object.entries(componentCounts)
|
|
91
|
+
.sort((a, b) => b[1] - a[1])
|
|
92
|
+
.slice(0, 3)
|
|
93
|
+
.map(([component]) => component);
|
|
94
|
+
// Average recovery time
|
|
95
|
+
const avgRecoveryTime = records.length > 0 ? Math.round(totalDuration / records.length) : 0;
|
|
96
|
+
return {
|
|
97
|
+
version: PATTERN_MEMORY_VERSION,
|
|
98
|
+
records,
|
|
99
|
+
patternCounts,
|
|
100
|
+
componentCounts,
|
|
101
|
+
patternDurations,
|
|
102
|
+
topPatterns,
|
|
103
|
+
topComponents,
|
|
104
|
+
avgRecoveryTime,
|
|
105
|
+
totalSpirals: records.length,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get human-readable pattern name
|
|
110
|
+
*/
|
|
111
|
+
function getPatternDisplayName(pattern) {
|
|
112
|
+
const names = {
|
|
113
|
+
SECRETS_AUTH: 'Secrets & Auth',
|
|
114
|
+
VOLUME_CONFIG: 'Volume Config',
|
|
115
|
+
API_MISMATCH: 'API Mismatch',
|
|
116
|
+
SSL_TLS: 'SSL/TLS',
|
|
117
|
+
IMAGE_REGISTRY: 'Image/Registry',
|
|
118
|
+
GITOPS_DRIFT: 'GitOps Drift',
|
|
119
|
+
OTHER: 'Other',
|
|
120
|
+
};
|
|
121
|
+
return names[pattern] || pattern;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get pattern-specific advice
|
|
125
|
+
*/
|
|
126
|
+
function getPatternAdvice(pattern) {
|
|
127
|
+
const advice = {
|
|
128
|
+
SECRETS_AUTH: 'Consider using a secrets manager or validating auth configs before deploy',
|
|
129
|
+
VOLUME_CONFIG: 'Add volume mount tests to your CI pipeline and validate paths early',
|
|
130
|
+
API_MISMATCH: 'Use schema validation and version checks before integration',
|
|
131
|
+
SSL_TLS: 'Test certificate chains in staging and automate renewal checks',
|
|
132
|
+
IMAGE_REGISTRY: 'Verify image tags exist before deploy, consider digest-based pulls',
|
|
133
|
+
GITOPS_DRIFT: 'Run drift detection in CI and enforce reconciliation timeouts',
|
|
134
|
+
OTHER: 'Consider adding pre-deployment validation for this component',
|
|
135
|
+
};
|
|
136
|
+
return advice[pattern] || advice.OTHER;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Format pattern memory for display
|
|
140
|
+
*/
|
|
141
|
+
function formatPatternMemory(memory) {
|
|
142
|
+
if (!memory || memory.records.length === 0) {
|
|
143
|
+
return {
|
|
144
|
+
hasData: false,
|
|
145
|
+
summary: 'No spiral patterns recorded yet',
|
|
146
|
+
topPatterns: [],
|
|
147
|
+
topComponents: [],
|
|
148
|
+
avgRecoveryTime: 0,
|
|
149
|
+
totalSpirals: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const topPatterns = memory.topPatterns.map((pattern) => ({
|
|
153
|
+
pattern,
|
|
154
|
+
displayName: getPatternDisplayName(pattern),
|
|
155
|
+
count: memory.patternCounts[pattern] || 0,
|
|
156
|
+
totalMinutes: memory.patternDurations[pattern] || 0,
|
|
157
|
+
advice: getPatternAdvice(pattern),
|
|
158
|
+
}));
|
|
159
|
+
const topComponents = memory.topComponents.map((component) => ({
|
|
160
|
+
component,
|
|
161
|
+
count: memory.componentCounts[component] || 0,
|
|
162
|
+
}));
|
|
163
|
+
// Generate summary
|
|
164
|
+
let summary;
|
|
165
|
+
if (memory.totalSpirals === 1) {
|
|
166
|
+
summary = '1 spiral recorded';
|
|
167
|
+
}
|
|
168
|
+
else if (memory.totalSpirals < 5) {
|
|
169
|
+
summary = `${memory.totalSpirals} spirals recorded`;
|
|
170
|
+
}
|
|
171
|
+
else if (topPatterns.length > 0) {
|
|
172
|
+
const topPattern = topPatterns[0];
|
|
173
|
+
const pct = Math.round((topPattern.count / memory.totalSpirals) * 100);
|
|
174
|
+
summary = `${memory.totalSpirals} spirals total - ${topPattern.displayName} is your top trigger (${pct}%)`;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
summary = `${memory.totalSpirals} spirals recorded`;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
hasData: true,
|
|
181
|
+
summary,
|
|
182
|
+
topPatterns,
|
|
183
|
+
topComponents,
|
|
184
|
+
avgRecoveryTime: memory.avgRecoveryTime,
|
|
185
|
+
totalSpirals: memory.totalSpirals,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=pattern-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-memory.js","sourceRoot":"","sources":["../../src/gamification/pattern-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { UserProfile, SessionRecord, Achievement } from './types';
|
|
2
|
+
import { FixChain } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Get profile directory path (in user's home directory)
|
|
4
5
|
*/
|
|
@@ -22,7 +23,7 @@ export declare function saveProfile(profile: UserProfile): void;
|
|
|
22
23
|
/**
|
|
23
24
|
* Record a new session and update all gamification state
|
|
24
25
|
*/
|
|
25
|
-
export declare function recordSession(vibeScore: number, overall: 'ELITE' | 'HIGH' | 'MEDIUM' | 'LOW', commits: number, spirals: number, periodFrom?: Date, periodTo?: Date): {
|
|
26
|
+
export declare function recordSession(vibeScore: number, overall: 'ELITE' | 'HIGH' | 'MEDIUM' | 'LOW', commits: number, spirals: number, periodFrom?: Date, periodTo?: Date, fixChains?: FixChain[]): {
|
|
26
27
|
profile: UserProfile;
|
|
27
28
|
xpEarned: number;
|
|
28
29
|
leveledUp: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/gamification/profile.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,aAAa,EAGb,WAAW,EACZ,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/gamification/profile.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,aAAa,EAGb,WAAW,EACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAapC;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,CA4BlD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAczC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAUtD;AAyCD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAC5C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,IAAI,EACjB,QAAQ,CAAC,EAAE,IAAI,EACf,SAAS,CAAC,EAAE,QAAQ,EAAE,GACrB;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,WAAW,EAAE,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB,CAuGA;AA4CD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK9F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAKrF"}
|
|
@@ -47,6 +47,8 @@ const os = __importStar(require("os"));
|
|
|
47
47
|
const streaks_1 = require("./streaks");
|
|
48
48
|
const xp_1 = require("./xp");
|
|
49
49
|
const achievements_1 = require("./achievements");
|
|
50
|
+
const pattern_memory_1 = require("./pattern-memory");
|
|
51
|
+
const intervention_memory_1 = require("./intervention-memory");
|
|
50
52
|
const PROFILE_DIR = '.vibe-check';
|
|
51
53
|
const PROFILE_FILE = 'profile.json';
|
|
52
54
|
/**
|
|
@@ -149,7 +151,7 @@ function isPeriodDuplicate(sessions, periodFrom, periodTo) {
|
|
|
149
151
|
/**
|
|
150
152
|
* Record a new session and update all gamification state
|
|
151
153
|
*/
|
|
152
|
-
function recordSession(vibeScore, overall, commits, spirals, periodFrom, periodTo) {
|
|
154
|
+
function recordSession(vibeScore, overall, commits, spirals, periodFrom, periodTo, fixChains) {
|
|
153
155
|
const profile = loadProfile();
|
|
154
156
|
const now = new Date();
|
|
155
157
|
// Check for duplicate period (anti-gaming)
|
|
@@ -211,6 +213,10 @@ function recordSession(vibeScore, overall, commits, spirals, periodFrom, periodT
|
|
|
211
213
|
// Recalculate average
|
|
212
214
|
const allScores = profile.sessions.map(s => s.vibeScore);
|
|
213
215
|
profile.stats.avgVibeScore = Math.round(allScores.reduce((a, b) => a + b, 0) / allScores.length);
|
|
216
|
+
// Update pattern memory if fix chains provided
|
|
217
|
+
if (fixChains && fixChains.length > 0) {
|
|
218
|
+
profile.patternMemory = (0, pattern_memory_1.updatePatternMemory)(profile.patternMemory, fixChains);
|
|
219
|
+
}
|
|
214
220
|
// Save profile
|
|
215
221
|
saveProfile(profile);
|
|
216
222
|
return {
|
|
@@ -250,6 +256,14 @@ function migrateProfile(profile) {
|
|
|
250
256
|
spiralsAvoided: 0,
|
|
251
257
|
};
|
|
252
258
|
}
|
|
259
|
+
// Initialize pattern memory if not present (v1.4.0+)
|
|
260
|
+
if (!profile.patternMemory) {
|
|
261
|
+
profile.patternMemory = (0, pattern_memory_1.createInitialPatternMemory)();
|
|
262
|
+
}
|
|
263
|
+
// Initialize intervention memory if not present (v1.4.0+)
|
|
264
|
+
if (!profile.interventionMemory) {
|
|
265
|
+
profile.interventionMemory = (0, intervention_memory_1.createInitialInterventionMemory)();
|
|
266
|
+
}
|
|
253
267
|
return profile;
|
|
254
268
|
}
|
|
255
269
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/gamification/profile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/gamification/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UserProfile } from './types';
|
|
2
|
+
export interface ShareableProfile {
|
|
3
|
+
username?: string;
|
|
4
|
+
level: number;
|
|
5
|
+
levelName: string;
|
|
6
|
+
totalXP: number;
|
|
7
|
+
badge: string | null;
|
|
8
|
+
streak: number;
|
|
9
|
+
longestStreak: number;
|
|
10
|
+
totalSessions: number;
|
|
11
|
+
avgScore: number;
|
|
12
|
+
bestScore: number;
|
|
13
|
+
achievementCount: number;
|
|
14
|
+
prestigeTier?: number;
|
|
15
|
+
generatedAt: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create shareable profile data
|
|
19
|
+
*/
|
|
20
|
+
export declare function createShareableProfile(profile: UserProfile, username?: string): ShareableProfile;
|
|
21
|
+
/**
|
|
22
|
+
* Format profile for sharing (text format)
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatShareText(shareable: ShareableProfile): string;
|
|
25
|
+
/**
|
|
26
|
+
* Format profile as JSON for clipboard
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatShareJSON(shareable: ShareableProfile): string;
|
|
29
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/gamification/share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CAsBlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAqBnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAEnE"}
|