🛟 Updated.
fc4190d parent: 78672b6 modified
.tickets/issues/0104-how-to-search-in-a-documentation-markdown-files.yaml +73 -3 | @@ -6,18 +6,88 @@ author: | ||
| 6 | 6 | name: k33g |
| 7 | 7 | email: ph.charriere@gmail.com |
| 8 | 8 | createdAt: 2026-10-20T07:40:25.739Z |
| 9 | -updatedAt: 2026-10-20T07:43:51.546Z | |
| 9 | +updatedAt: 2026-10-20T19:00:00.000Z | |
| 10 | 10 | labels: [] |
| 11 | 11 | milestone: v0.8.0 |
| 12 | 12 | body: "" |
| 13 | 13 | tasks: |
| 14 | 14 | - id: 1 |
| 15 | 15 | title: Search if a specific CLI already exists |
| 16 | - state: open | |
| 16 | + state: closed | |
| 17 | 17 | priority: urgent |
| 18 | 18 | author: |
| 19 | 19 | name: k33g |
| 20 | 20 | email: ph.charriere@gmail.com |
| 21 | 21 | createdAt: 2026-10-20T07:43:45.685Z |
| 22 | 22 | updatedAt: 2026-10-20T07:43:51.543Z |
| 23 | -comments: [] | |
| 23 | +comments: | |
| 24 | + - id: 1 | |
| 25 | + author: | |
| 26 | + name: k33g | |
| 27 | + email: ph.charriere@gmail.com | |
| 28 | + createdAt: 2026-10-20T19:00:00.000Z | |
| 29 | + body: | | |
| 30 | + Task 1 — web search (2026-10-20). Yes: dedicated CLIs exist. "Read" = | |
| 31 | + checked on the project page; others are from search results only. | |
| 32 | + | |
| 33 | + ## The one that fits: qmd (github.com/tobi/qmd) — read | |
| 34 | + - "An on-device search engine for everything you need to remember": | |
| 35 | + markdown notes, transcripts, documentation. MIT. Node 22+ or Bun 1+; | |
| 36 | + `npm install -g @tobilu/qmd` (or `npx @tobilu/qmd …`). macOS needs | |
| 37 | + Homebrew SQLite. | |
| 38 | + - Index: SQLite (FTS5 + sqlite-vec) in ~/.cache/qmd/index.sqlite; | |
| 39 | + folders added as collections (`qmd collection add`), `qmd embed` | |
| 40 | + for vectors. Chunks ~900 tokens, 15 % overlap, cut at headings / | |
| 41 | + code fences / paragraphs. | |
| 42 | + - Three modes: `qmd search` = BM25 keywords, NO model; | |
| 43 | + `qmd vsearch` = vectors (embeddinggemma-300M Q8_0, ~300 MB — the same | |
| 44 | + model our llmman already has); `qmd query` = hybrid + query | |
| 45 | + expansion (qmd-query-expansion-1.7B, ~1.1 GB) + reranking | |
| 46 | + (qwen3-reranker-0.6b, ~640 MB). Models via node-llama-cpp, in | |
| 47 | + ~/.cache/qmd/models/. | |
| 48 | + - For agents: `--format json|csv|md|xml|files`, `--explain`, | |
| 49 | + `qmd get` / `multi-get`; `qmd mcp` (stdio, tools query, get, | |
| 50 | + multi_get, status, metadata) and `qmd mcp --http` (localhost:8181, | |
| 51 | + models loaded once). Last release seen: v2.5.3 (2026-05-28). | |
| 52 | + - Search results also list a Rust port (rqmd) — not checked. | |
| 53 | + | |
| 54 | + ## Other tools | |
| 55 | + - mdq (github.com/yshavit/mdq, Rust, MIT/Apache) — read: "jq for | |
| 56 | + Markdown", selects sections (`mdq '# usage'`), lists, links, tables | |
| 57 | + in ONE document (stdin); `--output json`. A complement (extract the | |
| 58 | + section a search found), not a search engine. | |
| 59 | + - NoteBrain (Go, MIT) — read: semantic search, local ONNX | |
| 60 | + all-MiniLM-L6-v2, embedded ChromaDB, JSON/TSV output; built around | |
| 61 | + Obsidian vaults (wikilinks), needs CGO; no MCP mentioned. | |
| 62 | + - From search results only: docbert (Rust, BM25 then ColBERT | |
| 63 | + rerank), mdsearch-cli (Python, sentence-transformers + FAISS, CLI + | |
| 64 | + MCP; needs a Hugging Face token), obsidian-notes-rag (embeddings via | |
| 65 | + Ollama/LM Studio, sqlite-vec), srcsearch (Tantivy BM25 over Rust + | |
| 66 | + Markdown), grepdown / fastkb / mdquery (SQLite FTS5), zk (Go, notes | |
| 67 | + with a full-text index), mq (harehare, jq-like for Markdown), | |
| 68 | + puya/mdparser (Python, section-limited search). ripgrep has no | |
| 69 | + section-aware mode (`rg -t md` only filters files). | |
| 70 | + | |
| 71 | + ## What it means for mini-me (proposal, to decide) | |
| 72 | + mm needs no new code to use qmd: it already has MCP over stdio and | |
| 73 | + declared tools (ticket 88). | |
| 74 | + 1. MCP: `qmd mcp` as an MCP server → the model gets query / get. | |
| 75 | + 2. Declared tool: `qmd search {{query}} --format json -c docs` (BM25, | |
| 76 | + no model loaded beside the chat model — fits a small machine), and | |
| 77 | + optionally `qmd query` for the hybrid mode when RAM allows. | |
| 78 | + 3. A demo (e.g. demos/docs-search/) on mm's own docs/ (EN+FR): measure | |
| 79 | + BM25 vs hybrid on a small model, and whether hybrid fixes what | |
| 80 | + search_memory cannot (FR question / EN text, synonyms — ticket 48 | |
| 81 | + comment 3). | |
| 82 | + Trade-off: qmd brings Node/Bun and its own model downloads (up to | |
| 83 | + ~2 GB for `qmd query`); `qmd search` alone is model-free. | |
| 84 | + - id: 2 | |
| 85 | + author: | |
| 86 | + name: k33g | |
| 87 | + email: ph.charriere@gmail.com | |
| 88 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 89 | + body: | | |
| 90 | + Decided by the user: build it into mm — a new built-in tool search_doc, | |
| 91 | + BM25, passages with the link to their file; search_memory is kept as | |
| 92 | + it is. Ticket 106. | |
| 93 | + | |
| @@ -6,18 +6,88 @@ author: | |||
| 6 | name: k33g | 6 | name: k33g |
| 7 | email: ph.charriere@gmail.com | 7 | email: ph.charriere@gmail.com |
| 8 | createdAt: 2026-10-20T07:40:25.739Z | 8 | createdAt: 2026-10-20T07:40:25.739Z |
| 9 | -updatedAt: 2026-10-20T07:43:51.546Z | 9 | +updatedAt: 2026-10-20T19:00:00.000Z |
| 10 | labels: [] | 10 | labels: [] |
| 11 | milestone: v0.8.0 | 11 | milestone: v0.8.0 |
| 12 | body: "" | 12 | body: "" |
| 13 | tasks: | 13 | tasks: |
| 14 | - id: 1 | 14 | - id: 1 |
| 15 | title: Search if a specific CLI already exists | 15 | title: Search if a specific CLI already exists |
| 16 | - state: open | 16 | + state: closed |
| 17 | priority: urgent | 17 | priority: urgent |
| 18 | author: | 18 | author: |
| 19 | name: k33g | 19 | name: k33g |
| 20 | email: ph.charriere@gmail.com | 20 | email: ph.charriere@gmail.com |
| 21 | createdAt: 2026-10-20T07:43:45.685Z | 21 | createdAt: 2026-10-20T07:43:45.685Z |
| 22 | updatedAt: 2026-10-20T07:43:51.543Z | 22 | updatedAt: 2026-10-20T07:43:51.543Z |
| 23 | -comments: [] | 23 | +comments: |
| 24 | + - id: 1 | ||
| 25 | + author: | ||
| 26 | + name: k33g | ||
| 27 | + email: ph.charriere@gmail.com | ||
| 28 | + createdAt: 2026-10-20T19:00:00.000Z | ||
| 29 | + body: | | ||
| 30 | + Task 1 — web search (2026-10-20). Yes: dedicated CLIs exist. "Read" = | ||
| 31 | + checked on the project page; others are from search results only. | ||
| 32 | + | ||
| 33 | + ## The one that fits: qmd (github.com/tobi/qmd) — read | ||
| 34 | + - "An on-device search engine for everything you need to remember": | ||
| 35 | + markdown notes, transcripts, documentation. MIT. Node 22+ or Bun 1+; | ||
| 36 | + `npm install -g @tobilu/qmd` (or `npx @tobilu/qmd …`). macOS needs | ||
| 37 | + Homebrew SQLite. | ||
| 38 | + - Index: SQLite (FTS5 + sqlite-vec) in ~/.cache/qmd/index.sqlite; | ||
| 39 | + folders added as collections (`qmd collection add`), `qmd embed` | ||
| 40 | + for vectors. Chunks ~900 tokens, 15 % overlap, cut at headings / | ||
| 41 | + code fences / paragraphs. | ||
| 42 | + - Three modes: `qmd search` = BM25 keywords, NO model; | ||
| 43 | + `qmd vsearch` = vectors (embeddinggemma-300M Q8_0, ~300 MB — the same | ||
| 44 | + model our llmman already has); `qmd query` = hybrid + query | ||
| 45 | + expansion (qmd-query-expansion-1.7B, ~1.1 GB) + reranking | ||
| 46 | + (qwen3-reranker-0.6b, ~640 MB). Models via node-llama-cpp, in | ||
| 47 | + ~/.cache/qmd/models/. | ||
| 48 | + - For agents: `--format json|csv|md|xml|files`, `--explain`, | ||
| 49 | + `qmd get` / `multi-get`; `qmd mcp` (stdio, tools query, get, | ||
| 50 | + multi_get, status, metadata) and `qmd mcp --http` (localhost:8181, | ||
| 51 | + models loaded once). Last release seen: v2.5.3 (2026-05-28). | ||
| 52 | + - Search results also list a Rust port (rqmd) — not checked. | ||
| 53 | + | ||
| 54 | + ## Other tools | ||
| 55 | + - mdq (github.com/yshavit/mdq, Rust, MIT/Apache) — read: "jq for | ||
| 56 | + Markdown", selects sections (`mdq '# usage'`), lists, links, tables | ||
| 57 | + in ONE document (stdin); `--output json`. A complement (extract the | ||
| 58 | + section a search found), not a search engine. | ||
| 59 | + - NoteBrain (Go, MIT) — read: semantic search, local ONNX | ||
| 60 | + all-MiniLM-L6-v2, embedded ChromaDB, JSON/TSV output; built around | ||
| 61 | + Obsidian vaults (wikilinks), needs CGO; no MCP mentioned. | ||
| 62 | + - From search results only: docbert (Rust, BM25 then ColBERT | ||
| 63 | + rerank), mdsearch-cli (Python, sentence-transformers + FAISS, CLI + | ||
| 64 | + MCP; needs a Hugging Face token), obsidian-notes-rag (embeddings via | ||
| 65 | + Ollama/LM Studio, sqlite-vec), srcsearch (Tantivy BM25 over Rust + | ||
| 66 | + Markdown), grepdown / fastkb / mdquery (SQLite FTS5), zk (Go, notes | ||
| 67 | + with a full-text index), mq (harehare, jq-like for Markdown), | ||
| 68 | + puya/mdparser (Python, section-limited search). ripgrep has no | ||
| 69 | + section-aware mode (`rg -t md` only filters files). | ||
| 70 | + | ||
| 71 | + ## What it means for mini-me (proposal, to decide) | ||
| 72 | + mm needs no new code to use qmd: it already has MCP over stdio and | ||
| 73 | + declared tools (ticket 88). | ||
| 74 | + 1. MCP: `qmd mcp` as an MCP server → the model gets query / get. | ||
| 75 | + 2. Declared tool: `qmd search {{query}} --format json -c docs` (BM25, | ||
| 76 | + no model loaded beside the chat model — fits a small machine), and | ||
| 77 | + optionally `qmd query` for the hybrid mode when RAM allows. | ||
| 78 | + 3. A demo (e.g. demos/docs-search/) on mm's own docs/ (EN+FR): measure | ||
| 79 | + BM25 vs hybrid on a small model, and whether hybrid fixes what | ||
| 80 | + search_memory cannot (FR question / EN text, synonyms — ticket 48 | ||
| 81 | + comment 3). | ||
| 82 | + Trade-off: qmd brings Node/Bun and its own model downloads (up to | ||
| 83 | + ~2 GB for `qmd query`); `qmd search` alone is model-free. | ||
| 84 | + - id: 2 | ||
| 85 | + author: | ||
| 86 | + name: k33g | ||
| 87 | + email: ph.charriere@gmail.com | ||
| 88 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 89 | + body: | | ||
| 90 | + Decided by the user: build it into mm — a new built-in tool search_doc, | ||
| 91 | + BM25, passages with the link to their file; search_memory is kept as | ||
| 92 | + it is. Ticket 106. | ||
| 93 | + | ||
added
.tickets/issues/0106-search-doc-bm25-search-in-text-files.yaml +131 -0 | new file mode 100644 | ||
| @@ -0,0 +1,131 @@ | ||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | |
| 2 | +id: 106 | |
| 3 | +title: search_doc — BM25 search in the text files of a folder (built-in tool) | |
| 4 | +state: open | |
| 5 | +author: | |
| 6 | + name: k33g | |
| 7 | + email: ph.charriere@gmail.com | |
| 8 | +createdAt: 2026-10-20T20:00:00.000Z | |
| 9 | +updatedAt: 2026-10-20T20:00:00.000Z | |
| 10 | +labels: | |
| 11 | + - kind::feature | |
| 12 | +milestone: v0.8.0 | |
| 13 | +epic: Builtin tools | |
| 14 | +related: | |
| 15 | + - 104 | |
| 16 | + - 48 | |
| 17 | +body: | | |
| 18 | + A built-in tool, search_doc, that lets the agent search the text files of | |
| 19 | + one or more folders — Markdown (.md), plain text (.txt), AsciiDoc (.adoc, | |
| 20 | + .asciidoc)… — and get back the relevant passages, each with the link to | |
| 21 | + its file. Ranking: BM25, no model (like `qmd search`, ticket 104). | |
| 22 | + | |
| 23 | + User's decisions (2026-10-20): | |
| 24 | + - a NEW tool, search_doc; search_memory (ticket 48) is NOT replaced and | |
| 25 | + keeps its own engine; | |
| 26 | + - BM25; | |
| 27 | + - each passage comes with the link to its file. | |
| 28 | + | |
| 29 | + Proposal (to confirm before coding): | |
| 30 | + - Config block, off by default so no existing agent changes: | |
| 31 | + docSearch: | |
| 32 | + enabled: true | |
| 33 | + dirs: [docs] # relative to the working directory | |
| 34 | + # (the session cwd over ACP); absolute ok | |
| 35 | + extensions: [.md, .markdown, .txt, .adoc, .asciidoc, .rst] | |
| 36 | + maxFileSize: 1MB # bigger files skipped, banner-free | |
| 37 | + - Tool search_doc {query, limit?} (limit default 5, cap 20). One hit per | |
| 38 | + passage: | |
| 39 | + docs/en/how-to/keep-sessions.md:46 · Keep sessions › Find out why a run failed | |
| 40 | + …the text of the passage around the words found… | |
| 41 | + The link is the path relative to the working directory plus the | |
| 42 | + passage's first line (`path:line`), what an editor and read_file both | |
| 43 | + take; the model can then read_file the whole page. | |
| 44 | + - Passages = sections: a Markdown / AsciiDoc heading starts one (headings | |
| 45 | + inside code fences ignored), keeping the heading path; plain text is cut | |
| 46 | + at blank lines; a long section is cut by paragraphs (~1,500 chars). | |
| 47 | + - Words: the same folding as search_memory (case and accents do not | |
| 48 | + count). BM25 k1 1.2, b 0.75, IDF over the passages of the folders; words | |
| 49 | + found in a heading weigh more. | |
| 50 | + - No index: the folders are read at each call. Measured for scale: mm's | |
| 51 | + docs/ = 133 .md files, 1.3 MB, ~152k words, 1,208 headings. | |
| 52 | + - Never asks for permission (it only reads, like read_file); ACP tool | |
| 53 | + kind `search`; output capped by maxOutput. | |
| 54 | + | |
| 55 | + Known limits (stated up front): no stemming ("migration" ≠ | |
| 56 | + "migrations" unless prefix matching is added); no match across languages | |
| 57 | + or synonyms — the same class of limit as search_memory (ticket 48 | |
| 58 | + comment 3) and as qmd's own BM25 mode. | |
| 59 | + | |
| 60 | + Open questions: | |
| 61 | + - a /docs <words> command for the user too, as /memory is for | |
| 62 | + search_memory? | |
| 63 | + - prefix matching for words of 4+ letters (a cheap answer to plurals), or | |
| 64 | + exact words only? | |
| 65 | + - other extensions by default (.rst, .org, .html)? follow symlinks? | |
| 66 | + - the key name: `docSearch` (proposed) or under an existing block? | |
| 67 | +tasks: | |
| 68 | + - id: 1 | |
| 69 | + title: "Agree on the config key, defaults and the open questions below" | |
| 70 | + state: open | |
| 71 | + priority: none | |
| 72 | + author: | |
| 73 | + name: k33g | |
| 74 | + email: ph.charriere@gmail.com | |
| 75 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 76 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 77 | + - id: 2 | |
| 78 | + title: "docsearch: chunker — Markdown (# headings, not inside code fences), AsciiDoc (= headings), plain text (blank-line paragraphs); heading path and line kept; long sections split by paragraphs — with tests" | |
| 79 | + state: open | |
| 80 | + priority: none | |
| 81 | + author: | |
| 82 | + name: k33g | |
| 83 | + email: ph.charriere@gmail.com | |
| 84 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 85 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 86 | + - id: 3 | |
| 87 | + title: "docsearch: BM25 (k1 1.2, b 0.75) over the chunks, words folded like store.fold (case, accents), heading boost — with tests" | |
| 88 | + state: open | |
| 89 | + priority: none | |
| 90 | + author: | |
| 91 | + name: k33g | |
| 92 | + email: ph.charriere@gmail.com | |
| 93 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 94 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 95 | + - id: 4 | |
| 96 | + title: "docsearch: walk the folders (extensions, size cap, skip hidden dirs, .git, node_modules), scanned at each call, no index — with tests" | |
| 97 | + state: open | |
| 98 | + priority: none | |
| 99 | + author: | |
| 100 | + name: k33g | |
| 101 | + email: ph.charriere@gmail.com | |
| 102 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 103 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 104 | + - id: 5 | |
| 105 | + title: "built-in tool search_doc {query, limit?}: hits = path:line, heading path, snippet; declared only when the config enables it; never asks; ACP kind search — with tests" | |
| 106 | + state: open | |
| 107 | + priority: none | |
| 108 | + author: | |
| 109 | + name: k33g | |
| 110 | + email: ph.charriere@gmail.com | |
| 111 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 112 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 113 | + - id: 6 | |
| 114 | + title: "Measure on a small model (llmman) over mm's own docs/ (EN+FR): found when the words are there, not called otherwise; time per call on docs/" | |
| 115 | + state: open | |
| 116 | + priority: none | |
| 117 | + author: | |
| 118 | + name: k33g | |
| 119 | + email: ph.charriere@gmail.com | |
| 120 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 121 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 122 | + - id: 7 | |
| 123 | + title: "Docs EN+FR (reference configuration and tools, how-to, explanation: why BM25 and no index), demo if useful, quality gate, .memory" | |
| 124 | + state: open | |
| 125 | + priority: none | |
| 126 | + author: | |
| 127 | + name: k33g | |
| 128 | + email: ph.charriere@gmail.com | |
| 129 | + createdAt: 2026-10-20T20:00:00.000Z | |
| 130 | + updatedAt: 2026-10-20T20:00:00.000Z | |
| 131 | +comments: [] | |
| new file mode 100644 | |||
| @@ -0,0 +1,131 @@ | |||
| 1 | +# Managed by IssueSpec. Hand edits are welcome; keep the schema valid. | ||
| 2 | +id: 106 | ||
| 3 | +title: search_doc — BM25 search in the text files of a folder (built-in tool) | ||
| 4 | +state: open | ||
| 5 | +author: | ||
| 6 | + name: k33g | ||
| 7 | + email: ph.charriere@gmail.com | ||
| 8 | +createdAt: 2026-10-20T20:00:00.000Z | ||
| 9 | +updatedAt: 2026-10-20T20:00:00.000Z | ||
| 10 | +labels: | ||
| 11 | + - kind::feature | ||
| 12 | +milestone: v0.8.0 | ||
| 13 | +epic: Builtin tools | ||
| 14 | +related: | ||
| 15 | + - 104 | ||
| 16 | + - 48 | ||
| 17 | +body: | | ||
| 18 | + A built-in tool, search_doc, that lets the agent search the text files of | ||
| 19 | + one or more folders — Markdown (.md), plain text (.txt), AsciiDoc (.adoc, | ||
| 20 | + .asciidoc)… — and get back the relevant passages, each with the link to | ||
| 21 | + its file. Ranking: BM25, no model (like `qmd search`, ticket 104). | ||
| 22 | + | ||
| 23 | + User's decisions (2026-10-20): | ||
| 24 | + - a NEW tool, search_doc; search_memory (ticket 48) is NOT replaced and | ||
| 25 | + keeps its own engine; | ||
| 26 | + - BM25; | ||
| 27 | + - each passage comes with the link to its file. | ||
| 28 | + | ||
| 29 | + Proposal (to confirm before coding): | ||
| 30 | + - Config block, off by default so no existing agent changes: | ||
| 31 | + docSearch: | ||
| 32 | + enabled: true | ||
| 33 | + dirs: [docs] # relative to the working directory | ||
| 34 | + # (the session cwd over ACP); absolute ok | ||
| 35 | + extensions: [.md, .markdown, .txt, .adoc, .asciidoc, .rst] | ||
| 36 | + maxFileSize: 1MB # bigger files skipped, banner-free | ||
| 37 | + - Tool search_doc {query, limit?} (limit default 5, cap 20). One hit per | ||
| 38 | + passage: | ||
| 39 | + docs/en/how-to/keep-sessions.md:46 · Keep sessions › Find out why a run failed | ||
| 40 | + …the text of the passage around the words found… | ||
| 41 | + The link is the path relative to the working directory plus the | ||
| 42 | + passage's first line (`path:line`), what an editor and read_file both | ||
| 43 | + take; the model can then read_file the whole page. | ||
| 44 | + - Passages = sections: a Markdown / AsciiDoc heading starts one (headings | ||
| 45 | + inside code fences ignored), keeping the heading path; plain text is cut | ||
| 46 | + at blank lines; a long section is cut by paragraphs (~1,500 chars). | ||
| 47 | + - Words: the same folding as search_memory (case and accents do not | ||
| 48 | + count). BM25 k1 1.2, b 0.75, IDF over the passages of the folders; words | ||
| 49 | + found in a heading weigh more. | ||
| 50 | + - No index: the folders are read at each call. Measured for scale: mm's | ||
| 51 | + docs/ = 133 .md files, 1.3 MB, ~152k words, 1,208 headings. | ||
| 52 | + - Never asks for permission (it only reads, like read_file); ACP tool | ||
| 53 | + kind `search`; output capped by maxOutput. | ||
| 54 | + | ||
| 55 | + Known limits (stated up front): no stemming ("migration" ≠ | ||
| 56 | + "migrations" unless prefix matching is added); no match across languages | ||
| 57 | + or synonyms — the same class of limit as search_memory (ticket 48 | ||
| 58 | + comment 3) and as qmd's own BM25 mode. | ||
| 59 | + | ||
| 60 | + Open questions: | ||
| 61 | + - a /docs <words> command for the user too, as /memory is for | ||
| 62 | + search_memory? | ||
| 63 | + - prefix matching for words of 4+ letters (a cheap answer to plurals), or | ||
| 64 | + exact words only? | ||
| 65 | + - other extensions by default (.rst, .org, .html)? follow symlinks? | ||
| 66 | + - the key name: `docSearch` (proposed) or under an existing block? | ||
| 67 | +tasks: | ||
| 68 | + - id: 1 | ||
| 69 | + title: "Agree on the config key, defaults and the open questions below" | ||
| 70 | + state: open | ||
| 71 | + priority: none | ||
| 72 | + author: | ||
| 73 | + name: k33g | ||
| 74 | + email: ph.charriere@gmail.com | ||
| 75 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 76 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 77 | + - id: 2 | ||
| 78 | + title: "docsearch: chunker — Markdown (# headings, not inside code fences), AsciiDoc (= headings), plain text (blank-line paragraphs); heading path and line kept; long sections split by paragraphs — with tests" | ||
| 79 | + state: open | ||
| 80 | + priority: none | ||
| 81 | + author: | ||
| 82 | + name: k33g | ||
| 83 | + email: ph.charriere@gmail.com | ||
| 84 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 85 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 86 | + - id: 3 | ||
| 87 | + title: "docsearch: BM25 (k1 1.2, b 0.75) over the chunks, words folded like store.fold (case, accents), heading boost — with tests" | ||
| 88 | + state: open | ||
| 89 | + priority: none | ||
| 90 | + author: | ||
| 91 | + name: k33g | ||
| 92 | + email: ph.charriere@gmail.com | ||
| 93 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 94 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 95 | + - id: 4 | ||
| 96 | + title: "docsearch: walk the folders (extensions, size cap, skip hidden dirs, .git, node_modules), scanned at each call, no index — with tests" | ||
| 97 | + state: open | ||
| 98 | + priority: none | ||
| 99 | + author: | ||
| 100 | + name: k33g | ||
| 101 | + email: ph.charriere@gmail.com | ||
| 102 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 103 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 104 | + - id: 5 | ||
| 105 | + title: "built-in tool search_doc {query, limit?}: hits = path:line, heading path, snippet; declared only when the config enables it; never asks; ACP kind search — with tests" | ||
| 106 | + state: open | ||
| 107 | + priority: none | ||
| 108 | + author: | ||
| 109 | + name: k33g | ||
| 110 | + email: ph.charriere@gmail.com | ||
| 111 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 112 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 113 | + - id: 6 | ||
| 114 | + title: "Measure on a small model (llmman) over mm's own docs/ (EN+FR): found when the words are there, not called otherwise; time per call on docs/" | ||
| 115 | + state: open | ||
| 116 | + priority: none | ||
| 117 | + author: | ||
| 118 | + name: k33g | ||
| 119 | + email: ph.charriere@gmail.com | ||
| 120 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 121 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 122 | + - id: 7 | ||
| 123 | + title: "Docs EN+FR (reference configuration and tools, how-to, explanation: why BM25 and no index), demo if useful, quality gate, .memory" | ||
| 124 | + state: open | ||
| 125 | + priority: none | ||
| 126 | + author: | ||
| 127 | + name: k33g | ||
| 128 | + email: ph.charriere@gmail.com | ||
| 129 | + createdAt: 2026-10-20T20:00:00.000Z | ||
| 130 | + updatedAt: 2026-10-20T20:00:00.000Z | ||
| 131 | +comments: [] | ||