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 @@
1
+ {"version":3,"file":"session-bridge.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-bridge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
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 session_memory_1 = require("../core/session-memory");
37
+ const database_1 = require("../core/database");
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const fs = __importStar(require("fs"));
41
+ describe('session bridge (Unit 2.6)', () => {
42
+ let mem;
43
+ let originalHome;
44
+ let tmpHome;
45
+ beforeAll(() => {
46
+ tmpHome = path.join(os.tmpdir(), 'fivo-cell-bridge-test-' + Date.now());
47
+ fs.mkdirSync(tmpHome, { recursive: true });
48
+ originalHome = process.env.USERPROFILE;
49
+ process.env.USERPROFILE = tmpHome;
50
+ try {
51
+ (0, database_1.closeDb)();
52
+ }
53
+ catch { /* ignore */ }
54
+ mem = new session_memory_1.SessionMemory();
55
+ });
56
+ afterAll(() => {
57
+ process.env.USERPROFILE = originalHome;
58
+ try {
59
+ (0, database_1.closeDb)();
60
+ }
61
+ catch { /* ignore */ }
62
+ try {
63
+ fs.rmSync(tmpHome, { recursive: true, force: true });
64
+ }
65
+ catch { /* ignore */ }
66
+ });
67
+ beforeEach(() => {
68
+ try {
69
+ (0, database_1.closeDb)();
70
+ }
71
+ catch { /* ignore */ }
72
+ mem = new session_memory_1.SessionMemory();
73
+ try {
74
+ const db = (0, database_1.getDb)();
75
+ db.exec('DELETE FROM sessions; DELETE FROM session_approaches; DELETE FROM session_files; DELETE FROM session_questions;');
76
+ }
77
+ catch { /* ignore */ }
78
+ });
79
+ it('first session: getLastSessionForProject returns null', () => {
80
+ const last = mem.getLastSessionForProject('bridge-test-project');
81
+ expect(last).toBeNull();
82
+ });
83
+ it('bridge from claude-code → cursor: previous session is endable and retrievable', () => {
84
+ const project = 'bridge-test-1';
85
+ const s1 = mem.startSession('claude-code', project);
86
+ mem.recordFileTouch({ sessionId: s1, project, filePath: 'src/foo.ts' });
87
+ mem.recordApproach({ sessionId: s1, project, approach: 'better-sqlite3', status: 'succeeded' });
88
+ mem.recordQuestion({ sessionId: s1, project, question: 'How to migrate?' });
89
+ mem.endSession(s1, {
90
+ filesTouched: ['src/foo.ts'],
91
+ keyDecisions: ['use better-sqlite3'],
92
+ contextSnapshot: 'Phase 2.5 done',
93
+ });
94
+ const last = mem.getLastSessionForProject(project);
95
+ expect(last).not.toBeNull();
96
+ expect(last?.toolName).toBe('claude-code');
97
+ expect(last?.contextSnapshot).toBe('Phase 2.5 done');
98
+ expect(last?.endTime).toBeDefined();
99
+ });
100
+ it('startSession returns new session id, and new session starts after old', async () => {
101
+ const project = 'bridge-test-2';
102
+ const s1 = mem.startSession('claude-code', project);
103
+ mem.endSession(s1, { filesTouched: [], keyDecisions: [], contextSnapshot: 's1 done' });
104
+ await new Promise(r => setTimeout(r, 10));
105
+ const s2 = mem.startSession('cursor', project);
106
+ expect(s2).toBeGreaterThan(s1);
107
+ const last = mem.getLastSessionForProject(project);
108
+ expect(last?.id).toBe(s1);
109
+ });
110
+ it('SessionMemory preserves session_approaches across end/start (anti-repetition data)', () => {
111
+ const project = 'bridge-test-3';
112
+ const s1 = mem.startSession('claude-code', project);
113
+ mem.recordApproach({ sessionId: s1, project, approach: 'chokidar', status: 'failed' });
114
+ mem.endSession(s1, { filesTouched: [], keyDecisions: [], contextSnapshot: '' });
115
+ const recent = mem.getRecentApproaches(project, 5);
116
+ expect(recent.length).toBeGreaterThan(0);
117
+ const chokidar = recent.find(a => a.approach === 'chokidar');
118
+ expect(chokidar?.status).toBe('failed');
119
+ });
120
+ it('SessionMemory preserves session_questions across sessions (open questions persist)', () => {
121
+ const project = 'bridge-test-4';
122
+ const s1 = mem.startSession('claude-code', project);
123
+ const qId = mem.recordQuestion({ sessionId: s1, project, question: 'How to detect tool switch?', priority: 'high' });
124
+ mem.endSession(s1, { filesTouched: [], keyDecisions: [], contextSnapshot: '' });
125
+ const s2 = mem.startSession('cursor', project);
126
+ const open = mem.getOpenQuestions(project);
127
+ expect(open.length).toBeGreaterThan(0);
128
+ const found = open.find(q => q.id === qId);
129
+ expect(found?.question).toContain('tool switch');
130
+ mem.endSession(s2, { filesTouched: [], keyDecisions: [], contextSnapshot: '' });
131
+ });
132
+ it('SessionMemory preserves session_files across sessions (hot files persist)', () => {
133
+ const project = 'bridge-test-5';
134
+ const s1 = mem.startSession('claude-code', project);
135
+ mem.recordFileTouch({ sessionId: s1, project, filePath: 'src/foo.ts' });
136
+ mem.recordFileTouch({ sessionId: s1, project, filePath: 'src/foo.ts' });
137
+ mem.endSession(s1, { filesTouched: [], keyDecisions: [], contextSnapshot: '' });
138
+ const s2 = mem.startSession('cursor', project);
139
+ const top = mem.getMostTouchedFiles(project, 5);
140
+ const foo = top.find(f => f.filePath === 'src/foo.ts');
141
+ expect(foo).toBeDefined();
142
+ expect(foo?.touchCount).toBeGreaterThanOrEqual(2);
143
+ mem.endSession(s2, { filesTouched: [], keyDecisions: [], contextSnapshot: '' });
144
+ });
145
+ it('getRecentSessions returns sessions in time order', async () => {
146
+ const project = 'bridge-test-6';
147
+ const s1 = mem.startSession('claude-code', project);
148
+ mem.endSession(s1, { filesTouched: [], keyDecisions: [], contextSnapshot: 'first' });
149
+ await new Promise(r => setTimeout(r, 10));
150
+ const s2 = mem.startSession('cursor', project);
151
+ mem.endSession(s2, { filesTouched: [], keyDecisions: [], contextSnapshot: 'second' });
152
+ const recent = mem.getRecentSessions(10).filter(s => s.project === project);
153
+ expect(recent.length).toBeGreaterThanOrEqual(2);
154
+ const last = recent[0];
155
+ expect(last.id).toBe(s2);
156
+ });
157
+ });
158
+ //# sourceMappingURL=session-bridge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-bridge.test.js","sourceRoot":"","sources":["../../src/__tests__/session-bridge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-memory-tables.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-memory-tables.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-memory-tables.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,169 @@
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 session_memory_1 = require("../core/session-memory");
37
+ const database_1 = require("../core/database");
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const fs = __importStar(require("fs"));
41
+ describe('session memory normalized tables (Unit 2.2)', () => {
42
+ let mem;
43
+ let originalHome;
44
+ let tmpHome;
45
+ beforeAll(() => {
46
+ tmpHome = path.join(os.tmpdir(), 'fivo-cell-test-' + Date.now());
47
+ fs.mkdirSync(tmpHome, { recursive: true });
48
+ originalHome = process.env.USERPROFILE;
49
+ process.env.USERPROFILE = tmpHome;
50
+ try {
51
+ (0, database_1.closeDb)();
52
+ }
53
+ catch { /* ignore */ }
54
+ mem = new session_memory_1.SessionMemory();
55
+ });
56
+ afterAll(() => {
57
+ process.env.USERPROFILE = originalHome;
58
+ try {
59
+ (0, database_1.closeDb)();
60
+ }
61
+ catch { /* ignore */ }
62
+ try {
63
+ fs.rmSync(tmpHome, { recursive: true, force: true });
64
+ }
65
+ catch { /* ignore */ }
66
+ });
67
+ beforeEach(() => {
68
+ try {
69
+ (0, database_1.closeDb)();
70
+ }
71
+ catch { /* ignore */ }
72
+ mem = new session_memory_1.SessionMemory();
73
+ try {
74
+ const db = (0, database_1.getDb)();
75
+ db.exec('DELETE FROM sessions; DELETE FROM session_approaches; DELETE FROM session_files; DELETE FROM session_questions;');
76
+ }
77
+ catch { /* ignore */ }
78
+ });
79
+ it('recordApproach persists an approach with status and outcome', () => {
80
+ const sessionId = mem.startSession('claude-code', 'fivo-cell');
81
+ const approachId = mem.recordApproach({
82
+ sessionId,
83
+ project: 'fivo-cell',
84
+ approach: 'chokidar for file watching',
85
+ status: 'failed',
86
+ reason: 'too heavy, battery drain',
87
+ });
88
+ expect(approachId).toBeGreaterThan(0);
89
+ const approaches = mem.getSessionApproaches(sessionId);
90
+ expect(approaches.length).toBe(1);
91
+ expect(approaches[0].approach).toBe('chokidar for file watching');
92
+ expect(approaches[0].status).toBe('failed');
93
+ });
94
+ it('getRecentApproaches aggregates across all sessions (anti-repetition list)', () => {
95
+ const sessionId1 = mem.startSession('claude-code', 'fivo-cell');
96
+ mem.recordApproach({ sessionId: sessionId1, project: 'fivo-cell', approach: 'chokidar for file watching', status: 'failed' });
97
+ mem.recordApproach({ sessionId: sessionId1, project: 'fivo-cell', approach: 'JSON files for session state', status: 'partial' });
98
+ const sessionId2 = mem.startSession('cursor', 'fivo-cell');
99
+ mem.recordApproach({ sessionId: sessionId2, project: 'fivo-cell', approach: 'chokidar for file watching', status: 'failed' });
100
+ const recent = mem.getRecentApproaches('fivo-cell', 10);
101
+ expect(recent.length).toBeGreaterThanOrEqual(2);
102
+ const chokidar = recent.find(a => a.approach === 'chokidar for file watching');
103
+ expect(chokidar).toBeDefined();
104
+ expect(chokidar?.count).toBeGreaterThanOrEqual(2);
105
+ });
106
+ it('recordFileTouch persists file activity for a session', () => {
107
+ const sessionId = mem.startSession('cursor', 'fivo-cell');
108
+ mem.recordFileTouch({ sessionId, project: 'fivo-cell', filePath: 'src/session-memory.ts' });
109
+ mem.recordFileTouch({ sessionId, project: 'fivo-cell', filePath: 'src/core/database.ts' });
110
+ mem.recordFileTouch({ sessionId, project: 'fivo-cell', filePath: 'src/session-memory.ts' });
111
+ const files = mem.getSessionFiles(sessionId);
112
+ expect(files.length).toBe(2);
113
+ const mem2 = files.find(f => f.filePath === 'src/session-memory.ts');
114
+ expect(mem2?.touchCount).toBe(2);
115
+ });
116
+ it('getMostTouchedFiles returns top files across sessions', () => {
117
+ const sId = mem.startSession('claude-code', 'fivo-cell');
118
+ mem.recordFileTouch({ sessionId: sId, project: 'fivo-cell', filePath: 'src/core/prompt-builder.ts' });
119
+ mem.recordFileTouch({ sessionId: sId, project: 'fivo-cell', filePath: 'src/core/prompt-builder.ts' });
120
+ mem.recordFileTouch({ sessionId: sId, project: 'fivo-cell', filePath: 'src/core/prompt-builder.ts' });
121
+ const top = mem.getMostTouchedFiles('fivo-cell', 5);
122
+ expect(top.length).toBeGreaterThan(0);
123
+ const builder = top.find(f => f.filePath === 'src/core/prompt-builder.ts');
124
+ expect(builder).toBeDefined();
125
+ expect(builder?.touchCount).toBeGreaterThanOrEqual(3);
126
+ });
127
+ it('recordQuestion persists an open question with priority', () => {
128
+ const sessionId = mem.startSession('claude-code', 'fivo-cell');
129
+ const qId = mem.recordQuestion({
130
+ sessionId,
131
+ project: 'fivo-cell',
132
+ question: 'Should session end after 30min inactivity or explicit close?',
133
+ priority: 'high',
134
+ });
135
+ expect(qId).toBeGreaterThan(0);
136
+ const questions = mem.getOpenQuestions('fivo-cell');
137
+ expect(questions.length).toBeGreaterThan(0);
138
+ const found = questions.find(q => q.id === qId);
139
+ expect(found?.question).toContain('30min');
140
+ expect(found?.resolved).toBe(false);
141
+ });
142
+ it('resolveQuestion marks a question as answered', () => {
143
+ const sessionId = mem.startSession('claude-code', 'fivo-cell');
144
+ const qId = mem.recordQuestion({
145
+ sessionId,
146
+ project: 'fivo-cell',
147
+ question: 'How to detect tool switch (Cursor → Claude Code)?',
148
+ priority: 'medium',
149
+ });
150
+ mem.resolveQuestion(qId, 'Compare tool_name on new session start with previous session end');
151
+ const questions = mem.getOpenQuestions('fivo-cell');
152
+ const found = questions.find(q => q.id === qId);
153
+ expect(found).toBeUndefined();
154
+ });
155
+ it('SessionMemory class still works end-to-end (regression)', () => {
156
+ const sessionId = mem.startSession('windsurf', 'fivo-cell');
157
+ mem.recordFileTouch({ sessionId, project: 'fivo-cell', filePath: 'src/foo.ts' });
158
+ mem.recordApproach({ sessionId, project: 'fivo-cell', approach: 'use better-sqlite3', status: 'succeeded' });
159
+ mem.recordQuestion({ sessionId, project: 'fivo-cell', question: 'which migration approach?' });
160
+ mem.endSession(sessionId, {
161
+ filesTouched: ['src/foo.ts'],
162
+ keyDecisions: ['better-sqlite3 over sql.js'],
163
+ contextSnapshot: 'Test context',
164
+ });
165
+ const recent = mem.getRecentSessions(5);
166
+ expect(recent.length).toBeGreaterThan(0);
167
+ });
168
+ });
169
+ //# sourceMappingURL=session-memory-tables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-memory-tables.test.js","sourceRoot":"","sources":["../../src/__tests__/session-memory-tables.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=staleness-detection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness-detection.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/staleness-detection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const prompt_builder_1 = require("../core/prompt-builder");
4
+ const prompt_builder_2 = require("../core/prompt-builder");
5
+ const mockDb = {
6
+ prepare: jest.fn(),
7
+ };
8
+ jest.mock('../core/database', () => ({
9
+ getDb: () => mockDb,
10
+ }));
11
+ function fakeStmt(rows) {
12
+ return {
13
+ all: (..._args) => rows,
14
+ get: (..._args) => rows[0] || undefined,
15
+ };
16
+ }
17
+ function setupMocks(opts = {}) {
18
+ const profileScannedAt = opts.profileScannedAt || new Date().toISOString();
19
+ const scanCompletedAt = opts.scanCompletedAt || new Date().toISOString();
20
+ const lastSessionEnd = opts.lastSessionEnd || new Date().toISOString();
21
+ mockDb.prepare.mockReset();
22
+ mockDb.prepare.mockImplementation((sql) => {
23
+ const s = sql.trim().toUpperCase();
24
+ if (s.startsWith('SELECT * FROM DEVELOPER_PROFILES')) {
25
+ return fakeStmt([{ id: 1, project: 'fivo-cell', files_scanned: 100, total_lines: 5000, scanned_at: profileScannedAt }]);
26
+ }
27
+ if (s.startsWith('SELECT * FROM SCANS')) {
28
+ return fakeStmt([{ id: 1, project: 'fivo-cell', started_at: scanCompletedAt, completed_at: scanCompletedAt, files_scanned: 100 }]);
29
+ }
30
+ if (s.includes('SESSION_APPROACHES') && s.includes('GROUP BY'))
31
+ return fakeStmt([]);
32
+ if (s.startsWith('SELECT FILE_PATH') && s.includes('SESSION_FILES'))
33
+ return fakeStmt([]);
34
+ if (s.startsWith('SELECT * FROM SESSION_QUESTIONS'))
35
+ return fakeStmt([]);
36
+ if (s.startsWith('SELECT * FROM SESSIONS')) {
37
+ return fakeStmt([{ id: 1, tool_name: 'cursor', project: 'fivo-cell', start_time: lastSessionEnd, end_time: lastSessionEnd, files_touched: '[]', key_decisions: '[]', context_snapshot: '' }]);
38
+ }
39
+ return fakeStmt([]);
40
+ });
41
+ }
42
+ describe('staleness detection (Unit 2.4)', () => {
43
+ it('getStalenessStatus returns "fresh" for data < 1 day old', () => {
44
+ expect((0, prompt_builder_2.getStalenessStatus)(new Date().toISOString(), 1)).toBe('fresh');
45
+ });
46
+ it('getStalenessStatus returns "fresh" for data < 7 days old (default)', () => {
47
+ const threeDaysAgo = new Date(Date.now() - 3 * 24 * 3600 * 1000).toISOString();
48
+ expect((0, prompt_builder_2.getStalenessStatus)(threeDaysAgo)).toBe('fresh');
49
+ });
50
+ it('getStalenessStatus returns "stale" for data 7-30 days old', () => {
51
+ const fifteenDaysAgo = new Date(Date.now() - 15 * 24 * 3600 * 1000).toISOString();
52
+ expect((0, prompt_builder_2.getStalenessStatus)(fifteenDaysAgo)).toBe('stale');
53
+ });
54
+ it('getStalenessStatus returns "expired" for data > 30 days old', () => {
55
+ const sixtyDaysAgo = new Date(Date.now() - 60 * 24 * 3600 * 1000).toISOString();
56
+ expect((0, prompt_builder_2.getStalenessStatus)(sixtyDaysAgo)).toBe('expired');
57
+ });
58
+ it('getStalenessStatus returns "unknown" for missing data', () => {
59
+ expect((0, prompt_builder_2.getStalenessStatus)(undefined)).toBe('unknown');
60
+ expect((0, prompt_builder_2.getStalenessStatus)('')).toBe('unknown');
61
+ });
62
+ it('getStalenessStatus returns "unknown" for invalid dates', () => {
63
+ expect((0, prompt_builder_2.getStalenessStatus)('not-a-date')).toBe('unknown');
64
+ });
65
+ it('context includes staleness info for fresh data', () => {
66
+ setupMocks({ profileScannedAt: new Date().toISOString() });
67
+ const ctx = (0, prompt_builder_1.buildContext)('fivo-cell', 'claude-code');
68
+ expect(ctx.staleness).toBeDefined();
69
+ expect(ctx.staleness?.profile).toBe('fresh');
70
+ expect(ctx.staleness?.shouldRescan).toBe(false);
71
+ });
72
+ it('context includes staleness warning for stale data', () => {
73
+ const tenDaysAgo = new Date(Date.now() - 10 * 24 * 3600 * 1000).toISOString();
74
+ setupMocks({ profileScannedAt: tenDaysAgo });
75
+ const ctx = (0, prompt_builder_1.buildContext)('fivo-cell', 'claude-code');
76
+ expect(ctx.staleness?.profile).toBe('stale');
77
+ expect(ctx.staleness?.shouldRescan).toBe(true);
78
+ });
79
+ it('context includes staleness critical for expired data', () => {
80
+ const sixtyDaysAgo = new Date(Date.now() - 60 * 24 * 3600 * 1000).toISOString();
81
+ setupMocks({ profileScannedAt: sixtyDaysAgo });
82
+ const ctx = (0, prompt_builder_1.buildContext)('fivo-cell', 'claude-code');
83
+ expect(ctx.staleness?.profile).toBe('expired');
84
+ expect(ctx.staleness?.shouldRescan).toBe(true);
85
+ });
86
+ it('formatContextForInjection shows staleness warning when data is stale', () => {
87
+ const tenDaysAgo = new Date(Date.now() - 10 * 24 * 3600 * 1000).toISOString();
88
+ setupMocks({ profileScannedAt: tenDaysAgo });
89
+ const ctx = (0, prompt_builder_1.buildContext)('fivo-cell', 'claude-code');
90
+ const out = (0, prompt_builder_1.formatContextForInjection)(ctx, false);
91
+ expect(out).toMatch(/STALE|stale|rescan|RUN `cell scan`|re-scan/i);
92
+ });
93
+ it('formatContextForInjection does NOT show staleness warning for fresh data', () => {
94
+ setupMocks({ profileScannedAt: new Date().toISOString() });
95
+ const ctx = (0, prompt_builder_1.buildContext)('fivo-cell', 'claude-code');
96
+ const out = (0, prompt_builder_1.formatContextForInjection)(ctx, false);
97
+ expect(out).not.toMatch(/stale|expired|rescan/i);
98
+ });
99
+ it('staleness threshold is configurable (default 7 days)', () => {
100
+ const fiveDaysAgo = new Date(Date.now() - 5 * 24 * 3600 * 1000).toISOString();
101
+ expect((0, prompt_builder_2.getStalenessStatus)(fiveDaysAgo, 7)).toBe('fresh');
102
+ expect((0, prompt_builder_2.getStalenessStatus)(fiveDaysAgo, 3)).toBe('stale');
103
+ });
104
+ });
105
+ //# sourceMappingURL=staleness-detection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness-detection.test.js","sourceRoot":"","sources":["../../src/__tests__/staleness-detection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=team-collaboration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-collaboration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/team-collaboration.test.ts"],"names":[],"mappings":""}