Author SHA1 Message Date
skoandClaude Opus 5 72a1ca284a mediawiki: Suchfehler lesbar statt als Stacktrace (0.1.1)
Gleichstand mit inmedias.it/dokumentierer d1eeb94.

Eine von CirrusSearch abgelehnte Suchanfrage liess mwclient.errors.APIError
bis nach oben durchschlagen - der Benutzer sah einen Stacktrace statt einer
Meldung. cmd_search faengt den Fehler jetzt ab und beendet mit Code 1.

Fuer cirrussearch-parse-error gibt es einen eigenen Hinweis: "insource:wort"
funktioniert, die Regex-Form "insource:/muster/" nicht. Letztere braucht das
Elasticsearch-Plugin wikimedia-extra, das auf unserer Instanz fehlt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-06 11:51:07 +02:00
skoandClaude Opus 5 7efb302c10 mediawiki: purge-Subcommand und der Parser-Cache-Fallstrick
wiki.py mit dokumentierer/wiki.py synchronisiert (purge-Subcommand).

SKILL.md: purge und das bisher undokumentierte upload in die
Befehlsliste, dazu ein Abschnitt zu Seiten mit #get_web_data. Die
Vorlagen werden nicht bei jedem Aufruf ausgefuehrt; wer nach einer
Datenaenderung render aufruft und alte Werte sieht, hat meist den Cache
vor sich und nicht kaputte Daten.

description um den Fall erweitert, damit die Skill bei "Wiki zeigt
veraltete Daten" gefunden wird. version 0.1.0 -> 0.2.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-24 05:10:54 +02:00
3 changed files with 65 additions and 10 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "mediawiki",
"version": "0.1.0",
"version": "0.1.1",
"description": "MediaWiki-Seiten/Templates lesen, rendern und schreiben via wiki.py (fetch/update/render/search, Instanzen wiki & devwiki).",
"author": {
"name": "inmedias.it"
+25 -2
View File
@@ -1,7 +1,7 @@
---
name: mediawiki
description: MediaWiki-Seiten und -Templates lesen, rendern und schreiben. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite".
version: 0.1.0
description: MediaWiki-Seiten und -Templates lesen, rendern, schreiben und deren Parser-Cache leeren. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite", or when a page shows stale API data.
version: 0.2.0
---
# MediaWiki (wiki.py)
@@ -37,6 +37,8 @@ oder anderen direkten Server-Eingriffen. Reine Lese-/Render-Checks
./wiki.py -w devwiki search "Suchbegriff" [-n <namespace>] # Titelsuche
./wiki.py -w devwiki update "Kunde:Beispiel GmbH" datei.wiki --summary "..." # speichern
./wiki.py -w wiki update "Titel" - --summary "..." # Inhalt von stdin
./wiki.py -w wiki purge "Titel" ["Titel 2" ...] [--links] # Parser-Cache leeren
./wiki.py -w wiki upload /pfad/bild.png bild.png --description "..." # Datei hochladen
```
Tipp: Beim Schreiben den Inhalt aus einer Datei (`datei.wiki`) oder `-` (stdin)
@@ -57,6 +59,27 @@ dann `.env` im aktuellen Verzeichnis, dann bereits gesetzte Env-Variablen). Sieh
Es empfiehlt sich ein eigener Bot-/Service-Account mit den nötigen Schreibrechten.
## Seiten, die ihre Daten aus einer API holen
Vorlagen mit `#get_web_data` (External Data) werden **nicht** bei jedem
Seitenaufruf ausgeführt. MediaWiki liefert die Seite aus dem Parser-Cache und
fragt die API gar nicht erst an. Ändern sich die Daten hinter der API, zeigt
die Seite weiter beliebig alte Werte — ohne Fehlermeldung, ohne dass es
jemandem auffällt.
Deshalb gehört nach jedem Datenupload ein Purge:
```bash
./wiki.py -w wiki purge "Nextcloud (Hosting)"
```
`--links` schaltet zusätzlich `forcelinkupdate` ein (langsamer, aktualisiert
die Linktabellen) — für reine Datenaktualisierungen nicht nötig.
Das betrifft auch die Fehlersuche: Wer nach einer Änderung `render` aufruft und
die alten Werte sieht, hat meist nicht die Daten kaputt, sondern nur den Cache
vor sich. Erst purgen, dann urteilen.
## Hinweise
- `search` liefert Titel; `render` ist nützlich, um vor/nach dem Schreiben das
Ergebnis zu prüfen, ohne die Seite im Browser zu öffnen.
+39 -7
View File
@@ -88,13 +88,20 @@ def cmd_search(args: argparse.Namespace) -> None:
sys.exit(f"Error: unknown namespace '{ns_key}'. "
f"Known: all, {', '.join(NAMESPACES)}")
result = site.api(
"query", list="search",
srsearch=args.query,
srnamespace=ns,
srlimit=50,
srprop="title|snippet",
)
try:
result = site.api(
"query", list="search",
srsearch=args.query,
srnamespace=ns,
srlimit=50,
srprop="title|snippet",
)
except mwclient.errors.APIError as exc:
if exc.code == "cirrussearch-parse-error":
sys.exit(f"Error: Suchanfrage nicht verstanden: {args.query!r}\n"
f"Hinweis: 'insource:wort' funktioniert, die Regex-Form "
f"'insource:/muster/' ist auf dieser Instanz nicht freigeschaltet.")
sys.exit(f"Error: Suche fehlgeschlagen ({exc.code}): {exc.info}")
hits = result["query"]["search"]
if not hits:
print("(keine Ergebnisse)", file=sys.stderr)
@@ -110,6 +117,25 @@ def cmd_render(args: argparse.Namespace) -> None:
print(result["parse"]["text"]["*"], end="")
def cmd_purge(args: argparse.Namespace) -> None:
"""Parser-Cache einer oder mehrerer Seiten leeren.
Noetig fuer Seiten, die ihre Daten per #get_web_data aus einer API holen:
MediaWiki rendert sonst aus dem Parser-Cache weiter und fragt die API gar
nicht erst an - die Seite zeigt dann beliebig alte Werte, ohne dass das
irgendwo auffaellt.
"""
site = get_site(args.wiki)
result = site.api("purge", titles="|".join(args.titles),
forcelinkupdate=1 if args.links else None)
for entry in result.get("purge", []):
title = entry.get("title", "?")
if "missing" in entry:
print(f"Error: page '{title}' does not exist", file=sys.stderr)
else:
print(f"Purged '{title}'")
def cmd_upload(args: argparse.Namespace) -> None:
path = Path(args.file_path)
if not path.exists():
@@ -161,6 +187,12 @@ def main() -> None:
render_p.add_argument("title", help="Page title")
render_p.set_defaults(func=cmd_render)
purge_p = sub.add_parser("purge", help="Clear the parser cache of one or more pages")
purge_p.add_argument("titles", nargs="+", help="Page title(s)")
purge_p.add_argument("--links", action="store_true",
help="Also run forcelinkupdate (slower, updates link tables)")
purge_p.set_defaults(func=cmd_purge)
upload_p = sub.add_parser("upload", help="Upload a local file to the wiki file store")
upload_p.add_argument("file_path", help="Absolute path to the local file")
upload_p.add_argument("wiki_filename", help="Target filename on the wiki (without 'File:' prefix)")