ai-mind-map 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +554 -0
- package/dist/change-tracker/change-log.d.ts +160 -0
- package/dist/change-tracker/change-log.d.ts.map +1 -0
- package/dist/change-tracker/change-log.js +507 -0
- package/dist/change-tracker/change-log.js.map +1 -0
- package/dist/change-tracker/diff-engine.d.ts +149 -0
- package/dist/change-tracker/diff-engine.d.ts.map +1 -0
- package/dist/change-tracker/diff-engine.js +530 -0
- package/dist/change-tracker/diff-engine.js.map +1 -0
- package/dist/change-tracker/watcher.d.ts +137 -0
- package/dist/change-tracker/watcher.d.ts.map +1 -0
- package/dist/change-tracker/watcher.js +300 -0
- package/dist/change-tracker/watcher.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +937 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compressor.d.ts +49 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +769 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/progressive-disclosure.d.ts +71 -0
- package/dist/context/progressive-disclosure.d.ts.map +1 -0
- package/dist/context/progressive-disclosure.js +470 -0
- package/dist/context/progressive-disclosure.js.map +1 -0
- package/dist/context/token-budget.d.ts +121 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +282 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +66 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +946 -0
- package/dist/install.js.map +1 -0
- package/dist/knowledge-graph/architecture.d.ts +213 -0
- package/dist/knowledge-graph/architecture.d.ts.map +1 -0
- package/dist/knowledge-graph/architecture.js +585 -0
- package/dist/knowledge-graph/architecture.js.map +1 -0
- package/dist/knowledge-graph/cypher.d.ts +113 -0
- package/dist/knowledge-graph/cypher.d.ts.map +1 -0
- package/dist/knowledge-graph/cypher.js +1051 -0
- package/dist/knowledge-graph/cypher.js.map +1 -0
- package/dist/knowledge-graph/dead-code.d.ts +121 -0
- package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
- package/dist/knowledge-graph/dead-code.js +331 -0
- package/dist/knowledge-graph/dead-code.js.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.js +739 -0
- package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +291 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/knowledge-graph/graph.js +978 -0
- package/dist/knowledge-graph/graph.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +17 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +14 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/indexer.d.ts +112 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -0
- package/dist/knowledge-graph/indexer.js +506 -0
- package/dist/knowledge-graph/indexer.js.map +1 -0
- package/dist/knowledge-graph/pagerank.d.ts +141 -0
- package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
- package/dist/knowledge-graph/pagerank.js +493 -0
- package/dist/knowledge-graph/pagerank.js.map +1 -0
- package/dist/knowledge-graph/parser.d.ts +55 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -0
- package/dist/knowledge-graph/parser.js +1090 -0
- package/dist/knowledge-graph/parser.js.map +1 -0
- package/dist/knowledge-graph/snapshot.d.ts +107 -0
- package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
- package/dist/knowledge-graph/snapshot.js +435 -0
- package/dist/knowledge-graph/snapshot.js.map +1 -0
- package/dist/memory/decision-log.d.ts +151 -0
- package/dist/memory/decision-log.d.ts.map +1 -0
- package/dist/memory/decision-log.js +482 -0
- package/dist/memory/decision-log.js.map +1 -0
- package/dist/memory/persistent-memory.d.ts +182 -0
- package/dist/memory/persistent-memory.d.ts.map +1 -0
- package/dist/memory/persistent-memory.js +579 -0
- package/dist/memory/persistent-memory.js.map +1 -0
- package/dist/memory/session-memory.d.ts +165 -0
- package/dist/memory/session-memory.d.ts.map +1 -0
- package/dist/memory/session-memory.js +382 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/stress-test.d.ts +10 -0
- package/dist/stress-test.d.ts.map +1 -0
- package/dist/stress-test.js +258 -0
- package/dist/stress-test.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +32 -0
- package/dist/tools/advanced-tools.d.ts.map +1 -0
- package/dist/tools/advanced-tools.js +480 -0
- package/dist/tools/advanced-tools.js.map +1 -0
- package/dist/tools/change-tools.d.ts +76 -0
- package/dist/tools/change-tools.d.ts.map +1 -0
- package/dist/tools/change-tools.js +93 -0
- package/dist/tools/change-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +68 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +141 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/debug-tools.d.ts +25 -0
- package/dist/tools/debug-tools.d.ts.map +1 -0
- package/dist/tools/debug-tools.js +286 -0
- package/dist/tools/debug-tools.js.map +1 -0
- package/dist/tools/evolving-tools.d.ts +23 -0
- package/dist/tools/evolving-tools.d.ts.map +1 -0
- package/dist/tools/evolving-tools.js +207 -0
- package/dist/tools/evolving-tools.js.map +1 -0
- package/dist/tools/flow-tools.d.ts +24 -0
- package/dist/tools/flow-tools.d.ts.map +1 -0
- package/dist/tools/flow-tools.js +265 -0
- package/dist/tools/flow-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +71 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +165 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +195 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +23 -0
- package/dist/tools/smart-tools.d.ts.map +1 -0
- package/dist/tools/smart-tools.js +482 -0
- package/dist/tools/smart-tools.js.map +1 -0
- package/dist/tools/snapshot-tools.d.ts +19 -0
- package/dist/tools/snapshot-tools.d.ts.map +1 -0
- package/dist/tools/snapshot-tools.js +149 -0
- package/dist/tools/snapshot-tools.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +142 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +51 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +181 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/install.ps1 +321 -0
- package/install.sh +345 -0
- package/package.json +94 -0
- package/setup.bat +62 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — File System Watcher
|
|
3
|
+
*
|
|
4
|
+
* Real-time file system watcher using chokidar. Inspired by Cursor's Merkle
|
|
5
|
+
* tree approach and CocoIndex's incremental processing. Watches project
|
|
6
|
+
* directories for file changes (create, modify, delete, rename) and emits
|
|
7
|
+
* debounced change events for incremental re-indexing.
|
|
8
|
+
*
|
|
9
|
+
* Key design choices:
|
|
10
|
+
* - Uses Node's EventEmitter for a familiar pub-sub pattern.
|
|
11
|
+
* - Debounces bursts of file system events into batched change sets.
|
|
12
|
+
* - Respects .gitignore plus user-configured custom ignore patterns.
|
|
13
|
+
* - Tracks changed files since the last consumer "drain" so nothing is lost.
|
|
14
|
+
* - Supports start / stop / pause / resume lifecycle.
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'node:events';
|
|
17
|
+
import type { ChangeType, MindMapConfig } from '../types.js';
|
|
18
|
+
/** A lightweight record of a single raw file-system event. */
|
|
19
|
+
export interface WatcherEvent {
|
|
20
|
+
/** Absolute path of the affected file. */
|
|
21
|
+
filePath: string;
|
|
22
|
+
/** What happened. */
|
|
23
|
+
changeType: ChangeType;
|
|
24
|
+
/** Absolute path before rename (only for 'renamed' events). */
|
|
25
|
+
oldPath?: string;
|
|
26
|
+
/** Unix-epoch milliseconds when the event was recorded. */
|
|
27
|
+
timestamp: number;
|
|
28
|
+
}
|
|
29
|
+
/** Events emitted by {@link FileWatcher}. */
|
|
30
|
+
export interface WatcherEvents {
|
|
31
|
+
/** Fired after the debounce window closes with ≥ 1 accumulated change. */
|
|
32
|
+
changes: (events: WatcherEvent[]) => void;
|
|
33
|
+
/** Fired when a file system error is encountered. */
|
|
34
|
+
error: (error: Error) => void;
|
|
35
|
+
/** Fired once the initial scan is complete and the watcher is ready. */
|
|
36
|
+
ready: () => void;
|
|
37
|
+
}
|
|
38
|
+
/** Internal state of the watcher lifecycle. */
|
|
39
|
+
type WatcherState = 'idle' | 'running' | 'paused' | 'stopped';
|
|
40
|
+
/**
|
|
41
|
+
* Production file-system watcher that batches raw events into debounced
|
|
42
|
+
* {@link WatcherEvent} arrays and re-emits them via EventEmitter.
|
|
43
|
+
*
|
|
44
|
+
* ```ts
|
|
45
|
+
* const watcher = new FileWatcher(config);
|
|
46
|
+
* watcher.on('changes', (events) => { … });
|
|
47
|
+
* await watcher.start();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class FileWatcher extends EventEmitter {
|
|
51
|
+
private readonly projectRoot;
|
|
52
|
+
private readonly debounceMs;
|
|
53
|
+
private readonly maxFileSize;
|
|
54
|
+
private readonly customIgnores;
|
|
55
|
+
/** Underlying chokidar instance. */
|
|
56
|
+
private chokidarWatcher;
|
|
57
|
+
/** Current lifecycle state. */
|
|
58
|
+
private state;
|
|
59
|
+
/** Buffer for events accumulated during the debounce window. */
|
|
60
|
+
private pendingEvents;
|
|
61
|
+
/** Changes accumulated since the last call to {@link drainChanges}. */
|
|
62
|
+
private undrainedChanges;
|
|
63
|
+
/** Handle for the debounce timer, if one is currently active. */
|
|
64
|
+
private debounceTimer;
|
|
65
|
+
/** Compiled ignore filter (gitignore + custom rules). */
|
|
66
|
+
private ignoreFilter;
|
|
67
|
+
constructor(config: Partial<MindMapConfig> & {
|
|
68
|
+
projectRoot: string;
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* Start watching the project directory.
|
|
72
|
+
*
|
|
73
|
+
* Resolves once the initial scan is complete and the watcher is "ready".
|
|
74
|
+
*/
|
|
75
|
+
start(): Promise<void>;
|
|
76
|
+
/** Pause watching — events are silently discarded until {@link resume}. */
|
|
77
|
+
pause(): void;
|
|
78
|
+
/** Resume watching after a {@link pause}. */
|
|
79
|
+
resume(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Stop watching entirely and release all resources.
|
|
82
|
+
*
|
|
83
|
+
* After calling `stop()` the instance cannot be restarted — create a new
|
|
84
|
+
* one instead.
|
|
85
|
+
*/
|
|
86
|
+
stop(): Promise<void>;
|
|
87
|
+
/** Current lifecycle state of the watcher. */
|
|
88
|
+
getState(): WatcherState;
|
|
89
|
+
/**
|
|
90
|
+
* Return all change events accumulated since the last drain (or since
|
|
91
|
+
* start, whichever is more recent) and clear the buffer.
|
|
92
|
+
*
|
|
93
|
+
* This is the primary API for consumers that want to poll rather than
|
|
94
|
+
* subscribe via events.
|
|
95
|
+
*/
|
|
96
|
+
drainChanges(): WatcherEvent[];
|
|
97
|
+
/**
|
|
98
|
+
* Peek at the undrained changes without clearing them.
|
|
99
|
+
*/
|
|
100
|
+
peekChanges(): readonly WatcherEvent[];
|
|
101
|
+
/**
|
|
102
|
+
* Load `.gitignore` from the project root (if it exists) and merge it
|
|
103
|
+
* with user-configured custom ignore patterns.
|
|
104
|
+
*/
|
|
105
|
+
private loadIgnoreRules;
|
|
106
|
+
/**
|
|
107
|
+
* Determine whether a given absolute path should be ignored.
|
|
108
|
+
*/
|
|
109
|
+
private isIgnored;
|
|
110
|
+
/** Wire chokidar events to our internal handler. */
|
|
111
|
+
private attachListeners;
|
|
112
|
+
/**
|
|
113
|
+
* Handle a single raw chokidar event.
|
|
114
|
+
*
|
|
115
|
+
* Events are accumulated in {@link pendingEvents} (keyed by path so that
|
|
116
|
+
* rapid repeated changes to the same file collapse) and a debounce timer
|
|
117
|
+
* is (re)started.
|
|
118
|
+
*/
|
|
119
|
+
private handleEvent;
|
|
120
|
+
/**
|
|
121
|
+
* Collapse two sequential change types into a single effective type.
|
|
122
|
+
*
|
|
123
|
+
* Returns `null` when the net effect is "nothing happened" (e.g. a file
|
|
124
|
+
* was created then immediately deleted within the debounce window).
|
|
125
|
+
*/
|
|
126
|
+
private resolveChangeType;
|
|
127
|
+
/** Clear any outstanding debounce timer. */
|
|
128
|
+
private clearDebounce;
|
|
129
|
+
/** (Re)start the debounce timer. */
|
|
130
|
+
private restartDebounce;
|
|
131
|
+
/** Flush the pending-events buffer and emit a `changes` event. */
|
|
132
|
+
private flushPending;
|
|
133
|
+
/** Centralised error handler — emits 'error' but never throws. */
|
|
134
|
+
private handleError;
|
|
135
|
+
}
|
|
136
|
+
export {};
|
|
137
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/change-tracker/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI7D,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC1C,qDAAqD;IACrD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,wEAAwE;IACxE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,+CAA+C;AAC/C,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAI9D;;;;;;;;;GASG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAW;IAEzC,oCAAoC;IACpC,OAAO,CAAC,eAAe,CAAkD;IAEzE,+BAA+B;IAC/B,OAAO,CAAC,KAAK,CAAwB;IAErC,gEAAgE;IAChE,OAAO,CAAC,aAAa,CAAwC;IAE7D,uEAAuE;IACvE,OAAO,CAAC,gBAAgB,CAAsB;IAE9C,iEAAiE;IACjE,OAAO,CAAC,aAAa,CAA8C;IAEnE,yDAAyD;IACzD,OAAO,CAAC,YAAY,CAAY;gBAIpB,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAUpE;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC5B,2EAA2E;IAC3E,KAAK,IAAI,IAAI;IAMb,6CAA6C;IAC7C,MAAM,IAAI,IAAI;IAKd;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,8CAA8C;IAC9C,QAAQ,IAAI,YAAY;IAIxB;;;;;;OAMG;IACH,YAAY,IAAI,YAAY,EAAE;IAM9B;;OAEG;IACH,WAAW,IAAI,SAAS,YAAY,EAAE;IAMtC;;;OAGG;YACW,eAAe;IAqB7B;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB,oDAAoD;IACpD,OAAO,CAAC,eAAe;IAcvB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAwBnB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAsBzB,4CAA4C;IAC5C,OAAO,CAAC,aAAa;IAOrB,oCAAoC;IACpC,OAAO,CAAC,eAAe;IAOvB,kEAAkE;IAClE,OAAO,CAAC,YAAY;IAmBpB,kEAAkE;IAClE,OAAO,CAAC,WAAW;CAepB"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — File System Watcher
|
|
3
|
+
*
|
|
4
|
+
* Real-time file system watcher using chokidar. Inspired by Cursor's Merkle
|
|
5
|
+
* tree approach and CocoIndex's incremental processing. Watches project
|
|
6
|
+
* directories for file changes (create, modify, delete, rename) and emits
|
|
7
|
+
* debounced change events for incremental re-indexing.
|
|
8
|
+
*
|
|
9
|
+
* Key design choices:
|
|
10
|
+
* - Uses Node's EventEmitter for a familiar pub-sub pattern.
|
|
11
|
+
* - Debounces bursts of file system events into batched change sets.
|
|
12
|
+
* - Respects .gitignore plus user-configured custom ignore patterns.
|
|
13
|
+
* - Tracks changed files since the last consumer "drain" so nothing is lost.
|
|
14
|
+
* - Supports start / stop / pause / resume lifecycle.
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'node:events';
|
|
17
|
+
import { readFile } from 'node:fs/promises';
|
|
18
|
+
import path from 'node:path';
|
|
19
|
+
import chokidar from 'chokidar';
|
|
20
|
+
import ignore from 'ignore';
|
|
21
|
+
// --------------------------------------------------------------- watcher --
|
|
22
|
+
/**
|
|
23
|
+
* Production file-system watcher that batches raw events into debounced
|
|
24
|
+
* {@link WatcherEvent} arrays and re-emits them via EventEmitter.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const watcher = new FileWatcher(config);
|
|
28
|
+
* watcher.on('changes', (events) => { … });
|
|
29
|
+
* await watcher.start();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class FileWatcher extends EventEmitter {
|
|
33
|
+
projectRoot;
|
|
34
|
+
debounceMs;
|
|
35
|
+
maxFileSize;
|
|
36
|
+
customIgnores;
|
|
37
|
+
/** Underlying chokidar instance. */
|
|
38
|
+
chokidarWatcher = null;
|
|
39
|
+
/** Current lifecycle state. */
|
|
40
|
+
state = 'idle';
|
|
41
|
+
/** Buffer for events accumulated during the debounce window. */
|
|
42
|
+
pendingEvents = new Map();
|
|
43
|
+
/** Changes accumulated since the last call to {@link drainChanges}. */
|
|
44
|
+
undrainedChanges = [];
|
|
45
|
+
/** Handle for the debounce timer, if one is currently active. */
|
|
46
|
+
debounceTimer = null;
|
|
47
|
+
/** Compiled ignore filter (gitignore + custom rules). */
|
|
48
|
+
ignoreFilter = ignore();
|
|
49
|
+
// ---------------------------------------------------------------- ctor --
|
|
50
|
+
constructor(config) {
|
|
51
|
+
super();
|
|
52
|
+
this.projectRoot = path.resolve(config.projectRoot);
|
|
53
|
+
this.debounceMs = config.watchDebounceMs ?? 500;
|
|
54
|
+
this.maxFileSize = config.maxFileSize ?? 512 * 1024;
|
|
55
|
+
this.customIgnores = config.ignore ?? [];
|
|
56
|
+
}
|
|
57
|
+
// ------------------------------------------------------ public methods --
|
|
58
|
+
/**
|
|
59
|
+
* Start watching the project directory.
|
|
60
|
+
*
|
|
61
|
+
* Resolves once the initial scan is complete and the watcher is "ready".
|
|
62
|
+
*/
|
|
63
|
+
async start() {
|
|
64
|
+
if (this.state === 'running' || this.state === 'paused') {
|
|
65
|
+
return; // already watching
|
|
66
|
+
}
|
|
67
|
+
await this.loadIgnoreRules();
|
|
68
|
+
this.chokidarWatcher = chokidar.watch(this.projectRoot, {
|
|
69
|
+
ignored: (filePath) => this.isIgnored(filePath),
|
|
70
|
+
persistent: true,
|
|
71
|
+
ignoreInitial: true,
|
|
72
|
+
awaitWriteFinish: {
|
|
73
|
+
stabilityThreshold: 200,
|
|
74
|
+
pollInterval: 50,
|
|
75
|
+
},
|
|
76
|
+
// Avoid EMFILE on very large repos
|
|
77
|
+
usePolling: false,
|
|
78
|
+
});
|
|
79
|
+
this.attachListeners();
|
|
80
|
+
this.state = 'running';
|
|
81
|
+
// Wait for chokidar's 'ready' event before resolving.
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
this.chokidarWatcher.once('ready', () => {
|
|
84
|
+
this.emit('ready');
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
this.chokidarWatcher.once('error', (err) => {
|
|
88
|
+
reject(err);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Pause watching — events are silently discarded until {@link resume}. */
|
|
93
|
+
pause() {
|
|
94
|
+
if (this.state !== 'running')
|
|
95
|
+
return;
|
|
96
|
+
this.state = 'paused';
|
|
97
|
+
this.clearDebounce();
|
|
98
|
+
}
|
|
99
|
+
/** Resume watching after a {@link pause}. */
|
|
100
|
+
resume() {
|
|
101
|
+
if (this.state !== 'paused')
|
|
102
|
+
return;
|
|
103
|
+
this.state = 'running';
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Stop watching entirely and release all resources.
|
|
107
|
+
*
|
|
108
|
+
* After calling `stop()` the instance cannot be restarted — create a new
|
|
109
|
+
* one instead.
|
|
110
|
+
*/
|
|
111
|
+
async stop() {
|
|
112
|
+
if (this.state === 'stopped')
|
|
113
|
+
return;
|
|
114
|
+
this.clearDebounce();
|
|
115
|
+
if (this.chokidarWatcher) {
|
|
116
|
+
await this.chokidarWatcher.close();
|
|
117
|
+
this.chokidarWatcher = null;
|
|
118
|
+
}
|
|
119
|
+
this.state = 'stopped';
|
|
120
|
+
this.pendingEvents.clear();
|
|
121
|
+
this.removeAllListeners();
|
|
122
|
+
}
|
|
123
|
+
/** Current lifecycle state of the watcher. */
|
|
124
|
+
getState() {
|
|
125
|
+
return this.state;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Return all change events accumulated since the last drain (or since
|
|
129
|
+
* start, whichever is more recent) and clear the buffer.
|
|
130
|
+
*
|
|
131
|
+
* This is the primary API for consumers that want to poll rather than
|
|
132
|
+
* subscribe via events.
|
|
133
|
+
*/
|
|
134
|
+
drainChanges() {
|
|
135
|
+
const changes = [...this.undrainedChanges];
|
|
136
|
+
this.undrainedChanges = [];
|
|
137
|
+
return changes;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Peek at the undrained changes without clearing them.
|
|
141
|
+
*/
|
|
142
|
+
peekChanges() {
|
|
143
|
+
return this.undrainedChanges;
|
|
144
|
+
}
|
|
145
|
+
// -------------------------------------------------- ignore-rule loading --
|
|
146
|
+
/**
|
|
147
|
+
* Load `.gitignore` from the project root (if it exists) and merge it
|
|
148
|
+
* with user-configured custom ignore patterns.
|
|
149
|
+
*/
|
|
150
|
+
async loadIgnoreRules() {
|
|
151
|
+
this.ignoreFilter = ignore();
|
|
152
|
+
// Always ignore .git directory itself
|
|
153
|
+
this.ignoreFilter.add('.git');
|
|
154
|
+
// Load .gitignore
|
|
155
|
+
const gitignorePath = path.join(this.projectRoot, '.gitignore');
|
|
156
|
+
try {
|
|
157
|
+
const content = await readFile(gitignorePath, 'utf-8');
|
|
158
|
+
this.ignoreFilter.add(content);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// No .gitignore — that's fine.
|
|
162
|
+
}
|
|
163
|
+
// Add custom ignore patterns from config
|
|
164
|
+
if (this.customIgnores.length > 0) {
|
|
165
|
+
this.ignoreFilter.add(this.customIgnores);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Determine whether a given absolute path should be ignored.
|
|
170
|
+
*/
|
|
171
|
+
isIgnored(filePath) {
|
|
172
|
+
// Always allow the root itself through so chokidar can traverse it.
|
|
173
|
+
if (filePath === this.projectRoot)
|
|
174
|
+
return false;
|
|
175
|
+
const relative = path.relative(this.projectRoot, filePath);
|
|
176
|
+
// Paths outside project root — ignore.
|
|
177
|
+
if (!relative || relative.startsWith('..'))
|
|
178
|
+
return true;
|
|
179
|
+
// Normalise to forward-slash for `ignore` (it expects posix paths).
|
|
180
|
+
const posix = relative.split(path.sep).join('/');
|
|
181
|
+
try {
|
|
182
|
+
return this.ignoreFilter.ignores(posix);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// ------------------------------------------------------- event wiring --
|
|
189
|
+
/** Wire chokidar events to our internal handler. */
|
|
190
|
+
attachListeners() {
|
|
191
|
+
if (!this.chokidarWatcher)
|
|
192
|
+
return;
|
|
193
|
+
this.chokidarWatcher.on('add', (fp) => this.handleEvent(fp, 'created'));
|
|
194
|
+
this.chokidarWatcher.on('change', (fp) => this.handleEvent(fp, 'modified'));
|
|
195
|
+
this.chokidarWatcher.on('unlink', (fp) => this.handleEvent(fp, 'deleted'));
|
|
196
|
+
this.chokidarWatcher.on('error', (error) => {
|
|
197
|
+
this.handleError(error instanceof Error ? error : new Error(String(error)));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// -------------------------------------------------- event accumulation --
|
|
201
|
+
/**
|
|
202
|
+
* Handle a single raw chokidar event.
|
|
203
|
+
*
|
|
204
|
+
* Events are accumulated in {@link pendingEvents} (keyed by path so that
|
|
205
|
+
* rapid repeated changes to the same file collapse) and a debounce timer
|
|
206
|
+
* is (re)started.
|
|
207
|
+
*/
|
|
208
|
+
handleEvent(filePath, changeType) {
|
|
209
|
+
if (this.state !== 'running')
|
|
210
|
+
return;
|
|
211
|
+
const absPath = path.resolve(filePath);
|
|
212
|
+
const existing = this.pendingEvents.get(absPath);
|
|
213
|
+
// Collapse logic — e.g. create → modify becomes create; create → delete
|
|
214
|
+
// cancels both; modify → delete becomes delete, etc.
|
|
215
|
+
const resolvedType = this.resolveChangeType(existing?.changeType, changeType);
|
|
216
|
+
if (resolvedType === null) {
|
|
217
|
+
// Changes cancel each other out (e.g. create + delete).
|
|
218
|
+
this.pendingEvents.delete(absPath);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
this.pendingEvents.set(absPath, {
|
|
222
|
+
filePath: absPath,
|
|
223
|
+
changeType: resolvedType,
|
|
224
|
+
timestamp: Date.now(),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
this.restartDebounce();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Collapse two sequential change types into a single effective type.
|
|
231
|
+
*
|
|
232
|
+
* Returns `null` when the net effect is "nothing happened" (e.g. a file
|
|
233
|
+
* was created then immediately deleted within the debounce window).
|
|
234
|
+
*/
|
|
235
|
+
resolveChangeType(prev, curr) {
|
|
236
|
+
if (prev === undefined)
|
|
237
|
+
return curr;
|
|
238
|
+
// created → deleted = net nothing
|
|
239
|
+
if (prev === 'created' && curr === 'deleted')
|
|
240
|
+
return null;
|
|
241
|
+
// created → modified = still "created"
|
|
242
|
+
if (prev === 'created' && curr === 'modified')
|
|
243
|
+
return 'created';
|
|
244
|
+
// modified → deleted = deleted
|
|
245
|
+
if (prev === 'modified' && curr === 'deleted')
|
|
246
|
+
return 'deleted';
|
|
247
|
+
// anything → modified after existing modify = still modified
|
|
248
|
+
if (prev === 'modified' && curr === 'modified')
|
|
249
|
+
return 'modified';
|
|
250
|
+
// deleted → created = modified (re-created file)
|
|
251
|
+
if (prev === 'deleted' && curr === 'created')
|
|
252
|
+
return 'modified';
|
|
253
|
+
return curr;
|
|
254
|
+
}
|
|
255
|
+
// ----------------------------------------------------------- debounce --
|
|
256
|
+
/** Clear any outstanding debounce timer. */
|
|
257
|
+
clearDebounce() {
|
|
258
|
+
if (this.debounceTimer !== null) {
|
|
259
|
+
clearTimeout(this.debounceTimer);
|
|
260
|
+
this.debounceTimer = null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/** (Re)start the debounce timer. */
|
|
264
|
+
restartDebounce() {
|
|
265
|
+
this.clearDebounce();
|
|
266
|
+
this.debounceTimer = setTimeout(() => {
|
|
267
|
+
this.flushPending();
|
|
268
|
+
}, this.debounceMs);
|
|
269
|
+
}
|
|
270
|
+
/** Flush the pending-events buffer and emit a `changes` event. */
|
|
271
|
+
flushPending() {
|
|
272
|
+
if (this.pendingEvents.size === 0)
|
|
273
|
+
return;
|
|
274
|
+
const events = Array.from(this.pendingEvents.values());
|
|
275
|
+
this.pendingEvents.clear();
|
|
276
|
+
this.debounceTimer = null;
|
|
277
|
+
// Append to the undrained buffer so polling consumers can pick them up.
|
|
278
|
+
// Cap at 10,000 entries to prevent unbounded memory growth when idle.
|
|
279
|
+
this.undrainedChanges.push(...events);
|
|
280
|
+
if (this.undrainedChanges.length > 10_000) {
|
|
281
|
+
this.undrainedChanges = this.undrainedChanges.slice(-5_000);
|
|
282
|
+
}
|
|
283
|
+
this.emit('changes', events);
|
|
284
|
+
}
|
|
285
|
+
// -------------------------------------------------------- error handler --
|
|
286
|
+
/** Centralised error handler — emits 'error' but never throws. */
|
|
287
|
+
handleError(error) {
|
|
288
|
+
// Locked / inaccessible file warnings are common on Windows — demote
|
|
289
|
+
// them to non-fatal.
|
|
290
|
+
const isTransient = error.code === 'EPERM' ||
|
|
291
|
+
error.code === 'EBUSY' ||
|
|
292
|
+
error.code === 'EACCES';
|
|
293
|
+
if (isTransient) {
|
|
294
|
+
// Silently swallow transient FS errors; nothing actionable.
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
this.emit('error', error);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/change-tracker/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AI Mind Map — CLI Interface
|
|
4
|
+
*
|
|
5
|
+
* Full command-line interface inspired by codebase-memory-mcp's CLI mode.
|
|
6
|
+
* Parses process.argv manually (no external CLI library). Each command
|
|
7
|
+
* initialises only the components it needs — no full MCP server boot for
|
|
8
|
+
* simple queries.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ai-mind-map <command> [options]
|
|
12
|
+
*
|
|
13
|
+
* @module cli
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Main CLI entry point. Parses arguments and dispatches to the
|
|
17
|
+
* appropriate command handler.
|
|
18
|
+
*/
|
|
19
|
+
export declare function main(argv?: string[]): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AA49BH;;;GAGG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FvE"}
|