@jafreck/lore 0.3.7 → 0.3.8
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 +23 -122
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -29
- package/dist/cli.js.map +1 -1
- package/dist/db/read-only.d.ts +22 -43
- package/dist/db/read-only.d.ts.map +1 -1
- package/dist/db/read-only.js +80 -156
- package/dist/db/read-only.js.map +1 -1
- package/dist/db/schema.d.ts +9 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +164 -85
- package/dist/db/schema.js.map +1 -1
- package/dist/discovery/poller.d.ts +6 -16
- package/dist/discovery/poller.d.ts.map +1 -1
- package/dist/discovery/poller.js +21 -52
- package/dist/discovery/poller.js.map +1 -1
- package/dist/discovery/scip-flush.d.ts +44 -0
- package/dist/discovery/scip-flush.d.ts.map +1 -0
- package/dist/discovery/scip-flush.js +67 -0
- package/dist/discovery/scip-flush.js.map +1 -0
- package/dist/discovery/watcher.d.ts +6 -16
- package/dist/discovery/watcher.d.ts.map +1 -1
- package/dist/discovery/watcher.js +22 -54
- package/dist/discovery/watcher.js.map +1 -1
- package/dist/docs/docs.d.ts +0 -2
- package/dist/docs/docs.d.ts.map +1 -1
- package/dist/docs/docs.js +0 -27
- package/dist/docs/docs.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer/index.d.ts +19 -10
- package/dist/indexer/index.d.ts.map +1 -1
- package/dist/indexer/index.js +99 -24
- package/dist/indexer/index.js.map +1 -1
- package/dist/indexer/pipeline.d.ts +25 -14
- package/dist/indexer/pipeline.d.ts.map +1 -1
- package/dist/indexer/pipeline.js +8 -7
- package/dist/indexer/pipeline.js.map +1 -1
- package/dist/indexer/stages/docs-index.d.ts +1 -3
- package/dist/indexer/stages/docs-index.d.ts.map +1 -1
- package/dist/indexer/stages/docs-index.js +1 -25
- package/dist/indexer/stages/docs-index.js.map +1 -1
- package/dist/indexer/stages/index.d.ts +4 -2
- package/dist/indexer/stages/index.d.ts.map +1 -1
- package/dist/indexer/stages/index.js +3 -2
- package/dist/indexer/stages/index.js.map +1 -1
- package/dist/indexer/stages/lsp-enrichment.d.ts.map +1 -1
- package/dist/indexer/stages/lsp-enrichment.js +20 -1
- package/dist/indexer/stages/lsp-enrichment.js.map +1 -1
- package/dist/indexer/stages/overlay-cleanup.d.ts +31 -0
- package/dist/indexer/stages/overlay-cleanup.d.ts.map +1 -0
- package/dist/indexer/stages/overlay-cleanup.js +64 -0
- package/dist/indexer/stages/overlay-cleanup.js.map +1 -0
- package/dist/indexer/stages/reverse-deps.d.ts +13 -0
- package/dist/indexer/stages/reverse-deps.d.ts.map +1 -0
- package/dist/indexer/stages/reverse-deps.js +81 -0
- package/dist/indexer/stages/reverse-deps.js.map +1 -0
- package/dist/indexer/stages/{scip-source.d.ts → scip-indexer.d.ts} +38 -9
- package/dist/indexer/stages/scip-indexer.d.ts.map +1 -0
- package/dist/indexer/stages/{scip-source.js → scip-indexer.js} +350 -91
- package/dist/indexer/stages/scip-indexer.js.map +1 -0
- package/dist/indexer/stages/source-index.d.ts +3 -3
- package/dist/indexer/stages/source-index.d.ts.map +1 -1
- package/dist/indexer/stages/source-index.js +116 -69
- package/dist/indexer/stages/source-index.js.map +1 -1
- package/dist/lsp/enrichment.d.ts.map +1 -1
- package/dist/lsp/enrichment.js +1 -18
- package/dist/lsp/enrichment.js.map +1 -1
- package/dist/parsing/extractors/go.d.ts.map +1 -1
- package/dist/parsing/extractors/go.js +0 -38
- package/dist/parsing/extractors/go.js.map +1 -1
- package/dist/parsing/extractors/javascript.d.ts.map +1 -1
- package/dist/parsing/extractors/javascript.js +0 -47
- package/dist/parsing/extractors/javascript.js.map +1 -1
- package/dist/parsing/extractors/python.d.ts.map +1 -1
- package/dist/parsing/extractors/python.js +0 -22
- package/dist/parsing/extractors/python.js.map +1 -1
- package/dist/parsing/extractors/types.d.ts +0 -16
- package/dist/parsing/extractors/types.d.ts.map +1 -1
- package/dist/parsing/extractors/types.js +1 -1
- package/dist/parsing/extractors/types.js.map +1 -1
- package/dist/parsing/extractors/typescript.js +2 -2
- package/dist/parsing/extractors/typescript.js.map +1 -1
- package/dist/resolution/call-graph.d.ts +3 -1
- package/dist/resolution/call-graph.d.ts.map +1 -1
- package/dist/resolution/call-graph.js +15 -13
- package/dist/resolution/call-graph.js.map +1 -1
- package/dist/resolution/resolution-method.d.ts +1 -1
- package/dist/resolution/resolution-method.d.ts.map +1 -1
- package/dist/resolution/resolution-method.js +2 -0
- package/dist/resolution/resolution-method.js.map +1 -1
- package/dist/runtime.d.ts +0 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/scip/compdb.d.ts +38 -0
- package/dist/scip/compdb.d.ts.map +1 -0
- package/dist/scip/compdb.js +138 -0
- package/dist/scip/compdb.js.map +1 -0
- package/dist/scip/enrichment.d.ts +6 -1
- package/dist/scip/enrichment.d.ts.map +1 -1
- package/dist/scip/enrichment.js +59 -2
- package/dist/scip/enrichment.js.map +1 -1
- package/dist/scip/installer.d.ts +59 -0
- package/dist/scip/installer.d.ts.map +1 -0
- package/dist/scip/installer.js +302 -0
- package/dist/scip/installer.js.map +1 -0
- package/dist/scip/registry.d.ts +1 -1
- package/dist/scip/registry.d.ts.map +1 -1
- package/dist/scip/registry.js +33 -5
- package/dist/scip/registry.js.map +1 -1
- package/dist/server/server.d.ts +2 -6
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +6 -56
- package/dist/server/server.js.map +1 -1
- package/dist/server/tool-registry.d.ts +2 -2
- package/dist/server/tool-registry.d.ts.map +1 -1
- package/dist/server/tool-registry.js +41 -20
- package/dist/server/tool-registry.js.map +1 -1
- package/dist/server/tools/cohesion.d.ts +46 -0
- package/dist/server/tools/cohesion.d.ts.map +1 -0
- package/dist/server/tools/cohesion.js +100 -0
- package/dist/server/tools/cohesion.js.map +1 -0
- package/dist/server/tools/dependents.d.ts +139 -0
- package/dist/server/tools/dependents.d.ts.map +1 -0
- package/dist/server/tools/dependents.js +354 -0
- package/dist/server/tools/dependents.js.map +1 -0
- package/dist/server/tools/diff.d.ts +73 -0
- package/dist/server/tools/diff.d.ts.map +1 -0
- package/dist/server/tools/diff.js +157 -0
- package/dist/server/tools/diff.js.map +1 -0
- package/dist/server/tools/structure.d.ts +77 -0
- package/dist/server/tools/structure.d.ts.map +1 -0
- package/dist/server/tools/structure.js +309 -0
- package/dist/server/tools/structure.js.map +1 -0
- package/dist/server/tools/test-map.d.ts +7 -0
- package/dist/server/tools/test-map.d.ts.map +1 -1
- package/dist/server/tools/test-map.js +18 -1
- package/dist/server/tools/test-map.js.map +1 -1
- package/dist/server/tools/trace.d.ts +84 -0
- package/dist/server/tools/trace.d.ts.map +1 -0
- package/dist/server/tools/trace.js +317 -0
- package/dist/server/tools/trace.js.map +1 -0
- package/dist/testing/coverage.d.ts +11 -0
- package/dist/testing/coverage.d.ts.map +1 -1
- package/dist/testing/coverage.js +34 -2
- package/dist/testing/coverage.js.map +1 -1
- package/dist/testing/test-mapper.d.ts +1 -1
- package/dist/testing/test-mapper.d.ts.map +1 -1
- package/dist/testing/test-mapper.js +1 -0
- package/dist/testing/test-mapper.js.map +1 -1
- package/package.json +3 -1
- package/dist/indexer/stages/scip-enrichment.d.ts +0 -43
- package/dist/indexer/stages/scip-enrichment.d.ts.map +0 -1
- package/dist/indexer/stages/scip-enrichment.js +0 -172
- package/dist/indexer/stages/scip-enrichment.js.map +0 -1
- package/dist/indexer/stages/scip-source.d.ts.map +0 -1
- package/dist/indexer/stages/scip-source.js.map +0 -1
- package/dist/server/tools/notes.d.ts +0 -165
- package/dist/server/tools/notes.d.ts.map +0 -1
- package/dist/server/tools/notes.js +0 -214
- package/dist/server/tools/notes.js.map +0 -1
- package/dist/server/tools/routes.d.ts +0 -38
- package/dist/server/tools/routes.d.ts.map +0 -1
- package/dist/server/tools/routes.js +0 -38
- package/dist/server/tools/routes.js.map +0 -1
|
@@ -9,13 +9,14 @@
|
|
|
9
9
|
* ## ToolModule contract
|
|
10
10
|
*
|
|
11
11
|
* Every tool file must export **at least**:
|
|
12
|
-
* - `toolDef`
|
|
13
|
-
* - `handler(db, args, ...)`
|
|
12
|
+
* - `toolDef` containing `name`, `description`, and `inputSchema`
|
|
13
|
+
* - `handler(db, args, ...)`
|
|
14
14
|
*
|
|
15
15
|
* The registry iterates over a list of declared `ToolModule` descriptors and
|
|
16
16
|
* calls `server.tool()` for each, using a standard `loggedHandler` wrapper.
|
|
17
17
|
*/
|
|
18
18
|
import { z } from 'zod';
|
|
19
|
+
import { getFreshness } from '../db/read-only.js';
|
|
19
20
|
// ─── JSON-Schema → Zod conversion ────────────────────────────────────────────
|
|
20
21
|
/**
|
|
21
22
|
* Converts a single JSON-schema property definition into the corresponding Zod
|
|
@@ -86,12 +87,21 @@ export function inputSchemaToZodShape(schema) {
|
|
|
86
87
|
* Wrap an MCP tool handler with structured logging.
|
|
87
88
|
* Captures request args, response, timing, and success/error status.
|
|
88
89
|
*/
|
|
89
|
-
function loggedHandler(toolName, fn, log) {
|
|
90
|
+
function loggedHandler(toolName, fn, log, db) {
|
|
90
91
|
return async (args) => {
|
|
91
92
|
const start = performance.now();
|
|
92
93
|
try {
|
|
93
|
-
|
|
94
|
+
let result = await fn(args);
|
|
94
95
|
const durationMs = Math.round((performance.now() - start) * 100) / 100;
|
|
96
|
+
// Inject freshness metadata into the response if result is an object.
|
|
97
|
+
if (db && result && typeof result === 'object' && !Array.isArray(result)) {
|
|
98
|
+
try {
|
|
99
|
+
result.freshness = getFreshness(db);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Freshness unavailable — skip silently.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
95
105
|
log.toolCall({
|
|
96
106
|
tool: toolName,
|
|
97
107
|
requestBody: args,
|
|
@@ -126,7 +136,7 @@ export function registerTools(server, modules, deps) {
|
|
|
126
136
|
for (const mod of modules) {
|
|
127
137
|
const zodShape = inputSchemaToZodShape(mod.def.inputSchema);
|
|
128
138
|
const handler = mod.handlerFactory(deps);
|
|
129
|
-
server.tool(mod.def.name, mod.def.description, zodShape, loggedHandler(mod.def.name, handler, deps.logger));
|
|
139
|
+
server.tool(mod.def.name, mod.def.description, zodShape, loggedHandler(mod.def.name, handler, deps.logger, deps.db));
|
|
130
140
|
}
|
|
131
141
|
}
|
|
132
142
|
// ─── Tool module declarations (importers) ─────────────────────────────────────
|
|
@@ -140,18 +150,21 @@ export function registerTools(server, modules, deps) {
|
|
|
140
150
|
*/
|
|
141
151
|
export async function buildToolModules() {
|
|
142
152
|
// Dynamic imports so the registry can be tree-shaken independently.
|
|
143
|
-
const [lookup, graph, search, docsMod,
|
|
153
|
+
const [lookup, graph, search, docsMod, testMap, snippet, blame, metrics, history, trace, diff, cohesion, structure, dependents,] = await Promise.all([
|
|
144
154
|
import('./tools/lookup.js'),
|
|
145
155
|
import('./tools/graph.js'),
|
|
146
156
|
import('./tools/search.js'),
|
|
147
157
|
import('./tools/docs.js'),
|
|
148
|
-
import('./tools/routes.js'),
|
|
149
|
-
import('./tools/notes.js'),
|
|
150
158
|
import('./tools/test-map.js'),
|
|
151
159
|
import('./tools/snippet.js'),
|
|
152
160
|
import('./tools/blame.js'),
|
|
153
161
|
import('./tools/metrics.js'),
|
|
154
162
|
import('./tools/history.js'),
|
|
163
|
+
import('./tools/trace.js'),
|
|
164
|
+
import('./tools/diff.js'),
|
|
165
|
+
import('./tools/cohesion.js'),
|
|
166
|
+
import('./tools/structure.js'),
|
|
167
|
+
import('./tools/dependents.js'),
|
|
155
168
|
]);
|
|
156
169
|
return [
|
|
157
170
|
{
|
|
@@ -170,18 +183,6 @@ export async function buildToolModules() {
|
|
|
170
183
|
def: docsMod.toolDef,
|
|
171
184
|
handlerFactory: (deps) => (args) => docsMod.handler(deps.db, args, deps.embedder),
|
|
172
185
|
},
|
|
173
|
-
{
|
|
174
|
-
def: routes.toolDef,
|
|
175
|
-
handlerFactory: (deps) => (args) => routes.handler(deps.db, args),
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
def: notes.writeToolDef,
|
|
179
|
-
handlerFactory: (deps) => (args) => notes.writeHandler(deps.dbPath, args),
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
def: notes.readToolDef,
|
|
183
|
-
handlerFactory: (deps) => (args) => notes.readHandler(deps.db, args),
|
|
184
|
-
},
|
|
185
186
|
{
|
|
186
187
|
def: testMap.toolDef,
|
|
187
188
|
handlerFactory: (deps) => (args) => testMap.handler(deps.db, args),
|
|
@@ -202,6 +203,26 @@ export async function buildToolModules() {
|
|
|
202
203
|
def: history.toolDef,
|
|
203
204
|
handlerFactory: (deps) => (args) => history.handler(deps.db, args, deps.embedder),
|
|
204
205
|
},
|
|
206
|
+
{
|
|
207
|
+
def: trace.toolDef,
|
|
208
|
+
handlerFactory: (deps) => (args) => trace.handler(deps.db, args),
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
def: diff.toolDef,
|
|
212
|
+
handlerFactory: (deps) => (args) => diff.handler(deps.db, args),
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
def: cohesion.toolDef,
|
|
216
|
+
handlerFactory: (deps) => (args) => cohesion.handler(deps.db, args ?? {}),
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
def: structure.toolDef,
|
|
220
|
+
handlerFactory: (deps) => (args) => structure.handler(deps.db, args),
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
def: dependents.toolDef,
|
|
224
|
+
handlerFactory: (deps) => (args) => dependents.handler(deps.db, args),
|
|
225
|
+
},
|
|
205
226
|
];
|
|
206
227
|
}
|
|
207
228
|
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/server/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/server/tool-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tools/cohesion
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: rank directories by module cohesion — the ratio of internal
|
|
5
|
+
* coupling to external coupling. Uses Robert Martin's instability metric
|
|
6
|
+
* alongside a simple cohesion ratio.
|
|
7
|
+
*/
|
|
8
|
+
import type { Database } from '../../db/read-only.js';
|
|
9
|
+
export declare const toolDef: {
|
|
10
|
+
readonly name: "lore_cohesion";
|
|
11
|
+
readonly description: string;
|
|
12
|
+
readonly inputSchema: {
|
|
13
|
+
readonly type: "object";
|
|
14
|
+
readonly properties: {
|
|
15
|
+
readonly depth: {
|
|
16
|
+
readonly type: "integer";
|
|
17
|
+
readonly minimum: 1;
|
|
18
|
+
readonly description: "Number of path segments to group directories by (default 2).";
|
|
19
|
+
};
|
|
20
|
+
readonly limit: {
|
|
21
|
+
readonly type: "number";
|
|
22
|
+
readonly description: "Max directories to return (default 20, max 200).";
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
readonly required: readonly [];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export interface CohesionArgs {
|
|
29
|
+
depth?: number;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface DirectoryCohesion {
|
|
33
|
+
directory: string;
|
|
34
|
+
file_count: number;
|
|
35
|
+
internal_edges: number;
|
|
36
|
+
external_inbound: number;
|
|
37
|
+
external_outbound: number;
|
|
38
|
+
cohesion: number;
|
|
39
|
+
instability: number;
|
|
40
|
+
}
|
|
41
|
+
export interface CohesionResult {
|
|
42
|
+
directories: DirectoryCohesion[];
|
|
43
|
+
}
|
|
44
|
+
/** Rank directories by module cohesion. */
|
|
45
|
+
export declare function handler(db: Database.Database, args: CohesionArgs): CohesionResult;
|
|
46
|
+
//# sourceMappingURL=cohesion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohesion.d.ts","sourceRoot":"","sources":["../../../src/server/tools/cohesion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAqBV,CAAC;AAIX,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAWD,2CAA2C;AAC3C,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,cAAc,CA4EjF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tools/cohesion
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: rank directories by module cohesion — the ratio of internal
|
|
5
|
+
* coupling to external coupling. Uses Robert Martin's instability metric
|
|
6
|
+
* alongside a simple cohesion ratio.
|
|
7
|
+
*/
|
|
8
|
+
// ─── Tool definition ──────────────────────────────────────────────────────────
|
|
9
|
+
export const toolDef = {
|
|
10
|
+
name: 'lore_cohesion',
|
|
11
|
+
description: 'Rank directories by module cohesion — the ratio of internal symbol references to external ones. ' +
|
|
12
|
+
'Use depth to control directory grouping granularity and limit to cap results. ' +
|
|
13
|
+
'Directories are ordered by cohesion ascending (lowest cohesion first).',
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
depth: {
|
|
18
|
+
type: 'integer',
|
|
19
|
+
minimum: 1,
|
|
20
|
+
description: 'Number of path segments to group directories by (default 2).',
|
|
21
|
+
},
|
|
22
|
+
limit: {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'Max directories to return (default 20, max 200).',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: [],
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Truncate a file path to the first `depth` segments.
|
|
32
|
+
* E.g. depth=2 turns "src/server/tools/graph.ts" into "src/server".
|
|
33
|
+
*/
|
|
34
|
+
function truncateToDepth(filePath, depth) {
|
|
35
|
+
const parts = filePath.split('/');
|
|
36
|
+
return parts.slice(0, depth).join('/');
|
|
37
|
+
}
|
|
38
|
+
/** Rank directories by module cohesion. */
|
|
39
|
+
export function handler(db, args) {
|
|
40
|
+
const depth = Math.max(1, args.depth ?? 2);
|
|
41
|
+
const limit = Math.min(Math.max(1, args.limit ?? 20), 200);
|
|
42
|
+
// Fetch all resolved edges with their caller/callee file paths.
|
|
43
|
+
const rows = db
|
|
44
|
+
.prepare(`SELECT f_caller.path AS caller_path,
|
|
45
|
+
f_callee.path AS callee_path
|
|
46
|
+
FROM symbol_refs sr
|
|
47
|
+
JOIN symbols s_caller ON s_caller.id = sr.caller_id
|
|
48
|
+
JOIN files f_caller ON f_caller.id = s_caller.file_id
|
|
49
|
+
JOIN symbols s_callee ON s_callee.id = sr.callee_id
|
|
50
|
+
JOIN files f_callee ON f_callee.id = s_callee.file_id
|
|
51
|
+
WHERE sr.callee_id IS NOT NULL`)
|
|
52
|
+
.all();
|
|
53
|
+
// Accumulate per-directory counters.
|
|
54
|
+
const dirMap = new Map();
|
|
55
|
+
function getOrCreate(dir) {
|
|
56
|
+
let entry = dirMap.get(dir);
|
|
57
|
+
if (!entry) {
|
|
58
|
+
entry = { internal: 0, inbound: 0, outbound: 0, files: new Set() };
|
|
59
|
+
dirMap.set(dir, entry);
|
|
60
|
+
}
|
|
61
|
+
return entry;
|
|
62
|
+
}
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
const callerDir = truncateToDepth(row.caller_path, depth);
|
|
65
|
+
const calleeDir = truncateToDepth(row.callee_path, depth);
|
|
66
|
+
const callerEntry = getOrCreate(callerDir);
|
|
67
|
+
callerEntry.files.add(row.caller_path);
|
|
68
|
+
const calleeEntry = getOrCreate(calleeDir);
|
|
69
|
+
calleeEntry.files.add(row.callee_path);
|
|
70
|
+
if (callerDir === calleeDir) {
|
|
71
|
+
callerEntry.internal++;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
callerEntry.outbound++;
|
|
75
|
+
calleeEntry.inbound++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Build result entries, excluding directories with zero total edges.
|
|
79
|
+
const directories = [];
|
|
80
|
+
for (const [dir, data] of dirMap) {
|
|
81
|
+
const totalEdges = data.internal + data.inbound + data.outbound;
|
|
82
|
+
if (totalEdges === 0)
|
|
83
|
+
continue;
|
|
84
|
+
const cohesionDenom = data.internal + data.outbound;
|
|
85
|
+
const instabilityDenom = data.inbound + data.outbound;
|
|
86
|
+
directories.push({
|
|
87
|
+
directory: dir,
|
|
88
|
+
file_count: data.files.size,
|
|
89
|
+
internal_edges: data.internal,
|
|
90
|
+
external_inbound: data.inbound,
|
|
91
|
+
external_outbound: data.outbound,
|
|
92
|
+
cohesion: cohesionDenom > 0 ? data.internal / cohesionDenom : 0,
|
|
93
|
+
instability: instabilityDenom > 0 ? data.outbound / instabilityDenom : 0,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Sort by cohesion ascending (worst first).
|
|
97
|
+
directories.sort((a, b) => a.cohesion - b.cohesion);
|
|
98
|
+
return { directories: directories.slice(0, limit) };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=cohesion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cohesion.js","sourceRoot":"","sources":["../../../src/server/tools/cohesion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module lore-server/tools/dependents
|
|
3
|
+
*
|
|
4
|
+
* MCP tool: unified reverse-dependency / blast-radius queries.
|
|
5
|
+
*
|
|
6
|
+
* Given a symbol name or file path, returns all dependents across edge types
|
|
7
|
+
* (callers, importers, subclasses, type references) in a single call.
|
|
8
|
+
* This is a higher-level abstraction over `lore_graph` that resolves names
|
|
9
|
+
* internally and aggregates across edge kinds.
|
|
10
|
+
*/
|
|
11
|
+
import type { Database } from '../../db/read-only.js';
|
|
12
|
+
export declare const toolDef: {
|
|
13
|
+
readonly name: "lore_dependents";
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly inputSchema: {
|
|
16
|
+
readonly type: "object";
|
|
17
|
+
readonly properties: {
|
|
18
|
+
readonly query: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Symbol name, class name, or file path to find dependents of.";
|
|
21
|
+
};
|
|
22
|
+
readonly kind: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly enum: readonly ["symbol", "file"];
|
|
25
|
+
readonly description: "\"symbol\" resolves query as a symbol name; \"file\" resolves query as a file path.";
|
|
26
|
+
};
|
|
27
|
+
readonly depth: {
|
|
28
|
+
readonly type: "number";
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly minimum: 1;
|
|
31
|
+
readonly maximum: 5;
|
|
32
|
+
};
|
|
33
|
+
readonly branch: {
|
|
34
|
+
readonly type: "string";
|
|
35
|
+
readonly description: "Optional branch name to filter results.";
|
|
36
|
+
};
|
|
37
|
+
readonly compact: {
|
|
38
|
+
readonly type: "boolean";
|
|
39
|
+
readonly description: "If true, omit provenance fields (line, character, resolution details) to reduce token count. Default false.";
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
readonly required: readonly ["query", "kind"];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export interface DependentsArgs {
|
|
46
|
+
query: string;
|
|
47
|
+
kind: 'symbol' | 'file';
|
|
48
|
+
depth?: number;
|
|
49
|
+
branch?: string;
|
|
50
|
+
compact?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface DependentTarget {
|
|
53
|
+
id: number;
|
|
54
|
+
name: string;
|
|
55
|
+
kind: string;
|
|
56
|
+
file?: string;
|
|
57
|
+
}
|
|
58
|
+
interface CallerEntry {
|
|
59
|
+
caller_id: number;
|
|
60
|
+
caller_name: string;
|
|
61
|
+
caller_kind: string;
|
|
62
|
+
caller_file: string;
|
|
63
|
+
line?: number;
|
|
64
|
+
character?: number | null;
|
|
65
|
+
resolution_method?: string;
|
|
66
|
+
}
|
|
67
|
+
interface CompactCallerEntry {
|
|
68
|
+
caller_id: number;
|
|
69
|
+
caller_name: string;
|
|
70
|
+
caller_kind: string;
|
|
71
|
+
caller_file: string;
|
|
72
|
+
}
|
|
73
|
+
interface ImporterEntry {
|
|
74
|
+
file_id: number;
|
|
75
|
+
file_path: string;
|
|
76
|
+
raw_import: string;
|
|
77
|
+
}
|
|
78
|
+
interface CompactImporterEntry {
|
|
79
|
+
file_id: number;
|
|
80
|
+
file_path: string;
|
|
81
|
+
}
|
|
82
|
+
interface SubclassEntry {
|
|
83
|
+
symbol_id: number;
|
|
84
|
+
symbol_name: string;
|
|
85
|
+
symbol_kind: string;
|
|
86
|
+
file: string;
|
|
87
|
+
relationship_type: string;
|
|
88
|
+
line?: number;
|
|
89
|
+
character?: number | null;
|
|
90
|
+
resolution_method?: string;
|
|
91
|
+
}
|
|
92
|
+
interface CompactSubclassEntry {
|
|
93
|
+
symbol_id: number;
|
|
94
|
+
symbol_name: string;
|
|
95
|
+
symbol_kind: string;
|
|
96
|
+
file: string;
|
|
97
|
+
relationship_type: string;
|
|
98
|
+
}
|
|
99
|
+
interface TypeRefEntry {
|
|
100
|
+
symbol_id: number;
|
|
101
|
+
symbol_name: string;
|
|
102
|
+
symbol_kind: string;
|
|
103
|
+
file: string;
|
|
104
|
+
ref_kind: string;
|
|
105
|
+
line?: number;
|
|
106
|
+
character?: number | null;
|
|
107
|
+
resolution_method?: string;
|
|
108
|
+
}
|
|
109
|
+
interface CompactTypeRefEntry {
|
|
110
|
+
symbol_id: number;
|
|
111
|
+
symbol_name: string;
|
|
112
|
+
symbol_kind: string;
|
|
113
|
+
file: string;
|
|
114
|
+
ref_kind: string;
|
|
115
|
+
}
|
|
116
|
+
export interface DependentsResult {
|
|
117
|
+
target: DependentTarget;
|
|
118
|
+
dependents: {
|
|
119
|
+
callers: CallerEntry[] | CompactCallerEntry[];
|
|
120
|
+
importers: ImporterEntry[] | CompactImporterEntry[];
|
|
121
|
+
subclasses: SubclassEntry[] | CompactSubclassEntry[];
|
|
122
|
+
type_references: TypeRefEntry[] | CompactTypeRefEntry[];
|
|
123
|
+
};
|
|
124
|
+
depth_used: number;
|
|
125
|
+
total_count: number;
|
|
126
|
+
}
|
|
127
|
+
export interface DependentsErrorResult {
|
|
128
|
+
error: string;
|
|
129
|
+
candidates?: Array<{
|
|
130
|
+
id: number;
|
|
131
|
+
name: string;
|
|
132
|
+
kind: string;
|
|
133
|
+
file: string;
|
|
134
|
+
}>;
|
|
135
|
+
}
|
|
136
|
+
/** Unified reverse-dependency / blast-radius query. */
|
|
137
|
+
export declare function handler(db: Database.Database, args: DependentsArgs): DependentsResult | DependentsErrorResult;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=dependents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependents.d.ts","sourceRoot":"","sources":["../../../src/server/tools/dependents.ts"],"names":[],"mappings":"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"}
|