MarsDawn

Mit deinem Agenten ein Thema erstellen

Eine Referenz für einen KI-Agenten, der ein MarsDawn-Vorschau-Thema erstellt. Der Agent schreibt eine theme.json, prüft und rendert sie mit dem Befehlszeilenwerkzeug marsdawn und gibt dir einen Link. Du stimmst sie auf der Seite Ein Thema erstellen nach Augenmaß ab und reichst sie ein. Die Feldtabellen unten sind direkt aus dem Quelltext des Kits gelesen, und eine Prüfung hält sie damit gleich.

Schreibe eine theme.json, führe marsdawn theme validate theme.json --require-complete --json aus, bis der Exit-Code 0 ist, rendere sie mit marsdawn theme preview in hell und dunkel und gib der Person dann einen Link. Ein Thema besteht nur aus Parametern. Es enthält nie CSS.

Was ein Thema ist

Ein Schlüssel, der nicht in den Tabellen unten steht, ist ein Fehler, ebenso ein doppelt geschriebener Schlüssel. Die Datei darf höchstens 16.384 Bytes groß sein.

Prüfen und rendern

Führe diese Befehle in dem Ordner aus, der theme.json enthält. Sie brauchen das Werkzeug marsdawn: siehe marsdawn für Agenten.

marsdawn theme validate theme.json --require-complete --json
marsdawn theme css theme.json --json
marsdawn theme preview theme.json --appearance light -o light.png
marsdawn theme preview theme.json --appearance dark -o dark.png

Mit einem eingebauten Thema beginnen

Kopiere eines der vier eingebauten Themen und ändere es. Jedes ist eine vollständige, gültige Datei:

Beispiel: Dawn

Das ist dawn.json, Byte für Byte. Ihre einzige Stiloption ist eine dünne Linie in der Akzentfarbe für hr.

{
  "schemaVersion": 1,
  "id": "dawn",
  "version": "1.0.0",
  "name": { "en": "Dawn" },
  "summary": { "en": "Warm Martian sunrise" },
  "fontDesign": "sans",
  "scenarios": ["agent-review"],
  "light": {
    "background": "#FFFDFB", "surface": "#F6F0EC", "text": "#26211F", "muted": "#6F6660",
    "border": "#EADFD8", "heading": "#26211F", "accent": "#C8471B", "link": "#B03C0C", "quote": "#D97A4A",
    "syntax": { "keyword": "#B03C0C", "string": "#2F6F5E", "comment": "#746B66", "number": "#9A5B00", "function": "#5B3E8C", "type": "#1F6FB2" },
    "diagram": { "node": "#FBE9E0", "nodeBorder": "#CA6C3C", "text": "#26211F", "line": "#8A6A5C", "secondary": "#E6F1EE", "tertiary": "#FFF6F1", "note": "#FFF1D6" }
  },
  "dark": {
    "background": "#1C1A1F", "surface": "#262229", "text": "#EBE4DF", "muted": "#A39992",
    "border": "#3A343A", "heading": "#F4EEEA", "accent": "#FF8A50", "link": "#FF9E6B", "quote": "#E08A5C",
    "syntax": { "keyword": "#FF9E6B", "string": "#7FD1B9", "comment": "#938A84", "number": "#F2C572", "function": "#C7A6F5", "type": "#6CB6FF" },
    "diagram": { "node": "#3A2A26", "nodeBorder": "#E08A5C", "text": "#EBE4DF", "line": "#B8A69C", "secondary": "#23332F", "tertiary": "#2B2427", "note": "#3D3322" }
  },
  "style": {
    "hr": { "style": { "type": "line", "color": "accent", "thickness": 1 } }
  }
}

Felder

Jedes Objekt unten wird auf dieselbe Weise gelesen. required heißt, der Schlüssel muss vorhanden sein, und ein Schlüssel, der nicht aufgeführt ist, ist ein Fehler.

Typen: string, integer, number, boolean, map (Sprach-Tag auf Text), enum (einer der aufgeführten Werte), role (eine Palettenrolle) und object (die Tabelle, auf die verlinkt wird). Ein [] hinter einem Typ bedeutet eine Liste.

theme.json

FeldTypPflichtWerte und Hinweise
schemaVersionintegerrequiredImmer 1.
idstringrequired1 bis 32 Zeichen: Kleinbuchstaben und Ziffern, in Abschnitten, die durch einzelne Bindestriche verbunden sind, etwa calm-green.
versionstringrequiredMAJOR.MINOR.PATCH, etwa 1.0.0.
namemaprequiredSprach-Tag auf Text. en ist erforderlich; andere Schlüssel sind Sprach-Tags wie zh-Hant. Jeder Text hat höchstens 48 Zeichen, ohne Links und Zeilenumbrüche.
summarymaprequiredDieselbe Form wie name, höchstens 120 Zeichen pro Text.
fontDesignenumrequiredsans, serif, rounded
scenariosenum[]requiredagent-review, technical-docs, formal-output, notes-sharing — Eins oder zwei, ohne Wiederholung. Sie legen fest, wie viel Kontrast das Thema erreichen muss.
authorobjectoptionalauthor
licensestringoptionalEine SPDX-Kennung, etwa Apache-2.0. Eingereichte Themen werden unter Apache-2.0 veröffentlicht.
lightobjectrequiredlight, dark
darkobjectrequiredlight, dark
styleobjectoptionalstyle

author

FeldTypPflichtWerte und Hinweise
namestringrequiredHöchstens 64 Zeichen, ohne Links.
githubstringoptionalEin GitHub-Login. Bei einer Einreichung trägst du den der einreichenden Person ein.

light, dark

FeldTypPflichtWerte und Hinweise
backgroundstringrequired# und sechs Hexziffern, etwa #1C1C1C.
surfacestringrequired# und sechs Hexziffern, etwa #1C1C1C.
textstringrequired# und sechs Hexziffern, etwa #1C1C1C.
mutedstringrequired# und sechs Hexziffern, etwa #1C1C1C.
borderstringrequired# und sechs Hexziffern, etwa #1C1C1C.
headingstringrequired# und sechs Hexziffern, etwa #1C1C1C.
accentstringrequired# und sechs Hexziffern, etwa #1C1C1C.
linkstringrequired# und sechs Hexziffern, etwa #1C1C1C.
quotestringrequired# und sechs Hexziffern, etwa #1C1C1C.
syntaxobjectoptional (zum Veröffentlichen erforderlich, mit --require-complete)syntax
diagramobjectoptional (zum Veröffentlichen erforderlich, mit --require-complete)diagram

syntax

FeldTypPflichtWerte und Hinweise
keywordstringrequired# und sechs Hexziffern, etwa #1C1C1C.
stringstringrequired# und sechs Hexziffern, etwa #1C1C1C.
commentstringrequired# und sechs Hexziffern, etwa #1C1C1C.
numberstringrequired# und sechs Hexziffern, etwa #1C1C1C.
functionstringrequired# und sechs Hexziffern, etwa #1C1C1C.
typestringrequired# und sechs Hexziffern, etwa #1C1C1C.

diagram

FeldTypPflichtWerte und Hinweise
nodestringrequired# und sechs Hexziffern, etwa #1C1C1C.
nodeBorderstringrequired# und sechs Hexziffern, etwa #1C1C1C.
textstringrequired# und sechs Hexziffern, etwa #1C1C1C.
linestringrequired# und sechs Hexziffern, etwa #1C1C1C.
secondarystringrequired# und sechs Hexziffern, etwa #1C1C1C.
tertiarystringrequired# und sechs Hexziffern, etwa #1C1C1C.
notestringrequired# und sechs Hexziffern, etwa #1C1C1C.

style

FeldTypPflichtWerte und Hinweise
bodySizenumberoptionalBereich
lineHeightnumberoptionalBereich
headingWeightnumberoptionalBereich
radiusnumberoptionalBereich
maxWidthnumberoptionalBereich
h1objectoptionalstyle.h1
h2objectoptionalstyle.h2
blockquoteobjectoptionalstyle.blockquote
hrobjectoptionalstyle.hr
tableobjectoptionalstyle.table
listMarkerroleoptionaleine Palettenrolle
inlineCoderoleoptionaleine Palettenrolle — Nur text oder eine Syntaxrolle: keyword, string, comment, number, function oder type.
linkobjectoptionalstyle.link
syntaxobjectoptionalstyle.syntax

style.h1

FeldTypPflichtWerte und Hinweise
sizenumberoptionalBereich
letterSpacingnumberoptionalBereich
alignenumoptionalleft, center
decorationobjectoptionaltype

style.h2

FeldTypPflichtWerte und Hinweise
letterSpacingnumberoptionalBereich
decorationobjectoptionaltype
italicbooleanoptionaltrue, false

style.blockquote

FeldTypPflichtWerte und Hinweise
styleobjectoptionaltype
italicbooleanoptionaltrue, false

style.hr

FeldTypPflichtWerte und Hinweise
styleobjectoptionaltype

style.table

FeldTypPflichtWerte und Hinweise
headerobjectoptionaltype
verticalRulesbooleanoptionaltrue, false
roundedbooleanoptionaltrue, false
FeldTypPflichtWerte und Hinweise
underlinebooleanoptionaltrue, false

style.syntax

FeldTypPflichtWerte und Hinweise
boldKeywordsbooleanoptionaltrue, false

Optionen mit einem Typ

Diese Stiloptionen sind Objekte mit einem type. Jeder type nimmt genau die für ihn aufgeführten Felder und keine anderen.

OptiontypeFeldPflichtTyp
style.h1.decorationrule———
style.h1.decorationnone———
style.h1.decorationshortRulecolorrequiredrole
style.h1.decorationgradientBarfromrequiredrole
style.h1.decorationgradientBartorequiredrole
style.h2.decorationrule———
style.h2.decorationnone———
style.h2.decorationdotcolorrequiredrole
style.blockquote.stylebarwidthoptionalnumber Bereich
style.blockquote.stylepanel———
style.hr.stylelinecoloroptionalrole
style.hr.stylelinethicknessoptionalnumber Bereich
style.hr.styleshortCenteredcolorrequiredrole
style.hr.stylegradientcolorsrequiredrole[] Zwei oder drei Rollen.
style.table.headersurface———
style.table.headeraccentRulecolorrequiredrole
style.table.headerfilledbackgroundrequiredrole
style.table.headerfilledtextrequiredrole
style.table.headerfilledborderoptionalrole

Palettenrollen

Eine Palettenrolle ist einer dieser Namen:

background, surface, text, muted, border, heading, accent, link, quote, keyword, string, comment, number, function, type

Zahlen

Eine Zahl wird auf das nächste Vielfache ihres Schritts gerundet und muss dann zwischen Min und Max liegen. Sonst lautet die Regel number.range.

FeldMinMaxSchritt
style.bodySize14181
style.lineHeight1.41.90.05
style.headingWeight40090050
style.radius0161
style.maxWidth60010001
style.h1.size1.82.40.1
style.h1.letterSpacing-0.030.030.005
style.h2.letterSpacing-0.030.030.005
style.blockquote.style.width241
style.hr.style.thickness141

Was sonst noch geprüft wird

Die Seite Ein Thema erstellen öffnet ein Thema aus einem Link, damit die Person es nach Augenmaß abstimmen kann. Der Link besteht aus der Adresse der Seite, dann #theme=, dann den Bytes der Datei als base64url ohne Auffüllzeichen. Die Datei darf höchstens 16.384 Bytes groß sein. Diese eine Zeile baut den Link in zsh und in bash, auf macOS und Linux:

printf 'https://marsdawn.southern-light.dev/de/themes/new/#theme=%s\n' "$(base64 < theme.json | tr -d '\n=' | tr '+/' '-_')"

Das Thema steht hinter einem #, das ein Browser nicht an die Website sendet, und die Website leitet es nirgendwohin weiter. Der Link bleibt aber im Verlauf deiner Shell und des Browsers, und jede Person, der du ihn schickst, kann das Thema lesen.

Einreichen

Der Agent bereitet die Datei und den Link vor. Die Person reicht ein. Beide Wege verlangen das Developer Certificate of Origin und die Veröffentlichung unter Apache-2.0, und diese Bestätigung gibt die Person ab: Der Agent setzt das Häkchen nicht und unterschreibt nicht für sie.

Autorenname, Name, Zusammenfassung und GitHub-Login eines eingereichten Themas werden dauerhaft öffentlich. Setze author.name daher auf einen Namen, den die Person gern veröffentlicht.

Veröffentlichte Themen

Wie veröffentlichte Themen aussehen, siehst du in der Themengalerie.