@oomkapwn/enquire-mcp 3.8.0-rc.4 → 3.8.0-rc.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 +55 -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,61 @@
|
|
|
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.5] — 2026-05-21
|
|
6
|
+
|
|
7
|
+
> **TL;DR:** Fifth v3.8.0 release candidate. Adds **K-3 readOnlyHint structural invariant** — pins the tool-registry's `READ_ONLY` ↔ read-handler / `WRITE` ↔ write-handler mapping so the annotations can't drift away from the wired handlers. Catches the class of bug an MCP client's `readOnlyHint`-driven confirmation gate would silently swallow. Ships under `@rc` dist-tag.
|
|
8
|
+
|
|
9
|
+
**Minor — fifth v3.8.0 release candidate.**
|
|
10
|
+
|
|
11
|
+
### K-3 — readOnlyHint structural invariant
|
|
12
|
+
|
|
13
|
+
**Background.** MCP tool annotations advertise to the client and the agent orchestrator what each tool can do. Specifically:
|
|
14
|
+
- `readOnlyHint: true` → MCP clients that gate destructive operations behind user confirmation will SKIP that gate for this tool.
|
|
15
|
+
- `destructiveHint: true` → MCP clients show a "destructive" badge and may ask for explicit confirmation per call.
|
|
16
|
+
|
|
17
|
+
If a tool annotated `readOnlyHint: true` is silently wired to a write handler (e.g. `createNote`, `appendToNote`, `renameNote`, `replaceInNotes`, `archiveNote`, `chatThreadAppend`, `frontmatterSet`), the client won't confirm, and the agent can mutate the vault without the user knowing.
|
|
18
|
+
|
|
19
|
+
`src/tool-registry.ts` already follows the convention (two shorthand annotation objects — `READ_ONLY` + `WRITE` — at lines 57, 138, 1028 — plus 7 known write-handler names). But there was no automated check that the convention is maintained. K-3 pins it.
|
|
20
|
+
|
|
21
|
+
### What's enforced
|
|
22
|
+
|
|
23
|
+
1. **Every `READ_ONLY`-annotated tool's handler block does NOT reference any function in `KNOWN_WRITE_HANDLERS`.**
|
|
24
|
+
2. **Every `WRITE`-annotated tool's handler block references at least one function from `KNOWN_WRITE_HANDLERS`.**
|
|
25
|
+
3. **Every tool in `tool-registry.ts` has an explicit `READ_ONLY` or `WRITE` annotation** (no UNKNOWN).
|
|
26
|
+
|
|
27
|
+
`KNOWN_WRITE_HANDLERS` is a set of 7 names: `createNote`, `appendToNote`, `renameNote`, `replaceInNotes`, `archiveNote`, `chatThreadAppend`, `frontmatterSet`. If a future PR adds a new write operation, it MUST register its handler name in this set, OR the K-3 invariant test will reject it as UNKNOWN/violation.
|
|
28
|
+
|
|
29
|
+
### Implementation
|
|
30
|
+
|
|
31
|
+
- **`tests/k3-readonly-hint-invariant.test.ts`** — 3 production tests + 3 negative-control fixture tests = 6 new tests.
|
|
32
|
+
- **`scanRegistry(source)`** — exposed as a pure function so fixture-based negative controls can exercise the scanner directly (per CLAUDE.md anti-pattern "Invariant test without negative-control — Rule since v3.6.4").
|
|
33
|
+
- **Block boundary fix** — the scanner bounds each `registerTool(...)` block by the NEXT `registerTool(` call (or end of file), not a fixed line window. Caught during initial test: a fixed 60-line window allowed the last READ_ONLY tool's window to extend into `registerWriteTools()` and grab the first WRITE tool's `createNote(` call. The block-bounding fix was found via the test failing on initial run — exactly the kind of class-of-bug discovery the invariant is designed for.
|
|
34
|
+
|
|
35
|
+
### Fixture coverage (negative-control)
|
|
36
|
+
|
|
37
|
+
3 fixture files under `tests/fixtures/k3-invariant/`:
|
|
38
|
+
- **`good.fixture.ts`** — positive control: canonical READ_ONLY + WRITE patterns, both correctly wired.
|
|
39
|
+
- **`bad-readonly-with-write.fixture.ts`** — READ_ONLY tool wired to `createNote` (the exact bug shape K-3 catches).
|
|
40
|
+
- **`bad-write-no-handler.fixture.ts`** — WRITE tool wired to `readNote` (inverse drift).
|
|
41
|
+
|
|
42
|
+
Each fixture is parseable by `scanRegistry` independently, so the negative-control sibling tests prove the scanner classifies each case correctly without requiring production code violations.
|
|
43
|
+
|
|
44
|
+
### Stats
|
|
45
|
+
|
|
46
|
+
- **838 tests** (+6 from K-3). Was 832 in v3.8.0-rc.4.
|
|
47
|
+
- Dist-tag: `@rc` (v3.7.20 stays `@latest`).
|
|
48
|
+
- All required CI gates pass locally.
|
|
49
|
+
|
|
50
|
+
### v3.8.0 remaining backlog (next RCs)
|
|
51
|
+
|
|
52
|
+
- **R-10** — HNSW + privacy under-return fix (over-fetch margin tuning).
|
|
53
|
+
- **T-1..T-5** — test coverage gaps (`contextPack`, `get_communities` handler E2E, `hyde_search` E2E, `serve-http` cli.test E2E).
|
|
54
|
+
- **4/5 reranker E2E in CI** with model-cache strategy.
|
|
55
|
+
- **OCR'd PDF watcher embed-sync** (deferred from rc.3).
|
|
56
|
+
- **HNSW in-memory update** alongside watcher upserts (architectural).
|
|
57
|
+
- **watcher.ts catch-branch coverage via vi.mock or DI** — lift floor back to ≥71%.
|
|
58
|
+
- **External audit on rc.N** before promotion to stable.
|
|
59
|
+
|
|
5
60
|
## [3.8.0-rc.4] — 2026-05-21
|
|
6
61
|
|
|
7
62
|
> **TL;DR:** Fourth v3.8.0 release candidate. Closes the rc.3 architectural deferral: extracts `embedSingleNote` (rc.2) + `embedSinglePdf` (rc.3) from `src/server.ts` into a dedicated `src/embed-pipeline.ts` module. The motivation was the `tests/no-internal-imports.test.ts` Class A invariant — server.ts is in `RESTRICTED_MODULES`, so the helpers couldn't be unit-tested directly. Now they can: 10 new direct unit tests in `tests/embed-pipeline.test.ts` cover happy paths, null returns, embedder error propagation, frontmatter title resolution, late-chunk-context honoring, and the data-integrity guard against mismatched vector counts. Ships under `@rc` dist-tag.
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
|
|
12
12
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
13
13
|
[](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
|
|
14
|
-
[](#trust)
|
|
15
15
|
[](./STABILITY.md)
|
|
16
16
|
[](https://slsa.dev/spec/v1.0/levels#build-l3)
|
|
17
17
|
[](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 ·
|
|
39
|
+
**44 tools · 19 MCP prompts · 838 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
|
-
| **
|
|
115
|
+
| **838 unit tests · 8 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 (
|
|
225
|
+
npm test # full suite (838 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.
|
|
10
|
+
export declare const VERSION = "3.8.0-rc.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.0-rc.
|
|
43
|
+
export const VERSION = "3.8.0-rc.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) | **838** | (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.
|
|
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),
|
|
4
|
+
"version": "3.8.0-rc.5",
|
|
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.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"enquire-mcp": "dist/index.js"
|