@fiale-plus/repo-arch 0.1.0

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/dist/cli.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ export type ParsedArgs = {
3
+ help?: boolean;
4
+ json?: boolean;
5
+ run?: boolean;
6
+ repo?: string;
7
+ out?: string;
8
+ base?: string;
9
+ head?: string;
10
+ model?: string;
11
+ iters?: number;
12
+ minConfidence?: number;
13
+ maxCards?: number;
14
+ noCache?: boolean;
15
+ invalidate?: boolean;
16
+ _: string[];
17
+ };
18
+ export declare function usage(): string;
19
+ export declare function parseArgs(argv: string[]): ParsedArgs;
20
+ export declare function main(argv?: string[]): Promise<{
21
+ ok: boolean;
22
+ help?: boolean;
23
+ error?: string;
24
+ }>;
package/dist/cli.js ADDED
@@ -0,0 +1,410 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { mineHistory } from './git-history.js';
5
+ import { classifyHistory } from './signals.js';
6
+ import { generateCards } from './cards.js';
7
+ import { why, formatWhy } from './why.js';
8
+ import { checkDiff, formatCheckDiff } from './check-diff.js';
9
+ import { resolveRepoRoot, getHeadSha } from './git-history.js';
10
+ import { cachedOrGenerate, invalidateCache } from './cache.js';
11
+ import { setCardStatus, listReviewState, getStatusOverrideMap } from './review.js';
12
+ import { whyContextPack, diffContextPack, cardsContextPack } from './context-pack.js';
13
+ import { checkStaleness, formatStaleness } from './staleness.js';
14
+ import { similar } from './similar.js';
15
+ import { buildIndex } from './embedder.js';
16
+ import { runEval, formatEval } from './eval.js';
17
+ import { generateDataset, formatDataset, prepareTrain, formatTrain } from './training.js';
18
+ export function usage() {
19
+ return `repo-arch
20
+
21
+ Usage:
22
+ repo-arch mine-history [--repo <path>] [--out <file>]
23
+ repo-arch mine [--repo <path>] [--out <file>]
24
+ repo-arch classify [--repo <path>] [--out <file>]
25
+ repo-arch cards [--repo <path>] [--out <file>] [--min-confidence <float>] [--max-cards <number>]
26
+ repo-arch why <file-path> [--repo <path>] [--json]
27
+ repo-arch check-diff [--repo <path>] [--base <ref>] [--head <ref>] [--json]
28
+ repo-arch accept <card-id> [--repo <path>]
29
+ repo-arch reject <card-id> [--repo <path>]
30
+ repo-arch review list [--repo <path>]
31
+ repo-arch cards --invalidate
32
+ repo-arch invalidate-cache [--repo <path>]
33
+ repo-arch check-stale [--repo <path>] [--json]
34
+ repo-arch index [--repo <path>]
35
+ repo-arch similar <query> [--repo <path>] [--json]
36
+ repo-arch eval [--repo <path>] [--json]
37
+ repo-arch dataset [--repo <path>] [--out <file>] [--json]
38
+ repo-arch train [--repo <path>] [--out <dir>] [--model <name>] [--iters <n>] [--run]
39
+
40
+ Options:
41
+ --repo Path to a git repository (default: current directory)
42
+ --out Write output to a file instead of stdout
43
+ --help Show help
44
+ `;
45
+ }
46
+ export function parseArgs(argv) {
47
+ const args = { _: [] };
48
+ for (let i = 0; i < argv.length; i += 1) {
49
+ const token = argv[i];
50
+ if (token === '--help' || token === '-h') {
51
+ args.help = true;
52
+ continue;
53
+ }
54
+ if (token === '--repo') {
55
+ args.repo = argv[++i];
56
+ continue;
57
+ }
58
+ if (token === '--out') {
59
+ args.out = argv[++i];
60
+ continue;
61
+ }
62
+ if (token === '--min-confidence') {
63
+ args.minConfidence = parseFloat(argv[++i]);
64
+ continue;
65
+ }
66
+ if (token === '--max-cards') {
67
+ args.maxCards = parseInt(argv[++i], 10);
68
+ continue;
69
+ }
70
+ if (token === '--base') {
71
+ args.base = argv[++i];
72
+ continue;
73
+ }
74
+ if (token === '--head') {
75
+ args.head = argv[++i];
76
+ continue;
77
+ }
78
+ if (token === '--no-cache') {
79
+ args.noCache = true;
80
+ continue;
81
+ }
82
+ if (token === '--invalidate') {
83
+ args.invalidate = true;
84
+ continue;
85
+ }
86
+ if (token === '--json') {
87
+ args.json = true;
88
+ continue;
89
+ }
90
+ if (token === '--run') {
91
+ args.run = true;
92
+ continue;
93
+ }
94
+ if (token === '--model') {
95
+ args.model = argv[++i];
96
+ continue;
97
+ }
98
+ if (token === '--iters') {
99
+ args.iters = parseInt(argv[++i], 10);
100
+ continue;
101
+ }
102
+ args._.push(token);
103
+ }
104
+ return args;
105
+ }
106
+ export async function main(argv = process.argv.slice(2)) {
107
+ const args = parseArgs(argv);
108
+ const command = args._[0];
109
+ if (args.help || !command) {
110
+ process.stdout.write(usage());
111
+ return { ok: true, help: true };
112
+ }
113
+ if (command === 'mine-history' || command === 'mine') {
114
+ const result = mineHistory({ repoPath: args.repo, outPath: args.out });
115
+ if (!args.out) {
116
+ process.stdout.write(result.jsonl);
117
+ }
118
+ else {
119
+ process.stderr.write(`wrote ${result.count} commits to ${path.resolve(args.out)}${result.cacheHit ? ' (cache hit)' : ''}\n`);
120
+ }
121
+ return { ok: true };
122
+ }
123
+ if (command === 'classify' || command === 'signals') {
124
+ const history = mineHistory({ repoPath: args.repo });
125
+ const classified = classifyHistory(history.records);
126
+ const jsonl = classified.map(c => JSON.stringify(c)).join('\n') + (classified.length ? '\n' : '');
127
+ if (!args.out) {
128
+ process.stdout.write(jsonl);
129
+ }
130
+ else {
131
+ fs.writeFileSync(args.out, jsonl, 'utf8');
132
+ process.stderr.write(`wrote ${classified.length} classified commits to ${path.resolve(args.out)}\n`);
133
+ }
134
+ return { ok: true };
135
+ }
136
+ if (command === 'cards') {
137
+ const repoRoot = resolveRepoRoot(args.repo);
138
+ // Invalidate mode
139
+ if (args.invalidate) {
140
+ const removed = invalidateCache(repoRoot);
141
+ process.stderr.write(`removed ${removed} cached card file${removed !== 1 ? 's' : ''}\n`);
142
+ return { ok: true };
143
+ }
144
+ const generateFn = () => {
145
+ const history = mineHistory({ repoPath: args.repo });
146
+ const classified = classifyHistory(history.records);
147
+ return generateCards(classified, {
148
+ minConfidence: args.minConfidence,
149
+ maxCards: args.maxCards,
150
+ }, getStatusOverrideMap(repoRoot));
151
+ };
152
+ let cards;
153
+ let cacheHit = false;
154
+ let headSha = '';
155
+ if (args.noCache) {
156
+ cards = generateFn();
157
+ headSha = getHeadSha(repoRoot);
158
+ }
159
+ else {
160
+ const result = cachedOrGenerate(repoRoot, generateFn);
161
+ cards = result.cards;
162
+ cacheHit = result.cacheHit;
163
+ headSha = result.headSha;
164
+ }
165
+ const jsonl = cards.map(c => JSON.stringify(c)).join('\n') + (cards.length ? '\n' : '');
166
+ if (args.json) {
167
+ const pack = cardsContextPack('all cards', cards, headSha, cacheHit);
168
+ process.stdout.write(JSON.stringify(pack, null, 2) + '\n');
169
+ }
170
+ else if (!args.out) {
171
+ process.stdout.write(`\n Repo-Arch Cards for ${repoRoot}\n`);
172
+ process.stdout.write(` ${headSha.slice(0, 12)}${cacheHit ? ' (cached)' : ''} | ${cards.length} cards\n\n`);
173
+ for (const card of cards) {
174
+ const icon = card.type === 'churn-hotspot' ? '\u26A1' : card.type === 'repeated-fix' ? '\u274C' : card.type === 'revert-pattern' ? '\u21A9' : card.type === 'test-gap' ? '\u26A0' : card.type === 'rationale-cluster' ? '\uD83D\uDCA1' : '\uD83D\uDD17';
175
+ const statusTag = card.status === 'accepted' ? ' ✅' : card.status === 'rejected' ? ' [rejected]' : '';
176
+ process.stdout.write(` ${icon} ${card.title}${statusTag}\n`);
177
+ process.stdout.write(` [${card.id.slice(0, 10)}] Confidence: ${card.confidence} | ${card.supportingCommits.length} commits\n`);
178
+ process.stdout.write(` ${card.suggestion}\n\n`);
179
+ }
180
+ }
181
+ else {
182
+ fs.writeFileSync(path.resolve(args.out), jsonl, 'utf8');
183
+ process.stderr.write(`wrote ${cards.length} cards to ${path.resolve(args.out)}\n`);
184
+ }
185
+ return { ok: true };
186
+ }
187
+ if (command === 'why') {
188
+ const filePath = args._[1];
189
+ if (!filePath) {
190
+ process.stderr.write(`Error: missing file path\n\nUsage: repo-arch why <file-path> [--repo <path>]\n`);
191
+ process.exitCode = 1;
192
+ return { ok: false, error: 'Missing file path' };
193
+ }
194
+ const result = why(filePath, { repoPath: args.repo });
195
+ if (args.json) {
196
+ const pack = whyContextPack(filePath, result.relatedCards, result.commitCount, result.signalSummary, []);
197
+ process.stdout.write(JSON.stringify(pack, null, 2) + '\n');
198
+ }
199
+ else {
200
+ const output = formatWhy(result);
201
+ if (!args.out) {
202
+ process.stdout.write(output);
203
+ }
204
+ else {
205
+ fs.writeFileSync(path.resolve(args.out), output, 'utf8');
206
+ process.stderr.write(`wrote explanation to ${path.resolve(args.out)}\n`);
207
+ }
208
+ }
209
+ return { ok: true };
210
+ }
211
+ if (command === 'check-diff' || command === 'diff') {
212
+ const result = checkDiff({ repoPath: args.repo, base: args.base, head: args.head });
213
+ if (args.json) {
214
+ const pack = diffContextPack(args.base ?? 'HEAD~1', args.head ?? 'HEAD', result.changedFiles, result.warnings);
215
+ process.stdout.write(JSON.stringify(pack, null, 2) + '\n');
216
+ }
217
+ else {
218
+ const output = formatCheckDiff(result);
219
+ if (!args.out) {
220
+ process.stdout.write(output);
221
+ }
222
+ else {
223
+ fs.writeFileSync(path.resolve(args.out), output, 'utf8');
224
+ process.stderr.write(`wrote diff check to ${path.resolve(args.out)}\n`);
225
+ }
226
+ }
227
+ return { ok: true };
228
+ }
229
+ if (command === 'invalidate-cache') {
230
+ const repoRoot = resolveRepoRoot(args.repo);
231
+ const removed = invalidateCache(repoRoot);
232
+ process.stderr.write(`removed ${removed} cached card file${removed !== 1 ? 's' : ''}\n`);
233
+ return { ok: true };
234
+ }
235
+ if (command === 'check-stale' || command === 'stale') {
236
+ const repoRoot = resolveRepoRoot(args.repo);
237
+ const generateFn = () => {
238
+ const history = mineHistory({ repoPath: args.repo });
239
+ const classified = classifyHistory(history.records);
240
+ return generateCards(classified, {}, getStatusOverrideMap(repoRoot));
241
+ };
242
+ const { cards } = cachedOrGenerate(repoRoot, generateFn);
243
+ const summary = checkStaleness(cards, { repoPath: args.repo });
244
+ if (args.json) {
245
+ process.stdout.write(JSON.stringify(summary, null, 2) + '\n');
246
+ }
247
+ else {
248
+ const output = formatStaleness(summary);
249
+ if (!args.out) {
250
+ process.stdout.write(output);
251
+ }
252
+ else {
253
+ fs.writeFileSync(path.resolve(args.out), output, 'utf8');
254
+ process.stderr.write(`wrote staleness check to ${path.resolve(args.out)}\n`);
255
+ }
256
+ }
257
+ return { ok: true };
258
+ }
259
+ if (command === 'index') {
260
+ const repoRoot = resolveRepoRoot(args.repo);
261
+ const generateFn = () => {
262
+ const history = mineHistory({ repoPath: args.repo });
263
+ const classified = classifyHistory(history.records);
264
+ return generateCards(classified, {}, getStatusOverrideMap(repoRoot));
265
+ };
266
+ const { cards } = cachedOrGenerate(repoRoot, generateFn);
267
+ const entries = cards.map(card => ({
268
+ id: card.id,
269
+ text: `${card.title}. ${card.suggestion} ${card.supportingCommits.map(c => c.subject).join('. ')}`,
270
+ source: 'card',
271
+ metadata: { type: card.type, confidence: String(card.confidence), status: card.status },
272
+ }));
273
+ const index = await buildIndex(entries, { repoPath: args.repo });
274
+ process.stderr.write(`indexed ${index.entries.length} entries at ${index.headSha.slice(0, 12)}\n`);
275
+ if (args.json) {
276
+ process.stdout.write(JSON.stringify({ indexed: index.entries.length, headSha: index.headSha, model: index.model }, null, 2) + '\n');
277
+ }
278
+ return { ok: true };
279
+ }
280
+ if (command === 'similar') {
281
+ const query = args._.slice(1).join(' ');
282
+ if (!query) {
283
+ process.stderr.write('Error: missing query\n');
284
+ process.exitCode = 1;
285
+ return { ok: false, error: 'Missing query' };
286
+ }
287
+ const result = await similar(query, { repoPath: args.repo, topK: args.maxCards ?? 5 });
288
+ if (args.json) {
289
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
290
+ }
291
+ else {
292
+ process.stdout.write(`\n Similar to: "${query}"\n`);
293
+ process.stdout.write(` Index: ${result.indexStats.entries} entries (${result.indexStats.model}) at ${result.indexStats.headSha}\n\n`);
294
+ for (const r of result.results) {
295
+ process.stdout.write(` ${r.score.toFixed(3)} ${r.text.slice(0, 100)}...\n`);
296
+ process.stdout.write(` [${r.id.slice(0, 10)}] ${r.metadata.type}\n\n`);
297
+ }
298
+ }
299
+ return { ok: true };
300
+ }
301
+ if (command === 'eval' || command === 'benchmark') {
302
+ const report = await runEval({ repoPath: args.repo });
303
+ if (args.json) {
304
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
305
+ }
306
+ else {
307
+ process.stdout.write(formatEval(report));
308
+ }
309
+ return { ok: true };
310
+ }
311
+ if (command === 'dataset' || command === 'train-data') {
312
+ const result = generateDataset({ repoPath: args.repo, outPath: args.out });
313
+ if (args.json) {
314
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
315
+ }
316
+ else if (!args.out) {
317
+ process.stdout.write(formatDataset(result));
318
+ }
319
+ return { ok: true };
320
+ }
321
+ if (command === 'train') {
322
+ try {
323
+ const plan = prepareTrain({
324
+ repoPath: args.repo,
325
+ outPath: args.out,
326
+ model: args.model,
327
+ iters: args.iters,
328
+ run: args.run,
329
+ });
330
+ process.stdout.write(formatTrain(plan));
331
+ if (args.run) {
332
+ const { execSync } = await import('node:child_process');
333
+ process.stderr.write(`Running training...\n`);
334
+ try {
335
+ const cmd = plan.command.replace(/\\\n /g, ' ');
336
+ execSync(cmd, { stdio: 'inherit', cwd: resolveRepoRoot(args.repo) });
337
+ }
338
+ catch (e) {
339
+ process.stderr.write(`Training failed. Install mlx-lm: pip install mlx-lm\n`);
340
+ process.exitCode = 1;
341
+ }
342
+ }
343
+ }
344
+ catch (e) {
345
+ process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
346
+ process.exitCode = 1;
347
+ }
348
+ return { ok: true };
349
+ }
350
+ if (command === 'accept') {
351
+ const cardId = args._[1];
352
+ if (!cardId) {
353
+ process.stderr.write('Error: missing card-id\n');
354
+ process.exitCode = 1;
355
+ return { ok: false, error: 'Missing card-id' };
356
+ }
357
+ const repoRoot = resolveRepoRoot(args.repo);
358
+ const entry = setCardStatus(repoRoot, cardId, 'accepted');
359
+ process.stderr.write(`accepted card ${cardId} at ${entry?.updatedAt}\n`);
360
+ return { ok: true };
361
+ }
362
+ if (command === 'reject') {
363
+ const cardId = args._[1];
364
+ if (!cardId) {
365
+ process.stderr.write('Error: missing card-id\n');
366
+ process.exitCode = 1;
367
+ return { ok: false, error: 'Missing card-id' };
368
+ }
369
+ const repoRoot = resolveRepoRoot(args.repo);
370
+ const entry = setCardStatus(repoRoot, cardId, 'rejected');
371
+ process.stderr.write(`rejected card ${cardId} at ${entry?.updatedAt}\n`);
372
+ return { ok: true };
373
+ }
374
+ if (command === 'review') {
375
+ const sub = args._[1];
376
+ if (sub === 'list') {
377
+ const repoRoot = resolveRepoRoot(args.repo);
378
+ const state = listReviewState(repoRoot);
379
+ const entries = Object.entries(state);
380
+ if (entries.length === 0) {
381
+ process.stdout.write(' No reviewed cards.\n');
382
+ }
383
+ else {
384
+ process.stdout.write(` Review state (${entries.length} cards)\n\n`);
385
+ for (const [id, entry] of entries) {
386
+ process.stdout.write(` [${id.slice(0, 10)}] ${entry.status} ${entry.updatedAt.slice(0, 10)}\n`);
387
+ }
388
+ }
389
+ }
390
+ else {
391
+ process.stderr.write(`Usage: repo-arch review list\n`);
392
+ process.exitCode = 1;
393
+ return { ok: false, error: 'Expected subcommand: list' };
394
+ }
395
+ return { ok: true };
396
+ }
397
+ process.stderr.write(`Unknown command: ${command}\n\n${usage()}`);
398
+ process.exitCode = 1;
399
+ return { ok: false, error: `Unknown command: ${command}` };
400
+ }
401
+ if (import.meta.url === `file://${process.argv[1]}`) {
402
+ try {
403
+ main();
404
+ }
405
+ catch (error) {
406
+ process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
407
+ process.exitCode = 1;
408
+ }
409
+ }
410
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { InsightCard, CardStatus } from './cards.js';
2
+ import type { DiffWarning } from './check-diff.js';
3
+ /** A protocol-neutral response that any agent harness can consume */
4
+ export type ContextPack = {
5
+ /** What was asked — file path, diff range, or natural-language query */
6
+ query: string;
7
+ /** Human-readable summary of the answer */
8
+ answerSummary: string;
9
+ /** Relevant cards, sorted by relevance/confidence */
10
+ cards: ContextPackCard[];
11
+ /** Non-blocking caveats, limitations, or warnings about this response */
12
+ warnings: string[];
13
+ };
14
+ export type ContextPackCard = {
15
+ id: string;
16
+ type: string;
17
+ status: CardStatus;
18
+ confidence: number;
19
+ title: string;
20
+ supportingCommits: {
21
+ sha: string;
22
+ subject: string;
23
+ }[];
24
+ affectedFiles: string[];
25
+ suggestion: string;
26
+ evidence: {
27
+ type: string;
28
+ id?: string;
29
+ title?: string;
30
+ sha?: string;
31
+ }[];
32
+ };
33
+ export declare function cardToContextCard(card: InsightCard): ContextPackCard;
34
+ export declare function whyContextPack(filePath: string, cards: InsightCard[], commitCount: number, signalSummary: {
35
+ type: string;
36
+ label: string;
37
+ count: number;
38
+ }[], warnings: string[]): ContextPack;
39
+ export declare function diffContextPack(baseRef: string, headRef: string, changedFiles: string[], diffWarnings: DiffWarning[]): ContextPack;
40
+ export declare function cardsContextPack(filterDescription: string, cards: InsightCard[], headSha: string, cacheHit: boolean): ContextPack;
@@ -0,0 +1,49 @@
1
+ export function cardToContextCard(card) {
2
+ return {
3
+ id: card.id,
4
+ type: card.type,
5
+ status: card.status,
6
+ confidence: card.confidence,
7
+ title: card.title,
8
+ supportingCommits: card.supportingCommits,
9
+ affectedFiles: card.affectedFiles,
10
+ suggestion: card.suggestion,
11
+ evidence: card.supportingCommits.map(c => ({
12
+ type: 'commit',
13
+ sha: c.sha,
14
+ title: c.subject,
15
+ })),
16
+ };
17
+ }
18
+ export function whyContextPack(filePath, cards, commitCount, signalSummary, warnings) {
19
+ const parts = [`${commitCount} commit${commitCount !== 1 ? 's' : ''}`];
20
+ for (const sig of signalSummary) {
21
+ parts.push(`${sig.count} ${sig.type}`);
22
+ }
23
+ return {
24
+ query: filePath,
25
+ answerSummary: parts.join(' · '),
26
+ cards: cards.map(cardToContextCard),
27
+ warnings,
28
+ };
29
+ }
30
+ export function diffContextPack(baseRef, headRef, changedFiles, diffWarnings) {
31
+ const summary = diffWarnings.length === 0
32
+ ? `No historical warnings for this diff (${changedFiles.length} file${changedFiles.length !== 1 ? 's' : ''} changed)`
33
+ : `${diffWarnings.length} warning${diffWarnings.length !== 1 ? 's' : ''} across ${changedFiles.length} changed file${changedFiles.length !== 1 ? 's' : ''}`;
34
+ return {
35
+ query: `diff ${baseRef}..${headRef}`,
36
+ answerSummary: summary,
37
+ cards: [],
38
+ warnings: diffWarnings.map(w => `[${w.severity.toUpperCase()}] ${w.filePath}: ${w.message}`),
39
+ };
40
+ }
41
+ export function cardsContextPack(filterDescription, cards, headSha, cacheHit) {
42
+ return {
43
+ query: filterDescription,
44
+ answerSummary: `${cards.length} card${cards.length !== 1 ? 's' : ''} at ${headSha.slice(0, 12)}${cacheHit ? ' (cached)' : ''}`,
45
+ cards: cards.map(cardToContextCard),
46
+ warnings: cacheHit ? [] : ['Cards were generated fresh (not from cache)'],
47
+ };
48
+ }
49
+ //# sourceMappingURL=context-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.js","sourceRoot":"","sources":["../src/context-pack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export declare const DEFAULT_MODEL = "Xenova/all-MiniLM-L6-v2";
2
+ export declare const EMBEDDING_DIM = 384;
3
+ export type EmbedderConfig = {
4
+ model?: string;
5
+ };
6
+ export type VectorEntry = {
7
+ id: string;
8
+ text: string;
9
+ embedding: number[];
10
+ source: 'card' | 'commit';
11
+ metadata: Record<string, string>;
12
+ };
13
+ export type VectorIndex = {
14
+ model: string;
15
+ dim: number;
16
+ headSha: string;
17
+ entries: VectorEntry[];
18
+ createdAt: string;
19
+ };
20
+ export declare function loadExtractor(config?: EmbedderConfig): Promise<any>;
21
+ export declare function embed(text: string, config?: EmbedderConfig): Promise<number[]>;
22
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
23
+ export declare function loadIndex(repoRoot: string): VectorIndex | null;
24
+ export declare function saveIndex(repoRoot: string, index: VectorIndex): void;
25
+ export declare function buildIndex(entries: {
26
+ id: string;
27
+ text: string;
28
+ source: 'card' | 'commit';
29
+ metadata: Record<string, string>;
30
+ }[], options?: {
31
+ repoPath?: string;
32
+ model?: string;
33
+ }): Promise<VectorIndex>;
34
+ export declare function searchIndex(index: VectorIndex, queryEmbedding: number[], topK?: number): {
35
+ entry: VectorEntry;
36
+ score: number;
37
+ }[];