@oomkapwn/enquire-mcp 3.8.0-rc.7 → 3.8.0-rc.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,59 @@
2
2
 
3
3
  All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [3.8.0-rc.8] — 2026-05-21
6
+
7
+ > **TL;DR:** Eighth v3.8.0 release candidate. **Round-24 external audit response** — 2 findings closed: T-1 (contextPack hard-cap has zero test coverage for the triggered path — violation of CLAUDE.md negative-control rule) and INFO-2 (embed-pipeline.ts missing from per-file FLOORS). Adds `tests/context-pack.test.ts` (4 tests with positive + negative controls), lifts meta.ts branch coverage 67.66% → 73.85%, adds embed-pipeline.ts floor at 84%. Ships under `@rc` dist-tag.
8
+
9
+ **Minor — eighth v3.8.0 release candidate.**
10
+
11
+ ### Finding T-1 — `contextPack` hard-cap: zero tests for triggered path
12
+
13
+ **Background.** rc.6 R-4 added a hard final bundle cap to `contextPack`: after assembling all sections, if `raw.length > charBudget`, the bundle is sliced to `charBudget` chars and a `[…budget cap reached…]` marker is appended. The round-24 external audit (rc.7 codebase) found **zero test coverage** for this code path — a direct violation of CLAUDE.md anti-pattern "Invariant test without negative-control — a test that ALWAYS passes proves nothing. Rule since v3.6.4."
14
+
15
+ **Fix:** New `tests/context-pack.test.ts` with 4 tests:
16
+
17
+ 1. **Positive control** — `budget_tokens: 1000`, small note → bundle fits, marker NOT appended. Proves the cap is not always applied.
18
+ 2. **Negative control** — `budget_tokens: 1` (charBudget=4 chars), big note → cap IS triggered, marker present, sliced portion ≤ charBudget.
19
+ 3. **Error path** — empty and whitespace-only query → throws.
20
+ 4. **Empty match set** — off-topic query against unrelated content → valid result, `included_notes: []`.
21
+
22
+ **Side effect (coverage uplift):** The 4 new tests exercise contextPack's hybrid-search + section-assembly code path. `src/tools/meta.ts` branch coverage jumped from 67.66% → 73.85% (+6.2pp), allowing the per-file floor to be raised from 65% → 71%.
23
+
24
+ ### Finding INFO-2 — `embed-pipeline.ts` missing from per-file FLOORS
25
+
26
+ **Background.** rc.4 extracted `embedSingleNote`/`embedSinglePdf` from `server.ts` into `embed-pipeline.ts`. The new module had direct unit tests (`tests/embed-pipeline.test.ts`) with ~86% branch coverage. But the file was never added to the per-file FLOORS table in `scripts/check-per-file-coverage.mjs` — so a future branch coverage regression in that file would only be caught by the global 75% gate (which averages over 31 source files), not by a file-specific floor.
27
+
28
+ **Fix:** Added `"src/embed-pipeline.ts": { branches: 84 }` to FLOORS (floor at 84%, 2pp below current 86.84%). The per-file script now enforces **10 floors** (was 9).
29
+
30
+ **Note:** The FLOORS comment deferred this addition with "Re-lifted in rc.4+ when we either move embed-pipeline…". That condition was met in rc.4; rc.8 closes the gap.
31
+
32
+ ### Method note
33
+
34
+ Round-24 audit had **4 entries** total:
35
+ - T-1 (this fix) — ship-ready ✅
36
+ - INFO-2 (this fix) — ship-ready ✅
37
+ - R-10 HNSW privacy under-return — acknowledged deferred work, NOT a regression. Documented in v3.8.0 backlog.
38
+ - INFO-3 CHANGELOG "no open items" nuance — accepted wording; the note says "round-23 report IDs", not "all product backlog". Will clarify in stable release notes.
39
+
40
+ **Post-merge self-audit scope:** context-pack.test.ts is a new file with no function-body-changed TSDoc to drift. scripts/check-per-file-coverage.mjs FLOORS table is a config change with no TSDoc. No new drift risk.
41
+
42
+ ### Stats
43
+
44
+ - **842 tests** (+4 from T-1 contextPack tests). Was 838 in v3.8.0-rc.7.
45
+ - **10 per-file FLOORS** (was 9); `embed-pipeline.ts` floor at 84%.
46
+ - `tools/meta.ts` branches: 67.66% → **73.85%** (floor raised 65% → 71%).
47
+ - Dist-tag: `@rc` (v3.7.20 stays `@latest`).
48
+ - All 9 required CI gates pass locally.
49
+
50
+ ### v3.8.0 remaining backlog (unchanged from rc.7)
51
+
52
+ - **R-10** — HNSW + privacy under-return fix.
53
+ - **T-2, T-3** — communities handler + hyde E2E.
54
+ - **T-4** — optional serve-http HTTP smoke.
55
+ - OCR'd PDF watcher embed-sync, HNSW in-memory watcher update, watcher.ts ≥71% branch floor.
56
+ - External audit before `@latest` promotion.
57
+
5
58
  ## [3.8.0-rc.7] — 2026-05-21
6
59
 
7
60
  > **TL;DR:** Seventh v3.8.0 release candidate. **Post-rc.6 self-audit** — 3 fixes: α-class TSDoc drift in `contextPack` (hard budget cap not documented in TSDoc), N-5 sibling (`serve --watch` help text missing .pdf + embed-db, only `serve-http` was updated in rc.6), and watcher flake (task #36 — chokidar FSEvents startup delay missing from the line-170 stderr-capture test, same pattern as sibling at line-140). Ships under `@rc` dist-tag.
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![CI](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
12
12
  [![npm](https://img.shields.io/npm/v/@oomkapwn/enquire-mcp.svg?label=npm&color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
13
13
  [![downloads](https://img.shields.io/npm/dm/@oomkapwn/enquire-mcp.svg?color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
14
- [![tests](https://img.shields.io/badge/tests-838%20passing-brightgreen.svg)](#trust)
14
+ [![tests](https://img.shields.io/badge/tests-842%20passing-brightgreen.svg)](#trust)
15
15
  [![stable](https://img.shields.io/badge/v3.7.x-stable-brightgreen.svg)](./STABILITY.md)
16
16
  [![SLSA-3](https://img.shields.io/badge/SLSA-3-blue.svg)](https://slsa.dev/spec/v1.0/levels#build-l3)
17
17
  [![MCP](https://img.shields.io/badge/MCP-1.29-8A2BE2.svg)](https://modelcontextprotocol.io/)
@@ -36,7 +36,7 @@ Your Obsidian vault becomes **persistent, queryable long-term memory** for any M
36
36
  > 2. **Best-in-class retrieval.** Hybrid BM25 + multilingual embeddings + BGE cross-encoder reranker fused via RRF, scaled with HNSW + int8 quantization. The same IR stack a search startup would build — open-sourced, in one binary.
37
37
  > 3. **Zero cloud calls during serve.** Models cached locally (one-time download from HuggingFace). Your vault content never leaves your machine. Air-gap-safe by default.
38
38
 
39
- **44 tools · 19 MCP prompts · 838 unit tests · 50+ languages · v3.7.x stable · semver-bound · MIT · SLSA-3 signed.**
39
+ **44 tools · 19 MCP prompts · 842 unit tests · 50+ languages · v3.7.x stable · semver-bound · MIT · SLSA-3 signed.**
40
40
 
41
41
  ---
42
42
 
@@ -112,7 +112,7 @@ Auto-generated **[API reference at oomkapwn.github.io/enquire-mcp](https://oomka
112
112
  | **GraphRAG-light** (wikilink community detection via Louvain modularity) | ✅ **only here** | ❌ | ❌ |
113
113
  | **Standalone `.base` query execution** (works without Obsidian running) | ✅ **only here** | ❌ | ❌ delegates to Obsidian |
114
114
  | **HyDE retrieval** (Gao et al 2023) + sub-question decomposition | ✅ **only here** | ❌ | ❌ |
115
- | **838 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
115
+ | **842 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
116
116
  | **SLSA-3 build provenance** | ✅ | n/a | ❌ |
117
117
  | **Semver-bound public surface** ([STABILITY.md](./STABILITY.md)) | ✅ | n/a | ❌ |
118
118
  | Standalone (no Obsidian plugin needed) | ✅ | ❌ requires Obsidian | varies |
@@ -222,7 +222,7 @@ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog:
222
222
  ```bash
223
223
  git clone https://github.com/oomkapwn/enquire-mcp.git
224
224
  cd enquire-mcp && npm install
225
- npm test # full suite (838 tests, ~5s)
225
+ npm test # full suite (842 tests, ~5s)
226
226
  npm run lint # zero warnings
227
227
  npm run build # tsc → dist/
228
228
  ```
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * + `McpServer({version})`) and `src/tool-registry.ts` (used in the
8
8
  * `vault-info` resource payload).
9
9
  */
10
- export declare const VERSION = "3.8.0-rc.7";
10
+ export declare const VERSION = "3.8.0-rc.8";
11
11
  export { main } from "./cli.js";
12
12
  export { buildEmbedText, buildMcpServer, formatReadyBanner, prepareServerDeps, type ServeOptions, type ServerDeps, startServer } from "./server.js";
13
13
  export { parsePositiveInt, parseQuantizationMode } from "./tool-registry.js";
package/dist/index.js CHANGED
@@ -40,7 +40,7 @@ import { main } from "./cli.js";
40
40
  * + `McpServer({version})`) and `src/tool-registry.ts` (used in the
41
41
  * `vault-info` resource payload).
42
42
  */
43
- export const VERSION = "3.8.0-rc.7";
43
+ export const VERSION = "3.8.0-rc.8";
44
44
  // Re-exports — preserve the v3.5.x public surface so http-transport.ts and
45
45
  // tests don't need to know about the new module layout. The set below
46
46
  // exactly matches the v3.5.x `export` declarations: `main`,
@@ -43,7 +43,7 @@ The four axes the external audit (#3, 2026-05) called out as decisive — **REST
43
43
  | Read open editor state, active note, etc. | **No** | **Yes** | Limited | No | No |
44
44
  | Zero outbound network calls in serve mode | **Yes** (default) | Local-only (REST)| Local-only (REST)| Yes | Yes |
45
45
  | SLSA-3 build provenance on releases | **Yes** | No | No | No | No |
46
- | Test count (public) | **838** | (varies) | (varies) | (varies) | (varies) |
46
+ | Test count (public) | **842** | (varies) | (varies) | (varies) | (varies) |
47
47
  | Tool count | 44 | ~25 | ~8 | ~10 | 3–5 |
48
48
  | MCP prompt count | 19 | 0 | 0 | 0 | 0 |
49
49
  | License | MIT | Apache-2.0 | MIT | MIT | (varies) |
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@oomkapwn/enquire-mcp",
4
- "version": "3.8.0-rc.7",
5
- "description": "The most advanced Obsidian MCP — long-term memory for AI agents. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW + int8 quantization, late-chunking, HyDE + sub-question decomposition, agentic RAG, PDFs (with OCR), standalone Bases (.base query execution — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. Open-source long-term memory / second brain for Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, OpenClaw, and any MCP client. 44 tools, 19 MCP prompts, BGE cross-encoder reranker verified end-to-end (+4 aliases in catalog, transformers.js bump pending), 838 tests, SLSA-3, semver-bound, MIT.",
4
+ "version": "3.8.0-rc.8",
5
+ "description": "The most advanced Obsidian MCP — long-term memory for AI agents. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW + int8 quantization, late-chunking, HyDE + sub-question decomposition, agentic RAG, PDFs (with OCR), standalone Bases (.base query execution — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. Open-source long-term memory / second brain for Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, OpenClaw, and any MCP client. 44 tools, 19 MCP prompts, BGE cross-encoder reranker verified end-to-end (+4 aliases in catalog, transformers.js bump pending), 842 tests, SLSA-3, semver-bound, MIT.",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "enquire-mcp": "dist/index.js"