@monoes/monograph 1.2.6 → 1.2.8

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 (45) hide show
  1. package/__tests__/search/embed-batch-config.test.ts +28 -18
  2. package/__tests__/wiki/providers.test.ts +21 -9
  3. package/__tests__/wiki/wiki-generator.test.ts +19 -9
  4. package/dist/src/analysis/file-classifier.d.ts +1 -1
  5. package/dist/src/analysis/file-classifier.d.ts.map +1 -1
  6. package/dist/src/analysis/file-classifier.js +4 -1
  7. package/dist/src/analysis/file-classifier.js.map +1 -1
  8. package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
  9. package/dist/src/pipeline/orchestrator.js +61 -1
  10. package/dist/src/pipeline/orchestrator.js.map +1 -1
  11. package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -1
  12. package/dist/src/pipeline/phases/god-nodes.js +9 -2
  13. package/dist/src/pipeline/phases/god-nodes.js.map +1 -1
  14. package/dist/src/pipeline/phases/scan.d.ts.map +1 -1
  15. package/dist/src/pipeline/phases/scan.js +3 -0
  16. package/dist/src/pipeline/phases/scan.js.map +1 -1
  17. package/dist/src/pipeline/phases/surprises.js +1 -1
  18. package/dist/src/pipeline/phases/surprises.js.map +1 -1
  19. package/dist/src/storage/db.d.ts.map +1 -1
  20. package/dist/src/storage/db.js +8 -0
  21. package/dist/src/storage/db.js.map +1 -1
  22. package/dist/src/watch/watcher.d.ts.map +1 -1
  23. package/dist/src/watch/watcher.js +24 -5
  24. package/dist/src/watch/watcher.js.map +1 -1
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +6 -6
  27. package/src/__tests__/analysis/file-classifier.test.ts +2 -2
  28. package/src/analysis/file-classifier.ts +5 -2
  29. package/src/pipeline/orchestrator.ts +46 -1
  30. package/src/pipeline/phases/god-nodes.ts +10 -2
  31. package/src/pipeline/phases/scan.ts +2 -0
  32. package/src/pipeline/phases/surprises.ts +1 -1
  33. package/src/storage/db.ts +8 -0
  34. package/src/watch/watcher.ts +20 -5
  35. package/vitest.config.ts +1 -0
  36. package/.monomind/data/ranked-context.json +0 -5
  37. package/.monomind/loops/mastermind-review-1782162423447.json +0 -16
  38. package/.monomind/sessions/session-1777578175215.json +0 -15
  39. package/.monomind/sessions/session-1777823684507.json +0 -15
  40. package/.monomind/sessions/session-1777928944749.json +0 -15
  41. package/.monomind/sessions/session-1778052902210.json +0 -15
  42. package/.monomind/sessions/session-1778056744636.json +0 -15
  43. package/.monomind/sessions/session-1778061077599.json +0 -15
  44. package/.monomind/sessions/session-1778102154764.json +0 -15
  45. package/dist/src/claude-cli.d.ts +0 -3
@@ -1,21 +1,24 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
-
3
- // Mock HttpEmbedder before importing embedBatch.
4
- // Note: vitest 4.x requires a regular function (not an arrow function) when
5
- // the mock will be called via `new`, because arrow functions are not constructable.
6
- vi.mock('../../src/search/http-embedder.js', () => ({
7
- HttpEmbedder: vi.fn().mockImplementation(function () {
8
- return {
9
- embedBatch: vi.fn().mockResolvedValue([[0.1, 0.2], [0.3, 0.4]]),
10
- };
11
- }),
12
- }));
13
-
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
14
2
  import { embedBatch } from '../../src/search/embed-batch.js';
15
3
  import { HttpEmbedder } from '../../src/search/http-embedder.js';
16
4
 
5
+ // Spy on the prototype method instead of mocking the whole module via a
6
+ // factory: constructing a class through a vi.mock() factory's returned
7
+ // vi.fn() doesn't reliably preserve the factory's `mockImplementation`
8
+ // return value under this vitest/tinyspy version — `new MockedClass()`
9
+ // silently produces an empty auto-mock instance instead. Spying on the real
10
+ // prototype method keeps the real constructor (harmless — it only assigns
11
+ // config, no network call) and avoids that pitfall entirely.
12
+ let embedBatchSpy: ReturnType<typeof vi.spyOn>;
13
+
17
14
  beforeEach(() => {
18
- vi.clearAllMocks();
15
+ embedBatchSpy = vi
16
+ .spyOn(HttpEmbedder.prototype, 'embedBatch')
17
+ .mockResolvedValue([[0.1, 0.2], [0.3, 0.4]]);
18
+ });
19
+
20
+ afterEach(() => {
21
+ embedBatchSpy.mockRestore();
19
22
  });
20
23
 
21
24
  describe('embedBatch with remote config', () => {
@@ -23,7 +26,11 @@ describe('embedBatch with remote config', () => {
23
26
  const result = await embedBatch(['hello', 'world'], {
24
27
  remote: { endpoint: 'http://localhost:1234/embed' },
25
28
  });
26
- expect(HttpEmbedder).toHaveBeenCalledWith({ endpoint: 'http://localhost:1234/embed' });
29
+ expect(embedBatchSpy).toHaveBeenCalledWith(['hello', 'world']);
30
+ const instance = embedBatchSpy.mock.contexts[0] as InstanceType<typeof HttpEmbedder> & {
31
+ config: { endpoint: string };
32
+ };
33
+ expect(instance.config.endpoint).toBe('http://localhost:1234/embed');
27
34
  expect(result).toEqual([[0.1, 0.2], [0.3, 0.4]]);
28
35
  });
29
36
 
@@ -31,7 +38,10 @@ describe('embedBatch with remote config', () => {
31
38
  await embedBatch(['text'], {
32
39
  remote: { endpoint: 'http://host/embed', apiKey: 'sk-test', model: 'nomic' },
33
40
  });
34
- expect(HttpEmbedder).toHaveBeenCalledWith({
41
+ const instance = embedBatchSpy.mock.contexts[0] as InstanceType<typeof HttpEmbedder> & {
42
+ config: { endpoint: string; apiKey: string; model: string };
43
+ };
44
+ expect(instance.config).toMatchObject({
35
45
  endpoint: 'http://host/embed',
36
46
  apiKey: 'sk-test',
37
47
  model: 'nomic',
@@ -42,11 +52,11 @@ describe('embedBatch with remote config', () => {
42
52
  describe('embedBatch without remote config', () => {
43
53
  it('does not instantiate HttpEmbedder when no remote config', async () => {
44
54
  // Local embedder may fail or hang in test env — race against a short timeout
45
- // so we just verify HttpEmbedder was NOT instantiated regardless of outcome.
55
+ // so we just verify HttpEmbedder.embedBatch was NOT called regardless of outcome.
46
56
  await Promise.race([
47
57
  embedBatch(['hello']).catch(() => { /* expected in CI without a real local model */ }),
48
58
  new Promise(resolve => setTimeout(resolve, 500)),
49
59
  ]);
50
- expect(HttpEmbedder).not.toHaveBeenCalled();
60
+ expect(embedBatchSpy).not.toHaveBeenCalled();
51
61
  }, 2000);
52
62
  });
@@ -1,4 +1,14 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+
3
+ // callAnthropic routes through the local Claude Code CLI (claudeCliCall), not
4
+ // fetch — it reuses the host's existing auth instead of an ANTHROPIC_API_KEY.
5
+ // Mock that call directly rather than fetch, or these tests spawn the real
6
+ // `claude` CLI (slow, and dependent on this machine's Claude Code install).
7
+ const mockClaudeCliCall = vi.fn();
8
+ vi.mock('../../src/claude-cli.js', () => ({
9
+ claudeCliCall: mockClaudeCliCall,
10
+ }));
11
+
2
12
  import { callLLM } from '../../src/wiki/providers.js';
3
13
 
4
14
  const mockFetch = vi.fn();
@@ -8,22 +18,24 @@ function makeResponse(body: unknown, ok = true, status = 200) {
8
18
  return { ok, status, statusText: ok ? 'OK' : 'Error', json: async () => body };
9
19
  }
10
20
 
11
- beforeEach(() => mockFetch.mockReset());
21
+ beforeEach(() => {
22
+ mockFetch.mockReset();
23
+ mockClaudeCliCall.mockReset();
24
+ });
12
25
 
13
26
  describe('callLLM - anthropic', () => {
14
27
  it('returns text from response', async () => {
15
- mockFetch.mockResolvedValueOnce(makeResponse({
16
- content: [{ text: 'Hello from Claude' }],
17
- usage: { input_tokens: 10, output_tokens: 5 },
18
- }));
28
+ mockClaudeCliCall.mockResolvedValueOnce('Hello from Claude');
19
29
  const r = await callLLM('Say hi', { provider: 'anthropic', apiKey: 'sk-test' });
20
30
  expect(r.text).toBe('Hello from Claude');
21
- expect(r.inputTokens).toBe(10);
31
+ expect(mockClaudeCliCall).toHaveBeenCalledWith('Say hi');
22
32
  });
23
33
 
24
- it('throws on non-2xx', async () => {
25
- mockFetch.mockResolvedValueOnce(makeResponse({}, false, 401));
26
- await expect(callLLM('hi', { provider: 'anthropic', apiKey: 'bad' })).rejects.toThrow('401');
34
+ it('throws when the claude CLI call fails', async () => {
35
+ mockClaudeCliCall.mockRejectedValueOnce(new Error('claude exited with code 1'));
36
+ await expect(callLLM('hi', { provider: 'anthropic', apiKey: 'bad' })).rejects.toThrow(
37
+ 'claude exited with code 1',
38
+ );
27
39
  });
28
40
  });
29
41
 
@@ -1,7 +1,19 @@
1
1
  import { tmpdir } from 'os';
2
2
  import { join } from 'path';
3
3
  import { unlinkSync, existsSync } from 'fs';
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+
6
+ // The no-llmClient/no-llmConfig default path in generateWikiPage now routes
7
+ // through the local Claude Code CLI (see claude-cli.ts) instead of requiring
8
+ // ANTHROPIC_API_KEY directly. Mock isClaudeCliAvailable so the "no client
9
+ // configured" failure test doesn't depend on whether this machine happens to
10
+ // have the CLI installed.
11
+ const mockIsClaudeCliAvailable = vi.fn();
12
+ vi.mock('../../src/claude-cli.js', () => ({
13
+ isClaudeCliAvailable: mockIsClaudeCliAvailable,
14
+ claudeCliCall: vi.fn(),
15
+ }));
16
+
5
17
  import { openDb, closeDb } from '../../src/storage/db.js';
6
18
  import { insertNode } from '../../src/storage/node-store.js';
7
19
  import { insertEdge } from '../../src/storage/edge-store.js';
@@ -71,6 +83,7 @@ const edgeBC: MonographEdge = {
71
83
  };
72
84
 
73
85
  beforeEach(() => {
86
+ mockIsClaudeCliAvailable.mockReset();
74
87
  db = openDb(dbPath);
75
88
  // Insert community records
76
89
  db.prepare('INSERT OR IGNORE INTO communities (id, label, size) VALUES (?, ?, ?)').run(1, 'Core Module', 2);
@@ -185,14 +198,11 @@ describe('generateWikiPage', () => {
185
198
  expect(capturedPrompt).toContain('Core Module');
186
199
  });
187
200
 
188
- it('throws ANTHROPIC_API_KEY not set error when no key and no client', async () => {
189
- const origKey = process.env['ANTHROPIC_API_KEY'];
190
- delete process.env['ANTHROPIC_API_KEY'];
191
- try {
192
- await expect(generateWikiPage(db, '1')).rejects.toThrow('ANTHROPIC_API_KEY not set');
193
- } finally {
194
- if (origKey !== undefined) process.env['ANTHROPIC_API_KEY'] = origKey;
195
- }
201
+ it('throws Claude Code CLI not found error when no client and CLI unavailable', async () => {
202
+ // The no-llmClient/no-llmConfig default path checks isClaudeCliAvailable()
203
+ // rather than an API key — it reuses the host's Claude Code auth instead.
204
+ mockIsClaudeCliAvailable.mockReturnValue(false);
205
+ await expect(generateWikiPage(db, '1')).rejects.toThrow('Claude Code CLI not found');
196
206
  });
197
207
  });
198
208
 
@@ -1,4 +1,4 @@
1
- export type FileType = 'CODE' | 'DOCUMENT' | 'PAPER' | 'IMAGE' | 'VIDEO';
1
+ export type FileType = 'CODE' | 'DOCUMENT' | 'PAPER' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DATA' | 'UNKNOWN';
2
2
  export declare function classifyFile(pathOrUrl: string): FileType;
3
3
  export declare function classifyContent(text: string): FileType;
4
4
  //# sourceMappingURL=file-classifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-classifier.d.ts","sourceRoot":"","sources":["../../../src/analysis/file-classifier.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AA0CzE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAgBxD;AAmBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAItD"}
1
+ {"version":3,"file":"file-classifier.d.ts","sourceRoot":"","sources":["../../../src/analysis/file-classifier.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AA4CxG,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAiBxD;AAmBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAItD"}
@@ -21,6 +21,7 @@ const VIDEO_EXTENSIONS = new Set([
21
21
  '.mp4', '.mkv', '.avi', '.mov', '.webm', '.flv',
22
22
  '.wmv', '.m4v',
23
23
  ]);
24
+ const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a', '.wma']);
24
25
  const PAPER_URL_PATTERNS = [
25
26
  /arxiv\.org/,
26
27
  /semanticscholar\.org/,
@@ -41,6 +42,8 @@ export function classifyFile(pathOrUrl) {
41
42
  return 'IMAGE';
42
43
  if (VIDEO_EXTENSIONS.has(ext))
43
44
  return 'VIDEO';
45
+ if (AUDIO_EXTENSIONS.has(ext))
46
+ return 'AUDIO';
44
47
  if (DOCUMENT_EXTENSIONS.has(ext)) {
45
48
  if (ext === '.pdf' && PAPER_FILENAME_SIGNALS.some(p => p.test(pathOrUrl)))
46
49
  return 'PAPER';
@@ -48,7 +51,7 @@ export function classifyFile(pathOrUrl) {
48
51
  }
49
52
  if (CODE_EXTENSIONS.has(ext))
50
53
  return 'CODE';
51
- return 'CODE';
54
+ return 'UNKNOWN';
52
55
  }
53
56
  const PAPER_CONTENT_SIGNALS = [
54
57
  /\\cite\{/,
@@ -1 +1 @@
1
- {"version":3,"file":"file-classifier.js","sourceRoot":"","sources":["../../../src/analysis/file-classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-classifier.js","sourceRoot":"","sources":["../../../src/analysis/file-classifier.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,aAAa,CAAC;AAWvE,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC5D,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oGAAoG;IACpG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF5F"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,aAAa,CAAC;AAWvE,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC5D,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oGAAoG;IACpG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA4BD,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5F"}
@@ -32,9 +32,69 @@ function getCurrentCommitHash(repoPath) {
32
32
  return null;
33
33
  }
34
34
  }
35
+ // Cross-process build mutex. Callers arrive from several independent entry points
36
+ // (session-start hook, MCP staleness auto-build, CLI, watcher), each with its own
37
+ // ad-hoc lock file that the others don't know about — concurrent builds then fail
38
+ // with "database is locked". Serialize here, the one place all builders pass through.
39
+ async function acquireBuildLock(dbPath) {
40
+ const { writeFileSync, readFileSync, statSync, unlinkSync } = await import('fs');
41
+ const lockPath = dbPath + '.build-lock';
42
+ const tryAcquire = () => {
43
+ try {
44
+ writeFileSync(lockPath, String(process.pid), { flag: 'wx' });
45
+ return true;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ };
51
+ if (!tryAcquire()) {
52
+ // Reclaim if the holder is dead or the lock is older than 30 minutes
53
+ let stale = false;
54
+ try {
55
+ const pid = parseInt(readFileSync(lockPath, 'utf8'), 10);
56
+ try {
57
+ process.kill(pid, 0);
58
+ }
59
+ catch {
60
+ stale = true;
61
+ }
62
+ if (!stale && Date.now() - statSync(lockPath).mtimeMs > 30 * 60 * 1000)
63
+ stale = true;
64
+ }
65
+ catch {
66
+ stale = true;
67
+ }
68
+ if (!stale)
69
+ return null;
70
+ try {
71
+ unlinkSync(lockPath);
72
+ }
73
+ catch { /* raced with another reclaimer */ }
74
+ if (!tryAcquire())
75
+ return null;
76
+ }
77
+ return () => { try {
78
+ unlinkSync(lockPath);
79
+ }
80
+ catch { /* already gone */ } };
81
+ }
35
82
  export async function buildAsync(repoPath, options = {}) {
36
83
  const dbPath = resolve(join(repoPath, '.monomind', 'monograph.db'));
37
84
  const fullOptions = { ...DEFAULT_OPTIONS, ...options };
85
+ const releaseLock = await acquireBuildLock(dbPath);
86
+ if (!releaseLock) {
87
+ options.onProgress?.({ phase: 'skip', message: 'Another build is in progress — skipping' });
88
+ return;
89
+ }
90
+ try {
91
+ await buildAsyncLocked(repoPath, dbPath, fullOptions, options);
92
+ }
93
+ finally {
94
+ releaseLock();
95
+ }
96
+ }
97
+ async function buildAsyncLocked(repoPath, dbPath, fullOptions, options) {
38
98
  // Incremental guard: if the caller requested skip-when-fresh and force is
39
99
  // not set, check staleness before opening the DB for a full write cycle.
40
100
  if (options.incremental && !options.force) {
@@ -80,7 +140,7 @@ export async function buildAsync(repoPath, options = {}) {
80
140
  const liveFiles = new Set(scanOut.filePaths.map((f) => resolve(f)));
81
141
  const staleFiles = db.prepare('SELECT DISTINCT file_path FROM nodes WHERE file_path IS NOT NULL').all()
82
142
  .map((r) => r.file_path)
83
- .filter((f) => !liveFiles.has(resolve(f)));
143
+ .filter((f) => !liveFiles.has(resolve(ctx.repoPath, f)));
84
144
  if (staleFiles.length > 0) {
85
145
  const deleteStale = db.transaction((files) => {
86
146
  // Edges FK-reference nodes with no ON DELETE CASCADE, and a stale node
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/pipeline/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"god-nodes.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AAM7D,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,aAAa,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,OAAO,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IACjG,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAQD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,cAAc,CA8EvD,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA+B7D"}
1
+ {"version":3,"file":"god-nodes.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AAa7D,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,aAAa,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,OAAO,GAAG;QAAE,QAAQ,EAAE,eAAe,CAAC;QAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC,EAAE,CAAC;IACjG,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAQD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,cAAc,CA+EvD,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA+B7D"}
@@ -1,4 +1,10 @@
1
1
  const EXCLUDED_LABELS = new Set(['File', 'Folder', 'Community', 'Concept']);
2
+ // Test files stay in the graph (useful for impact/navigation) but are excluded
3
+ // from centrality rankings — a heavily-importing test suite is not a god node.
4
+ const TEST_PATH_RE = /(\.test\.|\.spec\.|__tests__|__mocks__)/;
5
+ function isTestNode(n) {
6
+ return !!(n.filePath && TEST_PATH_RE.test(n.filePath));
7
+ }
2
8
  function percentile(sorted, p) {
3
9
  if (sorted.length === 0)
4
10
  return 0;
@@ -23,7 +29,7 @@ export const godNodesPhase = {
23
29
  const allFanIn = [];
24
30
  const allFanOut = [];
25
31
  for (const n of symbolNodes) {
26
- if (EXCLUDED_LABELS.has(n.label))
32
+ if (EXCLUDED_LABELS.has(n.label) || isTestNode(n))
27
33
  continue;
28
34
  allFanIn.push(inDeg.get(n.id) ?? 0);
29
35
  allFanOut.push(outDeg.get(n.id) ?? 0);
@@ -41,7 +47,8 @@ export const godNodesPhase = {
41
47
  const p75FanIn = thresholds.p75FanIn;
42
48
  const p75FanOut = thresholds.p75FanOut;
43
49
  const godNodes = symbolNodes
44
- .filter(n => !EXCLUDED_LABELS.has(n.label) && (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0) > p95FanIn)
50
+ .filter(n => !EXCLUDED_LABELS.has(n.label) && !isTestNode(n)
51
+ && (inDeg.get(n.id) ?? 0) + (outDeg.get(n.id) ?? 0) > p95FanIn)
45
52
  .map(n => {
46
53
  const fanIn = inDeg.get(n.id) ?? 0;
47
54
  const fanOut = outDeg.get(n.id) ?? 0;
@@ -1 +1 @@
1
- {"version":3,"file":"god-nodes.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"god-nodes.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/god-nodes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAkBlE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,UAAU,CAuE/C,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAe9F"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAkBlE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,UAAU,CAyE/C,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAe9F"}
@@ -50,6 +50,9 @@ export const scanPhase = {
50
50
  for (const entry of entries) {
51
51
  if (ignoreDirs.has(entry))
52
52
  continue;
53
+ // Skip macOS AppleDouble resource fork files (._*) — common on ExFAT/network volumes
54
+ if (entry.startsWith('._'))
55
+ continue;
53
56
  const fullPath = join(dir, entry);
54
57
  let stat;
55
58
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IACtD,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;IACrD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW;CAClE,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;IAClE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IAC7D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;CAClD,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAOhF,MAAM,CAAC,MAAM,SAAS,GAA8B;IAClD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,EAAE;IACR,KAAK,CAAC,OAAO,CAAC,GAAG;QACf,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvE,iCAAiC;QACjC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAClD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;gBACzD,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS,IAAI,CAAC,GAAW;YACvB,IAAI,OAAiB,CAAC;YACtB,IAAI,CAAC;gBAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACpC,qFAAqF;gBACrF,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,IAAI,IAAiC,CAAC;gBACtC,IAAI,CAAC;oBAAC,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAEtD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,uFAAuF;oBACvF,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACpD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzE,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrH,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;wBAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC1G,IAAI,CAAC,SAAS;4BAAE,SAAS;oBAC3B,CAAC;gBACH,CAAC;gBAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACzC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,SAAS;gBAC1D,IAAI,eAAe,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACxC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAEjE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7E,IAAI,UAAU,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9B,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACnC,CAAC;CACF,CAAC;AAOF,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,UAAU,YAAY,CAAC,IAA+C;IAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,cAAc,CAAC;IACxD,IAAI,IAAI,CAAC,SAAS,GAAG,eAAe,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,2CAA2C;SACpI,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,GAAG,gBAAgB,IAAI,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;QAC7D,OAAO;YACL,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,6BAA6B,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,mDAAmD;SAC3H,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC"}
@@ -47,7 +47,7 @@ export const surprisesPhase = {
47
47
  if (srcFilePath && tgtFilePath) {
48
48
  const srcFileType = classifyFile(srcFilePath);
49
49
  const tgtFileType = classifyFile(tgtFilePath);
50
- if (srcFileType !== tgtFileType) {
50
+ if (srcFileType !== tgtFileType && srcFileType !== 'UNKNOWN' && tgtFileType !== 'UNKNOWN') {
51
51
  score += WEIGHTS.crossRepo; // reuse unused crossRepo weight (0.15)
52
52
  reasons.push(`cross-filetype (${srcFileType}→${tgtFileType})`);
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"surprises.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/surprises.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"surprises.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/surprises.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAE5C,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAWlD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAE7C;AAyBD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CActF"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAE5C,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAmBlD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAE7C;AAyBD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CActF"}
@@ -9,6 +9,14 @@ export function openDb(dbPath) {
9
9
  const db = new Database(dbPath);
10
10
  db.pragma('journal_mode = WAL');
11
11
  db.pragma('foreign_keys = ON');
12
+ // Concurrent pipeline phases + long-lived MCP connections share this DB —
13
+ // without a busy timeout, writers fail immediately with "database is locked".
14
+ db.pragma('busy_timeout = 10000');
15
+ db.pragma('synchronous = NORMAL');
16
+ // node-store uses INSERT OR REPLACE; without recursive_triggers the implicit
17
+ // DELETE never fires the nodes_fts delete trigger, leaving ghost FTS rows that
18
+ // corrupt queries ("missing row N from content table") and bloat the index.
19
+ db.pragma('recursive_triggers = ON');
12
20
  applyMigrations(db);
13
21
  return db;
14
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/storage/db.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/watch/watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8FAA8F;AAC9F,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAYxC;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAMpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB;IAKlE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,YAAY;CAarB"}
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/watch/watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8FAA8F;AAC9F,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAyBxC;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAMpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAEP,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB;IAKlE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,YAAY;CAarB"}
@@ -2,15 +2,31 @@ import chokidar from 'chokidar';
2
2
  import { EventEmitter } from 'events';
3
3
  import { isSupportedExtension } from '../parsers/loader.js';
4
4
  import { extname } from 'path';
5
- import { platform } from 'os';
6
5
  /** Convenience: start a watcher and trigger buildAsync on every change. Returns stop() fn. */
7
6
  export async function watchAsync(repoPath, opts = {}) {
8
7
  const { buildAsync } = await import('../pipeline/orchestrator.js');
9
8
  const watcher = new MonographWatcher(repoPath, { debounceMs: opts.debounceMs ?? 3000 });
9
+ // monolean: full rebuild per change-batch, serialized — true incremental rebuild
10
+ // (re-parse only changed files) requires restructuring the phase pipeline.
11
+ let building = false;
12
+ let rerun = false;
10
13
  watcher.on('monograph:updated', async (files) => {
11
- opts.onProgress?.({ phase: 'watch', message: `Changed: ${files.slice(0, 3).join(', ')}` });
12
- await buildAsync(repoPath, { onProgress: opts.onProgress, force: opts.force, codeOnly: opts.codeOnly, llmMaxSections: opts.llmMaxSections ?? 0 });
13
- opts.onProgress?.({ phase: 'watch', message: 'Graph rebuilt.' });
14
+ if (building) {
15
+ rerun = true;
16
+ return;
17
+ } // coalesce saves that land mid-build
18
+ building = true;
19
+ try {
20
+ do {
21
+ rerun = false;
22
+ opts.onProgress?.({ phase: 'watch', message: `Changed: ${files.slice(0, 3).join(', ')}` });
23
+ await buildAsync(repoPath, { onProgress: opts.onProgress, force: opts.force, codeOnly: opts.codeOnly, llmMaxSections: opts.llmMaxSections ?? 0 });
24
+ opts.onProgress?.({ phase: 'watch', message: 'Graph rebuilt.' });
25
+ } while (rerun);
26
+ }
27
+ finally {
28
+ building = false;
29
+ }
14
30
  });
15
31
  await watcher.start();
16
32
  return { stop: () => watcher.stop() };
@@ -27,7 +43,10 @@ export class MonographWatcher extends EventEmitter {
27
43
  this.debounceMs = opts.debounceMs ?? 3000;
28
44
  }
29
45
  async start() {
30
- const usePolling = platform() === 'darwin';
46
+ // FSEvents works natively on macOS — polling the whole tree every second is
47
+ // far more expensive (especially on external/exFAT volumes). Poll only when
48
+ // explicitly requested via env (e.g. network mounts where events don't fire).
49
+ const usePolling = process.env.MONOGRAPH_WATCH_POLL === '1';
31
50
  this.watcher = chokidar.watch(this.repoPath, {
32
51
  ignored: [
33
52
  /(^|[/\\])\../, // dotfiles
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/watch/watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/watch/watcher.ts"],"names":[],"mappings":"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"}