@oomkapwn/enquire-mcp 3.8.4 → 3.8.5
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 +53 -0
- package/README.md +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/docs/COMPARISON.md +1 -1
- package/package.json +2 -2
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.5] — 2026-05-25
|
|
6
|
+
|
|
7
|
+
> **TL;DR:** **T-2/T-3/T-4 E2E backlog closure.** All three E2E tests deferred since v3.8.0 backlog now ship. T-2 (communities handler), T-3 (HyDE search), T-4 (serve-http HTTP smoke) — new `tests/e2e-handlers.test.ts` with 7 tests using spawn-dist + JSON-RPC pattern (mirrors `scripts/smoke.mjs`). T-3 has cheap-path coverage (no embedder needed) + gated full-embedder test behind `ENQUIRE_LOAD_HYDE_E2E=1` env (same pattern as reranker-smoke). T-4 covers health endpoint, bearer-auth rejection, and authenticated MCP initialize handshake. **879 tests** (+7 vs v3.8.4). 0 src/ changes.
|
|
8
|
+
|
|
9
|
+
**Patch — backlog closure (E2E tests).**
|
|
10
|
+
|
|
11
|
+
### T-2 — `obsidian_get_communities` E2E
|
|
12
|
+
|
|
13
|
+
Two tests in `tests/e2e-handlers.test.ts` `T-2` describe block:
|
|
14
|
+
1. Spawns server on a synthetic 6-note vault with planted 2-cluster wikilink graph ({A,B,C} interlinked + {X,Y,Z} interlinked + 1 bridge A↔X). Verifies Louvain detects ≥ 2 communities with modularity > 0.2. Asserts response structure (community_count, modularity, iterations, node_count, communities[].{id,size,members,representative}, membership map).
|
|
15
|
+
2. NEGATIVE control — `min_size: 10` filter exercises arg-handling: communities list returns empty, but raw `community_count` is still > 0 (count is pre-filter).
|
|
16
|
+
|
|
17
|
+
### T-3 — `obsidian_hyde_search` E2E
|
|
18
|
+
|
|
19
|
+
Two tests. The embedder model (~120 MB HuggingFace download) is too slow for default CI, so:
|
|
20
|
+
1. **Cheap-path (always runs):** spawns server on a synthetic 3-topic vault, calls `obsidian_hyde_search` with no embed-db built. Asserts no crash, response contains informative text (either guidance about missing embed-db OR empty matches with diagnostic). Validates the handler's cold-vault error path.
|
|
21
|
+
2. **Full-embedder (gated):** `it.skipIf(!process.env.ENQUIRE_LOAD_HYDE_E2E)` — runs only when env set. Asserts HyDE returns hits, with `Music` ranking above `Cooking`/`Code` for a music query. Pattern matches `reranker-smoke.test.ts` env-gating.
|
|
22
|
+
|
|
23
|
+
### T-4 — `serve-http` HTTP smoke
|
|
24
|
+
|
|
25
|
+
Three tests. Spawns `enquire-mcp serve-http --vault <path> --port <free> --bearer-token <tok>` and waits for "Listening" log (fallback 3s timeout):
|
|
26
|
+
1. `GET /health` returns 200 OK (unauthenticated health probe).
|
|
27
|
+
2. `POST /mcp` without `Authorization: Bearer <tok>` returns 401.
|
|
28
|
+
3. `POST /mcp` with valid bearer + JSON-RPC `initialize` returns 200 with response containing `serverInfo` or `enquire-mcp`.
|
|
29
|
+
|
|
30
|
+
Uses `net.createServer().listen(0)` to pick a free port — avoids hardcoded port collisions in parallel CI runs.
|
|
31
|
+
|
|
32
|
+
### Implementation notes
|
|
33
|
+
|
|
34
|
+
- All tests skip gracefully via `if (!distExists()) return` — matches `cli.test.ts` pattern for runs without `npm run build`.
|
|
35
|
+
- E2E test file shares helpers: `spawnServer()` (returns RPC client), `makeWikilinkVault()`, `makeSemanticVault()`, `pickFreePort()`.
|
|
36
|
+
- 20s per-RPC timeout; 30s beforeAll; tests cleanup spawned processes + tmpdirs in afterAll.
|
|
37
|
+
- T-3 cheap-path was fixed mid-development when server returned plain-text guidance ("Embedding model not found...") not JSON — assertion relaxed to accept either format, both demonstrate no-crash behavior.
|
|
38
|
+
|
|
39
|
+
### Stats
|
|
40
|
+
|
|
41
|
+
- **879 tests** (+7 vs v3.8.4: 2 T-2 + 2 T-3 + 3 T-4).
|
|
42
|
+
- 1 new test file: `tests/e2e-handlers.test.ts` (~330 lines).
|
|
43
|
+
- 0 src/ changes.
|
|
44
|
+
- `npm audit`: 0 vulnerabilities.
|
|
45
|
+
- Dist-tag: `@latest = 3.8.5` after publish.
|
|
46
|
+
- All 9 required CI gates pass locally.
|
|
47
|
+
|
|
48
|
+
### What's next
|
|
49
|
+
|
|
50
|
+
Continuing v3.8.x backlog closure (no deferrals):
|
|
51
|
+
- **v3.8.6** — Tier C discoverability: `.github/FUNDING.yml` + JSON-LD `SoftwareApplication` schema on GH Pages.
|
|
52
|
+
- **v3.8.7** — HTTP P2-10 (stateful session race) + P2-11 (HTTP server close cleanup).
|
|
53
|
+
- **v3.8.8** — META structural-defense scope completeness audit (the recurring recursion-pair class).
|
|
54
|
+
- **v3.9.0-rc.1** — OCR'd PDF watcher embed-sync + HNSW in-memory live update (architectural minor bump).
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
5
58
|
## [3.8.4] — 2026-05-24
|
|
6
59
|
|
|
7
60
|
> **TL;DR:** **OIA Check 7 scope expansion (overclaim instance #12) + 2 inline fixes (B-1, B-2).** v3.8.3 shipped OIA Check 7 (extend stale-currency detection to docs/) explicitly claiming "Same recursion class as M-1/M-2/M-REG-1 (structural defense built but scope too narrow)" and "Closes the methodology gap." Post-v3.8.3 sweep found **the same recursion pattern inside the v3.8.3 fix itself**: Check 7 scope was CLAUDE.md + docs/ but **omitted** README.md, AGENTS.md, llms.txt, examples/. Found B-1 (README.md:185 "capabilities as of v3.7.0") and B-2 (examples/chatgpt-actions.md:25 "wait for v3.8.0" — already shipped). This is the **6th recursion-pair shape** (#6+#7, #2 inside K-1 "final", #10 inside M-2, #12 inside v3.8.3 Check 7) and the **12th documented overclaim instance**. v3.8.4 expands Check 7 scope to ALL user-visible markdown surfaces (README.md, AGENTS.md, llms.txt, examples/*.md), adds "capabilities|claims|features|snapshot as of" patterns to catch B-1's wording, adds "wait for vX.Y.0 / coming in / planned for / will land in" forthcoming-claim detection for B-2's class. 2 inline fixes for B-1/B-2. **No code changes; 872 tests unchanged.**
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
|
|
14
14
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
15
15
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
16
|
-
[](#trust)
|
|
17
17
|
[](./STABILITY.md)
|
|
18
18
|
[](https://slsa.dev/spec/v1.0/levels#build-l3)
|
|
19
19
|
[](https://modelcontextprotocol.io/)
|
|
@@ -38,7 +38,7 @@ Your Obsidian vault becomes **persistent, queryable long-term memory** for any M
|
|
|
38
38
|
> 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.
|
|
39
39
|
> 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.
|
|
40
40
|
|
|
41
|
-
**44 tools · 19 MCP prompts ·
|
|
41
|
+
**44 tools · 19 MCP prompts · 878 unit tests · 50+ languages · v3.8.x stable · semver-bound · MIT · SLSA-3 signed.**
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
@@ -176,7 +176,7 @@ Auto-generated **[API reference at oomkapwn.github.io/enquire-mcp](https://oomka
|
|
|
176
176
|
| **GraphRAG-light** (wikilink community detection via Louvain modularity) | ✅ **only here** | ❌ | ❌ |
|
|
177
177
|
| **Standalone `.base` query execution** (works without Obsidian running) | ✅ **only here** | ❌ | ❌ delegates to Obsidian |
|
|
178
178
|
| **HyDE retrieval** (Gao et al 2023) + sub-question decomposition | ✅ **only here** | ❌ | ❌ |
|
|
179
|
-
| **
|
|
179
|
+
| **878 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
|
|
180
180
|
| **SLSA-3 build provenance** | ✅ | n/a | ❌ |
|
|
181
181
|
| **Semver-bound public surface** ([STABILITY.md](./STABILITY.md)) | ✅ | n/a | ❌ |
|
|
182
182
|
| Standalone (no Obsidian plugin needed) | ✅ | ❌ requires Obsidian | varies |
|
|
@@ -286,7 +286,7 @@ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog:
|
|
|
286
286
|
```bash
|
|
287
287
|
git clone https://github.com/oomkapwn/enquire-mcp.git
|
|
288
288
|
cd enquire-mcp && npm install
|
|
289
|
-
npm test # full suite (
|
|
289
|
+
npm test # full suite (878 tests, ~5s)
|
|
290
290
|
npm run lint # zero warnings
|
|
291
291
|
npm run build # tsc → dist/
|
|
292
292
|
```
|
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.
|
|
10
|
+
export declare const VERSION = "3.8.5";
|
|
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.
|
|
43
|
+
export const VERSION = "3.8.5";
|
|
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`,
|
package/docs/COMPARISON.md
CHANGED
|
@@ -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) | **
|
|
46
|
+
| Test count (public) | **878** | (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,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@oomkapwn/enquire-mcp",
|
|
4
|
-
"version": "3.8.
|
|
4
|
+
"version": "3.8.5",
|
|
5
5
|
"mcpName": "io.github.oomkapwn/enquire-mcp",
|
|
6
|
-
"description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts,
|
|
6
|
+
"description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts, 878 tests, SLSA-3, semver-bound, MIT, zero cloud calls during serve.",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
9
|
"enquire-mcp": "dist/index.js"
|