Add Claude Desktop extensions (.mcpb) for WordCraft and GridCraft.

Ship unsigned MCPB packages built from the ArtCraft Launcher CLIs, with install docs and skill 0.2.0 updates.
This commit is contained in:
Dominic Gundel committed 2026-10-19 16:07:21 +02:00
1 parent 3ac6cd5a29
commit 2fd4164ee7
36 files changed
+1412 -116

No files matched your search

+32 -3
View File
@@ -1,6 +1,6 @@
# Mitarbeiten
Kollegen installieren einen Skill ohne Git: ZIP aus der Tabelle in der [README](README.md) laden und in Claude hochladen. Dieser Text ist für alle, die einen Skill anlegen oder aktualisieren.
Einen Skill ohne Git installieren: ZIP aus der Tabelle in der [README](README.md) laden und in Claude hochladen. Dieser Text ist für alle, die einen Skill anlegen oder aktualisieren.
## Aufbau eines Skills
@@ -9,12 +9,18 @@ skills/<name>/
├── SKILL.md Pflicht – Anweisungen für Claude (liegt im ZIP)
├── README.md Pflicht – Doku für Menschen (nicht im ZIP)
├── CHANGELOG.md Pflicht – Versionen (nicht im ZIP)
├── extension/ optional – Claude-Desktop-Erweiterung (.mcpb)
│ ├── manifest.json
│ ├── icon.png optional
│ ├── upstream.json von scripts/fetch-cli geschrieben
│ ├── LICENSES/ Upstream-Lizenztexte
│ └── server/ CLI-exe nur beim Bauen (nicht committen)
├── scripts/ optional – Hilfsskripte, die Claude ausführen kann
├── references/ optional – Nachschlagematerial, das Claude bei Bedarf liest
└── assets/ optional – Vorlagen, Bilder usw.
```
`README.md` hat dieselben Abschnitte wie [templates/skill/README.md](templates/skill/README.md): Zweck, Voraussetzungen, Installation, Einrichtung, Stolpersteine, Test, Deinstallation/Update, Link zum Changelog.
`README.md` hat dieselben Abschnitte wie [templates/skill/README.md](templates/skill/README.md): Zweck, Voraussetzungen, Installation, Einrichtung, Stolpersteine, Test, Deinstallation/Update, Link zum Changelog. Skills mit `extension/` beschreiben die Installation über `.mcpb` + ZIP und verweisen auf [docs/INSTALLATION.md](docs/INSTALLATION.md).
## Regeln
@@ -69,14 +75,20 @@ skills/<name>/
Ein Paket pro Skill, Dateiname `dist/<name>-v<version>.zip`. Im ZIP liegt der Ordner `<name>/` mit `SKILL.md` auf oberster Ebene. `README.md` und `CHANGELOG.md` werden nicht eingepackt.
Skills mit `extension/` liefern zusätzlich `dist/<name>-v<version>.mcpb`. Die CLI wird aus der ArtCraft-Launcher-Installation kopiert (`scripts/fetch-cli`), nicht von GitHub heruntergeladen. Die `.mcpb` bleibt unsigniert, solange kein Code-Signing-Zertifikat vorliegt (`mcpb sign` braucht `--cert` / `--key`; `--self-signed` hilft nicht gegen Defender).
```sh
scripts/package.sh # alle Skills
scripts/package.sh # nur Skill-ZIPs
scripts/package.sh <name>
scripts/package-mcpb.sh <name> # eine .mcpb
scripts/package-all.sh # ZIP + .mcpb wo extension/ existiert
```
```powershell
powershell -ExecutionPolicy Bypass -File scripts\package.ps1
powershell -ExecutionPolicy Bypass -File scripts\package.ps1 -Name <name>
powershell -ExecutionPolicy Bypass -File scripts\package-mcpb.ps1 -Name <name>
powershell -ExecutionPolicy Bypass -File scripts\package-all.ps1
```
### Vom eigenen Rechner
@@ -106,6 +118,23 @@ GITEA_TOKEN='<Token>' scripts/release.sh <name>
3. Tag: `<name>/v<version>` (der Tag muss schon auf dem Server liegen). Titel: `<name> <version>`.
4. Als Text den Abschnitt dieser Version aus `skills/<name>/CHANGELOG.md` einfügen.
5. `dist/<name>-v<version>.zip` als Anhang hochladen.
6. Falls vorhanden: `dist/<name>-v<version>.mcpb` ebenfalls hochladen (oder `scripts/release.ps1` nutzen – hängt beides an).
Nur die `.mcpb` nachträglich an ein bestehendes Release hängen (Token nur in der Umgebung):
```powershell
$env:GITEA_TOKEN = '<Token>'
$id = <Release-ID>
$name = 'wordcraft-mcp-v0.2.0.mcpb'
$bytes = [IO.File]::ReadAllBytes("dist\$name")
$req = [Net.HttpWebRequest]::Create("https://git.gundel.dev/api/v1/repos/dg/claude-skills/releases/$id/assets?name=$name")
$req.Method = 'POST'
$req.Headers.Add('Authorization', "token $env:GITEA_TOKEN")
$req.ContentType = 'application/octet-stream'
$req.ContentLength = $bytes.LongLength
$s = $req.GetRequestStream(); $s.Write($bytes, 0, $bytes.Length); $s.Close()
$resp = $req.GetResponse(); (New-Object IO.StreamReader($resp.GetResponseStream())).ReadToEnd()
```
## Hinweise zu den Skripten