vemora 0.1.0-alpha.15
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 +851 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +682 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +137 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +398 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +16 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +84 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +155 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +63 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +794 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dead-code.d.ts +15 -0
- package/dist/commands/dead-code.d.ts.map +1 -0
- package/dist/commands/dead-code.js +206 -0
- package/dist/commands/dead-code.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +8 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +310 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +384 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +14 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +115 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +24 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +867 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +392 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +267 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +243 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +170 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +159 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +11 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +49 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +412 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/claude-code.d.ts +37 -0
- package/dist/llm/claude-code.d.ts.map +1 -0
- package/dist/llm/claude-code.js +97 -0
- package/dist/llm/claude-code.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +47 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +35 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +104 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +12 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +113 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +23 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +81 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/planSession.d.ts +39 -0
- package/dist/storage/planSession.d.ts.map +1 -0
- package/dist/storage/planSession.js +78 -0
- package/dist/storage/planSession.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +39 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +20 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +49 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +32 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +66 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadTsPathAliases = loadTsPathAliases;
|
|
7
|
+
exports.extractFileImports = extractFileImports;
|
|
8
|
+
exports.updateDependencyGraph = updateDependencyGraph;
|
|
9
|
+
exports.computeImportedBy = computeImportedBy;
|
|
10
|
+
exports.getTransitiveImportedBy = getTransitiveImportedBy;
|
|
11
|
+
exports.getTransitiveDeps = getTransitiveDeps;
|
|
12
|
+
exports.detectCycles = detectCycles;
|
|
13
|
+
exports.graphStats = graphStats;
|
|
14
|
+
const fs_1 = __importDefault(require("fs"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
/**
|
|
17
|
+
* Reads tsconfig.json (or tsconfig.base.json / tsconfig.node.json) from
|
|
18
|
+
* `rootDir` and extracts `compilerOptions.paths` as a list of alias entries.
|
|
19
|
+
* Returns [] if no paths are found or the file cannot be parsed.
|
|
20
|
+
*/
|
|
21
|
+
function loadTsPathAliases(rootDir) {
|
|
22
|
+
const candidates = [
|
|
23
|
+
"tsconfig.json",
|
|
24
|
+
"tsconfig.base.json",
|
|
25
|
+
"tsconfig.node.json",
|
|
26
|
+
];
|
|
27
|
+
for (const name of candidates) {
|
|
28
|
+
const tsConfigPath = path_1.default.join(rootDir, name);
|
|
29
|
+
try {
|
|
30
|
+
const raw = fs_1.default.readFileSync(tsConfigPath, "utf-8");
|
|
31
|
+
// tsconfig allows // comments — strip them before JSON.parse
|
|
32
|
+
const stripped = raw
|
|
33
|
+
.replace(/\/\/[^\n]*/g, "")
|
|
34
|
+
.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
35
|
+
const config = JSON.parse(stripped);
|
|
36
|
+
const opts = config.compilerOptions ?? {};
|
|
37
|
+
const baseUrl = opts.baseUrl ?? ".";
|
|
38
|
+
const paths = opts.paths ?? {};
|
|
39
|
+
if (Object.keys(paths).length === 0)
|
|
40
|
+
continue;
|
|
41
|
+
return Object.entries(paths).map(([pattern, targets]) => ({
|
|
42
|
+
prefix: pattern.replace(/\*$/, ""),
|
|
43
|
+
targets,
|
|
44
|
+
baseUrl,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// file missing or invalid — try next candidate
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolves a non-relative import source against the loaded tsconfig path
|
|
55
|
+
* aliases. Returns a project-relative path if matched, otherwise null.
|
|
56
|
+
*/
|
|
57
|
+
function resolveAlias(source, aliases, allFiles) {
|
|
58
|
+
for (const { prefix, targets, baseUrl } of aliases) {
|
|
59
|
+
if (!source.startsWith(prefix))
|
|
60
|
+
continue;
|
|
61
|
+
const rest = source.slice(prefix.length);
|
|
62
|
+
for (const target of targets) {
|
|
63
|
+
const resolved = target.replace("*", rest);
|
|
64
|
+
const base = path_1.default.normalize(path_1.default.join(baseUrl, resolved));
|
|
65
|
+
// Reject paths that escape the project root (e.g. alias targets like "../../")
|
|
66
|
+
if (base.startsWith(".."))
|
|
67
|
+
continue;
|
|
68
|
+
const extCandidates = ["", ".ts", ".tsx", ".js", ".jsx"];
|
|
69
|
+
for (const ext of extCandidates) {
|
|
70
|
+
const candidate = path_1.default.normalize(base + ext);
|
|
71
|
+
if (allFiles.has(candidate))
|
|
72
|
+
return candidate;
|
|
73
|
+
}
|
|
74
|
+
for (const idx of ["index.ts", "index.tsx", "index.js"]) {
|
|
75
|
+
const candidate = path_1.default.join(base, idx);
|
|
76
|
+
if (allFiles.has(candidate))
|
|
77
|
+
return candidate;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
// ─── Supported source extensions for import analysis ─────────────────────────
|
|
84
|
+
const JS_TS_EXTS = new Set([
|
|
85
|
+
"ts",
|
|
86
|
+
"tsx",
|
|
87
|
+
"js",
|
|
88
|
+
"jsx",
|
|
89
|
+
"mts",
|
|
90
|
+
"cts",
|
|
91
|
+
"mjs",
|
|
92
|
+
"cjs",
|
|
93
|
+
]);
|
|
94
|
+
// ─── Regex patterns ───────────────────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Matches static import statements:
|
|
97
|
+
* import { A, B } from './path'
|
|
98
|
+
* import type { A } from './path'
|
|
99
|
+
* import A from './path'
|
|
100
|
+
* import * as A from './path'
|
|
101
|
+
* import './path' (side-effect)
|
|
102
|
+
*/
|
|
103
|
+
const STATIC_IMPORT_RE = /^\s*import\s+(?:type\s+)?(?:(?:\{([^}]*)\}|(\w+)|\*\s+as\s+\w+)\s+from\s+)?['"]([^'"]+)['"]/gm;
|
|
104
|
+
/**
|
|
105
|
+
* Matches re-export statements:
|
|
106
|
+
* export { A, B } from './path'
|
|
107
|
+
* export * from './path'
|
|
108
|
+
* export * as NS from './path'
|
|
109
|
+
* export type { A } from './path'
|
|
110
|
+
*/
|
|
111
|
+
const EXPORT_FROM_RE = /^\s*export\s+(?:type\s+)?(?:\{([^}]*)\}|\*(?:\s+as\s+\w+)?)\s+from\s+['"]([^'"]+)['"]/gm;
|
|
112
|
+
/**
|
|
113
|
+
* Matches combined default + named imports:
|
|
114
|
+
* import Default, { A, B } from './path'
|
|
115
|
+
* import Default, { type A, B } from './path'
|
|
116
|
+
*
|
|
117
|
+
* STATIC_IMPORT_RE cannot handle these because after matching the default
|
|
118
|
+
* identifier it expects `from` but finds `, {`.
|
|
119
|
+
*/
|
|
120
|
+
const COMBINED_IMPORT_RE = /^\s*import\s+(\w+)\s*,\s*\{([^}]*)\}\s+from\s+['"]([^'"]+)['"]/gm;
|
|
121
|
+
/**
|
|
122
|
+
* Matches dynamic imports and require() calls:
|
|
123
|
+
* import('./path')
|
|
124
|
+
* require('./path')
|
|
125
|
+
*/
|
|
126
|
+
const DYNAMIC_RE = /(?:import|require)\s*\(\s*['"]([^'"]+)['"]\s*\)/gm;
|
|
127
|
+
function extractRawImports(content) {
|
|
128
|
+
const results = [];
|
|
129
|
+
// Static imports
|
|
130
|
+
let m;
|
|
131
|
+
STATIC_IMPORT_RE.lastIndex = 0;
|
|
132
|
+
while ((m = STATIC_IMPORT_RE.exec(content)) !== null) {
|
|
133
|
+
const namedGroup = m[1]; // content inside { }
|
|
134
|
+
const defaultName = m[2]; // default import identifier
|
|
135
|
+
const source = m[3];
|
|
136
|
+
if (!source)
|
|
137
|
+
continue;
|
|
138
|
+
const symbols = [];
|
|
139
|
+
if (namedGroup)
|
|
140
|
+
symbols.push(...parseNamedImports(namedGroup));
|
|
141
|
+
// Store the reserved word "default" as a sentinel for default imports.
|
|
142
|
+
// The local alias (defaultName) is irrelevant for symbol resolution.
|
|
143
|
+
if (defaultName && /^\w+$/.test(defaultName))
|
|
144
|
+
symbols.push("default");
|
|
145
|
+
results.push({ source, symbols });
|
|
146
|
+
}
|
|
147
|
+
// Re-exports
|
|
148
|
+
EXPORT_FROM_RE.lastIndex = 0;
|
|
149
|
+
while ((m = EXPORT_FROM_RE.exec(content)) !== null) {
|
|
150
|
+
const namedGroup = m[1];
|
|
151
|
+
const source = m[2];
|
|
152
|
+
if (!source)
|
|
153
|
+
continue;
|
|
154
|
+
const symbols = namedGroup ? parseNamedImports(namedGroup) : [];
|
|
155
|
+
results.push({ source, symbols });
|
|
156
|
+
}
|
|
157
|
+
// Combined: import Default, { Named } from './path'
|
|
158
|
+
COMBINED_IMPORT_RE.lastIndex = 0;
|
|
159
|
+
while ((m = COMBINED_IMPORT_RE.exec(content)) !== null) {
|
|
160
|
+
const source = m[3];
|
|
161
|
+
if (!source)
|
|
162
|
+
continue;
|
|
163
|
+
const symbols = ["default", ...parseNamedImports(m[2])];
|
|
164
|
+
results.push({ source, symbols });
|
|
165
|
+
}
|
|
166
|
+
// Dynamic imports / require
|
|
167
|
+
DYNAMIC_RE.lastIndex = 0;
|
|
168
|
+
while ((m = DYNAMIC_RE.exec(content)) !== null) {
|
|
169
|
+
const source = m[1];
|
|
170
|
+
if (source)
|
|
171
|
+
results.push({ source, symbols: [] });
|
|
172
|
+
}
|
|
173
|
+
return results;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Parses the content inside `{ A, B as C, type D }` → ['A', 'D']
|
|
177
|
+
* Returns original (pre-alias) names only.
|
|
178
|
+
*/
|
|
179
|
+
function parseNamedImports(raw) {
|
|
180
|
+
return raw
|
|
181
|
+
.split(",")
|
|
182
|
+
.map((s) => s
|
|
183
|
+
.trim()
|
|
184
|
+
.replace(/^type\s+/, "")
|
|
185
|
+
.split(/\s+as\s+/)[0]
|
|
186
|
+
.trim())
|
|
187
|
+
.filter((s) => s.length > 0 && /^\w+$/.test(s));
|
|
188
|
+
}
|
|
189
|
+
// ─── Path resolution ──────────────────────────────────────────────────────────
|
|
190
|
+
/** Returns true for relative imports (./foo, ../bar) — i.e. intra-project */
|
|
191
|
+
function isRelative(source) {
|
|
192
|
+
return source.startsWith("./") || source.startsWith("../");
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Resolves a relative import source to an actual file path that exists in
|
|
196
|
+
* the project index. Handles:
|
|
197
|
+
* - Missing extensions (TypeScript allows `import './foo'` → `./foo.ts`)
|
|
198
|
+
* - Directory imports (import './foo' → './foo/index.ts')
|
|
199
|
+
* - .js ↔ .ts aliasing (import './foo.js' → './foo.ts' in TS projects)
|
|
200
|
+
*/
|
|
201
|
+
function resolveImport(source, importerDir, // directory of the importing file (relative to root)
|
|
202
|
+
allFiles) {
|
|
203
|
+
// Compute the base path relative to project root
|
|
204
|
+
const base = path_1.default.normalize(path_1.default.join(importerDir, source));
|
|
205
|
+
// Candidate extensions to try (in priority order)
|
|
206
|
+
const extCandidates = ["", ".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"];
|
|
207
|
+
// If source already has an extension (e.g. .js in "import './foo.js'"),
|
|
208
|
+
// also try swapping it to .ts (common in TypeScript projects)
|
|
209
|
+
const sourceExt = path_1.default.extname(source);
|
|
210
|
+
if (sourceExt === ".js")
|
|
211
|
+
extCandidates.unshift(base.slice(0, -3) + ".ts");
|
|
212
|
+
if (sourceExt === ".mjs")
|
|
213
|
+
extCandidates.unshift(base.slice(0, -4) + ".mts");
|
|
214
|
+
for (const ext of extCandidates) {
|
|
215
|
+
const candidate = typeof ext === "string" && ext.startsWith("/")
|
|
216
|
+
? ext // already absolute-looking resolved path
|
|
217
|
+
: base + ext;
|
|
218
|
+
const norm = path_1.default.normalize(candidate);
|
|
219
|
+
if (allFiles.has(norm))
|
|
220
|
+
return norm;
|
|
221
|
+
}
|
|
222
|
+
// Try as directory index
|
|
223
|
+
const indexCandidates = ["index.ts", "index.tsx", "index.js", "index.jsx"];
|
|
224
|
+
for (const idx of indexCandidates) {
|
|
225
|
+
const candidate = path_1.default.join(base, idx);
|
|
226
|
+
if (allFiles.has(candidate))
|
|
227
|
+
return candidate;
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
232
|
+
/**
|
|
233
|
+
* Extracts all intra-project imports from a single file's content.
|
|
234
|
+
* Returns resolved ImportEntry[] (only files that exist in the index).
|
|
235
|
+
*
|
|
236
|
+
* @param relativePath - path of this file relative to project root
|
|
237
|
+
* @param content - file content
|
|
238
|
+
* @param allFiles - set of all relative paths in the project index
|
|
239
|
+
*/
|
|
240
|
+
function extractFileImports(relativePath, content, allFiles, aliases = []) {
|
|
241
|
+
const ext = path_1.default.extname(relativePath).slice(1).toLowerCase();
|
|
242
|
+
if (!JS_TS_EXTS.has(ext))
|
|
243
|
+
return []; // only JS/TS files have parseable imports
|
|
244
|
+
const importerDir = path_1.default.dirname(relativePath);
|
|
245
|
+
const raw = extractRawImports(content);
|
|
246
|
+
// Deduplicate by resolved file path, merging symbols
|
|
247
|
+
const resolved = new Map();
|
|
248
|
+
for (const { source, symbols } of raw) {
|
|
249
|
+
let resolvedPath = null;
|
|
250
|
+
if (isRelative(source)) {
|
|
251
|
+
resolvedPath = resolveImport(source, importerDir, allFiles);
|
|
252
|
+
}
|
|
253
|
+
else if (aliases.length > 0) {
|
|
254
|
+
resolvedPath = resolveAlias(source, aliases, allFiles);
|
|
255
|
+
}
|
|
256
|
+
if (!resolvedPath || resolvedPath === relativePath)
|
|
257
|
+
continue; // skip self-imports
|
|
258
|
+
const existing = resolved.get(resolvedPath) ?? new Set();
|
|
259
|
+
for (const s of symbols)
|
|
260
|
+
existing.add(s);
|
|
261
|
+
resolved.set(resolvedPath, existing);
|
|
262
|
+
}
|
|
263
|
+
return Array.from(resolved.entries()).map(([file, syms]) => ({
|
|
264
|
+
file,
|
|
265
|
+
symbols: Array.from(syms).sort(),
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Incrementally updates the dependency graph.
|
|
270
|
+
*
|
|
271
|
+
* - Changed/new files: re-extract imports from content
|
|
272
|
+
* - Unchanged files: carry forward existing deps entries
|
|
273
|
+
* - Deleted files: remove from graph
|
|
274
|
+
*/
|
|
275
|
+
function updateDependencyGraph(prevGraph, changedFiles, // relativePath → content (new/changed files)
|
|
276
|
+
deletedFiles, allFiles, aliases = []) {
|
|
277
|
+
const graph = {};
|
|
278
|
+
// Carry forward unchanged entries
|
|
279
|
+
for (const [file, deps] of Object.entries(prevGraph)) {
|
|
280
|
+
if (!deletedFiles.has(file) && !changedFiles.has(file)) {
|
|
281
|
+
graph[file] = deps;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Re-process changed/new files
|
|
285
|
+
for (const [relativePath, content] of changedFiles) {
|
|
286
|
+
const imports = extractFileImports(relativePath, content, allFiles, aliases);
|
|
287
|
+
if (imports.length > 0) {
|
|
288
|
+
graph[relativePath] = { imports };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return graph;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Computes the reverse graph: for each file, which files import it.
|
|
295
|
+
* Derived at query time — not stored in the index.
|
|
296
|
+
*/
|
|
297
|
+
function computeImportedBy(graph) {
|
|
298
|
+
const importedBy = new Map();
|
|
299
|
+
for (const [file, { imports }] of Object.entries(graph)) {
|
|
300
|
+
for (const imp of imports) {
|
|
301
|
+
const list = importedBy.get(imp.file) ?? [];
|
|
302
|
+
list.push(file);
|
|
303
|
+
importedBy.set(imp.file, list);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return importedBy;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Returns all files that (transitively) import `startFile`, up to `depth` hops
|
|
310
|
+
* in the reverse dependency graph (following importedBy edges inward).
|
|
311
|
+
*/
|
|
312
|
+
function getTransitiveImportedBy(startFile, importedByMap, depth = 1) {
|
|
313
|
+
const visited = new Map(); // file → distance
|
|
314
|
+
const queue = [[startFile, 0]];
|
|
315
|
+
let head = 0;
|
|
316
|
+
while (head < queue.length) {
|
|
317
|
+
const [file, dist] = queue[head++];
|
|
318
|
+
if (dist >= depth)
|
|
319
|
+
continue;
|
|
320
|
+
for (const importer of importedByMap.get(file) ?? []) {
|
|
321
|
+
if (!visited.has(importer)) {
|
|
322
|
+
visited.set(importer, dist + 1);
|
|
323
|
+
queue.push([importer, dist + 1]);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return visited;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Returns all files reachable from `startFile` up to `depth` hops
|
|
331
|
+
* in the dependency graph (following imports outward).
|
|
332
|
+
*/
|
|
333
|
+
function getTransitiveDeps(startFile, graph, depth = 1) {
|
|
334
|
+
const visited = new Map(); // file → distance
|
|
335
|
+
const queue = [[startFile, 0]];
|
|
336
|
+
let head = 0;
|
|
337
|
+
while (head < queue.length) {
|
|
338
|
+
const [file, dist] = queue[head++];
|
|
339
|
+
if (dist > depth)
|
|
340
|
+
break;
|
|
341
|
+
for (const imp of graph[file]?.imports ?? []) {
|
|
342
|
+
if (!visited.has(imp.file)) {
|
|
343
|
+
visited.set(imp.file, dist + 1);
|
|
344
|
+
queue.push([imp.file, dist + 1]);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return visited;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Detects circular dependencies using DFS with a recursion stack (gray-set).
|
|
352
|
+
* Returns up to 5 unique cycles, each as an ordered list of file paths
|
|
353
|
+
* (first element === last element to make the loop explicit).
|
|
354
|
+
*/
|
|
355
|
+
function detectCycles(graph) {
|
|
356
|
+
const WHITE = 0, GRAY = 1, BLACK = 2;
|
|
357
|
+
const color = new Map();
|
|
358
|
+
const cycles = [];
|
|
359
|
+
function dfs(node, stack) {
|
|
360
|
+
color.set(node, GRAY);
|
|
361
|
+
stack.push(node);
|
|
362
|
+
for (const imp of graph[node]?.imports ?? []) {
|
|
363
|
+
const c = color.get(imp.file) ?? WHITE;
|
|
364
|
+
if (c === GRAY) {
|
|
365
|
+
const idx = stack.indexOf(imp.file);
|
|
366
|
+
if (idx !== -1)
|
|
367
|
+
cycles.push([...stack.slice(idx), imp.file]);
|
|
368
|
+
}
|
|
369
|
+
else if (c === WHITE) {
|
|
370
|
+
dfs(imp.file, stack);
|
|
371
|
+
}
|
|
372
|
+
if (cycles.length >= 5)
|
|
373
|
+
break; // cap early
|
|
374
|
+
}
|
|
375
|
+
stack.pop();
|
|
376
|
+
color.set(node, BLACK);
|
|
377
|
+
}
|
|
378
|
+
for (const file of Object.keys(graph)) {
|
|
379
|
+
if ((color.get(file) ?? WHITE) === WHITE)
|
|
380
|
+
dfs(file, []);
|
|
381
|
+
if (cycles.length >= 5)
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
// Deduplicate: same cycle can be discovered starting from different nodes
|
|
385
|
+
const seen = new Set();
|
|
386
|
+
return cycles.filter((cycle) => {
|
|
387
|
+
const key = [...cycle].sort().join("|");
|
|
388
|
+
if (seen.has(key))
|
|
389
|
+
return false;
|
|
390
|
+
seen.add(key);
|
|
391
|
+
return true;
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Stats about the dependency graph for display in `vemora status`.
|
|
396
|
+
*/
|
|
397
|
+
function graphStats(graph) {
|
|
398
|
+
const importedByCount = new Map();
|
|
399
|
+
let totalEdges = 0;
|
|
400
|
+
for (const { imports } of Object.values(graph)) {
|
|
401
|
+
totalEdges += imports.length;
|
|
402
|
+
for (const imp of imports) {
|
|
403
|
+
importedByCount.set(imp.file, (importedByCount.get(imp.file) ?? 0) + 1);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const mostImported = Array.from(importedByCount.entries())
|
|
407
|
+
.sort((a, b) => b[1] - a[1])
|
|
408
|
+
.slice(0, 5)
|
|
409
|
+
.map(([file, count]) => ({ file, count }));
|
|
410
|
+
return { totalFiles: Object.keys(graph).length, totalEdges, mostImported };
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/indexer/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Computes the SHA-256 hash of a file's content.
|
|
3
|
+
* Used for change detection during incremental indexing.
|
|
4
|
+
*/
|
|
5
|
+
export declare function hashFile(filePath: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Same hash as hashFile but computed from already-read content.
|
|
8
|
+
* Use this when the file has already been read to avoid a redundant I/O call.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hashBuffer(content: Buffer | string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Computes a short content-based hash for a chunk.
|
|
13
|
+
* Using content (not path+line) means embeddings are reusable across branches
|
|
14
|
+
* when the actual code hasn't changed, even if surrounding lines shifted.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hashContent(content: string): string;
|
|
17
|
+
//# sourceMappingURL=hasher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../src/indexer/hasher.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMnD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.hashFile = hashFile;
|
|
7
|
+
exports.hashBuffer = hashBuffer;
|
|
8
|
+
exports.hashContent = hashContent;
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
/**
|
|
12
|
+
* Computes the SHA-256 hash of a file's content.
|
|
13
|
+
* Used for change detection during incremental indexing.
|
|
14
|
+
*/
|
|
15
|
+
function hashFile(filePath) {
|
|
16
|
+
const content = fs_1.default.readFileSync(filePath);
|
|
17
|
+
return crypto_1.default.createHash("sha256").update(content).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Same hash as hashFile but computed from already-read content.
|
|
21
|
+
* Use this when the file has already been read to avoid a redundant I/O call.
|
|
22
|
+
*/
|
|
23
|
+
function hashBuffer(content) {
|
|
24
|
+
return crypto_1.default.createHash("sha256").update(content).digest("hex");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Computes a short content-based hash for a chunk.
|
|
28
|
+
* Using content (not path+line) means embeddings are reusable across branches
|
|
29
|
+
* when the actual code hasn't changed, even if surrounding lines shifted.
|
|
30
|
+
*/
|
|
31
|
+
function hashContent(content) {
|
|
32
|
+
return crypto_1.default
|
|
33
|
+
.createHash("sha256")
|
|
34
|
+
.update(content, "utf-8")
|
|
35
|
+
.digest("hex")
|
|
36
|
+
.slice(0, 16);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=hasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../src/indexer/hasher.ts"],"names":[],"mappings":";;;;;AAOA,4BAGC;AAMD,gCAEC;AAOD,kCAMC;AA/BD,oDAA4B;AAC5B,4CAAoB;AAEpB;;;GAGG;AACH,SAAgB,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,OAAwB;IACjD,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,gBAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;SACxB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SymbolIndex } from "../core/types";
|
|
2
|
+
export interface ParsedSymbol {
|
|
3
|
+
name: string;
|
|
4
|
+
type: "function" | "class" | "method" | "interface" | "type" | "constant" | "variable";
|
|
5
|
+
startLine: number;
|
|
6
|
+
endLine: number;
|
|
7
|
+
exported: boolean;
|
|
8
|
+
/** True when the symbol is the default export of its file */
|
|
9
|
+
isDefault?: boolean;
|
|
10
|
+
parent?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parses a source file and returns all top-level symbols found.
|
|
14
|
+
* Uses tree-sitter for TS/JS files when available; falls back to regex.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseSymbols(filePath: string, content: string): ParsedSymbol[];
|
|
17
|
+
export declare function buildSymbolIndex(filePath: string, symbols: ParsedSymbol[]): SymbolIndex;
|
|
18
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/indexer/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAyCjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EACA,UAAU,GACV,OAAO,GACP,QAAQ,GACR,WAAW,GACX,MAAM,GACN,UAAU,GACV,UAAU,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,YAAY,EAAE,CAehB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,EAAE,GACtB,WAAW,CAcb"}
|