maestro-flow 0.4.23 → 0.4.25

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 (120) hide show
  1. package/.agents/skills/maestro-impeccable/SKILL.md +5 -1
  2. package/.agents/skills/maestro-next/SKILL.md +7 -1
  3. package/.agents/skills/maestro-player/SKILL.md +9 -2
  4. package/.agents/skills/maestro-tools-execute/SKILL.md +4 -4
  5. package/.agents/skills/manage-codebase-rebuild/SKILL.md +4 -6
  6. package/.agents/skills/spec-load/SKILL.md +11 -4
  7. package/.agy/skills/maestro-impeccable/SKILL.md +5 -1
  8. package/.agy/skills/maestro-next/SKILL.md +7 -1
  9. package/.agy/skills/maestro-player/SKILL.md +9 -2
  10. package/.agy/skills/maestro-tools-execute/SKILL.md +4 -4
  11. package/.agy/skills/manage-codebase-rebuild/SKILL.md +4 -6
  12. package/.agy/skills/spec-load/SKILL.md +11 -4
  13. package/.claude/commands/maestro-impeccable.md +5 -1
  14. package/.claude/commands/maestro-next.md +7 -1
  15. package/.claude/commands/maestro-player.md +9 -2
  16. package/.claude/commands/maestro-tools-execute.md +4 -4
  17. package/.claude/commands/manage-codebase-rebuild.md +4 -6
  18. package/.claude/commands/spec-load.md +11 -4
  19. package/.codex/skills/manage-codebase-rebuild/SKILL.md +2 -2
  20. package/dashboard/dist-server/dashboard/src/server/routes/specs.js +96 -25
  21. package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
  22. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +7 -7
  23. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
  24. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +1 -1
  25. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  26. package/dashboard/dist-server/dashboard/src/shared/constants.d.ts +1 -0
  27. package/dashboard/dist-server/dashboard/src/shared/constants.js +1 -0
  28. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  29. package/dashboard/dist-server/src/graph/types.d.ts +98 -0
  30. package/dashboard/dist-server/src/graph/types.js +19 -1
  31. package/dashboard/dist-server/src/graph/types.js.map +1 -1
  32. package/dist/src/commands/kg.d.ts.map +1 -1
  33. package/dist/src/commands/kg.js +345 -2
  34. package/dist/src/commands/kg.js.map +1 -1
  35. package/dist/src/commands/spec.d.ts.map +1 -1
  36. package/dist/src/commands/spec.js +82 -38
  37. package/dist/src/commands/spec.js.map +1 -1
  38. package/dist/src/graph/db/connection.d.ts +22 -0
  39. package/dist/src/graph/db/connection.d.ts.map +1 -0
  40. package/dist/src/graph/db/connection.js +113 -0
  41. package/dist/src/graph/db/connection.js.map +1 -0
  42. package/dist/src/graph/db/index.d.ts +4 -0
  43. package/dist/src/graph/db/index.d.ts.map +1 -0
  44. package/dist/src/graph/db/index.js +4 -0
  45. package/dist/src/graph/db/index.js.map +1 -0
  46. package/dist/src/graph/db/migrations.d.ts +5 -0
  47. package/dist/src/graph/db/migrations.d.ts.map +1 -0
  48. package/dist/src/graph/db/migrations.js +18 -0
  49. package/dist/src/graph/db/migrations.js.map +1 -0
  50. package/dist/src/graph/db/queries.d.ts +50 -0
  51. package/dist/src/graph/db/queries.d.ts.map +1 -0
  52. package/dist/src/graph/db/queries.js +313 -0
  53. package/dist/src/graph/db/queries.js.map +1 -0
  54. package/dist/src/graph/db/schema.sql +131 -0
  55. package/dist/src/graph/facade.d.ts +53 -0
  56. package/dist/src/graph/facade.d.ts.map +1 -0
  57. package/dist/src/graph/facade.js +172 -0
  58. package/dist/src/graph/facade.js.map +1 -0
  59. package/dist/src/graph/graph-queries.d.ts +24 -0
  60. package/dist/src/graph/graph-queries.d.ts.map +1 -0
  61. package/dist/src/graph/graph-queries.js +173 -0
  62. package/dist/src/graph/graph-queries.js.map +1 -0
  63. package/dist/src/graph/index.d.ts +8 -0
  64. package/dist/src/graph/index.d.ts.map +1 -1
  65. package/dist/src/graph/index.js +9 -0
  66. package/dist/src/graph/index.js.map +1 -1
  67. package/dist/src/graph/loader.d.ts +8 -0
  68. package/dist/src/graph/loader.d.ts.map +1 -1
  69. package/dist/src/graph/loader.js +20 -0
  70. package/dist/src/graph/loader.js.map +1 -1
  71. package/dist/src/graph/migration.d.ts +8 -0
  72. package/dist/src/graph/migration.d.ts.map +1 -0
  73. package/dist/src/graph/migration.js +134 -0
  74. package/dist/src/graph/migration.js.map +1 -0
  75. package/dist/src/graph/search/index.d.ts +4 -0
  76. package/dist/src/graph/search/index.d.ts.map +1 -0
  77. package/dist/src/graph/search/index.js +3 -0
  78. package/dist/src/graph/search/index.js.map +1 -0
  79. package/dist/src/graph/search/query-parser.d.ts +11 -0
  80. package/dist/src/graph/search/query-parser.d.ts.map +1 -0
  81. package/dist/src/graph/search/query-parser.js +111 -0
  82. package/dist/src/graph/search/query-parser.js.map +1 -0
  83. package/dist/src/graph/search/query-utils.d.ts +12 -0
  84. package/dist/src/graph/search/query-utils.d.ts.map +1 -0
  85. package/dist/src/graph/search/query-utils.js +184 -0
  86. package/dist/src/graph/search/query-utils.js.map +1 -0
  87. package/dist/src/graph/sync/content-hash.d.ts +7 -0
  88. package/dist/src/graph/sync/content-hash.d.ts.map +1 -0
  89. package/dist/src/graph/sync/content-hash.js +33 -0
  90. package/dist/src/graph/sync/content-hash.js.map +1 -0
  91. package/dist/src/graph/sync/incremental-sync.d.ts +23 -0
  92. package/dist/src/graph/sync/incremental-sync.d.ts.map +1 -0
  93. package/dist/src/graph/sync/incremental-sync.js +338 -0
  94. package/dist/src/graph/sync/incremental-sync.js.map +1 -0
  95. package/dist/src/graph/sync/index.d.ts +7 -0
  96. package/dist/src/graph/sync/index.d.ts.map +1 -0
  97. package/dist/src/graph/sync/index.js +5 -0
  98. package/dist/src/graph/sync/index.js.map +1 -0
  99. package/dist/src/graph/sync/watch-policy.d.ts +2 -0
  100. package/dist/src/graph/sync/watch-policy.d.ts.map +1 -0
  101. package/dist/src/graph/sync/watch-policy.js +38 -0
  102. package/dist/src/graph/sync/watch-policy.js.map +1 -0
  103. package/dist/src/graph/sync/watcher.d.ts +44 -0
  104. package/dist/src/graph/sync/watcher.d.ts.map +1 -0
  105. package/dist/src/graph/sync/watcher.js +153 -0
  106. package/dist/src/graph/sync/watcher.js.map +1 -0
  107. package/dist/src/graph/traversal.d.ts +37 -0
  108. package/dist/src/graph/traversal.d.ts.map +1 -0
  109. package/dist/src/graph/traversal.js +335 -0
  110. package/dist/src/graph/traversal.js.map +1 -0
  111. package/dist/src/graph/types.d.ts +98 -0
  112. package/dist/src/graph/types.d.ts.map +1 -1
  113. package/dist/src/graph/types.js +19 -1
  114. package/dist/src/graph/types.js.map +1 -1
  115. package/dist/src/utils/update-notices.js +11 -0
  116. package/dist/src/utils/update-notices.js.map +1 -1
  117. package/package.json +4 -2
  118. package/workflows/analyze.md +19 -13
  119. package/workflows/codebase-rebuild.md +18 -107
  120. package/workflows/execute.md +6 -5
@@ -0,0 +1,338 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { join, extname, basename, dirname } from 'node:path';
3
+ import { readFileSync, statSync } from 'node:fs';
4
+ import { posix } from 'node:path';
5
+ import { QueryBuilder } from '../db/queries.js';
6
+ import { computeFileHash } from './content-hash.js';
7
+ const SOURCE_EXTENSIONS = new Set([
8
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
9
+ '.vue', '.py', '.go', '.java', '.rs',
10
+ ]);
11
+ const EXT_LANGUAGE = {
12
+ '.ts': 'typescript', '.tsx': 'tsx', '.js': 'javascript', '.jsx': 'jsx',
13
+ '.mjs': 'javascript', '.cjs': 'javascript', '.vue': 'vue', '.py': 'python',
14
+ '.go': 'go', '.java': 'java', '.rs': 'rust',
15
+ };
16
+ const RESOLVE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
17
+ export class IncrementalSync {
18
+ projectRoot;
19
+ conn;
20
+ queries;
21
+ constructor(projectRoot, conn) {
22
+ this.projectRoot = projectRoot;
23
+ this.conn = conn;
24
+ this.queries = new QueryBuilder(conn);
25
+ }
26
+ sync() {
27
+ const start = Date.now();
28
+ const changedFiles = this.detectChanges();
29
+ if (changedFiles.added.length === 0 && changedFiles.modified.length === 0 && changedFiles.deleted.length === 0) {
30
+ return { filesChanged: 0, nodesAdded: 0, edgesAdded: 0, durationMs: Date.now() - start };
31
+ }
32
+ let nodesAdded = 0;
33
+ let edgesAdded = 0;
34
+ this.conn.transaction(() => {
35
+ for (const path of changedFiles.deleted) {
36
+ this.queries.deleteEdgesForFile(path);
37
+ this.queries.deleteNodesByFile(path);
38
+ this.queries.deleteUnresolvedRefsForFile(path);
39
+ this.queries.deleteFile(path);
40
+ }
41
+ const allSourceFiles = this.getAllSourceFiles();
42
+ const fileSet = new Set(allSourceFiles.map(f => f.relPath));
43
+ const toProcess = [...changedFiles.added, ...changedFiles.modified];
44
+ const allExtracted = [];
45
+ // Phase 1: Extract all files and collect nodes + edges
46
+ for (const relPath of toProcess) {
47
+ this.queries.deleteEdgesForFile(relPath);
48
+ this.queries.deleteNodesByFile(relPath);
49
+ this.queries.deleteUnresolvedRefsForFile(relPath);
50
+ const absPath = join(this.projectRoot, relPath);
51
+ const result = this.extractFile(absPath, relPath, fileSet);
52
+ if (result)
53
+ allExtracted.push({ relPath, ...result });
54
+ }
55
+ // Phase 2: Insert all nodes first (so FK constraints are satisfied)
56
+ const allNodeIds = new Set();
57
+ for (const { nodes } of allExtracted) {
58
+ this.queries.insertNodes(nodes);
59
+ nodesAdded += nodes.length;
60
+ for (const n of nodes)
61
+ allNodeIds.add(n.id);
62
+ }
63
+ // Phase 3: Insert edges, filtering out any with missing targets
64
+ for (const { edges } of allExtracted) {
65
+ const validEdges = edges.filter(e => allNodeIds.has(e.source) && allNodeIds.has(e.target));
66
+ if (validEdges.length > 0) {
67
+ this.queries.insertEdges(validEdges);
68
+ edgesAdded += validEdges.length;
69
+ }
70
+ }
71
+ // Phase 4: Update file records
72
+ for (const { relPath, nodes } of allExtracted) {
73
+ const absPath = join(this.projectRoot, relPath);
74
+ const hash = computeFileHash(absPath);
75
+ const stat = statSync(absPath);
76
+ this.queries.upsertFile({
77
+ path: relPath,
78
+ contentHash: hash ?? '',
79
+ language: EXT_LANGUAGE[extname(relPath).toLowerCase()] ?? 'unknown',
80
+ size: stat.size,
81
+ modifiedAt: stat.mtime.toISOString(),
82
+ indexedAt: new Date().toISOString(),
83
+ nodeCount: nodes.length,
84
+ errors: [],
85
+ });
86
+ }
87
+ });
88
+ this.conn.runMaintenance();
89
+ return {
90
+ filesChanged: changedFiles.added.length + changedFiles.modified.length + changedFiles.deleted.length,
91
+ nodesAdded,
92
+ edgesAdded,
93
+ durationMs: Date.now() - start,
94
+ };
95
+ }
96
+ detectChanges() {
97
+ const dbFiles = this.queries.getAllFiles();
98
+ // If DB is empty, treat all source files as "added" (initial full index)
99
+ if (dbFiles.length === 0) {
100
+ const allFiles = this.getAllSourceFiles();
101
+ return { added: allFiles.map(f => f.relPath), modified: [], deleted: [] };
102
+ }
103
+ // Git fast-path: if repo is clean, use content hashes against DB
104
+ const gitChanges = this.getGitChangedFiles();
105
+ if (gitChanges && gitChanges.length > 0)
106
+ return this.classifyGitChanges(gitChanges);
107
+ // Fallback: compare content hashes for all files
108
+ const currentFiles = this.getAllSourceFiles();
109
+ const currentHashes = new Map();
110
+ for (const file of currentFiles) {
111
+ const hash = computeFileHash(file.absolutePath);
112
+ if (hash)
113
+ currentHashes.set(file.relPath, hash);
114
+ }
115
+ return this.queries.getStaleFiles(currentHashes);
116
+ }
117
+ getGitChangedFiles() {
118
+ try {
119
+ const output = execSync('git status --porcelain', {
120
+ cwd: this.projectRoot,
121
+ encoding: 'utf-8',
122
+ timeout: 10000,
123
+ stdio: ['pipe', 'pipe', 'pipe'],
124
+ });
125
+ if (!output.trim())
126
+ return [];
127
+ return output.trim().split('\n').map(line => {
128
+ const status = line.slice(0, 2).trim();
129
+ const path = line.slice(3).trim();
130
+ return { status, path };
131
+ }).filter(f => {
132
+ const ext = extname(f.path).toLowerCase();
133
+ return SOURCE_EXTENSIONS.has(ext);
134
+ });
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ classifyGitChanges(changes) {
141
+ const added = [];
142
+ const modified = [];
143
+ const deleted = [];
144
+ for (const change of changes) {
145
+ const rel = change.path.replace(/\\/g, '/');
146
+ if (change.status === 'D')
147
+ deleted.push(rel);
148
+ else if (change.status === '??' || change.status === 'A')
149
+ added.push(rel);
150
+ else
151
+ modified.push(rel);
152
+ }
153
+ return { added, modified, deleted };
154
+ }
155
+ getAllSourceFiles() {
156
+ try {
157
+ const output = execSync('git ls-files -z -co --exclude-standard', {
158
+ cwd: this.projectRoot,
159
+ encoding: 'utf-8',
160
+ timeout: 10000,
161
+ stdio: ['pipe', 'pipe', 'pipe'],
162
+ });
163
+ return output.split('\0').filter(f => f.length > 0).filter(f => {
164
+ const ext = extname(f).toLowerCase();
165
+ return SOURCE_EXTENSIONS.has(ext);
166
+ }).map(f => ({
167
+ absolutePath: join(this.projectRoot, f),
168
+ relPath: f.replace(/\\/g, '/'),
169
+ }));
170
+ }
171
+ catch {
172
+ return [];
173
+ }
174
+ }
175
+ extractFile(absolutePath, relPath, fileSet) {
176
+ let content;
177
+ try {
178
+ content = readFileSync(absolutePath, 'utf-8');
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ const ext = extname(relPath).toLowerCase();
184
+ const language = EXT_LANGUAGE[ext] ?? 'unknown';
185
+ const name = basename(relPath);
186
+ const lineCount = content.split('\n').length;
187
+ const nodes = [];
188
+ const edges = [];
189
+ const fileId = `file:${relPath}`;
190
+ nodes.push({
191
+ id: fileId,
192
+ kind: 'file',
193
+ name,
194
+ qualifiedName: relPath,
195
+ filePath: relPath,
196
+ language: language,
197
+ startLine: 1,
198
+ endLine: lineCount,
199
+ startColumn: 0,
200
+ endColumn: 0,
201
+ docstring: '',
202
+ signature: '',
203
+ visibility: '',
204
+ isExported: false,
205
+ isAsync: false,
206
+ isStatic: false,
207
+ isAbstract: false,
208
+ decorators: [],
209
+ typeParameters: [],
210
+ updatedAt: new Date().toISOString(),
211
+ });
212
+ const symbols = this.extractSymbols(content, relPath, language);
213
+ for (const sym of symbols) {
214
+ nodes.push(sym);
215
+ edges.push({ source: fileId, target: sym.id, kind: 'contains' });
216
+ }
217
+ const importTargets = this.extractImports(content);
218
+ for (const target of importTargets) {
219
+ const resolvedId = this.resolveImport(target, relPath, fileSet);
220
+ if (resolvedId) {
221
+ edges.push({ source: fileId, target: resolvedId, kind: 'imports' });
222
+ }
223
+ }
224
+ return { nodes, edges };
225
+ }
226
+ extractSymbols(content, filePath, language) {
227
+ const symbols = [];
228
+ const lines = content.split('\n');
229
+ const seen = new Set();
230
+ const patterns = [
231
+ { regex: /export\s+(?:default\s+)?(?:async\s+)?function\s+(\w+)/g, kind: 'function', nameGroup: 1, signatureFromMatch: true },
232
+ { regex: /export\s+(?:default\s+)?(?:abstract\s+)?class\s+(\w+)/g, kind: 'class', nameGroup: 1, signatureFromMatch: true },
233
+ { regex: /export\s+(?:default\s+)?interface\s+(\w+)/g, kind: 'interface', nameGroup: 1, signatureFromMatch: true },
234
+ { regex: /export\s+(?:default\s+)?type\s+(\w+)\s*=/g, kind: 'type_alias', nameGroup: 1, signatureFromMatch: true },
235
+ { regex: /export\s+(?:default\s+)?enum\s+(\w+)/g, kind: 'enum', nameGroup: 1, signatureFromMatch: true },
236
+ { regex: /export\s+(?:const|let|var)\s+(\w+)/g, kind: 'variable', nameGroup: 1 },
237
+ { regex: /(?:async\s+)?function\s+(\w+)\s*\(/g, kind: 'function', nameGroup: 1, signatureFromMatch: true },
238
+ { regex: /(?:abstract\s+)?class\s+(\w+)/g, kind: 'class', nameGroup: 1, signatureFromMatch: true },
239
+ { regex: /interface\s+(\w+)/g, kind: 'interface', nameGroup: 1, signatureFromMatch: true },
240
+ { regex: /type\s+(\w+)\s*=/g, kind: 'type_alias', nameGroup: 1, signatureFromMatch: true },
241
+ { regex: /enum\s+(\w+)/g, kind: 'enum', nameGroup: 1, signatureFromMatch: true },
242
+ ];
243
+ for (const { regex, kind, nameGroup, signatureFromMatch } of patterns) {
244
+ let match;
245
+ while ((match = regex.exec(content)) !== null) {
246
+ const name = match[nameGroup];
247
+ if (!name)
248
+ continue;
249
+ const id = `${kind}:${filePath}:${name}`;
250
+ if (seen.has(id))
251
+ continue;
252
+ seen.add(id);
253
+ const offset = match.index;
254
+ let startLine = 1;
255
+ for (let i = 0; i < offset && i < content.length; i++) {
256
+ if (content[i] === '\n')
257
+ startLine++;
258
+ }
259
+ const fullLine = lines[startLine - 1] ?? '';
260
+ const isExported = fullLine.trimStart().startsWith('export');
261
+ const isAsync = fullLine.includes('async ');
262
+ const isStatic = fullLine.includes('static ');
263
+ const isAbstract = fullLine.includes('abstract ');
264
+ let visibility = '';
265
+ if (fullLine.includes('private '))
266
+ visibility = 'private';
267
+ else if (fullLine.includes('protected '))
268
+ visibility = 'protected';
269
+ else if (fullLine.includes('public ') || isExported)
270
+ visibility = 'public';
271
+ const decorators = [];
272
+ if (startLine >= 2) {
273
+ const prevLine = (lines[startLine - 2] ?? '').trim();
274
+ if (prevLine.startsWith('@')) {
275
+ const decMatch = prevLine.match(/@(\w+)/);
276
+ if (decMatch)
277
+ decorators.push(decMatch[1]);
278
+ }
279
+ }
280
+ symbols.push({
281
+ id,
282
+ kind,
283
+ name,
284
+ qualifiedName: `${filePath}::${name}`,
285
+ filePath,
286
+ language,
287
+ startLine,
288
+ endLine: startLine,
289
+ startColumn: 0,
290
+ endColumn: 0,
291
+ docstring: '',
292
+ signature: signatureFromMatch ? fullLine.trim() : '',
293
+ visibility,
294
+ isExported,
295
+ isAsync,
296
+ isStatic,
297
+ isAbstract,
298
+ decorators,
299
+ typeParameters: [],
300
+ updatedAt: new Date().toISOString(),
301
+ });
302
+ }
303
+ }
304
+ return symbols;
305
+ }
306
+ extractImports(content) {
307
+ const targets = [];
308
+ const esmRegex = /import\s+(?:[\s\S]*?\s+from\s+)?['"]([^'"]+)['"]/g;
309
+ let match;
310
+ while ((match = esmRegex.exec(content)) !== null)
311
+ targets.push(match[1]);
312
+ const cjsRegex = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
313
+ while ((match = cjsRegex.exec(content)) !== null)
314
+ targets.push(match[1]);
315
+ return targets;
316
+ }
317
+ resolveImport(specifier, sourceRelPath, fileSet) {
318
+ if (!specifier.startsWith('.'))
319
+ return null;
320
+ const sourceDir = dirname(sourceRelPath);
321
+ let resolved = posix.normalize(posix.join(sourceDir, specifier));
322
+ if (resolved.endsWith('.js'))
323
+ resolved = resolved.slice(0, -3);
324
+ if (fileSet.has(resolved))
325
+ return `file:${resolved}`;
326
+ for (const ext of RESOLVE_EXTENSIONS) {
327
+ if (fileSet.has(resolved + ext))
328
+ return `file:${resolved + ext}`;
329
+ }
330
+ for (const ext of RESOLVE_EXTENSIONS) {
331
+ const indexPath = posix.join(resolved, `index${ext}`);
332
+ if (fileSet.has(indexPath))
333
+ return `file:${indexPath}`;
334
+ }
335
+ return null;
336
+ }
337
+ }
338
+ //# sourceMappingURL=incremental-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-sync.js","sourceRoot":"","sources":["../../../../src/graph/sync/incremental-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { computeFileHash, computeFileHashes, isFileTooLarge } from './content-hash.js';
2
+ export { IncrementalSync } from './incremental-sync.js';
3
+ export type { SyncResult } from './incremental-sync.js';
4
+ export { FileWatcher, LockUnavailableError } from './watcher.js';
5
+ export type { WatchOptions, PendingFile } from './watcher.js';
6
+ export { watchDisabledReason } from './watch-policy.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/graph/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { computeFileHash, computeFileHashes, isFileTooLarge } from './content-hash.js';
2
+ export { IncrementalSync } from './incremental-sync.js';
3
+ export { FileWatcher, LockUnavailableError } from './watcher.js';
4
+ export { watchDisabledReason } from './watch-policy.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/graph/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function watchDisabledReason(projectRoot: string): string | null;
2
+ //# sourceMappingURL=watch-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-policy.d.ts","sourceRoot":"","sources":["../../../../src/graph/sync/watch-policy.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtE"}
@@ -0,0 +1,38 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ export function watchDisabledReason(projectRoot) {
3
+ if (isWsl2Mount(projectRoot)) {
4
+ return 'WSL2 /mnt/ mount detected — inotify is unreliable on Windows filesystem mounts';
5
+ }
6
+ if (isNetworkMount(projectRoot)) {
7
+ return 'Network mount detected (NFS/SMB) — file watching is unreliable';
8
+ }
9
+ return null;
10
+ }
11
+ function isWsl2Mount(projectRoot) {
12
+ if (process.platform !== 'linux')
13
+ return false;
14
+ if (projectRoot.startsWith('/mnt/') && projectRoot.length > 5) {
15
+ const drive = projectRoot[5];
16
+ if (drive && /[a-z]/i.test(drive))
17
+ return isWsl2();
18
+ }
19
+ return false;
20
+ }
21
+ function isWsl2() {
22
+ try {
23
+ if (!existsSync('/proc/version'))
24
+ return false;
25
+ const version = readFileSync('/proc/version', 'utf-8').toLowerCase();
26
+ return version.includes('microsoft');
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ function isNetworkMount(projectRoot) {
33
+ if (process.platform === 'win32') {
34
+ return projectRoot.startsWith('\\\\') || /^\/\//.test(projectRoot);
35
+ }
36
+ return false;
37
+ }
38
+ //# sourceMappingURL=watch-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-policy.js","sourceRoot":"","sources":["../../../../src/graph/sync/watch-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,gFAAgF,CAAC;IAC1F,CAAC;IACD,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,gEAAgE,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB;IACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM;IACb,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,WAAmB;IACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,44 @@
1
+ export interface WatchOptions {
2
+ debounceMs?: number;
3
+ onSyncComplete?: (result: {
4
+ filesChanged: number;
5
+ durationMs: number;
6
+ }) => void;
7
+ onSyncError?: (error: Error) => void;
8
+ }
9
+ export interface PendingFile {
10
+ path: string;
11
+ firstSeenMs: number;
12
+ lastSeenMs: number;
13
+ indexing: boolean;
14
+ }
15
+ export declare class LockUnavailableError extends Error {
16
+ constructor(message?: string);
17
+ }
18
+ export declare class FileWatcher {
19
+ private watcher;
20
+ private debounceTimer;
21
+ private pendingFiles;
22
+ private syncStartedMs;
23
+ private syncing;
24
+ private stopped;
25
+ private chokidarReady;
26
+ private readonly projectRoot;
27
+ private readonly debounceMs;
28
+ private readonly syncFn;
29
+ private readonly onSyncComplete?;
30
+ private readonly onSyncError?;
31
+ constructor(projectRoot: string, syncFn: () => Promise<{
32
+ filesChanged: number;
33
+ durationMs: number;
34
+ }>, options?: WatchOptions);
35
+ start(): boolean;
36
+ stop(): void;
37
+ isActive(): boolean;
38
+ getPendingFiles(): PendingFile[];
39
+ private shouldIgnore;
40
+ private isSourceFile;
41
+ private scheduleSync;
42
+ private flush;
43
+ }
44
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../../src/graph/sync/watcher.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,SAAsD;CAI1E;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAAkE;IACtF,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;IACrF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAA8B;gBAGzD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,EACnE,OAAO,GAAE,YAAiB;IAS5B,KAAK,IAAI,OAAO;IA0ChB,IAAI,IAAI,IAAI;IAcZ,QAAQ,IAAI,OAAO;IAInB,eAAe,IAAI,WAAW,EAAE;IAahC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,YAAY;YAQN,KAAK;CAqBpB"}
@@ -0,0 +1,153 @@
1
+ import { relative } from 'node:path';
2
+ import { watch } from 'chokidar';
3
+ import { watchDisabledReason } from './watch-policy.js';
4
+ const SOURCE_EXTS = new Set([
5
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
6
+ '.vue', '.py', '.go', '.java', '.rs',
7
+ ]);
8
+ const ALWAYS_IGNORE = ['.workflow', '.git', 'node_modules', 'dist', '.codegraph'];
9
+ export class LockUnavailableError extends Error {
10
+ constructor(message = 'File lock unavailable; another process is writing') {
11
+ super(message);
12
+ this.name = 'LockUnavailableError';
13
+ }
14
+ }
15
+ export class FileWatcher {
16
+ watcher = null;
17
+ debounceTimer = null;
18
+ pendingFiles = new Map();
19
+ syncStartedMs = 0;
20
+ syncing = false;
21
+ stopped = false;
22
+ chokidarReady = false;
23
+ projectRoot;
24
+ debounceMs;
25
+ syncFn;
26
+ onSyncComplete;
27
+ onSyncError;
28
+ constructor(projectRoot, syncFn, options = {}) {
29
+ this.projectRoot = projectRoot;
30
+ this.syncFn = syncFn;
31
+ this.debounceMs = options.debounceMs ?? 2000;
32
+ this.onSyncComplete = options.onSyncComplete;
33
+ this.onSyncError = options.onSyncError;
34
+ }
35
+ start() {
36
+ if (this.watcher)
37
+ return true;
38
+ this.stopped = false;
39
+ const disabledReason = watchDisabledReason(this.projectRoot);
40
+ if (disabledReason)
41
+ return false;
42
+ try {
43
+ this.watcher = watch(this.projectRoot, {
44
+ ignored: (testPath) => this.shouldIgnore(testPath),
45
+ ignoreInitial: true,
46
+ persistent: true,
47
+ });
48
+ this.watcher.on('ready', () => {
49
+ this.chokidarReady = true;
50
+ this.pendingFiles.clear();
51
+ });
52
+ this.watcher.on('all', (_event, filePath) => {
53
+ if (this.stopped)
54
+ return;
55
+ const normalized = relative(this.projectRoot, filePath).replace(/\\/g, '/');
56
+ if (!this.isSourceFile(normalized))
57
+ return;
58
+ if (this.chokidarReady) {
59
+ const now = Date.now();
60
+ const existing = this.pendingFiles.get(normalized);
61
+ this.pendingFiles.set(normalized, {
62
+ firstSeenMs: existing?.firstSeenMs ?? now,
63
+ lastSeenMs: now,
64
+ });
65
+ }
66
+ this.scheduleSync();
67
+ });
68
+ this.watcher.on('error', () => { });
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ stop() {
76
+ this.stopped = true;
77
+ if (this.debounceTimer) {
78
+ clearTimeout(this.debounceTimer);
79
+ this.debounceTimer = null;
80
+ }
81
+ if (this.watcher) {
82
+ this.watcher.close();
83
+ this.watcher = null;
84
+ }
85
+ this.pendingFiles.clear();
86
+ this.chokidarReady = false;
87
+ }
88
+ isActive() {
89
+ return this.watcher !== null && !this.stopped;
90
+ }
91
+ getPendingFiles() {
92
+ const result = [];
93
+ for (const [filePath, info] of this.pendingFiles) {
94
+ result.push({
95
+ path: filePath,
96
+ firstSeenMs: info.firstSeenMs,
97
+ lastSeenMs: info.lastSeenMs,
98
+ indexing: this.syncing && this.syncStartedMs >= info.lastSeenMs,
99
+ });
100
+ }
101
+ return result;
102
+ }
103
+ shouldIgnore(testPath) {
104
+ const rel = relative(this.projectRoot, testPath).replace(/\\/g, '/');
105
+ if (!rel || rel === '.' || rel.startsWith('..'))
106
+ return false;
107
+ for (const ignored of ALWAYS_IGNORE) {
108
+ if (rel === ignored || rel.startsWith(ignored + '/'))
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ isSourceFile(relPath) {
114
+ const dotIdx = relPath.lastIndexOf('.');
115
+ if (dotIdx === -1)
116
+ return false;
117
+ return SOURCE_EXTS.has(relPath.slice(dotIdx));
118
+ }
119
+ scheduleSync() {
120
+ if (this.debounceTimer)
121
+ clearTimeout(this.debounceTimer);
122
+ this.debounceTimer = setTimeout(() => {
123
+ this.debounceTimer = null;
124
+ this.flush();
125
+ }, this.debounceMs);
126
+ }
127
+ async flush() {
128
+ if (this.syncing || this.stopped)
129
+ return;
130
+ this.syncStartedMs = Date.now();
131
+ this.syncing = true;
132
+ try {
133
+ const result = await this.syncFn();
134
+ for (const [filePath, info] of this.pendingFiles) {
135
+ if (info.lastSeenMs <= this.syncStartedMs)
136
+ this.pendingFiles.delete(filePath);
137
+ }
138
+ this.onSyncComplete?.(result);
139
+ }
140
+ catch (err) {
141
+ if (!(err instanceof LockUnavailableError)) {
142
+ const error = err instanceof Error ? err : new Error(String(err));
143
+ this.onSyncError?.(error);
144
+ }
145
+ }
146
+ finally {
147
+ this.syncing = false;
148
+ if (this.pendingFiles.size > 0 && !this.stopped)
149
+ this.scheduleSync();
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../../src/graph/sync/watcher.ts"],"names":[],"mappings":"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"}