@optave/codegraph 3.1.3 → 3.1.4
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 +17 -19
- package/package.json +10 -7
- package/src/analysis/context.js +408 -0
- package/src/analysis/dependencies.js +341 -0
- package/src/analysis/exports.js +130 -0
- package/src/analysis/impact.js +463 -0
- package/src/analysis/module-map.js +322 -0
- package/src/analysis/roles.js +45 -0
- package/src/analysis/symbol-lookup.js +232 -0
- package/src/ast-analysis/shared.js +5 -4
- package/src/batch.js +2 -1
- package/src/builder/context.js +85 -0
- package/src/builder/helpers.js +218 -0
- package/src/builder/incremental.js +178 -0
- package/src/builder/pipeline.js +130 -0
- package/src/builder/stages/build-edges.js +297 -0
- package/src/builder/stages/build-structure.js +113 -0
- package/src/builder/stages/collect-files.js +44 -0
- package/src/builder/stages/detect-changes.js +413 -0
- package/src/builder/stages/finalize.js +139 -0
- package/src/builder/stages/insert-nodes.js +195 -0
- package/src/builder/stages/parse-files.js +28 -0
- package/src/builder/stages/resolve-imports.js +143 -0
- package/src/builder/stages/run-analyses.js +44 -0
- package/src/builder.js +10 -1485
- package/src/cfg.js +1 -2
- package/src/cli/commands/ast.js +26 -0
- package/src/cli/commands/audit.js +46 -0
- package/src/cli/commands/batch.js +68 -0
- package/src/cli/commands/branch-compare.js +21 -0
- package/src/cli/commands/build.js +26 -0
- package/src/cli/commands/cfg.js +30 -0
- package/src/cli/commands/check.js +79 -0
- package/src/cli/commands/children.js +31 -0
- package/src/cli/commands/co-change.js +65 -0
- package/src/cli/commands/communities.js +23 -0
- package/src/cli/commands/complexity.js +45 -0
- package/src/cli/commands/context.js +34 -0
- package/src/cli/commands/cycles.js +28 -0
- package/src/cli/commands/dataflow.js +32 -0
- package/src/cli/commands/deps.js +16 -0
- package/src/cli/commands/diff-impact.js +30 -0
- package/src/cli/commands/embed.js +30 -0
- package/src/cli/commands/export.js +75 -0
- package/src/cli/commands/exports.js +18 -0
- package/src/cli/commands/flow.js +36 -0
- package/src/cli/commands/fn-impact.js +30 -0
- package/src/cli/commands/impact.js +16 -0
- package/src/cli/commands/info.js +76 -0
- package/src/cli/commands/map.js +19 -0
- package/src/cli/commands/mcp.js +18 -0
- package/src/cli/commands/models.js +19 -0
- package/src/cli/commands/owners.js +25 -0
- package/src/cli/commands/path.js +36 -0
- package/src/cli/commands/plot.js +80 -0
- package/src/cli/commands/query.js +49 -0
- package/src/cli/commands/registry.js +100 -0
- package/src/cli/commands/roles.js +34 -0
- package/src/cli/commands/search.js +42 -0
- package/src/cli/commands/sequence.js +32 -0
- package/src/cli/commands/snapshot.js +61 -0
- package/src/cli/commands/stats.js +15 -0
- package/src/cli/commands/structure.js +32 -0
- package/src/cli/commands/triage.js +78 -0
- package/src/cli/commands/watch.js +12 -0
- package/src/cli/commands/where.js +24 -0
- package/src/cli/index.js +118 -0
- package/src/cli/shared/options.js +39 -0
- package/src/cli/shared/output.js +1 -0
- package/src/cli.js +11 -1522
- package/src/commands/check.js +5 -5
- package/src/commands/manifesto.js +3 -3
- package/src/commands/structure.js +1 -1
- package/src/communities.js +15 -87
- package/src/cycles.js +30 -85
- package/src/dataflow.js +1 -2
- package/src/db/connection.js +4 -4
- package/src/db/migrations.js +41 -0
- package/src/db/query-builder.js +6 -5
- package/src/db/repository/base.js +201 -0
- package/src/db/repository/graph-read.js +5 -2
- package/src/db/repository/in-memory-repository.js +584 -0
- package/src/db/repository/index.js +5 -1
- package/src/db/repository/nodes.js +63 -4
- package/src/db/repository/sqlite-repository.js +219 -0
- package/src/db.js +5 -0
- package/src/embeddings/generator.js +163 -0
- package/src/embeddings/index.js +13 -0
- package/src/embeddings/models.js +218 -0
- package/src/embeddings/search/cli-formatter.js +151 -0
- package/src/embeddings/search/filters.js +46 -0
- package/src/embeddings/search/hybrid.js +121 -0
- package/src/embeddings/search/keyword.js +68 -0
- package/src/embeddings/search/prepare.js +66 -0
- package/src/embeddings/search/semantic.js +145 -0
- package/src/embeddings/stores/fts5.js +27 -0
- package/src/embeddings/stores/sqlite-blob.js +24 -0
- package/src/embeddings/strategies/source.js +14 -0
- package/src/embeddings/strategies/structured.js +43 -0
- package/src/embeddings/strategies/text-utils.js +43 -0
- package/src/errors.js +78 -0
- package/src/export.js +217 -520
- package/src/extractors/csharp.js +10 -2
- package/src/extractors/go.js +3 -1
- package/src/extractors/helpers.js +71 -0
- package/src/extractors/java.js +9 -2
- package/src/extractors/javascript.js +38 -1
- package/src/extractors/php.js +3 -1
- package/src/extractors/python.js +14 -3
- package/src/extractors/rust.js +3 -1
- package/src/graph/algorithms/bfs.js +49 -0
- package/src/graph/algorithms/centrality.js +16 -0
- package/src/graph/algorithms/index.js +5 -0
- package/src/graph/algorithms/louvain.js +26 -0
- package/src/graph/algorithms/shortest-path.js +41 -0
- package/src/graph/algorithms/tarjan.js +49 -0
- package/src/graph/builders/dependency.js +91 -0
- package/src/graph/builders/index.js +3 -0
- package/src/graph/builders/structure.js +40 -0
- package/src/graph/builders/temporal.js +33 -0
- package/src/graph/classifiers/index.js +2 -0
- package/src/graph/classifiers/risk.js +85 -0
- package/src/graph/classifiers/roles.js +64 -0
- package/src/graph/index.js +13 -0
- package/src/graph/model.js +230 -0
- package/src/index.js +33 -210
- package/src/infrastructure/result-formatter.js +2 -21
- package/src/mcp/index.js +2 -0
- package/src/mcp/middleware.js +26 -0
- package/src/mcp/server.js +128 -0
- package/src/mcp/tool-registry.js +801 -0
- package/src/mcp/tools/ast-query.js +14 -0
- package/src/mcp/tools/audit.js +21 -0
- package/src/mcp/tools/batch-query.js +11 -0
- package/src/mcp/tools/branch-compare.js +10 -0
- package/src/mcp/tools/cfg.js +21 -0
- package/src/mcp/tools/check.js +43 -0
- package/src/mcp/tools/co-changes.js +20 -0
- package/src/mcp/tools/code-owners.js +12 -0
- package/src/mcp/tools/communities.js +15 -0
- package/src/mcp/tools/complexity.js +18 -0
- package/src/mcp/tools/context.js +17 -0
- package/src/mcp/tools/dataflow.js +26 -0
- package/src/mcp/tools/diff-impact.js +24 -0
- package/src/mcp/tools/execution-flow.js +26 -0
- package/src/mcp/tools/export-graph.js +57 -0
- package/src/mcp/tools/file-deps.js +12 -0
- package/src/mcp/tools/file-exports.js +13 -0
- package/src/mcp/tools/find-cycles.js +15 -0
- package/src/mcp/tools/fn-impact.js +15 -0
- package/src/mcp/tools/impact-analysis.js +12 -0
- package/src/mcp/tools/index.js +71 -0
- package/src/mcp/tools/list-functions.js +14 -0
- package/src/mcp/tools/list-repos.js +11 -0
- package/src/mcp/tools/module-map.js +6 -0
- package/src/mcp/tools/node-roles.js +14 -0
- package/src/mcp/tools/path.js +12 -0
- package/src/mcp/tools/query.js +30 -0
- package/src/mcp/tools/semantic-search.js +65 -0
- package/src/mcp/tools/sequence.js +17 -0
- package/src/mcp/tools/structure.js +15 -0
- package/src/mcp/tools/symbol-children.js +14 -0
- package/src/mcp/tools/triage.js +35 -0
- package/src/mcp/tools/where.js +13 -0
- package/src/mcp.js +2 -1470
- package/src/native.js +3 -1
- package/src/presentation/colors.js +44 -0
- package/src/presentation/export.js +444 -0
- package/src/presentation/result-formatter.js +21 -0
- package/src/presentation/sequence-renderer.js +43 -0
- package/src/presentation/table.js +47 -0
- package/src/presentation/viewer.js +634 -0
- package/src/queries.js +35 -2276
- package/src/resolve.js +1 -1
- package/src/sequence.js +2 -38
- package/src/shared/file-utils.js +153 -0
- package/src/shared/generators.js +125 -0
- package/src/shared/hierarchy.js +27 -0
- package/src/shared/normalize.js +59 -0
- package/src/snapshot.js +6 -5
- package/src/structure.js +15 -40
- package/src/triage.js +20 -72
- package/src/viewer.js +35 -656
- package/src/watcher.js +8 -148
- package/src/embedder.js +0 -1097
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { findCalleeNames, findCallerNames } from '../../db.js';
|
|
2
|
+
import { extractLeadingComment, splitIdentifier } from './text-utils.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Build graph-enriched text for a symbol using dependency context.
|
|
6
|
+
* Produces compact, semantic text (~100 tokens) instead of full source code.
|
|
7
|
+
*/
|
|
8
|
+
export function buildStructuredText(node, file, lines, db) {
|
|
9
|
+
const readable = splitIdentifier(node.name);
|
|
10
|
+
const parts = [`${node.kind} ${node.name} (${readable}) in ${file}`];
|
|
11
|
+
const startLine = Math.max(0, node.line - 1);
|
|
12
|
+
|
|
13
|
+
// Extract parameters from signature (best-effort, single-line)
|
|
14
|
+
const sigLine = lines[startLine] || '';
|
|
15
|
+
const paramMatch = sigLine.match(/\(([^)]*)\)/);
|
|
16
|
+
if (paramMatch?.[1]?.trim()) {
|
|
17
|
+
parts.push(`Parameters: ${paramMatch[1].trim()}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Graph context: callees (capped at 10)
|
|
21
|
+
const callees = findCalleeNames(db, node.id);
|
|
22
|
+
if (callees.length > 0) {
|
|
23
|
+
parts.push(`Calls: ${callees.slice(0, 10).join(', ')}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Graph context: callers (capped at 10)
|
|
27
|
+
const callers = findCallerNames(db, node.id);
|
|
28
|
+
if (callers.length > 0) {
|
|
29
|
+
parts.push(`Called by: ${callers.slice(0, 10).join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Leading comment (high semantic value) or first few lines of code
|
|
33
|
+
const comment = extractLeadingComment(lines, startLine);
|
|
34
|
+
if (comment) {
|
|
35
|
+
parts.push(comment);
|
|
36
|
+
} else {
|
|
37
|
+
const endLine = Math.min(lines.length, startLine + 4);
|
|
38
|
+
const snippet = lines.slice(startLine, endLine).join('\n').trim();
|
|
39
|
+
if (snippet) parts.push(snippet);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return parts.join('\n');
|
|
43
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split an identifier into readable words.
|
|
3
|
+
* camelCase/PascalCase -> "camel Case", snake_case -> "snake case", kebab-case -> "kebab case"
|
|
4
|
+
*/
|
|
5
|
+
export function splitIdentifier(name) {
|
|
6
|
+
return name
|
|
7
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
8
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
9
|
+
.replace(/[_-]+/g, ' ')
|
|
10
|
+
.trim();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Extract leading comment text (JSDoc, //, #, etc.) above a function line.
|
|
15
|
+
* Returns the cleaned comment text or null if none found.
|
|
16
|
+
*/
|
|
17
|
+
export function extractLeadingComment(lines, fnLineIndex) {
|
|
18
|
+
if (fnLineIndex > lines.length) return null;
|
|
19
|
+
const raw = [];
|
|
20
|
+
for (let i = fnLineIndex - 1; i >= Math.max(0, fnLineIndex - 15); i--) {
|
|
21
|
+
if (i >= lines.length) continue;
|
|
22
|
+
const trimmed = lines[i].trim();
|
|
23
|
+
if (/^(\/\/|\/\*|\*\/|\*|#|\/\/\/)/.test(trimmed)) {
|
|
24
|
+
raw.unshift(trimmed);
|
|
25
|
+
} else if (trimmed === '') {
|
|
26
|
+
if (raw.length > 0) break;
|
|
27
|
+
} else {
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (raw.length === 0) return null;
|
|
32
|
+
return raw
|
|
33
|
+
.map((line) =>
|
|
34
|
+
line
|
|
35
|
+
.replace(/^\/\*\*?\s?|\*\/$/g, '') // opening /** or /* and closing */
|
|
36
|
+
.replace(/^\*\s?/, '') // middle * lines
|
|
37
|
+
.replace(/^\/\/\/?\s?/, '') // // or ///
|
|
38
|
+
.replace(/^#\s?/, '') // # (Python/Ruby)
|
|
39
|
+
.trim(),
|
|
40
|
+
)
|
|
41
|
+
.filter((l) => l.length > 0)
|
|
42
|
+
.join(' ');
|
|
43
|
+
}
|
package/src/errors.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain error hierarchy for codegraph.
|
|
3
|
+
*
|
|
4
|
+
* Library code throws these instead of calling process.exit() or throwing
|
|
5
|
+
* bare Error instances. The CLI top-level catch formats them for humans;
|
|
6
|
+
* MCP returns structured { isError, code } responses.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export class CodegraphError extends Error {
|
|
10
|
+
/** @type {string} */
|
|
11
|
+
code;
|
|
12
|
+
|
|
13
|
+
/** @type {string|undefined} */
|
|
14
|
+
file;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} message
|
|
18
|
+
* @param {object} [opts]
|
|
19
|
+
* @param {string} [opts.code]
|
|
20
|
+
* @param {string} [opts.file] - Related file path, if applicable
|
|
21
|
+
* @param {Error} [opts.cause] - Original error that triggered this one
|
|
22
|
+
*/
|
|
23
|
+
constructor(message, { code = 'CODEGRAPH_ERROR', file, cause } = {}) {
|
|
24
|
+
super(message, { cause });
|
|
25
|
+
this.name = 'CodegraphError';
|
|
26
|
+
this.code = code;
|
|
27
|
+
this.file = file;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class ParseError extends CodegraphError {
|
|
32
|
+
constructor(message, opts = {}) {
|
|
33
|
+
super(message, { code: 'PARSE_FAILED', ...opts });
|
|
34
|
+
this.name = 'ParseError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class DbError extends CodegraphError {
|
|
39
|
+
constructor(message, opts = {}) {
|
|
40
|
+
super(message, { code: 'DB_ERROR', ...opts });
|
|
41
|
+
this.name = 'DbError';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class ConfigError extends CodegraphError {
|
|
46
|
+
constructor(message, opts = {}) {
|
|
47
|
+
super(message, { code: 'CONFIG_INVALID', ...opts });
|
|
48
|
+
this.name = 'ConfigError';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class ResolutionError extends CodegraphError {
|
|
53
|
+
constructor(message, opts = {}) {
|
|
54
|
+
super(message, { code: 'RESOLUTION_FAILED', ...opts });
|
|
55
|
+
this.name = 'ResolutionError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class EngineError extends CodegraphError {
|
|
60
|
+
constructor(message, opts = {}) {
|
|
61
|
+
super(message, { code: 'ENGINE_UNAVAILABLE', ...opts });
|
|
62
|
+
this.name = 'EngineError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class AnalysisError extends CodegraphError {
|
|
67
|
+
constructor(message, opts = {}) {
|
|
68
|
+
super(message, { code: 'ANALYSIS_FAILED', ...opts });
|
|
69
|
+
this.name = 'AnalysisError';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class BoundaryError extends CodegraphError {
|
|
74
|
+
constructor(message, opts = {}) {
|
|
75
|
+
super(message, { code: 'BOUNDARY_VIOLATION', ...opts });
|
|
76
|
+
this.name = 'BoundaryError';
|
|
77
|
+
}
|
|
78
|
+
}
|