主题

主题是定义 TUI 颜色的 JSON 文件。

加载位置

Pi 从以下位置加载主题:

  • 内置:darklight
  • 全局:~/.pi/agent/themes/*.json
  • 项目:.pi/themes/*.json
  • 包:themes/ 目录或 package.json 中的 pi.themes 条目
  • 设置:themes 数组,包含文件或目录
  • CLI:--theme <path>(可重复)

使用 --no-themes 禁用发现。

选择主题

通过 /settings 或在 settings.json 中选择主题:

{
  "theme": "my-theme"
}

首次运行时,Pi 检测终端背景并默认选择 darklight

创建自定义主题

  1. 创建主题文件:
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json
  1. 定义主题,包含所有必需颜色(见颜色标记):
{
  "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
  "name": "my-theme",
  "vars": {
    "primary": "#00aaff",
    "secondary": 242
  },
  "colors": {
    "accent": "primary",
    "border": "primary",
    "borderAccent": "#00ffff",
    "borderMuted": "secondary",
    "success": "#00ff00",
    "error": "#ff0000",
    "warning": "#ffff00",
    "muted": "secondary",
    "dim": 240,
    "text": "",
    "thinkingText": "secondary",
    "selectedBg": "#2d2d30",
    "userMessageBg": "#2d2d30",
    "userMessageText": "",
    "customMessageBg": "#2d2d30",
    "customMessageText": "",
    "customMessageLabel": "primary",
    "toolPendingBg": "#1e1e2e",
    "toolSuccessBg": "#1e2e1e",
    "toolErrorBg": "#2e1e1e",
    "toolTitle": "primary",
    "toolOutput": "",
    "mdHeading": "#ffaa00",
    "mdLink": "primary",
    "mdLinkUrl": "secondary",
    "mdCode": "#00ffff",
    "mdCodeBlock": "",
    "mdCodeBlockBorder": "secondary",
    "mdQuote": "secondary",
    "mdQuoteBorder": "secondary",
    "mdHr": "secondary",
    "mdListBullet": "#00ffff",
    "toolDiffAdded": "#00ff00",
    "toolDiffRemoved": "#ff0000",
    "toolDiffContext": "secondary",
    "syntaxComment": "secondary",
    "syntaxKeyword": "primary",
    "syntaxFunction": "#00aaff",
    "syntaxVariable": "#ffaa00",
    "syntaxString": "#00ff00",
    "syntaxNumber": "#ff00ff",
    "syntaxType": "#00aaff",
    "syntaxOperator": "primary",
    "syntaxPunctuation": "secondary",
    "thinkingOff": "secondary",
    "thinkingMinimal": "primary",
    "thinkingLow": "#00aaff",
    "thinkingMedium": "#00ffff",
    "thinkingHigh": "#ff00ff",
    "thinkingXhigh": "#ff0000",
    "bashMode": "#ffaa00"
  }
}
  1. 通过 /settings 选择主题。

热重载: 编辑当前活跃的自定义主题文件时,Pi 会自动重新加载,提供即时的视觉反馈。

主题结构

{
  "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
  "name": "my-theme",
  "vars": {
    "blue": "#0066cc",
    "gray": 242
  },
  "colors": {
    "accent": "blue",
    "muted": "gray",
    "text": "",
    ...
  }
}
  • name 是必需的,且必须唯一。
  • vars 是可选的。在此定义可复用的颜色,然后在 colors 中引用。
  • colors 必须定义全部 51 个必需标记。

$schema 字段启用编辑器自动补全和验证。

颜色标记

每个主题必须定义全部 51 个颜色标记。没有可选颜色。

核心 UI(11 个颜色)

标记用途
accent主强调色(logo、选中项、光标)
border普通边框
borderAccent高亮边框
borderMuted柔和边框(编辑器)
success成功状态
error错误状态
warning警告状态
muted次要文本
dim第三级文本
text默认文本(通常为 ""
thinkingText思考块文本

背景与内容(11 个颜色)

标记用途
selectedBg选中行背景
userMessageBg用户消息背景
userMessageText用户消息文本
customMessageBg扩展消息背景
customMessageText扩展消息文本
customMessageLabel扩展消息标签
toolPendingBg工具框(待处理)
toolSuccessBg工具框(成功)
toolErrorBg工具框(错误)
toolTitle工具标题
toolOutput工具输出文本

Markdown(10 个颜色)

标记用途
mdHeading标题
mdLink链接文本
mdLinkUrl链接 URL
mdCode行内代码
mdCodeBlock代码块内容
mdCodeBlockBorder代码块围栏
mdQuote引用文本
mdQuoteBorder引用边框
mdHr水平分割线
mdListBullet列表符号

工具 Diff(3 个颜色)

标记用途
toolDiffAdded添加的行
toolDiffRemoved删除的行
toolDiffContext上下文行

语法高亮(9 个颜色)

标记用途
syntaxComment注释
syntaxKeyword关键字
syntaxFunction函数名
syntaxVariable变量
syntaxString字符串
syntaxNumber数字
syntaxType类型
syntaxOperator运算符
syntaxPunctuation标点

思考级别边框(6 个颜色)

编辑器边框颜色指示思考级别(从柔和到醒目的视觉层次):

标记用途
thinkingOff思考关闭
thinkingMinimal最小思考
thinkingLow低思考
thinkingMedium中等思考
thinkingHigh高思考
thinkingXhigh超高思考

Bash 模式(1 个颜色)

标记用途
bashModebash 模式下的编辑器边框(! 前缀)

HTML 导出(可选)

export 部分控制 /export HTML 输出的颜色。如果省略,颜色从 userMessageBg 派生。

{
  "export": {
    "pageBg": "#18181e",
    "cardBg": "#1e1e24",
    "infoBg": "#3c3728"
  }
}

颜色格式

支持四种格式:

格式示例说明
Hex"#ff0000"6 位十六进制 RGB
256 色39xterm 256 色调色板索引(0-255)
变量"primary"引用 vars 条目
默认""终端默认颜色

256 色调色板

  • 0-15:基本 ANSI 颜色(取决于终端)
  • 16-231:6x6x6 RGB 立方体(16 + 36xR + 6xG + B,其中 R、G、B 为 0-5)
  • 232-255:灰度渐变

终端兼容性

Pi 使用 24 位 RGB 颜色。大多数现代终端都支持(iTerm2、Kitty、WezTerm、Windows Terminal、VS Code)。对于仅支持 256 色的旧终端,Pi 会回退到最接近的近似值。

检查 truecolor 支持:

echo $COLORTERM  # 应输出 "truecolor" 或 "24bit"

提示

深色终端: 使用明亮、饱和的颜色,提高对比度。

浅色终端: 使用较深、柔和的颜色,降低对比度。

色彩和谐: 从基础调色板开始(Nord、Gruvbox、Tokyo Night),在 vars 中定义,并一致引用。

测试: 使用不同的消息类型、工具状态、Markdown 内容和长换行文本检查你的主题。

VS Code:terminal.integrated.minimumContrastRatio 设为 1 以获得准确的颜色。