| { |
| "$schema": "http://json-schema.org/draft-07/schema#", |
| "title": "Pi Coding Agent Theme", |
| "description": "Theme schema for Pi coding agent", |
| "type": "object", |
| "required": ["name", "colors"], |
| "properties": { |
| "$schema": { |
| "type": "string", |
| "description": "JSON schema reference" |
| }, |
| "name": { |
| "type": "string", |
| "pattern": "^[^/]+$", |
| "description": "Theme name. Must not contain '/' because it is reserved for automatic light/dark theme settings." |
| }, |
| "vars": { |
| "type": "object", |
| "description": "Reusable color variables", |
| "additionalProperties": { |
| "oneOf": [ |
| { |
| "type": "string", |
| "description": "Hex color (#RRGGBB), variable reference, or empty string for terminal default" |
| }, |
| { |
| "type": "integer", |
| "minimum": 0, |
| "maximum": 255, |
| "description": "256-color palette index (0-255)" |
| } |
| ] |
| } |
| }, |
| "colors": { |
| "type": "object", |
| "description": "Theme color definitions (scrollbar, thinkingMax, and search highlight colors are optional and use compatible fallbacks)", |
| "required": [ |
| "accent", |
| "border", |
| "borderAccent", |
| "borderMuted", |
| "success", |
| "error", |
| "warning", |
| "muted", |
| "dim", |
| "text", |
| "thinkingText", |
| "selectedBg", |
| "userMessageBg", |
| "userMessageText", |
| "customMessageBg", |
| "customMessageText", |
| "customMessageLabel", |
| "toolPendingBg", |
| "toolSuccessBg", |
| "toolErrorBg", |
| "toolTitle", |
| "toolOutput", |
| "mdHeading", |
| "mdLink", |
| "mdLinkUrl", |
| "mdCode", |
| "mdCodeBlock", |
| "mdCodeBlockBorder", |
| "mdQuote", |
| "mdQuoteBorder", |
| "mdHr", |
| "mdListBullet", |
| "toolDiffAdded", |
| "toolDiffRemoved", |
| "toolDiffContext", |
| "syntaxComment", |
| "syntaxKeyword", |
| "syntaxFunction", |
| "syntaxVariable", |
| "syntaxString", |
| "syntaxNumber", |
| "syntaxType", |
| "syntaxOperator", |
| "syntaxPunctuation", |
| "thinkingOff", |
| "thinkingMinimal", |
| "thinkingLow", |
| "thinkingMedium", |
| "thinkingHigh", |
| "thinkingXhigh", |
| "bashMode" |
| ], |
| "properties": { |
| "accent": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Primary accent color (logo, selected items, cursor)" |
| }, |
| "border": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Normal borders" |
| }, |
| "borderAccent": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Highlighted borders" |
| }, |
| "borderMuted": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Subtle borders" |
| }, |
| "success": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Success states" |
| }, |
| "error": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Error states" |
| }, |
| "warning": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Warning states" |
| }, |
| "muted": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Secondary/dimmed text" |
| }, |
| "dim": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Very dimmed text (more subtle than muted)" |
| }, |
| "text": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Default text color (usually empty string)" |
| }, |
| "thinkingText": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking block text color" |
| }, |
| "selectedBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Selected item background" |
| }, |
| "scrollbarTrack": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Fullscreen scrollbar track foreground (falls back to muted when omitted)" |
| }, |
| "scrollbarThumb": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Fullscreen scrollbar thumb foreground (falls back to text when omitted)" |
| }, |
| "searchMatchBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Transcript search match background and current-match text (falls back to selectedBg when omitted)" |
| }, |
| "searchMatchText": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Transcript search match text and current-match background (falls back to text when omitted)" |
| }, |
| "userMessageBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "User message background" |
| }, |
| "userMessageText": { |
| "$ref": "#/$defs/colorValue", |
| "description": "User message text color" |
| }, |
| "customMessageBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Custom message background (hook-injected messages)" |
| }, |
| "customMessageText": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Custom message text color" |
| }, |
| "customMessageLabel": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Custom message type label color" |
| }, |
| "toolPendingBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Tool execution box (pending state)" |
| }, |
| "toolSuccessBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Tool execution box (success state)" |
| }, |
| "toolErrorBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Tool execution box (error state)" |
| }, |
| "toolTitle": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Tool execution box title color" |
| }, |
| "toolOutput": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Tool execution box output text color" |
| }, |
| "mdHeading": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown heading text" |
| }, |
| "mdLink": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown link text" |
| }, |
| "mdLinkUrl": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown link URL" |
| }, |
| "mdCode": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown inline code" |
| }, |
| "mdCodeBlock": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown code block content" |
| }, |
| "mdCodeBlockBorder": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown code block fences" |
| }, |
| "mdQuote": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown blockquote text" |
| }, |
| "mdQuoteBorder": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown blockquote border" |
| }, |
| "mdHr": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown horizontal rule" |
| }, |
| "mdListBullet": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Markdown list bullets/numbers" |
| }, |
| "toolDiffAdded": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Added lines in tool diffs" |
| }, |
| "toolDiffRemoved": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Removed lines in tool diffs" |
| }, |
| "toolDiffContext": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Context lines in tool diffs" |
| }, |
| "syntaxComment": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: comments" |
| }, |
| "syntaxKeyword": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: keywords" |
| }, |
| "syntaxFunction": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: function names" |
| }, |
| "syntaxVariable": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: variable names" |
| }, |
| "syntaxString": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: string literals" |
| }, |
| "syntaxNumber": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: number literals" |
| }, |
| "syntaxType": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: type names" |
| }, |
| "syntaxOperator": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: operators" |
| }, |
| "syntaxPunctuation": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Syntax highlighting: punctuation" |
| }, |
| "thinkingOff": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: off" |
| }, |
| "thinkingMinimal": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: minimal" |
| }, |
| "thinkingLow": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: low" |
| }, |
| "thinkingMedium": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: medium" |
| }, |
| "thinkingHigh": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: high" |
| }, |
| "thinkingXhigh": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: xhigh" |
| }, |
| "thinkingMax": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Thinking level border: max (falls back to thinkingXhigh when omitted)" |
| }, |
| "bashMode": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Editor border color in bash mode" |
| } |
| }, |
| "additionalProperties": false |
| }, |
| "export": { |
| "type": "object", |
| "description": "Optional colors for HTML export (defaults derived from userMessageBg if not specified)", |
| "properties": { |
| "pageBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Page background color" |
| }, |
| "cardBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Card/container background color" |
| }, |
| "infoBg": { |
| "$ref": "#/$defs/colorValue", |
| "description": "Info sections background (system prompt, notices)" |
| } |
| }, |
| "additionalProperties": false |
| } |
| }, |
| "additionalProperties": false, |
| "$defs": { |
| "colorValue": { |
| "oneOf": [ |
| { |
| "type": "string", |
| "description": "Hex color (#RRGGBB), variable reference, or empty string for terminal default" |
| }, |
| { |
| "type": "integer", |
| "minimum": 0, |
| "maximum": 255, |
| "description": "256-color palette index (0-255)" |
| } |
| ] |
| } |
| } |
| } |
|
|