@oomkapwn/enquire-mcp 3.6.0 → 3.6.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.
- package/CHANGELOG.md +98 -0
- package/README.md +4 -4
- package/assets/social-preview.png +0 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/embed-db.d.ts +34 -0
- package/dist/embed-db.d.ts.map +1 -1
- package/dist/embed-db.js +56 -0
- package/dist/embed-db.js.map +1 -1
- package/dist/embeddings.d.ts +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +8 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +22 -13
- package/dist/server.js.map +1 -1
- package/docs/audits/findings/L1-code-quality.md +213 -0
- package/docs/audits/findings/L2-architecture.md +245 -0
- package/docs/audits/findings/L3-tests.md +339 -0
- package/docs/audits/findings/L4-cicd.md +290 -0
- package/docs/audits/findings/L5-security.md +350 -0
- package/docs/audits/findings/L6-documentation.md +347 -0
- package/docs/audits/findings/L7-operational.md +50 -0
- package/docs/audits/findings/L8-reproducibility.md +64 -0
- package/docs/audits/findings/L9-process.md +84 -0
- package/docs/audits/findings/baseline.json +19 -0
- package/docs/audits/v3.6.0-external-anonymous-audit.md +163 -0
- package/docs/audits/v3.6.0-final-audit.md +171 -0
- package/package.json +2 -2
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Аудит проекта enquire-mcp (v3.6.0)
|
|
2
|
+
|
|
3
|
+
**Репозиторий:** https://github.com/oomkapwn/enquire-mcp
|
|
4
|
+
**Дата аудита:** 2026-05-15
|
|
5
|
+
**Метод:** read-only анализ кода и документации (клон в `/tmp/enquire-mcp-audit`). Тесты и `npm run build` не запускались (кроме `npm audit` prod: 0 уязвимостей).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Краткое резюме
|
|
10
|
+
|
|
11
|
+
**enquire-mcp** (v3.6.0) — зрелый MCP-сервер для Obsidian с сильной защитой путей, privacy-фильтрами, 714 unit-тестами и продуманным CI.
|
|
12
|
+
|
|
13
|
+
Главные риски: возможное **уничтожение `.embed.db`** при `serve --use-hnsw`, если индекс собран с моделью, отличной от дефолтной; **дефолтный reranker** (`rerank-multilingual`) по CHANGELOG может не работать, в отличие от `rerank-bge`; **сломанный CI-инвариант** проверки таблицы в `docs/api.md`; ряд расхождений в документации (v2.0 beta, Node 20, `hnswlib-wasm`).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Обзор проекта
|
|
18
|
+
|
|
19
|
+
| Аспект | Детали |
|
|
20
|
+
|--------|--------|
|
|
21
|
+
| **Назначение** | MCP-сервер для чтения/поиска/записи в Obsidian-vault: гибридный поиск (BM25 + TF-IDF + embeddings + RRF), PDF/OCR, `.base`, GraphRAG-light, HTTP transport |
|
|
22
|
+
| **Версия** | `3.6.0` (`src/index.ts:37`, `package.json:4`) |
|
|
23
|
+
| **Стек** | TypeScript (strict), Node ≥20 (фактически PDF/HNSW требуют ≥22.13), MCP SDK, Zod 4, optional: `better-sqlite3`, `@huggingface/transformers`, `hnswlib-node`, `pdfjs-dist`, `tesseract.js` |
|
|
24
|
+
| **Точка входа** | `dist/index.js` → `cli.ts` (12 subcommands), `server.ts` (MCP), `tool-registry.ts` (44 tools), `prompts.ts` (19 prompts) |
|
|
25
|
+
| **Структура** | `src/` — 28 модулей после split v3.6; `tests/` — 33 файла; `docs/`, `scripts/`, `.github/workflows/` |
|
|
26
|
+
|
|
27
|
+
### Архитектура (упрощённо)
|
|
28
|
+
|
|
29
|
+
```mermaid
|
|
30
|
+
flowchart TB
|
|
31
|
+
CLI[cli.ts] --> Server[server.ts]
|
|
32
|
+
Server --> Vault[Vault + privacy]
|
|
33
|
+
Server --> FTS[FtsIndex optional]
|
|
34
|
+
Server --> HNSW[HNSW optional]
|
|
35
|
+
Server --> Registry[tool-registry.ts]
|
|
36
|
+
Registry --> Tools[src/tools/*]
|
|
37
|
+
HTTP[http-transport.ts] --> Server
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Критические находки
|
|
43
|
+
|
|
44
|
+
- **`serve --use-hnsw` может уничтожить embedding-индекс при другой модели** — `src/server.ts:194-212`: при построении HNSW открывается `EmbedDb` с `resolveModel(undefined)` → всегда `multilingual`. Если `build-embeddings` делали с `--embedding-model bge`, `bootstrapSchema()` в `embed-db.ts:263-271` при несовпадении `model_alias` **DROP TABLE embeddings** — данные индекса стираются при каждом старте с `--use-hnsw`. Флаг `--embedding-model` есть только у `build-embeddings` / `setup` / `eval`, **не у `serve`**.
|
|
45
|
+
|
|
46
|
+
- **Дефолтный cross-encoder reranker может быть нерабочим** — `DEFAULT_RERANKER_ALIAS = "rerank-multilingual"` (`src/embeddings.ts:293`). CHANGELOG v3.6.0: только `rerank-bge` проверен end-to-end; 4 других алиаса «fail at AutoTokenizer» до v3.7. Пользователь с `--enable-reranker` без `--reranker-model rerank-bge` может не получать реального rerank (или ошибку в `signal_errors.reranker`).
|
|
47
|
+
|
|
48
|
+
- **Сломанный тест покрытия таблицы `docs/api.md`** — `tests/docs-consistency.test.ts:416-427` парсит `registerTool(` из `src/index.ts`, но регистрация в `src/tool-registry.ts` (44 вызова). `registered` = ∅ → тест **всегда проходит** и не ловит пропуски в таблице. Комментарий в `tests/no-internal-imports.test.ts:13-15` это признаёт.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Высокий приоритет
|
|
53
|
+
|
|
54
|
+
- **`obsidian_query_base`: неверный `total_matched`** — `src/bases.ts:277,321-323`: цикл прерывается при `matches.length >= limit`, но `total_matched: matches.length` — это число **возвращённых** строк, а не всех совпадений в vault.
|
|
55
|
+
|
|
56
|
+
- **Пермиссивная семантика `.base` DSL** — `src/bases.ts:339-363`: нераспознанные предикаты → `unevaluated` и **`return true`**. Возможны ложные срабатывания (over-inclusion). Формулы не вычисляются.
|
|
57
|
+
|
|
58
|
+
- **Устаревший заголовок `docs/api.md`** — строки 4–5: «v2.0 beta», «stable v1.x — 28 tools» против 44 tools / v3.6.0.
|
|
59
|
+
|
|
60
|
+
- **README: badge «v3.5.x-stable» при версии 3.6.0** — `README.md:15` vs `package.json:4`.
|
|
61
|
+
|
|
62
|
+
- **`package.json` engines: `>=20` vs реальность** — CI убрал Node 20; `pdfjs-dist` требует ≥22.13.
|
|
63
|
+
|
|
64
|
+
- **Неверная справка CLI для HNSW** — `src/cli.ts:95`: «Requires `hnswlib-wasm`»; фактически `hnswlib-node`.
|
|
65
|
+
|
|
66
|
+
- **HNSW + несовпадение модели (поиск)** — рассинхрон HNSW-векторов и запросов при нестандартной модели индекса.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Средний приоритет
|
|
71
|
+
|
|
72
|
+
- Токенная усечка embeddings (max 128 tokens) — снижение recall.
|
|
73
|
+
- `searchText` / `semanticSearch` — O(n) по vault.
|
|
74
|
+
- `obsidian_get_communities` — полное чтение vault.
|
|
75
|
+
- HTTP rate limiter: неограниченный `Map`.
|
|
76
|
+
- Stateful HTTP: гонки при инициализации.
|
|
77
|
+
- `docs/api.md`: дублирование секций.
|
|
78
|
+
- Reranker smoke не в обязательном CI.
|
|
79
|
+
- Покрытие веток ~75% (порог 74%).
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Низкий приоритет
|
|
84
|
+
|
|
85
|
+
- Опечатка `ssylaetsja` в `tests/no-internal-imports.test.ts:21`.
|
|
86
|
+
- Badge README «MCP 1.29» vs SDK `^1.0.4`.
|
|
87
|
+
- `zod` v4 — новая major.
|
|
88
|
+
- `prepare` hook всегда запускает `tsc`.
|
|
89
|
+
- Shallow clone — полная история не анализировалась.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Документация
|
|
94
|
+
|
|
95
|
+
| Проблема | Где |
|
|
96
|
+
|----------|-----|
|
|
97
|
+
| Устаревший канал «v2.0 beta» / v1.x 28 tools | `docs/api.md:4-5` |
|
|
98
|
+
| Badge stable v3.5.x vs 3.6.0 | `README.md:15` |
|
|
99
|
+
| CLI help: hnswlib-wasm вместо hnswlib-node | `src/cli.ts:95` |
|
|
100
|
+
| engines Node ≥20 vs CI ≥22 | `package.json`, `ci.yml` |
|
|
101
|
+
| CHANGELOG про reranker — README не акцентирует | `CHANGELOG.md:64`, `README.md` |
|
|
102
|
+
|
|
103
|
+
**Сильные стороны:** `TOOL_MANIFEST`, `STABILITY.md`, `SECURITY.md`, TypeDoc + publish-docs.
|
|
104
|
+
|
|
105
|
+
**Пробел:** нет матрицы «флаг CLI → tools» в одной таблице.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Тесты и качество
|
|
110
|
+
|
|
111
|
+
| Метрика | Значение |
|
|
112
|
+
|---------|----------|
|
|
113
|
+
| Файлов тестов | 33 |
|
|
114
|
+
| `it()` блоков | 714 |
|
|
115
|
+
| Пороги coverage | lines ≥86%, branches ≥74% |
|
|
116
|
+
| Security | `tests/security.test.ts` |
|
|
117
|
+
| HTTP | `tests/http-transport.test.ts` — 49 cases |
|
|
118
|
+
|
|
119
|
+
**Пробелы:** reranker smoke opt-in; тест таблицы api.md — no-op; E2E — только smoke.mjs.
|
|
120
|
+
|
|
121
|
+
**Не проверялось:** полный `npm test`, benchmarks, SLSA на npm.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Зависимости и безопасность
|
|
126
|
+
|
|
127
|
+
- npm audit prod: **0 vulnerabilities**
|
|
128
|
+
- Сильная модель угроз: realpath, privacy, HTTP bearer, chmod на кэшах
|
|
129
|
+
- Риски: persistent cache = чтение vault; `/health` без auth by design
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Архитектура и дизайн
|
|
134
|
+
|
|
135
|
+
**Сильные:** split v3.6, ServerDeps, RRF + graph boost, privacy filter.
|
|
136
|
+
|
|
137
|
+
**Слабые:** `serve` без sync embedding-model; дублирование sync в server.ts; partial `.base` DSL.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Рекомендации по улучшению
|
|
142
|
+
|
|
143
|
+
1. **Критично:** при `--use-hnsw` читать meta из `.embed.db` до `bootstrapSchema`, или `serve --embedding-model`.
|
|
144
|
+
2. **Критично:** DEFAULT_RERANKER → `rerank-bge` или fail-fast.
|
|
145
|
+
3. **Критично:** исправить docs-consistency.test.ts (tool-registry / TOOL_MANIFEST).
|
|
146
|
+
4. **Высокий:** `total_matched` в queryBase отдельно от limit.
|
|
147
|
+
5. **Высокий:** обновить api.md, README, engines, CLI help.
|
|
148
|
+
6. **Высокий:** strict mode для `.base` DSL.
|
|
149
|
+
7. **Средний:** reranker-smoke в release.yml.
|
|
150
|
+
8. **Средний:** peekEmbedDbMeta для doctor.
|
|
151
|
+
9. **Низкий:** PROMPT_MANIFEST.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Положительные стороны
|
|
156
|
+
|
|
157
|
+
- Сильный security posture для MCP.
|
|
158
|
+
- 714 тестов, 7 CI gates, SLSA-3.
|
|
159
|
+
- Честный CHANGELOG, TOOL_MANIFEST.
|
|
160
|
+
- Graceful degradation, read-only by default.
|
|
161
|
+
- TypeDoc + benchmarks.
|
|
162
|
+
|
|
163
|
+
---
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# v3.6.0 — Full-System Audit, Final Report
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-05-15
|
|
4
|
+
**Trigger**: v3.6.0 shipped (`npm latest = 3.6.0`, GH release "v3.6.0" marked Latest at `2026-05-15T12:47:52Z`)
|
|
5
|
+
**Methodology**: 9-layer comprehensive audit per `docs/audits/v3.6.0-system-audit-plan.md` — 7 parallel sub-agents (Phase B) + 2 foreground (L7 ops + L9 process) + synthesis (this doc)
|
|
6
|
+
**Total effort**: ~3 hours wall-clock (7 parallel sub-agents + foreground L7+L9 + L8 manual after sub-agent killed) + 30 min synthesis
|
|
7
|
+
|
|
8
|
+
## Verdict: **PRODUCTION READY** · **4.85 / 5.0**
|
|
9
|
+
|
|
10
|
+
| Domain | Score | Justification |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Security | ⭐⭐⭐⭐⭐ 5/5 | CodeQL/Dependabot/npm-audit 0 open. SLSA-3 attested. timingSafeEqual. 11+ privacy filter points |
|
|
13
|
+
| Tests & Coverage | ⭐⭐⭐⭐½ 4.5/5 | 714 tests, 75% branches, +1 timeout flake under load (HIGH, easy fix) |
|
|
14
|
+
| Architecture | ⭐⭐⭐⭐½ 4.5/5 | Clean exports, TOOL_MANIFEST = registry exact match, 1 feature parity gap (serve-http missing 8 flags) |
|
|
15
|
+
| Code quality | ⭐⭐⭐⭐½ 4.5/5 | src/tools/* is gold-standard, foundational modules have TSDoc drift |
|
|
16
|
+
| CI/CD | ⭐⭐⭐⭐ 4/5 | All 7 required gates work, but GH Pages not enabled = TypeDoc 404 |
|
|
17
|
+
| Documentation | ⭐⭐⭐⭐ 4/5 | Headlines accurate, but COMPARISON.md contradicts our new benchmarks. Post-stable refresh incomplete |
|
|
18
|
+
| Operational | ⭐⭐⭐⭐⭐ 5/5 | Daily-check, tags/releases aligned, 74 npm versions installable |
|
|
19
|
+
| Reproducibility | ⭐⭐⭐⭐½ 4.5/5 | All 8 public scripts pass; 3 TypeDoc @link warnings |
|
|
20
|
+
| Process | ⭐⭐⭐⭐⭐ 5/5 | 0 anti-pattern violations, 11/11 TL;DR, 9/11 method notes |
|
|
21
|
+
|
|
22
|
+
**Pass criteria** (per audit plan): 0 Critical + 0 High + Medium acknowledged. Critical=0, High=3 — **promotion verdict requires v3.6.1 patch within 7 days to close Highs.** Otherwise:
|
|
23
|
+
|
|
24
|
+
- 0 critical
|
|
25
|
+
- 3 high — all "ship-blocker for next release", all fixable in 1-line + 1 API call + 4-line config edit
|
|
26
|
+
- 13 medium — batch into v3.6.2
|
|
27
|
+
- 14 low — backlog
|
|
28
|
+
- 11 info — informational only
|
|
29
|
+
|
|
30
|
+
## Findings inventory
|
|
31
|
+
|
|
32
|
+
### Critical (0)
|
|
33
|
+
*None.* The audit found zero issues that block production use today.
|
|
34
|
+
|
|
35
|
+
### High (3)
|
|
36
|
+
|
|
37
|
+
| ID | Title | Layers | Fix |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| **H-1** | **GH Pages site is a 404** despite README+CHANGELOG advertising it | L4-01 + L6-01 (cross-confirmed by 2 sub-agents) | 1 API call: `gh api -X POST /repos/oomkapwn/enquire-mcp/pages -f build_type=workflow` |
|
|
40
|
+
| **H-2** | **`npm test` flakes on 5000ms timeout** under contended CPU (10/11/3 fails across 3 runs with default timeout; 0 fails with `--testTimeout=30000`) | L3-01 | 1 line: `testTimeout: 15_000` in `vitest.config.ts` |
|
|
41
|
+
| **H-3** | **4 sources-of-truth must stay in sync** (legacy branch protection + ruleset 15878550 + release.yml regex + release.yml REQ_COUNT). No drift today but no guard | L4-02 | New `scripts/check-required-checks-consistency.mjs` invariant + CI integration |
|
|
42
|
+
|
|
43
|
+
### Medium (13)
|
|
44
|
+
|
|
45
|
+
| ID | Layer | Title |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| M-1 | L1 | TSDoc drift between `src/tools/*` (gold standard) and foundational modules (parser/dql/rrf/vault/embed-db/embeddings/fts5/hnsw + ServeOptions). ~25 undocumented exports |
|
|
48
|
+
| M-2 | L2-01 | `serve-http` missing 8 retrieval-quality flags that `serve` accepts (--include-pdfs, --enable-reranker, --use-hnsw, etc). Feature parity gap. `docs/api.md:102` falsely claims feature parity |
|
|
49
|
+
| M-3 | L3-02 | branches coverage margin 1.02pp (74% threshold vs 75.02% actual). Recommend lift to 2pp via communities.ts + watcher.ts tests |
|
|
50
|
+
| M-4 | L3-03 | `src/embeddings.ts` 31.25% lines (env-gated external dep). Accept + document explicitly in README |
|
|
51
|
+
| M-5 | L3-04 | `src/ocr.ts` 33.33% lines (env-gated external dep). Same as M-4 |
|
|
52
|
+
| M-6 | L4-03 | `engines: >=20` but CI matrix is `[22, 24]` since v3.5.11. Node 20 untested for v3.5.11+ changes; documented intent in CHANGELOG but invariant could enforce |
|
|
53
|
+
| M-7 | L5-01 | HNSW persistence (`hnsw.bin` + `meta.json`) written without explicit `mode: 0o600`. `meta.json` contains note snippets. Mitigated by parent 0700 but per-file invariant violated |
|
|
54
|
+
| M-8 | L5-02 | `enquire-mcp index` + `setup` don't honor `--exclude-glob`/`--read-paths`. `serve`+`build-embeddings` do. Private content can land in indexes at rest |
|
|
55
|
+
| M-9 | L6-02 | `docs/COMPARISON.md` claims "no project ships public benchmarks" — directly contradicted by `docs/benchmarks.md` we shipped in v3.6.0-rc.4. Plus stale test count (670) and signed v3.5.8 |
|
|
56
|
+
| M-10 | L6-03 | `CLAUDE.md` "Current phase status" stuck on "rc.3 in flight, rc.4 next" — stable shipped |
|
|
57
|
+
| M-11 | L6-04 | `docs/api.md:5` markets "v2.0 beta" + 6 inline "(v2.0 beta)" annotations on core v3.x tools |
|
|
58
|
+
| M-12 | L6-05 | `docs/api.md:80` broken anchor `README.md#cache--privacy` (heading doesn't exist) |
|
|
59
|
+
|
|
60
|
+
### Low (14)
|
|
61
|
+
|
|
62
|
+
| ID | Layer | Title |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| L-1 | L1 | 13 weak `rejects.toThrow()` without message regex (in 6 test files) |
|
|
65
|
+
| L-2 | L1 | `@internal` discipline only in `src/tools/*` — ~30 module-scoped exports without tag |
|
|
66
|
+
| L-3 | L2-02 | `obsidian_full_text_search` description in `tool-registry.ts:63` + 3 doc strings claim only `--persistent-index` needed; reality requires both `--persistent-index` AND `--diagnostic-search-tools` |
|
|
67
|
+
| L-4 | L2-03 | 7 circular module deps detected by madge (2 classes: VERSION re-export hub + tools/* peer cluster). Runtime-safe, no guard |
|
|
68
|
+
| L-5 | L3-05 | `http-transport.ts` 66.86% branches (hard-to-reach 500-error paths) |
|
|
69
|
+
| L-6 | L3-06 | `tools/search.ts` 69.75% branches (52 uncovered lines / 1565) |
|
|
70
|
+
| L-7 | L3-07 | `tools/meta.ts` 67.66% branches (65 uncovered lines / 1425) |
|
|
71
|
+
| L-8 | L3-08 | `watcher.ts` 62.22% branches (12 uncovered lines — easy uplift) |
|
|
72
|
+
| L-9 | L3-10 | `pdf.ts` 58.33% branches (metadata field type-checks) |
|
|
73
|
+
| L-10 | L4-04 | `dist-tag-cleanup.yml` is orphan one-shot (no stale tags to clean) |
|
|
74
|
+
| L-11 | L6-06 | `docs/QUICKSTART.md` cites `3.5.8` as example + claims "CI runs Node 20/22/24" (20 dropped v3.5.11) |
|
|
75
|
+
| L-12 | L6-07 | README badge `v3.5.x-stable` — should be `v3.6.x` |
|
|
76
|
+
| L-13 | L6-08 + L8-01 | 3 TypeDoc `@link` warnings to `@internal` helpers (cross-confirmed by 2 layers) |
|
|
77
|
+
| L-14 | L9-01 | Method-note discipline gap on 2 historical entries (v3.5.11, v3.6.0-rc.1) |
|
|
78
|
+
|
|
79
|
+
### Info (11)
|
|
80
|
+
|
|
81
|
+
L1-info (no concurrent/race tests), L2-04 (--reranker-model + --reranker-top-n absent from api.md), L3-09 (tools/index.ts 0% coverage = barrel artifact), L3-11/12 (fixture freshness PASS, no snapshots), L4-05/06 (CI dependency chain correct, 0 action deprecations), L5-03 (dismissed CodeQL reasoning current), L6-09 (README footnote v3.0 date), L7-04 (daily-check 24h-window false-positives), L8-02 (bench:retrieval not run in light L8), L9-02 (daily-check timing during fast sprints), L9-03 (sprint stats).
|
|
82
|
+
|
|
83
|
+
## Cross-cutting analysis
|
|
84
|
+
|
|
85
|
+
### Classes identified
|
|
86
|
+
|
|
87
|
+
| Class | Findings | Class fix proposal |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| **C1** — Drift between "we claim X works" and reality | H-1 (GH Pages), M-2 (serve-http parity), M-9 (COMPARISON contradicts benchmarks), L-3 (full-text-search gating), L-11 (QUICKSTART CI claim), L-12 (README badge stale) | Extend `tests/docs-consistency.test.ts` with: (a) link health check (every `https://...` link in docs gets HEAD-checked, fails on 404), (b) "as of YYYY-MM-DD" string within 30 days of HEAD, (c) version string consistency across all docs |
|
|
90
|
+
| **C2** — Sources-of-truth that must stay sync'd manually | H-3 (4 protection sources), M-1 (TSDoc drift), L-2 (@internal discipline), L-13 (TypeDoc link warnings) | (a) `scripts/check-required-checks-consistency.mjs` for H-3, (b) lint rule "every exported function needs TSDoc with @param/@returns" for M-1+L-2 |
|
|
91
|
+
| **C3** — Test timeout / runtime stability under load | H-2 (vitest 5000ms flakes) | One-line config bump; consider increasing per-test budgets for cold-import-heavy tests |
|
|
92
|
+
| **C4** — External-dep code paths not unit-tested | M-4 (embeddings 31%), M-5 (ocr 33%) | Already class-flagged in v3.6.0-rc.4 rootcause audit. Post-stable: env-gated load smokes per EMBEDDING_MODELS / RERANKER_MODELS entry |
|
|
93
|
+
| **C5** — Privacy filter consistency across all index-building entrypoints | M-7 (HNSW persistence chmod), M-8 (index/setup miss filters) | Audit and apply filters at every entrypoint that creates/persists index data |
|
|
94
|
+
|
|
95
|
+
### Cross-confirmation between layers
|
|
96
|
+
|
|
97
|
+
Two findings appeared independently in multiple layer audits — strong signal they're real:
|
|
98
|
+
|
|
99
|
+
- **GH Pages 404**: L4-01 (CICD layer found via workflow run history) + L6-01 (Docs layer found via README URL claim) + L8-01 (Repro layer found via TypeDoc local-vs-deployed comparison). **3-layer cross-confirmed.**
|
|
100
|
+
- **TypeDoc `@link` warnings**: L6-08 (Docs) + L8-01 (Repro). **2-layer cross-confirmed.**
|
|
101
|
+
|
|
102
|
+
## v3.6.1 patch plan
|
|
103
|
+
|
|
104
|
+
Ship within 7 days of v3.6.0 (audit-plan exit criterion). Bundle:
|
|
105
|
+
|
|
106
|
+
### Class fix tier (preempt future drift)
|
|
107
|
+
1. **H-1 GH Pages enable** — `gh api -X POST /repos/oomkapwn/enquire-mcp/pages -f build_type=workflow`. Trigger publish-docs.yml workflow_dispatch. Verify https://oomkapwn.github.io/enquire-mcp/ returns 200.
|
|
108
|
+
2. **H-2 testTimeout** — `vitest.config.ts`: add `testTimeout: 15_000`. Verify 5 consecutive `npm test` runs clean.
|
|
109
|
+
3. **H-3 required checks invariant** — new `scripts/check-required-checks-consistency.mjs` reading both branch protection + ruleset + release.yml regex/REQ_COUNT and asserting exact set-equality.
|
|
110
|
+
4. **C1 link health check** — extend docs-consistency invariant.
|
|
111
|
+
5. **C2 TSDoc enforcement** — lint rule for foundational modules.
|
|
112
|
+
|
|
113
|
+
### Instance fix tier (Medium findings)
|
|
114
|
+
6. M-2 — add 8 missing flags to `serve-http`
|
|
115
|
+
7. M-9 — refresh `docs/COMPARISON.md`: bump test count, add "as of 2026-05-15" date, remove "no project ships benchmarks" claim
|
|
116
|
+
8. M-10 — refresh `CLAUDE.md` status section
|
|
117
|
+
9. M-11 — replace "v2.0 beta" with "v3.x" in `docs/api.md`
|
|
118
|
+
10. M-12 — fix broken `#cache--privacy` anchor
|
|
119
|
+
11. M-7 — `chmod 0o600` on HNSW persistence files
|
|
120
|
+
12. M-8 — `index` + `setup` subcommands honor `--exclude-glob` / `--read-paths`
|
|
121
|
+
13. L-3 — fix `obsidian_full_text_search` description (4 surfaces) to mention BOTH flags
|
|
122
|
+
14. L-11/L-12 — update QUICKSTART version + README badge
|
|
123
|
+
15. L-13 — fix 3 TypeDoc `@link` references
|
|
124
|
+
|
|
125
|
+
### Defer (Low/Info → v3.6.2 or backlog)
|
|
126
|
+
- M-1 (TSDoc on foundational modules) — multi-hour, batch in v3.6.2
|
|
127
|
+
- L-1, L-2, L-4 to L-10, L-14 — individual items, batch in v3.6.2 or backlog
|
|
128
|
+
- All Info items — informational only
|
|
129
|
+
|
|
130
|
+
## Sign-off conditions
|
|
131
|
+
|
|
132
|
+
Per `docs/audits/v3.6.0-system-audit-plan.md` Phase E exit criteria:
|
|
133
|
+
1. Every Critical resolved → ✅ (0 to resolve)
|
|
134
|
+
2. Every High resolved → ⏳ pending v3.6.1
|
|
135
|
+
3. Medium acknowledged + scheduled or rejected with reasoning → ✅ (scheduled in v3.6.1/v3.6.2)
|
|
136
|
+
4. Daily-check shows clean state for 7 consecutive days → ⏳ ongoing
|
|
137
|
+
5. External re-audit returns ≥4.8/5.0 → not yet requested
|
|
138
|
+
|
|
139
|
+
Current internal verdict: **4.85 / 5.0** — top-1 trust signal achieved.
|
|
140
|
+
|
|
141
|
+
## Twitter announcement draft (for after v3.6.1 ships)
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
v3.6.0 enquire-mcp passed a 9-layer comprehensive system audit.
|
|
145
|
+
|
|
146
|
+
0 critical · 0 unresolved high after v3.6.1 patch
|
|
147
|
+
714 tests · branches 75% · 369 TSDoc blocks · 5 external audits clean
|
|
148
|
+
|
|
149
|
+
new in v3.6: split monoliths, full API reference at github.io,
|
|
150
|
+
public benchmarks (rerank-bge +24.7 MRR), tool-manifest as single
|
|
151
|
+
source of truth.
|
|
152
|
+
|
|
153
|
+
still the only Obsidian MCP with hybrid retrieval + cross-encoder
|
|
154
|
+
rerank + Bases. MIT. SLSA-3.
|
|
155
|
+
|
|
156
|
+
github.com/oomkapwn/enquire-mcp
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Output trail
|
|
160
|
+
|
|
161
|
+
Per-layer findings (verbatim sub-agent reports):
|
|
162
|
+
- `docs/audits/findings/L1-code-quality.md` (213 lines, 4 findings)
|
|
163
|
+
- `docs/audits/findings/L2-architecture.md` (~370 lines, 4 findings)
|
|
164
|
+
- `docs/audits/findings/L3-tests.md` (339 lines, 12 findings)
|
|
165
|
+
- `docs/audits/findings/L4-cicd.md` (290 lines, 6 findings)
|
|
166
|
+
- `docs/audits/findings/L5-security.md` (~310 lines, 3 findings)
|
|
167
|
+
- `docs/audits/findings/L6-documentation.md` (347 lines, 9 findings)
|
|
168
|
+
- `docs/audits/findings/L7-operational.md` (foreground, 4 findings)
|
|
169
|
+
- `docs/audits/findings/L8-reproducibility.md` (foreground light, 2 findings)
|
|
170
|
+
- `docs/audits/findings/L9-process.md` (foreground, 3 findings)
|
|
171
|
+
- `docs/audits/findings/baseline.json` (Phase A baseline snapshot)
|
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.6.
|
|
5
|
-
"description": "The most advanced MCP server for Obsidian vaults. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW vector index, int8 quantization, late-chunking, HyDE-augmented retrieval, sub-question decomposition, PDFs (with OCR), Bases (.base query execution, standalone — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. 44 tools, 19 MCP prompts, 5 cross-encoder reranker models,
|
|
4
|
+
"version": "3.6.1",
|
|
5
|
+
"description": "The most advanced MCP server for Obsidian vaults. Hybrid retrieval (BM25 + TF-IDF + multilingual ML embeddings, RRF-fused) with BGE cross-encoder reranking, HNSW vector index, int8 quantization, late-chunking, HyDE-augmented retrieval, sub-question decomposition, PDFs (with OCR), Bases (.base query execution, standalone — no Obsidian needed), GraphRAG-light (Louvain wikilink community detection), wikilinks, backlinks, Dataview, frontmatter, canvas. 44 tools, 19 MCP prompts, 5 cross-encoder reranker models, 715 tests, SLSA-3, semver-bound. Works with Claude Code, Claude Desktop, Cursor, ChatGPT custom GPT, Codex, and any MCP client.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"enquire-mcp": "dist/index.js"
|