@boshu2/vibe-check 1.6.1 → 1.7.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/.agents/bundles/automatic-learning-cadence-plan-2025-12-02.md +1297 -0
- package/.agents/bundles/automatic-learning-cadence-research-2025-12-02.md +481 -0
- package/.agents/bundles/dashboard-data-quality-plan.md +458 -0
- package/.agents/bundles/rating-scoring-alignment-plan.md +427 -0
- package/.agents/bundles/rpi-session-capture-plan-2025-12-02.md +693 -0
- package/.agents/bundles/rpi-session-capture-research-2025-12-02.md +433 -0
- package/.agents/bundles/session-integration-plan-2025-12-02.md +144 -0
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +74 -2
- package/Makefile +173 -0
- package/README.md +35 -2
- package/claude-progress.json +34 -5
- package/claude-progress.txt +66 -0
- package/dashboard/app.js +699 -66
- package/dashboard/chart.min.js +20 -0
- package/dashboard/dashboard-data.js +764 -0
- package/dashboard/dashboard-data.json +182 -71
- package/dashboard/index.html +139 -14
- package/dashboard/styles.css +579 -4
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +38 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/dashboard.js +4 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/index.d.ts +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -3
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/learn.d.ts +3 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +161 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/lesson.d.ts +8 -0
- package/dist/commands/lesson.d.ts.map +1 -0
- package/dist/commands/lesson.js +206 -0
- package/dist/commands/lesson.js.map +1 -0
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +3 -202
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/session.d.ts +51 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +561 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/gamification/index.d.ts +1 -3
- package/dist/gamification/index.d.ts.map +1 -1
- package/dist/gamification/index.js +2 -5
- package/dist/gamification/index.js.map +1 -1
- package/dist/gamification/pattern-memory.d.ts +1 -1
- package/dist/gamification/pattern-memory.d.ts.map +1 -1
- package/dist/gamification/pattern-memory.js.map +1 -1
- package/dist/gamification/profile.d.ts +2 -2
- package/dist/gamification/profile.d.ts.map +1 -1
- package/dist/gamification/profile.js +2 -15
- package/dist/gamification/profile.js.map +1 -1
- package/dist/gamification/types.d.ts +8 -2
- package/dist/gamification/types.d.ts.map +1 -1
- package/dist/gamification/types.js.map +1 -1
- package/dist/insights/index.d.ts.map +1 -1
- package/dist/insights/index.js +16 -4
- package/dist/insights/index.js.map +1 -1
- package/dist/insights/types.d.ts +14 -0
- package/dist/insights/types.d.ts.map +1 -1
- package/dist/learning/cadence.d.ts +15 -0
- package/dist/learning/cadence.d.ts.map +1 -0
- package/dist/learning/cadence.js +130 -0
- package/dist/learning/cadence.js.map +1 -0
- package/dist/learning/index.d.ts +19 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +35 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/lessons-storage.d.ts +48 -0
- package/dist/learning/lessons-storage.d.ts.map +1 -0
- package/dist/learning/lessons-storage.js +266 -0
- package/dist/learning/lessons-storage.js.map +1 -0
- package/dist/learning/lessons-types.d.ts +83 -0
- package/dist/learning/lessons-types.d.ts.map +1 -0
- package/dist/learning/lessons-types.js +15 -0
- package/dist/learning/lessons-types.js.map +1 -0
- package/dist/learning/nudges.d.ts +20 -0
- package/dist/learning/nudges.d.ts.map +1 -0
- package/dist/learning/nudges.js +68 -0
- package/dist/learning/nudges.js.map +1 -0
- package/dist/learning/retrospective.d.ts +27 -0
- package/dist/learning/retrospective.d.ts.map +1 -0
- package/dist/learning/retrospective.js +184 -0
- package/dist/learning/retrospective.js.map +1 -0
- package/dist/learning/storage.d.ts +44 -0
- package/dist/learning/storage.d.ts.map +1 -0
- package/dist/learning/storage.js +194 -0
- package/dist/learning/storage.js.map +1 -0
- package/dist/learning/surfacing.d.ts +36 -0
- package/dist/learning/surfacing.d.ts.map +1 -0
- package/dist/learning/surfacing.js +255 -0
- package/dist/learning/surfacing.js.map +1 -0
- package/dist/learning/synthesis.d.ts +17 -0
- package/dist/learning/synthesis.d.ts.map +1 -0
- package/dist/learning/synthesis.js +293 -0
- package/dist/learning/synthesis.js.map +1 -0
- package/dist/learning/types.d.ts +60 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/learning/types.js +17 -0
- package/dist/learning/types.js.map +1 -0
- package/docs/METRICS.md +528 -0
- package/feature-list.json +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Retrospective System
|
|
4
|
+
*
|
|
5
|
+
* Generates weekly retrospective summaries from accumulated data.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.generateWeeklyRetro = generateWeeklyRetro;
|
|
12
|
+
exports.displayRetro = displayRetro;
|
|
13
|
+
exports.runAndSaveRetro = runAndSaveRetro;
|
|
14
|
+
exports.isRetroDue = isRetroDue;
|
|
15
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
16
|
+
const storage_1 = require("./storage");
|
|
17
|
+
const profile_1 = require("../gamification/profile");
|
|
18
|
+
const pattern_memory_1 = require("../gamification/pattern-memory");
|
|
19
|
+
const intervention_memory_1 = require("../gamification/intervention-memory");
|
|
20
|
+
const synthesis_1 = require("./synthesis");
|
|
21
|
+
const surfacing_1 = require("./surfacing");
|
|
22
|
+
/**
|
|
23
|
+
* Generate a weekly retrospective summary
|
|
24
|
+
*/
|
|
25
|
+
function generateWeeklyRetro() {
|
|
26
|
+
const profile = (0, profile_1.loadProfile)();
|
|
27
|
+
const sessions = (0, profile_1.getRecentSessions)(profile, 7);
|
|
28
|
+
const now = new Date();
|
|
29
|
+
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
30
|
+
// Calculate metrics
|
|
31
|
+
const totalCommits = sessions.reduce((sum, s) => sum + s.commits, 0);
|
|
32
|
+
const totalSpirals = sessions.reduce((sum, s) => sum + s.spirals, 0);
|
|
33
|
+
const avgScore = sessions.length > 0
|
|
34
|
+
? Math.round(sessions.reduce((sum, s) => sum + s.vibeScore, 0) / sessions.length)
|
|
35
|
+
: 0;
|
|
36
|
+
// Get pattern analysis
|
|
37
|
+
const patternData = (0, pattern_memory_1.formatPatternMemory)(profile.patternMemory);
|
|
38
|
+
const topPattern = patternData.topPatterns[0]?.pattern;
|
|
39
|
+
// Get intervention analysis
|
|
40
|
+
const interventionData = (0, intervention_memory_1.formatInterventionMemory)(profile.interventionMemory);
|
|
41
|
+
const topIntervention = interventionData.topInterventions[0]?.name;
|
|
42
|
+
// Calculate changes from previous week
|
|
43
|
+
const previousSessions = profile.sessions.slice(-14, -7);
|
|
44
|
+
let trustPassRateChange;
|
|
45
|
+
let spiralRateChange;
|
|
46
|
+
if (previousSessions.length > 0 && sessions.length > 0) {
|
|
47
|
+
const currentTrust = sessions.reduce((sum, s) => sum + (s.metrics?.trustPassRate || 0), 0) / sessions.length;
|
|
48
|
+
const prevTrust = previousSessions.reduce((sum, s) => sum + (s.metrics?.trustPassRate || 0), 0) / previousSessions.length;
|
|
49
|
+
trustPassRateChange = Math.round(currentTrust - prevTrust);
|
|
50
|
+
const currentSpiralRate = totalSpirals / sessions.length;
|
|
51
|
+
const prevSpiralRate = previousSessions.reduce((sum, s) => sum + s.spirals, 0) / previousSessions.length;
|
|
52
|
+
spiralRateChange = Math.round((prevSpiralRate - currentSpiralRate) / (prevSpiralRate || 1) * 100);
|
|
53
|
+
}
|
|
54
|
+
// Generate key insight
|
|
55
|
+
let keyInsight = '';
|
|
56
|
+
if (totalSpirals === 0) {
|
|
57
|
+
keyInsight = 'Zero spirals this week - excellent flow state!';
|
|
58
|
+
}
|
|
59
|
+
else if (topPattern && patternData.topPatterns[0]) {
|
|
60
|
+
const topPatternData = patternData.topPatterns[0];
|
|
61
|
+
keyInsight = `${topPatternData.displayName} is your main spiral trigger (${topPatternData.count} occurrences)`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
keyInsight = `${sessions.length} sessions completed with ${avgScore}% average score`;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
date: now.toISOString().split('T')[0],
|
|
68
|
+
periodStart: weekAgo.toISOString().split('T')[0],
|
|
69
|
+
periodEnd: now.toISOString().split('T')[0],
|
|
70
|
+
sessionsCount: sessions.length,
|
|
71
|
+
commitsCount: totalCommits,
|
|
72
|
+
activeMinutes: sessions.length * 30, // Estimate
|
|
73
|
+
topPattern,
|
|
74
|
+
topIntervention,
|
|
75
|
+
keyInsight,
|
|
76
|
+
trustPassRateChange,
|
|
77
|
+
spiralRateChange,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Display retrospective in terminal
|
|
82
|
+
*/
|
|
83
|
+
function displayRetro(summary) {
|
|
84
|
+
const profile = (0, profile_1.loadProfile)();
|
|
85
|
+
const patternData = (0, pattern_memory_1.formatPatternMemory)(profile.patternMemory);
|
|
86
|
+
const interventionData = (0, intervention_memory_1.formatInterventionMemory)(profile.interventionMemory);
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log(chalk_1.default.bold.cyan('='.repeat(64)));
|
|
89
|
+
console.log(chalk_1.default.bold.cyan(' WEEKLY RETROSPECTIVE'));
|
|
90
|
+
console.log(chalk_1.default.bold.cyan(` ${summary.periodStart} - ${summary.periodEnd}`));
|
|
91
|
+
console.log(chalk_1.default.bold.cyan('='.repeat(64)));
|
|
92
|
+
console.log('');
|
|
93
|
+
// Sessions summary
|
|
94
|
+
console.log(chalk_1.default.bold.white(' SESSIONS'));
|
|
95
|
+
console.log(` ${summary.sessionsCount} sessions | ${summary.commitsCount} commits`);
|
|
96
|
+
console.log('');
|
|
97
|
+
// Top patterns
|
|
98
|
+
if (patternData.hasData && patternData.topPatterns.length > 0) {
|
|
99
|
+
console.log(chalk_1.default.bold.white(' TOP SPIRAL TRIGGERS'));
|
|
100
|
+
for (const pattern of patternData.topPatterns.slice(0, 3)) {
|
|
101
|
+
console.log(` ${pattern.displayName}: ${pattern.count} spirals (${pattern.totalMinutes} min)`);
|
|
102
|
+
console.log(chalk_1.default.gray(` ${pattern.advice}`));
|
|
103
|
+
}
|
|
104
|
+
console.log('');
|
|
105
|
+
}
|
|
106
|
+
// What worked
|
|
107
|
+
if (interventionData.hasData && interventionData.topInterventions.length > 0) {
|
|
108
|
+
console.log(chalk_1.default.bold.white(' WHAT WORKED'));
|
|
109
|
+
for (const intervention of interventionData.topInterventions.slice(0, 3)) {
|
|
110
|
+
console.log(` ${intervention.icon} ${intervention.name}: ${intervention.count} times`);
|
|
111
|
+
}
|
|
112
|
+
console.log('');
|
|
113
|
+
}
|
|
114
|
+
// Progress
|
|
115
|
+
console.log(chalk_1.default.bold.white(' PROGRESS'));
|
|
116
|
+
if (summary.trustPassRateChange !== undefined) {
|
|
117
|
+
const trustColor = summary.trustPassRateChange >= 0 ? chalk_1.default.green : chalk_1.default.yellow;
|
|
118
|
+
const trustSign = summary.trustPassRateChange >= 0 ? '+' : '';
|
|
119
|
+
console.log(` Trust Pass Rate: ${trustColor(`${trustSign}${summary.trustPassRateChange}%`)}`);
|
|
120
|
+
}
|
|
121
|
+
if (summary.spiralRateChange !== undefined) {
|
|
122
|
+
const spiralColor = summary.spiralRateChange >= 0 ? chalk_1.default.green : chalk_1.default.yellow;
|
|
123
|
+
const spiralSign = summary.spiralRateChange >= 0 ? '+' : '';
|
|
124
|
+
console.log(` Spiral Reduction: ${spiralColor(`${spiralSign}${summary.spiralRateChange}%`)}`);
|
|
125
|
+
}
|
|
126
|
+
console.log('');
|
|
127
|
+
// Key insight
|
|
128
|
+
console.log(chalk_1.default.bold.cyan(` KEY INSIGHT: ${summary.keyInsight}`));
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log(chalk_1.default.bold.cyan('='.repeat(64)));
|
|
131
|
+
console.log('');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Run and save retrospective
|
|
135
|
+
*/
|
|
136
|
+
function runAndSaveRetro() {
|
|
137
|
+
const profile = (0, profile_1.loadProfile)();
|
|
138
|
+
const summary = generateWeeklyRetro();
|
|
139
|
+
displayRetro(summary);
|
|
140
|
+
// Synthesize lessons from pattern + intervention memory
|
|
141
|
+
const { lessonsCreated, lessonsUpdated } = (0, synthesis_1.synthesizeLessons)(profile.patternMemory, profile.interventionMemory);
|
|
142
|
+
// Show lessons synthesis results
|
|
143
|
+
if (lessonsCreated > 0 || lessonsUpdated > 0) {
|
|
144
|
+
console.log(chalk_1.default.bold.cyan(' LESSONS SYNTHESIZED'));
|
|
145
|
+
if (lessonsCreated > 0) {
|
|
146
|
+
console.log(chalk_1.default.green(` + ${lessonsCreated} new lessons created`));
|
|
147
|
+
}
|
|
148
|
+
if (lessonsUpdated > 0) {
|
|
149
|
+
console.log(chalk_1.default.cyan(` ~ ${lessonsUpdated} lessons updated`));
|
|
150
|
+
}
|
|
151
|
+
console.log('');
|
|
152
|
+
// Show lessons summary
|
|
153
|
+
const lessonLines = (0, surfacing_1.formatLessonsSummary)();
|
|
154
|
+
for (const line of lessonLines) {
|
|
155
|
+
console.log(line);
|
|
156
|
+
}
|
|
157
|
+
console.log('');
|
|
158
|
+
console.log(chalk_1.default.gray(' Run `vibe-check lesson` to view all lessons'));
|
|
159
|
+
console.log('');
|
|
160
|
+
console.log(chalk_1.default.bold.cyan('='.repeat(64)));
|
|
161
|
+
console.log('');
|
|
162
|
+
}
|
|
163
|
+
const state = (0, storage_1.loadLearningState)();
|
|
164
|
+
const updatedState = (0, storage_1.recordRetroCompletion)(state, summary);
|
|
165
|
+
(0, storage_1.saveLearningState)(updatedState);
|
|
166
|
+
return summary;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if retrospective is due
|
|
170
|
+
*/
|
|
171
|
+
function isRetroDue() {
|
|
172
|
+
const state = (0, storage_1.loadLearningState)();
|
|
173
|
+
if (!state.lastWeeklyRetro) {
|
|
174
|
+
return { due: true, reason: 'No retrospective recorded yet', daysSince: 999 };
|
|
175
|
+
}
|
|
176
|
+
const lastRetro = new Date(state.lastWeeklyRetro);
|
|
177
|
+
const now = new Date();
|
|
178
|
+
const daysSince = Math.floor((now.getTime() - lastRetro.getTime()) / (1000 * 60 * 60 * 24));
|
|
179
|
+
if (daysSince >= 7) {
|
|
180
|
+
return { due: true, reason: `${daysSince} days since last retrospective`, daysSince };
|
|
181
|
+
}
|
|
182
|
+
return { due: false, reason: '', daysSince };
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=retrospective.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrospective.js","sourceRoot":"","sources":["../../src/learning/retrospective.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning State Storage
|
|
3
|
+
*
|
|
4
|
+
* Manages persistence of learning state to ~/.vibe-check/learning-state.json
|
|
5
|
+
* This is global (not per-repo) to track cross-repo patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { LearningState, Nudge, RetroSummary } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Get learning state file path (global)
|
|
10
|
+
*/
|
|
11
|
+
export declare function getLearningStatePath(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Create initial learning state
|
|
14
|
+
*/
|
|
15
|
+
export declare function createInitialLearningState(): LearningState;
|
|
16
|
+
/**
|
|
17
|
+
* Load learning state from disk
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadLearningState(): LearningState;
|
|
20
|
+
/**
|
|
21
|
+
* Save learning state to disk
|
|
22
|
+
*/
|
|
23
|
+
export declare function saveLearningState(state: LearningState): void;
|
|
24
|
+
/**
|
|
25
|
+
* Add a nudge to the queue
|
|
26
|
+
*/
|
|
27
|
+
export declare function addNudge(state: LearningState, nudge: Omit<Nudge, 'id' | 'createdAt'>): LearningState;
|
|
28
|
+
/**
|
|
29
|
+
* Get pending nudges (not dismissed, not expired)
|
|
30
|
+
*/
|
|
31
|
+
export declare function getPendingNudges(state: LearningState): Nudge[];
|
|
32
|
+
/**
|
|
33
|
+
* Dismiss a nudge by ID
|
|
34
|
+
*/
|
|
35
|
+
export declare function dismissNudge(state: LearningState, nudgeId: string): LearningState;
|
|
36
|
+
/**
|
|
37
|
+
* Mark nudges as displayed
|
|
38
|
+
*/
|
|
39
|
+
export declare function markNudgesDisplayed(state: LearningState, count: number): LearningState;
|
|
40
|
+
/**
|
|
41
|
+
* Record retrospective completion
|
|
42
|
+
*/
|
|
43
|
+
export declare function recordRetroCompletion(state: LearningState, summary: RetroSummary): LearningState;
|
|
44
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACL,aAAa,EACb,KAAK,EACL,YAAY,EAGb,MAAM,SAAS,CAAC;AAMjB;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,aAAa,CAc1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAcjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAS5D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa,CAoBpG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,EAAE,CAM9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAQjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAKtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,YAAY,GACpB,aAAa,CAUf"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Learning State Storage
|
|
4
|
+
*
|
|
5
|
+
* Manages persistence of learning state to ~/.vibe-check/learning-state.json
|
|
6
|
+
* This is global (not per-repo) to track cross-repo patterns.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.getLearningStatePath = getLearningStatePath;
|
|
43
|
+
exports.createInitialLearningState = createInitialLearningState;
|
|
44
|
+
exports.loadLearningState = loadLearningState;
|
|
45
|
+
exports.saveLearningState = saveLearningState;
|
|
46
|
+
exports.addNudge = addNudge;
|
|
47
|
+
exports.getPendingNudges = getPendingNudges;
|
|
48
|
+
exports.dismissNudge = dismissNudge;
|
|
49
|
+
exports.markNudgesDisplayed = markNudgesDisplayed;
|
|
50
|
+
exports.recordRetroCompletion = recordRetroCompletion;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const types_1 = require("./types");
|
|
55
|
+
const LEARNING_DIR = '.vibe-check';
|
|
56
|
+
const LEARNING_FILE = 'learning-state.json';
|
|
57
|
+
const LEARNING_STATE_VERSION = '1.0.0';
|
|
58
|
+
/**
|
|
59
|
+
* Get learning state file path (global)
|
|
60
|
+
*/
|
|
61
|
+
function getLearningStatePath() {
|
|
62
|
+
return path.join(os.homedir(), LEARNING_DIR, LEARNING_FILE);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create initial learning state
|
|
66
|
+
*/
|
|
67
|
+
function createInitialLearningState() {
|
|
68
|
+
const today = new Date().toISOString().split('T')[0];
|
|
69
|
+
return {
|
|
70
|
+
version: LEARNING_STATE_VERSION,
|
|
71
|
+
lastDailyCheck: '',
|
|
72
|
+
lastWeeklyRetro: today,
|
|
73
|
+
lastMonthlyReview: today,
|
|
74
|
+
pendingNudges: [],
|
|
75
|
+
retroDue: false,
|
|
76
|
+
retroDueReason: '',
|
|
77
|
+
totalRetrosCompleted: 0,
|
|
78
|
+
nudgesDisplayed: 0,
|
|
79
|
+
nudgesDismissed: 0,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load learning state from disk
|
|
84
|
+
*/
|
|
85
|
+
function loadLearningState() {
|
|
86
|
+
const filePath = getLearningStatePath();
|
|
87
|
+
if (fs.existsSync(filePath)) {
|
|
88
|
+
try {
|
|
89
|
+
const data = fs.readFileSync(filePath, 'utf-8');
|
|
90
|
+
const state = JSON.parse(data);
|
|
91
|
+
return migrateLearningState(state);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return createInitialLearningState();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return createInitialLearningState();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Save learning state to disk
|
|
101
|
+
*/
|
|
102
|
+
function saveLearningState(state) {
|
|
103
|
+
const dirPath = path.join(os.homedir(), LEARNING_DIR);
|
|
104
|
+
const filePath = getLearningStatePath();
|
|
105
|
+
if (!fs.existsSync(dirPath)) {
|
|
106
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
107
|
+
}
|
|
108
|
+
fs.writeFileSync(filePath, JSON.stringify(state, null, 2));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Add a nudge to the queue
|
|
112
|
+
*/
|
|
113
|
+
function addNudge(state, nudge) {
|
|
114
|
+
const now = new Date();
|
|
115
|
+
const newNudge = {
|
|
116
|
+
...nudge,
|
|
117
|
+
id: `nudge-${now.getTime()}`,
|
|
118
|
+
createdAt: now.toISOString(),
|
|
119
|
+
expiresAt: new Date(now.getTime() + types_1.NUDGE_TTL_DAYS * 24 * 60 * 60 * 1000).toISOString(),
|
|
120
|
+
};
|
|
121
|
+
// Add to queue, keeping max size
|
|
122
|
+
const updatedNudges = [...state.pendingNudges, newNudge]
|
|
123
|
+
.filter(n => !n.dismissed)
|
|
124
|
+
.filter(n => !n.expiresAt || new Date(n.expiresAt) > now)
|
|
125
|
+
.sort((a, b) => b.priority - a.priority)
|
|
126
|
+
.slice(0, types_1.MAX_PENDING_NUDGES);
|
|
127
|
+
return {
|
|
128
|
+
...state,
|
|
129
|
+
pendingNudges: updatedNudges,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get pending nudges (not dismissed, not expired)
|
|
134
|
+
*/
|
|
135
|
+
function getPendingNudges(state) {
|
|
136
|
+
const now = new Date();
|
|
137
|
+
return state.pendingNudges
|
|
138
|
+
.filter(n => !n.dismissed)
|
|
139
|
+
.filter(n => !n.expiresAt || new Date(n.expiresAt) > now)
|
|
140
|
+
.sort((a, b) => b.priority - a.priority);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Dismiss a nudge by ID
|
|
144
|
+
*/
|
|
145
|
+
function dismissNudge(state, nudgeId) {
|
|
146
|
+
return {
|
|
147
|
+
...state,
|
|
148
|
+
pendingNudges: state.pendingNudges.map(n => n.id === nudgeId ? { ...n, dismissed: true } : n),
|
|
149
|
+
nudgesDismissed: state.nudgesDismissed + 1,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Mark nudges as displayed
|
|
154
|
+
*/
|
|
155
|
+
function markNudgesDisplayed(state, count) {
|
|
156
|
+
return {
|
|
157
|
+
...state,
|
|
158
|
+
nudgesDisplayed: state.nudgesDisplayed + count,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Record retrospective completion
|
|
163
|
+
*/
|
|
164
|
+
function recordRetroCompletion(state, summary) {
|
|
165
|
+
const today = new Date().toISOString().split('T')[0];
|
|
166
|
+
return {
|
|
167
|
+
...state,
|
|
168
|
+
lastWeeklyRetro: today,
|
|
169
|
+
retroDue: false,
|
|
170
|
+
retroDueReason: '',
|
|
171
|
+
lastRetroSummary: summary,
|
|
172
|
+
totalRetrosCompleted: state.totalRetrosCompleted + 1,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Migrate old learning state versions
|
|
177
|
+
*/
|
|
178
|
+
function migrateLearningState(state) {
|
|
179
|
+
if (!state.version) {
|
|
180
|
+
state.version = LEARNING_STATE_VERSION;
|
|
181
|
+
}
|
|
182
|
+
// Add any missing fields
|
|
183
|
+
if (state.totalRetrosCompleted === undefined) {
|
|
184
|
+
state.totalRetrosCompleted = 0;
|
|
185
|
+
}
|
|
186
|
+
if (state.nudgesDisplayed === undefined) {
|
|
187
|
+
state.nudgesDisplayed = 0;
|
|
188
|
+
}
|
|
189
|
+
if (state.nudgesDismissed === undefined) {
|
|
190
|
+
state.nudgesDismissed = 0;
|
|
191
|
+
}
|
|
192
|
+
return state;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/learning/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lesson Surfacing
|
|
3
|
+
*
|
|
4
|
+
* Finds and formats relevant lessons to display based on current context.
|
|
5
|
+
* This is the "proactive" part - surfacing learnings at the right time.
|
|
6
|
+
*/
|
|
7
|
+
import { Lesson, SurfacedLesson } from './lessons-types';
|
|
8
|
+
/**
|
|
9
|
+
* Get lessons relevant to a detected pattern
|
|
10
|
+
*
|
|
11
|
+
* Called from analyze.ts when spirals are detected
|
|
12
|
+
*/
|
|
13
|
+
export declare function surfaceLessonsForPattern(pattern: string): SurfacedLesson[];
|
|
14
|
+
/**
|
|
15
|
+
* Get lessons relevant to a component being modified
|
|
16
|
+
*
|
|
17
|
+
* Called when we detect work in a historically problematic area
|
|
18
|
+
*/
|
|
19
|
+
export declare function surfaceLessonsForComponent(component: string): SurfacedLesson[];
|
|
20
|
+
/**
|
|
21
|
+
* Get top lessons to show in profile/status
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTopLessons(limit?: number): Lesson[];
|
|
24
|
+
/**
|
|
25
|
+
* Format a surfaced lesson for CLI display
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatSurfacedLesson(surfaced: SurfacedLesson): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Format a lesson for detailed view
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatLessonDetail(lesson: Lesson): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Format lessons summary for learn --status
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatLessonsSummary(): string[];
|
|
36
|
+
//# sourceMappingURL=surfacing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfacing.d.ts","sourceRoot":"","sources":["../../src/learning/surfacing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKzD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAiB1E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB9E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,GAAE,MAAU,GAAG,MAAM,EAAE,CAezD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,CAiCvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAkF3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CA4B/C"}
|