@boshu2/vibe-check 1.3.1 → 1.4.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 +34 -0
- package/README.md +21 -4
- package/claude-progress.json +17 -5
- package/claude-progress.txt +50 -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 +50 -7
- 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 +117 -0
- package/dist/commands/profile.js.map +1 -1
- 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/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/types.d.ts +38 -0
- package/dist/gamification/types.d.ts.map +1 -1
- package/dist/gamification/types.js.map +1 -1
- package/dist/sessions/index.d.ts +51 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +230 -0
- package/dist/sessions/index.js.map +1 -0
- package/feature-list.json +37 -1
- package/package.json +1 -1
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,sCAEC;AAKD,wCAEC;AAKD,oDA4BC;AAKD,kCAcC;AAKD,kCAUC;AA4CD,sCAwHC;AA+CD,oDAKC;AAKD,8CAKC;AAxUD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AASzB,uCAA8D;AAC9D,6BAAkE;AAClE,iDAAiE;AACjE,qDAG0B;AAC1B,+DAAwE;AAExE,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC;;GAEG;AACH,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QAEd,MAAM,EAAE,IAAA,6BAAmB,GAAE;QAC7B,EAAE,EAAE,IAAA,oBAAe,GAAE;QACrB,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,EAAE;QAEZ,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;YACb,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,KAAK;SACrB;QAED,KAAK,EAAE;YACL,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;YACvB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;SAClB;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;YAChD,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,oBAAoB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAoB;IAC9C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,QAAyB,EACzB,UAAgB,EAChB,QAAc;IAEd,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAElC,uDAAuD;IACvD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YAEvD,sDAAsD;YACtD,IAAI,WAAW,KAAK,QAAQ,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,gCAAgC;YAChC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;YACvD,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;YAE1C,IAAI,eAAe,GAAG,CAAC,IAAI,OAAO,GAAG,eAAe,GAAG,GAAG,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,SAAiB,EACjB,OAA4C,EAC5C,OAAe,EACf,OAAe,EACf,UAAiB,EACjB,QAAe,EACf,SAAsB;IAWtB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,2CAA2C;IAC3C,MAAM,WAAW,GAAG,UAAU,IAAI,QAAQ;QACxC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC;IAEV,IAAI,WAAW,EAAE,CAAC;QAChB,6CAA6C;QAC7C,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,KAAK;YAChB,oBAAoB,EAAE,EAAE;YACxB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;YACrB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IACzC,OAAO,CAAC,MAAM,GAAG,IAAA,sBAAY,EAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;IAE1D,gDAAgD;IAChD,MAAM,aAAa,GAAkB;QACnC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,SAAS;QACT,OAAO;QACP,OAAO;QACP,OAAO;QACP,QAAQ,EAAE,CAAC,EAAG,kBAAkB;QAChC,oBAAoB,EAAE,EAAE;QACxB,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE;QACrC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;KAClC,CAAC;IAEF,MAAM,eAAe,GAAG,IAAA,gCAAiB,EACvC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,EAAE,EACV,aAAa,EACb,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACpC,CAAC;IAEF,uBAAuB;IACvB,MAAM,QAAQ,GAAG,IAAA,uBAAkB,EAAC,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3F,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAClC,aAAa,CAAC,oBAAoB,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAA,UAAK,EAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvE,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC;IAEnB,8BAA8B;IAC9B,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IAE9C,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,eAAe;IACf,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,OAAO,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/E,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,OAAO,CAAC;IAC9C,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,sBAAsB;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CACrC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CACxD,CAAC;IAEF,+CAA+C;IAC/C,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,aAAa,GAAG,IAAA,oCAAmB,EACzC,OAAO,CAAC,aAAa,EACrB,SAAS,CACV,CAAC;IACJ,CAAC;IAED,eAAe;IACf,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO;QACL,OAAO;QACP,QAAQ;QACR,SAAS;QACT,QAAQ,EAAE,QAAQ,EAAE,IAAI;QACxB,oBAAoB,EAAE,eAAe;QACrC,cAAc;QACd,cAAc;QACd,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAoB;IAC1C,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,WAAW,GAAG;YACpB,UAAU,EAAE,CAAC;YACb,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,GAAG;YACd,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;YAC5C,oBAAoB,EAAE,CAAC;YACvB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;SAClB,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,aAAa,GAAG,IAAA,2CAA0B,GAAE,CAAC;IACvD,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAChC,OAAO,CAAC,kBAAkB,GAAG,IAAA,qDAA+B,GAAE,CAAC;IACjE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,OAAoB;IACvD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;QACrC,KAAK,EAAE,2BAAY,CAAC,MAAM;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,OAAoB,EAAE,IAAY;IAClE,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -46,6 +46,8 @@ export interface UserProfile {
|
|
|
46
46
|
xp: XPState;
|
|
47
47
|
achievements: Achievement[];
|
|
48
48
|
sessions: SessionRecord[];
|
|
49
|
+
patternMemory?: PatternMemory;
|
|
50
|
+
interventionMemory?: InterventionMemory;
|
|
49
51
|
preferences: {
|
|
50
52
|
weeklyGoal: number;
|
|
51
53
|
showNotifications: boolean;
|
|
@@ -60,6 +62,42 @@ export interface UserProfile {
|
|
|
60
62
|
spiralsAvoided: number;
|
|
61
63
|
};
|
|
62
64
|
}
|
|
65
|
+
export interface SpiralPatternRecord {
|
|
66
|
+
pattern: string;
|
|
67
|
+
component: string;
|
|
68
|
+
duration: number;
|
|
69
|
+
commits: number;
|
|
70
|
+
date: string;
|
|
71
|
+
}
|
|
72
|
+
export interface PatternMemory {
|
|
73
|
+
version: string;
|
|
74
|
+
records: SpiralPatternRecord[];
|
|
75
|
+
patternCounts: Record<string, number>;
|
|
76
|
+
componentCounts: Record<string, number>;
|
|
77
|
+
patternDurations: Record<string, number>;
|
|
78
|
+
topPatterns: string[];
|
|
79
|
+
topComponents: string[];
|
|
80
|
+
avgRecoveryTime: number;
|
|
81
|
+
totalSpirals: number;
|
|
82
|
+
}
|
|
83
|
+
export type InterventionType = 'TRACER_TEST' | 'BREAK' | 'DOCS' | 'REFACTOR' | 'HELP' | 'ROLLBACK' | 'OTHER';
|
|
84
|
+
export interface InterventionRecord {
|
|
85
|
+
type: InterventionType;
|
|
86
|
+
spiralPattern?: string;
|
|
87
|
+
spiralComponent?: string;
|
|
88
|
+
spiralDuration: number;
|
|
89
|
+
date: string;
|
|
90
|
+
notes?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface InterventionMemory {
|
|
93
|
+
version: string;
|
|
94
|
+
records: InterventionRecord[];
|
|
95
|
+
typeCounts: Record<string, number>;
|
|
96
|
+
effectiveByPattern: Record<string, string[]>;
|
|
97
|
+
topInterventions: string[];
|
|
98
|
+
avgTimeToIntervene: number;
|
|
99
|
+
totalInterventions: number;
|
|
100
|
+
}
|
|
63
101
|
export declare const LEVELS: readonly [{
|
|
64
102
|
readonly level: 1;
|
|
65
103
|
readonly name: "Novice";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gamification/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAElB,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAG1B,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IAGF,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAGD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOT,CAAC;AAGX,eAAO,MAAM,UAAU;;;;;;;;;;CAUb,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gamification/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gamification/types.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gamification/types.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;AAqJpC,oBAAoB;AACP,QAAA,MAAM,GAAG;IACpB,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;IAC9D,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACpE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;IACtE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;IACjE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAClE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;CACpE,CAAC;AAEX,aAAa;AACA,QAAA,UAAU,GAAG;IACxB,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC,EAAY,oBAAoB;IAC9C,eAAe,EAAE,EAAE,EAAO,wBAAwB;IAClD,SAAS,EAAE,EAAE,EAAa,sBAAsB;IAChD,YAAY,EAAE,EAAE,EAAU,uBAAuB;CACzC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface SessionRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
startedAt: string;
|
|
4
|
+
endedAt: string;
|
|
5
|
+
commits: number;
|
|
6
|
+
trustPassRate: number;
|
|
7
|
+
reworkRatio: number;
|
|
8
|
+
spirals: number;
|
|
9
|
+
vibeScore?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SessionHistory {
|
|
12
|
+
sessions: SessionRecord[];
|
|
13
|
+
baseline: {
|
|
14
|
+
trustPassRate: number;
|
|
15
|
+
reworkRatio: number;
|
|
16
|
+
avgCommits: number;
|
|
17
|
+
avgDuration: number;
|
|
18
|
+
} | null;
|
|
19
|
+
lastUpdated: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function getSessionsPath(repoPath?: string): string;
|
|
22
|
+
export declare function loadSessionHistory(repoPath?: string): SessionHistory;
|
|
23
|
+
export declare function saveSessionHistory(history: SessionHistory, repoPath?: string): void;
|
|
24
|
+
export declare function recordSession(repoPath: string, startedAt: Date, endedAt: Date, commits: number, trustPassRate: number, reworkRatio: number, spirals: number, vibeScore?: number): SessionHistory;
|
|
25
|
+
export declare function calculateBaseline(sessions: SessionRecord[]): SessionHistory['baseline'];
|
|
26
|
+
export interface SessionDetection {
|
|
27
|
+
isNewSession: boolean;
|
|
28
|
+
sessionStart: Date;
|
|
29
|
+
gapMinutes: number | null;
|
|
30
|
+
}
|
|
31
|
+
export declare function detectSessionBoundary(commits: Array<{
|
|
32
|
+
date: Date;
|
|
33
|
+
}>, repoPath?: string): SessionDetection;
|
|
34
|
+
export interface BaselineComparison {
|
|
35
|
+
hasBaseline: boolean;
|
|
36
|
+
baseline: SessionHistory['baseline'];
|
|
37
|
+
current: {
|
|
38
|
+
trustPassRate: number;
|
|
39
|
+
reworkRatio: number;
|
|
40
|
+
commits: number;
|
|
41
|
+
duration: number;
|
|
42
|
+
};
|
|
43
|
+
comparison: {
|
|
44
|
+
trustDelta: number;
|
|
45
|
+
reworkDelta: number;
|
|
46
|
+
verdict: 'above' | 'below' | 'normal';
|
|
47
|
+
message: string;
|
|
48
|
+
} | null;
|
|
49
|
+
}
|
|
50
|
+
export declare function compareToBaseline(repoPath: string, trustPassRate: number, reworkRatio: number, commits: number, durationMinutes: number): BaselineComparison;
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAExE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,MAAsB,GAAG,cAAc,CAqBnF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,GAAE,MAAsB,GAAG,IAAI,CAUlG;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CAuChB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAwBvF;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,EAC9B,QAAQ,GAAE,MAAsB,GAC/B,gBAAgB,CAuClB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,kBAAkB,CA4DpB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
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.getSessionsPath = getSessionsPath;
|
|
37
|
+
exports.loadSessionHistory = loadSessionHistory;
|
|
38
|
+
exports.saveSessionHistory = saveSessionHistory;
|
|
39
|
+
exports.recordSession = recordSession;
|
|
40
|
+
exports.calculateBaseline = calculateBaseline;
|
|
41
|
+
exports.detectSessionBoundary = detectSessionBoundary;
|
|
42
|
+
exports.compareToBaseline = compareToBaseline;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const SESSION_GAP_MINUTES = 120; // 2 hours = new session
|
|
46
|
+
const MIN_SESSIONS_FOR_BASELINE = 5;
|
|
47
|
+
function getSessionsPath(repoPath = process.cwd()) {
|
|
48
|
+
return path.join(repoPath, '.vibe-check', 'sessions.json');
|
|
49
|
+
}
|
|
50
|
+
function loadSessionHistory(repoPath = process.cwd()) {
|
|
51
|
+
const sessionsPath = getSessionsPath(repoPath);
|
|
52
|
+
if (!fs.existsSync(sessionsPath)) {
|
|
53
|
+
return {
|
|
54
|
+
sessions: [],
|
|
55
|
+
baseline: null,
|
|
56
|
+
lastUpdated: new Date().toISOString(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const data = JSON.parse(fs.readFileSync(sessionsPath, 'utf-8'));
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return {
|
|
65
|
+
sessions: [],
|
|
66
|
+
baseline: null,
|
|
67
|
+
lastUpdated: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function saveSessionHistory(history, repoPath = process.cwd()) {
|
|
72
|
+
const sessionsPath = getSessionsPath(repoPath);
|
|
73
|
+
const dir = path.dirname(sessionsPath);
|
|
74
|
+
if (!fs.existsSync(dir)) {
|
|
75
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
history.lastUpdated = new Date().toISOString();
|
|
78
|
+
fs.writeFileSync(sessionsPath, JSON.stringify(history, null, 2));
|
|
79
|
+
}
|
|
80
|
+
function recordSession(repoPath, startedAt, endedAt, commits, trustPassRate, reworkRatio, spirals, vibeScore) {
|
|
81
|
+
const history = loadSessionHistory(repoPath);
|
|
82
|
+
// Check if this session already exists (same start time)
|
|
83
|
+
const sessionId = startedAt.toISOString().slice(0, 16); // minute precision
|
|
84
|
+
const existing = history.sessions.find(s => s.id === sessionId);
|
|
85
|
+
if (existing) {
|
|
86
|
+
// Update existing session
|
|
87
|
+
existing.endedAt = endedAt.toISOString();
|
|
88
|
+
existing.commits = commits;
|
|
89
|
+
existing.trustPassRate = trustPassRate;
|
|
90
|
+
existing.reworkRatio = reworkRatio;
|
|
91
|
+
existing.spirals = spirals;
|
|
92
|
+
if (vibeScore !== undefined)
|
|
93
|
+
existing.vibeScore = vibeScore;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Add new session
|
|
97
|
+
history.sessions.push({
|
|
98
|
+
id: sessionId,
|
|
99
|
+
startedAt: startedAt.toISOString(),
|
|
100
|
+
endedAt: endedAt.toISOString(),
|
|
101
|
+
commits,
|
|
102
|
+
trustPassRate,
|
|
103
|
+
reworkRatio,
|
|
104
|
+
spirals,
|
|
105
|
+
vibeScore,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Keep last 100 sessions
|
|
109
|
+
if (history.sessions.length > 100) {
|
|
110
|
+
history.sessions = history.sessions.slice(-100);
|
|
111
|
+
}
|
|
112
|
+
// Recalculate baseline
|
|
113
|
+
history.baseline = calculateBaseline(history.sessions);
|
|
114
|
+
saveSessionHistory(history, repoPath);
|
|
115
|
+
return history;
|
|
116
|
+
}
|
|
117
|
+
function calculateBaseline(sessions) {
|
|
118
|
+
if (sessions.length < MIN_SESSIONS_FOR_BASELINE) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// Use last 20 sessions for baseline
|
|
122
|
+
const recent = sessions.slice(-20);
|
|
123
|
+
const avgTrust = recent.reduce((sum, s) => sum + s.trustPassRate, 0) / recent.length;
|
|
124
|
+
const avgRework = recent.reduce((sum, s) => sum + s.reworkRatio, 0) / recent.length;
|
|
125
|
+
const avgCommits = recent.reduce((sum, s) => sum + s.commits, 0) / recent.length;
|
|
126
|
+
const avgDuration = recent.reduce((sum, s) => {
|
|
127
|
+
const start = new Date(s.startedAt);
|
|
128
|
+
const end = new Date(s.endedAt);
|
|
129
|
+
return sum + (end.getTime() - start.getTime()) / 60000;
|
|
130
|
+
}, 0) / recent.length;
|
|
131
|
+
return {
|
|
132
|
+
trustPassRate: Math.round(avgTrust),
|
|
133
|
+
reworkRatio: Math.round(avgRework),
|
|
134
|
+
avgCommits: Math.round(avgCommits),
|
|
135
|
+
avgDuration: Math.round(avgDuration),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function detectSessionBoundary(commits, repoPath = process.cwd()) {
|
|
139
|
+
if (commits.length === 0) {
|
|
140
|
+
return {
|
|
141
|
+
isNewSession: true,
|
|
142
|
+
sessionStart: new Date(),
|
|
143
|
+
gapMinutes: null,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Sort commits by date (oldest first)
|
|
147
|
+
const sorted = [...commits].sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
148
|
+
// Find the session start (first commit after a gap > SESSION_GAP_MINUTES)
|
|
149
|
+
let sessionStart = sorted[0].date;
|
|
150
|
+
let maxGap = 0;
|
|
151
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
152
|
+
const gap = (sorted[i].date.getTime() - sorted[i - 1].date.getTime()) / 60000;
|
|
153
|
+
if (gap > SESSION_GAP_MINUTES) {
|
|
154
|
+
sessionStart = sorted[i].date;
|
|
155
|
+
maxGap = gap;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Check if there's been a gap since the last recorded session
|
|
159
|
+
const history = loadSessionHistory(repoPath);
|
|
160
|
+
let gapFromLastSession = null;
|
|
161
|
+
if (history.sessions.length > 0) {
|
|
162
|
+
const lastSession = history.sessions[history.sessions.length - 1];
|
|
163
|
+
const lastEnd = new Date(lastSession.endedAt);
|
|
164
|
+
gapFromLastSession = (sessionStart.getTime() - lastEnd.getTime()) / 60000;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
isNewSession: maxGap > SESSION_GAP_MINUTES || (gapFromLastSession !== null && gapFromLastSession > SESSION_GAP_MINUTES),
|
|
168
|
+
sessionStart,
|
|
169
|
+
gapMinutes: gapFromLastSession,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function compareToBaseline(repoPath, trustPassRate, reworkRatio, commits, durationMinutes) {
|
|
173
|
+
const history = loadSessionHistory(repoPath);
|
|
174
|
+
const current = {
|
|
175
|
+
trustPassRate,
|
|
176
|
+
reworkRatio,
|
|
177
|
+
commits,
|
|
178
|
+
duration: durationMinutes,
|
|
179
|
+
};
|
|
180
|
+
if (!history.baseline) {
|
|
181
|
+
const sessionsNeeded = MIN_SESSIONS_FOR_BASELINE - history.sessions.length;
|
|
182
|
+
return {
|
|
183
|
+
hasBaseline: false,
|
|
184
|
+
baseline: null,
|
|
185
|
+
current,
|
|
186
|
+
comparison: null,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const trustDelta = trustPassRate - history.baseline.trustPassRate;
|
|
190
|
+
const reworkDelta = reworkRatio - history.baseline.reworkRatio;
|
|
191
|
+
// Determine verdict
|
|
192
|
+
let verdict;
|
|
193
|
+
let message;
|
|
194
|
+
const trustBetter = trustDelta > 5;
|
|
195
|
+
const trustWorse = trustDelta < -10;
|
|
196
|
+
const reworkBetter = reworkDelta < -5;
|
|
197
|
+
const reworkWorse = reworkDelta > 10;
|
|
198
|
+
if (trustBetter && !reworkWorse) {
|
|
199
|
+
verdict = 'above';
|
|
200
|
+
message = 'Better than your usual - nice flow!';
|
|
201
|
+
}
|
|
202
|
+
else if (trustWorse || reworkWorse) {
|
|
203
|
+
verdict = 'below';
|
|
204
|
+
if (trustWorse && reworkWorse) {
|
|
205
|
+
message = 'Rougher than usual - consider taking a break';
|
|
206
|
+
}
|
|
207
|
+
else if (trustWorse) {
|
|
208
|
+
message = 'Trust lower than usual - slow down and verify';
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
message = 'More rework than usual - might be spiraling';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
verdict = 'normal';
|
|
216
|
+
message = 'Typical session for you';
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
hasBaseline: true,
|
|
220
|
+
baseline: history.baseline,
|
|
221
|
+
current,
|
|
222
|
+
comparison: {
|
|
223
|
+
trustDelta,
|
|
224
|
+
reworkDelta,
|
|
225
|
+
verdict,
|
|
226
|
+
message,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=index.js.map
|