Pi 的配置、扩展、平台设置和 API 参考。

Themes

pi 可以创建主题。要求它为你的设置构建一个。

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

目录

位置

Pi 从以下位置加载主题:

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

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

选择主题

通过 /settingssettings.json 选择主题:

{
  "theme": "my-theme"
}

首次运行时,pi 会检测你的终端背景并默认为 darklight

创建自定义主题

  1. 创建主题文件:
mkdir -p ~/.pi/agent/themes
vim ~/.pi/agent/themes/my-theme.json
  1. 使用所有必需的颜色定义主题(参见Color Tokens):
{
  "$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",
    "scrollbarThumb": "#555566",
    "searchMatchBg": "#2d2d30",
    "searchMatchText": "",
    "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",
    "thinkingMax": "#ff0088",
    "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 个必需的标记。thinkingMaxscrollbarThumb 及两个搜索高亮标记都是可选的,并使用下文列出的回退值。

$schema 字段支持编辑器自动完成和验证。

颜色标记

每个主题必须定义所有 51 个必需的颜色标记。可选标记用于兼容现有主题:thinkingMax 回退到 thinkingXhighscrollbarThumbsearchMatchBg 回退到 selectedBgsearchMatchText 回退到 text。其他搜索匹配项会在 searchMatchBg 上使用带下划线的 searchMatchText;当前匹配项则会反转这组前景色和背景色,并使用粗体。

核心 UI(11 种颜色)

代币 目的
accent 主要强调(徽标、所选项目、光标)
border 正常边框
borderAccent 突出显示的边框
borderMuted 微妙的边界(编辑)
success 成功状态
error 错误状态
warning 警告状态
muted 次要文本
dim 第三级文本
text 默认文本(通常为 ""
thinkingText thinking block 文本

背景和内容(11 个必需,3 个可选)

代币 目的
selectedBg 选定的线条背景
scrollbarThumb 全屏滚动条拇指背景;可选,回落到 selectedBg
searchMatchBg 文字记录搜索匹配项的背景和当前匹配项的文本;可选,回退到 selectedBg
searchMatchText 文字记录搜索匹配项的文本和当前匹配项的背景;可选,回退到 text
userMessageBg 用户留言背景
userMessageText 用户消息文本
customMessageBg 扩展消息背景
customMessageText 扩展消息文本
customMessageLabel 扩展消息标签
toolPendingBg 工具箱(待定)
toolSuccessBg 工具箱(成功)
toolErrorBg 工具箱(错误)
toolTitle 工具标题
toolOutput 工具输出文本

Markdown(10 种颜色)

代币 目的
mdHeading 标题
mdLink 链接文字
mdLinkUrl 链接网址
mdCode 内联代码
mdCodeBlock 代码块内容
mdCodeBlockBorder 代码块围栏
mdQuote 块引用文本
mdQuoteBorder 块引用边框
mdHr 水平尺
mdListBullet 列出项目符号

工具差异(3 种颜色)

代币 目的
toolDiffAdded 已添加线路
toolDiffRemoved 删除的行
toolDiffContext 上下文线

语法高亮(9 种颜色)

代币 目的
syntaxComment 评论
syntaxKeyword 关键词
syntaxFunction 函数名称
syntaxVariable 变量
syntaxString 弦乐
syntaxNumber 数字
syntaxType 类型
syntaxOperator 运营商
syntaxPunctuation 标点

思考级别边框(6 个必需,1 个可选)

编辑器边框颜色表示思考级别(视觉层次从微妙到突出):

代币 目的
thinkingOff 思考
thinkingMinimal 最少的思考
thinkingLow 低思考级别
thinkingMedium 中等思考级别
thinkingHigh 高思想
thinkingXhigh 超高思考级别
thinkingMax 最大限度的思考;可选,回落到 thinkingXhigh

Bash 模式(1 种颜色)

代币 目的
bashMode bash 模式下的编辑器边框(! 前缀)

HTML 导出(可选)

export 部分控制 /export HTML 输出的颜色。如果省略,则颜色源自 userMessageBg

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

颜色值

支持四种格式:

格式 例子 描述
十六进制 "#ff0000" 6 位十六进制 RGB
256 色 39 xterm 256 色调色板索引 (0-255)
多变的 "primary" 引用 vars 条目
默认 "" 终端的默认颜色

256 色调色板

  • 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 会回落到最接近的近似值。

检查真彩色支持:

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

提示

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

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

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

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

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

示例

查看内置主题: