# cc-statusLine **Repository Path**: updateme/cc-statusLine ## Basic Information - **Project Name**: cc-statusLine - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-07-10 - **Last Updated**: 2026-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Claude Code Status Line 一个功能丰富的 Claude Code 状态栏插件,从 stdin 读取 Claude Code 的会话数据,以**多行彩色**形式实时展示模型、上下文、Token、Git、会话状态等信息。 灵感来自 [claude-hub](https://github.com/anthropics/claude-hub),在其基础上扩展了多行布局、Agent 追踪、TODO 进度等功能。 --- ## 功能特性 - 📊 **多行自定义布局** —— 通过 `CONFIG.layout` 自由编排每行显示哪些信息块(segment) - 🎨 **彩色上下文进度条** —— 实时显示上下文窗口占用,超阈值自动变黄/变红 - 💬 **Token 统计** —— 会话累计的输入 / 输出 / 缓存读取 / 缓存写入(含子代理 transcript),自动格式化为 `K` / `M`(同一消息 ID 按字段增量累计,既不重复计数也不漏掉流式改写后的真实值;增量读取落盘缓存,不重读全文件) - 🎯 **缓存命中率** —— `cacheR / (cacheR + cacheW + input)`,支持会话累计 / 当前轮两种口径,按阈值变色 - ⚡ **输出速度** —— 最近几条回复的 `tok/s`(聚合去抖,短回复不失真) - ↺ **压缩次数** —— 统计 `/compact` 与自动压缩次数(全文件扫描,首次压缩后才显示) - 🏷 **会话名** —— 显示 `/rename` 自定义名或自动派生名,多会话并行时快速区分 - 🔧 **工具活动聚合** —— 进行中工具 + 最近完成统计(如 `✓ Read ×3 │ ✓ Grep ×2`) - 🔌 **活跃 MCP / Skill** —— 从 transcript 实际调用检测(比静态配置计数更真实) - ⎇ **Git ahead/behind** —— `↑N ↓N` 未推送/未拉取提醒,未推送变黄 - 🗨 **最近回复时间** —— 助手最后回复距今多久 - 🧠 **会话状态检测** —— 根据事件智能判断 `空闲 / 思考中 / 执行中 / 等待中 / 完成` - 🤖 **Agent 追踪** —— 实时展示正在运行的子 Agent 类型、模型、任务、耗时 - 📋 **TODO 进度** —— 从 transcript 提取任务列表,显示完成进度(如 `2/5`) - 🌿 **Git 信息** —— 当前分支 + 未提交变更统计(增删行数、文件数) - 🔌 **MCP 服务器计数** —— 自动扫描用户级和项目级配置 - ⚡ **工具任务描述** —— 调用工具时显示对应任务(如 `✏️ file.js`、`🌐 https://...`) - 🔍 **Provider 自动识别** —— 根据 `ANTHROPIC_BASE_URL` 识别 deepseek / minimax / zhipu / kimi 等 - 💾 **系统内存监控** —— 实时显示系统内存使用率 - 🌏 **CJK 宽度适配** —— 正确处理中文字符宽度,超宽自动截断 - ⚡ **性能优化** —— Git 查询缓存、transcript 大文件尾部读取、统一解析入口 --- ## 安装 ### 1. 放置脚本 将 `status-line.mjs` 保存到任意目录(例如 `~/.claude/status-line.mjs` 或本项目目录)。 ### 2. 配置 Claude Code 编辑 Claude Code 配置文件(`~/.claude/settings.json` 或项目级 `.claude/settings.json`),添加 `statusLine` 配置: ```json { "statusLine": { "type": "command", "command": "node \"路径/status-line.mjs\"", "refreshInterval": 15 } } ``` > `refreshInterval`(秒,**可选**):除事件触发(新消息、`/compact` 完成、权限模式变更等)外,按间隔自动重新执行命令。本例设为 `15`,适合状态栏含 `⏱ 持续时间` / `🗨 最近回复时间` 这类需要随时间更新的字段。**省略该字段则仅事件驱动刷新**(无自动倒计时)。最小值 `1`。 **路径示例:** | 系统 | 示例路径 | |------|---------| | Windows | `node "D:/gitee/cc-statusLine/status-line.mjs"` | | macOS / Linux | `node "$HOME/.claude/status-line.mjs"` | --- ## 默认效果 默认布局为 **9 行**,展示如下信息: ``` 🏷 my-session │ Version:1.0.30 │ 🔌 MCP:3 │ ⏱ 15m │ 🗨 3m前 │ #8轮 🔧23次 deepseek │ [GLM-5] │ ████░░░░░░░░ 35% 70K/200K │ ↺ 2 │ ⚡high │ 思考中 📁 ...path/to/project │ ⎇ main ↑2 │ +12/-3Rows 💾 8.2GB/32GB (26%) │ 📊 ↑12.5K ↓3.2K cacheR:10K │ 🎯 98.9% │ ⚡ 42.1 tok/s 🔌▶ playwright │ ⚡ my-skill ◐ general [claude-sonnet-5] · 重构解析模块 · 1m 30s ◐ Edit: auth.ts │ ✓ Read ×3 │ ✓ Grep ×2 last: /init 📋 解析模块重构 (2/5) ``` --- ## Segment 详解 每个显示单元称为一个 **segment**,通过 `CONFIG.display` 控制开关,通过 `CONFIG.layout` 控制位置。 | Key | 说明 | 示例效果 | 默认 | |-----|------|---------|------| | `model` | 模型名称 | `[Opus 4.8]` | ✅ | | `provider` | 服务提供方 | `deepseek` / `minimax` / `zhipu` | ✅ | | `contextBar` | 上下文进度条 + 百分比 + 用量 | `████░░░░░░░░ 35% 70K/200K` | ✅ | | `project` | 项目名(从 cwd 提取) | `📦 my-project` | ❌ | | `branch` | Git 分支名 + ahead/behind | `⎇ main ↑2 ↓1` | ✅ | | `state` | 会话状态 | `空闲 / 思考中 / 执行中 / 等待中 / 完成` | ✅ | | `effort` | 推理强度 | `⚡high` / `⚡low` | ✅ | | `cwd` | 工作目录 | `📁 /path/to/project` | ✅ | | `duration` | 会话持续时间 | `⏱ 1h 30m` | ✅ | | `memory` | 系统内存使用 | `💾 8.2GB/32GB (26%)` | ✅ | | `tokens` | Token 统计 | `📊 ↑12.5K ↓3.2K cacheR:10K cacheW:5K` | ✅ | | `cacheHitRate` | 缓存命中率(按阈值变色) | `🎯 98.9%` | ✅ | | `speed` | 输出速度(最近回复聚合) | `⚡ 42.1 tok/s` | ✅ | | `compactions` | 上下文压缩次数(首次压缩后才显示) | `↺ 2` | ✅ | | `sessionName` | 会话名(/rename 或自动派生) | `🏷 my-session` | ✅ | | `toolsActivity` | 工具活动聚合 | `◐ Edit: auth.ts │ ✓ Read ×3` | ✅ | | `activeMcp` | 活跃 MCP 服务器(实际调用检测) | `🔌▶ playwright` | ✅ | | `activeSkill` | 活跃 Skill(实际调用检测) | `⚡ my-skill` | ✅ | | `lastReply` | 最近回复距今时间 | `🗨 3m前` | ✅ | | `version` | Claude Code 版本 | `Version:1.0.30` | ✅ | | `sessionId` | Session ID(前 8 位) | `sid:abc12345` | ❌ | | `toolTask` | 当前工具调用任务 | `✏️ file.js` / `🌐 https://...` | ✅ | | `userMessage` | 用户最近输入(摘要) | `💬 帮我重构这个模块` | ✅ | | `assistantMsg` | 助手最近回复(Stop 时) | `🗨 已完成重构...` | ✅ | | `notification` | 通知(权限请求等) | `⚠ 权限请求: ...` | ❌ | | `source` | 来源 | `(claude)` / `(codex)` | ❌ | | `mcp` | MCP 服务器数量 | `🔌 MCP:3` | ✅ | | `sessionStats` | 会话轮次 + 工具调用数 | `#8轮 🔧23次` | ✅ | | `gitChanges` | Git 未提交变更 | `+12/-3Rows` 或 `+12/-3Rows 4Files` | ✅ | | `currentTodo` | 当前 TODO 任务 | `正在处理的任务描述` | ✅ | | `lastCommand` | 最近斜杠命令 | `last: /init` | ✅ | | `agents` | Agent 追踪信息 | `◐ general [model] · task · 30s` | ✅ | | `todoProgress` | TODO 进度条 | `📋 任务名 (2/5)` | ✅ | ### 会话状态说明 | 状态 | 含义 | 颜色 | |------|------|------| | `空闲` (idle) | 无活动 | 灰色 | | `思考中` (thinking) | 模型推理中 | 青色 | | `执行中` (working) | 正在执行任务 | 黄色 | | `等待中` (waiting) | 等待用户输入(如权限请求) | 品红 | | `完成` (complete) | 本轮回复完成 | 绿色 | ### 上下文进度条颜色 | 占用百分比 | 颜色 | 说明 | |-----------|------|------| | < 60% | 🟢 绿色 | 正常 | | 60% ~ 80% | 🟡 黄色 | 警告 | | > 80% | 🔴 红色 | 危险,即将自动压缩 | --- ## 自定义配置 所有配置集中在脚本顶部的 `CONFIG` 对象中,**修改后立即生效**,无需重启 Claude Code。 ### 1. 开关 Segment 在 `CONFIG.display` 中设置 `true` / `false`: ```javascript display: { model: true, // 显示模型名称 contextBar: true, // 显示上下文进度条 branch: true, // 显示 Git 分支 project: false, // 关闭项目名显示 sessionId: false, // 关闭 Session ID 显示 // ... } ``` ### 2. 自定义布局 `CONFIG.layout` 是一个**二维数组**,每个子数组代表一行,元素为 segment key: ```javascript layout: [ ['version', 'mcp', 'duration', 'sessionStats'], // 第 1 行 ['provider', 'model', 'contextBar', 'effort', 'state'], // 第 2 行 ['cwd', 'project', 'branch', 'gitChanges'], // 第 3 行 ['memory', 'tokens'], // 第 4 行 // 自由增删行和 segment... ], ``` > 每行的 segment 会用 `│` 分隔符连接,只有同时在 `display` 中启用且当前有数据时才会渲染。 ### 3. 常用配置项 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `contextBar.width` | 进度条字符宽度 | `12` | | `contextBar.warnPercent` | 黄色警告阈值(%) | `60` | | `contextBar.dangerPercent` | 红色危险阈值(%) | `80` | | `contextBar.usableRatio` | 可用上下文比例 | `0.8` | | `agentTracking.maxDisplay` | 最多显示 Agent 数 | `10` | | `agentTracking.taskMaxLen` | Agent 任务描述最大长度 | `60` | | `cwd.maxLength` | 工作目录显示最大长度 | `50` | | `cacheHitRate.mode` | 命中率口径(`session` 会话累计 / `current` 当前轮) | `session` | | `cacheHitRate.warnPercent` | 命中率低于此值变黄(%) | `90` | | `cacheHitRate.dangerPercent` | 命中率低于此值变红(%) | `70` | | `git.showAheadBehind` | 显示未推送/未拉取数(`↑N ↓N`) | `true` | | `userMessage.maxLength` | 用户消息最大长度 | `60` | | `terminal.defaultWidth` | 终端降级宽度 | `120` | | `terminal.enableWrap` | 超宽截断 | `true` | --- ## 支持的模型上下文窗口 `CONFIG.contextWindowSize` 内置了主流模型的上下文窗口大小映射,用于计算上下文百分比: | 模型 | 上下文窗口 | |------|-----------| | Claude Fable 5 / Opus 4.8 | 1,000,000 | | Claude Opus / Sonnet / Haiku(4.x) | 200,000 | | GLM-4 / GLM-5 | 128,000 | | DeepSeek 系列 | 128,000 | | MiniMax | 1,000,000 | | 其他(默认) | 200,000 | 可按需在 `contextWindowSize` 中添加或修改映射。 ## 支持的 Provider 通过 `ANTHROPIC_BASE_URL` 自动识别: | Base URL | Provider | |----------|----------| | `api.deepseek.com` | deepseek | | `api.minimaxi.com` | minimax | | `open.bigmodel.cn` | zhipu | | `xiaomimimo.com` | xiaomi | | `api.kimi.com` | kimi | 未匹配时尝试从 URL 提取主机名作为 provider 名称。 ### 外部 providers 配置 支持在脚本同目录放置 `providers.json`(格式与 `CONFIG.providers` 相同的 host→名称映射): ```json { "api.deepseek.com": "DeepSeek", "api.my-company.cn": "mycom" } ``` 存在时与内置映射聚合,同名 host 以外部文件为主(上例中 `deepseek` 显示为 `DeepSeek`);文件不存在或解析失败则使用脚本内置映射。无需改脚本即可扩展自定义 provider。 --- ## 性能优化 状态栏每次刷新都是全新进程(Claude Code 官方仅支持一次性 command 模式),因此缓存必须落盘到 tmpdir 才能跨刷新生效: - **Git 查询缓存** —— 分支 / ahead-behind / 变更统计落盘缓存(按 cwd 分 key,TTL 3 秒),3 秒内刷新零 `git` 子进程调用 - **Transcript 大文件尾部读取** —— 超过 512KB 只读取尾部,跳过首个不完整行(仅用于状态 / 速度 / 工具活动等近期数据;会话时长与轮次不受窗口影响,见下一条) - **全文件轻量扫描** —— 压缩次数 / 活跃 MCP / Skill 需要全文件数据,用纯正则扫描(不做 JSON.parse);结果按 mtime+size 落盘缓存,文件未变直接复用 - **全文件增量累计** —— token 统计与会话时长 / 轮次必须覆盖全文件,按上次读取位置只读增量,结果落盘跨刷新共享 - **统一解析入口** —— transcript 尾部只读一次,状态检测、Agent 追踪、TODO 进度等共享结果 - **MCP 计数落盘缓存** —— 校验各配置文件 mtime,任一变化才重新读取 - **stdin 自带字段** —— 优先使用 stdin 的 `version` / `session_name`,免去 `claude --version` 子进程和 sessions 目录扫描 - **按需数据收集** —— `CONFIG.display` 开关同时门控数据收集,关闭的 segment 跳过对应 I/O - 实测(Windows,18.7MB transcript):单次刷新约 240ms → 约 90–125ms(缓存命中),git 缓存到期的那一次约 260ms --- ## 工作原理 Claude Code 在每次状态栏刷新时,会通过 **stdin** 传入一段 JSON 数据(包含 `session_id`、`model`、`cwd`、`transcript_path` 等;实际环境还会带上 `hook_event_name` 等未文档化字段)。脚本: 1. 同步读取 stdin 并解析 JSON 2. 根据 `transcript_path` 解析会话记录(提取 token、状态、Agent、TODO 等) 3. 根据 `cwd` 获取 Git 信息 4. 按 `CONFIG.layout` 逐行渲染 segment 5. 输出彩色多行文本到 stdout --- ## 技术要求 - **Node.js** ≥ 18(使用 ES Modules,即 `.mjs`) - 支持 ANSI 彩色的终端 --- # pi coding agent 版(pi-status-line.ts) 本仓库另提供 [pi coding agent](https://github.com/badlogic/pi-mono)(badlogic 的 π coding agent)的移植版:**`pi-status-line.ts`**,观感与 Claude Code 版一致(中文标签 / emoji 图标 / 多行 layout),数据段按 pi 的能力做了适配,并新增了 CC 版没有的**会话费用(cost)段**。 ## 机制差异 pi 的 statusline 与 Claude Code 完全不同:**没有 statusLine command 配置**,而是常驻 agent 进程内的 extension —— 事件驱动累积状态(`pi.on('message_update', ...)` 等),通过 `ctx.ui.setFooter()` 接管 footer 按帧渲染。因此: - 无需落盘缓存 / 增量读取 / 尾部窗口等跨进程优化 —— token / 轮次 / 压缩次数每帧直接从内存 `ctx.sessionManager.getEntries()` 累计 - 上下文占用来自 `ctx.getContextUsage()`(压缩后短暂为 null 时沿用最近一次可信读数,不闪 0%) - Git 分支由 pi 内置 watcher 提供(零开销);变更统计与 ahead/behind 走后台异步刷新(默认 10s 节流,不阻塞渲染) - 主题色走 `theme.fg(role, text)`,自动适配 pi 的 dark / light 主题 - 输出速度:流式期间按 字符数×token比 实时估算(token比 由最近消息的 output/字符数 滑动学习),流式结束后用真实 `usage.output` 覆盖为精确值,同时累计会话平均 ## 安装 ### 方式一:settings.json 引用仓库路径(推荐) 编辑 `~/.pi/agent/settings.json`,在 `extensions` 数组中加入本文件的绝对路径: ```json { "extensions": [ "D:/gitee/cc-statusLine/pi-status-line.ts" ] } ``` 引用仓库路径的好处:**改完代码在 pi 里执行 `/reload` 即生效**,无需复制文件。 ### 方式二:pi install ```bash pi install D:/gitee/cc-statusLine/pi-status-line.ts ``` ### 方式三:临时加载(当次会话) ```bash pi -e D:/gitee/cc-statusLine/pi-status-line.ts ``` ### 冲突警告 footer 是**独占资源**。若装有其他接管 footer 的 statusline extension(如 `npm:@reedchan/statusline`),需从 `settings.json` 的 `packages` 中移除,否则两者只有一个生效(取决于加载顺序)。 ## 默认效果 ``` zhipu │ [glm-5.3] │ █████░░░░░░░ 42% 420.0K/1.0M │ ↺ 2 │ ⚡high │ 思考中 📁 D:/gitee/cc-statusLine │ ⎇ master ↑1 │ ⏱ 15m │ #8轮 🔧23次 │ 🗨 3m前 💾 8.2GB/32GB (26%) │ 📊 ↑12.5K ↓3.2K cacheR:980.0K cacheW:1.2K │ 🎯 98.9% │ ⚡ 42.1 · avg 38.5 tok/s │ 💸 $1.23 ◐ ✏️ status-line.mjs │ ◐ ⚡ npm test 🔌 mcp ready ``` - 第 1 行:provider / 模型 / 上下文进度条 / 压缩次数 / 思考强度 / 会话状态(顺序与 CC 版一致) - 第 2 行:工作目录 / 分支(含未推送↑未拉取↓)/ 会话时长 / 轮次与工具调用 / 最近回复时间 - 第 3 行:系统内存 / token 统计 / 缓存命中率 / 输出速度(最近 + 会话平均)/ 会话费用 - 第 4 行:进行中的工具任务(无工具时整行隐藏) - 末行:其他 extension 通过 `setStatus()` 写入的状态(自动保留,否则会静默丢失) 无数据 的段自动隐藏(如无压缩时不显示 `↺`、空会话不显示 token 行);超宽自动按 CJK 宽度截断。 ## Segment 详解 | key | 显示效果 | 数据来源 | |-----|---------|---------| | `model` | `[glm-5.3]` | `ctx.model.id` | | `provider` | `zhipu` | `ctx.model.provider`(按模型归属,非 base URL 猜测) | | `effort` | `⚡high` | `ctx.thinkingLevel`(`/model` 切换思考强度时联动) | | `contextBar` | `█████░░░░░░░ 42% 420.0K/1.0M` | `ctx.getContextUsage()`,60% 变黄 / 80% 变红 | | `compactions` | `↺ 2` | entries 中 `compaction` 条目计数(首次压缩后才显示) | | `cwd` | `📁 D:/gitee/cc-statusLine` | `ctx.cwd`,超 50 字符尾部截断 | | `project` | `📦 cc-statusLine` | 从 `cwd` 提取(与 cwd 重复,默认关闭) | | `branch` | `⎇ master ↑1` | pi 内置 git watcher(`footerData.getGitBranch()`) | | `gitChanges` | `+12/-3 2文件` | 后台 `git diff --numstat HEAD`(10s 节流) | | `duration` | `⏱ 15m` | entries 首末时间戳 | | `sessionStats` | `#8轮 🔧23次` | user 消息数 / assistant content 中 toolCall 数 | | `lastReply` | `🗨 3m前` | 最后一条 assistant 消息时间戳 | | `memory` | `💾 8.2GB/32GB (26%)` | `os.totalmem/freemem`(5s 缓存,数字稳定不跳) | | `tokens` | `📊 ↑12.5K ↓3.2K cacheR:980.0K cacheW:1.2K` | 全部 assistant / toolResult / compaction 条目的 usage 累计 | | `cacheHitRate` | `🎯 98.9%` | `cacheR / (cacheR + cacheW + input)`,低于 90% 变黄 / 70% 变红 | | `speed` | `⚡ 42.1 · avg 38.5 tok/s` | 见下方「输出速度口径」 | | `cost` | `💸 $1.23` | usage.cost.total 累计(pi 的 usage 自带 provider 计费) | | `state` | `思考中` / `执行中` / `完成` / `空闲` | 见下方「会话状态说明」 | | `toolTask` | `◐ ✏️ status-line.mjs` | 进行中的工具调用(最多 3 个) | ## 会话状态说明 | 状态 | 触发时机 | |------|---------| | `空闲` | 会话启动 / resume 后 | | `执行中` | 用户提交输入,或工具开始执行 | | `思考中` | assistant 消息开始流式输出 | | `完成` | `agent_settled`(本轮回复结束且无自动继续) | ## 输出速度口径 - **流式中**(`42.1` 实时跳动):2 秒滑动窗口内 字符增量×token比 估算;token比 由最近几条消息的真实 `output / 内容字符数` 滑动学习,冷启动用 0.25 tok/char - **流式结束**:真实 `usage.output / (结束时间 - 首token时间)` 覆盖为精确值(decode < 500ms 的短回复不采信) - **avg**:会话内所有精确测量的消息合计(`Σoutput / Σdecode`,分子分母同口径,不会虚高) - resume 重载 extension 后最近速度清空,等下一轮回复恢复(pi 不落盘每条消息的生成耗时) ## 自定义配置 `pi-status-line.ts` 顶部的 `CONFIG` 与 CC 版同构,修改后在 pi 里执行 `/reload` 生效。 ### 1. 开关 Segment `display` 中置 `false` 即隐藏对应段(同时跳过相关数据收集): ```ts display: { model: true, provider: true, memory: true, // 改 false 即隐藏内存段 // ... } ``` ### 2. 自定义布局 `layout` 二维数组每行一个数组,元素为上表的 key(需在 `display` 中启用): ```ts layout: [ ['provider', 'model', 'contextBar', 'compactions', 'effort', 'state'], ['cwd', 'branch', 'gitChanges', 'duration', 'sessionStats', 'lastReply'], ['memory', 'tokens', 'cacheHitRate', 'speed', 'cost'], ['toolTask'], ], ``` ### 3. 常用配置项 | 配置 | 默认值 | 说明 | |------|-------|------| | `contextBar.width` / `warnPercent` / `dangerPercent` | `12` / `60` / `80` | 进度条宽度与变色阈值(%) | | `cacheHitRate.warnPercent` / `dangerPercent` | `90` / `70` | 命中率变黄 / 变红阈值(%) | | `git.showAheadBehind` | `true` | 分支后显示 `↑N ↓N` 未推送 / 未拉取 | | `git.refreshMs` | `10000` | diff / ahead-behind 后台刷新间隔(ms) | | `memory.refreshMs` | `5000` | 内存读数缓存间隔(ms,控制数字更新频率) | | `clockRefreshMs` | `15000` | 空闲时时钟重绘间隔(ms,驱动 ⏱ / 🗨 走动) | | `cwd.maxLength` | `50` | 工作目录超长截断 | | `toolTaskMap` / `toolTaskDefault` | 见源码 | 工具任务的参数摘要映射(字段 + emoji 前缀) | ## 与 Claude Code 版的功能对照 | Segment | CC 版 | pi 版 | 说明 | |---------|:----:|:----:|------| | model / provider / effort / contextBar / compactions | ✅ | ✅ | provider 数据源不同(见上表) | | cwd / project / branch / gitChanges / duration / sessionStats / lastReply / memory | ✅ | ✅ | | | tokens / cacheHitRate / speed / state / toolTask | ✅ | ✅ | speed 为真实单条响应精确值(pi 的 usage 无流式拆条问题) | | **cost** | ❌ | ✅ | pi 的 usage 自带 provider 计费 | | sessionName / version / mcp / source | ✅ | ❌ | 依赖 Claude Code 特有数据 | | agents / todoProgress / activeMcp / activeSkill / toolsActivity | ✅ | ❌ | CC 版从 transcript 工具调用还原;pi 的子代理 / TODO 为外部 extension 包,事件形态不同,暂未适配 | ## 测试 ```bash node test/pi-mock.mjs ``` 离线 mock 测试:以假 pi/ctx/theme 驱动完整事件序列(流式 / 工具执行 / 回合结束 / 空会话 / 窄宽度截断),调用 footer render 并断言各 segment(Node ≥ 23.6 直接运行 `.ts`,type-only import 会被剥离,无需安装依赖)。 ## 卸载 从 `~/.pi/agent/settings.json` 的 `extensions` 数组中删除路径即可;`/reload` 后恢复 pi 内置 footer。 ## License MIT