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,236 @@
|
|
|
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.runUsages = runUsages;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../core/config");
|
|
9
|
+
const repository_1 = require("../storage/repository");
|
|
10
|
+
/**
|
|
11
|
+
* vemora usages <SymbolName>
|
|
12
|
+
*
|
|
13
|
+
* Finds all files that use a named symbol, following re-export chains.
|
|
14
|
+
* Uses both the dependency graph (reliable) and the call graph (line-level detail).
|
|
15
|
+
*/
|
|
16
|
+
async function runUsages(rootDir, symbolName, options = {}) {
|
|
17
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
18
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
19
|
+
const symbols = repo.loadSymbols();
|
|
20
|
+
const depGraph = repo.loadDeps();
|
|
21
|
+
const callGraph = repo.loadCallGraph();
|
|
22
|
+
// ── 1. Resolve symbol ────────────────────────────────────────────────────────
|
|
23
|
+
let resolvedName = symbolName;
|
|
24
|
+
if (!symbols[resolvedName]) {
|
|
25
|
+
const lower = symbolName.toLowerCase();
|
|
26
|
+
const candidates = Object.keys(symbols).filter((s) => s.toLowerCase() === lower);
|
|
27
|
+
if (candidates.length === 0) {
|
|
28
|
+
console.log(chalk_1.default.yellow(`Symbol "${symbolName}" not found in index.`));
|
|
29
|
+
console.log(chalk_1.default.gray("Run `vemora index --root .` to update the index."));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (candidates.length === 1) {
|
|
33
|
+
resolvedName = candidates[0];
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(chalk_1.default.yellow(`Ambiguous symbol name. Did you mean one of these?`));
|
|
37
|
+
for (const c of candidates) {
|
|
38
|
+
console.log(` ${chalk_1.default.cyan(c)} ${chalk_1.default.gray(`(${symbols[c].file})`)}`);
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const entry = symbols[resolvedName];
|
|
44
|
+
const defFile = entry.file;
|
|
45
|
+
const maxDepth = options.depth ?? 10;
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(chalk_1.default.bold(`Usages of ${chalk_1.default.cyan(resolvedName)}`));
|
|
48
|
+
console.log(` Defined in ${chalk_1.default.blue(defFile)}:${entry.startLine} ${chalk_1.default.gray(`(${entry.type})`)}`);
|
|
49
|
+
console.log();
|
|
50
|
+
// ── Methods: call graph only ─────────────────────────────────────────────────
|
|
51
|
+
//
|
|
52
|
+
// Methods are not individually imported — the dep graph tracks the containing
|
|
53
|
+
// class import, not individual method calls. Use the call graph exclusively.
|
|
54
|
+
// The call graph stores methods as "file:methodName" (without class prefix).
|
|
55
|
+
if (entry.type === "method") {
|
|
56
|
+
const methodName = resolvedName.includes(".")
|
|
57
|
+
? resolvedName.split(".").pop()
|
|
58
|
+
: resolvedName;
|
|
59
|
+
const cgKey = `${defFile}:${methodName}`;
|
|
60
|
+
const cgEntry = callGraph[cgKey];
|
|
61
|
+
const calledBy = cgEntry?.calledBy ?? [];
|
|
62
|
+
if (calledBy.length === 0) {
|
|
63
|
+
console.log(chalk_1.default.gray("No call graph data for this method."));
|
|
64
|
+
console.log(chalk_1.default.gray(` Methods are not tracked via imports — only the call graph can find callers.`));
|
|
65
|
+
if (entry.parent) {
|
|
66
|
+
console.log(chalk_1.default.gray(` Tip: try \`vemora usages ${entry.parent}\` to find all files that import the class.`));
|
|
67
|
+
}
|
|
68
|
+
console.log(chalk_1.default.gray(" Re-index with tree-sitter enabled to populate call graph data."));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Group calledBy entries by file
|
|
72
|
+
const byFile = new Map();
|
|
73
|
+
for (const callerScope of calledBy) {
|
|
74
|
+
const colonIdx = callerScope.lastIndexOf(":");
|
|
75
|
+
if (colonIdx === -1)
|
|
76
|
+
continue;
|
|
77
|
+
const callerFile = callerScope.substring(0, colonIdx);
|
|
78
|
+
const callerFn = callerScope.substring(colonIdx + 1);
|
|
79
|
+
const list = byFile.get(callerFile) ?? [];
|
|
80
|
+
if (!list.includes(callerFn))
|
|
81
|
+
list.push(callerFn);
|
|
82
|
+
byFile.set(callerFile, list);
|
|
83
|
+
}
|
|
84
|
+
console.log(chalk_1.default.bold(`Found in ${byFile.size} file${byFile.size !== 1 ? "s" : ""} (via call graph):`));
|
|
85
|
+
console.log();
|
|
86
|
+
for (const [file, fns] of byFile) {
|
|
87
|
+
const callInfo = chalk_1.default.gray(` (called in: ${fns.join(", ")})`);
|
|
88
|
+
console.log(` ${chalk_1.default.gray("→")} ${chalk_1.default.blue(file)}${callInfo}`);
|
|
89
|
+
}
|
|
90
|
+
console.log();
|
|
91
|
+
console.log(chalk_1.default.yellow("⚠ Call graph coverage may be incomplete (arrow functions, injected dependencies)."));
|
|
92
|
+
}
|
|
93
|
+
console.log(chalk_1.default.gray(`Project: ${config.projectName} (${config.projectId})`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// ── 2. BFS over dep graph to find all importers (following re-exports) ───────
|
|
97
|
+
const visited = new Set(); // importer files already enqueued
|
|
98
|
+
const queue = [];
|
|
99
|
+
const allImporters = [];
|
|
100
|
+
// Whether the symbol is a default export — also match the "default" sentinel
|
|
101
|
+
const isDefaultExport = entry.isDefault === true;
|
|
102
|
+
// Seed: direct importers of the definition file
|
|
103
|
+
for (const [importerFile, fileDeps] of Object.entries(depGraph)) {
|
|
104
|
+
for (const imp of fileDeps.imports) {
|
|
105
|
+
if (imp.file === defFile &&
|
|
106
|
+
(imp.symbols.includes(resolvedName) ||
|
|
107
|
+
(isDefaultExport && imp.symbols.includes("default")))) {
|
|
108
|
+
if (!visited.has(importerFile)) {
|
|
109
|
+
visited.add(importerFile);
|
|
110
|
+
const node = { file: importerFile, from: defFile, depth: 1 };
|
|
111
|
+
queue.push(node);
|
|
112
|
+
allImporters.push(node);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// BFS: follow re-export chains
|
|
118
|
+
while (queue.length > 0) {
|
|
119
|
+
const current = queue.shift();
|
|
120
|
+
if (current.depth >= maxDepth)
|
|
121
|
+
continue;
|
|
122
|
+
for (const [importerFile, fileDeps] of Object.entries(depGraph)) {
|
|
123
|
+
for (const imp of fileDeps.imports) {
|
|
124
|
+
if (imp.file === current.file &&
|
|
125
|
+
(imp.symbols.includes(resolvedName) ||
|
|
126
|
+
(isDefaultExport && imp.symbols.includes("default")))) {
|
|
127
|
+
if (!visited.has(importerFile)) {
|
|
128
|
+
visited.add(importerFile);
|
|
129
|
+
const node = {
|
|
130
|
+
file: importerFile,
|
|
131
|
+
from: current.file,
|
|
132
|
+
depth: current.depth + 1,
|
|
133
|
+
};
|
|
134
|
+
queue.push(node);
|
|
135
|
+
allImporters.push(node);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// ── 3. Identify re-exporters ─────────────────────────────────────────────────
|
|
142
|
+
//
|
|
143
|
+
// A file is a re-exporter if other files import the symbol FROM it
|
|
144
|
+
// (and it is not the definition file itself).
|
|
145
|
+
const reExporterFiles = new Set(allImporters.filter((n) => n.from !== defFile).map((n) => n.from));
|
|
146
|
+
// ── 4. Build call-site map from the call graph ───────────────────────────────
|
|
147
|
+
//
|
|
148
|
+
// Keys in the call graph: "<file>:<symbolName>"
|
|
149
|
+
// We look up the definition file AND all re-exporters, because the call graph
|
|
150
|
+
// resolves calls to wherever the symbol was imported FROM.
|
|
151
|
+
const aliasKeys = new Set([`${defFile}:${resolvedName}`]);
|
|
152
|
+
for (const reExp of reExporterFiles) {
|
|
153
|
+
aliasKeys.add(`${reExp}:${resolvedName}`);
|
|
154
|
+
}
|
|
155
|
+
// callerFile -> list of calling scope names (function / method)
|
|
156
|
+
const callSitesByFile = new Map();
|
|
157
|
+
for (const aliasKey of aliasKeys) {
|
|
158
|
+
const cgEntry = callGraph[aliasKey];
|
|
159
|
+
if (!cgEntry?.calledBy?.length)
|
|
160
|
+
continue;
|
|
161
|
+
for (const callerScope of cgEntry.calledBy) {
|
|
162
|
+
// callerScope = "relative/path/to/file.ts:functionName"
|
|
163
|
+
const colonIdx = callerScope.lastIndexOf(":");
|
|
164
|
+
if (colonIdx === -1)
|
|
165
|
+
continue;
|
|
166
|
+
const callerFile = callerScope.substring(0, colonIdx);
|
|
167
|
+
const callerFn = callerScope.substring(colonIdx + 1);
|
|
168
|
+
const list = callSitesByFile.get(callerFile) ?? [];
|
|
169
|
+
if (!list.includes(callerFn))
|
|
170
|
+
list.push(callerFn);
|
|
171
|
+
callSitesByFile.set(callerFile, list);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ── 5. Filter if --callers-only ──────────────────────────────────────────────
|
|
175
|
+
const importersToShow = options.callersOnly
|
|
176
|
+
? allImporters.filter((n) => callSitesByFile.has(n.file))
|
|
177
|
+
: allImporters;
|
|
178
|
+
if (importersToShow.length === 0) {
|
|
179
|
+
if (options.callersOnly) {
|
|
180
|
+
console.log(chalk_1.default.gray("No call graph data found. Try without --callers-only, or re-index with tree-sitter."));
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(chalk_1.default.gray("No files import this symbol."));
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// ── 6. Print results ─────────────────────────────────────────────────────────
|
|
188
|
+
const total = importersToShow.length;
|
|
189
|
+
console.log(chalk_1.default.bold(`Found ${total} file${total !== 1 ? "s" : ""} that use this symbol:`));
|
|
190
|
+
console.log();
|
|
191
|
+
const directImporters = importersToShow.filter((n) => n.from === defFile);
|
|
192
|
+
const transitiveImporters = importersToShow.filter((n) => n.from !== defFile);
|
|
193
|
+
if (directImporters.length > 0) {
|
|
194
|
+
console.log(chalk_1.default.bold(`Direct imports (from ${chalk_1.default.blue(defFile)}):`));
|
|
195
|
+
for (const node of directImporters) {
|
|
196
|
+
printImporterLine(node.file, reExporterFiles, callSitesByFile);
|
|
197
|
+
}
|
|
198
|
+
console.log();
|
|
199
|
+
}
|
|
200
|
+
if (transitiveImporters.length > 0) {
|
|
201
|
+
// Group by re-exporter
|
|
202
|
+
const byReExporter = new Map();
|
|
203
|
+
for (const node of transitiveImporters) {
|
|
204
|
+
const list = byReExporter.get(node.from) ?? [];
|
|
205
|
+
list.push(node);
|
|
206
|
+
byReExporter.set(node.from, list);
|
|
207
|
+
}
|
|
208
|
+
console.log(chalk_1.default.bold("Via re-exports:"));
|
|
209
|
+
for (const [reExp, nodes] of byReExporter) {
|
|
210
|
+
console.log(` ${chalk_1.default.yellow("↗")} ${chalk_1.default.blue(reExp)}`);
|
|
211
|
+
for (const node of nodes) {
|
|
212
|
+
printImporterLine(node.file, reExporterFiles, callSitesByFile, " ");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
console.log();
|
|
216
|
+
}
|
|
217
|
+
// ── 7. Footer ────────────────────────────────────────────────────────────────
|
|
218
|
+
const withCallSites = callSitesByFile.size;
|
|
219
|
+
if (withCallSites > 0) {
|
|
220
|
+
console.log(chalk_1.default.gray(`Call graph: ${withCallSites} of ${total} file${total !== 1 ? "s" : ""} have call-site detail.`));
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
console.log(chalk_1.default.gray("No call graph data. Re-index with tree-sitter for call-site details."));
|
|
224
|
+
}
|
|
225
|
+
console.log(chalk_1.default.gray(`Project: ${config.projectName} (${config.projectId})`));
|
|
226
|
+
}
|
|
227
|
+
function printImporterLine(file, reExporterFiles, callSitesByFile, indent = " ") {
|
|
228
|
+
const isReExp = reExporterFiles.has(file);
|
|
229
|
+
const badge = isReExp ? chalk_1.default.yellow(" [re-exports]") : "";
|
|
230
|
+
const sites = callSitesByFile.get(file);
|
|
231
|
+
const callInfo = sites?.length
|
|
232
|
+
? chalk_1.default.gray(` (called in: ${sites.join(", ")})`)
|
|
233
|
+
: "";
|
|
234
|
+
console.log(`${indent}${chalk_1.default.gray("→")} ${chalk_1.default.blue(file)}${badge}${callInfo}`);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=usages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usages.js","sourceRoot":"","sources":["../../src/commands/usages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AiMemoryConfig } from "./types";
|
|
2
|
+
export declare const AI_MEMORY_DIR = ".vemora";
|
|
3
|
+
export declare const AI_MEMORY_CACHE_DIR = ".vemora-cache";
|
|
4
|
+
export declare const CONFIG_FILE = "config.json";
|
|
5
|
+
export declare const METADATA_FILE = "metadata.json";
|
|
6
|
+
export declare const INDEX_DIR = "index";
|
|
7
|
+
export declare const FILES_JSON = "files.json";
|
|
8
|
+
export declare const CHUNKS_JSON = "chunks.json";
|
|
9
|
+
export declare const SYMBOLS_JSON = "symbols.json";
|
|
10
|
+
export declare const DEPS_JSON = "deps.json";
|
|
11
|
+
export declare const CALLGRAPH_JSON = "callgraph.json";
|
|
12
|
+
export declare const TODOS_JSON = "todos.json";
|
|
13
|
+
export declare const SUMMARIES_DIR = "summaries";
|
|
14
|
+
export declare const FILE_SUMMARIES_JSON = "file-summaries.json";
|
|
15
|
+
export declare const PROJECT_SUMMARY_JSON = "project-summary.json";
|
|
16
|
+
export declare const KNOWLEDGE_DIR = "knowledge";
|
|
17
|
+
export declare const KNOWLEDGE_JSON = "entries.json";
|
|
18
|
+
export declare function getMemoryDir(rootDir: string): string;
|
|
19
|
+
export declare function getIndexDir(rootDir: string): string;
|
|
20
|
+
export declare function getSummariesDir(rootDir: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the local (per-developer) cache directory.
|
|
23
|
+
* Lives in the user's home directory — never in the repo.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getLocalCacheDir(projectId: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Derives a stable project ID from the root directory path.
|
|
28
|
+
* This is deterministic so developers on the same machine always get the same ID,
|
|
29
|
+
* but differs across machines (cache is local anyway).
|
|
30
|
+
*/
|
|
31
|
+
export declare function generateProjectId(rootDir: string): string;
|
|
32
|
+
export declare function getDefaultConfig(rootDir: string, projectName: string): AiMemoryConfig;
|
|
33
|
+
export declare function loadConfig(rootDir: string): AiMemoryConfig;
|
|
34
|
+
export declare function saveConfig(config: AiMemoryConfig): void;
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAI7C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAID,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,cAAc,CAuEhB;AAID,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAoB1D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAKvD"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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.KNOWLEDGE_JSON = exports.KNOWLEDGE_DIR = exports.PROJECT_SUMMARY_JSON = exports.FILE_SUMMARIES_JSON = exports.SUMMARIES_DIR = exports.TODOS_JSON = exports.CALLGRAPH_JSON = exports.DEPS_JSON = exports.SYMBOLS_JSON = exports.CHUNKS_JSON = exports.FILES_JSON = exports.INDEX_DIR = exports.METADATA_FILE = exports.CONFIG_FILE = exports.AI_MEMORY_CACHE_DIR = exports.AI_MEMORY_DIR = void 0;
|
|
7
|
+
exports.getMemoryDir = getMemoryDir;
|
|
8
|
+
exports.getIndexDir = getIndexDir;
|
|
9
|
+
exports.getSummariesDir = getSummariesDir;
|
|
10
|
+
exports.getLocalCacheDir = getLocalCacheDir;
|
|
11
|
+
exports.generateProjectId = generateProjectId;
|
|
12
|
+
exports.getDefaultConfig = getDefaultConfig;
|
|
13
|
+
exports.loadConfig = loadConfig;
|
|
14
|
+
exports.saveConfig = saveConfig;
|
|
15
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
// ─── Path Constants ────────────────────────────────────────────────────────────
|
|
20
|
+
exports.AI_MEMORY_DIR = ".vemora";
|
|
21
|
+
exports.AI_MEMORY_CACHE_DIR = ".vemora-cache";
|
|
22
|
+
exports.CONFIG_FILE = "config.json";
|
|
23
|
+
exports.METADATA_FILE = "metadata.json";
|
|
24
|
+
exports.INDEX_DIR = "index";
|
|
25
|
+
exports.FILES_JSON = "files.json";
|
|
26
|
+
exports.CHUNKS_JSON = "chunks.json";
|
|
27
|
+
exports.SYMBOLS_JSON = "symbols.json";
|
|
28
|
+
exports.DEPS_JSON = "deps.json";
|
|
29
|
+
exports.CALLGRAPH_JSON = "callgraph.json";
|
|
30
|
+
exports.TODOS_JSON = "todos.json";
|
|
31
|
+
exports.SUMMARIES_DIR = "summaries";
|
|
32
|
+
exports.FILE_SUMMARIES_JSON = "file-summaries.json";
|
|
33
|
+
exports.PROJECT_SUMMARY_JSON = "project-summary.json";
|
|
34
|
+
exports.KNOWLEDGE_DIR = "knowledge";
|
|
35
|
+
exports.KNOWLEDGE_JSON = "entries.json";
|
|
36
|
+
// ─── Path Helpers ─────────────────────────────────────────────────────────────
|
|
37
|
+
function getMemoryDir(rootDir) {
|
|
38
|
+
return path_1.default.join(rootDir, exports.AI_MEMORY_DIR);
|
|
39
|
+
}
|
|
40
|
+
function getIndexDir(rootDir) {
|
|
41
|
+
return path_1.default.join(rootDir, exports.AI_MEMORY_DIR, exports.INDEX_DIR);
|
|
42
|
+
}
|
|
43
|
+
function getSummariesDir(rootDir) {
|
|
44
|
+
return path_1.default.join(rootDir, exports.AI_MEMORY_DIR, exports.SUMMARIES_DIR);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns the local (per-developer) cache directory.
|
|
48
|
+
* Lives in the user's home directory — never in the repo.
|
|
49
|
+
*/
|
|
50
|
+
function getLocalCacheDir(projectId) {
|
|
51
|
+
return path_1.default.join(os_1.default.homedir(), ".vemora-cache", projectId);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Derives a stable project ID from the root directory path.
|
|
55
|
+
* This is deterministic so developers on the same machine always get the same ID,
|
|
56
|
+
* but differs across machines (cache is local anyway).
|
|
57
|
+
*/
|
|
58
|
+
function generateProjectId(rootDir) {
|
|
59
|
+
return crypto_1.default.createHash("sha256").update(rootDir).digest("hex").slice(0, 16);
|
|
60
|
+
}
|
|
61
|
+
// ─── Config Defaults ──────────────────────────────────────────────────────────
|
|
62
|
+
function getDefaultConfig(rootDir, projectName) {
|
|
63
|
+
return {
|
|
64
|
+
projectId: generateProjectId(rootDir),
|
|
65
|
+
projectName,
|
|
66
|
+
version: "1.0.0",
|
|
67
|
+
rootDir,
|
|
68
|
+
include: [
|
|
69
|
+
"**/*.ts",
|
|
70
|
+
"**/*.tsx",
|
|
71
|
+
"**/*.js",
|
|
72
|
+
"**/*.jsx",
|
|
73
|
+
"**/*.py",
|
|
74
|
+
"**/*.rs",
|
|
75
|
+
"**/*.go",
|
|
76
|
+
"**/*.java",
|
|
77
|
+
"**/*.c",
|
|
78
|
+
"**/*.cpp",
|
|
79
|
+
"**/*.h",
|
|
80
|
+
"**/*.css",
|
|
81
|
+
"**/*.scss",
|
|
82
|
+
"**/*.json",
|
|
83
|
+
"**/*.yaml",
|
|
84
|
+
"**/*.yml",
|
|
85
|
+
"**/*.md",
|
|
86
|
+
],
|
|
87
|
+
exclude: [
|
|
88
|
+
"**/node_modules/**",
|
|
89
|
+
"**/.git/**",
|
|
90
|
+
"**/dist/**",
|
|
91
|
+
"**/build/**",
|
|
92
|
+
"**/out/**",
|
|
93
|
+
"**/.next/**",
|
|
94
|
+
"**/.nuxt/**",
|
|
95
|
+
"**/coverage/**",
|
|
96
|
+
"**/*.min.js",
|
|
97
|
+
"**/*.bundle.js",
|
|
98
|
+
// Lock files — auto-generated, no value for summarization
|
|
99
|
+
"**/pnpm-lock.yaml",
|
|
100
|
+
"**/package-lock.json",
|
|
101
|
+
"**/yarn.lock",
|
|
102
|
+
"**/bun.lockb",
|
|
103
|
+
// Other generated/binary files
|
|
104
|
+
"**/*.lock",
|
|
105
|
+
"**/*.log",
|
|
106
|
+
// Agent instruction files — not codebase documentation
|
|
107
|
+
"**/CLAUDE.md",
|
|
108
|
+
"**/GEMINI.md",
|
|
109
|
+
"**/.cursor/**",
|
|
110
|
+
"**/.windsurfrules",
|
|
111
|
+
"**/.github/copilot-instructions.md",
|
|
112
|
+
// Boilerplate markdown
|
|
113
|
+
"**/CHANGELOG.md",
|
|
114
|
+
"**/CHANGELOG*.md",
|
|
115
|
+
"**/LICENSE*",
|
|
116
|
+
exports.AI_MEMORY_DIR + "/**",
|
|
117
|
+
exports.AI_MEMORY_CACHE_DIR + "/**",
|
|
118
|
+
],
|
|
119
|
+
maxChunkLines: 80,
|
|
120
|
+
maxChunkChars: 3000,
|
|
121
|
+
embedding: {
|
|
122
|
+
provider: "ollama",
|
|
123
|
+
model: "nomic-embed-text",
|
|
124
|
+
dimensions: 768,
|
|
125
|
+
},
|
|
126
|
+
summarization: {
|
|
127
|
+
provider: "ollama",
|
|
128
|
+
model: "gemma4:e2b",
|
|
129
|
+
baseUrl: "http://localhost:11434",
|
|
130
|
+
},
|
|
131
|
+
cacheDir: "~/.vemora-cache/<projectId>",
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ─── Config I/O ───────────────────────────────────────────────────────────────
|
|
135
|
+
function loadConfig(rootDir) {
|
|
136
|
+
const configPath = path_1.default.join(rootDir, exports.AI_MEMORY_DIR, exports.CONFIG_FILE);
|
|
137
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
138
|
+
throw new Error(`No ${exports.AI_MEMORY_DIR}/config.json found in ${rootDir}.\nRun 'vemora init' first.`);
|
|
139
|
+
}
|
|
140
|
+
const raw = fs_1.default.readFileSync(configPath, "utf-8");
|
|
141
|
+
let config;
|
|
142
|
+
try {
|
|
143
|
+
config = JSON.parse(raw);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new Error(`${exports.AI_MEMORY_DIR}/config.json is not valid JSON.\nFix the file manually or run 'vemora init --force' to reset it.`);
|
|
147
|
+
}
|
|
148
|
+
// rootDir is injected at load time (not stored in config) so it always reflects
|
|
149
|
+
// the actual filesystem location, even if the project was moved.
|
|
150
|
+
config.rootDir = rootDir;
|
|
151
|
+
return config;
|
|
152
|
+
}
|
|
153
|
+
function saveConfig(config) {
|
|
154
|
+
const configPath = path_1.default.join(config.rootDir, exports.AI_MEMORY_DIR, exports.CONFIG_FILE);
|
|
155
|
+
// Don't persist rootDir — it's injected at load time
|
|
156
|
+
const { rootDir: _omit, ...toSave } = config;
|
|
157
|
+
fs_1.default.writeFileSync(configPath, JSON.stringify(toSave, null, 2), "utf-8");
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|