skills-experimental/headless-terminal/SKILL.md
This skill provides guidance for implementing headless terminal interfaces that programmatically control shell sessions. Use this skill when implementing terminal emulation, pseudo-terminal wrappers,
npx skillsauth add bianhaifeng789-hue/openclaw-config headless-terminalInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill guides the implementation of headless terminal interfaces—programmatic wrappers that control shell sessions without a visible terminal UI. These implementations typically involve spawning shell processes, sending input (keystrokes, commands), and capturing output.
Before implementing, thoroughly read and understand the interface to be implemented:
Common libraries for terminal emulation in Python:
| Library | Best For | Trade-offs |
|---------|----------|------------|
| pexpect | Interactive terminal emulation, pattern matching | Higher-level API, good for expect/send patterns |
| pty | Low-level pseudo-terminal control | More control, but more boilerplate |
| subprocess | Simple non-interactive commands | Limited for true terminal emulation |
Decision criteria to document:
pexpectptysubprocess may sufficeDocument the choice explicitly with reasoning for future maintainability.
When spawning a shell process, consider these configuration options:
Interactive mode (-i flag):
.bashrc, .bash_profile) are sourcedEcho behavior:
echo=False in pexpect prevents input from appearing in outputTerminal dimensions:
(24, 80) is standard terminal sizeFocus on implementing exactly what the interface requires:
Explicitly handle these scenarios:
| Edge Case | Handling Strategy | |-----------|-------------------| | Shell exits unexpectedly | Check process liveness before operations | | Long-running commands | Configurable timeouts, background execution support | | Non-ASCII characters | Explicit encoding handling (UTF-8 typically) | | Race conditions | Appropriate delays between send and read operations | | Command cancellation | Proper signal handling (SIGINT for Ctrl+C) |
Create focused tests for each capability:
Common decisions that should be documented but often aren't:
Consider and document handling for:
Before considering the implementation complete:
Overview
This skill guides implementing headless terminal interfaces that programmatically control shell sessions without a visual UI. It focuses on spawning shell processes, sending keystrokes, capturing output, and managing lifecycle and edge cases. The guidance helps choose libraries, document decisions, and verify behavior with focused tests.
How this skill works
The implementation spawns a shell process via a chosen backend (pexpect, pty, or subprocess), configures interactive flags, terminal dimensions, and echo behavior, and exposes methods to send input and read output. It includes lifecycle management (spawn, liveness checks, terminate), signal handling for cancellations (e.g., Ctrl+C), and explicit resource cleanup and encoding handling.
When to use it
Building programmatic terminal emulation or pseudo-terminal wrappers
Implementing a BaseTerminal-style interface that must send keystrokes and read shell output
Automating interactive shell tasks that require prompts or password entry
Testing shell startup configuration or environment persistence
Handling long-running commands or background shell jobs
Best practices
Document and justify the chosen underlying library (pexpect, pty, or subprocess) and why alternatives were rejected
Expose only the methods required by the interface; avoid adding unrequested features
Set and document terminal dimensions and interactive flags so test behavior is reproducible
Handle encoding explicitly (UTF-8) and validate non-ASCII behavior in tests
Provide configurable timeouts and robust liveness checks to manage long-running commands and unexpected exits
Implement and document proper resource cleanup and context manager support if the interface expects it
Example use cases
A CI runner that needs to drive interactive installers and capture prompts
A remote automation agent that runs shells and reacts to output patterns using expect/send logic
A test harness that verifies shell startup files are sourced in interactive mode
A wrapper that exposes a programmatic API for sending special keys (Ctrl+C) and cancelling commands
A logging proxy that records both sent keystrokes and terminal output for replay and debugging
FAQ
Which library should I pick for interactive shells?
Use pexpect for high-level expect/send interactions and prompts; use pty for low-level control when precise terminal semantics are required; use subprocess only for non-interactive command execution.
How should I handle unexpected shell exits?
Always check process liveness before operations, surface clear errors to callers, and provide configurable retries or timeouts for recovery; document whether automatic restarts are in-scope.
Skill score
0
Health score
i
D
65 /100
Stats
278 stars
First Seen
2 months ago
Repository
benchflow-ai / skillsbench
Tag
business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings