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,127 @@
|
|
|
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.runStatus = runStatus;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../core/config");
|
|
10
|
+
const deps_1 = require("../indexer/deps");
|
|
11
|
+
const cache_1 = require("../storage/cache");
|
|
12
|
+
const knowledge_1 = require("../storage/knowledge");
|
|
13
|
+
const repository_1 = require("../storage/repository");
|
|
14
|
+
const summaries_1 = require("../storage/summaries");
|
|
15
|
+
async function runStatus(rootDir) {
|
|
16
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
17
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
18
|
+
const meta = repo.loadMetadata();
|
|
19
|
+
const cacheStorage = new cache_1.EmbeddingCacheStorage(config.projectId);
|
|
20
|
+
const cache = cacheStorage.load();
|
|
21
|
+
const row = (label, value) => console.log(` ${chalk_1.default.gray(label.padEnd(16))} ${value}`);
|
|
22
|
+
console.log(chalk_1.default.bold("vemora status"));
|
|
23
|
+
console.log();
|
|
24
|
+
row("Project:", config.projectName);
|
|
25
|
+
row("Project ID:", config.projectId);
|
|
26
|
+
row("Provider:", `${config.embedding.provider} / ${config.embedding.model}`);
|
|
27
|
+
if (meta) {
|
|
28
|
+
console.log();
|
|
29
|
+
console.log(chalk_1.default.bold("Index (versioned in git):"));
|
|
30
|
+
row("Last indexed:", meta.lastIndexed ?? chalk_1.default.gray("never"));
|
|
31
|
+
row("Files:", String(meta.indexedFiles));
|
|
32
|
+
row("Chunks:", String(meta.totalChunks));
|
|
33
|
+
row("Symbols:", String(meta.totalSymbols));
|
|
34
|
+
row("Dep edges:", String(meta.totalDepEdges ?? 0));
|
|
35
|
+
row("Call edges:", String(meta.totalCallEdges ?? 0));
|
|
36
|
+
}
|
|
37
|
+
// Summaries
|
|
38
|
+
const summaryStorage = new summaries_1.SummaryStorage(rootDir);
|
|
39
|
+
if (summaryStorage.hasFileSummaries()) {
|
|
40
|
+
const fileSummaries = summaryStorage.loadFileSummaries();
|
|
41
|
+
const summaryCount = Object.keys(fileSummaries).length;
|
|
42
|
+
const hasOverview = summaryStorage.hasProjectSummary();
|
|
43
|
+
console.log();
|
|
44
|
+
console.log(chalk_1.default.bold("Summaries (versioned in git):"));
|
|
45
|
+
row("File summaries:", String(summaryCount));
|
|
46
|
+
row("Project overview:", hasOverview
|
|
47
|
+
? chalk_1.default.green("yes")
|
|
48
|
+
: chalk_1.default.gray("no (run vemora summarize)"));
|
|
49
|
+
}
|
|
50
|
+
// Knowledge store
|
|
51
|
+
const knowledgeStorage = new knowledge_1.KnowledgeStorage(rootDir);
|
|
52
|
+
if (knowledgeStorage.hasKnowledge()) {
|
|
53
|
+
const entries = knowledgeStorage.load();
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(chalk_1.default.bold("Knowledge store (versioned in git):"));
|
|
56
|
+
row("Entries:", String(entries.length));
|
|
57
|
+
// Staleness detection: warn if relatedFiles were modified after entry was created
|
|
58
|
+
const fileIndex = repo.loadFiles();
|
|
59
|
+
const stale = entries.filter((e) => {
|
|
60
|
+
if (!e.relatedFiles?.length)
|
|
61
|
+
return false;
|
|
62
|
+
return e.relatedFiles.some((f) => {
|
|
63
|
+
const fileEntry = fileIndex[f];
|
|
64
|
+
if (!fileEntry)
|
|
65
|
+
return false;
|
|
66
|
+
// If we have a hash snapshot, use it — immune to touch/timestamp skew
|
|
67
|
+
if (e.relatedFileHashes?.[f]) {
|
|
68
|
+
return fileEntry.hash !== e.relatedFileHashes[f];
|
|
69
|
+
}
|
|
70
|
+
// Fallback for older entries without hash snapshots
|
|
71
|
+
if (fileEntry.hash && e.createdAt) {
|
|
72
|
+
return new Date(fileEntry.lastModified) > new Date(e.createdAt);
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
if (stale.length > 0) {
|
|
78
|
+
console.log();
|
|
79
|
+
for (const e of stale) {
|
|
80
|
+
console.log(` ${chalk_1.default.yellow("⚠")} Knowledge entry ${chalk_1.default.gray(`[${e.id.slice(0, 8)}]`)} ${chalk_1.default.bold(`"${e.title}"`)} — related files changed after entry was created`);
|
|
81
|
+
console.log(chalk_1.default.gray(` Created: ${e.createdAt.slice(0, 10)} · Run \`vemora knowledge list\` to review`));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// TODO / FIXME annotations
|
|
86
|
+
const todos = repo.loadTodos();
|
|
87
|
+
if (todos.length > 0) {
|
|
88
|
+
const byType = todos.reduce((acc, t) => {
|
|
89
|
+
acc[t.type] = (acc[t.type] ?? 0) + 1;
|
|
90
|
+
return acc;
|
|
91
|
+
}, {});
|
|
92
|
+
console.log();
|
|
93
|
+
console.log(chalk_1.default.bold("Code annotations (versioned in git):"));
|
|
94
|
+
row("Total:", String(todos.length));
|
|
95
|
+
for (const [type, count] of Object.entries(byType).sort()) {
|
|
96
|
+
row(` ${type}:`, String(count));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Circular dependency detection
|
|
100
|
+
const deps = repo.loadDeps();
|
|
101
|
+
const cycles = (0, deps_1.detectCycles)(deps);
|
|
102
|
+
if (cycles.length > 0) {
|
|
103
|
+
console.log();
|
|
104
|
+
console.log(chalk_1.default.bold("Circular dependencies:"));
|
|
105
|
+
for (const cycle of cycles) {
|
|
106
|
+
const display = cycle
|
|
107
|
+
.map((f) => chalk_1.default.cyan(path_1.default.basename(f)))
|
|
108
|
+
.join(chalk_1.default.gray(" → "));
|
|
109
|
+
console.log(` ${chalk_1.default.yellow("⚠")} ${display}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
console.log();
|
|
113
|
+
console.log(chalk_1.default.bold("Embedding cache (local only):"));
|
|
114
|
+
const cachedCount = cache?.chunkIds
|
|
115
|
+
? cache.chunkIds.length
|
|
116
|
+
: Object.keys(cache?.embeddings ?? {}).length;
|
|
117
|
+
if (!cache || cachedCount === 0) {
|
|
118
|
+
console.log(` ${chalk_1.default.gray("No cache found.")} Run ${chalk_1.default.cyan("vemora index")} to generate embeddings.`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
row("Cached vectors:", String(cachedCount));
|
|
122
|
+
row("Model:", cache.embeddingModel);
|
|
123
|
+
row("Updated:", cache.lastUpdated);
|
|
124
|
+
row("Location:", cacheStorage.getCacheDir());
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SummarizeOptions {
|
|
2
|
+
/** Re-generate all summaries, ignoring content hashes */
|
|
3
|
+
force?: boolean;
|
|
4
|
+
/** Override the model from config (e.g. gpt-4o, gpt-4o-mini) */
|
|
5
|
+
model?: string;
|
|
6
|
+
/** Only generate file-level summaries, skip project overview */
|
|
7
|
+
filesOnly?: boolean;
|
|
8
|
+
/** Only (re)generate the project overview from existing file summaries */
|
|
9
|
+
projectOnly?: boolean;
|
|
10
|
+
/** Print the existing project overview without regenerating anything */
|
|
11
|
+
show?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function runSummarize(rootDir: string, options?: SummarizeOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=summarize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA6BD,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyLf"}
|
|
@@ -0,0 +1,170 @@
|
|
|
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.runSummarize = runSummarize;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const config_1 = require("../core/config");
|
|
12
|
+
const factory_1 = require("../llm/factory");
|
|
13
|
+
const repository_1 = require("../storage/repository");
|
|
14
|
+
const summaries_1 = require("../storage/summaries");
|
|
15
|
+
// ─── Prompts ──────────────────────────────────────────────────────────────────
|
|
16
|
+
function fileSummaryPrompt(file, symbols, content) {
|
|
17
|
+
const symbolList = symbols.length > 0 ? symbols.join(", ") : "none";
|
|
18
|
+
return (`Summarize this source file in 1-2 sentences for a code memory index.\n` +
|
|
19
|
+
`Cover: what it does, key exports (${symbolList}), its role in the codebase.\n` +
|
|
20
|
+
`Output only the summary sentence(s). No headers, no lists, no preamble.\n\n` +
|
|
21
|
+
`File: ${file}\n\`\`\`\n${content}\n\`\`\``);
|
|
22
|
+
}
|
|
23
|
+
function projectOverviewPrompt(projectName, summaries) {
|
|
24
|
+
return (`Write a technical overview of the "${projectName}" codebase for an AI assistant's memory index.\n` +
|
|
25
|
+
`Cover: purpose, main architectural layers, key data flows, entry points for development tasks.\n` +
|
|
26
|
+
`Be dense and precise. 200-300 words. No preamble, no headers, plain prose only.\n\n` +
|
|
27
|
+
`File summaries:\n${summaries}`);
|
|
28
|
+
}
|
|
29
|
+
// ─── Main command ─────────────────────────────────────────────────────────────
|
|
30
|
+
async function runSummarize(rootDir, options = {}) {
|
|
31
|
+
if (options.show) {
|
|
32
|
+
const summaryStorage = new summaries_1.SummaryStorage(rootDir);
|
|
33
|
+
const projectSummary = summaryStorage.loadProjectSummary();
|
|
34
|
+
if (!projectSummary) {
|
|
35
|
+
console.log(chalk_1.default.yellow("No project overview found. Run `vemora summarize` first."));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
console.log(projectSummary.overview);
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(chalk_1.default.gray(`Generated: ${projectSummary.generatedAt}`));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const config = (0, config_1.loadConfig)(rootDir);
|
|
44
|
+
const repo = new repository_1.RepositoryStorage(rootDir);
|
|
45
|
+
const summaryStorage = new summaries_1.SummaryStorage(rootDir);
|
|
46
|
+
// ── Resolve LLM provider ────────────────────────────────────────────────────
|
|
47
|
+
const summarizationConfig = {
|
|
48
|
+
...(config.summarization ?? { provider: "ollama", model: "gemma4:e2b", baseUrl: "http://localhost:11434" }),
|
|
49
|
+
...(options.model ? { model: options.model } : {}),
|
|
50
|
+
};
|
|
51
|
+
const model = summarizationConfig.model;
|
|
52
|
+
const llm = (0, factory_1.createLLMProvider)(summarizationConfig);
|
|
53
|
+
// ── File summaries ──────────────────────────────────────────────────────────
|
|
54
|
+
let anyFileSummaryChanged = false;
|
|
55
|
+
if (!options.projectOnly) {
|
|
56
|
+
const files = repo.loadFiles();
|
|
57
|
+
const prevSummaries = summaryStorage.loadFileSummaries();
|
|
58
|
+
const allEntries = Object.entries(files);
|
|
59
|
+
const toSummarize = options.force
|
|
60
|
+
? allEntries
|
|
61
|
+
: allEntries.filter(([relPath, entry]) => {
|
|
62
|
+
const prev = prevSummaries[relPath];
|
|
63
|
+
return !prev || prev.contentHash !== entry.hash;
|
|
64
|
+
});
|
|
65
|
+
const skipped = allEntries.length - toSummarize.length;
|
|
66
|
+
console.log(chalk_1.default.bold(`Summarizing ${chalk_1.default.cyan(config.projectName)}`));
|
|
67
|
+
console.log(chalk_1.default.gray(` model: ${model}`));
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(chalk_1.default.bold("File summaries") +
|
|
70
|
+
chalk_1.default.gray(` ${toSummarize.length} to generate` +
|
|
71
|
+
(skipped > 0 ? `, ${skipped} unchanged (skipped)` : "")));
|
|
72
|
+
console.log();
|
|
73
|
+
if (toSummarize.length === 0) {
|
|
74
|
+
console.log(chalk_1.default.green("✓ All file summaries are up to date."));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const updated = { ...prevSummaries };
|
|
78
|
+
let failed = 0;
|
|
79
|
+
for (let i = 0; i < toSummarize.length; i++) {
|
|
80
|
+
const [relPath, entry] = toSummarize[i];
|
|
81
|
+
const label = `[${i + 1}/${toSummarize.length}] ${relPath}`;
|
|
82
|
+
const spinner = (0, ora_1.default)(chalk_1.default.gray(label)).start();
|
|
83
|
+
try {
|
|
84
|
+
// Read file content, truncate to ~4000 chars to stay within prompt limits
|
|
85
|
+
const absolutePath = path_1.default.join(rootDir, relPath);
|
|
86
|
+
let content = "";
|
|
87
|
+
if (fs_1.default.existsSync(absolutePath)) {
|
|
88
|
+
const raw = fs_1.default.readFileSync(absolutePath, "utf-8");
|
|
89
|
+
content =
|
|
90
|
+
raw.length > 4000
|
|
91
|
+
? raw.slice(0, 4000) + "\n... (truncated)"
|
|
92
|
+
: raw;
|
|
93
|
+
}
|
|
94
|
+
const fileSymbols = entry.symbols ?? [];
|
|
95
|
+
const response = await llm.chat([{ role: "user", content: fileSummaryPrompt(relPath, fileSymbols, content) }], { model, maxTokens: 1024, temperature: 0 });
|
|
96
|
+
const summary = response.content.trim();
|
|
97
|
+
updated[relPath] = {
|
|
98
|
+
summary,
|
|
99
|
+
contentHash: entry.hash,
|
|
100
|
+
generatedAt: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
// Save after every file so progress is never lost on interruption
|
|
103
|
+
summaryStorage.saveFileSummaries(updated);
|
|
104
|
+
spinner.succeed(chalk_1.default.gray(relPath));
|
|
105
|
+
anyFileSummaryChanged = true;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
spinner.fail(chalk_1.default.red(`${relPath}: ${err.message}`));
|
|
109
|
+
failed++;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
console.log();
|
|
113
|
+
console.log(chalk_1.default.green(`✓ ${toSummarize.length - failed} file summaries saved`) +
|
|
114
|
+
(failed > 0 ? chalk_1.default.red(` (${failed} failed)`) : "") +
|
|
115
|
+
chalk_1.default.gray(" → .vemora/summaries/file-summaries.json"));
|
|
116
|
+
}
|
|
117
|
+
if (options.filesOnly)
|
|
118
|
+
return;
|
|
119
|
+
console.log();
|
|
120
|
+
}
|
|
121
|
+
// ── Project overview ────────────────────────────────────────────────────────
|
|
122
|
+
if (!anyFileSummaryChanged &&
|
|
123
|
+
!options.force &&
|
|
124
|
+
!options.projectOnly &&
|
|
125
|
+
summaryStorage.hasProjectSummary()) {
|
|
126
|
+
console.log(chalk_1.default.green("✓ Project overview is up to date."));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const currentSummaries = summaryStorage.loadFileSummaries();
|
|
130
|
+
const summaryEntries = Object.entries(currentSummaries);
|
|
131
|
+
if (summaryEntries.length === 0) {
|
|
132
|
+
console.log(chalk_1.default.yellow("No file summaries found. Run `vemora summarize` (without --project-only) first."));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const overviewSpinner = (0, ora_1.default)("Generating project overview...").start();
|
|
136
|
+
// Build the file summaries block, sorted and truncated to fit context
|
|
137
|
+
const MAX_SUMMARY_CHARS = 12000;
|
|
138
|
+
let summaryBlock = summaryEntries
|
|
139
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
140
|
+
.map(([file, { summary }]) => `${file}:\n ${summary}`)
|
|
141
|
+
.join("\n\n");
|
|
142
|
+
if (summaryBlock.length > MAX_SUMMARY_CHARS) {
|
|
143
|
+
summaryBlock =
|
|
144
|
+
summaryBlock.slice(0, MAX_SUMMARY_CHARS) + "\n... (truncated)";
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const response = await llm.chat([{ role: "user", content: projectOverviewPrompt(config.projectName, summaryBlock) }], { model, maxTokens: 2048, temperature: 0.1 });
|
|
148
|
+
const overview = response.content.trim();
|
|
149
|
+
const projectSummary = {
|
|
150
|
+
overview,
|
|
151
|
+
generatedAt: new Date().toISOString(),
|
|
152
|
+
};
|
|
153
|
+
summaryStorage.saveProjectSummary(projectSummary);
|
|
154
|
+
overviewSpinner.succeed("Project overview saved" +
|
|
155
|
+
chalk_1.default.gray(" → .vemora/summaries/project-summary.json"));
|
|
156
|
+
// Print a short preview
|
|
157
|
+
console.log();
|
|
158
|
+
const previewLines = overview.split("\n").slice(0, 5);
|
|
159
|
+
for (const line of previewLines) {
|
|
160
|
+
console.log(" " + chalk_1.default.gray(line));
|
|
161
|
+
}
|
|
162
|
+
if (overview.split("\n").length > 5) {
|
|
163
|
+
console.log(chalk_1.default.gray(" … (use `vemora summarize --show` to read in full)"));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
overviewSpinner.fail(`Project overview failed: ${err.message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type TriageType = "bugs" | "security" | "performance";
|
|
2
|
+
export interface TriageOptions {
|
|
3
|
+
/** Audit types to run (default: all three) */
|
|
4
|
+
types?: TriageType[];
|
|
5
|
+
/** Max findings to return, sorted by score (default: 30) */
|
|
6
|
+
topK?: number;
|
|
7
|
+
/** Skip findings with score below this threshold (default: 1) */
|
|
8
|
+
minScore?: number;
|
|
9
|
+
/** Output format */
|
|
10
|
+
output?: "terminal" | "json" | "markdown";
|
|
11
|
+
/** Restrict analysis to files matching this substring */
|
|
12
|
+
file?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TriageMatch {
|
|
15
|
+
heuristic: string;
|
|
16
|
+
category: string;
|
|
17
|
+
severity: "high" | "medium" | "low";
|
|
18
|
+
reason: string;
|
|
19
|
+
/** Absolute 1-based line number within the file */
|
|
20
|
+
line: number;
|
|
21
|
+
/** Trimmed line content (up to 120 chars) */
|
|
22
|
+
snippet: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TriageFinding {
|
|
25
|
+
file: string;
|
|
26
|
+
startLine: number;
|
|
27
|
+
endLine: number;
|
|
28
|
+
symbol?: string;
|
|
29
|
+
score: number;
|
|
30
|
+
matches: TriageMatch[];
|
|
31
|
+
}
|
|
32
|
+
export declare function runTriage(rootDir: string, options?: TriageOptions): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1C,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAmaD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmDf"}
|