@blamechris/repo-memory 0.6.0 → 0.9.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 +48 -9
- package/dist/cache/store.d.ts +10 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +21 -0
- package/dist/cache/store.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +66 -31
- package/dist/config.js.map +1 -1
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/indexer/ast-summarizer.d.ts +10 -0
- package/dist/indexer/ast-summarizer.d.ts.map +1 -0
- package/dist/indexer/ast-summarizer.js +401 -0
- package/dist/indexer/ast-summarizer.js.map +1 -0
- package/dist/indexer/imports.d.ts.map +1 -1
- package/dist/indexer/imports.js +2 -1
- package/dist/indexer/imports.js.map +1 -1
- package/dist/indexer/project-map.d.ts +0 -2
- package/dist/indexer/project-map.d.ts.map +1 -1
- package/dist/indexer/project-map.js +13 -9
- package/dist/indexer/project-map.js.map +1 -1
- package/dist/indexer/scanner.d.ts.map +1 -1
- package/dist/indexer/scanner.js +2 -1
- package/dist/indexer/scanner.js.map +1 -1
- package/dist/indexer/smart-summarizer.d.ts +2 -2
- package/dist/indexer/smart-summarizer.d.ts.map +1 -1
- package/dist/indexer/smart-summarizer.js +4 -4
- package/dist/indexer/smart-summarizer.js.map +1 -1
- package/dist/indexer/summarize.d.ts +21 -0
- package/dist/indexer/summarize.d.ts.map +1 -0
- package/dist/indexer/summarize.js +50 -0
- package/dist/indexer/summarize.js.map +1 -0
- package/dist/indexer/summarizer.js +1 -1
- package/dist/indexer/summarizer.js.map +1 -1
- package/dist/persistence/db.d.ts.map +1 -1
- package/dist/persistence/db.js +11 -0
- package/dist/persistence/db.js.map +1 -1
- package/dist/server.js +14 -7
- package/dist/server.js.map +1 -1
- package/dist/tools/force-reread.d.ts.map +1 -1
- package/dist/tools/force-reread.js +3 -2
- package/dist/tools/force-reread.js.map +1 -1
- package/dist/tools/get-file-summary.d.ts.map +1 -1
- package/dist/tools/get-file-summary.js +3 -2
- package/dist/tools/get-file-summary.js.map +1 -1
- package/dist/tools/search-by-purpose.d.ts +2 -1
- package/dist/tools/search-by-purpose.d.ts.map +1 -1
- package/dist/tools/search-by-purpose.js +24 -5
- package/dist/tools/search-by-purpose.js.map +1 -1
- package/dist/utils/posix-path.d.ts +14 -0
- package/dist/utils/posix-path.d.ts.map +1 -0
- package/dist/utils/posix-path.js +16 -0
- package/dist/utils/posix-path.js.map +1 -0
- package/dist/utils/validate-path.d.ts.map +1 -1
- package/dist/utils/validate-path.js +2 -1
- package/dist/utils/validate-path.js.map +1 -1
- package/package.json +6 -4
package/README.md
CHANGED
|
@@ -62,20 +62,39 @@ The savings compound fast. An agent exploring a project touches the same files 3
|
|
|
62
62
|
|
|
63
63
|
## Tools
|
|
64
64
|
|
|
65
|
+
Tools are organized into **groups**. `navigation` and `summaries` are **on by default** — together they deliver the core "understand the repo without re-reading" loop. `tasks` and `telemetry` are **off by default** (niche/meta features; each MCP tool adds ~100 tokens/turn, so the default surface stays lean). Toggle any group in `.repo-memory.json` (see [Configuration](#configuration)).
|
|
66
|
+
|
|
67
|
+
**Navigation** — always on:
|
|
68
|
+
|
|
65
69
|
| Tool | Description |
|
|
66
70
|
|------|-------------|
|
|
67
|
-
| `get_file_summary` | Cached file summary (exports, imports, purpose) |
|
|
68
|
-
| `batch_file_summaries` | Get summaries for multiple files at once |
|
|
69
|
-
| `get_changed_files` | Files changed since last check |
|
|
70
71
|
| `get_project_map` | Structural overview of project |
|
|
71
|
-
| `search_by_purpose` | Search files by purpose/exports keywords |
|
|
72
72
|
| `get_related_files` | Find related files ranked by relevance |
|
|
73
73
|
| `get_dependency_graph` | File dependency relationships |
|
|
74
|
-
| `
|
|
75
|
-
|
|
74
|
+
| `get_changed_files` | Files changed since last check |
|
|
75
|
+
|
|
76
|
+
**Summaries** — on by default (the core feature); disable with `"tools": { "summaries": false }`:
|
|
77
|
+
|
|
78
|
+
| Tool | Description |
|
|
79
|
+
|------|-------------|
|
|
80
|
+
| `get_file_summary` | Cached file summary (exports, imports, purpose) |
|
|
81
|
+
| `batch_file_summaries` | Get summaries for multiple files at once |
|
|
82
|
+
| `search_by_purpose` | Search files by purpose/exports keywords |
|
|
76
83
|
| `force_reread` | Force fresh summary generation |
|
|
77
84
|
| `invalidate` | Clear cache entries |
|
|
78
85
|
|
|
86
|
+
**Tasks** — off by default; enable with `"tools": { "tasks": true }`:
|
|
87
|
+
|
|
88
|
+
| Tool | Description |
|
|
89
|
+
|------|-------------|
|
|
90
|
+
| `create_task` / `get_task_context` / `mark_explored` | Track investigation progress across turns |
|
|
91
|
+
|
|
92
|
+
**Telemetry** — off by default; enable with `"tools": { "telemetry": true }`:
|
|
93
|
+
|
|
94
|
+
| Tool | Description |
|
|
95
|
+
|------|-------------|
|
|
96
|
+
| `get_token_report` | Token usage and savings report |
|
|
97
|
+
|
|
79
98
|
## Token Savings Tracking
|
|
80
99
|
|
|
81
100
|
repo-memory tracks every cache interaction so you can measure exactly how many tokens you're saving. Call `get_token_report` at any time to see your stats.
|
|
@@ -162,16 +181,36 @@ Create a `.repo-memory.json` in your project root to customize behavior:
|
|
|
162
181
|
{
|
|
163
182
|
"ignore": ["dist", "node_modules", "*.generated.ts"],
|
|
164
183
|
"maxFiles": 5000,
|
|
184
|
+
"summarizer": "ast",
|
|
165
185
|
"gc": {
|
|
166
|
-
"cacheMaxAgeDays": 30
|
|
186
|
+
"cacheMaxAgeDays": 30,
|
|
187
|
+
"taskMaxAgeDays": 30,
|
|
188
|
+
"telemetryMaxAgeDays": 90
|
|
189
|
+
},
|
|
190
|
+
"tools": {
|
|
191
|
+
"tasks": true,
|
|
192
|
+
"telemetry": true
|
|
167
193
|
}
|
|
168
194
|
}
|
|
169
195
|
```
|
|
170
196
|
|
|
197
|
+
`summarizer` selects the summary engine: `"regex"` (default) or `"ast"`. AST mode parses TypeScript/JavaScript files (`.ts/.tsx/.js/.jsx/.mjs/.cjs`) with tree-sitter, producing accurate exports/declarations and a semantic `purpose` line that names the dominant symbols (e.g. `class CacheStore (9 methods)` instead of `source`) — which is what `search_by_purpose` matches against. TS/JS only for now; other languages, unsupported extensions, and files with parse errors fall back to the regex summarizer automatically. Switching modes regenerates summaries lazily on next access.
|
|
198
|
+
|
|
199
|
+
The `tools` block toggles tool groups. `navigation` and `summaries` are **on by default** (set `"summaries": false` to drop the summary tools); `tasks` and `telemetry` are **off by default** (set them to `true` to enable).
|
|
200
|
+
|
|
201
|
+
The `gc` block controls garbage collection, which runs automatically on server startup:
|
|
202
|
+
- `cacheMaxAgeDays` — remove cache entries not checked in N days (default: 30)
|
|
203
|
+
- `taskMaxAgeDays` — remove completed/archived tasks not updated in N days (default: 30)
|
|
204
|
+
- `telemetryMaxAgeDays` — remove telemetry events older than N days (default: 90)
|
|
205
|
+
|
|
206
|
+
GC also removes cache entries for deleted files and orphaned import records, regardless of age.
|
|
207
|
+
|
|
208
|
+
Config validation is per-key: an invalid value is skipped with a warning on stderr while the remaining valid keys still apply. Only a file that can't be read or parsed as JSON falls back entirely to built-in defaults.
|
|
209
|
+
|
|
171
210
|
## Language Support
|
|
172
211
|
|
|
173
|
-
Summaries are extracted via regex analysis. Supported languages:
|
|
174
|
-
- **TypeScript / JavaScript** — exports, imports, declarations, purpose classification
|
|
212
|
+
Summaries are extracted via regex analysis (or tree-sitter when `"summarizer": "ast"` is set — TS/JS only). Supported languages:
|
|
213
|
+
- **TypeScript / JavaScript** — exports, imports, declarations, purpose classification; optional AST mode for semantic purpose lines
|
|
175
214
|
- **Python** — functions, classes, `__all__`, `from`/`import` statements
|
|
176
215
|
- **Go** — exported names (uppercase), imports, type/func/var/const declarations
|
|
177
216
|
- **Rust** — `pub` items, `use`/`mod` statements, structs/enums/traits/impls
|
package/dist/cache/store.d.ts
CHANGED
|
@@ -11,6 +11,16 @@ export declare class CacheStore {
|
|
|
11
11
|
hash: string;
|
|
12
12
|
summary?: FileSummary | null;
|
|
13
13
|
}>): void;
|
|
14
|
+
/** Read a value from the meta key/value table. */
|
|
15
|
+
getMeta(key: string): string | null;
|
|
16
|
+
/** Write a value to the meta key/value table. */
|
|
17
|
+
setMeta(key: string, value: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Drop all cached summaries while keeping hashes and timestamps. Used when
|
|
20
|
+
* the summarizer implementation changes: change detection stays intact and
|
|
21
|
+
* summaries regenerate lazily on next access.
|
|
22
|
+
*/
|
|
23
|
+
clearAllSummaries(): void;
|
|
14
24
|
getStaleEntries(maxAge: number): CacheEntry[];
|
|
15
25
|
}
|
|
16
26
|
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB3D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAevE,aAAa,IAAI,UAAU,EAAE;IAS7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI;IAsB9F,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;CAW9C"}
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB3D,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAevE,aAAa,IAAI,UAAU,EAAE;IAS7B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,IAAI;IAsB9F,kDAAkD;IAClD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,iDAAiD;IACjD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQzC;;;;OAIG;IACH,iBAAiB,IAAI,IAAI;IAKzB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;CAW9C"}
|
package/dist/cache/store.js
CHANGED
|
@@ -58,6 +58,27 @@ export class CacheStore {
|
|
|
58
58
|
});
|
|
59
59
|
runBatch();
|
|
60
60
|
}
|
|
61
|
+
/** Read a value from the meta key/value table. */
|
|
62
|
+
getMeta(key) {
|
|
63
|
+
const db = getDatabase(this.projectRoot);
|
|
64
|
+
const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(key);
|
|
65
|
+
return row?.value ?? null;
|
|
66
|
+
}
|
|
67
|
+
/** Write a value to the meta key/value table. */
|
|
68
|
+
setMeta(key, value) {
|
|
69
|
+
const db = getDatabase(this.projectRoot);
|
|
70
|
+
db.prepare(`INSERT INTO meta (key, value) VALUES (?, ?)
|
|
71
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(key, value);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Drop all cached summaries while keeping hashes and timestamps. Used when
|
|
75
|
+
* the summarizer implementation changes: change detection stays intact and
|
|
76
|
+
* summaries regenerate lazily on next access.
|
|
77
|
+
*/
|
|
78
|
+
clearAllSummaries() {
|
|
79
|
+
const db = getDatabase(this.projectRoot);
|
|
80
|
+
db.prepare('UPDATE files SET summary_json = NULL').run();
|
|
81
|
+
}
|
|
61
82
|
getStaleEntries(maxAge) {
|
|
62
83
|
const db = getDatabase(this.projectRoot);
|
|
63
84
|
const cutoff = Date.now() - maxAge;
|
package/dist/cache/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export interface ToolGroupConfig {
|
|
|
6
6
|
export interface RepoMemoryConfig {
|
|
7
7
|
ignore?: string[];
|
|
8
8
|
maxFiles?: number;
|
|
9
|
+
/** Summary engine for TS/JS files: 'regex' (default) or 'ast' (tree-sitter). */
|
|
10
|
+
summarizer?: 'regex' | 'ast';
|
|
9
11
|
gc?: {
|
|
10
12
|
cacheMaxAgeDays?: number;
|
|
11
13
|
taskMaxAgeDays?: number;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC7B,EAAE,CAAC,EAAE;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAQD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAqBhE;AAiFD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/config.js
CHANGED
|
@@ -2,6 +2,9 @@ import { readFileSync, existsSync } from 'fs';
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
const CONFIG_FILENAME = '.repo-memory.json';
|
|
4
4
|
const configCache = new Map();
|
|
5
|
+
function warn(message) {
|
|
6
|
+
process.stderr.write(`Warning: ${CONFIG_FILENAME}: ${message}\n`);
|
|
7
|
+
}
|
|
5
8
|
export function loadConfig(projectRoot) {
|
|
6
9
|
const cached = configCache.get(projectRoot);
|
|
7
10
|
if (cached)
|
|
@@ -11,62 +14,94 @@ export function loadConfig(projectRoot) {
|
|
|
11
14
|
if (existsSync(configPath)) {
|
|
12
15
|
try {
|
|
13
16
|
const raw = readFileSync(configPath, 'utf-8');
|
|
14
|
-
|
|
15
|
-
config = validateConfig(parsed);
|
|
17
|
+
config = validateConfig(JSON.parse(raw));
|
|
16
18
|
}
|
|
17
19
|
catch (err) {
|
|
18
|
-
|
|
20
|
+
// Reached only if the file can't be read (IO/permissions) or parsed —
|
|
21
|
+
// validateConfig never throws, it skips invalid keys. Either way, fall
|
|
22
|
+
// back to built-in defaults.
|
|
23
|
+
warn(`failed to load: ${err instanceof Error ? err.message : String(err)}`);
|
|
19
24
|
}
|
|
20
25
|
}
|
|
21
26
|
configCache.set(projectRoot, config);
|
|
22
27
|
return config;
|
|
23
28
|
}
|
|
29
|
+
// Validate per key: an invalid key is skipped with a warning and the valid keys
|
|
30
|
+
// are still applied, rather than discarding the whole config on one bad value.
|
|
31
|
+
// (A non-object root, or a non-object gc/tools, drops just that scope.)
|
|
24
32
|
function validateConfig(raw) {
|
|
33
|
+
const config = {};
|
|
25
34
|
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
26
|
-
|
|
35
|
+
warn('must be a JSON object; using defaults');
|
|
36
|
+
return config;
|
|
27
37
|
}
|
|
28
38
|
const obj = raw;
|
|
29
|
-
const config = {};
|
|
30
39
|
if ('ignore' in obj) {
|
|
31
|
-
if (
|
|
32
|
-
|
|
40
|
+
if (Array.isArray(obj.ignore) && obj.ignore.every((v) => typeof v === 'string')) {
|
|
41
|
+
config.ignore = obj.ignore;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
warn('"ignore" must be an array of strings; ignoring it');
|
|
33
45
|
}
|
|
34
|
-
config.ignore = obj.ignore;
|
|
35
46
|
}
|
|
36
47
|
if ('maxFiles' in obj) {
|
|
37
|
-
if (typeof obj.maxFiles
|
|
38
|
-
|
|
48
|
+
if (typeof obj.maxFiles === 'number' && obj.maxFiles >= 1) {
|
|
49
|
+
config.maxFiles = obj.maxFiles;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
warn('"maxFiles" must be a positive number; ignoring it');
|
|
39
53
|
}
|
|
40
|
-
config.maxFiles = obj.maxFiles;
|
|
41
54
|
}
|
|
42
|
-
if ('
|
|
43
|
-
if (
|
|
44
|
-
|
|
55
|
+
if ('summarizer' in obj) {
|
|
56
|
+
if (obj.summarizer === 'regex' || obj.summarizer === 'ast') {
|
|
57
|
+
config.summarizer = obj.summarizer;
|
|
45
58
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
59
|
+
else {
|
|
60
|
+
warn('"summarizer" must be "regex" or "ast"; ignoring it');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if ('gc' in obj) {
|
|
64
|
+
if (typeof obj.gc === 'object' && obj.gc !== null && !Array.isArray(obj.gc)) {
|
|
65
|
+
const gc = obj.gc;
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const key of ['cacheMaxAgeDays', 'taskMaxAgeDays', 'telemetryMaxAgeDays']) {
|
|
68
|
+
if (key in gc) {
|
|
69
|
+
const value = gc[key];
|
|
70
|
+
if (typeof value === 'number' && value >= 1) {
|
|
71
|
+
out[key] = value;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
warn(`"gc.${key}" must be a positive number; ignoring it`);
|
|
75
|
+
}
|
|
52
76
|
}
|
|
53
|
-
config.gc[key] = gc[key];
|
|
54
77
|
}
|
|
78
|
+
if (Object.keys(out).length > 0)
|
|
79
|
+
config.gc = out;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
warn('"gc" must be an object; ignoring it');
|
|
55
83
|
}
|
|
56
84
|
}
|
|
57
85
|
if ('tools' in obj) {
|
|
58
|
-
if (typeof obj.tools
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
86
|
+
if (typeof obj.tools === 'object' && obj.tools !== null && !Array.isArray(obj.tools)) {
|
|
87
|
+
const tools = obj.tools;
|
|
88
|
+
const out = {};
|
|
89
|
+
for (const key of ['summaries', 'tasks', 'telemetry']) {
|
|
90
|
+
if (key in tools) {
|
|
91
|
+
const value = tools[key];
|
|
92
|
+
if (typeof value === 'boolean') {
|
|
93
|
+
out[key] = value;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
warn(`"tools.${key}" must be a boolean; ignoring it`);
|
|
97
|
+
}
|
|
67
98
|
}
|
|
68
|
-
config.tools[key] = tools[key];
|
|
69
99
|
}
|
|
100
|
+
if (Object.keys(out).length > 0)
|
|
101
|
+
config.tools = out;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
warn('"tools" must be an object; ignoring it');
|
|
70
105
|
}
|
|
71
106
|
}
|
|
72
107
|
return config;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,eAAe,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FileSummary } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Summarize a TS/JS file from its syntax tree. Falls back to the regex
|
|
4
|
+
* summarizer for unsupported extensions, empty files, parse errors, or when
|
|
5
|
+
* the WASM runtime cannot be loaded.
|
|
6
|
+
*/
|
|
7
|
+
export declare function summarizeFileAst(filePath: string, contents: string): Promise<FileSummary>;
|
|
8
|
+
/** True when the AST summarizer handles this file natively (vs regex fallback). */
|
|
9
|
+
export declare function isAstSupported(filePath: string): boolean;
|
|
10
|
+
//# sourceMappingURL=ast-summarizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-summarizer.d.ts","sourceRoot":"","sources":["../../src/indexer/ast-summarizer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+Y/C;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC/F;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD"}
|