{"commands":[{"args":{"additionalProperties":false,"properties":{"name":{"description":"Name des Betriebs.","type":"string"},"start":{"description":"Ein Tag der ersten Woche. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"weeks":{"description":"Anzahl Wochen, 1 bis 6.","type":"integer"}},"required":[],"type":"object"},"changes":true,"name":"plan.new","needsPlan":false,"summary":"Beginnt einen leeren Plan. Ohne Angaben: zwei Wochen ab dem nächsten Montag.","title":"Neuer Plan"},{"args":{"additionalProperties":false,"properties":{"document":{"description":"Der Inhalt einer gesicherten Shifty-Datei.","type":"object"}},"required":["document"],"type":"object"},"changes":true,"name":"plan.open","needsPlan":false,"summary":"Öffnet einen gesicherten Plan. Shifty prüft die Datei und lehnt sie ab, wenn sie beschädigt ist.","title":"Öffnen …"},{"args":{"additionalProperties":false,"properties":{"name":{"description":"Welches Beispiel.","enum":["bakery"],"type":"string"}},"required":[],"type":"object"},"changes":true,"name":"example.load","needsPlan":false,"summary":"Lädt einen fertig ausgefüllten Beispielbetrieb zum Ausprobieren.","title":"Beispiel ansehen"},{"args":{"additionalProperties":false,"properties":{"name":{"description":"Name des Betriebs.","type":"string"}},"required":["name"],"type":"object"},"changes":true,"name":"business.set","needsPlan":true,"summary":"Setzt den Namen des Betriebs. Er steht über dem Plan und im Dateinamen.","title":"Betrieb benennen"},{"args":{"additionalProperties":false,"properties":{"start":{"description":"Ein Tag der ersten Woche. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"weeks":{"description":"Anzahl Wochen, 1 bis 6.","type":"integer"}},"required":[],"type":"object"},"changes":true,"name":"period.set","needsPlan":true,"summary":"Legt fest, welche Wochen geplant werden. Der Zeitraum beginnt immer an einem Montag.","title":"Zeitraum festlegen"},{"args":{"additionalProperties":false,"properties":{"name":{"description":"Name der Aufgabe.","type":"string"}},"required":["name"],"type":"object"},"changes":true,"name":"role.add","needsPlan":true,"summary":"Fügt eine Aufgabe hinzu, zum Beispiel «Verkauf» oder «Backstube». Schichten brauchen eine Aufgabe, Personen übernehmen Aufgaben.","title":"Aufgabe hinzufügen"},{"args":{"additionalProperties":false,"properties":{"id":{"description":"id der Aufgabe.","type":"string"},"name":{"description":"Neuer Name.","type":"string"}},"required":["id","name"],"type":"object"},"changes":true,"name":"role.rename","needsPlan":true,"summary":"Ändert den Namen einer Aufgabe.","title":"Aufgabe umbenennen"},{"args":{"additionalProperties":false,"properties":{"id":{"description":"id der Aufgabe.","type":"string"}},"required":["id"],"type":"object"},"changes":true,"name":"role.remove","needsPlan":true,"summary":"Löscht eine Aufgabe. Das geht nur, solange keine Schicht sie braucht.","title":"Aufgabe löschen"},{"args":{"additionalProperties":false,"properties":{"maxHours":{"description":"Höchststunden pro Woche, die nie überschritten werden. 0 = keine Grenze.","type":"number"},"name":{"description":"Name der Person.","type":"string"},"roles":{"description":"ids der Aufgaben, die die Person übernimmt.","items":{"type":"string"},"type":"array"},"targetHours":{"description":"Sollstunden pro Woche. 0 = kein Soll.","type":"number"}},"required":["name"],"type":"object"},"changes":true,"name":"person.add","needsPlan":true,"summary":"Nimmt eine Person ins Team auf.","title":"Person hinzufügen"},{"args":{"additionalProperties":false,"properties":{"id":{"description":"id der Person.","type":"string"},"maxHours":{"description":"Höchststunden pro Woche, die nie überschritten werden. 0 = keine Grenze.","type":"number"},"name":{"description":"Name der Person.","type":"string"},"roles":{"description":"ids der Aufgaben, die die Person übernimmt.","items":{"type":"string"},"type":"array"},"targetHours":{"description":"Sollstunden pro Woche. 0 = kein Soll.","type":"number"}},"required":["id"],"type":"object"},"changes":true,"name":"person.update","needsPlan":true,"summary":"Ändert Name, Aufgaben oder Stunden einer Person. Nur die genannten Felder ändern sich.","title":"Person ändern"},{"args":{"additionalProperties":false,"properties":{"id":{"description":"id der Person.","type":"string"}},"required":["id"],"type":"object"},"changes":true,"name":"person.remove","needsPlan":true,"summary":"Entfernt eine Person aus dem Team und aus dem Plan.","title":"Person löschen"},{"args":{"additionalProperties":false,"properties":{"anchor":{"description":"Bei jeder zweiten Woche: ein Tag in einer Woche, die zählt. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"days":{"description":"Bei «weekly»: Wochentage als Zahlen: 1 = Montag … 7 = Sonntag.","items":{"maximum":7,"minimum":1,"type":"integer"},"type":"array"},"end":{"description":"Bei «weekly»: Ende des Zeitfensters. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"every":{"description":"Bei «weekly»: 1 = jede Woche, 2 = jede zweite Woche.","type":"integer"},"from":{"description":"Bei «dates»: erster Tag. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"kind":{"description":"«weekly» für Wochentage, «dates» für einen Datumsbereich.","enum":["weekly","dates"],"type":"string"},"note":{"description":"Grund, zum Beispiel «Berufsschule». Erscheint, wenn die Person deshalb nicht eingeplant wird.","type":"string"},"person":{"description":"id der Person.","type":"string"},"start":{"description":"Bei «weekly»: Beginn des Zeitfensters. Leer = ganzer Tag. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"to":{"description":"Bei «dates»: letzter Tag. Leer = nur ein Tag.","type":"string"}},"required":["person","kind"],"type":"object"},"changes":true,"name":"absence.add","needsPlan":true,"summary":"Trägt ein, wann eine Person nicht arbeiten kann: an Wochentagen (jede oder jede zweite Woche, ganz oder zu bestimmten Zeiten) oder an bestimmten Daten.","title":"Abwesenheit hinzufügen"},{"args":{"additionalProperties":false,"properties":{"index":{"description":"Stelle in der Liste der Abwesenheiten, beginnend bei 0.","type":"integer"},"person":{"description":"id der Person.","type":"string"}},"required":["person","index"],"type":"object"},"changes":true,"name":"absence.remove","needsPlan":true,"summary":"Löscht eine Abwesenheit einer Person.","title":"Abwesenheit löschen"},{"args":{"additionalProperties":false,"properties":{"days":{"description":"Wochentage als Zahlen: 1 = Montag … 7 = Sonntag.","items":{"maximum":7,"minimum":1,"type":"integer"},"type":"array"},"end":{"description":"Ende des Zeitfensters. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"note":{"description":"Notiz zum Wunsch.","type":"string"},"person":{"description":"id der Person.","type":"string"},"start":{"description":"Beginn des Zeitfensters. Leer = ganzer Tag. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"want":{"description":"«prefer» = arbeitet gern, «avoid» = lieber nicht.","enum":["prefer","avoid"],"type":"string"}},"required":["person","want","days"],"type":"object"},"changes":true,"name":"wish.add","needsPlan":true,"summary":"Trägt einen Wunsch ein: an welchen Wochentagen eine Person gern oder lieber nicht arbeitet. Wünsche werden berücksichtigt, wenn es geht.","title":"Wunsch hinzufügen"},{"args":{"additionalProperties":false,"properties":{"index":{"description":"Stelle in der Liste der Wünsche, beginnend bei 0.","type":"integer"},"person":{"description":"id der Person.","type":"string"}},"required":["person","index"],"type":"object"},"changes":true,"name":"wish.remove","needsPlan":true,"summary":"Löscht einen Wunsch einer Person.","title":"Wunsch löschen"},{"args":{"additionalProperties":false,"properties":{"breakMinutes":{"description":"Unbezahlte Pause in Minuten. Standard: 0.","type":"integer"},"days":{"description":"An welchen Tagen die Schicht stattfindet. Wochentage als Zahlen: 1 = Montag … 7 = Sonntag.","items":{"maximum":7,"minimum":1,"type":"integer"},"type":"array"},"end":{"description":"Ende. Liegt es vor dem Beginn, läuft die Schicht über Mitternacht. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"name":{"description":"Name der Schicht, zum Beispiel «Früh».","type":"string"},"role":{"description":"id der Aufgabe, die in der Schicht erledigt wird.","type":"string"},"staff":{"description":"Wie viele Personen gleichzeitig gebraucht werden. Standard: 1.","type":"integer"},"start":{"description":"Beginn. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"}},"required":["name","role","start","end","days"],"type":"object"},"changes":true,"name":"shift.add","needsPlan":true,"summary":"Legt eine Schicht an: wann sie ist, an welchen Tagen, welche Aufgabe und wie viele Personen.","title":"Schicht hinzufügen"},{"args":{"additionalProperties":false,"properties":{"breakMinutes":{"description":"Unbezahlte Pause in Minuten. Standard: 0.","type":"integer"},"days":{"description":"An welchen Tagen die Schicht stattfindet. Wochentage als Zahlen: 1 = Montag … 7 = Sonntag.","items":{"maximum":7,"minimum":1,"type":"integer"},"type":"array"},"end":{"description":"Ende. Liegt es vor dem Beginn, läuft die Schicht über Mitternacht. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"},"id":{"description":"id der Schicht.","type":"string"},"name":{"description":"Name der Schicht, zum Beispiel «Früh».","type":"string"},"role":{"description":"id der Aufgabe, die in der Schicht erledigt wird.","type":"string"},"staff":{"description":"Wie viele Personen gleichzeitig gebraucht werden. Standard: 1.","type":"integer"},"start":{"description":"Beginn. Uhrzeit als HH:MM, zum Beispiel 06:30.","type":"string"}},"required":["id"],"type":"object"},"changes":true,"name":"shift.update","needsPlan":true,"summary":"Ändert eine Schicht. Nur die genannten Felder ändern sich. Einsätze, die danach nicht mehr passen, fallen aus dem Plan.","title":"Schicht ändern"},{"args":{"additionalProperties":false,"properties":{"id":{"description":"id der Schicht.","type":"string"}},"required":["id"],"type":"object"},"changes":true,"name":"shift.remove","needsPlan":true,"summary":"Löscht eine Schicht und ihre Einsätze.","title":"Schicht löschen"},{"args":{"additionalProperties":false,"properties":{"balanceHours":{"description":"Stunden möglichst nah an den Sollstunden halten.","type":"boolean"},"balanceWeekends":{"description":"Wochenenden gleichmässig verteilen.","type":"boolean"},"maxDaysInRow":{"description":"Höchstens so viele Arbeitstage am Stück. Standard: 6.","type":"integer"},"minRestHours":{"description":"Ruhezeit in Stunden zwischen zwei Arbeitstagen. Standard: 11.","type":"integer"}},"required":[],"type":"object"},"changes":true,"name":"rules.set","needsPlan":true,"summary":"Ändert die Regeln, die für alle gelten. Nur die genannten Felder ändern sich.","title":"Regeln ändern"},{"args":{"additionalProperties":false,"properties":{"effort":{"description":"Sucheinsatz von 0.1 (schneller Entwurf) bis 2. Standard: 1.","type":"number"},"mode":{"description":"«fresh» plant alles neu ausser festen Einsätzen (Standard). «fill» behält alle Einsätze und füllt nur die offenen.","enum":["fresh","fill"],"type":"string"},"seed":{"description":"Startwert. Gleicher Plan und gleicher Startwert ergeben denselben Plan. Ein anderer Wert ergibt eine andere, ebenso gültige Variante.","type":"integer"}},"required":[],"type":"object"},"changes":true,"name":"roster.solve","needsPlan":true,"summary":"Füllt den Plan. Feste Einsätze bleiben, alle Regeln werden eingehalten, Stunden und Wochenenden werden fair verteilt. Bleibt ein Einsatz offen, steht im Bericht, warum.","title":"Plan erstellen"},{"args":{"additionalProperties":false,"properties":{"date":{"description":"Tag des Einsatzes. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"person":{"description":"id der Person. Leer = Einsatz freigeben.","type":"string"},"pinned":{"description":"Fest halten. Standard: ja.","type":"boolean"},"shift":{"description":"id der Schicht.","type":"string"},"slot":{"description":"Platz in der Schicht, beginnend bei 0. Standard: 0.","type":"integer"}},"required":["date","shift"],"type":"object"},"changes":true,"name":"roster.assign","needsPlan":true,"summary":"Teilt einen Einsatz von Hand einer Person zu oder gibt ihn frei. Von Hand zugeteilte Einsätze sind fest und bleiben beim nächsten «Plan erstellen». Verletzt die Zuteilung eine Regel, gilt sie trotzdem und der Bericht weist darauf hin.","title":"Einsatz zuteilen"},{"args":{"additionalProperties":false,"properties":{"date":{"description":"Tag des Einsatzes. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"pinned":{"description":"true = fest, false = gelöst.","type":"boolean"},"shift":{"description":"id der Schicht.","type":"string"},"slot":{"description":"Platz in der Schicht, beginnend bei 0. Standard: 0.","type":"integer"}},"required":["date","shift","pinned"],"type":"object"},"changes":true,"name":"roster.pin","needsPlan":true,"summary":"Hält einen Einsatz fest oder löst ihn. Feste Einsätze bleiben beim nächsten «Plan erstellen».","title":"Einsatz fest halten"},{"args":{"additionalProperties":false,"properties":{"keepPinned":{"description":"Feste Einsätze behalten.","type":"boolean"}},"required":[],"type":"object"},"changes":true,"name":"roster.clear","needsPlan":true,"summary":"Gibt alle Einsätze frei. Team, Schichten und Regeln bleiben.","title":"Plan leeren"},{"args":{"additionalProperties":false,"properties":{"date":{"description":"Tag des Einsatzes. Datum als JJJJ-MM-TT, zum Beispiel 2026-11-16.","type":"string"},"shift":{"description":"id der Schicht.","type":"string"},"slot":{"description":"Platz in der Schicht, beginnend bei 0. Standard: 0.","type":"integer"}},"required":["date","shift"],"type":"object"},"changes":false,"name":"roster.candidates","needsPlan":true,"summary":"Zeigt für einen Einsatz, wer ihn übernehmen kann und warum die anderen nicht.","title":"Wer kann?"},{"args":{"additionalProperties":false,"properties":{"format":{"description":"Dateiformat. Standard: csv.","enum":["csv"],"type":"string"}},"required":[],"type":"object"},"changes":false,"name":"roster.export","needsPlan":true,"summary":"Gibt den Plan als CSV-Tabelle aus, eine Zeile pro Einsatz, zum Öffnen in Excel oder Numbers.","title":"Als Tabelle exportieren"},{"args":{"additionalProperties":false,"properties":{},"required":[],"type":"object"},"changes":false,"name":"plan.report","needsPlan":true,"summary":"Gibt den Bericht zum Plan zurück: Plan nach Tagen, Stunden pro Person und was noch Aufmerksamkeit braucht. Jeder Befehl liefert diesen Bericht mit.","title":"Bericht"}],"run":"POST /api/v1/run with {\"command\": name, \"args\": {…}, \"plan\": {…}}. The answer holds the changed plan, the command's result and a report. Nothing is stored: keep the plan and send it with the next command."}
