feat(wiki): docs-lookup plugin against Quartz contentIndex

New maubot plugin that points at any Quartz-rendered docs site and
answers chat queries by full-text searching its emitted
/static/contentIndex.json. Default config targets docs.ariege.io
(castle-docs).

Commands:
  !ask <query>            search corpus; top-N hits with snippet + link
  !doc <slug-or-title>    open a specific page (fuzzy title match)
  !wiki / !wiki refresh   status / force re-index

Architecture:
- Periodic fetch (default 10 min) of /static/contentIndex.json
- In-memory inverted-ish scoring: title hit 5pt, content hit 1pt + freq
- No LLM — pure deterministic keyword search; RAG is future Phase 2b
- No DB — index is upstream-derived cache, repopulates on bot restart

Deployment posture: docs.ariege.io is served from cfaun alongside
maubot, so the bot hits it over the host's internal network — works
during WAN outages. base-config.yaml exposes docs_url + index_path
for adopters pointing at their own site.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-24 16:40:11 +02:00
commit 8f83d8df5e
5 changed files with 382 additions and 0 deletions

21
wiki/base-config.yaml Normal file
View file

@ -0,0 +1,21 @@
# Wiki lookup config. Point at any Quartz-emitted site:
# `docs_url` + `index_path` together resolve to the contentIndex.json
# the bot uses for search. Page links are constructed from docs_url + slug.
docs_url: https://docs.ariege.io
index_path: /static/contentIndex.json
# How often to re-fetch the content index, in minutes. Lower = fresher
# but more network chatter. Site refreshes typically happen on git push,
# so a few minutes lag is normal.
refresh_minutes: 10
# Max results returned per `!ask` query.
max_results: 3
# Snippet window around the first match in `!ask` output, in characters.
snippet_chars: 160
# Human-readable label for the docs site, used in bot output.
# E.g. "Castle Docs", "Co-op Wiki", "Operations Manual".
site_name: Castle Docs