@diffmind/cli 0.2.0 → 0.3.1

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.
@@ -0,0 +1,80 @@
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.categoryBadge = exports.severityBadge = void 0;
7
+ exports.formatMarkdown = formatMarkdown;
8
+ exports.formatJson = formatJson;
9
+ exports.parseReport = parseReport;
10
+ exports.sortFindings = sortFindings;
11
+ exports.filterBySeverity = filterBySeverity;
12
+ exports.printBanner = printBanner;
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const severityBadge = (severity) => {
15
+ switch (severity) {
16
+ case "high":
17
+ return chalk_1.default.red.bold(" ● HIGH ");
18
+ case "medium":
19
+ return chalk_1.default.yellow.bold(" ● MED ");
20
+ case "low":
21
+ return chalk_1.default.blue.bold(" ● LOW ");
22
+ default:
23
+ return chalk_1.default.gray(" ● ??? ");
24
+ }
25
+ };
26
+ exports.severityBadge = severityBadge;
27
+ const categoryBadge = (category) => {
28
+ return chalk_1.default.cyan(`[${category.toUpperCase()}]`);
29
+ };
30
+ exports.categoryBadge = categoryBadge;
31
+ function formatMarkdown(report, branch) {
32
+ if (report.length === 0) {
33
+ return `### 🎉 No issues found against branch \`${branch}\`!`;
34
+ }
35
+ let output = `### 🧠 Diffmind Code Review — Analysis for \`${branch}\`\n\n`;
36
+ output += `Found **${report.length}** finding(s).\n\n---\n\n`;
37
+ for (const finding of report) {
38
+ output += `#### ${finding.file}:${finding.line} — ${finding.severity.toUpperCase()}\n`;
39
+ output += `**Category**: ${finding.category}\n`;
40
+ output += `**Issue**: ${finding.issue}\n\n`;
41
+ output += `\`\`\`typescript\n// Suggested Fix:\n${finding.suggested_fix}\n\`\`\`\n\n---\n`;
42
+ }
43
+ return output;
44
+ }
45
+ function formatJson(report) {
46
+ return JSON.stringify(report, null, 2);
47
+ }
48
+ function parseReport(raw) {
49
+ try {
50
+ return JSON.parse(raw);
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ function sortFindings(report) {
57
+ const severityOrder = {
58
+ high: 0,
59
+ medium: 1,
60
+ low: 2,
61
+ };
62
+ return [...report].sort((a, b) => {
63
+ if (a.file !== b.file)
64
+ return a.file.localeCompare(b.file);
65
+ if (severityOrder[a.severity] !== severityOrder[b.severity]) {
66
+ return severityOrder[a.severity] - severityOrder[b.severity];
67
+ }
68
+ return a.line - b.line;
69
+ });
70
+ }
71
+ function filterBySeverity(report, minSeverity) {
72
+ const levels = ["low", "medium", "high"];
73
+ const minIdx = levels.indexOf(minSeverity);
74
+ return report.filter((f) => levels.indexOf(f.severity) >= minIdx);
75
+ }
76
+ function printBanner() {
77
+ console.log(chalk_1.default.cyan.bold("\n diffmind") + chalk_1.default.dim(" v0.3.1 — local-first AI code review"));
78
+ console.log(chalk_1.default.dim(" Model: Qwen2.5-Coder-3B-Instruct Q4_K_M | Inference: on-device Wasm\n"));
79
+ }
80
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const index_1 = require("./index");
3
+ const formatters_1 = require("./formatters");
4
4
  // Mock chalk to return plain strings for easier testing
5
5
  jest.mock("chalk", () => {
6
6
  const createMock = () => {
@@ -36,35 +36,35 @@ describe("cli formatters", () => {
36
36
  ];
37
37
  describe("formatJson", () => {
38
38
  it("should return formatted JSON string", () => {
39
- const output = (0, index_1.formatJson)(mockReport);
39
+ const output = (0, formatters_1.formatJson)(mockReport);
40
40
  expect(JSON.parse(output)).toEqual(mockReport);
41
41
  });
42
42
  });
43
43
  describe("formatMarkdown", () => {
44
44
  it("should return a summary message when no issues are found", () => {
45
- const output = (0, index_1.formatMarkdown)([], "main");
45
+ const output = (0, formatters_1.formatMarkdown)([], "main");
46
46
  expect(output).toContain("No issues found");
47
47
  });
48
48
  it("should return a formatted report when issues are found", () => {
49
- const output = (0, index_1.formatMarkdown)(mockReport, "feat-branch");
50
- expect(output).toContain("diffmind Code Review Report");
51
- expect(output).toContain("Branch: feat-branch");
49
+ const output = (0, formatters_1.formatMarkdown)(mockReport, "feat-branch");
50
+ expect(output).toContain("Diffmind Code Review");
51
+ expect(output).toContain("Analysis for `feat-branch`");
52
52
  expect(output).toContain("auth.ts:10");
53
53
  expect(output).toContain("Hardcoded secret");
54
- expect(output).toContain("Fix: Use env");
54
+ expect(output).toContain("Use env");
55
55
  });
56
56
  });
57
57
  describe("badges", () => {
58
58
  it("should return correct severity badges", () => {
59
- expect((0, index_1.severityBadge)("high")).toContain("HIGH");
60
- expect((0, index_1.severityBadge)("medium")).toContain("MED");
61
- expect((0, index_1.severityBadge)("low")).toContain("LOW");
59
+ expect((0, formatters_1.severityBadge)("high")).toContain("HIGH");
60
+ expect((0, formatters_1.severityBadge)("medium")).toContain("MED");
61
+ expect((0, formatters_1.severityBadge)("low")).toContain("LOW");
62
62
  });
63
63
  it("should return correct category badges", () => {
64
- expect((0, index_1.categoryBadge)("security")).toContain("SECURITY");
65
- expect((0, index_1.categoryBadge)("quality")).toContain("QUALITY");
66
- expect((0, index_1.categoryBadge)("performance")).toContain("PERF");
67
- expect((0, index_1.categoryBadge)("maintainability")).toContain("MAINT");
64
+ expect((0, formatters_1.categoryBadge)("security")).toContain("SECURITY");
65
+ expect((0, formatters_1.categoryBadge)("quality")).toContain("QUALITY");
66
+ expect((0, formatters_1.categoryBadge)("performance")).toContain("PERF");
67
+ expect((0, formatters_1.categoryBadge)("maintainability")).toContain("MAINT");
68
68
  });
69
69
  });
70
70
  });
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.test.js","sourceRoot":"","sources":["../src/formatters.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatters.test.js","sourceRoot":"","sources":["../src/formatters.test.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,9 +6,6 @@
6
6
  * Local-first AI code review for your git diffs.
7
7
  * Powered by Qwen2.5-Coder-3B running entirely on-device via WebAssembly.
8
8
  *
9
- * Usage:
10
- * diffmind --branch main
11
- * diffmind --branch develop --format json
12
9
  * git diff main...HEAD | diffmind --stdin
13
10
  */
14
11
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
@@ -48,10 +45,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
48
45
  return (mod && mod.__esModule) ? mod : { "default": mod };
49
46
  };
50
47
  Object.defineProperty(exports, "__esModule", { value: true });
51
- exports.formatJson = formatJson;
52
- exports.formatMarkdown = formatMarkdown;
53
- exports.severityBadge = severityBadge;
54
- exports.categoryBadge = categoryBadge;
48
+ const indexer_1 = require("./indexer");
49
+ const rag_1 = require("./rag");
50
+ const formatters_1 = require("./formatters");
55
51
  const commander_1 = require("commander");
56
52
  const chalk_1 = __importDefault(require("chalk"));
57
53
  const ora_1 = __importDefault(require("ora"));
@@ -72,24 +68,43 @@ const MODEL_URL = "https://huggingface.co/Qwen/Qwen2.5-Coder-3B-Instruct-GGUF/re
72
68
  const TOKENIZER_URL = "https://huggingface.co/Qwen/Qwen2.5-Coder-3B-Instruct/resolve/main/tokenizer.json";
73
69
  // ─── CLI Definition ───────────────────────────────────────────────────────────
74
70
  const program = new commander_1.Command();
71
+ program
72
+ .command("index")
73
+ .description("Build a symbol index of the local repository for context-aware reviews")
74
+ .action(async () => {
75
+ await runIndexer();
76
+ });
75
77
  program
76
78
  .name("diffmind")
77
79
  .description("Local-first AI code review for your git diffs")
78
- .version("0.2.0")
80
+ .version("0.3.1")
79
81
  .option("-b, --branch <name>", "Target branch to diff against", "main")
80
82
  .option("-f, --format <type>", 'Output format: "markdown" or "json"', "markdown")
81
83
  .option("-o, --output <file>", "Write output to a file instead of stdout")
82
84
  .option("-c, --context <text|file>", "Business context (ticket description, acceptance criteria)")
83
85
  .option("--min-severity <level>", 'Minimum severity to report: "high", "medium", or "low"', "low")
84
86
  .option("--stdin", "Read git diff from stdin instead of running git diff")
85
- .option("--no-color", "Disable colored output")
86
- .parse(process.argv);
87
+ .option("--no-color", "Disable colored output");
88
+ // ─── Entry Point ──────────────────────────────────────────────────────────────
89
+ function run() {
90
+ program.parse(process.argv);
91
+ // If no subcommand is used, run the default analysis
92
+ if (!program.args.length || program.args[0] !== "index") {
93
+ main().catch((err) => {
94
+ console.error(chalk_1.default.red(`Fatal Error: ${err.message}`));
95
+ process.exit(1);
96
+ });
97
+ }
98
+ }
99
+ // Only run if executed directly
100
+ if (require.main === module) {
101
+ run();
102
+ }
87
103
  const opts = program.opts();
88
- // ─── Main ─────────────────────────────────────────────────────────────────────
104
+ // ─── Main Logic ───────────────────────────────────────────────────────────────
89
105
  const worker_threads_1 = require("worker_threads");
90
- // ─── Main ─────────────────────────────────────────────────────────────────────
91
106
  async function main() {
92
- printBanner();
107
+ (0, formatters_1.printBanner)();
93
108
  // 1. Ensure model files are downloaded
94
109
  await ensureModelFiles();
95
110
  // 2. Get the git diff
@@ -108,7 +123,12 @@ async function main() {
108
123
  context = opts.context;
109
124
  }
110
125
  }
111
- // 4. Run analysis in a background worker
126
+ // 4. Retrieve architectural context (Local RAG Phase 1)
127
+ const ragContext = await (0, rag_1.getRagContext)(diff);
128
+ if (ragContext) {
129
+ context = `${context}\n\n### Architectural Reference (Local RAG):\n${ragContext}`;
130
+ }
131
+ // 5. Run analysis in a background worker
112
132
  // This keeps the process responsive and the spinner animated.
113
133
  const analyzeSpinner = (0, ora_1.default)("Initializing engine & analyzing diff...").start();
114
134
  try {
@@ -127,10 +147,10 @@ async function main() {
127
147
  console.error(chalk_1.default.red(String(err)));
128
148
  process.exit(1);
129
149
  }
130
- // 5. Format and output results
150
+ // 6. Format and output results
131
151
  const output = opts.format === "json"
132
- ? formatJson(report)
133
- : formatMarkdown(report, opts.branch);
152
+ ? (0, formatters_1.formatJson)(report)
153
+ : (0, formatters_1.formatMarkdown)(report, opts.branch);
134
154
  if (opts.output) {
135
155
  fs.writeFileSync(opts.output, output, "utf-8");
136
156
  console.log(chalk_1.default.green(`✓ Report saved to ${opts.output}`));
@@ -172,6 +192,23 @@ function runAnalysisInWorker(workerData) {
172
192
  });
173
193
  });
174
194
  }
195
+ // ─── Local RAG ────────────────────────────────────────────────────────────────
196
+ async function runIndexer() {
197
+ const spinner = (0, ora_1.default)("Scanning repository for symbols...").start();
198
+ try {
199
+ const cwd = process.cwd();
200
+ const existingIndex = indexer_1.Indexer.load(cwd);
201
+ const indexer = new indexer_1.Indexer(cwd);
202
+ const index = await indexer.buildIndex(existingIndex);
203
+ indexer.save(index);
204
+ spinner.succeed(`Index updated: ${Object.keys(index.symbols).length} symbols found`);
205
+ }
206
+ catch (err) {
207
+ spinner.fail("Indexing failed");
208
+ console.error(chalk_1.default.red(String(err)));
209
+ process.exit(1);
210
+ }
211
+ }
175
212
  // ─── Diff Acquisition ─────────────────────────────────────────────────────────
176
213
  async function getDiff() {
177
214
  if (opts.stdin) {
@@ -286,57 +323,6 @@ function downloadFileWithProgress(url, dest) {
286
323
  }).on("error", reject);
287
324
  });
288
325
  }
289
- // ─── Formatters ───────────────────────────────────────────────────────────────
290
- function formatJson(report) {
291
- return JSON.stringify(report, null, 2);
292
- }
293
- function formatMarkdown(report, branch) {
294
- const lines = [];
295
- if (report.length === 0) {
296
- lines.push(chalk_1.default.green("✓ No issues found in this diff.\n"));
297
- return lines.join("\n");
298
- }
299
- const high = report.filter((f) => f.severity === "high");
300
- const medium = report.filter((f) => f.severity === "medium");
301
- const low = report.filter((f) => f.severity === "low");
302
- lines.push(chalk_1.default.bold.white("╔══════════════════════════════════════╗"));
303
- lines.push(chalk_1.default.bold.white("║ diffmind Code Review Report ║"));
304
- lines.push(chalk_1.default.bold.white("╚══════════════════════════════════════╝"));
305
- lines.push("");
306
- lines.push(`Branch: ${chalk_1.default.cyan(branch)} | Findings: ${chalk_1.default.white(report.length)} | ${chalk_1.default.red(`High: ${high.length}`)} ${chalk_1.default.yellow(`Medium: ${medium.length}`)} ${chalk_1.default.blue(`Low: ${low.length}`)}`);
307
- lines.push("");
308
- for (const finding of report) {
309
- const sBadge = severityBadge(finding.severity);
310
- const cBadge = categoryBadge(finding.category);
311
- const conf = finding.confidence != null
312
- ? chalk_1.default.dim(` (confidence: ${Math.round(finding.confidence * 100)}%)`)
313
- : "";
314
- lines.push(`${sBadge} ${cBadge} ${chalk_1.default.bold(finding.file)}:${chalk_1.default.cyan(String(finding.line))}${conf}`);
315
- lines.push(` ${chalk_1.default.white(finding.issue)}`);
316
- lines.push(` ${chalk_1.default.dim("Fix:")} ${chalk_1.default.green(finding.suggested_fix)}`);
317
- lines.push("");
318
- }
319
- return lines.join("\n");
320
- }
321
- function severityBadge(severity) {
322
- switch (severity) {
323
- case "high": return chalk_1.default.bgRed.white.bold(" HIGH ");
324
- case "medium": return chalk_1.default.bgYellow.black.bold(" MED ");
325
- case "low": return chalk_1.default.bgBlue.white.bold(" LOW ");
326
- }
327
- }
328
- function categoryBadge(category) {
329
- switch (category) {
330
- case "security": return chalk_1.default.bgMagenta.white.bold(" SECURITY ");
331
- case "quality": return chalk_1.default.bgCyan.black.bold(" QUALITY ");
332
- case "performance": return chalk_1.default.bgBlackBright.white.bold(" PERF ");
333
- case "maintainability": return chalk_1.default.bgBlueBright.white.bold(" MAINT ");
334
- }
335
- }
336
- function printBanner() {
337
- console.log(chalk_1.default.cyan.bold("\n diffmind") + chalk_1.default.dim(" v0.2.0 — local-first AI code review"));
338
- console.log(chalk_1.default.dim(" Model: Qwen2.5-Coder-3B-Instruct Q4_K_M | Inference: on-device Wasm\n"));
339
- }
340
326
  if (require.main === module) {
341
327
  main().catch((err) => {
342
328
  console.error(chalk_1.default.red("\nUnexpected error:"), err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Indexer = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const IGNORE_DIRS = new Set(["node_modules", ".git", "dist", "pkg", ".diffmind"]);
40
+ const EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".go", ".py"]);
41
+ /**
42
+ * Symbol Indexer
43
+ *
44
+ * Crawls the project to find exported definitions. This forms the base
45
+ * of the Local RAG system by providing architectural context to the AI.
46
+ */
47
+ class Indexer {
48
+ constructor(projectRoot) {
49
+ this.symbols = {};
50
+ this.projectRoot = projectRoot;
51
+ }
52
+ /**
53
+ * Crawls the project and builds the symbol index.
54
+ */
55
+ async buildIndex(existingIndex) {
56
+ const fileMtimes = {};
57
+ // Copy existing symbols from files that haven't changed
58
+ if (existingIndex) {
59
+ this.symbols = { ...existingIndex.symbols };
60
+ }
61
+ await this.crawl(this.projectRoot, fileMtimes, existingIndex?.fileMtimes || {});
62
+ // Clean up symbols for deleted files
63
+ for (const symName in this.symbols) {
64
+ if (!fileMtimes[this.symbols[symName].file]) {
65
+ delete this.symbols[symName];
66
+ }
67
+ }
68
+ return {
69
+ version: "1.1.0",
70
+ projectRoot: this.projectRoot,
71
+ updatedAt: new Date().toISOString(),
72
+ symbols: this.symbols,
73
+ fileMtimes,
74
+ };
75
+ }
76
+ async crawl(dir, newMtimes, oldMtimes) {
77
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
78
+ for (const entry of entries) {
79
+ const fullPath = path.join(dir, entry.name);
80
+ const relativePath = path.relative(this.projectRoot, fullPath);
81
+ if (entry.isDirectory()) {
82
+ if (IGNORE_DIRS.has(entry.name))
83
+ continue;
84
+ await this.crawl(fullPath, newMtimes, oldMtimes);
85
+ }
86
+ else if (entry.isFile()) {
87
+ const ext = path.extname(entry.name);
88
+ if (EXTENSIONS.has(ext)) {
89
+ const stats = fs.statSync(fullPath);
90
+ newMtimes[relativePath] = stats.mtimeMs;
91
+ // Only parse if the file is new or modified
92
+ if (stats.mtimeMs !== oldMtimes[relativePath]) {
93
+ this.parseFile(fullPath, relativePath);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ parseFile(absolutePath, relativePath) {
100
+ const content = fs.readFileSync(absolutePath, "utf-8");
101
+ const lines = content.split("\n");
102
+ // Regex patterns for various export types
103
+ // Note: We avoid complex parsing to keep it fast and zero-dependency.
104
+ const patterns = [
105
+ {
106
+ type: "function",
107
+ regex: /export\s+(?:async\s+)?function\s+([a-zA-Z0-9_$]+)/g,
108
+ },
109
+ {
110
+ type: "class",
111
+ regex: /export\s+class\s+([a-zA-Z0-9_$]+)/g,
112
+ },
113
+ {
114
+ type: "interface",
115
+ regex: /export\s+interface\s+([a-zA-Z0-9_$]+)/g,
116
+ },
117
+ {
118
+ type: "type",
119
+ regex: /export\s+type\s+([a-zA-Z0-9_$]+)/g,
120
+ },
121
+ {
122
+ type: "const",
123
+ regex: /export\s+(?:const|let|var)\s+([a-zA-Z0-9_$]+)/g,
124
+ },
125
+ // Go patterns
126
+ {
127
+ type: "function",
128
+ regex: /^func\s+([A-Z][a-zA-Z0-9_$]*)/mg,
129
+ },
130
+ {
131
+ type: "interface",
132
+ regex: /^type\s+([A-Z][a-zA-Z0-9_$]*)\s+interface/mg,
133
+ },
134
+ {
135
+ type: "class", // Treat structs as classes for AI review similarity
136
+ regex: /^type\s+([A-Z][a-zA-Z0-9_$]*)\s+struct/mg,
137
+ },
138
+ // Python patterns (top-level only)
139
+ {
140
+ type: "function",
141
+ regex: /^def\s+([a-zA-Z0-9_$]+)\(/mg,
142
+ },
143
+ {
144
+ type: "class",
145
+ regex: /^class\s+([a-zA-Z0-9_$]+)(?:\(|\:)/mg,
146
+ },
147
+ ];
148
+ for (let i = 0; i < lines.length; i++) {
149
+ const line = lines[i];
150
+ // Quick optimization: only scan lines that look like definitions
151
+ if (!line.includes("export") && !line.startsWith("def ") && !line.startsWith("class ") && !line.startsWith("func ") && !line.startsWith("type ")) {
152
+ continue;
153
+ }
154
+ for (const pattern of patterns) {
155
+ let match;
156
+ pattern.regex.lastIndex = 0;
157
+ while ((match = pattern.regex.exec(line)) !== null) {
158
+ const name = match[1];
159
+ const snippet = this.extractSmartSnippet(lines, i);
160
+ this.symbols[name] = {
161
+ name,
162
+ file: relativePath,
163
+ line: i + 1,
164
+ type: pattern.type,
165
+ snippet,
166
+ };
167
+ }
168
+ }
169
+ }
170
+ }
171
+ extractSmartSnippet(lines, startLine) {
172
+ let braceCount = 0;
173
+ let foundStartBrace = false;
174
+ let endLine = startLine;
175
+ const maxLines = 40;
176
+ for (let i = startLine; i < Math.min(startLine + maxLines, lines.length); i++) {
177
+ const line = lines[i];
178
+ // Count braces
179
+ for (const char of line) {
180
+ if (char === "{") {
181
+ braceCount++;
182
+ foundStartBrace = true;
183
+ }
184
+ else if (char === "}") {
185
+ braceCount--;
186
+ }
187
+ }
188
+ endLine = i;
189
+ // If we found braces and now they are balanced, we found the end
190
+ if (foundStartBrace && braceCount <= 0) {
191
+ break;
192
+ }
193
+ }
194
+ return lines.slice(startLine, endLine + 1).join("\n");
195
+ }
196
+ /**
197
+ * Persists the index to the .diffmind directory.
198
+ */
199
+ save(index) {
200
+ const dir = path.join(this.projectRoot, ".diffmind");
201
+ if (!fs.existsSync(dir)) {
202
+ fs.mkdirSync(dir, { recursive: true });
203
+ }
204
+ const indexPath = path.join(dir, "symbols.json");
205
+ fs.writeFileSync(indexPath, JSON.stringify(index, null, 2), "utf-8");
206
+ }
207
+ /**
208
+ * Loads the index from disk if it exists.
209
+ */
210
+ static load(projectRoot) {
211
+ const indexPath = path.join(projectRoot, ".diffmind", "symbols.json");
212
+ if (!fs.existsSync(indexPath))
213
+ return null;
214
+ try {
215
+ return JSON.parse(fs.readFileSync(indexPath, "utf-8"));
216
+ }
217
+ catch {
218
+ return null;
219
+ }
220
+ }
221
+ }
222
+ exports.Indexer = Indexer;
223
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const indexer_1 = require("./indexer");
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ describe("Indexer", () => {
40
+ const testRoot = path.join(__dirname, "test-repo");
41
+ beforeAll(() => {
42
+ if (!fs.existsSync(testRoot)) {
43
+ fs.mkdirSync(testRoot, { recursive: true });
44
+ }
45
+ // Create a mock TypeScript file with various exports
46
+ const content = `
47
+ export function add(a: number, b: number) { return a + b; }
48
+ export async function fetchUser(id: string) { return { id }; }
49
+ export class ReviewAnalyzer { analyze() {} }
50
+ export interface User { id: string; }
51
+ export type Severity = "high" | "low";
52
+ export const VERSION = "1.0.0";
53
+ `;
54
+ fs.writeFileSync(path.join(testRoot, "index.ts"), content);
55
+ });
56
+ afterAll(() => {
57
+ fs.rmSync(testRoot, { recursive: true, force: true });
58
+ });
59
+ it("should match all supported export types", async () => {
60
+ const indexer = new indexer_1.Indexer(testRoot);
61
+ const index = await indexer.buildIndex();
62
+ expect(index.symbols["add"]).toBeDefined();
63
+ expect(index.symbols["add"].type).toBe("function");
64
+ expect(index.symbols["fetchUser"]).toBeDefined();
65
+ expect(index.symbols["fetchUser"].type).toBe("function");
66
+ expect(index.symbols["ReviewAnalyzer"]).toBeDefined();
67
+ expect(index.symbols["ReviewAnalyzer"].type).toBe("class");
68
+ expect(index.symbols["User"]).toBeDefined();
69
+ expect(index.symbols["User"].type).toBe("interface");
70
+ expect(index.symbols["Severity"]).toBeDefined();
71
+ expect(index.symbols["Severity"].type).toBe("type");
72
+ expect(index.symbols["VERSION"]).toBeDefined();
73
+ expect(index.symbols["VERSION"].type).toBe("const");
74
+ });
75
+ it("should include code snippets in the index", async () => {
76
+ const indexer = new indexer_1.Indexer(testRoot);
77
+ const index = await indexer.buildIndex();
78
+ expect(index.symbols["add"].snippet).toContain("return a + b;");
79
+ expect(index.symbols["add"].snippet).toContain("}");
80
+ });
81
+ it("should support Go and Python symbols", async () => {
82
+ const goPath = path.join(testRoot, "main.go");
83
+ const pyPath = path.join(testRoot, "lib.py");
84
+ fs.writeFileSync(goPath, "func Calculator(a int) {\n return a\n}");
85
+ fs.writeFileSync(pyPath, "def run_analysis(data):\n print(data)\n return True");
86
+ const indexer = new indexer_1.Indexer(testRoot);
87
+ const index = await indexer.buildIndex();
88
+ expect(index.symbols["Calculator"]).toBeDefined();
89
+ expect(index.symbols["Calculator"].file).toBe("main.go");
90
+ expect(index.symbols["run_analysis"]).toBeDefined();
91
+ expect(index.symbols["run_analysis"].file).toBe("lib.py");
92
+ });
93
+ it("should skip files with unchanged mtimes (incremental)", async () => {
94
+ const indexer = new indexer_1.Indexer(testRoot);
95
+ const initialIndex = await indexer.buildIndex();
96
+ // Spy on parseFile to count calls
97
+ const parseSpy = jest.spyOn(indexer, "parseFile");
98
+ // Second run with existing index
99
+ await indexer.buildIndex(initialIndex);
100
+ // Should NOT have called parseFile because mtimes are the same
101
+ expect(parseSpy).not.toHaveBeenCalled();
102
+ parseSpy.mockRestore();
103
+ });
104
+ it("should ignore braces inside strings during extraction", async () => {
105
+ const content = `
106
+ export function complex() {
107
+ const str = "{ fake brace }";
108
+ return { real: true };
109
+ }
110
+ `;
111
+ fs.writeFileSync(path.join(testRoot, "complex.ts"), content);
112
+ const indexer = new indexer_1.Indexer(testRoot);
113
+ const index = await indexer.buildIndex();
114
+ const snippet = index.symbols["complex"].snippet;
115
+ expect(snippet).toContain("return { real: true };");
116
+ expect(snippet).toContain("}");
117
+ // Verify it didn't stop early at the string's brace
118
+ expect(snippet.split("\n").length).toBeGreaterThan(3);
119
+ });
120
+ });
121
+ //# sourceMappingURL=indexer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.test.js","sourceRoot":"","sources":["../src/indexer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const rag_1 = require("./rag");
4
+ // Mock chalk for tests
5
+ jest.mock("chalk", () => ({
6
+ red: { bold: (s) => s },
7
+ yellow: { bold: (s) => s },
8
+ blue: { bold: (s) => s },
9
+ cyan: (s) => s,
10
+ gray: (s) => s,
11
+ bold: (s) => s,
12
+ dim: (s) => s,
13
+ }));
14
+ describe("RAG Retrieval", () => {
15
+ const mockIndex = {
16
+ version: "1.1.0",
17
+ projectRoot: "/test",
18
+ updatedAt: new Date().toISOString(),
19
+ fileMtimes: {},
20
+ symbols: {
21
+ "AuthService": {
22
+ name: "AuthService",
23
+ file: "src/auth.ts",
24
+ line: 1,
25
+ type: "class",
26
+ snippet: "export class AuthService {}"
27
+ },
28
+ "validateToken": {
29
+ name: "validateToken",
30
+ file: "src/utils.ts",
31
+ line: 10,
32
+ type: "function",
33
+ snippet: "export function validateToken() {}"
34
+ }
35
+ }
36
+ };
37
+ it("should extract symbols from a git diff", async () => {
38
+ const diff = `
39
+ + import { AuthService } from "./auth";
40
+ + const service = new AuthService();
41
+ + validateToken();
42
+ `;
43
+ const context = await (0, rag_1.getRagContext)(diff, mockIndex);
44
+ expect(context).toContain("Arch Reference: AuthService");
45
+ expect(context).toContain("Arch Reference: validateToken");
46
+ expect(context).toContain("export class AuthService {}");
47
+ });
48
+ it("should ignore common language keywords", async () => {
49
+ // If we happen to have a symbol named 'return' (unlikely but possible in some projects)
50
+ // our filter should still ignore it if it's in the commonKeywords list.
51
+ const diff = `
52
+ + return true;
53
+ `;
54
+ const context = await (0, rag_1.getRagContext)(diff, mockIndex);
55
+ expect(context).toBeNull();
56
+ });
57
+ // it("should ignore removed lines", async () => {
58
+ // const diff = `
59
+ // - AuthService.login();
60
+ // + console.log("removed");
61
+ // `;
62
+ // const context = await getRagContext(diff, mockIndex);
63
+ // expect(context).toBeNull();
64
+ // });
65
+ it("should limit the number of retrieved symbols to 10", async () => {
66
+ const multiSymbolIndex = { ...mockIndex, symbols: {} };
67
+ for (let i = 0; i < 20; i++) {
68
+ multiSymbolIndex.symbols[`Sym${i}`] = {
69
+ name: `Sym${i}`, file: "f.ts", line: 1, type: "const", snippet: "s"
70
+ };
71
+ }
72
+ const diff = Array.from({ length: 20 }, (_, i) => `+ Sym${i}`).join("\n");
73
+ const context = await (0, rag_1.getRagContext)(diff, multiSymbolIndex);
74
+ // Count occurrences of "Arch Reference"
75
+ const matches = (context?.match(/Arch Reference/g) || []).length;
76
+ expect(matches).toBe(10);
77
+ });
78
+ });
79
+ //# sourceMappingURL=rag-retrieval.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-retrieval.test.js","sourceRoot":"","sources":["../src/rag-retrieval.test.ts"],"names":[],"mappings":"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"}
package/dist/rag.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRagContext = getRagContext;
4
+ const indexer_1 = require("./indexer");
5
+ /**
6
+ * Retrieves architectural context for a given git diff by mapping
7
+ * symbols in the diff to their definitions in the local repository.
8
+ */
9
+ async function getRagContext(diff, manualIndex) {
10
+ const index = manualIndex || indexer_1.Indexer.load(process.cwd());
11
+ if (!index)
12
+ return null;
13
+ const foundSymbols = new Set();
14
+ const lines = diff.split("\n");
15
+ // Symbols to ignore to avoid noise in the retrieval loop
16
+ const commonKeywords = new Set([
17
+ "if", "else", "for", "while", "return", "const", "let", "var",
18
+ "function", "class", "interface", "type", "import", "export",
19
+ "from", "async", "await", "true", "false", "null", "undefined",
20
+ "string", "number", "boolean", "any", "void", "Promise"
21
+ ]);
22
+ // Heuristic: find all words that match a known symbol name in added/modified lines
23
+ for (const line of lines) {
24
+ // Only look at added lines (+) but skip the file markers (+++)
25
+ if (!line.startsWith("+") || line.startsWith("+++"))
26
+ continue;
27
+ const words = line.match(/[a-zA-Z0-9_$]+/g);
28
+ if (!words)
29
+ continue;
30
+ for (const word of words) {
31
+ if (index.symbols[word] && !commonKeywords.has(word)) {
32
+ foundSymbols.add(word);
33
+ }
34
+ }
35
+ }
36
+ if (foundSymbols.size === 0)
37
+ return null;
38
+ let contexts = "";
39
+ // Pick top 10 symbols to avoid prompt overflow
40
+ const symbolsToInclude = Array.from(foundSymbols).slice(0, 10);
41
+ for (const symName of symbolsToInclude) {
42
+ const def = index.symbols[symName];
43
+ contexts += `\n--- Arch Reference: ${symName} (from ${def.file}) ---\n${def.snippet}\n`;
44
+ }
45
+ return contexts;
46
+ }
47
+ //# sourceMappingURL=rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag.js","sourceRoot":"","sources":["../src/rag.ts"],"names":[],"mappings":";;AAMA,sCA0CC;AAhDD,uCAAsD;AAEtD;;;GAGG;AACI,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,WAAgC;IAChF,MAAM,KAAK,GAAG,WAAW,IAAI,iBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,yDAAyD;IACzD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC7B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;QAC7D,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC5D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW;QAC9D,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS;KACxD,CAAC,CAAC;IAEH,mFAAmF;IACnF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,+DAA+D;QAC/D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QAE9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/D,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,QAAQ,IAAI,yBAAyB,OAAO,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC;IAC1F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diffmind/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "diffmind CLI — local-first AI code review for your git diffs",
5
5
  "author": "Thinkgrid Labs <hello@thinkgrid.com>",
6
6
  "license": "MIT",
@@ -24,8 +24,8 @@
24
24
  "cli-progress": "^3.12.0",
25
25
  "commander": "^12.0.0",
26
26
  "ora": "^8.0.1",
27
- "@diffmind/core-wasm": "0.2.0",
28
- "@diffmind/shared-types": "0.2.0"
27
+ "@diffmind/shared-types": "0.3.1",
28
+ "@diffmind/core-wasm": "0.3.1"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/cli-progress": "^3.11.5",