Skip to content

Commit 4617b5f

Browse files
authored
Merge pull request #20 from manojmallick/feat/v2.7-ranking-optimization
feat: v2.7 - Ranking Optimization
2 parents 24ac701 + 5f98239 commit 4617b5f

20 files changed

Lines changed: 152 additions & 99 deletions

.github/copilot-instructions.md

Lines changed: 51 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
<!-- Generated by SigMap gen-context.js v2.4.0 -->
1+
<!-- Generated by SigMap gen-context.js v2.7.0 -->
22
<!-- DO NOT EDIT below the marker line — run gen-context.js to regenerate -->
33

44
# Code signatures
55

6-
## changes (last 5 commits — 15 minutes ago)
7-
```
8-
packages/cli/index.js +from +run
9-
packages/core/index.js +_resolveExtractor +hello +extract +rank
10-
```
11-
126
## packages
137

148
### packages/cli/index.js
@@ -30,38 +24,6 @@ function score(cwd) → { * score: number, * grad
3024

3125
## src
3226

33-
### src/config/defaults.js
34-
```
35-
module.exports = { DEFAULTS }
36-
```
37-
38-
### src/eval/analyzer.js
39-
```
40-
module.exports = { analyzeFiles, formatAnalysisTable, formatAnalysisJSON }
41-
function isDockerfile(name)
42-
function getExtractorName(filePath)
43-
function tokenCount(sigs)
44-
function hasCoverage(filePath, cwd)
45-
function loadExtractor(name, cwd)
46-
function analyzeFiles(files, cwd, opts) → object[]
47-
function formatAnalysisTable(stats, showSlow) → string
48-
function formatAnalysisJSON(stats) → object
49-
```
50-
51-
### src/mcp/handlers.js
52-
```
53-
module.exports = { readContext, searchSignatures, getMap, createCheckpoint, getRouting, explainFile, listModules, queryContext, getImpact }
54-
function readContext(args, cwd)
55-
function searchSignatures(args, cwd)
56-
function getMap(args, cwd)
57-
function createCheckpoint(args, cwd)
58-
function getRouting(args, cwd)
59-
function explainFile(args, cwd)
60-
function listModules(args, cwd)
61-
function queryContext(args, cwd)
62-
function getImpact(args, cwd)
63-
```
64-
6527
### src/mcp/server.js
6628
```
6729
module.exports = { start }
@@ -71,25 +33,9 @@ function dispatch(msg, cwd)
7133
function start(cwd)
7234
```
7335

74-
### src/mcp/tools.js
75-
```
76-
module.exports = { TOOLS }
77-
```
78-
79-
### src/retrieval/ranker.js
80-
```
81-
module.exports = { rank, buildSigIndex, scoreFile, formatRankTable, formatRankJSON, DEFAULT_WEIGHTS }
82-
function scoreFile(filePath, sigs, queryTokens, weights) → number
83-
function rank(query, sigIndex, opts) → { file: string, score: nu
84-
function buildSigIndex(cwd) → Map<string, string[]>
85-
function formatRankTable(results, query) → string
86-
function formatRankJSON(results, query) → object
87-
```
88-
89-
### src/retrieval/tokenizer.js
36+
### src/config/defaults.js
9037
```
91-
module.exports = { tokenize, STOP_WORDS }
92-
function tokenize(text, opts) → string[]
38+
module.exports = { DEFAULTS }
9339
```
9440

9541
### src/config/loader.js
@@ -99,6 +45,19 @@ function loadConfig(cwd) → object
9945
function deepClone(obj)
10046
```
10147

48+
### src/eval/analyzer.js
49+
```
50+
module.exports = { analyzeFiles, formatAnalysisTable, formatAnalysisJSON }
51+
function isDockerfile(name)
52+
function getExtractorName(filePath)
53+
function tokenCount(sigs)
54+
function hasCoverage(filePath, cwd)
55+
function loadExtractor(name, cwd)
56+
function analyzeFiles(files, cwd, opts) → object[]
57+
function formatAnalysisTable(stats, showSlow) → string
58+
function formatAnalysisJSON(stats) → object
59+
```
60+
10261
### src/eval/runner.js
10362
```
10463
module.exports = { run, rank, loadTasks, buildSigIndex, formatTable, formatMetrics, tokenize }
@@ -396,6 +355,41 @@ function shouldSkipFile(rel)
396355
function analyze(files, cwd)
397356
```
398357

358+
### src/mcp/handlers.js
359+
```
360+
module.exports = { readContext, searchSignatures, getMap, createCheckpoint, getRouting, explainFile, listModules, queryContext, getImpact }
361+
function readContext(args, cwd)
362+
function searchSignatures(args, cwd)
363+
function getMap(args, cwd)
364+
function createCheckpoint(args, cwd)
365+
function getRouting(args, cwd)
366+
function explainFile(args, cwd)
367+
function listModules(args, cwd)
368+
function queryContext(args, cwd)
369+
function getImpact(args, cwd)
370+
```
371+
372+
### src/mcp/tools.js
373+
```
374+
module.exports = { TOOLS }
375+
```
376+
377+
### src/retrieval/ranker.js
378+
```
379+
module.exports = { rank, buildSigIndex, scoreFile, formatRankTable, formatRankJSON, DEFAULT_WEIGHTS }
380+
function scoreFile(filePath, sigs, queryTokens, weights) → number
381+
function rank(query, sigIndex, opts) → { file: string, score: nu
382+
function buildSigIndex(cwd) → Map<string, string[]>
383+
function formatRankTable(results, query) → string
384+
function formatRankJSON(results, query) → object
385+
```
386+
387+
### src/retrieval/tokenizer.js
388+
```
389+
module.exports = { tokenize, STOP_WORDS }
390+
function tokenize(text, opts) → string[]
391+
```
392+
399393
### src/routing/classifier.js
400394
```
401395
module.exports = { classify, classifyAll }

CHANGELOG.md

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,43 @@ Format: [Semantic Versioning](https://semver.org/)
66

77
---
88

9-
## [2.6.0] — upcoming · [#16](https://github.com/manojmallick/sigmap/issues/16) · branch: `feat/v2.6-research-mode`
9+
## [2.7.0] — upcoming · [#19](https://github.com/manojmallick/sigmap/issues/19) · branch: `feat/v2.7-ranking-optimization`
10+
11+
### Planned additions
12+
- **Fine-tuned ranking weights** — optimize `exactToken`, `symbolMatch`, `prefixMatch`, `pathMatch`, and `recencyBoost` weights in `src/retrieval/ranker.js` based on benchmark-driven evaluation
13+
- **TF-IDF scoring option** — add TF-IDF (term frequency-inverse document frequency) as an alternative scoring method for better semantic relevance in large codebases
14+
- **Configurable weight presets**`precision`, `balanced`, `recall` presets for different use cases; configurable via `retrieval.preset` in config
15+
- **`formatRankTable` and `formatRankJSON` improvements** — better output formatting for ranked results with score breakdown and relevance explanation
16+
- **Performance optimization** — optimize ranking algorithm for large codebases (10K+ files), target <100ms for --query on 1000-file repos
17+
- **Regression tests** — ensure hit@5 maintains ≥ 0.80 (no regression from v2.6)
18+
- **Precision improvement** — target precision@5 improvement of ≥ 5% over v2.6
19+
20+
### Config additions
21+
```json
22+
{
23+
"retrieval": {
24+
"topK": 10,
25+
"recencyBoost": 1.5,
26+
"preset": "balanced",
27+
"weights": {
28+
"exactToken": 1.0,
29+
"symbolMatch": 0.5,
30+
"prefixMatch": 0.3,
31+
"pathMatch": 0.8
32+
}
33+
}
34+
}
35+
```
36+
37+
### Go / No-go criteria
38+
- All tests green (21 extractor + all integration suites)
39+
- Benchmark hit@5 ≥ 0.80 (no regression from v2.6)
40+
- Precision@5 improves by ≥ 5%
41+
- `--query` performance <100ms for 1000-file repos
42+
43+
---
44+
45+
## [2.6.0] — 2026-04-05 · [#16](https://github.com/manojmallick/sigmap/issues/16)
1046

1147
### Planned additions
1248
- **`benchmarks/repos/`** — register 5 real open-source repos (express, flask, gin, spring-petclinic, rails) as git submodules or clone targets for evaluation

README.md

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -110,24 +110,19 @@ AI agent session starts with full context
110110
111111
---
112112

113-
## 🔭 What's next — v2.5-v2.6 (in progress · [#14](https://github.com/manojmallick/sigmap/issues/14) · [#16](https://github.com/manojmallick/sigmap/issues/16))
113+
## 🔭 What's next — v2.7 (in progress · [#19](https://github.com/manojmallick/sigmap/issues/19))
114114

115-
### v2.6Research Mode
115+
### v2.7Ranking Optimization
116116

117117
| Feature | Description |
118118
|---|---|
119-
| **`--benchmark --repo <path>`** | Run benchmarks against any external repository (express, flask, gin, spring-petclinic, rails) |
120-
| **`--report --paper`** | Generate paper-ready metrics: markdown + LaTeX tables for academic publishing |
121-
| **50 real eval tasks** | JSONL task file covering 5 real open-source repos — `benchmarks/tasks/retrieval-real.jsonl` |
122-
| **`src/eval/paper.js`** | Zero-dependency LaTeX table formatter for token reduction, hit@5, MRR, latency (p50/p95/p99) |
123-
| **8 new tests** | `paper.test.js` — report generation, LaTeX syntax validation, graceful failures |
119+
| **Fine-tuned ranking weights** | Optimize weights in `src/retrieval/ranker.js` for better precision based on benchmark evaluation |
120+
| **TF-IDF scoring** | Add term frequency-inverse document frequency scoring option for better semantic relevance |
121+
| **Weight presets** | `precision`, `balanced`, `recall` presets — configurable via `retrieval.preset` |
122+
| **Performance optimization** | <100ms query performance for 1000-file repos, optimized for large codebases (10K+ files) |
123+
| **Precision improvement** | Target ≥5% precision@5 improvement while maintaining hit@5 ≥ 0.80 |
124124

125-
### v2.5 — Impact Layer
126-
127-
| Feature | Description |
128-
|---|---|
129-
| **`--impact <file>`** | Show every file that transitively depends on a changed file — instant blast-radius awareness |
130-
| **`--impact --json`** | Machine-readable output for CI pipelines |
125+
---
131126
| **`get_impact` MCP tool** | 9th MCP tool — `{ file, depth? }` → impacted files + signatures |
132127
| **`src/map/dep-graph.js`** | Reverse-dependency graph built from the import analysis; circular deps handled safely |
133128
| **15 new tests** | `impact.test.js` — direct deps, transitive deps, depth limit, JSON output |

docs/cli.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ <h2>All flags at a glance</h2>
185185
<span class="term-title">node gen-context.js --help</span>
186186
</div>
187187
<div class="term-body">
188-
<div><span class="tp">SigMap v2.6.0</span></div>
188+
<div><span class="tp">SigMap v2.7.0</span></div>
189189
<div>&nbsp;</div>
190190
<div><span class="tc">Usage:</span> <span class="tw">node gen-context.js [flag]</span></div>
191191
<div>&nbsp;</div>
@@ -609,7 +609,7 @@ <h2>Explore further</h2>
609609

610610
<footer>
611611
<div class="footer-inner">
612-
<span class="footer-logo">sigmap v2.6.0</span>
612+
<span class="footer-logo">sigmap v2.7.0</span>
613613
<div class="footer-links">
614614
<a href="quick-start.html">Quick start</a>
615615
<a href="cli.html">CLI reference</a>

docs/config.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ <h2>Explore further</h2>
472472

473473
<footer>
474474
<div class="footer-inner">
475-
<span class="footer-logo">sigmap v2.6.0</span>
475+
<span class="footer-logo">sigmap v2.7.0</span>
476476
<div class="footer-links">
477477
<a href="quick-start.html">Quick start</a>
478478
<a href="cli.html">CLI reference</a>

docs/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<meta name="twitter:image" content="https://manojmallick.github.io/sigmap/sigmap-banner.png">
1414
<link rel="canonical" href="https://manojmallick.github.io/sigmap/">
1515
<link rel="sitemap" type="application/xml" href="https://manojmallick.github.io/sigmap/sitemap.xml">
16-
<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"SigMap","applicationCategory":"DeveloperApplication","description":"Zero-dependency AI context engine. 97% token reduction for AI coding agents. Extracts signatures from 21 languages. No npm install.","url":"https://manojmallick.github.io/sigmap/","downloadUrl":"https://www.npmjs.com/package/sigmap","softwareVersion":"2.6.0","operatingSystem":"Any (Node.js 18+)","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"author":{"@type":"Person","name":"Manoj Mallick","url":"https://github.com/manojmallick"}}</script>
16+
<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"SigMap","applicationCategory":"DeveloperApplication","description":"Zero-dependency AI context engine. 97% token reduction for AI coding agents. Extracts signatures from 21 languages. No npm install.","url":"https://manojmallick.github.io/sigmap/","downloadUrl":"https://www.npmjs.com/package/sigmap","softwareVersion":"2.7.0","operatingSystem":"Any (Node.js 18+)","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"author":{"@type":"Person","name":"Manoj Mallick","url":"https://github.com/manojmallick"}}</script>
1717
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@700;800&family=IBM+Plex+Mono:wght@400;500&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
1818
<script>(function(){var r=document.documentElement;if(localStorage.getItem('cf-theme')==='light')r.classList.add('light');document.addEventListener('DOMContentLoaded',function(){document.querySelectorAll('.theme-toggle').forEach(function(b){b.addEventListener('click',function(){r.classList.toggle('light');localStorage.setItem('cf-theme',r.classList.contains('light')?'light':'dark');});});});})();</script>
1919
<style>
@@ -438,7 +438,7 @@ <h2>Built for the community</h2>
438438
<!-- FOOTER -->
439439
<footer>
440440
<div class="footer-inner">
441-
<span class="footer-logo">sigmap v2.6.0 &middot; <a href="roadmap.html#v2.6" style="color:var(--gd);text-decoration:none">Latest</a></span>
441+
<span class="footer-logo">sigmap v2.7.0 &middot; <a href="roadmap.html#v2.7" style="color:var(--gd);text-decoration:none">Latest</a></span>
442442
<div class="footer-links">
443443
<a href="quick-start.html">Quick start</a>
444444
<a href="cli.html">CLI reference</a>

docs/languages.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ <h2>Contributing is simple</h2>
619619

620620
<footer>
621621
<div class="footer-inner">
622-
<span class="footer-logo">sigmap v2.6.0 &middot; <a href="roadmap.html#v2.6" style="color:var(--gd);text-decoration:none">Latest</a></span>
622+
<span class="footer-logo">sigmap v2.7.0 &middot; <a href="roadmap.html#v2.7" style="color:var(--gd);text-decoration:none">Latest</a></span>
623623
<div class="footer-links">
624624
<a href="quick-start.html">Quick start</a>
625625
<a href="cli.html">CLI reference</a>

docs/mcp.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ <h2>Explore further</h2>
512512

513513
<footer>
514514
<div class="footer-inner">
515-
<span class="footer-logo">sigmap v2.6.0</span>
515+
<span class="footer-logo">sigmap v2.7.0</span>
516516
<div class="footer-links">
517517
<a href="quick-start.html">Quick start</a>
518518
<a href="cli.html">CLI reference</a>

docs/quick-start.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ <h2>Command reference</h2>
442442
<span class="term-title">node gen-context.js --help</span>
443443
</div>
444444
<div class="term-body">
445-
<div><span class="tp">SigMap v2.6.0 &middot; <a href="roadmap.html#v2.6" style="color:var(--gd);text-decoration:none">Latest</a></span></div>
445+
<div><span class="tp">SigMap v2.7.0 &middot; <a href="roadmap.html#v2.7" style="color:var(--gd);text-decoration:none">Latest</a></span></div>
446446
<div>&nbsp;</div>
447447
<div><span class="tc">Usage:</span> <span class="tw">node gen-context.js [flag]</span></div>
448448
<div>&nbsp;</div>
@@ -495,7 +495,7 @@ <h2>Explore further</h2>
495495

496496
<footer>
497497
<div class="footer-inner">
498-
<span class="footer-logo">sigmap v2.6.0 &middot; <a href="roadmap.html#v2.6" style="color:var(--gd);text-decoration:none">Latest</a></span>
498+
<span class="footer-logo">sigmap v2.7.0 &middot; <a href="roadmap.html#v2.7" style="color:var(--gd);text-decoration:none">Latest</a></span>
499499
<div class="footer-links">
500500
<a href="quick-start.html">Quick start</a>
501501
<a href="cli.html">CLI reference</a>

docs/repomix.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ <h2>Both tools, five minutes</h2>
518518

519519
<footer>
520520
<div class="footer-inner">
521-
<span class="footer-logo">sigmap v2.6.0</span>
521+
<span class="footer-logo">sigmap v2.7.0</span>
522522
<div class="footer-links">
523523
<a href="quick-start.html">Quick start</a>
524524
<a href="cli.html">CLI reference</a>

0 commit comments

Comments
 (0)