@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.
Files changed (188) 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 +200 -12
  17. package/claude-progress.txt +310 -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/profile.d.ts.map +1 -1
  49. package/dist/commands/profile.js +140 -31
  50. package/dist/commands/profile.js.map +1 -1
  51. package/dist/commands/timeline.d.ts +14 -0
  52. package/dist/commands/timeline.d.ts.map +1 -0
  53. package/dist/commands/timeline.js +462 -0
  54. package/dist/commands/timeline.js.map +1 -0
  55. package/dist/gamification/badges.d.ts +29 -0
  56. package/dist/gamification/badges.d.ts.map +1 -0
  57. package/dist/gamification/badges.js +114 -0
  58. package/dist/gamification/badges.js.map +1 -0
  59. package/dist/gamification/challenges.d.ts +42 -0
  60. package/dist/gamification/challenges.d.ts.map +1 -0
  61. package/dist/gamification/challenges.js +184 -0
  62. package/dist/gamification/challenges.js.map +1 -0
  63. package/dist/gamification/hall-of-fame.d.ts +17 -0
  64. package/dist/gamification/hall-of-fame.d.ts.map +1 -0
  65. package/dist/gamification/hall-of-fame.js +64 -0
  66. package/dist/gamification/hall-of-fame.js.map +1 -0
  67. package/dist/gamification/leaderboards.d.ts +49 -0
  68. package/dist/gamification/leaderboards.d.ts.map +1 -0
  69. package/dist/gamification/leaderboards.js +179 -0
  70. package/dist/gamification/leaderboards.js.map +1 -0
  71. package/dist/gamification/share.d.ts +29 -0
  72. package/dist/gamification/share.d.ts.map +1 -0
  73. package/dist/gamification/share.js +57 -0
  74. package/dist/gamification/share.js.map +1 -0
  75. package/dist/gamification/stats.d.ts +34 -0
  76. package/dist/gamification/stats.d.ts.map +1 -0
  77. package/dist/gamification/stats.js +91 -0
  78. package/dist/gamification/stats.js.map +1 -0
  79. package/dist/gamification/streaks.d.ts +9 -1
  80. package/dist/gamification/streaks.d.ts.map +1 -1
  81. package/dist/gamification/streaks.js +37 -4
  82. package/dist/gamification/streaks.js.map +1 -1
  83. package/dist/gamification/types.d.ts +35 -0
  84. package/dist/gamification/types.d.ts.map +1 -1
  85. package/dist/gamification/types.js +11 -3
  86. package/dist/gamification/types.js.map +1 -1
  87. package/dist/gamification/xp.d.ts +6 -2
  88. package/dist/gamification/xp.d.ts.map +1 -1
  89. package/dist/gamification/xp.js +27 -5
  90. package/dist/gamification/xp.js.map +1 -1
  91. package/dist/git.d.ts +24 -0
  92. package/dist/git.d.ts.map +1 -1
  93. package/dist/git.js +94 -0
  94. package/dist/git.js.map +1 -1
  95. package/dist/insights/generators.d.ts +44 -0
  96. package/dist/insights/generators.d.ts.map +1 -0
  97. package/dist/insights/generators.js +289 -0
  98. package/dist/insights/generators.js.map +1 -0
  99. package/dist/insights/index.d.ts +16 -0
  100. package/dist/insights/index.d.ts.map +1 -0
  101. package/dist/insights/index.js +171 -0
  102. package/dist/insights/index.js.map +1 -0
  103. package/dist/insights/types.d.ts +93 -0
  104. package/dist/insights/types.d.ts.map +1 -0
  105. package/dist/insights/types.js +6 -0
  106. package/dist/insights/types.js.map +1 -0
  107. package/dist/output/terminal.d.ts.map +1 -1
  108. package/dist/output/terminal.js +39 -0
  109. package/dist/output/terminal.js.map +1 -1
  110. package/dist/output/timeline-html.d.ts +6 -0
  111. package/dist/output/timeline-html.d.ts.map +1 -0
  112. package/dist/output/timeline-html.js +389 -0
  113. package/dist/output/timeline-html.js.map +1 -0
  114. package/dist/output/timeline-markdown.d.ts +6 -0
  115. package/dist/output/timeline-markdown.d.ts.map +1 -0
  116. package/dist/output/timeline-markdown.js +167 -0
  117. package/dist/output/timeline-markdown.js.map +1 -0
  118. package/dist/output/timeline.d.ts +9 -0
  119. package/dist/output/timeline.d.ts.map +1 -0
  120. package/dist/output/timeline.js +318 -0
  121. package/dist/output/timeline.js.map +1 -0
  122. package/dist/patterns/detour.d.ts +32 -0
  123. package/dist/patterns/detour.d.ts.map +1 -0
  124. package/dist/patterns/detour.js +137 -0
  125. package/dist/patterns/detour.js.map +1 -0
  126. package/dist/patterns/flow-state.d.ts +16 -0
  127. package/dist/patterns/flow-state.d.ts.map +1 -0
  128. package/dist/patterns/flow-state.js +40 -0
  129. package/dist/patterns/flow-state.js.map +1 -0
  130. package/dist/patterns/index.d.ts +8 -0
  131. package/dist/patterns/index.d.ts.map +1 -0
  132. package/dist/patterns/index.js +22 -0
  133. package/dist/patterns/index.js.map +1 -0
  134. package/dist/patterns/intervention-effectiveness.d.ts +42 -0
  135. package/dist/patterns/intervention-effectiveness.d.ts.map +1 -0
  136. package/dist/patterns/intervention-effectiveness.js +196 -0
  137. package/dist/patterns/intervention-effectiveness.js.map +1 -0
  138. package/dist/patterns/late-night.d.ts +30 -0
  139. package/dist/patterns/late-night.d.ts.map +1 -0
  140. package/dist/patterns/late-night.js +141 -0
  141. package/dist/patterns/late-night.js.map +1 -0
  142. package/dist/patterns/post-delete-sprint.d.ts +28 -0
  143. package/dist/patterns/post-delete-sprint.d.ts.map +1 -0
  144. package/dist/patterns/post-delete-sprint.js +85 -0
  145. package/dist/patterns/post-delete-sprint.js.map +1 -0
  146. package/dist/patterns/spiral-regression.d.ts +49 -0
  147. package/dist/patterns/spiral-regression.d.ts.map +1 -0
  148. package/dist/patterns/spiral-regression.js +219 -0
  149. package/dist/patterns/spiral-regression.js.map +1 -0
  150. package/dist/patterns/thrashing.d.ts +25 -0
  151. package/dist/patterns/thrashing.d.ts.map +1 -0
  152. package/dist/patterns/thrashing.js +111 -0
  153. package/dist/patterns/thrashing.js.map +1 -0
  154. package/dist/storage/atomic.d.ts +40 -0
  155. package/dist/storage/atomic.d.ts.map +1 -0
  156. package/dist/storage/atomic.js +155 -0
  157. package/dist/storage/atomic.js.map +1 -0
  158. package/dist/storage/commit-log.d.ts +35 -0
  159. package/dist/storage/commit-log.d.ts.map +1 -0
  160. package/dist/storage/commit-log.js +128 -0
  161. package/dist/storage/commit-log.js.map +1 -0
  162. package/dist/storage/index.d.ts +5 -0
  163. package/dist/storage/index.d.ts.map +1 -0
  164. package/dist/storage/index.js +33 -0
  165. package/dist/storage/index.js.map +1 -0
  166. package/dist/storage/schema.d.ts +32 -0
  167. package/dist/storage/schema.d.ts.map +1 -0
  168. package/dist/storage/schema.js +37 -0
  169. package/dist/storage/schema.js.map +1 -0
  170. package/dist/storage/timeline-store.d.ts +117 -0
  171. package/dist/storage/timeline-store.d.ts.map +1 -0
  172. package/dist/storage/timeline-store.js +438 -0
  173. package/dist/storage/timeline-store.js.map +1 -0
  174. package/dist/types.d.ts +96 -0
  175. package/dist/types.d.ts.map +1 -1
  176. package/docs/ARCHITECTURE.md +458 -0
  177. package/docs/DATA-ARCHITECTURE.md +565 -0
  178. package/docs/GAMIFICATION.md +564 -0
  179. package/docs/JSON-STORAGE-PATTERNS.md +512 -0
  180. package/docs/METRICS-EXPLAINED.md +394 -0
  181. package/docs/UNIFIED-ECOSYSTEM.md +560 -0
  182. package/docs/VIBE-ECOSYSTEM.md +406 -0
  183. package/feature-list.json +103 -1
  184. package/package.json +2 -1
  185. package/vitest.config.ts +1 -5
  186. package/.vibe-check/calibration.json +0 -38
  187. package/.vibe-check/latest.json +0 -114
  188. 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,8 @@
1
+ import { Command } from 'commander';
2
+ export interface DashboardOptions {
3
+ repo: string;
4
+ open: boolean;
5
+ output?: string;
6
+ }
7
+ export declare function createDashboardCommand(): Command;
8
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -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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"}
@@ -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"}
@@ -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;AAcpC,wBAAgB,oBAAoB,IAAI,OAAO,CAa9C;AA4RD,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
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"}
@@ -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
- console.log(chalk_1.default.cyan('│') + chalk_1.default.bold.white(' Your Vibe Profile ') + chalk_1.default.cyan('│'));
43
- console.log(chalk_1.default.cyan('ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤'));
44
- // Level
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
- console.log(chalk_1.default.cyan('│') + ` ${levelInfo.icon} ${chalk_1.default.bold(`Level ${xp.level} ${xp.levelName}`)}`.padEnd(52) + chalk_1.default.cyan('│'));
47
- console.log(chalk_1.default.cyan('│') + ` ${levelBar} ${chalk_1.default.gray(`${xp.currentLevelXP}/${xp.nextLevelXP} XP`)}`.padEnd(60) + chalk_1.default.cyan('│'));
48
- console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
49
- // Streak
50
- const streakDisplay = streak.current > 0
51
- ? `šŸ”„ Current Streak: ${chalk_1.default.bold(streak.current.toString())} days${streak.current === streak.longest ? chalk_1.default.yellow(' (Best!)') : ''}`
52
- : 'šŸ”„ No active streak';
53
- console.log(chalk_1.default.cyan('│') + ` ${streakDisplay}`.padEnd(52) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
56
- console.log(chalk_1.default.cyan('│') + ` šŸ† Achievements: ${achievementCounts.unlocked}/${achievementCounts.total} unlocked`.padEnd(52) + chalk_1.default.cyan('│'));
57
- console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
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('│') + chalk_1.default.bold(' šŸ“Š 30-Day Stats').padEnd(52) + 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(52) + chalk_1.default.cyan('│'));
65
- console.log(chalk_1.default.cyan('│') + ` ā”œā”€ Sessions: ${chalk_1.default.bold(recentSessions.length.toString())}`.padEnd(52) + chalk_1.default.cyan('│'));
66
- console.log(chalk_1.default.cyan('│') + ` ā”œā”€ Commits Analyzed: ${chalk_1.default.bold(totalCommits.toString())}`.padEnd(52) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
69
- console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
79
- console.log(chalk_1.default.cyan('│') + ''.padEnd(44) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
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(52) + chalk_1.default.cyan('│'));
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(44) + chalk_1.default.cyan('│'));
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('│') + chalk_1.default.bold(' Recent Achievements:').padEnd(52) + 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(52) + chalk_1.default.cyan('│'));
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));