@sukeai/pi-logfwd
pi package: replaces the built-in bash tool with real-time log forwarding via the pi-logfwd Go binary (PTY, JSONL events, optional log file) / pi 实时命令日志转发扩展(bash 覆盖内置)
Package details
Install @sukeai/pi-logfwd from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@sukeai/pi-logfwd- Package
@sukeai/pi-logfwd- Version
0.2.3- Published
- Sep 5, 2026
- Downloads
- 713/mo · 41/wk
- Author
- sukeai
- License
- MIT
- Types
- extension
- Size
- 22.5 KB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./extension/extension.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-logfwd
实时命令日志转发:当 pi 运行命令时,把输出实时流式转发回来(而不是内置 bash 工具那样攒到最后一次性返回 + 截断)。
- bash 工具(覆盖内置):pi 扩展注册名为
bash,同名覆盖 pi 内置的缓冲式 bash——模型每次调用 bash 都固定经 Go 二进制pi-logfwd在伪终端(PTY)中运行命令,JSONL 事件流逐块推送,可选追加日志文件。 - pi-logfwd 二进制:跨平台预编译二进制,作为 npm 平台包随主包一起分发(见下方「平台支持」)。
动机:pi 内置 bash/process 工具是缓冲式的——输出攒到最后一次性返回,且截断为末尾 2000 行 / 50KB;没有 TTY、没有交互输入通道。pi-logfwd 补上:实时流式输出、PTY 支持、日志落盘。
为什么不叫 bash_logged:早期版本注册成独立的
bash_logged工具,与内置bash并列——模型每次执行命令都在两个工具间“随缘二选一”,导致 pi-logfwd 有时生效有时不生效(实测 23 个会话中仅 4 个用到,shell 调用占比约 3%)。0.2.0 起直接注册名为bash覆盖内置工具,触发从此 100% 确定:要么不用这个包,要用就全走实时转发。
密码提示与 GUI 授权弹窗不支持(PTY 只能渲染提示、无人应答;弹窗无法程序化操作)——此时告诉用户手动执行。
架构
pi (agent)
│ bash 工具(@sukeai/pi-logfwd 扩展,覆盖内置 bash)
▼
pi-logfwd run -- "shell script" ← 接收 shell 脚本 / 任意命令
│ 内部:PTY 分配(默认)或管道(--no-pty)
│ 实时:每块输出 → JSONL 事件 → stdout + 可选 --log-file
▼
{ "ts":…, "event":"start", "pid":123, "command":"echo hi" }
{ "ts":…, "event":"output", "stream":"stdout", "data":"hi\n" }
{ "ts":…, "event":"exit", "code":0, "durationMs":12 }
安装
# 推荐:npm 安装(自动带上当前平台的预编译二进制)
pi install npm:@sukeai/pi-logfwd
# 从 GitHub(仓库公开后可用;需在 settings 或命令行指定版本 tag)
pi install git:github.com/lazyfury/pi-log-forwarder@v0.1.0
# 本地路径开发(不安装依赖,适合改源码)
pi install /path/to/pi-log-forwarder
# 试用一次(不写 settings)
pi -e npm:@sukeai/pi-logfwd
装完在 pi 里 /reload,内置 bash 即被替换——所有 shell 命令自动走实时转发(参数 command / timeout / cwd / logFile / noPty 可用)。想还原内置 bash:pi remove npm:@sukeai/pi-logfwd 后 /reload。
工具结果标记
每次调用的结果末尾会附加一行状态标记,命令失败不会静默:
- 退出码非零 →
(exit code: N)(真退出码取自 Go 端 JSONLexit事件,非 pi-logfwd 进程自身退出码) timeout杀进程 →(timed out after Ns, exit code 124)(判据是 exit 事件的message: "killed by --timeout",命令自己exit 124不会被误判为超时)- 正常退出(0)→ 无标记
平台支持
二进制分发模型:npm platform companion 包(esbuild 同款机制)。主包把全部平台包列为 optionalDependencies,npm 只安装与当前 os/cpu 匹配的那一个,其余静默跳过;扩展在运行时按平台定位二进制。
| 平台 | 预编译包 | 状态 |
|---|---|---|
| macOS arm64 | @sukeai/pi-logfwd-darwin-arm64 |
✅ 实机验证 |
| macOS amd64 | @sukeai/pi-logfwd-darwin-amd64 |
⚠️ 交叉编译,未实机验证 |
| Linux arm64 | @sukeai/pi-logfwd-linux-arm64 |
⚠️ 交叉编译,未实机验证 |
| Linux amd64 | @sukeai/pi-logfwd-linux-amd64 |
⚠️ 交叉编译,未实机验证 |
| Windows | 无 | ❌ 不支持 |
Windows 为什么不支持:pi-logfwd 的 PTY 层用 creack/pty,它在 Windows 上直接返回 ErrUnsupported(--no-pty 管道模式理论上可行,但需额外改 shell 默认值/信号处理,成本高收益低),因此不发布 win32 平台包。
不支持的平台如何提醒:全部平台包被 npm 跳过 → 二进制缺失 → bash(pi-logfwd)不会静默报 ENOENT,而是返回明确说明:
- win32:提示「Windows 不受支持(creack/pty ErrUnsupported),建议在 WSL/容器中运行 pi」;自行编译仅管道版可设
PI_LOG_FWD_BIN绕过。 - 其他缺二进制:给出三种装法(
pi install npm:@sukeai/pi-logfwd/go build/ 放入 PATH 或~/.pi/agent/bin)。
二进制解析顺序(每次调用时)
1. env PI_LOG_FWD_BIN (显式指定,设了但缺失会直接报错)
2. 平台 companion 包 (@sukeai/pi-logfwd-<os>-<arch>)
3. ~/.pi/agent/bin/pi-logfwd (兼容旧的本地安装方式)
4. PATH 上的 pi-logfwd (兼容旧的 PATH 安装方式)
pi-logfwd CLI 用法(独立于 pi 使用)
pi-logfwd run [flags] [--] <shell-script> # PTY 模式(默认),JSONL 事件流
pi-logfwd run [flags] - # 从 stdin 读脚本
pi-logfwd version | help
# flags: --no-pty --plain --timeout D --cwd DIR --log-file FILE
示例:
pi-logfwd run 'echo hi; echo err >&2' # JSONL
pi-logfwd run --plain 'make test' # 人类可读
cat deploy.sh | pi-logfwd run --log-file /tmp/deploy.log -
pi-logfwd run --timeout 30s 'npm run build'
退出码:透传子进程退出码;超时被杀死为 124;信号终止为 128+信号。
开发者
仓库结构
cmd/pi-logfwd/ Go 源码(main.go / runner.go)
extension/extension.ts pi 扩展:注册 bash 工具覆盖内置(平台解析 + 提醒逻辑)
package.json 主包(pi manifest + optionalDependencies 平台包列表)
scripts/release.sh 交叉编译 + 发布(Go build → 平台包 → npm publish)
scripts/set-version.js 主包/平台包版本同步
本地构建(不经 npm)
go build -o ~/.pi/agent/bin/pi-logfwd ./cmd/pi-logfwd # 单二进制,无配置依赖
# 或放 PATH;扩展解析顺序第 3/4 步会找到它
发布(Go 二进制 + npm 包一体)
所有包共用同一版本号(主包 + 4 个平台包),一条命令完成:
scripts/release.sh 0.1.0 # 构建矩阵 + 打包 dry-run(验证内容,不发)
scripts/release.sh 0.1.0 --publish # 真发布
# 然后 git tag v0.1.0 && git push --tags
发布流程:go build(CGO_ENABLED=0,GOOS/GOARCH 矩阵)→ 每个平台生成只含二进制的 npm 平台包(os/cpu 字段匹配)→ 依次 npm publish --access public → 主包最后发。
平台包命名
@sukeai/pi-logfwd-<os>-<arch>,每个包bin: { "pi-logfwd": "bin/pi-logfwd" }——npm 会把匹配平台的二进制链入node_modules/.bin。
备注
- 新增平台:在
scripts/release.sh的PLATFORMS加一行 +package.json的optionalDependencies加对应项;Windows 除外(见上)。 - 本仓库 LICENSE 沿用 pi-fun-placeholder 先例(MIT / robotnoname);如需改署名,替换
LICENSE与两处package.json的 license 说明即可。