@boshu2/vibe-check 1.4.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.
- 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 +200 -143
- package/claude-progress.json +200 -12
- package/claude-progress.txt +310 -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/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +140 -31
- package/dist/commands/profile.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/gamification/badges.d.ts +29 -0
- package/dist/gamification/badges.d.ts.map +1 -0
- package/dist/gamification/badges.js +114 -0
- package/dist/gamification/badges.js.map +1 -0
- package/dist/gamification/challenges.d.ts +42 -0
- package/dist/gamification/challenges.d.ts.map +1 -0
- package/dist/gamification/challenges.js +184 -0
- package/dist/gamification/challenges.js.map +1 -0
- package/dist/gamification/hall-of-fame.d.ts +17 -0
- package/dist/gamification/hall-of-fame.d.ts.map +1 -0
- package/dist/gamification/hall-of-fame.js +64 -0
- package/dist/gamification/hall-of-fame.js.map +1 -0
- package/dist/gamification/leaderboards.d.ts +49 -0
- package/dist/gamification/leaderboards.d.ts.map +1 -0
- package/dist/gamification/leaderboards.js +179 -0
- package/dist/gamification/leaderboards.js.map +1 -0
- package/dist/gamification/share.d.ts +29 -0
- package/dist/gamification/share.d.ts.map +1 -0
- package/dist/gamification/share.js +57 -0
- package/dist/gamification/share.js.map +1 -0
- package/dist/gamification/stats.d.ts +34 -0
- package/dist/gamification/stats.d.ts.map +1 -0
- package/dist/gamification/stats.js +91 -0
- package/dist/gamification/stats.js.map +1 -0
- package/dist/gamification/streaks.d.ts +9 -1
- package/dist/gamification/streaks.d.ts.map +1 -1
- package/dist/gamification/streaks.js +37 -4
- package/dist/gamification/streaks.js.map +1 -1
- package/dist/gamification/types.d.ts +35 -0
- package/dist/gamification/types.d.ts.map +1 -1
- package/dist/gamification/types.js +11 -3
- package/dist/gamification/types.js.map +1 -1
- package/dist/gamification/xp.d.ts +6 -2
- package/dist/gamification/xp.d.ts.map +1 -1
- package/dist/gamification/xp.js +27 -5
- package/dist/gamification/xp.js.map +1 -1
- package/dist/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/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +39 -0
- package/dist/output/terminal.js.map +1 -1
- 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/feature-list.json +103 -1
- 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 -34
|
@@ -0,0 +1,168 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createCacheCommand = createCacheCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const storage_1 = require("../storage");
|
|
45
|
+
function createCacheCommand() {
|
|
46
|
+
const cmd = new commander_1.Command('cache')
|
|
47
|
+
.description('Manage local vibe-check cache and storage')
|
|
48
|
+
.option('-r, --repo <path>', 'Repository path', process.cwd());
|
|
49
|
+
cmd
|
|
50
|
+
.command('status')
|
|
51
|
+
.description('Show cache status and storage statistics')
|
|
52
|
+
.action(async () => {
|
|
53
|
+
const options = cmd.opts();
|
|
54
|
+
await runCacheStatus(options);
|
|
55
|
+
});
|
|
56
|
+
cmd
|
|
57
|
+
.command('clear')
|
|
58
|
+
.description('Clear all cached data (sessions, commits, insights)')
|
|
59
|
+
.option('--force', 'Skip confirmation prompt')
|
|
60
|
+
.action(async (clearOptions) => {
|
|
61
|
+
const options = cmd.opts();
|
|
62
|
+
await runCacheClear(options, clearOptions.force);
|
|
63
|
+
});
|
|
64
|
+
return cmd;
|
|
65
|
+
}
|
|
66
|
+
async function runCacheStatus(options) {
|
|
67
|
+
const { repo } = options;
|
|
68
|
+
const storeDir = (0, storage_1.getStoreDir)(repo);
|
|
69
|
+
const timelinePath = (0, storage_1.getStorePath)(repo);
|
|
70
|
+
const commitLogPath = (0, storage_1.getCommitLogPath)(repo);
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(chalk_1.default.bold.cyan('Cache Status'));
|
|
73
|
+
console.log(chalk_1.default.gray('ā'.repeat(40)));
|
|
74
|
+
// Check if store directory exists
|
|
75
|
+
if (!fs.existsSync(storeDir)) {
|
|
76
|
+
console.log(chalk_1.default.yellow('No cache found. Run `vibe-check timeline` to create one.'));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log(chalk_1.default.white(`Location: ${storeDir}`));
|
|
80
|
+
console.log('');
|
|
81
|
+
// Timeline store
|
|
82
|
+
if (fs.existsSync(timelinePath)) {
|
|
83
|
+
const stats = fs.statSync(timelinePath);
|
|
84
|
+
const sizeKb = (stats.size / 1024).toFixed(1);
|
|
85
|
+
try {
|
|
86
|
+
const content = fs.readFileSync(timelinePath, 'utf-8');
|
|
87
|
+
const store = JSON.parse(content);
|
|
88
|
+
console.log(chalk_1.default.bold.white('Timeline Store:'));
|
|
89
|
+
console.log(` Version: ${store.version || 'unknown'}`);
|
|
90
|
+
console.log(` Sessions: ${store.sessions?.length || 0}`);
|
|
91
|
+
console.log(` Insights: ${store.insights?.length || 0}`);
|
|
92
|
+
console.log(` Size: ${sizeKb} KB`);
|
|
93
|
+
console.log(` Last updated: ${store.lastUpdated || 'unknown'}`);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
console.log(chalk_1.default.yellow(` Timeline store exists but couldn't be read (${sizeKb} KB)`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(chalk_1.default.gray('Timeline Store: not found'));
|
|
101
|
+
}
|
|
102
|
+
console.log('');
|
|
103
|
+
// Commit log (NDJSON)
|
|
104
|
+
if (fs.existsSync(commitLogPath)) {
|
|
105
|
+
const stats = fs.statSync(commitLogPath);
|
|
106
|
+
const sizeKb = (stats.size / 1024).toFixed(1);
|
|
107
|
+
const result = (0, storage_1.readNdjsonWithErrors)(commitLogPath);
|
|
108
|
+
console.log(chalk_1.default.bold.white('Commit Log (NDJSON):'));
|
|
109
|
+
console.log(` Commits: ${result.items.length}`);
|
|
110
|
+
if (result.errors > 0) {
|
|
111
|
+
console.log(chalk_1.default.yellow(` Malformed lines: ${result.errors}`));
|
|
112
|
+
}
|
|
113
|
+
console.log(` Size: ${sizeKb} KB`);
|
|
114
|
+
// Show date range
|
|
115
|
+
if (result.items.length > 0) {
|
|
116
|
+
const sorted = [...result.items].sort((a, b) => new Date(a.d).getTime() - new Date(b.d).getTime());
|
|
117
|
+
const oldest = new Date(sorted[0].d).toLocaleDateString();
|
|
118
|
+
const newest = new Date(sorted[sorted.length - 1].d).toLocaleDateString();
|
|
119
|
+
console.log(` Date range: ${oldest} - ${newest}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(chalk_1.default.gray('Commit Log: not found'));
|
|
124
|
+
}
|
|
125
|
+
console.log('');
|
|
126
|
+
// Check for .gitignore
|
|
127
|
+
const gitignorePath = path.join(storeDir, '.gitignore');
|
|
128
|
+
if (fs.existsSync(gitignorePath)) {
|
|
129
|
+
console.log(chalk_1.default.green('.gitignore: present'));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
console.log(chalk_1.default.yellow('.gitignore: missing (data may be committed!)'));
|
|
133
|
+
}
|
|
134
|
+
console.log('');
|
|
135
|
+
}
|
|
136
|
+
async function runCacheClear(options, force) {
|
|
137
|
+
const { repo } = options;
|
|
138
|
+
const storeDir = (0, storage_1.getStoreDir)(repo);
|
|
139
|
+
if (!fs.existsSync(storeDir)) {
|
|
140
|
+
console.log(chalk_1.default.yellow('No cache found to clear.'));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (!force) {
|
|
144
|
+
console.log(chalk_1.default.yellow('Warning: This will delete all cached vibe-check data.'));
|
|
145
|
+
console.log(chalk_1.default.gray(`Location: ${storeDir}`));
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log(chalk_1.default.white('Run with --force to confirm, or press Ctrl+C to cancel.'));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Delete all files except .gitignore
|
|
151
|
+
const files = fs.readdirSync(storeDir);
|
|
152
|
+
let deleted = 0;
|
|
153
|
+
for (const file of files) {
|
|
154
|
+
if (file === '.gitignore')
|
|
155
|
+
continue;
|
|
156
|
+
const filePath = path.join(storeDir, file);
|
|
157
|
+
try {
|
|
158
|
+
fs.unlinkSync(filePath);
|
|
159
|
+
deleted++;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error(chalk_1.default.red(`Failed to delete: ${file}`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
console.log(chalk_1.default.green(`Cleared ${deleted} file(s) from cache.`));
|
|
166
|
+
console.log(chalk_1.default.gray('Run `vibe-check timeline` to rebuild.'));
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAWhD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createDashboardCommand = createDashboardCommand;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const insights_1 = require("../insights");
|
|
46
|
+
function createDashboardCommand() {
|
|
47
|
+
const cmd = new commander_1.Command('dashboard')
|
|
48
|
+
.description('Open the vibe-check dashboard with your stats')
|
|
49
|
+
.option('-r, --repo <path>', 'Repository path', process.cwd())
|
|
50
|
+
.option('--no-open', 'Export data without opening browser')
|
|
51
|
+
.option('-o, --output <file>', 'Custom output path for dashboard-data.json')
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
await runDashboard(options);
|
|
54
|
+
});
|
|
55
|
+
return cmd;
|
|
56
|
+
}
|
|
57
|
+
async function runDashboard(options) {
|
|
58
|
+
const { repo, open, output } = options;
|
|
59
|
+
console.log(chalk_1.default.cyan('Building dashboard data...'));
|
|
60
|
+
try {
|
|
61
|
+
// Build dashboard data
|
|
62
|
+
const data = (0, insights_1.buildDashboardData)(repo);
|
|
63
|
+
// Determine output path - use the dashboard directory in the package
|
|
64
|
+
const dashboardDir = path.join(__dirname, '../../dashboard');
|
|
65
|
+
const outputPath = output || path.join(dashboardDir, 'dashboard-data.json');
|
|
66
|
+
// Ensure dashboard directory exists
|
|
67
|
+
if (!fs.existsSync(dashboardDir)) {
|
|
68
|
+
console.error(chalk_1.default.red('Dashboard directory not found'));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
// Write data
|
|
72
|
+
fs.writeFileSync(outputPath, JSON.stringify(data, null, 2));
|
|
73
|
+
console.log(chalk_1.default.green(`Data exported to ${outputPath}`));
|
|
74
|
+
// Show summary
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(chalk_1.default.bold('Dashboard Summary:'));
|
|
77
|
+
console.log(` Level: ${data.profile.levelIcon} ${data.profile.level} ${data.profile.levelName}`);
|
|
78
|
+
console.log(` Streak: š„ ${data.profile.streak.current} days`);
|
|
79
|
+
console.log(` Sessions: ${data.stats.totals.sessions}`);
|
|
80
|
+
console.log(` Insights: ${data.insights.length} generated`);
|
|
81
|
+
console.log('');
|
|
82
|
+
// Open browser
|
|
83
|
+
if (open) {
|
|
84
|
+
const htmlPath = path.join(dashboardDir, 'index.html');
|
|
85
|
+
const url = `file://${htmlPath}`;
|
|
86
|
+
console.log(chalk_1.default.cyan('Opening dashboard...'));
|
|
87
|
+
// Cross-platform open command
|
|
88
|
+
const openCmd = process.platform === 'darwin' ? 'open' :
|
|
89
|
+
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
90
|
+
(0, child_process_1.exec)(`${openCmd} "${url}"`, (error) => {
|
|
91
|
+
if (error) {
|
|
92
|
+
console.log(chalk_1.default.yellow('Could not open browser automatically.'));
|
|
93
|
+
console.log(chalk_1.default.gray(`Open manually: ${url}`));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const htmlPath = path.join(dashboardDir, 'index.html');
|
|
99
|
+
console.log(chalk_1.default.gray(`Open dashboard: file://${htmlPath}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error instanceof Error) {
|
|
104
|
+
console.error(chalk_1.default.red(`Error: ${error.message}`));
|
|
105
|
+
}
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -4,4 +4,7 @@ export { createProfileCommand } from './profile';
|
|
|
4
4
|
export { createInitHookCommand } from './init-hook';
|
|
5
5
|
export { createWatchCommand } from './watch';
|
|
6
6
|
export { createInterveneCommand } from './intervene';
|
|
7
|
+
export { createTimelineCommand, runTimeline, TimelineOptions } from './timeline';
|
|
8
|
+
export { createCacheCommand } from './cache';
|
|
9
|
+
export { createDashboardCommand } from './dashboard';
|
|
7
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createInterveneCommand = exports.createWatchCommand = exports.createInitHookCommand = exports.createProfileCommand = exports.createStartCommand = exports.runAnalyze = exports.createAnalyzeCommand = void 0;
|
|
3
|
+
exports.createDashboardCommand = exports.createCacheCommand = exports.runTimeline = exports.createTimelineCommand = exports.createInterveneCommand = exports.createWatchCommand = exports.createInitHookCommand = exports.createProfileCommand = exports.createStartCommand = exports.runAnalyze = exports.createAnalyzeCommand = void 0;
|
|
4
4
|
var analyze_1 = require("./analyze");
|
|
5
5
|
Object.defineProperty(exports, "createAnalyzeCommand", { enumerable: true, get: function () { return analyze_1.createAnalyzeCommand; } });
|
|
6
6
|
Object.defineProperty(exports, "runAnalyze", { enumerable: true, get: function () { return analyze_1.runAnalyze; } });
|
|
@@ -14,4 +14,11 @@ var watch_1 = require("./watch");
|
|
|
14
14
|
Object.defineProperty(exports, "createWatchCommand", { enumerable: true, get: function () { return watch_1.createWatchCommand; } });
|
|
15
15
|
var intervene_1 = require("./intervene");
|
|
16
16
|
Object.defineProperty(exports, "createInterveneCommand", { enumerable: true, get: function () { return intervene_1.createInterveneCommand; } });
|
|
17
|
+
var timeline_1 = require("./timeline");
|
|
18
|
+
Object.defineProperty(exports, "createTimelineCommand", { enumerable: true, get: function () { return timeline_1.createTimelineCommand; } });
|
|
19
|
+
Object.defineProperty(exports, "runTimeline", { enumerable: true, get: function () { return timeline_1.runTimeline; } });
|
|
20
|
+
var cache_1 = require("./cache");
|
|
21
|
+
Object.defineProperty(exports, "createCacheCommand", { enumerable: true, get: function () { return cache_1.createCacheCommand; } });
|
|
22
|
+
var dashboard_1 = require("./dashboard");
|
|
23
|
+
Object.defineProperty(exports, "createDashboardCommand", { enumerable: true, get: function () { return dashboard_1.createDashboardCommand; } });
|
|
17
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA,qCAA6E;AAApE,+GAAA,oBAAoB,OAAA;AAAE,qGAAA,UAAU,OAAA;AACzC,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,qCAAiD;AAAxC,+GAAA,oBAAoB,OAAA;AAC7B,yCAAoD;AAA3C,kHAAA,qBAAqB,OAAA;AAC9B,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,yCAAqD;AAA5C,mHAAA,sBAAsB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA,qCAA6E;AAApE,+GAAA,oBAAoB,OAAA;AAAE,qGAAA,UAAU,OAAA;AACzC,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,qCAAiD;AAAxC,+GAAA,oBAAoB,OAAA;AAC7B,yCAAoD;AAA3C,kHAAA,qBAAqB,OAAA;AAC9B,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,yCAAqD;AAA5C,mHAAA,sBAAsB,OAAA;AAC/B,uCAAiF;AAAxE,iHAAA,qBAAqB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAC3C,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA;AAC3B,yCAAqD;AAA5C,mHAAA,sBAAsB,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,oBAAoB,IAAI,OAAO,CAmB9C;AAkZD,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
|
package/dist/commands/profile.js
CHANGED
|
@@ -8,11 +8,18 @@ exports.runProfile2 = runProfile2;
|
|
|
8
8
|
const commander_1 = require("commander");
|
|
9
9
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
10
|
const profile_1 = require("../gamification/profile");
|
|
11
|
+
const streaks_1 = require("../gamification/streaks");
|
|
11
12
|
const xp_1 = require("../gamification/xp");
|
|
12
13
|
const types_1 = require("../gamification/types");
|
|
13
14
|
const achievements_1 = require("../gamification/achievements");
|
|
14
15
|
const pattern_memory_1 = require("../gamification/pattern-memory");
|
|
15
16
|
const intervention_memory_1 = require("../gamification/intervention-memory");
|
|
17
|
+
const challenges_1 = require("../gamification/challenges");
|
|
18
|
+
const leaderboards_1 = require("../gamification/leaderboards");
|
|
19
|
+
const hall_of_fame_1 = require("../gamification/hall-of-fame");
|
|
20
|
+
const stats_1 = require("../gamification/stats");
|
|
21
|
+
const badges_1 = require("../gamification/badges");
|
|
22
|
+
const share_1 = require("../gamification/share");
|
|
16
23
|
function createProfileCommand() {
|
|
17
24
|
const cmd = new commander_1.Command('profile')
|
|
18
25
|
.description('View your vibe-check profile, stats, and achievements')
|
|
@@ -20,6 +27,12 @@ function createProfileCommand() {
|
|
|
20
27
|
.option('--stats', 'Show detailed stats', false)
|
|
21
28
|
.option('--patterns', 'Show spiral pattern memory (your triggers)', false)
|
|
22
29
|
.option('--interventions', 'Show intervention memory (what breaks spirals)', false)
|
|
30
|
+
.option('--challenges', 'Show weekly challenges', false)
|
|
31
|
+
.option('--leaderboard', 'Show personal leaderboard', false)
|
|
32
|
+
.option('--hall-of-fame', 'Show Hall of Fame records', false)
|
|
33
|
+
.option('--weekly', 'Show this week stats', false)
|
|
34
|
+
.option('--share', 'Output shareable profile text', false)
|
|
35
|
+
.option('--share-json', 'Output shareable profile as JSON', false)
|
|
23
36
|
.option('--json', 'Output as JSON', false)
|
|
24
37
|
.action(async (options) => {
|
|
25
38
|
await runProfile(options);
|
|
@@ -28,6 +41,17 @@ function createProfileCommand() {
|
|
|
28
41
|
}
|
|
29
42
|
async function runProfile(options) {
|
|
30
43
|
const profile = (0, profile_1.loadProfile)();
|
|
44
|
+
// Handle share options first (standalone output)
|
|
45
|
+
if (options.share) {
|
|
46
|
+
const shareable = (0, share_1.createShareableProfile)(profile);
|
|
47
|
+
console.log((0, share_1.formatShareText)(shareable));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (options['share-json']) {
|
|
51
|
+
const shareable = (0, share_1.createShareableProfile)(profile);
|
|
52
|
+
console.log((0, share_1.formatShareJSON)(shareable));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
31
55
|
if (options.json) {
|
|
32
56
|
console.log(JSON.stringify(profile, null, 2));
|
|
33
57
|
return;
|
|
@@ -36,70 +60,106 @@ async function runProfile(options) {
|
|
|
36
60
|
const levelInfo = types_1.LEVELS.find(l => l.level === xp.level);
|
|
37
61
|
const achievementCounts = (0, profile_1.getAchievementCounts)(profile);
|
|
38
62
|
const recentSessions = (0, profile_1.getRecentSessions)(profile, 30);
|
|
63
|
+
// Get badge
|
|
64
|
+
const badge = (0, badges_1.getCurrentBadge)(stats.totalSessions, streak.longest, xp.total);
|
|
65
|
+
const nextBadge = (0, badges_1.getNextBadge)(stats.totalSessions, streak.longest, xp.total);
|
|
39
66
|
// Header
|
|
40
67
|
console.log();
|
|
41
|
-
console.log(chalk_1.default.cyan('
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
68
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā®'));
|
|
69
|
+
// Title with prestige and badge
|
|
70
|
+
const prestigeStr = xp.prestigeTier ? ` ${types_1.PRESTIGE_TIERS[xp.prestigeTier - 1].icon}` : '';
|
|
71
|
+
const badgeStr = badge ? ` ${badge.icon} ${badge.name}` : '';
|
|
72
|
+
const titleLine = `${levelInfo.icon}${prestigeStr} ${xp.levelName}${badgeStr}`;
|
|
73
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold.white(` ${titleLine}`).padEnd(66) + chalk_1.default.cyan('ā'));
|
|
74
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
75
|
+
// Level/XP
|
|
45
76
|
const levelBar = createProgressBar((0, xp_1.getLevelProgress)(xp), 20);
|
|
46
|
-
|
|
47
|
-
console.log(chalk_1.default.cyan('ā') + ` ${levelBar} ${chalk_1.default.gray(
|
|
48
|
-
console.log(chalk_1.default.cyan('ā') + ''.padEnd(
|
|
49
|
-
// Streak
|
|
50
|
-
const streakDisplay = streak
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
77
|
+
const xpDisplay = xp.nextLevelXP === Infinity ? `${xp.total} XP (MAX)` : `${xp.currentLevelXP}/${xp.nextLevelXP} XP`;
|
|
78
|
+
console.log(chalk_1.default.cyan('ā') + ` ${levelBar} ${chalk_1.default.gray(xpDisplay)}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
79
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
80
|
+
// Streak with enhanced display
|
|
81
|
+
const streakDisplay = (0, streaks_1.formatStreak)(streak);
|
|
82
|
+
console.log(chalk_1.default.cyan('ā') + ` ${streakDisplay}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
83
|
+
// Freezes
|
|
84
|
+
const freezeDisplay = (0, streaks_1.formatFreezes)(streak);
|
|
85
|
+
console.log(chalk_1.default.cyan('ā') + ` ${freezeDisplay}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
54
86
|
const weeklyBar = createProgressBar((streak.weeklyProgress / streak.weeklyGoal) * 100, 5);
|
|
55
|
-
console.log(chalk_1.default.cyan('ā') + ` š
Weekly Goal: ${streak.weeklyProgress}/${streak.weeklyGoal} ${weeklyBar}`.padEnd(
|
|
56
|
-
console.log(chalk_1.default.cyan('ā') + ` š Achievements: ${achievementCounts.unlocked}/${achievementCounts.total} unlocked`.padEnd(
|
|
57
|
-
console.log(chalk_1.default.cyan('ā') + ''.padEnd(
|
|
87
|
+
console.log(chalk_1.default.cyan('ā') + ` š
Weekly Goal: ${streak.weeklyProgress}/${streak.weeklyGoal} ${weeklyBar}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
88
|
+
console.log(chalk_1.default.cyan('ā') + ` š Achievements: ${achievementCounts.unlocked}/${achievementCounts.total} unlocked`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
89
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
90
|
+
// Weekly Challenges Section
|
|
91
|
+
const challenges = (0, challenges_1.getCurrentChallenges)(profile);
|
|
92
|
+
if (challenges.length > 0) {
|
|
93
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
94
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold.yellow(' WEEKLY CHALLENGES').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
95
|
+
for (const c of challenges) {
|
|
96
|
+
const progressBar = createChallengeBar(c.progress, c.target, 10);
|
|
97
|
+
const status = c.completed
|
|
98
|
+
? chalk_1.default.green(`ā COMPLETE (+${c.reward} XP)`)
|
|
99
|
+
: `${c.progress}/${c.target}`;
|
|
100
|
+
console.log(chalk_1.default.cyan('ā') + ` ${c.icon} ${c.name}: ${progressBar} ${status}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
101
|
+
}
|
|
102
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
103
|
+
}
|
|
104
|
+
// Weekly Stats Section
|
|
105
|
+
const weeklyStats = (0, stats_1.getWeeklyStats)(profile.sessions);
|
|
106
|
+
if (weeklyStats.sessions > 0) {
|
|
107
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
108
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š
THIS WEEK').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
109
|
+
console.log(chalk_1.default.cyan('ā') + ` Avg Score: ${weeklyStats.avgScore}% ${weeklyStats.trend.emoji}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
110
|
+
console.log(chalk_1.default.cyan('ā') + ` Sessions: ${weeklyStats.sessions} | XP: ${weeklyStats.xpEarned}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
111
|
+
if (weeklyStats.sparkline) {
|
|
112
|
+
console.log(chalk_1.default.cyan('ā') + ` Trend: ${weeklyStats.sparkline}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
113
|
+
}
|
|
114
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
115
|
+
}
|
|
58
116
|
// 30-Day Stats
|
|
59
|
-
console.log(chalk_1.default.cyan('
|
|
117
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
118
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š 30-Day Stats').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
60
119
|
const avgScore = recentSessions.length > 0
|
|
61
120
|
? Math.round(recentSessions.reduce((sum, s) => sum + s.vibeScore, 0) / recentSessions.length)
|
|
62
121
|
: 0;
|
|
63
122
|
const totalCommits = recentSessions.reduce((sum, s) => sum + s.commits, 0);
|
|
64
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Avg Vibe Score: ${chalk_1.default.bold(avgScore.toString())}%`.padEnd(
|
|
65
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Sessions: ${chalk_1.default.bold(recentSessions.length.toString())}`.padEnd(
|
|
66
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Commits Analyzed: ${chalk_1.default.bold(totalCommits.toString())}`.padEnd(
|
|
123
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Avg Vibe Score: ${chalk_1.default.bold(avgScore.toString())}%`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
124
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Sessions: ${chalk_1.default.bold(recentSessions.length.toString())}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
125
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Commits Analyzed: ${chalk_1.default.bold(totalCommits.toString())}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
67
126
|
const spiralsAvoided = recentSessions.filter(s => s.spirals === 0 && s.commits >= 10).length;
|
|
68
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Zero-Spiral Sessions: ${chalk_1.default.bold(spiralsAvoided.toString())}`.padEnd(
|
|
69
|
-
console.log(chalk_1.default.cyan('ā') + ''.padEnd(
|
|
127
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Zero-Spiral Sessions: ${chalk_1.default.bold(spiralsAvoided.toString())}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
128
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
70
129
|
// Pattern Memory Summary
|
|
71
130
|
const patternInfo = (0, pattern_memory_1.formatPatternMemory)(profile.patternMemory || { version: '1.0.0', records: [], patternCounts: {}, componentCounts: {}, patternDurations: {}, topPatterns: [], topComponents: [], avgRecoveryTime: 0, totalSpirals: 0 });
|
|
72
131
|
if (patternInfo.hasData) {
|
|
73
|
-
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š§ Spiral Triggers').padEnd(
|
|
132
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š§ Spiral Triggers').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
74
133
|
if (patternInfo.topPatterns.length > 0) {
|
|
75
134
|
const topTrigger = patternInfo.topPatterns[0];
|
|
76
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Top: ${chalk_1.default.yellow(topTrigger.displayName)} (${topTrigger.count}Ć)`.padEnd(
|
|
135
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Top: ${chalk_1.default.yellow(topTrigger.displayName)} (${topTrigger.count}Ć)`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
77
136
|
}
|
|
78
|
-
console.log(chalk_1.default.cyan('ā') + ` Avg recovery: ${chalk_1.default.gray(patternInfo.avgRecoveryTime + ' min')}`.padEnd(
|
|
79
|
-
console.log(chalk_1.default.cyan('ā') + ''.padEnd(
|
|
137
|
+
console.log(chalk_1.default.cyan('ā') + ` Avg recovery: ${chalk_1.default.gray(patternInfo.avgRecoveryTime + ' min')}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
138
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
80
139
|
}
|
|
81
140
|
// Intervention Memory Summary
|
|
82
141
|
const interventionInfo = (0, intervention_memory_1.formatInterventionMemory)(profile.interventionMemory);
|
|
83
142
|
if (interventionInfo.hasData) {
|
|
84
|
-
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š ļø What Breaks Spirals').padEnd(
|
|
143
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' š ļø What Breaks Spirals').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
85
144
|
if (interventionInfo.topInterventions.length > 0) {
|
|
86
145
|
const top = interventionInfo.topInterventions[0];
|
|
87
|
-
console.log(chalk_1.default.cyan('ā') + ` āā Go-to: ${chalk_1.default.green(top.icon + ' ' + top.name)} (${top.count}Ć)`.padEnd(
|
|
146
|
+
console.log(chalk_1.default.cyan('ā') + ` āā Go-to: ${chalk_1.default.green(top.icon + ' ' + top.name)} (${top.count}Ć)`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
88
147
|
}
|
|
89
|
-
console.log(chalk_1.default.cyan('ā') + ''.padEnd(
|
|
148
|
+
console.log(chalk_1.default.cyan('ā') + ''.padEnd(56) + chalk_1.default.cyan('ā'));
|
|
90
149
|
}
|
|
91
150
|
// Recent achievements
|
|
92
151
|
const recentAchievements = achievements.slice(-3).reverse();
|
|
93
152
|
if (recentAchievements.length > 0) {
|
|
94
|
-
console.log(chalk_1.default.cyan('
|
|
153
|
+
console.log(chalk_1.default.cyan('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤'));
|
|
154
|
+
console.log(chalk_1.default.cyan('ā') + chalk_1.default.bold(' Recent Achievements:').padEnd(66) + chalk_1.default.cyan('ā'));
|
|
95
155
|
for (const ach of recentAchievements) {
|
|
96
156
|
const dateStr = ach.unlockedAt
|
|
97
157
|
? new Date(ach.unlockedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
|
|
98
158
|
: '';
|
|
99
|
-
console.log(chalk_1.default.cyan('ā') + ` ${ach.icon} ${ach.name} ${chalk_1.default.gray(`(${dateStr})`)}`.padEnd(
|
|
159
|
+
console.log(chalk_1.default.cyan('ā') + ` ${ach.icon} ${ach.name} ${chalk_1.default.gray(`(${dateStr})`)}`.padEnd(66) + chalk_1.default.cyan('ā'));
|
|
100
160
|
}
|
|
101
161
|
}
|
|
102
|
-
console.log(chalk_1.default.cyan('
|
|
162
|
+
console.log(chalk_1.default.cyan('ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ'));
|
|
103
163
|
console.log();
|
|
104
164
|
// Show all achievements if requested
|
|
105
165
|
if (options.achievements) {
|
|
@@ -117,12 +177,61 @@ async function runProfile(options) {
|
|
|
117
177
|
if (options.interventions) {
|
|
118
178
|
showInterventionMemory(profile.interventionMemory);
|
|
119
179
|
}
|
|
180
|
+
// Show challenges if requested
|
|
181
|
+
if (options.challenges) {
|
|
182
|
+
showChallenges(challenges);
|
|
183
|
+
}
|
|
184
|
+
// Show leaderboard if requested
|
|
185
|
+
if (options.leaderboard) {
|
|
186
|
+
const leaderboards = (0, leaderboards_1.loadLeaderboards)();
|
|
187
|
+
console.log(chalk_1.default.bold('\nš Personal Leaderboard\n'));
|
|
188
|
+
console.log((0, leaderboards_1.formatLeaderboard)(leaderboards));
|
|
189
|
+
console.log();
|
|
190
|
+
}
|
|
191
|
+
// Show Hall of Fame if requested
|
|
192
|
+
if (options['hall-of-fame']) {
|
|
193
|
+
const leaderboards = (0, leaderboards_1.loadLeaderboards)();
|
|
194
|
+
const records = (0, hall_of_fame_1.getHallOfFame)(leaderboards);
|
|
195
|
+
console.log('\n' + (0, hall_of_fame_1.formatHallOfFame)(records));
|
|
196
|
+
}
|
|
197
|
+
// Show weekly stats if requested
|
|
198
|
+
if (options.weekly) {
|
|
199
|
+
console.log(chalk_1.default.bold('\nš
Weekly Statistics\n'));
|
|
200
|
+
console.log((0, stats_1.formatWeeklyStats)(weeklyStats));
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
120
203
|
}
|
|
121
204
|
function createProgressBar(percent, length) {
|
|
122
205
|
const filled = Math.round((percent / 100) * length);
|
|
123
206
|
const empty = length - filled;
|
|
124
207
|
return chalk_1.default.green('ā'.repeat(filled)) + chalk_1.default.gray('ā'.repeat(empty));
|
|
125
208
|
}
|
|
209
|
+
function createChallengeBar(current, total, length) {
|
|
210
|
+
const pct = Math.min(current / total, 1);
|
|
211
|
+
const filled = Math.round(pct * length);
|
|
212
|
+
const empty = length - filled;
|
|
213
|
+
return chalk_1.default.yellow('ā'.repeat(filled)) + chalk_1.default.gray('ā'.repeat(empty));
|
|
214
|
+
}
|
|
215
|
+
function showChallenges(challenges) {
|
|
216
|
+
console.log(chalk_1.default.bold('\nšÆ Weekly Challenges\n'));
|
|
217
|
+
if (challenges.length === 0) {
|
|
218
|
+
console.log(chalk_1.default.gray(' No challenges available this week.'));
|
|
219
|
+
console.log();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
for (const c of challenges) {
|
|
223
|
+
const progressBar = createChallengeBar(c.progress, c.target, 15);
|
|
224
|
+
const pct = Math.round((c.progress / c.target) * 100);
|
|
225
|
+
const status = c.completed
|
|
226
|
+
? chalk_1.default.green('ā COMPLETE')
|
|
227
|
+
: chalk_1.default.gray(`${pct}%`);
|
|
228
|
+
console.log(` ${c.icon} ${chalk_1.default.bold(c.name)}`);
|
|
229
|
+
console.log(` ${c.description}`);
|
|
230
|
+
console.log(` ${progressBar} ${c.progress}/${c.target} ${status}`);
|
|
231
|
+
console.log(` Reward: ${chalk_1.default.yellow(`+${c.reward} XP`)}`);
|
|
232
|
+
console.log();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
126
235
|
function showAllAchievements(unlockedAchievements) {
|
|
127
236
|
const allAchievements = (0, achievements_1.getAllAchievements)(unlockedAchievements);
|
|
128
237
|
const unlockedIds = new Set(unlockedAchievements.map(a => a.id));
|