跳转到内容

主题

pi 可以创建主题。请它为你的环境构建一个。

主题是定义 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. 创建主题文件:
Terminal window
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json
  1. 定义包含所有必需颜色的主题(参见颜色令牌):
{
"$schema": "https://raw.githubusercontent.com/earendil-works/pi/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/earendil-works/pi/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 个颜色令牌。没有可选颜色。

令牌用途
accent主强调色(logo、选中项、光标)
border普通边框
borderAccent高亮边框
borderMuted柔和边框(编辑器)
success成功状态
error错误状态
warning警告状态
muted次要文本
dim第三级文本
text默认文本(通常为 ""
thinkingText思考块文本
令牌用途
selectedBg选中行背景
userMessageBg用户消息背景
userMessageText用户消息文本
customMessageBg扩展消息背景
customMessageText扩展消息文本
customMessageLabel扩展消息标签
toolPendingBg工具框(待处理)
toolSuccessBg工具框(成功)
toolErrorBg工具框(错误)
toolTitle工具标题
toolOutput工具输出文本
令牌用途
mdHeading标题
mdLink链接文本
mdLinkUrl链接 URL
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超高思考
令牌用途
bashModeBash 模式下的编辑器边框(! 前缀)

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

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

支持四种格式:

格式示例说明
Hex"#ff0000"6 位十六进制 RGB
256 色39xterm 256 色调色板索引(0-255)
变量"primary"引用 vars 条目
默认""终端默认颜色
  • 0-15:基本 ANSI 颜色(取决于终端)
  • 16-231:6×6×6 RGB 立方体(16 + 36×R + 6×G + B,其中 R、G、B 为 0-5)
  • 232-255:灰度渐变

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

检查 truecolor 支持:

Terminal window
echo $COLORTERM # Should output "truecolor" or "24bit"

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

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

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

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

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

参见内置主题: