@rengler33/prov 0.1.1

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 (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. package/package.json +53 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * File watching and change detection for prov.
3
+ *
4
+ * Detects when spec, constraint, and plan files are modified
5
+ * and marks dependent graph nodes as stale.
6
+ *
7
+ * @see req:storage:file-watching
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import type { Hash, EntityId } from './types.js';
11
+ /**
12
+ * Types of tracked files.
13
+ */
14
+ export type TrackedFileType = 'spec' | 'constraint' | 'plan';
15
+ /**
16
+ * Information about a tracked file.
17
+ */
18
+ export interface TrackedFile {
19
+ /** Relative path from project root */
20
+ readonly path: string;
21
+ /** File type */
22
+ readonly type: TrackedFileType;
23
+ /** Entity ID extracted from file */
24
+ readonly entityId?: EntityId | undefined;
25
+ /** Hash when last checked */
26
+ readonly lastHash?: Hash | undefined;
27
+ /** Whether file has changed since last check */
28
+ readonly changed: boolean;
29
+ }
30
+ /**
31
+ * Result of scanning for changes.
32
+ */
33
+ export interface ChangeResult {
34
+ /** Files that have changed */
35
+ readonly changed: TrackedFile[];
36
+ /** Files that are new (not previously tracked) */
37
+ readonly added: TrackedFile[];
38
+ /** Files that have been deleted */
39
+ readonly deleted: string[];
40
+ /** Total number of files scanned */
41
+ readonly scanned: number;
42
+ }
43
+ /**
44
+ * Events emitted by the file watcher.
45
+ */
46
+ export interface WatcherEvents {
47
+ change: (file: TrackedFile) => void;
48
+ add: (file: TrackedFile) => void;
49
+ delete: (path: string) => void;
50
+ error: (error: Error) => void;
51
+ }
52
+ /**
53
+ * Options for the watcher.
54
+ */
55
+ export interface WatcherOptions {
56
+ /** Project root directory */
57
+ readonly projectRoot?: string;
58
+ /** Directories to watch for specs */
59
+ readonly specDirs?: readonly string[];
60
+ /** Directories to watch for constraints */
61
+ readonly constraintDirs?: readonly string[];
62
+ /** Directories to watch for plans */
63
+ readonly planDirs?: readonly string[];
64
+ /** File extensions to watch */
65
+ readonly extensions?: readonly string[];
66
+ /** Debounce delay in ms for watch mode */
67
+ readonly debounceMs?: number;
68
+ }
69
+ /**
70
+ * Determine file type based on directory.
71
+ */
72
+ export declare function getFileType(filePath: string, options?: WatcherOptions): TrackedFileType | null;
73
+ /**
74
+ * Extract entity ID from file content.
75
+ */
76
+ export declare function extractEntityId(content: string, type: TrackedFileType): EntityId | undefined;
77
+ /**
78
+ * Compute hash for a file's content.
79
+ */
80
+ export declare function computeFileHash(filePath: string, projectRoot?: string): Hash | null;
81
+ /**
82
+ * Check if a file has changed since last recorded hash.
83
+ */
84
+ export declare function hasFileChanged(filePath: string, projectRoot?: string): boolean;
85
+ /**
86
+ * Get all tracked files in the project.
87
+ */
88
+ export declare function getTrackedFiles(projectRoot?: string, options?: WatcherOptions): TrackedFile[];
89
+ /**
90
+ * Scan for changes in tracked files.
91
+ *
92
+ * @see req:storage:file-watching
93
+ */
94
+ export declare function scanForChanges(projectRoot?: string, options?: WatcherOptions): ChangeResult;
95
+ /**
96
+ * Update cached hashes for all tracked files.
97
+ */
98
+ export declare function updateHashes(projectRoot?: string, options?: WatcherOptions): {
99
+ updated: number;
100
+ errors: string[];
101
+ };
102
+ /**
103
+ * File watcher for continuous monitoring.
104
+ *
105
+ * @see req:storage:file-watching (--watch mode)
106
+ */
107
+ export declare class FileWatcher extends EventEmitter {
108
+ private readonly projectRoot;
109
+ private readonly options;
110
+ private readonly watchers;
111
+ private readonly debounceTimers;
112
+ private running;
113
+ constructor(options?: WatcherOptions);
114
+ /**
115
+ * Start watching for changes.
116
+ */
117
+ start(): void;
118
+ /**
119
+ * Stop watching for changes.
120
+ */
121
+ stop(): void;
122
+ /**
123
+ * Check if watcher is running.
124
+ */
125
+ isRunning(): boolean;
126
+ /**
127
+ * Watch a directory for changes.
128
+ */
129
+ private watchDirectory;
130
+ /**
131
+ * Handle a file change event.
132
+ */
133
+ private handleFileChange;
134
+ }
135
+ /**
136
+ * Get entity IDs that are stale due to source file changes.
137
+ */
138
+ export declare function getStaleEntities(projectRoot?: string, options?: WatcherOptions): EntityId[];
139
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,406 @@
1
+ /**
2
+ * File watching and change detection for prov.
3
+ *
4
+ * Detects when spec, constraint, and plan files are modified
5
+ * and marks dependent graph nodes as stale.
6
+ *
7
+ * @see req:storage:file-watching
8
+ */
9
+ import { existsSync, readFileSync, statSync, watch, readdirSync } from 'node:fs';
10
+ import { join, relative, extname } from 'node:path';
11
+ import { EventEmitter } from 'node:events';
12
+ import { computeHash, parseYaml } from './hash.js';
13
+ import { Storage, getCachedHash, setCachedHash } from './storage.js';
14
+ // ============================================================================
15
+ // Constants
16
+ // ============================================================================
17
+ /** Default directories for different file types */
18
+ const DEFAULT_SPEC_DIRS = ['spec', 'specs'];
19
+ const DEFAULT_CONSTRAINT_DIRS = ['constraints'];
20
+ const DEFAULT_PLAN_DIRS = ['plans'];
21
+ /** Default file extensions to watch */
22
+ const DEFAULT_EXTENSIONS = ['.yaml', '.yml'];
23
+ /** Default debounce delay */
24
+ const DEFAULT_DEBOUNCE_MS = 100;
25
+ // ============================================================================
26
+ // File Type Detection
27
+ // ============================================================================
28
+ /**
29
+ * Determine file type based on directory.
30
+ */
31
+ export function getFileType(filePath, options = {}) {
32
+ const specDirs = options.specDirs ?? DEFAULT_SPEC_DIRS;
33
+ const constraintDirs = options.constraintDirs ?? DEFAULT_CONSTRAINT_DIRS;
34
+ const planDirs = options.planDirs ?? DEFAULT_PLAN_DIRS;
35
+ const normalizedPath = filePath.replace(/\\/g, '/');
36
+ for (const dir of specDirs) {
37
+ if (normalizedPath.startsWith(`${dir}/`) || normalizedPath === dir) {
38
+ return 'spec';
39
+ }
40
+ }
41
+ for (const dir of constraintDirs) {
42
+ if (normalizedPath.startsWith(`${dir}/`) || normalizedPath === dir) {
43
+ return 'constraint';
44
+ }
45
+ }
46
+ for (const dir of planDirs) {
47
+ if (normalizedPath.startsWith(`${dir}/`) || normalizedPath === dir) {
48
+ return 'plan';
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ /**
54
+ * Extract entity ID from file content.
55
+ */
56
+ export function extractEntityId(content, type) {
57
+ try {
58
+ const parsed = parseYaml(content);
59
+ if (parsed?.id != null && parsed.id !== '') {
60
+ // Validate ID format matches expected type
61
+ const id = parsed.id;
62
+ switch (type) {
63
+ case 'spec':
64
+ if (id.startsWith('spec:'))
65
+ return id;
66
+ break;
67
+ case 'constraint':
68
+ if (id.startsWith('constraint:'))
69
+ return id;
70
+ break;
71
+ case 'plan':
72
+ if (id.startsWith('plan:'))
73
+ return id;
74
+ break;
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ }
83
+ // ============================================================================
84
+ // Hash Computation
85
+ // ============================================================================
86
+ /**
87
+ * Compute hash for a file's content.
88
+ */
89
+ export function computeFileHash(filePath, projectRoot = process.cwd()) {
90
+ const fullPath = join(projectRoot, filePath);
91
+ try {
92
+ if (!existsSync(fullPath)) {
93
+ return null;
94
+ }
95
+ const content = readFileSync(fullPath, 'utf8');
96
+ return computeHash(content);
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ /**
103
+ * Check if a file has changed since last recorded hash.
104
+ */
105
+ export function hasFileChanged(filePath, projectRoot = process.cwd()) {
106
+ const currentHash = computeFileHash(filePath, projectRoot);
107
+ if (currentHash === null) {
108
+ return true; // File doesn't exist or can't be read
109
+ }
110
+ const cachedHash = getCachedHash(filePath, projectRoot);
111
+ if (cachedHash === null) {
112
+ return true; // No cached hash, consider it changed
113
+ }
114
+ return currentHash !== cachedHash;
115
+ }
116
+ // ============================================================================
117
+ // Directory Scanning
118
+ // ============================================================================
119
+ /**
120
+ * Recursively find all YAML files in a directory.
121
+ */
122
+ function findYamlFiles(dir, projectRoot, extensions) {
123
+ const fullDir = join(projectRoot, dir);
124
+ const files = [];
125
+ if (!existsSync(fullDir)) {
126
+ return files;
127
+ }
128
+ function walkDir(currentDir) {
129
+ try {
130
+ const entries = readdirSync(currentDir);
131
+ for (const entry of entries) {
132
+ const fullPath = join(currentDir, entry);
133
+ const stat = statSync(fullPath);
134
+ if (stat.isDirectory()) {
135
+ walkDir(fullPath);
136
+ }
137
+ else if (extensions.some((ext) => entry.endsWith(ext))) {
138
+ const relativePath = relative(projectRoot, fullPath).replace(/\\/g, '/');
139
+ files.push(relativePath);
140
+ }
141
+ }
142
+ }
143
+ catch {
144
+ // Ignore directories we can't read
145
+ }
146
+ }
147
+ walkDir(fullDir);
148
+ return files;
149
+ }
150
+ /**
151
+ * Get all tracked files in the project.
152
+ */
153
+ export function getTrackedFiles(projectRoot = process.cwd(), options = {}) {
154
+ const specDirs = options.specDirs ?? DEFAULT_SPEC_DIRS;
155
+ const constraintDirs = options.constraintDirs ?? DEFAULT_CONSTRAINT_DIRS;
156
+ const planDirs = options.planDirs ?? DEFAULT_PLAN_DIRS;
157
+ const extensions = options.extensions ?? DEFAULT_EXTENSIONS;
158
+ const files = [];
159
+ // Scan each directory type
160
+ const allDirs = [
161
+ ...specDirs.map((d) => ({ dir: d, type: 'spec' })),
162
+ ...constraintDirs.map((d) => ({ dir: d, type: 'constraint' })),
163
+ ...planDirs.map((d) => ({ dir: d, type: 'plan' })),
164
+ ];
165
+ for (const { dir, type } of allDirs) {
166
+ const yamlFiles = findYamlFiles(dir, projectRoot, extensions);
167
+ for (const filePath of yamlFiles) {
168
+ const fullPath = join(projectRoot, filePath);
169
+ let entityId;
170
+ let lastHash;
171
+ try {
172
+ const content = readFileSync(fullPath, 'utf8');
173
+ entityId = extractEntityId(content, type);
174
+ lastHash = getCachedHash(filePath, projectRoot) ?? undefined;
175
+ }
176
+ catch {
177
+ // File can't be read
178
+ }
179
+ const currentHash = computeFileHash(filePath, projectRoot);
180
+ const changed = lastHash === undefined || currentHash !== lastHash;
181
+ files.push({
182
+ path: filePath,
183
+ type,
184
+ entityId,
185
+ lastHash,
186
+ changed,
187
+ });
188
+ }
189
+ }
190
+ return files;
191
+ }
192
+ // ============================================================================
193
+ // Change Detection
194
+ // ============================================================================
195
+ /**
196
+ * Scan for changes in tracked files.
197
+ *
198
+ * @see req:storage:file-watching
199
+ */
200
+ export function scanForChanges(projectRoot = process.cwd(), options = {}) {
201
+ const storage = new Storage({ projectRoot });
202
+ const currentFiles = getTrackedFiles(projectRoot, options);
203
+ const changed = [];
204
+ const added = [];
205
+ const currentPaths = new Set();
206
+ for (const file of currentFiles) {
207
+ currentPaths.add(file.path);
208
+ const cachedHash = storage.getCachedHash(file.path);
209
+ if (cachedHash === null) {
210
+ // New file
211
+ added.push(file);
212
+ }
213
+ else if (file.changed) {
214
+ // Changed file
215
+ changed.push(file);
216
+ }
217
+ }
218
+ // Find deleted files by checking cached hashes
219
+ const deleted = [];
220
+ const mappingsResult = storage.listMappings();
221
+ if (mappingsResult.success && mappingsResult.data) {
222
+ for (const mappedPath of mappingsResult.data) {
223
+ if (!currentPaths.has(mappedPath)) {
224
+ deleted.push(mappedPath);
225
+ }
226
+ }
227
+ }
228
+ return {
229
+ changed,
230
+ added,
231
+ deleted,
232
+ scanned: currentFiles.length,
233
+ };
234
+ }
235
+ /**
236
+ * Update cached hashes for all tracked files.
237
+ */
238
+ export function updateHashes(projectRoot = process.cwd(), options = {}) {
239
+ const files = getTrackedFiles(projectRoot, options);
240
+ let updated = 0;
241
+ const errors = [];
242
+ for (const file of files) {
243
+ const hash = computeFileHash(file.path, projectRoot);
244
+ if (hash !== null) {
245
+ const result = setCachedHash(file.path, hash, projectRoot);
246
+ if (result.success) {
247
+ updated++;
248
+ }
249
+ else {
250
+ errors.push(`Failed to cache hash for ${file.path}: ${result.error}`);
251
+ }
252
+ }
253
+ }
254
+ return { updated, errors };
255
+ }
256
+ // ============================================================================
257
+ // File Watcher (Watch Mode)
258
+ // ============================================================================
259
+ /**
260
+ * File watcher for continuous monitoring.
261
+ *
262
+ * @see req:storage:file-watching (--watch mode)
263
+ */
264
+ export class FileWatcher extends EventEmitter {
265
+ projectRoot;
266
+ options;
267
+ watchers = new Map();
268
+ debounceTimers = new Map();
269
+ running = false;
270
+ constructor(options = {}) {
271
+ super();
272
+ this.projectRoot = options.projectRoot ?? process.cwd();
273
+ this.options = options;
274
+ }
275
+ /**
276
+ * Start watching for changes.
277
+ */
278
+ start() {
279
+ if (this.running)
280
+ return;
281
+ this.running = true;
282
+ const specDirs = this.options.specDirs ?? DEFAULT_SPEC_DIRS;
283
+ const constraintDirs = this.options.constraintDirs ?? DEFAULT_CONSTRAINT_DIRS;
284
+ const planDirs = this.options.planDirs ?? DEFAULT_PLAN_DIRS;
285
+ const allDirs = [...specDirs, ...constraintDirs, ...planDirs];
286
+ for (const dir of allDirs) {
287
+ const fullDir = join(this.projectRoot, dir);
288
+ if (existsSync(fullDir)) {
289
+ this.watchDirectory(dir);
290
+ }
291
+ }
292
+ }
293
+ /**
294
+ * Stop watching for changes.
295
+ */
296
+ stop() {
297
+ if (!this.running)
298
+ return;
299
+ this.running = false;
300
+ // Close all watchers
301
+ for (const watcher of this.watchers.values()) {
302
+ watcher.close();
303
+ }
304
+ this.watchers.clear();
305
+ // Clear all debounce timers
306
+ for (const timer of this.debounceTimers.values()) {
307
+ clearTimeout(timer);
308
+ }
309
+ this.debounceTimers.clear();
310
+ }
311
+ /**
312
+ * Check if watcher is running.
313
+ */
314
+ isRunning() {
315
+ return this.running;
316
+ }
317
+ /**
318
+ * Watch a directory for changes.
319
+ */
320
+ watchDirectory(dir) {
321
+ const fullDir = join(this.projectRoot, dir);
322
+ const extensions = this.options.extensions ?? DEFAULT_EXTENSIONS;
323
+ const debounceMs = this.options.debounceMs ?? DEFAULT_DEBOUNCE_MS;
324
+ try {
325
+ const watcher = watch(fullDir, { recursive: true }, (_eventType, filename) => {
326
+ if (filename == null || filename === '')
327
+ return;
328
+ // Check if file has watched extension
329
+ const ext = extname(filename);
330
+ if (!extensions.includes(ext))
331
+ return;
332
+ const filePath = join(dir, filename).replace(/\\/g, '/');
333
+ // Debounce rapid changes
334
+ const existingTimer = this.debounceTimers.get(filePath);
335
+ if (existingTimer) {
336
+ clearTimeout(existingTimer);
337
+ }
338
+ const timer = setTimeout(() => {
339
+ this.debounceTimers.delete(filePath);
340
+ this.handleFileChange(filePath);
341
+ }, debounceMs);
342
+ this.debounceTimers.set(filePath, timer);
343
+ });
344
+ this.watchers.set(dir, watcher);
345
+ }
346
+ catch (error) {
347
+ this.emit('error', error instanceof Error ? error : new Error(String(error)));
348
+ }
349
+ }
350
+ /**
351
+ * Handle a file change event.
352
+ */
353
+ handleFileChange(filePath) {
354
+ const fullPath = join(this.projectRoot, filePath);
355
+ const fileType = getFileType(filePath, this.options);
356
+ if (fileType === null)
357
+ return;
358
+ if (!existsSync(fullPath)) {
359
+ // File was deleted
360
+ this.emit('delete', filePath);
361
+ return;
362
+ }
363
+ try {
364
+ const content = readFileSync(fullPath, 'utf8');
365
+ const entityId = extractEntityId(content, fileType);
366
+ const currentHash = computeFileHash(filePath, this.projectRoot);
367
+ const cachedHash = getCachedHash(filePath, this.projectRoot);
368
+ const trackedFile = {
369
+ path: filePath,
370
+ type: fileType,
371
+ entityId,
372
+ lastHash: cachedHash ?? undefined,
373
+ changed: cachedHash === null || currentHash !== cachedHash,
374
+ };
375
+ if (cachedHash === null) {
376
+ // New file
377
+ this.emit('add', trackedFile);
378
+ }
379
+ else if (trackedFile.changed) {
380
+ // Changed file
381
+ this.emit('change', trackedFile);
382
+ }
383
+ }
384
+ catch (error) {
385
+ this.emit('error', error instanceof Error ? error : new Error(String(error)));
386
+ }
387
+ }
388
+ }
389
+ // ============================================================================
390
+ // Staleness Detection
391
+ // ============================================================================
392
+ /**
393
+ * Get entity IDs that are stale due to source file changes.
394
+ */
395
+ export function getStaleEntities(projectRoot = process.cwd(), options = {}) {
396
+ const changes = scanForChanges(projectRoot, options);
397
+ const staleIds = [];
398
+ // Collect entity IDs from changed and added files
399
+ for (const file of [...changes.changed, ...changes.added]) {
400
+ if (file.entityId != null) {
401
+ staleIds.push(file.entityId);
402
+ }
403
+ }
404
+ return staleIds;
405
+ }
406
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the file watcher module.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=watcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.d.ts","sourceRoot":"","sources":["../src/watcher.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}