关于 headless-terminal
该技能指导开发者实现无界面终端接口,以程序方式控制 Shell 会话。内容涵盖进程管理、输入输出捕获、配置选择及边缘情况测试。
主要功能
- 01理解接口方法与行为约定
- 02选择 pexpect、pty 或 subprocess
- 03管理 Shell 进程生命周期
- 04处理输入、输出与信号
- 05测试超时、编码和启动配置
适用场景
- 01实现程序控制的 Shell 会话
- 02运行需要交互输入的命令
- 03捕获终端输出并处理取消
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ letta-ai/ skills --skill headless-terminal安装后在 Claude Code 中输入/headless-terminal确认已加载。
详细介绍
无头终端实现
概述
本技能介绍如何实现无头终端接口——以编程方式控制 Shell 会话的封装,不显示终端 UI。这类实现通常涉及启动 Shell 进程、发送输入(按键、命令)并捕获输出。
实现方法
步骤 1:了解接口契约
开始实现前,请仔细阅读并了解要实现的接口:
- 确定所有必需的方法及其签名
- 注意返回类型和预期行为
- 检查可选方法或功能
- 查看是否有现有实现或测试能说明预期行为
步骤 2:选择底层库
Python 中常见的终端模拟库:
| 库 | 最适合 | 权衡 |
|---|---|---|
pexpect | 交互式终端模拟、模式匹配 | API 更高级,适用于 expect/send 模式 |
pty | 低级伪终端控制 | 控制力更强,但需要编写更多样板代码 |
subprocess | 简单的非交互式命令 | 对真正的终端模拟支持有限 |
需要记录的决策依据:
- 任务是否需要交互式输入(密码、提示)?→
pexpect - 任务是否需要低级终端控制?→
pty - 是否只需执行非交互式命令?→
subprocess可能足够
请明确记录选择及其原因,以便后续维护。
步骤 3:处理 Shell 配置
启动 Shell 进程时,请考虑以下配置选项:
交互模式(-i 标志):
- 确保加载启动文件(
.bashrc、.bash_profile) - 会影响信号处理行为
- 如果测试要验证启动文件是否已加载,则必须启用
回显行为:
- 在 pexpect 中设置
echo=False,可防止输入内容出现在输出中 - 请考虑使用场景是否需要看到回显的输入
终端尺寸:
- 默认尺寸
(24, 80)是标准终端大小 - 可能会影响检测终端宽度的命令的输出格式
- 请说明选择特定尺寸的原因
步骤 4:实现核心功能
严格按照接口要求实现功能:
- 进程生命周期管理 - 启动、检查运行状态、终止
- 输入处理 - 发送按键,处理特殊按键(Ctrl+C 等)
- 输出捕获 - 读取可用输出,处理缓冲
- 资源清理 - 正确终止、支持上下文管理器
步骤 5:处理边缘情况
请明确处理以下场景:
| 边缘情况 | 处理策略 |
|---|---|
| Shell 意外退出 | 操作前检查进程是否仍在运行 |
| 长时间运行的命令 | 支持可配置超时和后台执行 |
| 非 ASCII 字符 | 明确处理编码(通常使用 UTF-8) |
| 竞态条件 | 在发送和读取操作之间设置适当延迟 |
| 命令取消 | 正确处理信号(Ctrl+C 对应 SIGINT) |
验证策略
测试方法
针对每项功能编写精简测试:
- 基本功能 - 导入、实例化
- 非交互式命令 - 执行简单命令并检查输出
- 交互式命令 - 执行需要输入的命令
- 信号处理 - 使用 Ctrl+C 取消
- Shell 状态 - 变量持久性、环境
- 启动配置 - 验证启动文件是否已加载
- 后台执行 - 处理长时间运行的命令
验证指南
- 运行测试套件以验证所有功能
- 测试通过后,避免重复进行手动验证
- 如果已有单个全面的测试文件,请使用该文件,而不是创建单独的验证脚本
常见陷阱
范围管理
- 只实现必需内容 - 避免添加未请求的功能,例如额外的实用方法
- 如果其他方法似乎有用,请注明,但除非有人要求,否则不要实现
- 通常需要支持上下文管理器,但请确认接口中是否包含此要求
效率
- 避免重复搜索 - 如果要查找一个类,进行一次有针对性的搜索即可
- 不要重复验证 - 如果测试通过,就不需要再进行额外的手动检查
- 除非明确要求,否则不要创建示例文件
文档缺漏
以下常见决策应当记录,但往往会被忽略:
- 选择该库而非其他方案的原因
- 使用特定 shell 标志的原因
- 选择特定默认值的原因
- 线程安全方面的考量(或明确说明它不是线程安全的)
错误处理
请考虑并记录以下情况的处理方式:
- 无效的按键序列
- 终端进程终止
- 超时情况
- 权限问题
实现检查清单
在认定实现已完成之前:
- 已实现所有接口方法
- 已说明选择该库的理由
- 已说明配置决策的依据
- 已明确处理边缘情况,或将其记录为范围之外
- 测试涵盖了所有必需功能
- 未添加任何未请求的功能
- 已妥善实现资源清理
评论
支持 Markdown