Was macht Content OS Builder?
Du bist ein KI-Coding-Agent mit Datei-Schreib- und Shell-Zugriff. Du wirst für den Benutzer ein lokales Content-Betriebssystem aufbauen: ein Dashboard, das den Zyklus Idee → Genehmigung → Produktion → Veröffentlichung → Lernen für ein einzelnes Unternehmen oder für mehrere streng getrennte Unternehmen abbildet. Der Benutzer ist oft eine Agentur, die Content für Kunden erstellt, oder ein Creator mit mehreren Marken.
Dieses Skill ist ein Playbook, kein Template. Du führst ein Interview mit dem Benutzer und erstellst das System dann aus den Antworten. Jeder Name, jede Farbe, jede Stimme-Regel, jeder Wettbewerber und jeder Schlüssel stammt aus dem Interview. Nichts in diesem Skill stammt von einer echten Marke, und alles, was du baust, darf keine Werte enthalten, die der Benutzer dir nicht gegeben hat.
Was du baust, in einem Absatz
Eine Engine plus N Geschäftsordner. Die Engine ist engine/app (Next.js App Router, React, TypeScript strict, Tailwind v4, pnpm), die vertrauenswürdigen Skripte, die sie ausführt, und die CLI-Tools in engine/tools. Jedes Unternehmen ist ein Mandant: tenants/<id>/, der sein Manifest, sein Brand-Kit, seine Ideen und Inhalte, seinen Speicher, seine Skills und seine eigenen Konto-Schlüssel enthält. Jede API-Route löst genau einen Mandanten auf und liest oder schreibt nur innerhalb seines Ordners. Das Dateisystem ist die Datenbank: Es gibt keine DB und kein ORM. KI-Arbeit wird vom CLI des eigenen Coding-Agenten des Benutzers erledigt (normalerweise claude), der kopflos mit cwd auf den Mandantenordner gesetzt wird, ohne Shell und mit Inline-Deny-Regeln, die ihn innerhalb dieses Ordners halten. Der Agent schreibt nur Wörter und Code. Die Engine erledigt alles, was ausgeführt wird: Gerüstbau, Export, Rendering und Veröffentlichung. Eine Einzelmandanten-Installation ist dieselbe Engine mit genau einem Mandantenordner. Es gibt keinen separaten „Ein-Marken-Codepfad".
Die goldene Regel: INTERVIEW ZUERST, BAUEN ZWEITENS
Schreibe keine Datei, bis das Interview abgeschlossen ist und der Benutzer die Zusammenfassung bestätigt hat. Der Wert des Systems liegt darin, dass es seines ist. Ein generischer Klon ist ein fehlgeschlagener Bau.
- Frage in der Sprache des Benutzers, eine Gruppe von Fragen pro Zug, mit einem sinnvollen Standardvorschlag für jede Frage, damit der Benutzer mit „ja" antworten oder anpassen kann.
- Der Benutzer kann zu jeder Frage „später" sagen oder „für den Rest die Standardeinstellungen verwenden". Notiere einen „später"-Punkt als ausstehend und baue den Teil, den er blockiert, in seinem deaktivierten Zustand, mit einem sichtbaren Hinweis „noch nicht eingerichtet".
- Frage niemals nach Geheimnissen im Chat. Teile dem Benutzer mit, welche Variable in welche Datei gehört, und lass ihn sie dort einfügen. Wenn er dennoch eine einfügt, lege sie in die richtige Datei, gib sie niemals zurück und fordere ihn auf, sie zu rotieren.
- Beende mit einer kompakten Zusammenfassung und hole ein explizites Ja ein.
Die allererste Frage betrifft die Mandantenstruktur:
Wird dieses System ein Unternehmen (Einzelmandant) oder mehrere Unternehmen oder Kunden, jeweils vollständig isoliert (Mehrmandant) betreiben?
- Einzelmandant. Eine Marke. Das Dashboard öffnet direkt darin.
- Mehrmandant. Eine Agentur oder eine Person mit mehreren Marken. Jedes Unternehmen erhält seinen eigenen Ordner: sein eigenes Brand-Kit, Ideen, Inhalte, Speicher, Chat, Veröffentlichungskanäle und Schlüssel. Sein KI-Agent kann niemals die Dateien eines anderen Unternehmens lesen. Ein Auswähler unter
/wechselt zwischen ihnen.Beide verwenden dieselbe Engine, und Einzelmandant ist einfach ein Ordner. Ein später hinzugefügtes Unternehmen bedeutet das Hinzufügen eines Ordners; nichts muss migriert werden.
Der vollständige Fragenkatalog (Systemfragen einmal, dann unternehmensspezifische Fragen), die Standardeinstellungen und wie jede Antwort einer Datei zugeordnet wird, befinden sich in references/1-interview.md. Lies sie, bevor du etwas fragst.
Was als Code ausgeliefert wird (assets/)
Den größten Teil dieses Systems generierst du aus den Referenzen. Elf Dateien werden wörtlich kopiert, da jede einzelne Randfälle enthält, die in der Produktion gemessen wurden (oder eine Sicherheitsgrenze darstellt) und eine erneute Ableitung aus Prosa würde sie stillschweigend falsch machen. Kopiere sie unverändert und bearbeite dann nur die mit EDIT: markierten Stellen (Sätze in der Sprache des Eigentümers, Sprachdaten, die Liste der Veröffentlichungstools). Die Referenzen erklären, warum jede so funktioniert, wie sie es tut; das Asset ist wie.
| Asset | Kopieren nach | Was es ist |
|---|---|---|
assets/tenant.mjs | engine/app/src/lib/tenant.mjs | Mandantenerkennung, Manifest + unternehmensspezifische settings-Validierung, der Path-Traversal-Guard, mandantenspezifische Umgebungsvariablen (Kontoschlüssel werden niemals vererbt) |
assets/agent-flags.mjs | engine/app/src/lib/agent-flags.mjs | Der einzige Ort, an dem die Agenteneinschränkung aufgebaut wird: Profile, Inline-Deny-Regeln, die Umgebungsvariable-Whitelists |
assets/proxy.ts | engine/app/src/proxy.ts | Der Same-Origin-Guard vor jeder /api-Route (Loopback-Host, keine Cross-Site-Anfragen, nur JSON- oder Multipart-Bodies) |
assets/export-project.mjs | engine/app/scripts/export-project.mjs | Der vertrauenswürdige HTML→PNG-Exporter mit einer Default-Deny-Anfrage-Firewall |
assets/shapes.mjs | engine/app/src/lib/shapes.mjs | Die beiden Anti-Wiederholungs-Achsen, die Text-Dedup nicht sehen kann (Form und Lektion) + Starterformen pro Art |
assets/ideas-core.mjs | engine/app/src/lib/ideas-core.mjs | Der Ideenspeicher: Validierung gegen das Kit, deterministisches Dedup, Quarantäne, atomare Schreibvorgänge, der Mutex |
assets/extract-json.mjs | engine/app/src/lib/extract-json.mjs | Der eine tolerante JSON-Leser, den der Radar-Verifier und der Ingest gemeinsam nutzen |
assets/radar-verify.mjs | engine/app/src/lib/radar-verify.mjs | Die Grundlagenprüfung des Radars: SSRF-geschützter Fetch, Seitendaten, Zitat-Shingles, Sprach-Gate, unbewiesene Zahlen |
assets/proposals.mjs | engine/app/src/lib/proposals.mjs | Die nicht fälschbaren Veröffentlichungsvorschläge des Chats: gebunden an eine Nachricht, einmalige Verwendung, atomare Beanspruchung |
assets/new-tenant.mjs | engine/tools/new-tenant.mjs | Erstellt einen gültigen, leeren, gesperrten Mandantenordner, alles oder nichts; --from erstellt eine verworfene Testkopie |
assets/sync-tenant.mjs | engine/tools/sync-tenant.mjs | Wendet die Skills und Einstellungen der Engine auf bestehende Mandanten erneut an (ausführen, nachdem eines von beiden bearbeitet wurde) |
ideas-core.mjs importiert ./strategy-core.mjs, das du aus Referenz 4 §3 schreibst. Alles andere, was die Assets importieren, ist ein weiteres Asset.
Bau-Reihenfolge
Arbeite von oben nach unten. Lies vor jeder Stufe deren Referenz. Bevor du fortfährst, führe den Kontrollpunkt dieser Referenz aus. Eine Stufe, die „erledigt aussieht", aber ihren Kontrollpunkt nicht besteht, bricht etwas drei Stufen später an einer völlig anderen Stelle. Nach jeder Stufe teilst du dem Benutzer in einer Zeile mit, was du getan hast.
| # | Stufe | Referenz | Immer? |
|---|---|---|---|
| 0 | Maschine prüfen, Interview führen, Zusammenfassung bestätigen lassen | 1-interview.md | ja |
| 1 | Engine-Gerüst: Repository-Layout, Next-Bootstrap, ALLE Assets kopieren, Kern der Mandantenverwaltung, new-tenant, die Mandantenordner | 2-architecture-and-tenancy.md | ja |
| 2 | Sicherheit: Agenteneinschränkung, Spawn-Helfer, Proxy-Guard, Umgebungsisolierung, verify-tenants; dann sync-tenant --all | 3-security-and-agents.md | ja |
| 3 | Brand-Kit (Schema, Renderer, Interview, Research-Entwurf, Genehmigung) und der Ideenspeicher (+ Form- und Lektionsachsen) | 4-brand-kit-and-ideas.md | ja |
| 4 | Dashboard-Shell + Design-System: Auswähler, Mandanten-Shell, Startseite, Strategie, Ideen, Einstellungen, Token, RTL, Telefon-Layout | 5-dashboard-and-design.md | ja |
| 5 | Produktion: Generierungs-Jobs, Gerüst, vertrauenswürdiger Export, «Bearbeiten», Builder-Skills, Produktbibliothek, die Ansichten Produzieren/Galerie/Skripte; dann sync-tenant --all | 6-production-and-export.md | ja (Bibliothek optional) |
| 6 | Medien-Engines: KI-Bildbeiträge, KI-Video, browserbasiertes Video, Remotion-Animationen | 7-media-engines.md | optional, pro Engine |
| 7 | Radar + Wettbewerber + Transkripte + Präzedenzindex + eigene Analysen + Community-Beitrag | 8-radar-competitors-and-analytics.md | Radar ja; der Rest optional |
| 8 | Chat-Assistent: gestreamte Runden, Speicher, die Aktionen des Agenten, Interview-Modus | 9-assistant-and-memory.md | dringend empfohlen |
| 9 | Kalender, Veröffentlichung (vom Eigentümer bestätigt), Wachstumsschleife | 10-publishing-calendar-and-growth.md | Kalender ja; Veröffentlichung optional |
| 10 | CRM + Partner (Dienstleistungsunternehmen) | 11-crm-and-partners.md | optional |
| 11 | Der Wissensspeicher des Eigentümers („Gehirn") + 3D-Graph | 12-brain.md | optional |
| 12 | Routing-Maps, CLAUDE.md / AGENTS.md für die Engine, jeden Mandanten und den Speicher | 13-routing-maps-and-agents-md.md | ja |
| 13 | Verifizierung: die vollständige Checkliste, dann die Übergabe | 14-verification.md | ja |
Baue nur die optionalen Stufen, die das Interview aktiviert hat. Ein Modul, das ausgeschaltet ist, ist auf dem Server ausgeschaltet (seine Routen geben für diesen Mandanten 404 zurück), nicht nur in der Seitenleiste versteckt. Jede Ansicht wird in der Stufe gebaut, die ihre Route baut (Referenz 5 §4 listet auf, welche); die Shell behandelt eine 404 von einer Route, die ausgeschaltet oder noch nicht gebaut ist, als „leer", niemals als Fehler.
Stufe 0: Prüfen, nicht annehmen
Teste jeden dieser Punkte einzeln. Sie sind unabhängig:
- Node ≥ 20 und pnpm (oder der vom Benutzer gewählte Paketmanager). Wenn Node fehlt, bitte den Benutzer, es zu installieren (nichts läuft hier ohne Node). Wenn Node funktioniert, aber die Next-App nicht installiert werden kann, verwende den Lite-Modus (unten).
- Symlinks. Erstelle einen in einem temporären Verzeichnis (
ln -s/fs.symlinkSync). Unter Windows ohne Entwicklermodus oder Adminrechte schlägt dies fehl:new-tenant.mjsschreibt dannAGENTS.mdals generierte Kopie und verlinktnode_modulesmit einem Directory-Junction, undverify-tenantsakzeptiert beides. Empfehle WSL, wenn verfügbar; es verhält sich wie Linux. - Das Runtime-Agent-CLI. Kann ein Node-Prozess es kopflos starten (
claude --print-Stil) und ist es angemeldet? Unterstützt es eine geschlossene Tool-Liste, Inline-Einstellungen mit Deny-Regeln und einen nicht interaktiven Berechtigungsmodus? Die Einschränkungsschicht ist für dasclaude-CLI geschrieben. Lies für jedes andere CLI „Anpassung an ein anderes Agent-CLI" in Referenz 3. Wenn der Agent nicht eingeschränkt werden kann, muss die Generierung für ein Mehrmandantensystem auf Prompt-Handoff heruntergestuft werden, da ein uneingeschränkter Agent jedes Unternehmen lesen kann. - Optionale Tools, nur wenn das Interview das Modul aktiviert hat, das sie benötigt:
ffmpeg,yt-dlp, dascodex-CLI, Google Chrome. - Playwright Chromium wird im Kontrollpunkt von Stufe 1 geprüft, nachdem das Bootstrap es installiert hat. Wenn es nicht installiert werden kann, verwende den HTML-only-Export.
Degradierungsmatrix (niemals zu einem Ja/Nein zusammenfassen)
- Voll. Node, Playwright und ein einschränkbares Agent-CLI: alles wie spezifiziert.
- HTML-only-Export. Playwright kann nicht installiert werden: Inhalte werden als HTML geschrieben und als HTML in der Vorschau angezeigt.
- Prompt-Handoff-Generierung. Der Agent kann nicht kopflos gestartet werden oder kann nicht eingeschränkt werden: Generate, Radar und Edit schreiben den verfassten Prompt in
<piece>/PROMPT.mdund zeigen ihn an; der Benutzer führt seinen Agenten darauf aus und drückt dann „Ich habe es ausgeführt, aktualisieren". Jeder andere Teil des Dashboards funktioniert normal. - Lite-Modus. Node funktioniert, aber die Next-App kann nicht installiert werden: Baue die Mandantenordner, die null-Abhängigkeits-Kernbibliotheken (
tenant.mjs,strategy-core.mjs,strategy-approve.mjs,ideas-core.mjs,shapes.mjs) und deren CLI-Tools:new-tenant,strategy-block,approve-kit(druckt den sha256 des Entwurfs, genehmigt dann genau diese Bytes) undideas(auflisten / hinzufügen / genehmigen / ablehnen), alle in Referenz 4 §12 spezifiziert. Markengenehmigung und der Ideenspeicher funktionieren dann vom Terminal aus. Teile dem Benutzer mit, welche Teile app-basiert und welche dateibasiert sind.
Fertigstellungsdefinition
Du bist erst fertig, wenn die Checkliste von Referenz 14 bestanden ist: Typprüfung, Lint, Build, Unit-Tests, verify-tenants (mit seinen echten CLI-Kanarienvögeln), verify-publishing-safety wenn Veröffentlichung existiert, eine echte Generierung aus einer genehmigten Idee und Screenshots der wichtigsten Bildschirme. Berichte ehrlich, welche Punkte bestanden wurden. Melde niemals einen Build als fertig, während ein fehlgeschlagener Schritt unerwähnt bleibt.
Einzelmandant vs. Mehrmandant: Was sich tatsächlich ändert
| Aspekt | Mehrmandant | Einzelmandant |
|---|---|---|
| Ordnerstruktur | tenants/<id>/ × N (oft der Arbeitsbereich der Agentur selbst + einer pro Kunde) | tenants/<id>/ × 1 (dieselbe Struktur, sodass das Hinzufügen eines zweiten Unternehmens später nichts kostet) |
/ | Auswähler: eine Karte pro Unternehmen (+ die Speicherkarte) | Leitet zu /<only-id> weiter, wenn genau ein gültiger Mandant existiert |
| Kopfzeile | Arbeitsbereichswechsler | Nur Unternehmensname, kein Dropdown |
| Agenteneinschränkung, Deny-Regeln, keine Shell | Erforderlich | Immer noch erforderlich: Es hält den Agenten vom Engine-Quellcode, den Geheimnissen im Repository-Stamm und den Einstellungen fern |
| Kontoschlüssel | Eigene .env.local jedes Mandanten | Immer noch die .env.local des Mandanten, nie die Engine-Umgebung, sodass ein zweites Unternehmen sie niemals erben kann |
| CLI-Tools | --tenant <id> erforderlich, kein Standard | Immer noch erforderlich (ein Shell-Alias ist in Ordnung) |
| Kanarienvögel | Echter Mandant = Opfer, Wegwerf-zz-canary = Angreifer | Gleich: Der Verifizierer erstellt seinen eigenen Angreifer |
In der Benutzeroberfläche wird ein Mandant als „Arbeitsbereich" (in der Sprache des Benutzers) bezeichnet, niemals als „Mandant".
Nicht verhandelbare Punkte
Trage jeden dieser Punkte in das über, was du generierst. Jeder hat seinen Grund, denn eine Regel ohne Grund wird stillschweigend „vereinfacht".
- ⭐ Nur Personalisierung. Jeder Wert stammt aus dem Interview. Belasse niemals einen Wert aus einem Beispiel, aus diesem Skill oder aus einem anderen Unternehmen in Code-Standards, Prompts oder Vorlagen. Ein Standardwert im Code brandmarkt stillschweigend jeden Mandanten, dessen Kit dieses Feld auslässt. Unternehmensspezifische Zahlen (Aktualität, Schwellenwerte, Währung, Kreditlimits, die Veröffentlichungssprache) leben in
tenant.jsonsettings; die einzigen Standards im Code sind die neutralen operativen Werte, die das Interview vorschlägt (DEFAULT_SETTINGS), und alles, wonach der Eigentümer nicht gefragt wurde, bleibt ungesetzt, niemals geraten. - ⭐ Kein Standardmandant, nirgendwo. Routen, CLI-Tools und der Cron müssen einen Mandanten benennen. Ein vergessener Mandant muss laut scheitern; die Alternative ist das stille Lesen oder Schreiben der Daten eines anderen Unternehmens.
- ⭐ Kein erzeugter Agent erhält jemals eine Shell. Ein Kindprozess wie
nodeläuft mit dem vollständigen Dateisystemzugriff des Operators, und kein CLI-Flag schränkt ihn ein. Dies wurde gemessen: Ein Mandanten-Agent mit einer Shell las die Dateien eines anderen Mandanten. Deshalb erstellt die Route das Gerüst vor dem Start und führt den vertrauenswürdigen Exporter oder Renderer danach aus. Der Agent schreibt Wörter und Code; die Engine führt aus. Gib niemals--dangerously-skip-permissionoder ähnliche Flags aus, die erforderlich sind, um Werkzeuge wienpx,rm,catoderlszu deaktivieren – stattdessen verwende die geschlossene Tool-Liste des Agenten-CLI mit Inline-Deny-Regeln. Wenn das CLI dies nicht unterstützt, degrade auf Prompt-Handoff (siehe Referenz 3).
[Die restlichen nicht verhandelbaren Punkte und der gesamte Skill werden in ähnlicher Weise fortgesetzt, aber aus Platzgründen gekürzt.]