@mnemonik/scanner 1.0.0 → 2.0.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/README.md +90 -0
- package/dist/daemon.d.ts +20 -10
- package/dist/daemon.js +151 -73
- package/dist/daemon.js.map +1 -1
- package/dist/discovery.d.ts +21 -0
- package/dist/discovery.js +107 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.js +248 -56
- package/dist/index.js.map +1 -1
- package/dist/watcher.d.ts +3 -1
- package/dist/watcher.js +9 -1
- package/dist/watcher.js.map +1 -1
- package/package.json +3 -3
- package/src/daemon.ts +195 -80
- package/src/discovery.ts +125 -0
- package/src/index.ts +271 -58
- package/src/watcher.ts +13 -2
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @mnemonik/scanner
|
|
2
|
+
|
|
3
|
+
Automatic codebase indexing daemon for [Mnemonik](https://mnemonik.dev) — persistent memory for AI coding assistants.
|
|
4
|
+
|
|
5
|
+
The scanner watches your project directories for code changes and indexes them so your AI assistant can find relevant files, functions, and patterns when you need them.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @mnemonik/scanner
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
mnemonik-scanner start --key <your-api-key> --roots ~/Projects
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Your API key is available on the [Mnemonik dashboard](https://app.mnemonik.dev). The `--roots` flag specifies which directories to scan for projects (comma-separated).
|
|
20
|
+
|
|
21
|
+
Configuration is saved to `~/.mnemonik/scanner.json` after first run. Subsequent starts need no arguments:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mnemonik-scanner start
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## How It Works
|
|
28
|
+
|
|
29
|
+
1. The daemon walks your `--roots` directories looking for `.mnemonik.json` files (created automatically by your IDE's Mnemonik integration)
|
|
30
|
+
2. For each discovered project, it scans source files and pushes code chunks to the Mnemonik API
|
|
31
|
+
3. It watches for file changes and incrementally updates the index
|
|
32
|
+
4. Every 5 minutes, it re-scans roots to discover new projects, handle folder renames, and drop deleted projects
|
|
33
|
+
|
|
34
|
+
## Commands
|
|
35
|
+
|
|
36
|
+
| Command | Description |
|
|
37
|
+
|---------|-------------|
|
|
38
|
+
| `mnemonik-scanner start [options]` | Start the daemon |
|
|
39
|
+
| `mnemonik-scanner stop` | Stop the running daemon |
|
|
40
|
+
| `mnemonik-scanner status` | Show daemon status and watched projects |
|
|
41
|
+
| `mnemonik-scanner log` | Show recent log output |
|
|
42
|
+
| `mnemonik-scanner help` | Show usage information |
|
|
43
|
+
|
|
44
|
+
### Start Options
|
|
45
|
+
|
|
46
|
+
| Option | Description |
|
|
47
|
+
|--------|-------------|
|
|
48
|
+
| `--key <api-key>` | Mnemonik API key (or set `MNEMONIK_API_KEY` env var) |
|
|
49
|
+
| `--server <url>` | Server URL (default: `https://api.mnemonik.dev`) |
|
|
50
|
+
| `--roots <dirs>` | Comma-separated directories to scan for projects |
|
|
51
|
+
|
|
52
|
+
## Configuration
|
|
53
|
+
|
|
54
|
+
The daemon saves its configuration to `~/.mnemonik/scanner.json` with `0600` permissions (owner read/write only).
|
|
55
|
+
|
|
56
|
+
You can also set the API key via the `MNEMONIK_API_KEY` environment variable, which takes precedence over the config file and is never written to disk.
|
|
57
|
+
|
|
58
|
+
### Files
|
|
59
|
+
|
|
60
|
+
| Path | Purpose |
|
|
61
|
+
|------|---------|
|
|
62
|
+
| `~/.mnemonik/scanner.json` | Persistent configuration |
|
|
63
|
+
| `~/.mnemonik/daemon.pid` | PID file for the running daemon |
|
|
64
|
+
| `~/.mnemonik/scanner.log` | Log file (rotated at 5MB) |
|
|
65
|
+
|
|
66
|
+
## What Gets Indexed
|
|
67
|
+
|
|
68
|
+
The scanner indexes code chunks (functions, classes, modules) from these file types:
|
|
69
|
+
|
|
70
|
+
`.ts` `.tsx` `.js` `.jsx` `.py` `.rs` `.go` `.java` `.c` `.cpp` `.h` `.cs` `.rb` `.php` `.swift` `.kt` `.md`
|
|
71
|
+
|
|
72
|
+
It respects `.gitignore` and skips common directories (`node_modules`, `.git`, `dist`, `build`, etc.). Only code structure is indexed — binary files and non-code assets are ignored.
|
|
73
|
+
|
|
74
|
+
## Resource Usage
|
|
75
|
+
|
|
76
|
+
The daemon is designed to run continuously with minimal impact:
|
|
77
|
+
|
|
78
|
+
- **Memory**: Capped at 256MB
|
|
79
|
+
- **CPU**: Event-driven (idle when no files change)
|
|
80
|
+
- **Disk**: Log rotation at 5MB
|
|
81
|
+
- **Network**: Only changed files are pushed (hash-based diffing)
|
|
82
|
+
|
|
83
|
+
## Requirements
|
|
84
|
+
|
|
85
|
+
- Node.js 20 or later
|
|
86
|
+
- A Mnemonik account and API key ([sign up](https://mnemonik.dev))
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
Proprietary. See [mnemonik.dev/terms](https://mnemonik.dev/terms) for details.
|
package/dist/daemon.d.ts
CHANGED
|
@@ -1,25 +1,35 @@
|
|
|
1
1
|
export interface DaemonConfig {
|
|
2
|
-
projectId: string;
|
|
3
|
-
projectRoot: string;
|
|
4
2
|
serverUrl: string;
|
|
5
3
|
apiKey: string;
|
|
4
|
+
roots: string[];
|
|
5
|
+
refreshIntervalMs?: number;
|
|
6
|
+
maxConcurrentScans?: number;
|
|
6
7
|
}
|
|
7
8
|
export declare class ScannerDaemon {
|
|
8
9
|
private config;
|
|
9
10
|
private client;
|
|
10
11
|
private scanner;
|
|
11
|
-
private
|
|
12
|
-
private
|
|
13
|
-
private
|
|
12
|
+
private projects;
|
|
13
|
+
private refreshTimer;
|
|
14
|
+
private discovery;
|
|
15
|
+
private refreshIntervalMs;
|
|
16
|
+
private maxConcurrentScans;
|
|
14
17
|
constructor(config: DaemonConfig);
|
|
15
18
|
start(): Promise<void>;
|
|
16
|
-
private waitForServer;
|
|
17
|
-
getProjectRoot(): string;
|
|
18
|
-
getProjectId(): string;
|
|
19
19
|
stop(): Promise<void>;
|
|
20
|
-
|
|
20
|
+
getWatchedProjects(): Array<{
|
|
21
|
+
projectId: string;
|
|
22
|
+
path: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Discover projects from configured roots and reconcile with current watch list.
|
|
27
|
+
*/
|
|
28
|
+
refreshProjects(): Promise<void>;
|
|
29
|
+
private addProject;
|
|
30
|
+
private waitForServer;
|
|
21
31
|
private initialScan;
|
|
22
|
-
private startWatching;
|
|
23
32
|
private handleChanges;
|
|
33
|
+
private startRetryLoop;
|
|
24
34
|
private groupChunksByFile;
|
|
25
35
|
}
|
package/dist/daemon.js
CHANGED
|
@@ -4,25 +4,128 @@ import { join } from 'path';
|
|
|
4
4
|
import { CodeScanner } from '@mnemonik/shared';
|
|
5
5
|
import { MnemonikClient } from './client.js';
|
|
6
6
|
import { FileWatcher } from './watcher.js';
|
|
7
|
+
import { ProjectDiscovery } from './discovery.js';
|
|
7
8
|
export class ScannerDaemon {
|
|
8
9
|
config;
|
|
9
10
|
client;
|
|
10
11
|
scanner;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
projects = new Map();
|
|
13
|
+
refreshTimer = null;
|
|
14
|
+
discovery;
|
|
15
|
+
refreshIntervalMs;
|
|
16
|
+
maxConcurrentScans;
|
|
14
17
|
constructor(config) {
|
|
15
18
|
this.config = config;
|
|
16
19
|
this.client = new MnemonikClient(config.serverUrl, config.apiKey);
|
|
17
20
|
this.scanner = new CodeScanner();
|
|
21
|
+
this.discovery = new ProjectDiscovery(config.roots);
|
|
22
|
+
this.refreshIntervalMs = config.refreshIntervalMs ?? 300_000; // 5 min
|
|
23
|
+
this.maxConcurrentScans = config.maxConcurrentScans ?? 5;
|
|
18
24
|
}
|
|
19
25
|
async start() {
|
|
20
|
-
console.log(`[scanner] Starting daemon
|
|
26
|
+
console.log(`[scanner] Starting daemon`);
|
|
21
27
|
console.log(`[scanner] Server: ${this.config.serverUrl}`);
|
|
22
|
-
console.log(`[scanner]
|
|
28
|
+
console.log(`[scanner] Roots: ${this.config.roots.join(', ')}`);
|
|
23
29
|
await this.waitForServer();
|
|
24
|
-
await this.
|
|
25
|
-
|
|
30
|
+
await this.refreshProjects();
|
|
31
|
+
this.refreshTimer = setInterval(() => {
|
|
32
|
+
this.refreshProjects().catch((err) => {
|
|
33
|
+
console.warn('[scanner] Refresh failed:', err.message);
|
|
34
|
+
});
|
|
35
|
+
}, this.refreshIntervalMs);
|
|
36
|
+
this.refreshTimer.unref();
|
|
37
|
+
console.log('[scanner] Watching for changes.');
|
|
38
|
+
}
|
|
39
|
+
async stop() {
|
|
40
|
+
if (this.refreshTimer) {
|
|
41
|
+
clearInterval(this.refreshTimer);
|
|
42
|
+
this.refreshTimer = null;
|
|
43
|
+
}
|
|
44
|
+
for (const project of this.projects.values()) {
|
|
45
|
+
project.watcher.stop();
|
|
46
|
+
if (project.retryTimer)
|
|
47
|
+
clearInterval(project.retryTimer);
|
|
48
|
+
}
|
|
49
|
+
this.projects.clear();
|
|
50
|
+
console.log('[scanner] Daemon stopped');
|
|
51
|
+
}
|
|
52
|
+
getWatchedProjects() {
|
|
53
|
+
return Array.from(this.projects.values()).map((p) => ({
|
|
54
|
+
projectId: p.projectId,
|
|
55
|
+
path: p.path,
|
|
56
|
+
name: p.name,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Discover projects from configured roots and reconcile with current watch list.
|
|
61
|
+
*/
|
|
62
|
+
async refreshProjects() {
|
|
63
|
+
const discovered = await this.discovery.discover();
|
|
64
|
+
const discoveredMap = new Map(discovered.map((d) => [d.projectId, d]));
|
|
65
|
+
// Remove projects no longer discovered
|
|
66
|
+
for (const [projectId, project] of this.projects) {
|
|
67
|
+
if (!discoveredMap.has(projectId)) {
|
|
68
|
+
console.log(`[scanner] Project removed: ${project.name ?? projectId} (${project.path})`);
|
|
69
|
+
project.watcher.stop();
|
|
70
|
+
if (project.retryTimer)
|
|
71
|
+
clearInterval(project.retryTimer);
|
|
72
|
+
this.projects.delete(projectId);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Add new projects or handle path changes
|
|
76
|
+
for (const discovered_project of discoveredMap.values()) {
|
|
77
|
+
const existing = this.projects.get(discovered_project.projectId);
|
|
78
|
+
if (!existing) {
|
|
79
|
+
// New project
|
|
80
|
+
await this.addProject(discovered_project);
|
|
81
|
+
}
|
|
82
|
+
else if (existing.path !== discovered_project.path) {
|
|
83
|
+
// Path changed (folder renamed/moved)
|
|
84
|
+
console.log(`[scanner] Project moved: ${existing.name ?? existing.projectId} ` +
|
|
85
|
+
`${existing.path} → ${discovered_project.path}`);
|
|
86
|
+
existing.watcher.stop();
|
|
87
|
+
if (existing.retryTimer)
|
|
88
|
+
clearInterval(existing.retryTimer);
|
|
89
|
+
this.projects.delete(discovered_project.projectId);
|
|
90
|
+
await this.addProject(discovered_project);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
console.log(`[scanner] Watching ${this.projects.size} project(s)`);
|
|
94
|
+
}
|
|
95
|
+
async addProject(discovered) {
|
|
96
|
+
const label = discovered.projectName ?? discovered.projectId.slice(0, 8);
|
|
97
|
+
console.log(`[scanner] Adding project: ${label} (${discovered.path})`);
|
|
98
|
+
try {
|
|
99
|
+
await this.initialScan(discovered.projectId, discovered.path);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.warn(`[scanner] Initial scan failed for ${label}:`, err.message);
|
|
103
|
+
}
|
|
104
|
+
const watcher = new FileWatcher(discovered.path, (changedFiles) => this.handleChanges(discovered.projectId, discovered.path, changedFiles), 500, (err) => {
|
|
105
|
+
console.warn(`[scanner] Root watcher error for ${label}: ${err.message}. Removing project.`);
|
|
106
|
+
const project = this.projects.get(discovered.projectId);
|
|
107
|
+
if (project) {
|
|
108
|
+
project.watcher.stop();
|
|
109
|
+
if (project.retryTimer)
|
|
110
|
+
clearInterval(project.retryTimer);
|
|
111
|
+
this.projects.delete(discovered.projectId);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
await watcher.start();
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.warn(`[scanner] Failed to start watcher for ${label}:`, err.message);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.projects.set(discovered.projectId, {
|
|
122
|
+
projectId: discovered.projectId,
|
|
123
|
+
path: discovered.path,
|
|
124
|
+
name: discovered.projectName,
|
|
125
|
+
watcher,
|
|
126
|
+
pendingRetries: new Set(),
|
|
127
|
+
retryTimer: null,
|
|
128
|
+
});
|
|
26
129
|
}
|
|
27
130
|
async waitForServer() {
|
|
28
131
|
let logged = false;
|
|
@@ -47,108 +150,83 @@ export class ScannerDaemon {
|
|
|
47
150
|
}
|
|
48
151
|
throw new Error(`Server unreachable after ${maxRetries} attempts`);
|
|
49
152
|
}
|
|
50
|
-
|
|
51
|
-
return this.config.projectRoot;
|
|
52
|
-
}
|
|
53
|
-
getProjectId() {
|
|
54
|
-
return this.config.projectId;
|
|
55
|
-
}
|
|
56
|
-
async stop() {
|
|
57
|
-
this.watcher?.stop();
|
|
58
|
-
if (this.retryTimer)
|
|
59
|
-
clearInterval(this.retryTimer);
|
|
60
|
-
console.log('[scanner] Daemon stopped');
|
|
61
|
-
}
|
|
62
|
-
startRetryLoop() {
|
|
63
|
-
if (this.retryTimer)
|
|
64
|
-
return;
|
|
65
|
-
console.log(`[scanner] ${this.pendingRetries.size} file(s) queued for retry`);
|
|
66
|
-
this.retryTimer = setInterval(async () => {
|
|
67
|
-
if (this.pendingRetries.size === 0) {
|
|
68
|
-
if (this.retryTimer)
|
|
69
|
-
clearInterval(this.retryTimer);
|
|
70
|
-
this.retryTimer = null;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const files = [...this.pendingRetries];
|
|
74
|
-
this.pendingRetries.clear();
|
|
75
|
-
await this.handleChanges(files);
|
|
76
|
-
}, 10_000);
|
|
77
|
-
this.retryTimer.unref();
|
|
78
|
-
}
|
|
79
|
-
async initialScan() {
|
|
80
|
-
console.log('[scanner] Starting initial scan...');
|
|
153
|
+
async initialScan(projectId, projectRoot) {
|
|
81
154
|
const startTime = Date.now();
|
|
82
|
-
const chunks = await this.scanner.scanDirectory(
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
console.log(`[scanner] Server knows ${serverHashes.size} files`);
|
|
86
|
-
const files = await this.groupChunksByFile(chunks);
|
|
155
|
+
const chunks = await this.scanner.scanDirectory(projectRoot);
|
|
156
|
+
const serverHashes = await this.client.getStatus(projectId);
|
|
157
|
+
const files = await this.groupChunksByFile(chunks, projectRoot);
|
|
87
158
|
const filesToPush = files.filter((f) => {
|
|
88
159
|
const serverHash = serverHashes.get(f.path);
|
|
89
160
|
return !serverHash || serverHash !== f.hash;
|
|
90
161
|
});
|
|
91
|
-
if (filesToPush.length
|
|
92
|
-
console.log(
|
|
93
|
-
|
|
94
|
-
else {
|
|
95
|
-
console.log(`[scanner] Pushing ${filesToPush.length} changed files...`);
|
|
96
|
-
await this.client.pushFiles(this.config.projectId, filesToPush);
|
|
97
|
-
console.log(`[scanner] Push complete`);
|
|
162
|
+
if (filesToPush.length > 0) {
|
|
163
|
+
console.log(`[scanner] Pushing ${filesToPush.length} changed files for ${projectId.slice(0, 8)}...`);
|
|
164
|
+
await this.client.pushFiles(projectId, filesToPush);
|
|
98
165
|
}
|
|
99
166
|
const duration = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
100
|
-
console.log(`[scanner]
|
|
167
|
+
console.log(`[scanner] Scan complete for ${projectId.slice(0, 8)}: ` +
|
|
168
|
+
`${chunks.length} chunks, ${filesToPush.length} pushed (${duration}s)`);
|
|
101
169
|
}
|
|
102
|
-
async
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
async handleChanges(changedFiles) {
|
|
170
|
+
async handleChanges(projectId, projectRoot, changedFiles) {
|
|
171
|
+
const project = this.projects.get(projectId);
|
|
172
|
+
if (!project)
|
|
173
|
+
return;
|
|
107
174
|
try {
|
|
108
|
-
const absPaths = changedFiles.map((rel) => join(
|
|
109
|
-
const chunks = await this.scanner.scanFiles(absPaths,
|
|
175
|
+
const absPaths = changedFiles.map((rel) => join(projectRoot, rel));
|
|
176
|
+
const chunks = await this.scanner.scanFiles(absPaths, projectRoot);
|
|
110
177
|
if (chunks.length === 0)
|
|
111
178
|
return;
|
|
112
|
-
const files = await this.groupChunksByFile(chunks);
|
|
113
|
-
// Push in batches, only retrying files from failed batches
|
|
179
|
+
const files = await this.groupChunksByFile(chunks, projectRoot);
|
|
114
180
|
const batchSize = 25;
|
|
115
181
|
const succeededPaths = new Set();
|
|
116
182
|
let hadFailure = false;
|
|
117
183
|
for (let i = 0; i < files.length; i += batchSize) {
|
|
118
184
|
const batch = files.slice(i, i + batchSize);
|
|
119
185
|
try {
|
|
120
|
-
await this.client.pushFiles(
|
|
186
|
+
await this.client.pushFiles(projectId, batch);
|
|
121
187
|
for (const f of batch)
|
|
122
188
|
succeededPaths.add(f.path);
|
|
123
189
|
}
|
|
124
190
|
catch {
|
|
125
191
|
hadFailure = true;
|
|
126
192
|
for (const f of batch)
|
|
127
|
-
|
|
193
|
+
project.pendingRetries.add(f.path);
|
|
128
194
|
}
|
|
129
195
|
}
|
|
130
196
|
if (succeededPaths.size > 0) {
|
|
131
|
-
console.log(`[scanner] Pushed ${succeededPaths.size}
|
|
197
|
+
console.log(`[scanner] [${projectId.slice(0, 8)}] Pushed ${succeededPaths.size} file(s): ${[...succeededPaths].join(', ')}`);
|
|
132
198
|
}
|
|
133
199
|
if (hadFailure) {
|
|
134
|
-
console.warn(`[scanner] ${
|
|
135
|
-
this.startRetryLoop();
|
|
200
|
+
console.warn(`[scanner] [${projectId.slice(0, 8)}] ${project.pendingRetries.size} file(s) failed, queued for retry`);
|
|
201
|
+
this.startRetryLoop(project);
|
|
136
202
|
}
|
|
137
203
|
}
|
|
138
204
|
catch (err) {
|
|
139
|
-
console.error(
|
|
205
|
+
console.error(`[scanner] [${projectId.slice(0, 8)}] Error handling changes:`, err);
|
|
140
206
|
}
|
|
141
207
|
}
|
|
142
|
-
|
|
208
|
+
startRetryLoop(project) {
|
|
209
|
+
if (project.retryTimer)
|
|
210
|
+
return;
|
|
211
|
+
project.retryTimer = setInterval(async () => {
|
|
212
|
+
if (project.pendingRetries.size === 0) {
|
|
213
|
+
if (project.retryTimer)
|
|
214
|
+
clearInterval(project.retryTimer);
|
|
215
|
+
project.retryTimer = null;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const files = [...project.pendingRetries];
|
|
219
|
+
project.pendingRetries.clear();
|
|
220
|
+
await this.handleChanges(project.projectId, project.path, files);
|
|
221
|
+
}, 10_000);
|
|
222
|
+
project.retryTimer.unref();
|
|
223
|
+
}
|
|
224
|
+
async groupChunksByFile(chunks, projectRoot) {
|
|
143
225
|
const fileMap = new Map();
|
|
144
226
|
for (const chunk of chunks) {
|
|
145
227
|
const key = chunk.filePath;
|
|
146
228
|
if (!fileMap.has(key)) {
|
|
147
|
-
fileMap.set(key, {
|
|
148
|
-
path: key,
|
|
149
|
-
hash: '',
|
|
150
|
-
chunks: [],
|
|
151
|
-
});
|
|
229
|
+
fileMap.set(key, { path: key, hash: '', chunks: [] });
|
|
152
230
|
}
|
|
153
231
|
const file = fileMap.get(key);
|
|
154
232
|
file.chunks.push({
|
|
@@ -163,7 +241,7 @@ export class ScannerDaemon {
|
|
|
163
241
|
}
|
|
164
242
|
for (const file of fileMap.values()) {
|
|
165
243
|
try {
|
|
166
|
-
const absPath = join(
|
|
244
|
+
const absPath = join(projectRoot, file.path);
|
|
167
245
|
const raw = await readFile(absPath, 'utf-8');
|
|
168
246
|
file.hash = createHash('sha256').update(raw).digest('hex');
|
|
169
247
|
}
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface DiscoveredProject {
|
|
2
|
+
projectId: string;
|
|
3
|
+
path: string;
|
|
4
|
+
projectName?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ProjectDiscovery {
|
|
7
|
+
private roots;
|
|
8
|
+
private maxDepth;
|
|
9
|
+
private timeoutMs;
|
|
10
|
+
constructor(roots: string[], options?: {
|
|
11
|
+
maxDepth?: number;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Discover all projects with .mnemonik.json files under the configured roots.
|
|
16
|
+
* Deduplicates by projectId (same project found at multiple paths = first wins).
|
|
17
|
+
*/
|
|
18
|
+
discover(): Promise<DiscoveredProject[]>;
|
|
19
|
+
private walkWithTimeout;
|
|
20
|
+
private walk;
|
|
21
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { readFile, readdir } from 'fs/promises';
|
|
2
|
+
import { join, resolve } from 'path';
|
|
3
|
+
/** Directories to skip during discovery walk */
|
|
4
|
+
const SKIP_DIRS = new Set([
|
|
5
|
+
'node_modules',
|
|
6
|
+
'.git',
|
|
7
|
+
'dist',
|
|
8
|
+
'build',
|
|
9
|
+
'.next',
|
|
10
|
+
'.nuxt',
|
|
11
|
+
'.output',
|
|
12
|
+
'__pycache__',
|
|
13
|
+
'.venv',
|
|
14
|
+
'venv',
|
|
15
|
+
'.tox',
|
|
16
|
+
'target',
|
|
17
|
+
'.cache',
|
|
18
|
+
'coverage',
|
|
19
|
+
'.turbo',
|
|
20
|
+
'.vercel',
|
|
21
|
+
'.svelte-kit',
|
|
22
|
+
]);
|
|
23
|
+
export class ProjectDiscovery {
|
|
24
|
+
roots;
|
|
25
|
+
maxDepth;
|
|
26
|
+
timeoutMs;
|
|
27
|
+
constructor(roots, options) {
|
|
28
|
+
this.roots = roots;
|
|
29
|
+
this.maxDepth = options?.maxDepth ?? 3;
|
|
30
|
+
this.timeoutMs = options?.timeoutMs ?? 30_000;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Discover all projects with .mnemonik.json files under the configured roots.
|
|
34
|
+
* Deduplicates by projectId (same project found at multiple paths = first wins).
|
|
35
|
+
*/
|
|
36
|
+
async discover() {
|
|
37
|
+
const seen = new Map();
|
|
38
|
+
for (const root of this.roots) {
|
|
39
|
+
const absRoot = resolve(root.replace(/^~/, process.env.HOME || ''));
|
|
40
|
+
try {
|
|
41
|
+
await this.walkWithTimeout(absRoot, 0, seen);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (err instanceof DiscoveryTimeoutError) {
|
|
45
|
+
console.warn(`[scanner] Discovery timeout for root: ${absRoot} (>${this.timeoutMs}ms)`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.warn(`[scanner] Error scanning root ${absRoot}:`, err.message);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return Array.from(seen.values());
|
|
53
|
+
}
|
|
54
|
+
async walkWithTimeout(dir, depth, seen) {
|
|
55
|
+
const deadline = Date.now() + this.timeoutMs;
|
|
56
|
+
await this.walk(dir, depth, seen, deadline);
|
|
57
|
+
}
|
|
58
|
+
async walk(dir, depth, seen, deadline) {
|
|
59
|
+
if (depth > this.maxDepth)
|
|
60
|
+
return;
|
|
61
|
+
if (Date.now() > deadline)
|
|
62
|
+
throw new DiscoveryTimeoutError();
|
|
63
|
+
// Check for .mnemonik.json in this directory
|
|
64
|
+
const configPath = join(dir, '.mnemonik.json');
|
|
65
|
+
try {
|
|
66
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
if (typeof parsed.projectId === 'string' && parsed.projectId.length > 0) {
|
|
69
|
+
if (!seen.has(parsed.projectId)) {
|
|
70
|
+
seen.set(parsed.projectId, {
|
|
71
|
+
projectId: parsed.projectId,
|
|
72
|
+
path: dir,
|
|
73
|
+
projectName: typeof parsed.projectName === 'string' ? parsed.projectName : undefined,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Don't recurse into subdirectories of a project — the project owns this tree
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// No .mnemonik.json here, continue walking
|
|
82
|
+
}
|
|
83
|
+
// Recurse into subdirectories
|
|
84
|
+
try {
|
|
85
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
if (!entry.isDirectory())
|
|
88
|
+
continue;
|
|
89
|
+
if (SKIP_DIRS.has(entry.name))
|
|
90
|
+
continue;
|
|
91
|
+
if (entry.name.startsWith('.') && entry.name !== '.mnemonik')
|
|
92
|
+
continue;
|
|
93
|
+
await this.walk(join(dir, entry.name), depth + 1, seen, deadline);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Permission denied or inaccessible directory
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
class DiscoveryTimeoutError extends Error {
|
|
102
|
+
constructor() {
|
|
103
|
+
super('Discovery walk timed out');
|
|
104
|
+
this.name = 'DiscoveryTimeoutError';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|