MarsDawn

에이전트와 함께 테마 만들기

MarsDawn 미리보기 테마를 만드는 AI 에이전트를 위한 참고 자료입니다. 에이전트는 theme.json 하나를 쓰고 명령줄 도구 marsdawn으로 검사하고 렌더링한 뒤 링크를 건넵니다. 사람은 테마 만들기 페이지에서 눈으로 다듬어 제출합니다. 아래 필드 표는 kit의 소스 코드에서 직접 읽은 것이며, 검사가 둘이 같음을 보장합니다.

theme.json을 쓰고, 종료 코드가 0이 될 때까지 marsdawn theme validate theme.json --require-complete --json을 실행하고, marsdawn theme preview로 라이트와 다크를 렌더링한 뒤 사람에게 링크를 건네세요. 테마는 매개변수일 뿐이며 CSS를 담지 않습니다.

테마란 무엇인가

아래 표에 없는 키는 오류이며, 같은 키를 두 번 쓰는 것도 오류입니다. 파일은 최대 16,384바이트입니다.

검사하고 렌더링하기

theme.json이 있는 폴더에서 실행하세요. marsdawn 도구가 필요합니다. 에이전트를 위한 marsdawn을 보세요.

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

기본 제공 테마에서 시작하기

기본 제공 테마 네 가지 중 하나를 복사해 고치세요. 모두 완전하고 유효한 파일입니다.

예시: Dawn

dawn.json을 한 바이트도 바꾸지 않고 옮긴 것입니다. 스타일 옵션은 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 } }
  }
}

필드

아래의 모든 객체는 같은 방식으로 읽힙니다. required는 키가 반드시 있어야 한다는 뜻이며, 나열되지 않은 키는 오류입니다.

타입: string, integer, number, boolean, map(언어 태그에서 텍스트로), enum(나열된 값 중 하나), role(팔레트 역할), object(연결된 표). 타입 뒤의 []는 목록을 뜻합니다.

theme.json

필드타입필수 여부값과 참고
schemaVersionintegerrequired항상 1.
idstringrequired1자에서 32자: 소문자와 숫자가 하이픈 하나로 이어진 덩어리, 예: calm-green.
versionstringrequiredMAJOR.MINOR.PATCH, 예: 1.0.0.
namemaprequired언어 태그에서 텍스트로. en은 필수이며, 다른 키는 zh-Hant 같은 언어 태그입니다. 각 텍스트는 최대 48자이며 링크와 줄바꿈을 넣을 수 없습니다.
summarymaprequiredname과 같은 형식이며 텍스트당 최대 120자.
fontDesignenumrequiredsans, serif, rounded
scenariosenum[]requiredagent-review, technical-docs, formal-output, notes-sharing — 하나 또는 둘, 중복 불가. 테마가 달성해야 하는 대비 수준을 정합니다.
authorobjectoptionalauthor
licensestringoptionalSPDX 식별자, 예: Apache-2.0. 제출된 테마는 Apache-2.0으로 게시됩니다.
lightobjectrequiredlight, dark
darkobjectrequiredlight, dark
styleobjectoptionalstyle

author

필드타입필수 여부값과 참고
namestringrequired최대 64자, 링크 불가.
githubstringoptionalGitHub 로그인. 제출할 때는 제출하는 사람의 것을 넣으세요.

light, dark

필드타입필수 여부값과 참고
backgroundstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
surfacestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
textstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
mutedstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
borderstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
headingstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
accentstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
linkstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
quotestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
syntaxobjectoptional (게시하려면 필수, --require-complete로 검사)syntax
diagramobjectoptional (게시하려면 필수, --require-complete로 검사)diagram

syntax

필드타입필수 여부값과 참고
keywordstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
stringstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
commentstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
numberstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
functionstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
typestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.

diagram

필드타입필수 여부값과 참고
nodestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
nodeBorderstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
textstringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
linestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
secondarystringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
tertiarystringrequired#과 16진수 여섯 자리, 예: #1C1C1C.
notestringrequired#과 16진수 여섯 자리, 예: #1C1C1C.

style

필드타입필수 여부값과 참고
bodySizenumberoptional범위
lineHeightnumberoptional범위
headingWeightnumberoptional범위
radiusnumberoptional범위
maxWidthnumberoptional범위
h1objectoptionalstyle.h1
h2objectoptionalstyle.h2
blockquoteobjectoptionalstyle.blockquote
hrobjectoptionalstyle.hr
tableobjectoptionalstyle.table
listMarkerroleoptional팔레트 역할
inlineCoderoleoptional팔레트 역할 — text 또는 구문 역할만 가능: keyword, string, comment, number, function, type.
linkobjectoptionalstyle.link
syntaxobjectoptionalstyle.syntax

style.h1

필드타입필수 여부값과 참고
sizenumberoptional범위
letterSpacingnumberoptional범위
alignenumoptionalleft, center
decorationobjectoptionaltype

style.h2

필드타입필수 여부값과 참고
letterSpacingnumberoptional범위
decorationobjectoptionaltype
italicbooleanoptionaltrue, false

style.blockquote

필드타입필수 여부값과 참고
styleobjectoptionaltype
italicbooleanoptionaltrue, false

style.hr

필드타입필수 여부값과 참고
styleobjectoptionaltype

style.table

필드타입필수 여부값과 참고
headerobjectoptionaltype
verticalRulesbooleanoptionaltrue, false
roundedbooleanoptionaltrue, false
필드타입필수 여부값과 참고
underlinebooleanoptionaltrue, false

style.syntax

필드타입필수 여부값과 참고
boldKeywordsbooleanoptionaltrue, false

type이 있는 옵션

이 스타일 옵션은 type이 있는 객체입니다. 각 type은 그것에 나열된 필드만 받고 다른 필드는 받지 않습니다.

옵션type필드필수 여부타입
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 범위
style.blockquote.stylepanel———
style.hr.stylelinecoloroptionalrole
style.hr.stylelinethicknessoptionalnumber 범위
style.hr.styleshortCenteredcolorrequiredrole
style.hr.stylegradientcolorsrequiredrole[] 역할 둘 또는 셋.
style.table.headersurface———
style.table.headeraccentRulecolorrequiredrole
style.table.headerfilledbackgroundrequiredrole
style.table.headerfilledtextrequiredrole
style.table.headerfilledborderoptionalrole

팔레트 역할

팔레트 역할은 다음 이름 중 하나입니다.

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

숫자

숫자는 가장 가까운 간격의 배수로 맞춰진 뒤 최소와 최대 사이에 있어야 합니다. 그렇지 않으면 규칙은 number.range입니다.

필드최소최대간격
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

그 밖에 검사하는 것

테마 만들기 페이지는 링크로 테마를 열어 사람이 눈으로 다듬을 수 있게 합니다. 링크는 그 페이지의 주소, #theme=, 그리고 패딩 없는 base64url로 인코딩한 파일 바이트로 이루어집니다. 파일은 최대 16,384바이트입니다. 이 한 줄이 macOS와 Linux의 zsh와 bash에서 링크를 만들어 줍니다.

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

테마는 브라우저가 사이트로 보내지 않는 # 뒤에 담기며, 사이트는 이를 어디에도 보내지 않습니다. 다만 링크는 셸과 브라우저의 기록에 남고, 링크를 받은 사람은 누구나 테마를 읽을 수 있습니다.

제출하기

에이전트는 파일과 링크를 준비하고, 제출은 사람이 합니다. 두 방법 모두 Developer Certificate of Origin과 Apache-2.0 게시에 대한 확인이 필요하며, 이 확인은 사람이 직접 합니다. 에이전트가 상자에 체크하거나 대신 서명하지 않습니다.

제출된 테마의 작성자 이름, 이름, 요약, GitHub 로그인은 영구적으로 공개됩니다. author.name에는 그 사람이 공개해도 좋다고 한 이름을 넣으세요.

게시된 테마

게시된 테마가 어떻게 생겼는지는 테마 갤러리에서 볼 수 있습니다.