fix(lists): circle scope support for get_lists, create_list, delete_list (v0.7.1)

- get_lists(scope): API scope parameter now used server-side; accepts circle
  metaId ("family/XXXX") or circle name; returns circle_id field per list
- create_list(circle_id): new optional param; passes as API scope param
- delete_list: derives circle from list metaId and passes scope for
  secondary-circle lists
- Added _circle_id_from_list_id() helper (taskList/FAMNUM_LISTNUM -> family/FAMNUM)
- SPEC.md: documented scope param for taskgettasklists, taskcreatelist, taskdeletelist
- Verified: familyId/circleId/id params ignored by API, only scope works

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-16 18:10:05 +02:00
parent 2bc03e2165
commit abb557e96b
6 changed files with 144 additions and 26 deletions
+29 -5
View File
@@ -292,6 +292,13 @@ POST https://api.familywall.com/api/taskcreatelist
| `sharedToAll` | nein | `"true"` / `"false"` (default: `"true"`) |
| `color` | nein | Hex-Farbwert z.B. `"#4784EC"` |
| `emoji` | nein | Unicode-Emoji z.B. `"🛒"` |
| `scope` | nein | Kreis-metaId z.B. `"family/23447378"` (ohne scope → primärer Kreis) |
**Scope-Verhalten:**
- Ohne `scope`: Liste wird im primären Kreis des Accounts erstellt
- Mit `scope=family/XXXX`: Liste wird im angegebenen Kreis erstellt
- Die `metaId` der neuen Liste kodiert den Kreis: `taskList/CIRCLENUM_LISTNUM`
- Parameter `familyId`, `circleId`, `family`, `id` → werden ignoriert, nur `scope` wirkt
**Response:**
```
@@ -302,6 +309,7 @@ a00.r.r → vollständiges Listen-Objekt
.sharedToAll → "true" / "false"
.emoji → Unicode-Emoji (fehlt wenn nicht gesetzt)
.color → Hex-Farbwert z.B. "#E53935" (fehlt wenn nicht gesetzt)
.familyId → Kreis-metaId des erstellten Liste
.rights.canDelete → "true" (user-created lists)
```
@@ -312,9 +320,10 @@ POST https://api.familywall.com/api/taskdeletelist
**Body-Parameter:**
| Parameter | Wert |
|---|---|
| `id` | Listen-metaId ⚠️ nicht `listId` oder `taskListId`! |
| Parameter | Pflicht | Wert |
|---|---|---|
| `id` | ja | Listen-metaId ⚠️ nicht `listId` oder `taskListId`! |
| `scope` | nein | Kreis-metaId (erforderlich für sekundäre Kreise) |
**Response:**
```
@@ -324,20 +333,32 @@ a00.r.r → "true" (String)
**Hinweis:** Löscht die Liste und alle enthaltenen Tasks unwiderruflich.
System-Listen (`rights.canDelete` fehlt oder `null`) sind nicht löschbar.
MCP-Server prüft dies vor dem Löschen via `taskgettasklists`.
Für Listen in sekundären Kreisen muss `scope=family/XXXX` mitgeschickt werden.
**Verifiziert am:** 2026-04-16 via FW_DEBUG=1
### `taskgettasklists` Listen abrufen
POST https://api.familywall.com/api/taskgettasklists
**Body-Parameter:** keine
**Body-Parameter:**
| Parameter | Pflicht | Wert |
|---|---|---|
| `scope` | nein | Kreis-metaId z.B. `"family/23447378"` (ohne scope → primärer Kreis) |
**Scope-Verhalten:**
- Ohne `scope`: Nur Listen des primären Kreises werden zurückgegeben
- Mit `scope=family/XXXX`: Nur Listen des angegebenen Kreises
- Es gibt keinen servereitigen Filter für mehrere Kreise gleichzeitig
- Andere Parameter (`familyId`, `circleId`, etc.) werden ignoriert
**Response-Struktur:**
```
a00.r.r[] → Liste aller Task-Listen
a00.r.r[] → Liste aller Task-Listen des Kreises
.metaId → Listen-ID (z.B. "taskList/23431854_29740942")
.name → Systembezeichnung oder Benutzer-Name
.taskListType → SHOPPING_LIST oder TODOS
.familyId → Kreis-metaId (z.B. "family/23431854")
.emoji → Unicode-Emoji oder "" (leerer String = kein Emoji)
.color → Hex-Farbwert z.B. "#E53935" (fehlt wenn nicht gesetzt)
.remainingTaskNumber → offene Tasks (String)
@@ -348,6 +369,9 @@ a00.r.r[] → Liste aller Task-Listen
.systemId → vorhanden nur bei Systemlisten (z.B. "-10", "-11")
```
**metaId-Encoding:** `taskList/<family_num>_<list_num>` — die `family_num` kodiert den Kreis.
Beispiel: `taskList/23431854_29740942` gehört zu `family/23431854`.
**Hinweis emoji/color:**
- `emoji`: Systemlisten liefern `""`, user-created Listen liefern den Emoji-String
oder `""` wenn kein Emoji gesetzt. Normalisierung: `""``null` im MCP-Server.