@boshu2/vibe-check 1.5.0 → 1.6.1
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/insight-mining-dashboard-research-2025-11-30.md +400 -0
- package/.agents/bundles/storage-enhancement-research-2025-11-30.md +292 -0
- package/.agents/bundles/timeline-feature-research-complete-2025-11-30.md +301 -0
- package/.agents/plans/insight-dashboard-plan-2025-11-30.md +1130 -0
- package/.agents/plans/json-storage-enhancement-plan.md +717 -0
- package/.agents/plans/storage-hardening-and-cache-plan.md +592 -0
- package/.agents/plans/test-coverage-gaps-plan.md +1117 -0
- package/.agents/plans/timeline-feature-plan.md +193 -0
- package/.agents/plans/vibe_timeline_research_findings.md +553 -0
- package/.claude/settings.local.json +1 -0
- package/.vibe-check/.gitignore +6 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +24 -0
- package/CONTRIBUTING.md +227 -0
- package/README.md +165 -144
- package/claude-progress.json +191 -9
- package/claude-progress.txt +257 -0
- package/dashboard/app.js +75 -2
- package/dashboard/dashboard-data.json +653 -0
- package/dashboard/index.html +13 -0
- package/dashboard/styles.css +61 -0
- package/dist/analysis/cross-session-analysis.d.ts +68 -0
- package/dist/analysis/cross-session-analysis.d.ts.map +1 -0
- package/dist/analysis/cross-session-analysis.js +174 -0
- package/dist/analysis/cross-session-analysis.js.map +1 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +12 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +2 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +105 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/cache.d.ts +6 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +168 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/dashboard.d.ts +8 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +109 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +8 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/timeline.d.ts +14 -0
- package/dist/commands/timeline.d.ts.map +1 -0
- package/dist/commands/timeline.js +462 -0
- package/dist/commands/timeline.js.map +1 -0
- package/dist/git.d.ts +24 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +94 -0
- package/dist/git.js.map +1 -1
- package/dist/insights/generators.d.ts +44 -0
- package/dist/insights/generators.d.ts.map +1 -0
- package/dist/insights/generators.js +289 -0
- package/dist/insights/generators.js.map +1 -0
- package/dist/insights/index.d.ts +16 -0
- package/dist/insights/index.d.ts.map +1 -0
- package/dist/insights/index.js +171 -0
- package/dist/insights/index.js.map +1 -0
- package/dist/insights/types.d.ts +93 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +6 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/output/timeline-html.d.ts +6 -0
- package/dist/output/timeline-html.d.ts.map +1 -0
- package/dist/output/timeline-html.js +389 -0
- package/dist/output/timeline-html.js.map +1 -0
- package/dist/output/timeline-markdown.d.ts +6 -0
- package/dist/output/timeline-markdown.d.ts.map +1 -0
- package/dist/output/timeline-markdown.js +167 -0
- package/dist/output/timeline-markdown.js.map +1 -0
- package/dist/output/timeline.d.ts +9 -0
- package/dist/output/timeline.d.ts.map +1 -0
- package/dist/output/timeline.js +318 -0
- package/dist/output/timeline.js.map +1 -0
- package/dist/patterns/detour.d.ts +32 -0
- package/dist/patterns/detour.d.ts.map +1 -0
- package/dist/patterns/detour.js +137 -0
- package/dist/patterns/detour.js.map +1 -0
- package/dist/patterns/flow-state.d.ts +16 -0
- package/dist/patterns/flow-state.d.ts.map +1 -0
- package/dist/patterns/flow-state.js +40 -0
- package/dist/patterns/flow-state.js.map +1 -0
- package/dist/patterns/index.d.ts +8 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +22 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/intervention-effectiveness.d.ts +42 -0
- package/dist/patterns/intervention-effectiveness.d.ts.map +1 -0
- package/dist/patterns/intervention-effectiveness.js +196 -0
- package/dist/patterns/intervention-effectiveness.js.map +1 -0
- package/dist/patterns/late-night.d.ts +30 -0
- package/dist/patterns/late-night.d.ts.map +1 -0
- package/dist/patterns/late-night.js +141 -0
- package/dist/patterns/late-night.js.map +1 -0
- package/dist/patterns/post-delete-sprint.d.ts +28 -0
- package/dist/patterns/post-delete-sprint.d.ts.map +1 -0
- package/dist/patterns/post-delete-sprint.js +85 -0
- package/dist/patterns/post-delete-sprint.js.map +1 -0
- package/dist/patterns/spiral-regression.d.ts +49 -0
- package/dist/patterns/spiral-regression.d.ts.map +1 -0
- package/dist/patterns/spiral-regression.js +219 -0
- package/dist/patterns/spiral-regression.js.map +1 -0
- package/dist/patterns/thrashing.d.ts +25 -0
- package/dist/patterns/thrashing.d.ts.map +1 -0
- package/dist/patterns/thrashing.js +111 -0
- package/dist/patterns/thrashing.js.map +1 -0
- package/dist/storage/atomic.d.ts +40 -0
- package/dist/storage/atomic.d.ts.map +1 -0
- package/dist/storage/atomic.js +155 -0
- package/dist/storage/atomic.js.map +1 -0
- package/dist/storage/commit-log.d.ts +35 -0
- package/dist/storage/commit-log.d.ts.map +1 -0
- package/dist/storage/commit-log.js +128 -0
- package/dist/storage/commit-log.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +33 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/schema.d.ts +32 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +37 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/timeline-store.d.ts +117 -0
- package/dist/storage/timeline-store.d.ts.map +1 -0
- package/dist/storage/timeline-store.js +438 -0
- package/dist/storage/timeline-store.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/ARCHITECTURE.md +458 -0
- package/docs/DATA-ARCHITECTURE.md +565 -0
- package/docs/GAMIFICATION.md +564 -0
- package/docs/JSON-STORAGE-PATTERNS.md +512 -0
- package/docs/METRICS-EXPLAINED.md +394 -0
- package/docs/UNIFIED-ECOSYSTEM.md +560 -0
- package/docs/VIBE-ECOSYSTEM.md +406 -0
- package/docs/images/dashboard.png +0 -0
- package/feature-list.json +48 -0
- package/package.json +2 -1
- package/vitest.config.ts +1 -5
- package/.vibe-check/calibration.json +0 -38
- package/.vibe-check/latest.json +0 -114
- package/.vibe-check/sessions.json +0 -44
- package/PLAN-ultimate-game.md +0 -1362
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
# Insight Mining & Dashboard Research
|
|
2
|
+
|
|
3
|
+
**Type:** Research
|
|
4
|
+
**Created:** 2025-11-30
|
|
5
|
+
**Loop:** Middle (dashboard implementation) / Outer (insight system design)
|
|
6
|
+
**Tags:** dashboard, insights, visualization, chart.js
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Executive Summary
|
|
11
|
+
|
|
12
|
+
vibe-check has rich data across 5 storage files with 20+ metrics. A static HTML dashboard exists but uses mock data. The opportunity is to: (1) create an insight generation engine that surfaces actionable patterns, and (2) connect the existing dashboard to real data with real-time updates.
|
|
13
|
+
|
|
14
|
+
## Problem Statement
|
|
15
|
+
|
|
16
|
+
**Current state:**
|
|
17
|
+
- Rich data in `.vibe-check/` (profile, sessions, timeline, commits, calibration)
|
|
18
|
+
- Global profile at `~/.vibe-check/profile.json`
|
|
19
|
+
- Static dashboard shell exists with Chart.js integration
|
|
20
|
+
- Insights are scattered across commands (timeline --insights, profile, analyze --all-time)
|
|
21
|
+
|
|
22
|
+
**Gap:**
|
|
23
|
+
- No unified insight engine
|
|
24
|
+
- Dashboard shows mock data, not real data
|
|
25
|
+
- No insight prioritization or severity
|
|
26
|
+
- No progressive disclosure (surface → deep)
|
|
27
|
+
|
|
28
|
+
## Data Inventory
|
|
29
|
+
|
|
30
|
+
### Storage Files (per-repo: `.vibe-check/`)
|
|
31
|
+
|
|
32
|
+
| File | Format | Contents | Size |
|
|
33
|
+
|------|--------|----------|------|
|
|
34
|
+
| `timeline.json` | JSON | Sessions, trends, patterns, insights | ~8KB |
|
|
35
|
+
| `commits.ndjson` | NDJSON | All analyzed commits | ~8KB (55 commits) |
|
|
36
|
+
| `sessions.json` | JSON | Session history with baseline | ~2KB |
|
|
37
|
+
| `calibration.json` | JSON | Vibe level calibration samples | ~0.5KB |
|
|
38
|
+
| `latest.json` | JSON | Last analysis result | ~2KB |
|
|
39
|
+
|
|
40
|
+
### Global Storage (`~/.vibe-check/`)
|
|
41
|
+
|
|
42
|
+
| File | Contents |
|
|
43
|
+
|------|----------|
|
|
44
|
+
| `profile.json` | XP, level, streak, achievements, sessions, patterns, interventions |
|
|
45
|
+
|
|
46
|
+
### Available Metrics (20+)
|
|
47
|
+
|
|
48
|
+
**Core 5 Metrics:**
|
|
49
|
+
1. Iteration Velocity (commits/hour)
|
|
50
|
+
2. Rework Ratio (% fix commits)
|
|
51
|
+
3. Trust Pass Rate (% commits without immediate fix)
|
|
52
|
+
4. Debug Spiral Duration (avg time in fix chains)
|
|
53
|
+
5. Flow Efficiency (% time building vs debugging)
|
|
54
|
+
|
|
55
|
+
**Semantic-Free Metrics:**
|
|
56
|
+
6. File Churn Score
|
|
57
|
+
7. Time Spiral Score
|
|
58
|
+
8. Velocity Anomaly Score
|
|
59
|
+
9. Code Stability Score
|
|
60
|
+
|
|
61
|
+
**Session Metrics:**
|
|
62
|
+
10. VibeScore (0-100)
|
|
63
|
+
11. Overall Rating (ELITE/HIGH/MEDIUM/LOW)
|
|
64
|
+
12. Spiral Count
|
|
65
|
+
13. Flow State Detection
|
|
66
|
+
14. Session Duration
|
|
67
|
+
15. Feature Count
|
|
68
|
+
|
|
69
|
+
**Trend Metrics:**
|
|
70
|
+
16. Week-over-week improvements
|
|
71
|
+
17. Regression alerts
|
|
72
|
+
18. Recovery time trends
|
|
73
|
+
19. Pattern frequency
|
|
74
|
+
20. Intervention effectiveness
|
|
75
|
+
|
|
76
|
+
## Option Space Explored
|
|
77
|
+
|
|
78
|
+
### Approach A: Insight Engine Module
|
|
79
|
+
|
|
80
|
+
Create `src/insights/` module that generates prioritized insights from all data sources.
|
|
81
|
+
|
|
82
|
+
**Pros:**
|
|
83
|
+
- Clean separation of concerns
|
|
84
|
+
- Reusable across commands and dashboard
|
|
85
|
+
- Can run headless (CLI) or serve dashboard
|
|
86
|
+
- Testable insight generation logic
|
|
87
|
+
|
|
88
|
+
**Cons:**
|
|
89
|
+
- New module to maintain
|
|
90
|
+
- Need to define insight schema
|
|
91
|
+
- Requires aggregation logic
|
|
92
|
+
|
|
93
|
+
**Effort:** Medium (2-3 sessions)
|
|
94
|
+
|
|
95
|
+
### Approach B: Dashboard API Server
|
|
96
|
+
|
|
97
|
+
Add express/fastify server that serves insight API endpoints.
|
|
98
|
+
|
|
99
|
+
**Pros:**
|
|
100
|
+
- Real-time updates via polling or WebSocket
|
|
101
|
+
- Dashboard fully decoupled from CLI
|
|
102
|
+
- Could support multiple dashboards
|
|
103
|
+
|
|
104
|
+
**Cons:**
|
|
105
|
+
- Requires running server process
|
|
106
|
+
- More complex deployment
|
|
107
|
+
- Overkill for local-first tool
|
|
108
|
+
|
|
109
|
+
**Effort:** High (4-5 sessions)
|
|
110
|
+
|
|
111
|
+
### Approach C: Static JSON Export + Dashboard
|
|
112
|
+
|
|
113
|
+
CLI exports `dashboard-data.json` → static dashboard reads it.
|
|
114
|
+
|
|
115
|
+
**Pros:**
|
|
116
|
+
- Simplest architecture
|
|
117
|
+
- No server needed
|
|
118
|
+
- Works offline
|
|
119
|
+
- Dashboard is just HTML/CSS/JS
|
|
120
|
+
|
|
121
|
+
**Cons:**
|
|
122
|
+
- Manual refresh (run CLI to update)
|
|
123
|
+
- No real-time
|
|
124
|
+
- Two-step workflow
|
|
125
|
+
|
|
126
|
+
**Effort:** Low (1-2 sessions)
|
|
127
|
+
|
|
128
|
+
### Approach D: Hybrid (Recommended)
|
|
129
|
+
|
|
130
|
+
Insight engine module + `vibe-check dashboard` command that:
|
|
131
|
+
1. Exports data to JSON
|
|
132
|
+
2. Opens browser to static dashboard
|
|
133
|
+
3. Optional: watches for changes and auto-refreshes
|
|
134
|
+
|
|
135
|
+
**Pros:**
|
|
136
|
+
- Best of A and C
|
|
137
|
+
- Single command UX
|
|
138
|
+
- No server complexity
|
|
139
|
+
- Can evolve to server later
|
|
140
|
+
|
|
141
|
+
**Cons:**
|
|
142
|
+
- File-based refresh
|
|
143
|
+
- Limited real-time capability
|
|
144
|
+
|
|
145
|
+
**Effort:** Medium (2-3 sessions)
|
|
146
|
+
|
|
147
|
+
## Recommended Approach: Hybrid (D)
|
|
148
|
+
|
|
149
|
+
### Architecture
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
┌─────────────────────────────────────────────────────────┐
|
|
153
|
+
│ CLI Commands │
|
|
154
|
+
│ analyze, timeline, profile, dashboard │
|
|
155
|
+
└────────────────────┬────────────────────────────────────┘
|
|
156
|
+
│
|
|
157
|
+
▼
|
|
158
|
+
┌─────────────────────────────────────────────────────────┐
|
|
159
|
+
│ Insight Engine │
|
|
160
|
+
│ src/insights/ │
|
|
161
|
+
│ ├── generator.ts (generate insights from data) │
|
|
162
|
+
│ ├── prioritizer.ts (rank by severity/actionability) │
|
|
163
|
+
│ ├── types.ts (Insight, InsightCategory) │
|
|
164
|
+
│ └── index.ts │
|
|
165
|
+
└────────────────────┬────────────────────────────────────┘
|
|
166
|
+
│
|
|
167
|
+
▼
|
|
168
|
+
┌─────────────────────────────────────────────────────────┐
|
|
169
|
+
│ Dashboard Data Export │
|
|
170
|
+
│ src/commands/dashboard.ts │
|
|
171
|
+
│ - Aggregates all data sources │
|
|
172
|
+
│ - Generates prioritized insights │
|
|
173
|
+
│ - Exports dashboard-data.json │
|
|
174
|
+
│ - Opens browser to dashboard/index.html │
|
|
175
|
+
└────────────────────┬────────────────────────────────────┘
|
|
176
|
+
│
|
|
177
|
+
▼
|
|
178
|
+
┌─────────────────────────────────────────────────────────┐
|
|
179
|
+
│ Static Dashboard │
|
|
180
|
+
│ dashboard/ │
|
|
181
|
+
│ ├── index.html (existing, needs data binding) │
|
|
182
|
+
│ ├── app.js (load dashboard-data.json) │
|
|
183
|
+
│ └── styles.css (existing) │
|
|
184
|
+
└─────────────────────────────────────────────────────────┘
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Insight Schema
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
interface Insight {
|
|
191
|
+
id: string;
|
|
192
|
+
category: 'productivity' | 'patterns' | 'growth' | 'warning' | 'celebration';
|
|
193
|
+
severity: 'info' | 'warning' | 'critical' | 'success';
|
|
194
|
+
title: string;
|
|
195
|
+
message: string;
|
|
196
|
+
metric?: string;
|
|
197
|
+
value?: number;
|
|
198
|
+
comparison?: {
|
|
199
|
+
type: 'baseline' | 'previous' | 'goal';
|
|
200
|
+
value: number;
|
|
201
|
+
change: number;
|
|
202
|
+
};
|
|
203
|
+
action?: string; // Recommended action
|
|
204
|
+
source: string; // Where insight came from
|
|
205
|
+
timestamp: string;
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Insight Categories
|
|
210
|
+
|
|
211
|
+
| Category | Examples |
|
|
212
|
+
|----------|----------|
|
|
213
|
+
| **Productivity** | "Peak hours are 9-11am", "Best day is Thursday" |
|
|
214
|
+
| **Patterns** | "Auth scope has 60% fix ratio", "Flow states cluster in mornings" |
|
|
215
|
+
| **Growth** | "2-week improvement streak", "Trust rate up 15%" |
|
|
216
|
+
| **Warning** | "Spiral regression detected", "Late night sessions increasing" |
|
|
217
|
+
| **Celebration** | "New personal best!", "Achievement unlocked" |
|
|
218
|
+
|
|
219
|
+
### Insight Generation Rules
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
// Example insight generators
|
|
223
|
+
const insightGenerators = [
|
|
224
|
+
// Productivity
|
|
225
|
+
{ name: 'peakHours', source: 'commits', fn: analyzePeakHours },
|
|
226
|
+
{ name: 'bestDay', source: 'sessions', fn: findBestDayOfWeek },
|
|
227
|
+
{ name: 'flowTiming', source: 'timeline', fn: analyzeFlowTiming },
|
|
228
|
+
|
|
229
|
+
// Patterns
|
|
230
|
+
{ name: 'problematicScopes', source: 'commits', fn: findProblematicScopes },
|
|
231
|
+
{ name: 'spiralPatterns', source: 'profile.patternMemory', fn: analyzePatterns },
|
|
232
|
+
{ name: 'thrashingFiles', source: 'timeline', fn: findThrashingFiles },
|
|
233
|
+
|
|
234
|
+
// Growth
|
|
235
|
+
{ name: 'improvementStreak', source: 'timeline.trends', fn: detectImprovementStreak },
|
|
236
|
+
{ name: 'metricTrends', source: 'sessions', fn: calculateTrends },
|
|
237
|
+
{ name: 'levelProgress', source: 'profile', fn: showLevelProgress },
|
|
238
|
+
|
|
239
|
+
// Warnings
|
|
240
|
+
{ name: 'regressionAlert', source: 'timeline.trends', fn: detectRegressions },
|
|
241
|
+
{ name: 'lateNightWarning', source: 'commits', fn: detectLateNightPattern },
|
|
242
|
+
{ name: 'streakAtRisk', source: 'profile', fn: checkStreakRisk },
|
|
243
|
+
|
|
244
|
+
// Celebrations
|
|
245
|
+
{ name: 'personalBest', source: 'sessions', fn: checkPersonalBest },
|
|
246
|
+
{ name: 'newAchievement', source: 'profile', fn: getRecentAchievements },
|
|
247
|
+
{ name: 'milestone', source: 'profile', fn: checkMilestones },
|
|
248
|
+
];
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Dashboard Data Export Format
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
interface DashboardData {
|
|
255
|
+
version: string;
|
|
256
|
+
generatedAt: string;
|
|
257
|
+
|
|
258
|
+
// Profile summary
|
|
259
|
+
profile: {
|
|
260
|
+
level: number;
|
|
261
|
+
levelName: string;
|
|
262
|
+
xp: { current: number; next: number; total: number };
|
|
263
|
+
streak: { current: number; longest: number };
|
|
264
|
+
achievements: Achievement[];
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
// Stats
|
|
268
|
+
stats: {
|
|
269
|
+
current: { vibeScore: number; rating: string };
|
|
270
|
+
averages: { day7: number; day30: number; day90: number };
|
|
271
|
+
totals: { sessions: number; commits: number; spirals: number };
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// Charts data
|
|
275
|
+
charts: {
|
|
276
|
+
scoreTrend: Array<{ date: string; score: number }>;
|
|
277
|
+
ratingDistribution: Record<string, number>;
|
|
278
|
+
metricsRadar: Record<string, number>;
|
|
279
|
+
hourlyActivity: Record<number, number>;
|
|
280
|
+
scopeHealth: Array<{ scope: string; commits: number; fixRatio: number }>;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
// Prioritized insights
|
|
284
|
+
insights: Insight[];
|
|
285
|
+
|
|
286
|
+
// Sessions history
|
|
287
|
+
sessions: SessionRecord[];
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Dashboard Features (Priority Order)
|
|
292
|
+
|
|
293
|
+
**P0 - Core (v1.6.0):**
|
|
294
|
+
1. Connect to real data (read dashboard-data.json)
|
|
295
|
+
2. Show prioritized insights
|
|
296
|
+
3. Update existing charts with real data
|
|
297
|
+
4. `vibe-check dashboard` command
|
|
298
|
+
|
|
299
|
+
**P1 - Enhanced (v1.7.0):**
|
|
300
|
+
5. Auto-refresh on file change (fswatch or similar)
|
|
301
|
+
6. Dark/light theme toggle
|
|
302
|
+
7. Time range selector (7d, 30d, 90d, all-time)
|
|
303
|
+
8. Export/share functionality
|
|
304
|
+
|
|
305
|
+
**P2 - Advanced (v2.0.0):**
|
|
306
|
+
9. Real-time via WebSocket server
|
|
307
|
+
10. Multi-repo aggregation
|
|
308
|
+
11. Goal setting and tracking
|
|
309
|
+
12. Custom insight rules
|
|
310
|
+
|
|
311
|
+
## Tracer Tests Required
|
|
312
|
+
|
|
313
|
+
| Assumption | Tracer Test | Time | Validates |
|
|
314
|
+
|------------|-------------|------|-----------|
|
|
315
|
+
| Dashboard can read local JSON | Create test JSON, load in browser | 10m | File:// protocol works |
|
|
316
|
+
| Chart.js handles our data shape | Mock data in current format | 15m | No schema issues |
|
|
317
|
+
| `open` command works cross-platform | Test on macOS | 5m | Browser opening |
|
|
318
|
+
|
|
319
|
+
**Total tracer investment:** 30 minutes
|
|
320
|
+
**Risk if skipped:** Dashboard may not load data correctly
|
|
321
|
+
|
|
322
|
+
## Failure Pattern Risks
|
|
323
|
+
|
|
324
|
+
| Pattern | Risk Level | Mitigation |
|
|
325
|
+
|---------|------------|------------|
|
|
326
|
+
| Context Amnesia | Low | Bundle captures full design |
|
|
327
|
+
| Scope Creep | Medium | Strict P0/P1/P2 prioritization |
|
|
328
|
+
| Over-engineering | Medium | Start with static JSON, evolve |
|
|
329
|
+
|
|
330
|
+
## PDC Strategy
|
|
331
|
+
|
|
332
|
+
- **Prevent:** Clear scope definition, phased approach
|
|
333
|
+
- **Detect:** Manual testing after each phase
|
|
334
|
+
- **Correct:** Revert to simpler approach if complexity grows
|
|
335
|
+
|
|
336
|
+
## Implementation Plan (Phase 1: P0)
|
|
337
|
+
|
|
338
|
+
### Step 1: Create Insight Engine (40m)
|
|
339
|
+
```
|
|
340
|
+
src/insights/
|
|
341
|
+
├── types.ts - Insight interface, categories
|
|
342
|
+
├── generator.ts - Insight generation functions
|
|
343
|
+
├── prioritizer.ts - Sort by severity, recency
|
|
344
|
+
└── index.ts - Main export
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Step 2: Create Dashboard Command (30m)
|
|
348
|
+
```
|
|
349
|
+
src/commands/dashboard.ts
|
|
350
|
+
- Load all data sources
|
|
351
|
+
- Generate insights via engine
|
|
352
|
+
- Export dashboard-data.json to dashboard/
|
|
353
|
+
- Open browser to dashboard/index.html
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Step 3: Update Dashboard App (45m)
|
|
357
|
+
```
|
|
358
|
+
dashboard/app.js
|
|
359
|
+
- Replace getMockProfile() with fetch('dashboard-data.json')
|
|
360
|
+
- Map data to existing UI components
|
|
361
|
+
- Add insights section
|
|
362
|
+
- Handle loading states
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Step 4: Add Insights UI (30m)
|
|
366
|
+
```
|
|
367
|
+
dashboard/index.html
|
|
368
|
+
- Add insights panel/section
|
|
369
|
+
- Style insight cards by severity
|
|
370
|
+
- Add insight icons by category
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Step 5: Test & Polish (25m)
|
|
374
|
+
- Test full flow: CLI → JSON → Dashboard
|
|
375
|
+
- Fix any data mapping issues
|
|
376
|
+
- Ensure charts render correctly
|
|
377
|
+
|
|
378
|
+
**Total estimated time:** ~3 hours
|
|
379
|
+
|
|
380
|
+
## Open Questions
|
|
381
|
+
|
|
382
|
+
- [ ] Should dashboard auto-open on every `timeline` run? (Probably no)
|
|
383
|
+
- [ ] Support custom dashboard port for local server mode? (Future)
|
|
384
|
+
- [ ] Include raw data export option? (Maybe --export-data flag)
|
|
385
|
+
|
|
386
|
+
## Token Stats
|
|
387
|
+
|
|
388
|
+
- Research tokens: ~25k
|
|
389
|
+
- Bundle tokens: ~4k
|
|
390
|
+
- Compression ratio: 6:1
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Sources
|
|
395
|
+
|
|
396
|
+
- [Jellyfish Developer Productivity Dashboard](https://jellyfish.co/library/developer-productivity/dashboard/)
|
|
397
|
+
- [Tinybird Real-Time Dashboard Guide](https://www.tinybird.co/blog-posts/real-time-dashboard-step-by-step)
|
|
398
|
+
- [Building Real-Time Dashboards with JavaScript](https://softwarehouse.au/blog/building-real-time-dashboards-with-javascript-frameworks-a-practical-tutorial/)
|
|
399
|
+
- [Luzmo Data Visualization Trends](https://www.luzmo.com/blog/data-visualization-trends)
|
|
400
|
+
- [Dashboard UI/UX Design Guidelines 2024](https://www.qdexitechnology.com/blog/the-top-10-essential-dashboard-ui-ux-design-guidelines-for-2024)
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Storage Enhancement Research: Utilizing NDJSON for vibe-check Mission
|
|
2
|
+
|
|
3
|
+
**Type:** Research Synthesis
|
|
4
|
+
**Created:** 2025-11-30
|
|
5
|
+
**Agents:** 3 parallel (Landscape, Patterns, Constraints)
|
|
6
|
+
**Status:** Complete
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Executive Summary
|
|
11
|
+
|
|
12
|
+
The new storage layer (atomic.ts, commit-log.ts, schema.ts) transforms vibe-check from **point-in-time analysis** to **longitudinal productivity intelligence**. This research identifies 12 enhancement opportunities, prioritized by effort/impact, with immediate fixes for security gaps.
|
|
13
|
+
|
|
14
|
+
**Key Finding:** NDJSON enables complete event history that unlocks cross-session queries, regression detection, and predictive insights—all while maintaining git-friendly diffs.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Current Architecture (Agent 1)
|
|
19
|
+
|
|
20
|
+
### Storage Locations
|
|
21
|
+
|
|
22
|
+
| Location | Purpose | Format |
|
|
23
|
+
|----------|---------|--------|
|
|
24
|
+
| `~/.vibe-check/profile.json` | XP, streaks, achievements | JSON |
|
|
25
|
+
| `.vibe-check/timeline.json` | Sessions, insights, trends | JSON |
|
|
26
|
+
| `.vibe-check/commits.ndjson` | Append-only commit log (NEW) | NDJSON |
|
|
27
|
+
| `.vibe-check/sessions.json` | Auto-detected sessions | JSON |
|
|
28
|
+
| `.vibe-check/calibration.json` | Level calibration | JSON |
|
|
29
|
+
|
|
30
|
+
### Data Flow
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Git commits → getCommits() → buildTimeline() → updateStore() → timeline.json
|
|
34
|
+
↓ ↓
|
|
35
|
+
detectSessions() detectPatterns()
|
|
36
|
+
↓ ↓
|
|
37
|
+
TimelineSession[] flowState, spirals, detours, thrashing
|
|
38
|
+
↓
|
|
39
|
+
recordSession() → profile.json (XP, achievements)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 7 Commands & Their Data Needs
|
|
43
|
+
|
|
44
|
+
| Command | Reads | Writes | Storage Gap |
|
|
45
|
+
|---------|-------|--------|-------------|
|
|
46
|
+
| `analyze` | git, latest.json | profile, sessions, latest | No commit log integration |
|
|
47
|
+
| `timeline` | git, timeline.json | timeline.json | ✓ Uses new storage |
|
|
48
|
+
| `profile` | profile.json | - | No cross-repo aggregation |
|
|
49
|
+
| `start` | session.json | session.json | - |
|
|
50
|
+
| `watch` | git (in-memory) | - | **No persistence** |
|
|
51
|
+
| `intervene` | profile.json | profile.json | - |
|
|
52
|
+
| `init-hook` | - | .git/hooks | No execution history |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Enhancement Opportunities (Agent 2)
|
|
57
|
+
|
|
58
|
+
### Priority Matrix
|
|
59
|
+
|
|
60
|
+
| # | Opportunity | Effort | Impact | Priority |
|
|
61
|
+
|---|-------------|--------|--------|----------|
|
|
62
|
+
| 1 | Multi-session queries | Medium | High | **P0** |
|
|
63
|
+
| 2 | Spiral regression detection | High | High | **P0** |
|
|
64
|
+
| 3 | Scope-based analysis | High | High | **P0** |
|
|
65
|
+
| 4 | Intervention effectiveness | Medium | High | **P0** |
|
|
66
|
+
| 5 | Recovery time trends | Medium | High | **P0** |
|
|
67
|
+
| 6 | Commitment validation | Medium | Medium | P1 |
|
|
68
|
+
| 7 | Hourly/daily rollups | Medium | Medium | P1 |
|
|
69
|
+
| 8 | Productivity evolution | Low | Medium | P1 |
|
|
70
|
+
| 9 | Seasonal patterns | Medium | Medium | P1 |
|
|
71
|
+
| 10 | Session clustering | High | Medium | P2 |
|
|
72
|
+
| 11 | Spiral prediction | Very High | Medium | P2 |
|
|
73
|
+
| 12 | Multi-repo aggregation | Very High | High | P3 |
|
|
74
|
+
|
|
75
|
+
### Top 5 Enhancements (P0)
|
|
76
|
+
|
|
77
|
+
#### 1. Multi-Session Queries
|
|
78
|
+
**What:** Query all commits.ndjson to answer:
|
|
79
|
+
- "Which scope has most spirals?"
|
|
80
|
+
- "What's my spiral rate by hour?"
|
|
81
|
+
- "Average session length by day of week?"
|
|
82
|
+
|
|
83
|
+
**Implementation:**
|
|
84
|
+
```typescript
|
|
85
|
+
// src/analysis/cross-session-analysis.ts
|
|
86
|
+
export function queryCommits(commits: Commit[], filter: QueryFilter): Commit[]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Integration:** Add `--all-time` flag to `analyze` command
|
|
90
|
+
|
|
91
|
+
#### 2. Spiral Regression Detection
|
|
92
|
+
**What:** Alert when spiral patterns re-emerge after improvement.
|
|
93
|
+
|
|
94
|
+
**Example:**
|
|
95
|
+
- Week 1-4: 2 spirals/week
|
|
96
|
+
- Week 5-8: 0.5 spirals/week (improvement!)
|
|
97
|
+
- Week 9: 3 spirals/week → **ALERT: Regression detected**
|
|
98
|
+
|
|
99
|
+
**Implementation:**
|
|
100
|
+
```typescript
|
|
101
|
+
// src/patterns/spiral-regression.ts
|
|
102
|
+
export function detectRegressions(trends: TrendData): RegressionAlert[]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### 3. Scope-Based Analysis
|
|
106
|
+
**What:** Track productivity per code scope (auth, database, ui).
|
|
107
|
+
|
|
108
|
+
**Output:**
|
|
109
|
+
```
|
|
110
|
+
Scope: auth
|
|
111
|
+
Commits: 156 (12% of total)
|
|
112
|
+
Spirals: 8 (0.051 per commit)
|
|
113
|
+
Avg fix time: 34 minutes
|
|
114
|
+
Top pattern: SECRETS_AUTH (5x)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### 4. Intervention Effectiveness
|
|
118
|
+
**What:** Score each intervention by how well it breaks spirals.
|
|
119
|
+
|
|
120
|
+
**Output:**
|
|
121
|
+
```
|
|
122
|
+
Tracer tests: 8/10 effective (80%) | 12 min resolution
|
|
123
|
+
Taking a break: 4/6 effective (67%) | 18 min resolution
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### 5. Recovery Time Trends
|
|
127
|
+
**What:** Track if recovery time per spiral type is improving.
|
|
128
|
+
|
|
129
|
+
**Insight:** "SSL/TLS spirals: 45 min → 32 min → 28 min. Keep it up!"
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Constraints & Risks (Agent 3)
|
|
134
|
+
|
|
135
|
+
### Critical Issues (Fix Now)
|
|
136
|
+
|
|
137
|
+
| Issue | Severity | Fix |
|
|
138
|
+
|-------|----------|-----|
|
|
139
|
+
| **No .gitignore enforcement** | HIGH | Create on first run |
|
|
140
|
+
| **Schema version hardcoded** | MEDIUM | Use CURRENT_SCHEMA_VERSION |
|
|
141
|
+
| **NDJSON bad line fails all** | MEDIUM | Skip bad lines gracefully |
|
|
142
|
+
| **--insights undocumented** | LOW | Add to help text |
|
|
143
|
+
|
|
144
|
+
### Technical Constraints
|
|
145
|
+
|
|
146
|
+
| Constraint | Current | Risk |
|
|
147
|
+
|------------|---------|------|
|
|
148
|
+
| File size (1 year) | ~500 KB | GREEN |
|
|
149
|
+
| File size (10 years) | ~5 MB | YELLOW |
|
|
150
|
+
| Read performance | O(n) | GREEN (<20ms for 10K lines) |
|
|
151
|
+
| Duplicate detection | O(n) per append | YELLOW (acceptable) |
|
|
152
|
+
| Windows atomic rename | Not guaranteed | LOW |
|
|
153
|
+
|
|
154
|
+
### Privacy Concerns
|
|
155
|
+
|
|
156
|
+
**Sensitive data stored:**
|
|
157
|
+
- Work timing patterns (when you code)
|
|
158
|
+
- Component names (architecture leak)
|
|
159
|
+
- Author names (in commit-log)
|
|
160
|
+
- Productivity metrics (embarrassing if shared)
|
|
161
|
+
|
|
162
|
+
**Recommendation:**
|
|
163
|
+
1. Enforce `.gitignore` on first run
|
|
164
|
+
2. Add `vibe-check cache clear` command
|
|
165
|
+
3. Document data sensitivity
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Recommended Implementation Path
|
|
170
|
+
|
|
171
|
+
### Phase 1: Hardening (v1.5.1) - This Week
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
[ ] Fix .gitignore enforcement
|
|
175
|
+
[ ] Fix schema versioning
|
|
176
|
+
[ ] Improve NDJSON error handling
|
|
177
|
+
[ ] Document --insights and --no-cache
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Files to modify:**
|
|
181
|
+
- `src/storage/timeline-store.ts` (schema version)
|
|
182
|
+
- `src/storage/atomic.ts` (NDJSON error handling)
|
|
183
|
+
- `src/commands/timeline.ts` (help text)
|
|
184
|
+
|
|
185
|
+
### Phase 2: Query Foundation (v1.6.0) - Next Week
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
[ ] Create src/analysis/cross-session-analysis.ts
|
|
189
|
+
[ ] Add vibe-check analyze --all-time
|
|
190
|
+
[ ] Add vibe-check analyze --scope <scope>
|
|
191
|
+
[ ] Add vibe-check cache status/clear
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Phase 3: Intelligence (v1.7.0)
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
[ ] Spiral regression detection
|
|
198
|
+
[ ] Intervention effectiveness scoring
|
|
199
|
+
[ ] Recovery time trend tracking
|
|
200
|
+
[ ] Scope health reports
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Phase 4: Advanced Analytics (v2.0.0)
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
[ ] Seasonal pattern detection
|
|
207
|
+
[ ] Productivity evolution index
|
|
208
|
+
[ ] Session clustering
|
|
209
|
+
[ ] Predictive spiral warnings
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Integration Points
|
|
215
|
+
|
|
216
|
+
### Where New Features Fit
|
|
217
|
+
|
|
218
|
+
| Feature | File | Function |
|
|
219
|
+
|---------|------|----------|
|
|
220
|
+
| Cross-session queries | NEW: `src/analysis/cross-session-analysis.ts` | `queryCommits()` |
|
|
221
|
+
| Regression detection | NEW: `src/patterns/spiral-regression.ts` | `detectRegressions()` |
|
|
222
|
+
| Scope analysis | NEW: `src/analysis/scope-analysis.ts` | `analyzeScopeHealth()` |
|
|
223
|
+
| Rollups | NEW: `src/storage/rollups.ts` | `computeDailyRollup()` |
|
|
224
|
+
| Cache commands | NEW: `src/commands/cache.ts` | `clear()`, `status()` |
|
|
225
|
+
|
|
226
|
+
### Existing Code to Leverage
|
|
227
|
+
|
|
228
|
+
| Existing | Location | Reuse For |
|
|
229
|
+
|----------|----------|-----------|
|
|
230
|
+
| Pattern memory | `src/gamification/pattern-memory.ts` | Regression detection |
|
|
231
|
+
| Intervention memory | `src/gamification/intervention-memory.ts` | Effectiveness scoring |
|
|
232
|
+
| Trend data | `src/storage/timeline-store.ts` | Seasonal analysis |
|
|
233
|
+
| Session detection | `src/commands/timeline.ts` | Clustering |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## NDJSON Power Unlocks
|
|
238
|
+
|
|
239
|
+
### Before (Point-in-Time)
|
|
240
|
+
- Single `vibe-check timeline` run
|
|
241
|
+
- Limited to last 500 sessions
|
|
242
|
+
- Can't answer "How am I trending?"
|
|
243
|
+
|
|
244
|
+
### After (Longitudinal)
|
|
245
|
+
- Complete event history (never lost)
|
|
246
|
+
- Query all time: "Show me all auth spirals ever"
|
|
247
|
+
- Trends automatic: week-over-week comparison
|
|
248
|
+
- Insights emerge: regression detection, commitment tracking
|
|
249
|
+
- Foundation for team analytics: multi-repo aggregation
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Key Metrics Enabled
|
|
254
|
+
|
|
255
|
+
| Metric | Data Source | Value |
|
|
256
|
+
|--------|-------------|-------|
|
|
257
|
+
| Spiral rate by scope | commits.ndjson | Find architectural weak spots |
|
|
258
|
+
| Recovery time trend | pattern-memory | Track improvement |
|
|
259
|
+
| Intervention effectiveness | intervention-memory | Data-driven recommendations |
|
|
260
|
+
| Seasonal patterns | commits.ndjson timestamps | Schedule deep work |
|
|
261
|
+
| Regression alerts | weekly trends | Early warning system |
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Quick Wins (< 1 Hour Each)
|
|
266
|
+
|
|
267
|
+
1. **Fix schema version** - 5 min
|
|
268
|
+
2. **Add NDJSON error recovery** - 15 min
|
|
269
|
+
3. **Document --insights flag** - 5 min
|
|
270
|
+
4. **Add .gitignore check** - 20 min
|
|
271
|
+
5. **Add cache status command** - 30 min
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Next Steps
|
|
276
|
+
|
|
277
|
+
1. **Implement Phase 1 fixes** (hardening)
|
|
278
|
+
2. **Create cross-session-analysis.ts** (query foundation)
|
|
279
|
+
3. **Add --scope flag to analyze** (scope analysis)
|
|
280
|
+
4. **Build regression detection** (intelligence layer)
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Files for Reference
|
|
285
|
+
|
|
286
|
+
| Category | Files |
|
|
287
|
+
|----------|-------|
|
|
288
|
+
| New Storage | `src/storage/atomic.ts`, `commit-log.ts`, `schema.ts` |
|
|
289
|
+
| Timeline | `src/storage/timeline-store.ts`, `src/commands/timeline.ts` |
|
|
290
|
+
| Patterns | `src/patterns/*.ts` (6 detectors) |
|
|
291
|
+
| Gamification | `src/gamification/pattern-memory.ts`, `intervention-memory.ts` |
|
|
292
|
+
| Documentation | `docs/DATA-ARCHITECTURE.md`, `docs/JSON-STORAGE-PATTERNS.md` |
|