@boshu2/vibe-check 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.agents/bundles/insight-mining-dashboard-research-2025-11-30.md +400 -0
  2. package/.agents/bundles/storage-enhancement-research-2025-11-30.md +292 -0
  3. package/.agents/bundles/timeline-feature-research-complete-2025-11-30.md +301 -0
  4. package/.agents/plans/insight-dashboard-plan-2025-11-30.md +1130 -0
  5. package/.agents/plans/json-storage-enhancement-plan.md +717 -0
  6. package/.agents/plans/storage-hardening-and-cache-plan.md +592 -0
  7. package/.agents/plans/test-coverage-gaps-plan.md +1117 -0
  8. package/.agents/plans/timeline-feature-plan.md +193 -0
  9. package/.agents/plans/vibe_timeline_research_findings.md +553 -0
  10. package/.claude/settings.local.json +1 -0
  11. package/.vibe-check/.gitignore +6 -0
  12. package/CHANGELOG.md +46 -0
  13. package/CLAUDE.md +24 -0
  14. package/CONTRIBUTING.md +227 -0
  15. package/README.md +200 -143
  16. package/claude-progress.json +191 -9
  17. package/claude-progress.txt +257 -0
  18. package/dashboard/app.js +75 -2
  19. package/dashboard/dashboard-data.json +653 -0
  20. package/dashboard/index.html +13 -0
  21. package/dashboard/styles.css +61 -0
  22. package/dist/analysis/cross-session-analysis.d.ts +68 -0
  23. package/dist/analysis/cross-session-analysis.d.ts.map +1 -0
  24. package/dist/analysis/cross-session-analysis.js +174 -0
  25. package/dist/analysis/cross-session-analysis.js.map +1 -0
  26. package/dist/analysis/index.d.ts +2 -0
  27. package/dist/analysis/index.d.ts.map +1 -0
  28. package/dist/analysis/index.js +12 -0
  29. package/dist/analysis/index.js.map +1 -0
  30. package/dist/cli.js +10 -1
  31. package/dist/cli.js.map +1 -1
  32. package/dist/commands/analyze.d.ts +2 -0
  33. package/dist/commands/analyze.d.ts.map +1 -1
  34. package/dist/commands/analyze.js +105 -2
  35. package/dist/commands/analyze.js.map +1 -1
  36. package/dist/commands/cache.d.ts +6 -0
  37. package/dist/commands/cache.d.ts.map +1 -0
  38. package/dist/commands/cache.js +168 -0
  39. package/dist/commands/cache.js.map +1 -0
  40. package/dist/commands/dashboard.d.ts +8 -0
  41. package/dist/commands/dashboard.d.ts.map +1 -0
  42. package/dist/commands/dashboard.js +109 -0
  43. package/dist/commands/dashboard.js.map +1 -0
  44. package/dist/commands/index.d.ts +3 -0
  45. package/dist/commands/index.d.ts.map +1 -1
  46. package/dist/commands/index.js +8 -1
  47. package/dist/commands/index.js.map +1 -1
  48. package/dist/commands/timeline.d.ts +14 -0
  49. package/dist/commands/timeline.d.ts.map +1 -0
  50. package/dist/commands/timeline.js +462 -0
  51. package/dist/commands/timeline.js.map +1 -0
  52. package/dist/git.d.ts +24 -0
  53. package/dist/git.d.ts.map +1 -1
  54. package/dist/git.js +94 -0
  55. package/dist/git.js.map +1 -1
  56. package/dist/insights/generators.d.ts +44 -0
  57. package/dist/insights/generators.d.ts.map +1 -0
  58. package/dist/insights/generators.js +289 -0
  59. package/dist/insights/generators.js.map +1 -0
  60. package/dist/insights/index.d.ts +16 -0
  61. package/dist/insights/index.d.ts.map +1 -0
  62. package/dist/insights/index.js +171 -0
  63. package/dist/insights/index.js.map +1 -0
  64. package/dist/insights/types.d.ts +93 -0
  65. package/dist/insights/types.d.ts.map +1 -0
  66. package/dist/insights/types.js +6 -0
  67. package/dist/insights/types.js.map +1 -0
  68. package/dist/output/timeline-html.d.ts +6 -0
  69. package/dist/output/timeline-html.d.ts.map +1 -0
  70. package/dist/output/timeline-html.js +389 -0
  71. package/dist/output/timeline-html.js.map +1 -0
  72. package/dist/output/timeline-markdown.d.ts +6 -0
  73. package/dist/output/timeline-markdown.d.ts.map +1 -0
  74. package/dist/output/timeline-markdown.js +167 -0
  75. package/dist/output/timeline-markdown.js.map +1 -0
  76. package/dist/output/timeline.d.ts +9 -0
  77. package/dist/output/timeline.d.ts.map +1 -0
  78. package/dist/output/timeline.js +318 -0
  79. package/dist/output/timeline.js.map +1 -0
  80. package/dist/patterns/detour.d.ts +32 -0
  81. package/dist/patterns/detour.d.ts.map +1 -0
  82. package/dist/patterns/detour.js +137 -0
  83. package/dist/patterns/detour.js.map +1 -0
  84. package/dist/patterns/flow-state.d.ts +16 -0
  85. package/dist/patterns/flow-state.d.ts.map +1 -0
  86. package/dist/patterns/flow-state.js +40 -0
  87. package/dist/patterns/flow-state.js.map +1 -0
  88. package/dist/patterns/index.d.ts +8 -0
  89. package/dist/patterns/index.d.ts.map +1 -0
  90. package/dist/patterns/index.js +22 -0
  91. package/dist/patterns/index.js.map +1 -0
  92. package/dist/patterns/intervention-effectiveness.d.ts +42 -0
  93. package/dist/patterns/intervention-effectiveness.d.ts.map +1 -0
  94. package/dist/patterns/intervention-effectiveness.js +196 -0
  95. package/dist/patterns/intervention-effectiveness.js.map +1 -0
  96. package/dist/patterns/late-night.d.ts +30 -0
  97. package/dist/patterns/late-night.d.ts.map +1 -0
  98. package/dist/patterns/late-night.js +141 -0
  99. package/dist/patterns/late-night.js.map +1 -0
  100. package/dist/patterns/post-delete-sprint.d.ts +28 -0
  101. package/dist/patterns/post-delete-sprint.d.ts.map +1 -0
  102. package/dist/patterns/post-delete-sprint.js +85 -0
  103. package/dist/patterns/post-delete-sprint.js.map +1 -0
  104. package/dist/patterns/spiral-regression.d.ts +49 -0
  105. package/dist/patterns/spiral-regression.d.ts.map +1 -0
  106. package/dist/patterns/spiral-regression.js +219 -0
  107. package/dist/patterns/spiral-regression.js.map +1 -0
  108. package/dist/patterns/thrashing.d.ts +25 -0
  109. package/dist/patterns/thrashing.d.ts.map +1 -0
  110. package/dist/patterns/thrashing.js +111 -0
  111. package/dist/patterns/thrashing.js.map +1 -0
  112. package/dist/storage/atomic.d.ts +40 -0
  113. package/dist/storage/atomic.d.ts.map +1 -0
  114. package/dist/storage/atomic.js +155 -0
  115. package/dist/storage/atomic.js.map +1 -0
  116. package/dist/storage/commit-log.d.ts +35 -0
  117. package/dist/storage/commit-log.d.ts.map +1 -0
  118. package/dist/storage/commit-log.js +128 -0
  119. package/dist/storage/commit-log.js.map +1 -0
  120. package/dist/storage/index.d.ts +5 -0
  121. package/dist/storage/index.d.ts.map +1 -0
  122. package/dist/storage/index.js +33 -0
  123. package/dist/storage/index.js.map +1 -0
  124. package/dist/storage/schema.d.ts +32 -0
  125. package/dist/storage/schema.d.ts.map +1 -0
  126. package/dist/storage/schema.js +37 -0
  127. package/dist/storage/schema.js.map +1 -0
  128. package/dist/storage/timeline-store.d.ts +117 -0
  129. package/dist/storage/timeline-store.d.ts.map +1 -0
  130. package/dist/storage/timeline-store.js +438 -0
  131. package/dist/storage/timeline-store.js.map +1 -0
  132. package/dist/types.d.ts +96 -0
  133. package/dist/types.d.ts.map +1 -1
  134. package/docs/ARCHITECTURE.md +458 -0
  135. package/docs/DATA-ARCHITECTURE.md +565 -0
  136. package/docs/GAMIFICATION.md +564 -0
  137. package/docs/JSON-STORAGE-PATTERNS.md +512 -0
  138. package/docs/METRICS-EXPLAINED.md +394 -0
  139. package/docs/UNIFIED-ECOSYSTEM.md +560 -0
  140. package/docs/VIBE-ECOSYSTEM.md +406 -0
  141. package/feature-list.json +48 -0
  142. package/package.json +2 -1
  143. package/vitest.config.ts +1 -5
  144. package/.vibe-check/calibration.json +0 -38
  145. package/.vibe-check/latest.json +0 -114
  146. package/.vibe-check/sessions.json +0 -44
  147. package/PLAN-ultimate-game.md +0 -1362
@@ -0,0 +1,117 @@
1
+ import { TimelineResult, TimelineSession } from '../types';
2
+ import { SchemaVersion } from './schema';
3
+ export interface TimelineStore {
4
+ version: SchemaVersion;
5
+ lastUpdated: string;
6
+ lastCommitHash: string;
7
+ sessions: StoredSession[];
8
+ insights: StoredInsight[];
9
+ patterns: PatternStats;
10
+ trends: TrendData;
11
+ }
12
+ export interface StoredSession {
13
+ id: string;
14
+ date: string;
15
+ start: string;
16
+ end: string;
17
+ duration: number;
18
+ commitCount: number;
19
+ commitHashes: string[];
20
+ overall: string;
21
+ trustPassRate: number;
22
+ reworkRatio: number;
23
+ xpEarned: number;
24
+ flowState: boolean;
25
+ spiralCount: number;
26
+ spiralComponents: string[];
27
+ }
28
+ export interface StoredInsight {
29
+ id: string;
30
+ type: 'pattern' | 'trend' | 'recommendation';
31
+ category: string;
32
+ message: string;
33
+ firstSeen: string;
34
+ lastSeen: string;
35
+ occurrences: number;
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+ export interface PatternStats {
39
+ totalFlowStates: number;
40
+ avgFlowDuration: number;
41
+ peakFlowHour: number;
42
+ totalSpirals: number;
43
+ avgSpiralDuration: number;
44
+ spiralsByComponent: Record<string, number>;
45
+ spiralsByHour: Record<number, number>;
46
+ lateNightSessions: number;
47
+ lateNightAvgDuration: number;
48
+ totalDetours: number;
49
+ totalTimeLostToDetours: number;
50
+ postDeleteSprints: number;
51
+ avgVelocityIncrease: number;
52
+ }
53
+ export interface TrendData {
54
+ weekly: WeekTrend[];
55
+ monthly: MonthTrend[];
56
+ improvements: {
57
+ metric: string;
58
+ direction: 'up' | 'down' | 'stable';
59
+ change: number;
60
+ period: string;
61
+ }[];
62
+ }
63
+ export interface WeekTrend {
64
+ weekStart: string;
65
+ sessions: number;
66
+ commits: number;
67
+ flowStates: number;
68
+ spirals: number;
69
+ avgScore: number;
70
+ activeMinutes: number;
71
+ }
72
+ export interface MonthTrend {
73
+ month: string;
74
+ sessions: number;
75
+ commits: number;
76
+ flowStates: number;
77
+ spirals: number;
78
+ avgScore: number;
79
+ activeMinutes: number;
80
+ }
81
+ /**
82
+ * Get store directory path (repo-local)
83
+ */
84
+ export declare function getStoreDir(repoPath?: string): string;
85
+ /**
86
+ * Get timeline store file path
87
+ */
88
+ export declare function getStorePath(repoPath?: string): string;
89
+ /**
90
+ * Create initial empty store
91
+ */
92
+ export declare function createInitialStore(): TimelineStore;
93
+ /**
94
+ * Load timeline store from disk
95
+ */
96
+ export declare function loadStore(repoPath?: string): TimelineStore;
97
+ /**
98
+ * Save timeline store to disk
99
+ */
100
+ export declare function saveStore(store: TimelineStore, repoPath?: string): void;
101
+ /**
102
+ * Get last known commit hash for incremental sync
103
+ */
104
+ export declare function getLastCommitHash(repoPath?: string): string;
105
+ /**
106
+ * Check if a session already exists (by commit hashes)
107
+ */
108
+ export declare function sessionExists(store: TimelineStore, commitHashes: string[]): boolean;
109
+ /**
110
+ * Convert TimelineSession to StoredSession for persistence
111
+ */
112
+ export declare function sessionToStored(session: TimelineSession): StoredSession;
113
+ /**
114
+ * Update store with new timeline data
115
+ */
116
+ export declare function updateStore(store: TimelineStore, timeline: TimelineResult, lastCommitHash: string): TimelineStore;
117
+ //# sourceMappingURL=timeline-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../../src/storage/timeline-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,438 @@
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.getStoreDir = getStoreDir;
37
+ exports.getStorePath = getStorePath;
38
+ exports.createInitialStore = createInitialStore;
39
+ exports.loadStore = loadStore;
40
+ exports.saveStore = saveStore;
41
+ exports.getLastCommitHash = getLastCommitHash;
42
+ exports.sessionExists = sessionExists;
43
+ exports.sessionToStored = sessionToStored;
44
+ exports.updateStore = updateStore;
45
+ const path = __importStar(require("path"));
46
+ const atomic_1 = require("./atomic");
47
+ const schema_1 = require("./schema");
48
+ const STORE_DIR = '.vibe-check';
49
+ const TIMELINE_FILE = 'timeline.json';
50
+ /**
51
+ * Get store directory path (repo-local)
52
+ */
53
+ function getStoreDir(repoPath = process.cwd()) {
54
+ return path.join(repoPath, STORE_DIR);
55
+ }
56
+ /**
57
+ * Get timeline store file path
58
+ */
59
+ function getStorePath(repoPath = process.cwd()) {
60
+ return path.join(getStoreDir(repoPath), TIMELINE_FILE);
61
+ }
62
+ /**
63
+ * Create initial empty store
64
+ */
65
+ function createInitialStore() {
66
+ return {
67
+ version: schema_1.CURRENT_SCHEMA_VERSION,
68
+ lastUpdated: new Date().toISOString(),
69
+ lastCommitHash: '',
70
+ sessions: [],
71
+ insights: [],
72
+ patterns: {
73
+ totalFlowStates: 0,
74
+ avgFlowDuration: 0,
75
+ peakFlowHour: 12,
76
+ totalSpirals: 0,
77
+ avgSpiralDuration: 0,
78
+ spiralsByComponent: {},
79
+ spiralsByHour: {},
80
+ lateNightSessions: 0,
81
+ lateNightAvgDuration: 0,
82
+ totalDetours: 0,
83
+ totalTimeLostToDetours: 0,
84
+ postDeleteSprints: 0,
85
+ avgVelocityIncrease: 0,
86
+ },
87
+ trends: {
88
+ weekly: [],
89
+ monthly: [],
90
+ improvements: [],
91
+ },
92
+ };
93
+ }
94
+ /**
95
+ * Load timeline store from disk
96
+ */
97
+ function loadStore(repoPath = process.cwd()) {
98
+ const filePath = getStorePath(repoPath);
99
+ const initialStore = createInitialStore();
100
+ const store = (0, atomic_1.safeReadJsonSync)(filePath, initialStore);
101
+ // Always migrate (handles both old versions and fresh stores)
102
+ return migrateTimelineStore(store);
103
+ }
104
+ /**
105
+ * Save timeline store to disk
106
+ */
107
+ function saveStore(store, repoPath = process.cwd()) {
108
+ const filePath = getStorePath(repoPath);
109
+ store.lastUpdated = new Date().toISOString();
110
+ // Use atomic write to prevent corruption
111
+ (0, atomic_1.atomicWriteSync)(filePath, JSON.stringify(store, null, 2));
112
+ }
113
+ /**
114
+ * Get last known commit hash for incremental sync
115
+ */
116
+ function getLastCommitHash(repoPath = process.cwd()) {
117
+ const store = loadStore(repoPath);
118
+ return store.lastCommitHash;
119
+ }
120
+ /**
121
+ * Check if a session already exists (by commit hashes)
122
+ */
123
+ function sessionExists(store, commitHashes) {
124
+ const hashSet = new Set(commitHashes);
125
+ for (const session of store.sessions) {
126
+ // Check for significant overlap (>80% of commits match)
127
+ const matchCount = session.commitHashes.filter(h => hashSet.has(h)).length;
128
+ const overlapRatio = matchCount / Math.max(session.commitHashes.length, commitHashes.length);
129
+ if (overlapRatio > 0.8) {
130
+ return true;
131
+ }
132
+ }
133
+ return false;
134
+ }
135
+ /**
136
+ * Convert TimelineSession to StoredSession for persistence
137
+ */
138
+ function sessionToStored(session) {
139
+ return {
140
+ id: session.id,
141
+ date: session.start.toISOString().split('T')[0],
142
+ start: session.start.toISOString(),
143
+ end: session.end.toISOString(),
144
+ duration: session.duration,
145
+ commitCount: session.commits.length,
146
+ commitHashes: session.commits.map(c => c.hash),
147
+ overall: session.overall,
148
+ trustPassRate: session.trustPassRate,
149
+ reworkRatio: session.reworkRatio,
150
+ xpEarned: session.xpEarned,
151
+ flowState: session.flowState,
152
+ spiralCount: session.spirals.length,
153
+ spiralComponents: session.spirals.map(s => s.component),
154
+ };
155
+ }
156
+ /**
157
+ * Update store with new timeline data
158
+ */
159
+ function updateStore(store, timeline, lastCommitHash) {
160
+ // Add new sessions (skip duplicates)
161
+ for (const session of timeline.sessions) {
162
+ const commitHashes = session.commits.map(c => c.hash);
163
+ if (!sessionExists(store, commitHashes)) {
164
+ store.sessions.push(sessionToStored(session));
165
+ }
166
+ }
167
+ // Update pattern stats
168
+ updatePatternStats(store, timeline);
169
+ // Update trends
170
+ updateTrends(store);
171
+ // Generate new insights
172
+ generateInsights(store, timeline);
173
+ // Update last commit hash
174
+ store.lastCommitHash = lastCommitHash;
175
+ // Keep only last 500 sessions (roughly 1 year of daily coding)
176
+ if (store.sessions.length > 500) {
177
+ store.sessions = store.sessions.slice(-500);
178
+ }
179
+ return store;
180
+ }
181
+ /**
182
+ * Update pattern statistics from new timeline data
183
+ */
184
+ function updatePatternStats(store, timeline) {
185
+ const stats = store.patterns;
186
+ // Flow states
187
+ const flowSessions = timeline.sessions.filter(s => s.flowState);
188
+ if (flowSessions.length > 0) {
189
+ stats.totalFlowStates += flowSessions.length;
190
+ const totalFlowDuration = flowSessions.reduce((sum, s) => sum + s.duration, 0);
191
+ stats.avgFlowDuration = Math.round((stats.avgFlowDuration * (stats.totalFlowStates - flowSessions.length) + totalFlowDuration) /
192
+ stats.totalFlowStates);
193
+ // Calculate peak flow hour
194
+ const hourCounts = {};
195
+ for (const session of flowSessions) {
196
+ const hour = session.start.getHours();
197
+ hourCounts[hour] = (hourCounts[hour] || 0) + 1;
198
+ }
199
+ const peakHour = Object.entries(hourCounts)
200
+ .sort((a, b) => b[1] - a[1])[0];
201
+ if (peakHour) {
202
+ stats.peakFlowHour = parseInt(peakHour[0]);
203
+ }
204
+ }
205
+ // Spirals
206
+ const spiralCount = timeline.totalSpirals;
207
+ if (spiralCount > 0) {
208
+ stats.totalSpirals += spiralCount;
209
+ // Track spirals by component and hour
210
+ for (const session of timeline.sessions) {
211
+ for (const spiral of session.spirals) {
212
+ stats.spiralsByComponent[spiral.component] =
213
+ (stats.spiralsByComponent[spiral.component] || 0) + 1;
214
+ const hour = session.start.getHours();
215
+ stats.spiralsByHour[hour] = (stats.spiralsByHour[hour] || 0) + 1;
216
+ }
217
+ }
218
+ }
219
+ // Late night sessions
220
+ if (timeline.lateNightSpirals?.detected) {
221
+ stats.lateNightSessions += timeline.lateNightSpirals.spirals.length;
222
+ if (timeline.lateNightSpirals.totalDuration > 0) {
223
+ stats.lateNightAvgDuration = Math.round((stats.lateNightAvgDuration * (stats.lateNightSessions - timeline.lateNightSpirals.spirals.length) +
224
+ timeline.lateNightSpirals.totalDuration) / stats.lateNightSessions);
225
+ }
226
+ }
227
+ // Detours
228
+ if (timeline.detours?.detected) {
229
+ stats.totalDetours += timeline.detours.detours.length;
230
+ stats.totalTimeLostToDetours += timeline.detours.totalTimeLost;
231
+ }
232
+ // Post-delete sprints
233
+ if (timeline.postDeleteSprint?.detected) {
234
+ stats.postDeleteSprints += 1;
235
+ stats.avgVelocityIncrease = Math.round((stats.avgVelocityIncrease * (stats.postDeleteSprints - 1) +
236
+ timeline.postDeleteSprint.velocityIncrease) / stats.postDeleteSprints * 10) / 10;
237
+ }
238
+ }
239
+ /**
240
+ * Update weekly and monthly trends
241
+ */
242
+ function updateTrends(store) {
243
+ const sessions = store.sessions;
244
+ if (sessions.length === 0)
245
+ return;
246
+ // Group sessions by week
247
+ const weeklyMap = new Map();
248
+ const monthlyMap = new Map();
249
+ for (const session of sessions) {
250
+ const date = new Date(session.start);
251
+ // Week key (Monday of that week)
252
+ const weekStart = new Date(date);
253
+ weekStart.setDate(date.getDate() - date.getDay() + 1);
254
+ const weekKey = weekStart.toISOString().split('T')[0];
255
+ if (!weeklyMap.has(weekKey))
256
+ weeklyMap.set(weekKey, []);
257
+ weeklyMap.get(weekKey).push(session);
258
+ // Month key
259
+ const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
260
+ if (!monthlyMap.has(monthKey))
261
+ monthlyMap.set(monthKey, []);
262
+ monthlyMap.get(monthKey).push(session);
263
+ }
264
+ // Convert to trend arrays (last 12 weeks)
265
+ store.trends.weekly = Array.from(weeklyMap.entries())
266
+ .sort((a, b) => b[0].localeCompare(a[0]))
267
+ .slice(0, 12)
268
+ .map(([weekStart, weekSessions]) => ({
269
+ weekStart,
270
+ sessions: weekSessions.length,
271
+ commits: weekSessions.reduce((sum, s) => sum + s.commitCount, 0),
272
+ flowStates: weekSessions.filter(s => s.flowState).length,
273
+ spirals: weekSessions.reduce((sum, s) => sum + s.spiralCount, 0),
274
+ avgScore: Math.round(weekSessions.reduce((sum, s) => sum + s.trustPassRate, 0) / weekSessions.length),
275
+ activeMinutes: weekSessions.reduce((sum, s) => sum + s.duration, 0),
276
+ }))
277
+ .reverse();
278
+ // Convert to monthly trends (last 6 months)
279
+ store.trends.monthly = Array.from(monthlyMap.entries())
280
+ .sort((a, b) => b[0].localeCompare(a[0]))
281
+ .slice(0, 6)
282
+ .map(([month, monthSessions]) => ({
283
+ month,
284
+ sessions: monthSessions.length,
285
+ commits: monthSessions.reduce((sum, s) => sum + s.commitCount, 0),
286
+ flowStates: monthSessions.filter(s => s.flowState).length,
287
+ spirals: monthSessions.reduce((sum, s) => sum + s.spiralCount, 0),
288
+ avgScore: Math.round(monthSessions.reduce((sum, s) => sum + s.trustPassRate, 0) / monthSessions.length),
289
+ activeMinutes: monthSessions.reduce((sum, s) => sum + s.duration, 0),
290
+ }))
291
+ .reverse();
292
+ // Calculate improvements (compare last 2 weeks)
293
+ if (store.trends.weekly.length >= 2) {
294
+ const recent = store.trends.weekly[store.trends.weekly.length - 1];
295
+ const previous = store.trends.weekly[store.trends.weekly.length - 2];
296
+ store.trends.improvements = [];
297
+ // Flow states improvement
298
+ if (previous.flowStates > 0) {
299
+ const change = ((recent.flowStates - previous.flowStates) / previous.flowStates) * 100;
300
+ store.trends.improvements.push({
301
+ metric: 'flowStates',
302
+ direction: change > 5 ? 'up' : change < -5 ? 'down' : 'stable',
303
+ change: Math.round(change),
304
+ period: 'week',
305
+ });
306
+ }
307
+ // Spirals improvement (lower is better)
308
+ if (previous.spirals > 0) {
309
+ const change = ((recent.spirals - previous.spirals) / previous.spirals) * 100;
310
+ store.trends.improvements.push({
311
+ metric: 'spirals',
312
+ direction: change < -5 ? 'up' : change > 5 ? 'down' : 'stable', // Inverted
313
+ change: Math.round(-change), // Positive = fewer spirals
314
+ period: 'week',
315
+ });
316
+ }
317
+ }
318
+ }
319
+ /**
320
+ * Generate compounding insights from accumulated data
321
+ */
322
+ function generateInsights(store, timeline) {
323
+ const stats = store.patterns;
324
+ const now = new Date().toISOString();
325
+ // Late night insight
326
+ if (stats.lateNightSessions >= 3) {
327
+ const existingInsight = store.insights.find(i => i.id === 'late-night-pattern');
328
+ if (existingInsight) {
329
+ existingInsight.lastSeen = now;
330
+ existingInsight.occurrences = stats.lateNightSessions;
331
+ existingInsight.message = `You've had ${stats.lateNightSessions} late-night spirals, averaging ${stats.lateNightAvgDuration}m each. Fresh eyes typically resolve these faster.`;
332
+ }
333
+ else {
334
+ store.insights.push({
335
+ id: 'late-night-pattern',
336
+ type: 'pattern',
337
+ category: 'timing',
338
+ message: `You've had ${stats.lateNightSessions} late-night spirals, averaging ${stats.lateNightAvgDuration}m each. Fresh eyes typically resolve these faster.`,
339
+ firstSeen: now,
340
+ lastSeen: now,
341
+ occurrences: stats.lateNightSessions,
342
+ });
343
+ }
344
+ }
345
+ // Peak flow hour insight
346
+ if (stats.totalFlowStates >= 5) {
347
+ const hour = stats.peakFlowHour;
348
+ const hourStr = hour < 12 ? `${hour}am` : hour === 12 ? '12pm' : `${hour - 12}pm`;
349
+ const existingInsight = store.insights.find(i => i.id === 'peak-flow-hour');
350
+ if (existingInsight) {
351
+ existingInsight.lastSeen = now;
352
+ existingInsight.occurrences = stats.totalFlowStates;
353
+ existingInsight.message = `Your flow states peak around ${hourStr}. Protect this time for deep work.`;
354
+ }
355
+ else {
356
+ store.insights.push({
357
+ id: 'peak-flow-hour',
358
+ type: 'recommendation',
359
+ category: 'timing',
360
+ message: `Your flow states peak around ${hourStr}. Protect this time for deep work.`,
361
+ firstSeen: now,
362
+ lastSeen: now,
363
+ occurrences: stats.totalFlowStates,
364
+ metadata: { peakHour: hour },
365
+ });
366
+ }
367
+ }
368
+ // Component spiral pattern
369
+ const topSpiralComponent = Object.entries(stats.spiralsByComponent)
370
+ .sort((a, b) => b[1] - a[1])[0];
371
+ if (topSpiralComponent && topSpiralComponent[1] >= 3) {
372
+ const [component, count] = topSpiralComponent;
373
+ const existingInsight = store.insights.find(i => i.id === `spiral-component-${component}`);
374
+ if (existingInsight) {
375
+ existingInsight.lastSeen = now;
376
+ existingInsight.occurrences = count;
377
+ }
378
+ else {
379
+ store.insights.push({
380
+ id: `spiral-component-${component}`,
381
+ type: 'pattern',
382
+ category: 'component',
383
+ message: `"${component}" has caused ${count} debug spirals. Consider adding tracer tests.`,
384
+ firstSeen: now,
385
+ lastSeen: now,
386
+ occurrences: count,
387
+ metadata: { component },
388
+ });
389
+ }
390
+ }
391
+ // Post-delete velocity insight
392
+ if (stats.postDeleteSprints >= 2 && stats.avgVelocityIncrease > 1.5) {
393
+ const existingInsight = store.insights.find(i => i.id === 'post-delete-velocity');
394
+ if (existingInsight) {
395
+ existingInsight.lastSeen = now;
396
+ existingInsight.occurrences = stats.postDeleteSprints;
397
+ existingInsight.message = `Deleting code has boosted your velocity ${stats.avgVelocityIncrease}x on average (${stats.postDeleteSprints} times). Trust simplification.`;
398
+ }
399
+ else {
400
+ store.insights.push({
401
+ id: 'post-delete-velocity',
402
+ type: 'pattern',
403
+ category: 'velocity',
404
+ message: `Deleting code has boosted your velocity ${stats.avgVelocityIncrease}x on average (${stats.postDeleteSprints} times). Trust simplification.`,
405
+ firstSeen: now,
406
+ lastSeen: now,
407
+ occurrences: stats.postDeleteSprints,
408
+ });
409
+ }
410
+ }
411
+ // Keep only 20 most recent/relevant insights
412
+ store.insights = store.insights
413
+ .sort((a, b) => new Date(b.lastSeen).getTime() - new Date(a.lastSeen).getTime())
414
+ .slice(0, 20);
415
+ }
416
+ /**
417
+ * Migrate old store versions
418
+ */
419
+ function migrateTimelineStore(store) {
420
+ // Handle missing or old versions
421
+ if (!store.version || store.version === '1.0.0') {
422
+ // Migrate from 1.0.0 to current
423
+ store.version = schema_1.CURRENT_SCHEMA_VERSION;
424
+ }
425
+ if (!store.insights) {
426
+ store.insights = [];
427
+ }
428
+ if (!store.patterns) {
429
+ store.patterns = createInitialStore().patterns;
430
+ }
431
+ if (!store.trends) {
432
+ store.trends = createInitialStore().trends;
433
+ }
434
+ // Ensure version is current after all migrations
435
+ store.version = schema_1.CURRENT_SCHEMA_VERSION;
436
+ return store;
437
+ }
438
+ //# sourceMappingURL=timeline-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-store.js","sourceRoot":"","sources":["../../src/storage/timeline-store.ts"],"names":[],"mappings":"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"}