Persona-as-code (Git-Sync)
Verbinde ein Git-Repository mit deinem Workspace; pull, push oder synchronisiere Personas bidirektional als YAML + Markdown mit Last-Write-Wins-Konflikterkennung.
Persona-as-code schließt den Loop zwischen Moonborns Produktoberfläche und deinem Engineering-Workflow: Personas leben in Git, jede Änderung zeigt sich als Diff in einem Pull Request, und der Workspace bleibt synchron.
Preview-Status. Die Domain- und Application-Schichten sind implementiert (
@moonborn/integration-gitversendetPullPersonasFromGitUseCase+PushPersonasToGitUseCase); die HTTP-API und die Produkt-Onboarding-UI landen im nächsten Release. Bis dahin geht dieses Tutorial die Konfigurations-Form durch — Early-Access-Kunden können es per direkter Integration verdrahten.
1. Einen Sync-Modus wählen
integrations.git.sync_direction steuert den Fluss:
pull— Git ist die kanonische Quelle. Workspace spiegelt das Repo.push— Moonborn-UI ist kanonisch; Git ist die Audit-Spur.bidirectional— beides, mit Konflikt-Resolution.
Die meisten Teams starten den ersten Monat mit push — lass die
Produkt-UI die Personas generieren, beobachte die Diffs in Git, dann
wechsle zu bidirectional, sobald das Team Personas an beiden Orten
editiert.
2. Die Verbindung konfigurieren
await client.config.setItem({
key: 'integrations.git.provider',
value: 'github',
scope: 'workspace',
scopeId: 'ws_...',
});
await client.config.setItem({
key: 'integrations.git.repo_url',
value: 'https://github.com/your-org/persona-bible',
scope: 'workspace',
scopeId: 'ws_...',
});
await client.config.setItem({
key: 'integrations.git.base_path',
value: 'personas/',
scope: 'workspace',
scopeId: 'ws_...',
});
await client.config.setItem({
key: 'integrations.git.sync_direction',
value: 'push',
scope: 'workspace',
scopeId: 'ws_...',
});Unterstützte Provider: github, gitlab, bitbucket. Jeder ist
unabhängig tier-gated unter integrations.git.providers.* (alle Team+).
3. Datei-Layout
Jede Persona wird zu einer einzelnen Datei unter dem konfigurierten Base-Path:
---
id: persona_01H...
name: Mert Aksoy
version: 4
layer: Soul
desire: etwas bauen, was die Welt nicht ignorieren kann
fear: als gewöhnlich gesehen werden
wound: ein Elternteil, der Liebe in Leistung gemessen hat
growth_arc: vom Anerkennungssucher zum Selbstvertrauer
---
Mert verbrachte seine Zwanziger in der Istanbuler Tech-Szene. Seine
erste Firma verkaufte an einen türkischen Telco — ein leiser Exit,
den er immer noch als "okay" beschreibt.YAML-Frontmatter trägt die strukturierten Layer (Soul, Self, Mask, Surface); der Markdown-Body ist die narrative Erdung. Der Serializer emittiert genau diese Form beim Push; der Parser liest sie beim Pull zurück.
4. Den ersten Sync triggern
In der Preview-Phase werden Sync-Läufe über die Application-Schicht getriggert:
// (Preview — nur direkte Integration; HTTP-Endpoint kommt)
import { PushPersonasToGitUseCase } from '@moonborn/integration-git/application';
await runPush({ workspaceId: 'ws_...' });In Produktion wird daraus:
# (geplant)
curl -X POST https://api.moonborn.co/v1/integrations/git/push \
-H "Authorization: Bearer $MOONBORN_API_KEY"5. Konflikt-Resolution
Bidirektionale Syncs nutzen Last-Write-Wins mit expliziter
Ablehnung. Die Strategie wird durch
integrations.git.conflict_resolution gesetzt:
remote_wins— Pulls überschreiben lokale Änderungen bei Konflikt.local_wins— Pushes überschreiben Remote-Änderungen bei Konflikt.error— Konflikt sichtbar machen, Sync anhalten,PersonaFileSyncConflictErrormit den betroffenen Persona-IDs zurückgeben.
Konflikte werden per Git-Blob-SHA-Mismatch erkannt — kein Three-Way- Merge, kein CRDT.
6. Audit + Commit-Messages
Commit-Messages folgen
engine.pipeline.audit.commit_message_template (Standard
feat(persona): {{name}} v{{version}}). Jede Persona-Änderung
produziert einen Commit (mit integrations.git.commit_strategy = per_change) oder wird zu einem Commit pro Sync-Lauf gebatched (mit
batched).
Die Git-History wird zum de facto Changelog. Das Moonborn-Audit-Log zeichnet die Sync-Operationen selbst auf, nicht die Persona-Deltas.
Tarif
Team und höher. Jeder Provider-Toggle unabhängig.
Weiter
- Der Use Case: Persona-as-code use case.
- Provider-Details: Git sync integration.
- Integrations API reference.