fivocell 3.1.0 → 4.1.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 (176) hide show
  1. package/dist/__tests__/behavior-intelligence-bug.test.d.ts +2 -0
  2. package/dist/__tests__/behavior-intelligence-bug.test.d.ts.map +1 -0
  3. package/dist/__tests__/behavior-intelligence-bug.test.js +21 -0
  4. package/dist/__tests__/behavior-intelligence-bug.test.js.map +1 -0
  5. package/dist/__tests__/code-scanner-arrow-return-type.test.d.ts +2 -0
  6. package/dist/__tests__/code-scanner-arrow-return-type.test.d.ts.map +1 -0
  7. package/dist/__tests__/code-scanner-arrow-return-type.test.js +76 -0
  8. package/dist/__tests__/code-scanner-arrow-return-type.test.js.map +1 -0
  9. package/dist/__tests__/code-scanner-blindspot.test.d.ts +2 -0
  10. package/dist/__tests__/code-scanner-blindspot.test.d.ts.map +1 -0
  11. package/dist/__tests__/code-scanner-blindspot.test.js +18 -0
  12. package/dist/__tests__/code-scanner-blindspot.test.js.map +1 -0
  13. package/dist/__tests__/code-scanner-error-recovery.test.d.ts +2 -0
  14. package/dist/__tests__/code-scanner-error-recovery.test.d.ts.map +1 -0
  15. package/dist/__tests__/code-scanner-error-recovery.test.js +21 -0
  16. package/dist/__tests__/code-scanner-error-recovery.test.js.map +1 -0
  17. package/dist/__tests__/code-scanner-n1-detection.test.d.ts +2 -0
  18. package/dist/__tests__/code-scanner-n1-detection.test.d.ts.map +1 -0
  19. package/dist/__tests__/code-scanner-n1-detection.test.js +113 -0
  20. package/dist/__tests__/code-scanner-n1-detection.test.js.map +1 -0
  21. package/dist/__tests__/code-scanner-nesting.test.d.ts +2 -0
  22. package/dist/__tests__/code-scanner-nesting.test.d.ts.map +1 -0
  23. package/dist/__tests__/code-scanner-nesting.test.js +113 -0
  24. package/dist/__tests__/code-scanner-nesting.test.js.map +1 -0
  25. package/dist/__tests__/code-scanner-null-check.test.d.ts +2 -0
  26. package/dist/__tests__/code-scanner-null-check.test.d.ts.map +1 -0
  27. package/dist/__tests__/code-scanner-null-check.test.js +126 -0
  28. package/dist/__tests__/code-scanner-null-check.test.js.map +1 -0
  29. package/dist/__tests__/code-scanner-sql-fix.test.d.ts +2 -0
  30. package/dist/__tests__/code-scanner-sql-fix.test.d.ts.map +1 -0
  31. package/dist/__tests__/code-scanner-sql-fix.test.js +21 -0
  32. package/dist/__tests__/code-scanner-sql-fix.test.js.map +1 -0
  33. package/dist/__tests__/code-scanner-trust-score.test.d.ts +1 -0
  34. package/dist/__tests__/code-scanner-trust-score.test.d.ts.map +1 -0
  35. package/dist/__tests__/code-scanner-trust-score.test.js +39 -0
  36. package/dist/__tests__/code-scanner-trust-score.test.js.map +1 -0
  37. package/dist/__tests__/code-scanner-validation.test.d.ts +2 -0
  38. package/dist/__tests__/code-scanner-validation.test.d.ts.map +1 -0
  39. package/dist/__tests__/code-scanner-validation.test.js +131 -0
  40. package/dist/__tests__/code-scanner-validation.test.js.map +1 -0
  41. package/dist/__tests__/community-store.test.d.ts +2 -0
  42. package/dist/__tests__/community-store.test.d.ts.map +1 -0
  43. package/dist/__tests__/community-store.test.js +231 -0
  44. package/dist/__tests__/community-store.test.js.map +1 -0
  45. package/dist/__tests__/enhanced-blind-spots.test.d.ts +2 -0
  46. package/dist/__tests__/enhanced-blind-spots.test.d.ts.map +1 -0
  47. package/dist/__tests__/enhanced-blind-spots.test.js +302 -0
  48. package/dist/__tests__/enhanced-blind-spots.test.js.map +1 -0
  49. package/dist/__tests__/knowledge-graph-store.test.d.ts +2 -0
  50. package/dist/__tests__/knowledge-graph-store.test.d.ts.map +1 -0
  51. package/dist/__tests__/knowledge-graph-store.test.js +252 -0
  52. package/dist/__tests__/knowledge-graph-store.test.js.map +1 -0
  53. package/dist/__tests__/live-watcher.test.d.ts +2 -0
  54. package/dist/__tests__/live-watcher.test.d.ts.map +1 -0
  55. package/dist/__tests__/live-watcher.test.js +312 -0
  56. package/dist/__tests__/live-watcher.test.js.map +1 -0
  57. package/dist/__tests__/mcp-cell-tools.test.d.ts +2 -0
  58. package/dist/__tests__/mcp-cell-tools.test.d.ts.map +1 -0
  59. package/dist/__tests__/mcp-cell-tools.test.js +176 -0
  60. package/dist/__tests__/mcp-cell-tools.test.js.map +1 -0
  61. package/dist/__tests__/multi-project.test.d.ts +2 -0
  62. package/dist/__tests__/multi-project.test.d.ts.map +1 -0
  63. package/dist/__tests__/multi-project.test.js +145 -0
  64. package/dist/__tests__/multi-project.test.js.map +1 -0
  65. package/dist/__tests__/pc-scanner-paths.test.d.ts +2 -0
  66. package/dist/__tests__/pc-scanner-paths.test.d.ts.map +1 -0
  67. package/dist/__tests__/pc-scanner-paths.test.js +16 -0
  68. package/dist/__tests__/pc-scanner-paths.test.js.map +1 -0
  69. package/dist/__tests__/prompt-builder-realdata.test.d.ts +2 -0
  70. package/dist/__tests__/prompt-builder-realdata.test.d.ts.map +1 -0
  71. package/dist/__tests__/prompt-builder-realdata.test.js +94 -0
  72. package/dist/__tests__/prompt-builder-realdata.test.js.map +1 -0
  73. package/dist/__tests__/prompt-builder-sessions.test.d.ts +2 -0
  74. package/dist/__tests__/prompt-builder-sessions.test.d.ts.map +1 -0
  75. package/dist/__tests__/prompt-builder-sessions.test.js +124 -0
  76. package/dist/__tests__/prompt-builder-sessions.test.js.map +1 -0
  77. package/dist/__tests__/security.test.d.ts +1 -0
  78. package/dist/__tests__/security.test.d.ts.map +1 -0
  79. package/dist/__tests__/security.test.js +161 -0
  80. package/dist/__tests__/security.test.js.map +1 -0
  81. package/dist/__tests__/session-bridge.test.d.ts +2 -0
  82. package/dist/__tests__/session-bridge.test.d.ts.map +1 -0
  83. package/dist/__tests__/session-bridge.test.js +158 -0
  84. package/dist/__tests__/session-bridge.test.js.map +1 -0
  85. package/dist/__tests__/session-memory-tables.test.d.ts +2 -0
  86. package/dist/__tests__/session-memory-tables.test.d.ts.map +1 -0
  87. package/dist/__tests__/session-memory-tables.test.js +169 -0
  88. package/dist/__tests__/session-memory-tables.test.js.map +1 -0
  89. package/dist/__tests__/staleness-detection.test.d.ts +2 -0
  90. package/dist/__tests__/staleness-detection.test.d.ts.map +1 -0
  91. package/dist/__tests__/staleness-detection.test.js +105 -0
  92. package/dist/__tests__/staleness-detection.test.js.map +1 -0
  93. package/dist/__tests__/team-collaboration.test.d.ts +2 -0
  94. package/dist/__tests__/team-collaboration.test.d.ts.map +1 -0
  95. package/dist/__tests__/team-collaboration.test.js +224 -0
  96. package/dist/__tests__/team-collaboration.test.js.map +1 -0
  97. package/dist/__tests__/tool-specific-format.test.d.ts +2 -0
  98. package/dist/__tests__/tool-specific-format.test.d.ts.map +1 -0
  99. package/dist/__tests__/tool-specific-format.test.js +132 -0
  100. package/dist/__tests__/tool-specific-format.test.js.map +1 -0
  101. package/dist/__tests__/usage-intelligence-store.test.d.ts +2 -0
  102. package/dist/__tests__/usage-intelligence-store.test.d.ts.map +1 -0
  103. package/dist/__tests__/usage-intelligence-store.test.js +266 -0
  104. package/dist/__tests__/usage-intelligence-store.test.js.map +1 -0
  105. package/dist/ai-bridge.d.ts +20 -0
  106. package/dist/ai-bridge.d.ts.map +1 -0
  107. package/dist/ai-bridge.js +250 -0
  108. package/dist/ai-bridge.js.map +1 -0
  109. package/dist/behavior-intelligence.d.ts.map +1 -1
  110. package/dist/behavior-intelligence.js +12 -1
  111. package/dist/behavior-intelligence.js.map +1 -1
  112. package/dist/cli.js +501 -4
  113. package/dist/cli.js.map +1 -1
  114. package/dist/code-scanner.d.ts.map +1 -1
  115. package/dist/code-scanner.js +426 -69
  116. package/dist/code-scanner.js.map +1 -1
  117. package/dist/core/community-store.d.ts +128 -0
  118. package/dist/core/community-store.d.ts.map +1 -0
  119. package/dist/core/community-store.js +329 -0
  120. package/dist/core/community-store.js.map +1 -0
  121. package/dist/core/database.d.ts +0 -3
  122. package/dist/core/database.d.ts.map +1 -1
  123. package/dist/core/database.js +287 -15
  124. package/dist/core/database.js.map +1 -1
  125. package/dist/core/enhanced-blind-spots.d.ts +27 -0
  126. package/dist/core/enhanced-blind-spots.d.ts.map +1 -0
  127. package/dist/core/enhanced-blind-spots.js +591 -0
  128. package/dist/core/enhanced-blind-spots.js.map +1 -0
  129. package/dist/core/knowledge-graph-store.d.ts +69 -0
  130. package/dist/core/knowledge-graph-store.d.ts.map +1 -0
  131. package/dist/core/knowledge-graph-store.js +269 -0
  132. package/dist/core/knowledge-graph-store.js.map +1 -0
  133. package/dist/core/live-watcher.d.ts +52 -0
  134. package/dist/core/live-watcher.d.ts.map +1 -0
  135. package/dist/core/live-watcher.js +369 -0
  136. package/dist/core/live-watcher.js.map +1 -0
  137. package/dist/core/project-registry.d.ts +24 -0
  138. package/dist/core/project-registry.d.ts.map +1 -0
  139. package/dist/core/project-registry.js +70 -0
  140. package/dist/core/project-registry.js.map +1 -0
  141. package/dist/core/prompt-builder.d.ts +50 -0
  142. package/dist/core/prompt-builder.d.ts.map +1 -1
  143. package/dist/core/prompt-builder.js +533 -79
  144. package/dist/core/prompt-builder.js.map +1 -1
  145. package/dist/core/security.d.ts +23 -0
  146. package/dist/core/security.d.ts.map +1 -0
  147. package/dist/core/security.js +117 -0
  148. package/dist/core/security.js.map +1 -0
  149. package/dist/core/session-memory.d.ts +64 -0
  150. package/dist/core/session-memory.d.ts.map +1 -1
  151. package/dist/core/session-memory.js +111 -0
  152. package/dist/core/session-memory.js.map +1 -1
  153. package/dist/core/usage-intelligence-store.d.ts +126 -0
  154. package/dist/core/usage-intelligence-store.d.ts.map +1 -0
  155. package/dist/core/usage-intelligence-store.js +405 -0
  156. package/dist/core/usage-intelligence-store.js.map +1 -0
  157. package/dist/daemon/server.d.ts.map +1 -1
  158. package/dist/daemon/server.js +936 -17
  159. package/dist/daemon/server.js.map +1 -1
  160. package/dist/knowledge-graph-builder.d.ts +16 -0
  161. package/dist/knowledge-graph-builder.d.ts.map +1 -0
  162. package/dist/knowledge-graph-builder.js +186 -0
  163. package/dist/knowledge-graph-builder.js.map +1 -0
  164. package/dist/pc-scanner.d.ts +1 -0
  165. package/dist/pc-scanner.d.ts.map +1 -1
  166. package/dist/pc-scanner.js +58 -30
  167. package/dist/pc-scanner.js.map +1 -1
  168. package/dist/stack-detector.d.ts +34 -0
  169. package/dist/stack-detector.d.ts.map +1 -0
  170. package/dist/stack-detector.js +471 -0
  171. package/dist/stack-detector.js.map +1 -0
  172. package/dist/team-intel.d.ts +31 -0
  173. package/dist/team-intel.d.ts.map +1 -0
  174. package/dist/team-intel.js +310 -0
  175. package/dist/team-intel.js.map +1 -0
  176. package/package.json +1 -1
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const os = __importStar(require("os"));
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ describe('Phase 6: Usage Intelligence Store', () => {
40
+ let tmpHome;
41
+ let originalUserProfile;
42
+ let closeDb;
43
+ beforeAll(() => {
44
+ originalUserProfile = process.env.USERPROFILE;
45
+ tmpHome = path.join(os.tmpdir(), 'fivo-cell-phase6-' + Date.now());
46
+ process.env.USERPROFILE = tmpHome;
47
+ fs.mkdirSync(tmpHome, { recursive: true });
48
+ const db = require('../core/database');
49
+ closeDb = db.closeDb;
50
+ closeDb();
51
+ });
52
+ beforeEach(() => {
53
+ const { getDb } = require('../core/database');
54
+ const db = getDb();
55
+ db.prepare('DELETE FROM decision_outcomes').run();
56
+ db.prepare('DELETE FROM repeat_mistake_alerts').run();
57
+ db.prepare('DELETE FROM productivity_signals').run();
58
+ db.prepare('DELETE FROM error_log').run();
59
+ db.prepare('DELETE FROM sessions').run();
60
+ db.prepare('DELETE FROM model_profiles').run();
61
+ db.prepare('DELETE FROM model_interactions').run();
62
+ db.prepare('DELETE FROM tech_proficiency').run();
63
+ });
64
+ afterAll(() => {
65
+ if (originalUserProfile !== undefined) {
66
+ process.env.USERPROFILE = originalUserProfile;
67
+ }
68
+ else {
69
+ delete process.env.USERPROFILE;
70
+ }
71
+ closeDb();
72
+ try {
73
+ fs.rmSync(tmpHome, { recursive: true, force: true });
74
+ }
75
+ catch { }
76
+ });
77
+ describe('6.2: Decision History with Outcomes', () => {
78
+ it('logs decision and retrieves it', async () => {
79
+ const { logDecisionOutcome, getDecisionOutcomes } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
80
+ logDecisionOutcome({
81
+ project: 'test-6',
82
+ technology: 'TypeScript',
83
+ reason: 'Type safety',
84
+ outcome: 'Caught many bugs',
85
+ wasRight: true,
86
+ confidence: 80,
87
+ });
88
+ const decisions = getDecisionOutcomes('test-6');
89
+ expect(decisions.length).toBe(1);
90
+ expect(decisions[0].technology).toBe('TypeScript');
91
+ expect(decisions[0].wasRight).toBe(true);
92
+ });
93
+ it('detects "always regret" pattern', async () => {
94
+ const { logDecisionOutcome, getDecisionPatterns } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
95
+ for (let i = 0; i < 3; i++) {
96
+ logDecisionOutcome({
97
+ project: 'test-6', technology: 'MongoDB', reason: 'flexible', outcome: 'pain', wasRight: false,
98
+ });
99
+ }
100
+ const patterns = getDecisionPatterns('test-6');
101
+ const mongo = patterns.find(p => p.technology === 'MongoDB');
102
+ expect(mongo).toBeDefined();
103
+ expect(mongo.timesChosen).toBe(3);
104
+ expect(mongo.timesWrong).toBe(3);
105
+ expect(mongo.advice).toContain('STOP');
106
+ });
107
+ it('detects "great choice" pattern', async () => {
108
+ const { logDecisionOutcome, getDecisionPatterns } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
109
+ for (let i = 0; i < 4; i++) {
110
+ logDecisionOutcome({
111
+ project: 'test-6', technology: 'SQLite', reason: 'simple', outcome: 'works', wasRight: true,
112
+ });
113
+ }
114
+ const patterns = getDecisionPatterns('test-6');
115
+ const sqlite = patterns.find(p => p.technology === 'SQLite');
116
+ expect(sqlite).toBeDefined();
117
+ expect(sqlite.advice).toContain('great choice');
118
+ });
119
+ });
120
+ describe('6.3: Repeat Mistakes Map', () => {
121
+ it('detects repeated error types in same file', async () => {
122
+ const { getDb } = require('../core/database');
123
+ const db = getDb();
124
+ for (let i = 0; i < 3; i++) {
125
+ db.prepare('INSERT INTO error_log (project, file_path, error_type, occurred_at) VALUES (?, ?, ?, datetime(\'now\'))')
126
+ .run('test-6', 'src/api/users.ts', 'null_check');
127
+ }
128
+ const { detectRepeatMistakes } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
129
+ const mistakes = detectRepeatMistakes('test-6');
130
+ expect(mistakes.length).toBe(1);
131
+ expect(mistakes[0].errorType).toBe('null_check');
132
+ expect(mistakes[0].count).toBe(3);
133
+ expect(mistakes[0].suggestion).toContain('optional chaining');
134
+ });
135
+ it('marks critical severity at 5+ occurrences', async () => {
136
+ const { getDb } = require('../core/database');
137
+ const db = getDb();
138
+ for (let i = 0; i < 5; i++) {
139
+ db.prepare('INSERT INTO error_log (project, file_path, error_type, occurred_at) VALUES (?, ?, ?, datetime(\'now\'))')
140
+ .run('test-6', 'src/db.ts', 'n_plus_1');
141
+ }
142
+ const { detectRepeatMistakes } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
143
+ const mistakes = detectRepeatMistakes('test-6');
144
+ expect(mistakes[0].severity).toBe('critical');
145
+ });
146
+ it('writes to alerts table for tracking', async () => {
147
+ const { getDb } = require('../core/database');
148
+ const db = getDb();
149
+ for (let i = 0; i < 2; i++) {
150
+ db.prepare('INSERT INTO error_log (project, file_path, error_type, occurred_at) VALUES (?, ?, ?, datetime(\'now\'))')
151
+ .run('test-6', 'src/api.ts', 'validation');
152
+ }
153
+ const { detectRepeatMistakes } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
154
+ detectRepeatMistakes('test-6');
155
+ const alert = db.prepare('SELECT * FROM repeat_mistake_alerts WHERE project = ?').get('test-6');
156
+ expect(alert).toBeDefined();
157
+ expect(alert.error_type).toBe('validation');
158
+ expect(alert.occurrence_count).toBe(2);
159
+ });
160
+ });
161
+ describe('6.5: AI Interaction Stats', () => {
162
+ it('aggregates model_profiles + model_interactions', async () => {
163
+ const { getDb } = require('../core/database');
164
+ const db = getDb();
165
+ db.prepare('INSERT INTO model_profiles (model_name, acceptance_rate, rejection_rate, best_use_cases) VALUES (?, ?, ?, ?)')
166
+ .run('gpt-4', 0.85, 0.15, JSON.stringify(['code-gen', 'refactor']));
167
+ // 9 accepted, 1 rejected → 90% acceptance
168
+ for (let i = 0; i < 9; i++) {
169
+ db.prepare('INSERT INTO model_interactions (model_name, task_type, accepted, project) VALUES (?, ?, ?, ?)')
170
+ .run('gpt-4', 'code-gen', 1, 'test-6');
171
+ }
172
+ db.prepare('INSERT INTO model_interactions (model_name, task_type, accepted, project) VALUES (?, ?, ?, ?)')
173
+ .run('gpt-4', 'code-gen', 0, 'test-6');
174
+ const { getAIInteractionStats } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
175
+ const stats = getAIInteractionStats('test-6');
176
+ const gpt = stats.find(s => s.modelName === 'gpt-4');
177
+ expect(gpt).toBeDefined();
178
+ expect(gpt.totalInteractions).toBe(10);
179
+ expect(gpt.accepted).toBe(9);
180
+ expect(gpt.rejected).toBe(1);
181
+ expect(gpt.recommendation).toContain('Strong match');
182
+ });
183
+ });
184
+ describe('6.4: Productivity Signals', () => {
185
+ it('flow state: many files, low switches, long duration', async () => {
186
+ const { logProductivitySignal, getProductivitySignals } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
187
+ logProductivitySignal({ project: 'test-6', signalType: 'flow', durationMinutes: 120, filesTouched: 8, contextSwitches: 1 });
188
+ const signals = getProductivitySignals('test-6', 30);
189
+ expect(signals.length).toBe(1);
190
+ // flow = 8*5 + 120/2 - 1*3 = 40 + 60 - 3 = 97
191
+ expect(signals[0].flowScore).toBeGreaterThan(50);
192
+ expect(signals[0].recommendation).toContain('Strong flow');
193
+ });
194
+ it('friction: many switches, few files', async () => {
195
+ const { logProductivitySignal, getProductivitySignals } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
196
+ logProductivitySignal({ project: 'test-6', signalType: 'friction', durationMinutes: 30, filesTouched: 2, contextSwitches: 12 });
197
+ const signals = getProductivitySignals('test-6', 30);
198
+ // friction = 12*8 - 2*2 = 96 - 4 = 92
199
+ expect(signals[0].frictionScore).toBeGreaterThan(50);
200
+ });
201
+ });
202
+ describe('6.6: Skill Progression', () => {
203
+ it('classifies improving vs regressing', async () => {
204
+ const { getDb } = require('../core/database');
205
+ const db = getDb();
206
+ // Tech with proficiency
207
+ db.prepare('INSERT INTO tech_proficiency (project, technology, signals_count, proficiency_score) VALUES (?, ?, ?, ?)')
208
+ .run('test-6', 'TypeScript', 50, 85);
209
+ // Old errors (90 days ago)
210
+ for (let i = 0; i < 10; i++) {
211
+ db.prepare('INSERT INTO error_log (project, file_path, error_type, occurred_at) VALUES (?, ?, ?, datetime(\'now\', \'-90 days\'))')
212
+ .run('test-6', 'src/a.ts', 'type_error');
213
+ }
214
+ // Recent errors (last 30d) — fewer
215
+ for (let i = 0; i < 2; i++) {
216
+ db.prepare('INSERT INTO error_log (project, file_path, error_type, occurred_at) VALUES (?, ?, ?, datetime(\'now\', \'-5 days\'))')
217
+ .run('test-6', 'src/b.ts', 'type_error');
218
+ }
219
+ const { getSkillProgression } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
220
+ const skills = getSkillProgression('test-6');
221
+ const ts = skills.find(s => s.technology === 'TypeScript');
222
+ expect(ts).toBeDefined();
223
+ expect(ts.trend).toBe('improving');
224
+ });
225
+ });
226
+ describe('6.4: Burnout Detection', () => {
227
+ it('flags high risk with long sessions + high friction', async () => {
228
+ const { getDb } = require('../core/database');
229
+ const db = getDb();
230
+ // Create long session (4 hours)
231
+ db.prepare('INSERT INTO sessions (project, tool_name, start_time, end_time) VALUES (?, ?, datetime(\'now\', \'-4 hours\'), datetime(\'now\'))')
232
+ .run('test-6', 'claude-code');
233
+ // High friction signal
234
+ db.prepare('INSERT INTO productivity_signals (project, signal_type, duration_minutes, files_touched, context_switches, friction_score, created_at) VALUES (?, ?, ?, ?, ?, ?, datetime(\'now\'))')
235
+ .run('test-6', 'friction', 60, 1, 15, 80);
236
+ const { getBurnoutSignals } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
237
+ const burnout = getBurnoutSignals('test-6');
238
+ expect(burnout.risk).toMatch(/medium|high/);
239
+ expect(burnout.signals.length).toBeGreaterThan(0);
240
+ });
241
+ it('low risk for healthy patterns', async () => {
242
+ const { getDb } = require('../core/database');
243
+ const db = getDb();
244
+ // Healthy: short session, low friction
245
+ const { logProductivitySignal } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
246
+ logProductivitySignal({ project: 'test-6', signalType: 'flow', durationMinutes: 30, filesTouched: 5, contextSwitches: 1 });
247
+ const { getBurnoutSignals } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
248
+ const burnout = getBurnoutSignals('test-6');
249
+ expect(burnout.risk).toBe('low');
250
+ });
251
+ });
252
+ describe('Combined Dashboard', () => {
253
+ it('returns all sections in one call', async () => {
254
+ const { logDecisionOutcome, getUsageDashboard } = await Promise.resolve().then(() => __importStar(require('../core/usage-intelligence-store')));
255
+ logDecisionOutcome({ project: 'test-6', technology: 'TS', reason: 'r', outcome: 'o', wasRight: true });
256
+ const dash = getUsageDashboard('test-6');
257
+ expect(dash.decisions.total).toBe(1);
258
+ expect(dash.ai).toBeDefined();
259
+ expect(dash.productivity).toBeDefined();
260
+ expect(dash.skills).toBeDefined();
261
+ expect(dash.burnout).toBeDefined();
262
+ expect(dash.generatedAt).toBeDefined();
263
+ });
264
+ });
265
+ });
266
+ //# sourceMappingURL=usage-intelligence-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-intelligence-store.test.js","sourceRoot":"","sources":["../../src/__tests__/usage-intelligence-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface AnalysisPrompt {
2
+ title: string;
3
+ prompt: string;
4
+ category: 'project_identity' | 'architecture' | 'blind_spots' | 'recommendations' | 'team';
5
+ tokensEstimate: number;
6
+ }
7
+ export interface AIInsight {
8
+ category: string;
9
+ content: string;
10
+ timestamp: string;
11
+ source: string;
12
+ }
13
+ export declare function generateAnalysisPrompts(projectDir?: string): AnalysisPrompt[];
14
+ export declare function saveAIInsight(project: string, category: string, content: string): void;
15
+ export declare function getAIInsights(project?: string): AIInsight[];
16
+ export declare function getAnalysisCommand(projectDir?: string): {
17
+ intro: string;
18
+ prompts: AnalysisPrompt[];
19
+ };
20
+ //# sourceMappingURL=ai-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-bridge.d.ts","sourceRoot":"","sources":["../src/ai-bridge.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,kBAAkB,GAAG,cAAc,GAAG,aAAa,GAAG,iBAAiB,GAAG,MAAM,CAAC;IAC3F,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA2H7E;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAuBtF;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAgB3D;AAID,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAKpG"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAnalysisPrompts = generateAnalysisPrompts;
37
+ exports.saveAIInsight = saveAIInsight;
38
+ exports.getAIInsights = getAIInsights;
39
+ exports.getAnalysisCommand = getAnalysisCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ const database_1 = require("./core/database");
44
+ const CELL_DIR = path.join(os.homedir(), '.fivo', 'cell');
45
+ // ─── Prompt Generator ──────────────────────────────────────────────────────
46
+ function generateAnalysisPrompts(projectDir) {
47
+ const db = (0, database_1.getDb)();
48
+ const prompts = [];
49
+ const dir = projectDir || process.cwd();
50
+ const projectName = path.basename(dir);
51
+ // ── Project Identity Prompt ─────────────────────────────────────────
52
+ const stackData = readStackFromDB(db, projectName);
53
+ const filesList = readTopFiles(dir, 20);
54
+ if (stackData || filesList.length > 0) {
55
+ const stackInfo = stackData
56
+ ? `Stack: ${stackData.frontend || 'none'} + ${stackData.backend || 'none'}\nDatabase: ${(stackData.database || ['unknown']).join(', ')}\nORM: ${stackData.orm || 'none'}\nTesting: ${(stackData.testing || ['none']).join(', ')}`
57
+ : 'Stack: auto-detected from codebase';
58
+ prompts.push({
59
+ title: 'Project Identity & Purpose',
60
+ category: 'project_identity',
61
+ prompt: `Analyze this codebase and tell me exactly what's being built.
62
+
63
+ CONTEXT:
64
+ Project: ${projectName}
65
+ ${stackInfo}
66
+ Key files:
67
+ ${filesList.map(f => ` - ${f}`).join('\n')}
68
+
69
+ TASK:
70
+ 1. What is this project? What problem does it solve?
71
+ 2. What's the main business logic? Where is it?
72
+ 3. What are the most important files/modules?
73
+ 4. Is this production code, a side project, or an experiment?
74
+ 5. What seems incomplete or in progress?
75
+
76
+ Answer in short, clear bullet points. No fluff. NO code snippets.`,
77
+ tokensEstimate: 300,
78
+ });
79
+ }
80
+ // ── Architecture Analysis Prompt ────────────────────────────────────
81
+ const archData = readArchitectureFromDB(db, projectName);
82
+ if (archData) {
83
+ prompts.push({
84
+ title: 'Architecture Deep Analysis',
85
+ category: 'architecture',
86
+ prompt: `Analyze the architecture of this project.
87
+
88
+ CONTEXT:
89
+ Project: ${projectName}
90
+ Architecture type: ${archData.type || 'unknown'}
91
+ Entry points: ${(archData.entryPoints || []).join(', ')}
92
+ Top-level structure: ${(archData.topLevelDirs || []).join(', ')}
93
+
94
+ TASK:
95
+ 1. What architecture pattern is being used? (feature-based, layer-based, etc.)
96
+ 2. Is this architecture appropriate for the project's size and purpose?
97
+ 3. What are the architectural strengths?
98
+ 4. What are the architectural weaknesses or risks?
99
+ 5. If you could change ONE thing about the architecture, what would it be?
100
+
101
+ Answer in short bullet points. No fluff.`,
102
+ tokensEstimate: 250,
103
+ });
104
+ }
105
+ // ── Blind Spots Analysis Prompt ─────────────────────────────────────
106
+ const blindSpots = readBlindSpotsFromDB(db, projectName);
107
+ if (blindSpots.length > 0) {
108
+ const spotSummary = blindSpots.slice(0, 10).map(b => `- ${b.value || b.description} (severity: ${b.severity || 'medium'})`).join('\n');
109
+ prompts.push({
110
+ title: 'Blind Spots & Issues Analysis',
111
+ category: 'blind_spots',
112
+ prompt: `Analyze these detected blind spots and code issues.
113
+
114
+ PROJECT: ${projectName}
115
+
116
+ DETECTED ISSUES:
117
+ ${spotSummary}
118
+
119
+ TASK:
120
+ 1. Which 3 issues are MOST critical and should be fixed FIRST?
121
+ 2. For each of those 3: what's the root cause?
122
+ 3. What's the SIMPLEST fix for each?
123
+ 4. Are any of these interconnected (fixing one helps another)?
124
+ 5. What's the estimated effort to fix the top 3?
125
+
126
+ Answer in short bullet points. Be specific about fixes.`,
127
+ tokensEstimate: 300,
128
+ });
129
+ }
130
+ // ── Recommendations Prompt ──────────────────────────────────────────
131
+ const patterns = readPatternsFromDB(db, projectName);
132
+ if (patterns.length > 0) {
133
+ const patternSummary = patterns.slice(0, 10).map(p => `${p.category}: ${p.value} (${p.count}x)`).join('\n');
134
+ prompts.push({
135
+ title: 'Improvement Recommendations',
136
+ category: 'recommendations',
137
+ prompt: `Based on this codebase analysis, suggest improvements.
138
+
139
+ PROJECT: ${projectName}
140
+ Top patterns:
141
+ ${patternSummary}
142
+ ${blindSpots.length > 0 ? `\nKnown issues: ${blindSpots.length} detected` : ''}
143
+
144
+ TASK:
145
+ 1. What 5 specific improvements would most benefit this project?
146
+ 2. Which improvements are "quick wins" (under 1 hour)?
147
+ 3. Which improvements are "strategic" (need planning)?
148
+ 4. Is there any technology or library you'd recommend adding?
149
+ 5. Is there anything you'd recommend REMOVING or REPLACING?
150
+
151
+ Answer in bullet points. Be actionable and specific.`,
152
+ tokensEstimate: 250,
153
+ });
154
+ }
155
+ return prompts;
156
+ }
157
+ // ─── Insight Saver ─────────────────────────────────────────────────────────
158
+ function saveAIInsight(project, category, content) {
159
+ const db = (0, database_1.getDb)();
160
+ db.exec(`
161
+ CREATE TABLE IF NOT EXISTS ai_insights (
162
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
163
+ project TEXT NOT NULL,
164
+ category TEXT NOT NULL,
165
+ content TEXT NOT NULL,
166
+ source TEXT DEFAULT 'ai',
167
+ created_at TEXT DEFAULT (datetime('now'))
168
+ );
169
+ `);
170
+ db.prepare('INSERT INTO ai_insights (project, category, content) VALUES (?, ?, ?)').run(project, category, content);
171
+ // Also save to JSON for human reading
172
+ const insightDir = path.join(CELL_DIR, 'personal', 'insights');
173
+ if (!fs.existsSync(insightDir))
174
+ fs.mkdirSync(insightDir, { recursive: true });
175
+ const insightFile = path.join(insightDir, `${category}.md`);
176
+ fs.writeFileSync(insightFile, `# ${category}\nGenerated: ${new Date().toISOString()}\n\n${content}`, 'utf-8');
177
+ }
178
+ function getAIInsights(project) {
179
+ const db = (0, database_1.getDb)();
180
+ const query = project
181
+ ? 'SELECT category, content, created_at, source FROM ai_insights WHERE project = ? ORDER BY created_at DESC'
182
+ : 'SELECT category, content, created_at, source FROM ai_insights ORDER BY created_at DESC';
183
+ const params = project ? [project] : [];
184
+ try {
185
+ const rows = db.prepare(query).all(...(params));
186
+ return rows.map(r => ({
187
+ category: r.category,
188
+ content: r.content,
189
+ timestamp: r.created_at,
190
+ source: r.source,
191
+ }));
192
+ }
193
+ catch {
194
+ return [];
195
+ }
196
+ }
197
+ // ─── Display ───────────────────────────────────────────────────────────────
198
+ function getAnalysisCommand(projectDir) {
199
+ const prompts = generateAnalysisPrompts(projectDir);
200
+ const intro = '═══ CELL AI ANALYSIS PROMPTS ═══\n\nCopy any prompt below to your AI tool (Cursor, Claude Code, etc.).\nAfter getting results, run: cell analyze --save <category>\n';
201
+ return { intro, prompts };
202
+ }
203
+ // ─── DB Helpers ────────────────────────────────────────────────────────────
204
+ function readStackFromDB(db, project) {
205
+ try {
206
+ const row = db.prepare("SELECT pattern_value FROM code_patterns WHERE pattern_type = 'project_dna' AND project = ? LIMIT 1").get(project);
207
+ if (row?.pattern_value)
208
+ return JSON.parse(row.pattern_value);
209
+ }
210
+ catch { }
211
+ return null;
212
+ }
213
+ function readArchitectureFromDB(db, project) {
214
+ try {
215
+ const row = db.prepare("SELECT pattern_value FROM code_patterns WHERE pattern_type = 'architecture' AND project = ? LIMIT 1").get(project);
216
+ if (row?.pattern_value)
217
+ return JSON.parse(row.pattern_value);
218
+ }
219
+ catch { }
220
+ return null;
221
+ }
222
+ function readBlindSpotsFromDB(db, project) {
223
+ try {
224
+ return db.prepare("SELECT pattern_value as value, count FROM code_patterns WHERE category = 'blind_spots' AND project = ? ORDER BY count DESC LIMIT 20").all(project);
225
+ }
226
+ catch {
227
+ return [];
228
+ }
229
+ }
230
+ function readPatternsFromDB(db, project) {
231
+ try {
232
+ return db.prepare("SELECT category, pattern_value as value, count FROM code_patterns WHERE project = ? AND category IN ('style','naming','functions','architecture','testing') ORDER BY count DESC LIMIT 20").all(project);
233
+ }
234
+ catch {
235
+ return [];
236
+ }
237
+ }
238
+ function readTopFiles(dir, limit) {
239
+ try {
240
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
241
+ return entries
242
+ .filter(e => e.isFile() && !e.name.startsWith('.'))
243
+ .slice(0, limit)
244
+ .map(e => e.name);
245
+ }
246
+ catch {
247
+ return [];
248
+ }
249
+ }
250
+ //# sourceMappingURL=ai-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-bridge.js","sourceRoot":"","sources":["../src/ai-bridge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"behavior-intelligence.d.ts","sourceRoot":"","sources":["../src/behavior-intelligence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"behavior-intelligence.d.ts","sourceRoot":"","sources":["../src/behavior-intelligence.ts"],"names":[],"mappings":"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"}
@@ -60,7 +60,12 @@ function gitLog(projectDir, format = '%H|%ai|%s|%b', limit = 500) {
60
60
  return safeExec(`git log -${limit} --format="${format}"`);
61
61
  }
62
62
  function performGitIn(dir, cmd) {
63
- return safeExec(cmd);
63
+ try {
64
+ return (0, child_process_1.execSync)(cmd, { encoding: 'utf-8', cwd: dir, maxBuffer: 50 * 1024 * 1024, timeout: 30000, stdio: ['pipe', 'pipe', 'ignore'] }).trim();
65
+ }
66
+ catch {
67
+ return '';
68
+ }
64
69
  }
65
70
  function commitLog(projectDir, limit = 500) {
66
71
  if (!fs.existsSync(path.join(projectDir, '.git')))
@@ -172,6 +177,12 @@ function detectBlindSpots(rootDir) {
172
177
  largeFunctions++;
173
178
  largeFunctionFiles.push(path.relative(rootDir, f));
174
179
  }
180
+ if (!/\?\.|\!==\s*null|!==\s*undefined|===\s*null|===\s*undefined|\|\|\s*['"`]|null\s*\|\|/.test(content) &&
181
+ /\.(find|findOne|findFirst|findMany|get|query|fetch|json)\s*\(/.test(content) &&
182
+ content.length > 200) {
183
+ missingNullChecks++;
184
+ missingNullChecksFiles.push(path.relative(rootDir, f));
185
+ }
175
186
  }
176
187
  if ((ext === '.ts' || ext === '.tsx' || ext === '.py') && !isTest) {
177
188
  const baseName = path.basename(f, ext);