diff --git a/frontend/src/panels/guides-data.ts b/frontend/src/panels/guides-data.ts index 84d7749..57a422f 100644 --- a/frontend/src/panels/guides-data.ts +++ b/frontend/src/panels/guides-data.ts @@ -256,6 +256,129 @@ Bevor du Dateien änderst: erkläre kurz was du vorhast. — vorgefertigte Rules für React, Vue, Python, etc.
Eine Persona ist eine Rolle, die du dem Agenten gibst — über den System-Prompt oder + die erste Zeile deiner AGENTS.md. Sie bestimmt grundlegend wie der Agent antwortet: + Ton, Fokus, Detailtiefe und Verhalten.
+Ohne Persona: Allgemeines Sprachmodell. Mit Persona: Dein persönlicher + Senior-Entwickler, der genau weiß wie du arbeitest und was dir wichtig ist.
+ +Das Persona-Template:
+Du bist [Name], [Rolle]. +Dein Fokus: [Hauptaufgabe] +Dein Stil: [Kommunikationsstil — z.B. direkt, knapp, kein Smalltalk] +Sprache: Immer auf Deutsch antworten. Code-Kommentare auf Englisch. +Grenzen: [Was du ablehnst oder nachfragst statt zu raten]+ +
Beispiel 1 — Coding-Assistent:
+Du bist Alex, ein erfahrener Senior-Entwickler spezialisiert auf TypeScript und React. +Dein Fokus: Code schreiben, reviewen und erklären — immer mit konkreten Beispielen. +Dein Stil: direkt, pragmatisch. Keine unnötigen Erklärungen wenn der Code für sich spricht. +Sprache: Deutsch. Code-Kommentare auf Englisch. +Grenzen: Schreib keinen Code ohne den Kontext der Datei zu kennen. Frag lieber nach.+ +
Beispiel 2 — Lernbegleiter:
+Du bist Sam, eine geduldige Lernbegleiterin für Programmier-Anfänger. +Dein Fokus: Konzepte einfach erklären, Fehler ohne Kritik korrigieren, ermutigen. +Dein Stil: freundlich, mit Analogien aus dem Alltag. Fachbegriffe immer sofort erklären. +Sprache: Immer auf Deutsch. Niemals Englisch ohne Übersetzung.+ +
Wo die Persona eintragen:
+AGENTS.md im Projektordner.
+ Gilt nur dort.~/.config/opencode/AGENTS.md (OpenCode)Tipp: Eine gute Persona hat immer eine Grenze + — was der Agent nicht tun soll. Das verhindert, dass er bei Unklarheiten rät statt fragt.
`], + + ["AGENTS.MD & SAVEPOINT.MD — Gedächtnis für den Agenten", ` +Jedes Mal wenn du einen neuen Chat startest, weiß der Agent nichts über dein Projekt. + Diese zwei Dateien lösen das Problem:
+AGENTS.MD — Vorlage:
+# Projekt: [Name] + +## Persona +Du bist [Name], [Rolle]. [Stil, Sprache, Grenzen] + +## Tech-Stack +- Frontend: [z.B. React 18, TypeScript, Tailwind CSS] +- Backend: [z.B. FastAPI, Python 3.12] +- Datenbank:[z.B. PostgreSQL via Prisma] + +## Konventionen +- Variablen: camelCase (JS) / snake_case (Python) +- Kommentare: auf Deutsch +- Commits: konventionell (feat/fix/chore/docs) +- Tests: immer mit describe/it-Blöcken + +## Projektstruktur +src/ + components/ → UI-Komponenten (eine Datei = eine Komponente) + pages/ → Seiten / Routes + api/ → Backend-Calls und Typen + +## Regeln +- Vor jeder Dateiänderung kurz erklären was geplant ist +- Keine neuen Dependencies ohne Rückfrage hinzufügen +- Bei Unklarheiten fragen, nicht raten+ +
SAVEPOINT.MD — Vorlage:
+# Savepoint — [Datum / Uhrzeit] + +## Aktueller Stand +[1–2 Sätze: wo steht das Projekt gerade?] + +## Zuletzt erledigt +- [Aufgabe] ✓ +- [Aufgabe] ✓ + +## In Arbeit / halbfertig +- [Was noch offen ist — welche Datei, welcher Schritt fehlt noch] + +## Als nächstes +1. [Konkrete nächste Aufgabe] +2. [Übernächste Aufgabe] + +## Wichtige Entscheidungen +- [Was entschieden wurde]: [Warum] + +## Bekannte Probleme +- [Problem]: [Was bekannt ist, noch nicht gelöst]+ +
Workflow:
+Tipp: Lass den Agenten die SAVEPOINT.md selbst schreiben — er sieht was er getan hat. + Du prüfst nur ob der Stand stimmt und ergänzt bei Bedarf.
`], ], }, diff --git a/static/dist/main.js b/static/dist/main.js index ec2df76..9a58407 100644 --- a/static/dist/main.js +++ b/static/dist/main.js @@ -1,53 +1,53 @@ -var rl=Object.defineProperty;var Pi=e=>{throw TypeError(e)};var il=(e,t,a)=>t in e?rl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[t]=a;var rn=(e,t,a)=>il(e,typeof t!="symbol"?t+"":t,a),Hr=(e,t,a)=>t.has(e)||Pi("Cannot "+a);var f=(e,t,a)=>(Hr(e,t,"read from private field"),a?a.call(e):t.get(e)),ce=(e,t,a)=>t.has(e)?Pi("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),oe=(e,t,a,r)=>(Hr(e,t,"write to private field"),r?r.call(e,a):t.set(e,a),a),Ne=(e,t,a)=>(Hr(e,t,"access private method"),a);var bi=Array.isArray,sl=Array.prototype.indexOf,Ar=Array.prototype.includes,qr=Array.from,ll=Object.defineProperty,Ya=Object.getOwnPropertyDescriptor,ol=Object.getOwnPropertyDescriptors,dl=Object.prototype,cl=Array.prototype,os=Object.getPrototypeOf,zi=Object.isExtensible;const ul=()=>{};function vl(e){for(var t=0;t${t}
${t}
`:""} '),bd=y('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const S=await Wi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(S)try{const H=await Se("/api/os-update",{method:"POST",body:JSON.stringify({password:S})});ee("OS-Update gestartet."),p(H.job_id,"OS-Update")}catch(H){ee(H.message,!0)}}async function te(){if(!await xn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const S=await Wi({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(S)try{await Se("/api/reboot",{method:"POST",body:JSON.stringify({password:S})}),ee("Reboot ausgelöst — bis gleich.")}catch(H){ee(H.message,!0)}}async function ue(){h(Te,"prüfe…");try{const S=await Se("/api/integration/test");h(Te,S.ok?`✓ Engine antwortet — ${S.models.length} Modell(e): ${S.models.join(", ")}`:`✗ keine Verbindung: ${S.error}`,!0),h(K,S.ok,!0)}catch(S){h(Te,"✗ "+S.message),h(K,!1)}}let Te=R(""),K=R(!1);const V=O(()=>{var S;return((S=n(a))==null?void 0:S.models)||[]}),fe=["running","ready","loading","starting"],he=O(()=>n(V).find(S=>fe.includes(S.state)));function Pe(S){if(!S||S.state!=="running")return null;if(typeof S.progress=="number")return Math.min(100,S.progress);const le=((S.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var Ve=Ud(),mt=s(ct(Ve),2),T=l(mt),W=s(l(T),2),re=l(W),Ue=s(T,4),Q=l(Ue),ze=s(l(Q)),Y=l(ze),rt=s(Q,2),D=s(l(rt),2),U=l(D),ie=s(rt,2),ge=s(l(ie),2),Ae=l(ge),bt=s(Ue,2),pt=l(bt),kt=s(pt,2);{var Ct=S=>{var H=qd(),le=l(H);z(()=>{pn(H,`color:${n(K)?"#7ee29a":"#ff9b95"}`),b(le,n(Te))}),m(S,H)};I(kt,S=>{n(Te)&&S(Ct)})}var Mt=s(mt,2),Lt=s(l(Mt),4),Ot=s(Lt,2),qt=s(Ot,2),$=s(qt,2),N=s($,2),Ce=s(Mt,2),ut=s(l(Ce),4),F=s(ut,2),De=s(Ce,2);{var J=S=>{const H=O(()=>n(E)),le=O(()=>n(H).state==="done"),Je=O(()=>n(H).state==="failed"),Qe=O(()=>n(H).state==="canceled"),Qt=O(()=>n(le)||n(Je)||n(Qe)),Zt=O(()=>Pe(n(H)));var Ht=Vd(),M=l(Ht),G=s(l(M),2);{var Oe=Ke=>{var ht=Bd();C("click",ht,async()=>{await xn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Se(`/api/jobs/${n(H).id}/cancel`,{method:"POST"})}),m(Ke,ht)};I(G,Ke=>{n(Qt)||Ke(Oe)})}var ne=s(G,2),Be=l(ne);{var Ze=Ke=>{var ht=Id();m(Ke,ht)},et=Ke=>{var ht=Fd();m(Ke,ht)},Me=Ke=>{var ht=Nd();m(Ke,ht)},$e=Ke=>{var ht=Kd();m(Ke,ht)};I(Be,Ke=>{n(le)?Ke(Ze):n(Je)?Ke(et,1):n(Qe)?Ke(Me,2):Ke($e,-1)})}var Re=s(M,2),Rt=l(Re),Bt=s(Re,2);{var Wt=Ke=>{var ht=Gd(),Rn=l(ht);z(()=>pn(Rn,`width:${n(Zt)??""}%`)),m(Ke,ht)};I(Bt,Ke=>{n(Zt)!=null&&!n(Qt)&&Ke(Wt)})}var an=s(Bt,2),bn=l(an);z(Ke=>{b(Rt,`${n(v)??""}${n(Qt)?n(le)?" — erfolgreich.":n(Qe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Ke)},[()=>(n(H).log||[]).join(`
-`)]),m(S,Ht)};I(De,S=>{n(E)&&S(J)})}var de=s(De,2),se=l(de),Z=s(l(se),2),be=l(Z);be.value=be.__value="llama-swap";var ve=s(be);ve.value=ve.__value="mission-control";var xe=s(ve);xe.value=xe.__value="system";var ke=s(se,4),_e=l(ke);Bo(ke,S=>c=S,()=>c),z(S=>{var H,le,Je;pn(W,`margin-left:auto;${(H=n(a))!=null&&H.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),b(re,(le=n(a))!=null&&le.swap_ok?"● erreichbar":"● offline"),b(Y,(((Je=n(a))==null?void 0:Je.swap_url)||"—")+"/v1"),b(U,n(he)?n(he).name+` (${n(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Ae,S),b(_e,n(o))},[()=>n(V).filter(S=>!S.incomplete).length||"keine"]),C("click",pt,ue),C("click",Lt,()=>A("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),C("click",Ot,()=>A("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),C("click",qt,L),C("click",$,k),C("click",N,P),C("click",ut,ye),C("click",F,te),C("change",Z,x),ar(Z,()=>n(d),S=>h(d,S)),m(e,Ve),aa()}xa(["click","change"]);var Wd=y('http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Datei anlegen oder öffnen:
Windows: %USERPROFILE%\\.config\\opencode\\opencode.json
"provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt. Danach in OpenCode /models → wählen.
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
local).Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
'),bd=k('| Modell | Kann | Details | Status | Port | Aktionen |
|---|
apt update & upgrade aus. Das kann ein paar Minuten dauern; der Fortschritt erscheint in der Aktivität."}))return;const M=await Hi({title:"sudo-Passwort",body:"Für die System-Updates wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Installieren"});if(M)try{const W=await Me("/api/os-update",{method:"POST",body:JSON.stringify({password:M})});ee("OS-Update gestartet."),p(W.job_id,"OS-Update")}catch(W){ee(W.message,!0)}}async function te(){if(!await yn({title:"Server wirklich neu starten?",body:"Der ganze Bosgame startet physisch neu. Alles ist für ~1 Minute offline — auch dieses Dashboard.",confirmLabel:"Reboot",danger:!0}))return;const M=await Hi({title:"sudo-Passwort",body:"Für den Reboot wird einmalig dein sudo-Passwort gebraucht.",placeholder:"sudo-Passwort",password:!0,confirmLabel:"Jetzt neustarten",danger:!0});if(M)try{await Me("/api/reboot",{method:"POST",body:JSON.stringify({password:M})}),ee("Reboot ausgelöst — bis gleich.")}catch(W){ee(W.message,!0)}}async function ue(){h(Ae,"prüfe…");try{const M=await Me("/api/integration/test");h(Ae,M.ok?`✓ Engine antwortet — ${M.models.length} Modell(e): ${M.models.join(", ")}`:`✗ keine Verbindung: ${M.error}`,!0),h(K,M.ok,!0)}catch(M){h(Ae,"✗ "+M.message),h(K,!1)}}let Ae=R(""),K=R(!1);const V=O(()=>{var M;return((M=n(a))==null?void 0:M.models)||[]}),fe=["running","ready","loading","starting"],he=O(()=>n(V).find(M=>fe.includes(M.state)));function De(M){if(!M||M.state!=="running")return null;if(typeof M.progress=="number")return Math.min(100,M.progress);const le=((M.log||[]).at(-1)||"").match(/(\d+(?:\.\d+)?)\s*%/);return le?Math.min(100,parseFloat(le[1])):null}var Ve=Ud(),mt=s(ct(Ve),2),A=l(mt),H=s(l(A),2),re=l(H),Ue=s(A,4),Q=l(Ue),ze=s(l(Q)),Y=l(ze),rt=s(Q,2),L=s(l(rt),2),U=l(L),ie=s(rt,2),ge=s(l(ie),2),Te=l(ge),bt=s(Ue,2),pt=l(bt),xt=s(pt,2);{var Ct=M=>{var W=Bd(),le=l(W);z(()=>{pn(W,`color:${n(K)?"#7ee29a":"#ff9b95"}`),b(le,n(Ae))}),m(M,W)};q(xt,M=>{n(Ae)&&M(Ct)})}var St=s(mt,2),$t=s(l(St),4),Ot=s($t,2),Bt=s(Ot,2),P=s(Bt,2),F=s(P,2),Ce=s(St,2),ut=s(l(Ce),4),N=s(ut,2),Le=s(Ce,2);{var J=M=>{const W=O(()=>n(E)),le=O(()=>n(W).state==="done"),Je=O(()=>n(W).state==="failed"),Qe=O(()=>n(W).state==="canceled"),Qt=O(()=>n(le)||n(Je)||n(Qe)),Zt=O(()=>De(n(W)));var Wt=Vd(),S=l(Wt),G=s(l(S),2);{var Oe=Ke=>{var ht=Id();C("click",ht,async()=>{await yn({title:n(v)+" abbrechen?",body:"Der laufende Vorgang wird gestoppt.",confirmLabel:"Abbrechen",danger:!0})&&Me(`/api/jobs/${n(W).id}/cancel`,{method:"POST"})}),m(Ke,ht)};q(G,Ke=>{n(Qt)||Ke(Oe)})}var ne=s(G,2),Ie=l(ne);{var Ze=Ke=>{var ht=qd();m(Ke,ht)},et=Ke=>{var ht=Nd();m(Ke,ht)},Se=Ke=>{var ht=Fd();m(Ke,ht)},Pe=Ke=>{var ht=Kd();m(Ke,ht)};q(Ie,Ke=>{n(le)?Ke(Ze):n(Je)?Ke(et,1):n(Qe)?Ke(Se,2):Ke(Pe,-1)})}var Re=s(S,2),Rt=l(Re),It=s(Re,2);{var Ht=Ke=>{var ht=Gd(),Rn=l(ht);z(()=>pn(Rn,`width:${n(Zt)??""}%`)),m(Ke,ht)};q(It,Ke=>{n(Zt)!=null&&!n(Qt)&&Ke(Ht)})}var an=s(It,2),bn=l(an);z(Ke=>{b(Rt,`${n(v)??""}${n(Qt)?n(le)?" — erfolgreich.":n(Qe)?" — abgebrochen.":" — fehlgeschlagen.":" läuft…"}`),b(bn,Ke)},[()=>(n(W).log||[]).join(`
+`)]),m(M,Wt)};q(Le,M=>{n(E)&&M(J)})}var de=s(Le,2),se=l(de),Z=s(l(se),2),be=l(Z);be.value=be.__value="llama-swap";var ve=s(be);ve.value=ve.__value="mission-control";var ye=s(ve);ye.value=ye.__value="system";var xe=s(se,4),_e=l(xe);Io(xe,M=>c=M,()=>c),z(M=>{var W,le,Je;pn(H,`margin-left:auto;${(W=n(a))!=null&&W.swap_ok?"background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a":"background:rgba(248,81,73,.12);border-color:rgba(248,81,73,.3);color:#ff9b95"}`),b(re,(le=n(a))!=null&&le.swap_ok?"● erreichbar":"● offline"),b(Y,(((Je=n(a))==null?void 0:Je.swap_url)||"—")+"/v1"),b(U,n(he)?n(he).name+` (${n(he).state})`:"nichts geladen — lädt bei der nächsten Anfrage"),b(Te,M),b(_e,n(o))},[()=>n(V).filter(M=>!M.incomplete).length||"keine"]),C("click",pt,ue),C("click",$t,()=>T("llama-swap","LLM-Engine neustarten?","Die Engine startet neu. Geladene Modelle werden kurz entladen (~5 Sekunden), laden danach automatisch wieder.")),C("click",Ot,()=>T("mission-control","Dashboard neustarten?","Diese Oberfläche trennt sich kurz und verbindet automatisch wieder.")),C("click",Bt,$),C("click",P,x),C("click",F,D),C("click",ut,ke),C("click",N,te),C("change",Z,y),ar(Z,()=>n(d),M=>h(d,M)),m(e,Ve),aa()}ya(["click","change"]);var Hd=k('http://192.168.178.151:8080/v1 — nicht den Proxy-Namen.Öffne die Zed-Settings mit Cmd/Strg + , und füge diesen Block in deine bestehende settings.json ein. Falls bereits ein "bosgame"-Eintrag existiert: vorher löschen.
API-Key: Öffne den Agent-Panel → Anbieter bosgame → trag irgendeinen Wert ein (z.B. local).
Datei anlegen oder öffnen:
Windows: %USERPROFILE%\\.config\\opencode\\opencode.json
"provider"-Block einfügen. Falls bereits ein "llama-swap"-Eintrag vorhanden: vorher löschen, sonst erscheinen Modelle doppelt. Danach in OpenCode /models → wählen.
In Cline/Cursor den Provider „OpenAI Compatible" wählen:
local).Settings → Admin Panel → Connections → neue OpenAI-Verbindung:
Eine Persona ist eine Rolle, die du dem Agenten gibst — über den System-Prompt oder + die erste Zeile deiner AGENTS.md. Sie bestimmt grundlegend wie der Agent antwortet: + Ton, Fokus, Detailtiefe und Verhalten.
+Ohne Persona: Allgemeines Sprachmodell. Mit Persona: Dein persönlicher + Senior-Entwickler, der genau weiß wie du arbeitest und was dir wichtig ist.
+ +Das Persona-Template:
+Du bist [Name], [Rolle]. +Dein Fokus: [Hauptaufgabe] +Dein Stil: [Kommunikationsstil — z.B. direkt, knapp, kein Smalltalk] +Sprache: Immer auf Deutsch antworten. Code-Kommentare auf Englisch. +Grenzen: [Was du ablehnst oder nachfragst statt zu raten]+ +
Beispiel 1 — Coding-Assistent:
+Du bist Alex, ein erfahrener Senior-Entwickler spezialisiert auf TypeScript und React. +Dein Fokus: Code schreiben, reviewen und erklären — immer mit konkreten Beispielen. +Dein Stil: direkt, pragmatisch. Keine unnötigen Erklärungen wenn der Code für sich spricht. +Sprache: Deutsch. Code-Kommentare auf Englisch. +Grenzen: Schreib keinen Code ohne den Kontext der Datei zu kennen. Frag lieber nach.+ +
Beispiel 2 — Lernbegleiter:
+Du bist Sam, eine geduldige Lernbegleiterin für Programmier-Anfänger. +Dein Fokus: Konzepte einfach erklären, Fehler ohne Kritik korrigieren, ermutigen. +Dein Stil: freundlich, mit Analogien aus dem Alltag. Fachbegriffe immer sofort erklären. +Sprache: Immer auf Deutsch. Niemals Englisch ohne Übersetzung.+ +
Wo die Persona eintragen:
+AGENTS.md im Projektordner.
+ Gilt nur dort.~/.config/opencode/AGENTS.md (OpenCode)Tipp: Eine gute Persona hat immer eine Grenze + — was der Agent nicht tun soll. Das verhindert, dass er bei Unklarheiten rät statt fragt.
`],["AGENTS.MD & SAVEPOINT.MD — Gedächtnis für den Agenten",` +Jedes Mal wenn du einen neuen Chat startest, weiß der Agent nichts über dein Projekt. + Diese zwei Dateien lösen das Problem:
+AGENTS.MD — Vorlage:
+# Projekt: [Name] + +## Persona +Du bist [Name], [Rolle]. [Stil, Sprache, Grenzen] + +## Tech-Stack +- Frontend: [z.B. React 18, TypeScript, Tailwind CSS] +- Backend: [z.B. FastAPI, Python 3.12] +- Datenbank:[z.B. PostgreSQL via Prisma] + +## Konventionen +- Variablen: camelCase (JS) / snake_case (Python) +- Kommentare: auf Deutsch +- Commits: konventionell (feat/fix/chore/docs) +- Tests: immer mit describe/it-Blöcken + +## Projektstruktur +src/ + components/ → UI-Komponenten (eine Datei = eine Komponente) + pages/ → Seiten / Routes + api/ → Backend-Calls und Typen + +## Regeln +- Vor jeder Dateiänderung kurz erklären was geplant ist +- Keine neuen Dependencies ohne Rückfrage hinzufügen +- Bei Unklarheiten fragen, nicht raten+ +
SAVEPOINT.MD — Vorlage:
+# Savepoint — [Datum / Uhrzeit] + +## Aktueller Stand +[1–2 Sätze: wo steht das Projekt gerade?] + +## Zuletzt erledigt +- [Aufgabe] ✓ +- [Aufgabe] ✓ + +## In Arbeit / halbfertig +- [Was noch offen ist — welche Datei, welcher Schritt fehlt noch] + +## Als nächstes +1. [Konkrete nächste Aufgabe] +2. [Übernächste Aufgabe] + +## Wichtige Entscheidungen +- [Was entschieden wurde]: [Warum] + +## Bekannte Probleme +- [Problem]: [Was bekannt ist, noch nicht gelöst]+ +
Workflow:
+Tipp: Lass den Agenten die SAVEPOINT.md selbst schreiben — er sieht was er getan hat. + Du prüfst nur ob der Stand stimmt und ergänzt bei Bedarf.
`]]},{label:"Wenn etwas nicht klappt",tutorials:[["Häufige Probleme & Lösungen",`