feat: skills - add auto-tmux safety preflight

This commit is contained in:
tukuaiai
2026-05-19 03:54:25 +08:00
parent f0535d5e0b
commit d6c7f73f1e
14 changed files with 250 additions and 6 deletions
+3 -1
View File
@@ -17,6 +17,7 @@ skills/auto-tmux/
│ ├── swarm-brief.sh │ ├── swarm-brief.sh
│ ├── swarm-watch.sh │ ├── swarm-watch.sh
│ ├── swarm-archive.sh │ ├── swarm-archive.sh
│ ├── safety-check.sh
│ ├── render-swarm-prompt.sh │ ├── render-swarm-prompt.sh
│ ├── swarm-dispatch.sh │ ├── swarm-dispatch.sh
│ ├── auto-tmux-smoke-test.sh │ ├── auto-tmux-smoke-test.sh
@@ -44,6 +45,7 @@ skills/auto-tmux/
- `scripts/swarm-brief.sh` 是只读交接层,汇总 doctor/topology/scan/report 形成上下文快照。 - `scripts/swarm-brief.sh` 是只读交接层,汇总 doctor/topology/scan/report 形成上下文快照。
- `scripts/swarm-watch.sh` 是有限轮次巡检层,按间隔采集 pane 输出与 swarm report。 - `scripts/swarm-watch.sh` 是有限轮次巡检层,按间隔采集 pane 输出与 swarm report。
- `scripts/swarm-archive.sh` 是归档层,打包 brief、snapshot 和 swarm state 供复盘交接。 - `scripts/swarm-archive.sh` 是归档层,打包 brief、snapshot 和 swarm state 供复盘交接。
- `scripts/safety-check.sh` 是安全预检层,检查待发送 payload 的危险命令、敏感信息和大小。
- `scripts/render-swarm-prompt.sh` 是提示词渲染层,生成 commander/worker/reviewer 协议文本。 - `scripts/render-swarm-prompt.sh` 是提示词渲染层,生成 commander/worker/reviewer 协议文本。
- `scripts/swarm-dispatch.sh` 是提示词下发层,默认写文件,显式 `--send` 后才发送到 pane。 - `scripts/swarm-dispatch.sh` 是提示词下发层,默认写文件,显式 `--send` 后才发送到 pane。
- `scripts/validate-auto-tmux.sh` 是技能专属质量门禁,覆盖脚本、文档索引和 smoke test。 - `scripts/validate-auto-tmux.sh` 是技能专属质量门禁,覆盖脚本、文档索引和 smoke test。
@@ -55,4 +57,4 @@ skills/auto-tmux/
- 上游来源:`tools/external/.tmux``tools/external/tmux` - 上游来源:`tools/external/.tmux``tools/external/tmux`
- 下游使用:`SKILL.md``references/` 中的命令示例。 - 下游使用:`SKILL.md``references/` 中的命令示例。
- 验证入口:`skills/auto-skill/scripts/validate-skill.sh skills/auto-tmux --strict` - 验证入口:`skills/auto-skill/scripts/validate-skill.sh skills/auto-tmux --strict`
- 脚本验证:`skills/auto-tmux/scripts/validate-auto-tmux.sh``bash -n skills/auto-tmux/scripts/auto-tmux.sh``bash -n skills/auto-tmux/scripts/swarm-state.sh``bash -n skills/auto-tmux/scripts/swarm-brief.sh``bash -n skills/auto-tmux/scripts/swarm-watch.sh``bash -n skills/auto-tmux/scripts/swarm-archive.sh``bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh``bash -n skills/auto-tmux/scripts/swarm-dispatch.sh``skills/auto-tmux/scripts/auto-tmux-smoke-test.sh` - 脚本验证:`skills/auto-tmux/scripts/validate-auto-tmux.sh``bash -n skills/auto-tmux/scripts/auto-tmux.sh``bash -n skills/auto-tmux/scripts/swarm-state.sh``bash -n skills/auto-tmux/scripts/swarm-brief.sh``bash -n skills/auto-tmux/scripts/swarm-watch.sh``bash -n skills/auto-tmux/scripts/swarm-archive.sh``bash -n skills/auto-tmux/scripts/safety-check.sh``bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh``bash -n skills/auto-tmux/scripts/swarm-dispatch.sh``skills/auto-tmux/scripts/auto-tmux-smoke-test.sh`
+3
View File
@@ -24,12 +24,14 @@ bash -n skills/auto-tmux/scripts/swarm-state.sh
bash -n skills/auto-tmux/scripts/swarm-brief.sh bash -n skills/auto-tmux/scripts/swarm-brief.sh
bash -n skills/auto-tmux/scripts/swarm-watch.sh bash -n skills/auto-tmux/scripts/swarm-watch.sh
bash -n skills/auto-tmux/scripts/swarm-archive.sh bash -n skills/auto-tmux/scripts/swarm-archive.sh
bash -n skills/auto-tmux/scripts/safety-check.sh
bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh
bash -n skills/auto-tmux/scripts/swarm-dispatch.sh bash -n skills/auto-tmux/scripts/swarm-dispatch.sh
bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh
skills/auto-tmux/scripts/auto-tmux.sh help skills/auto-tmux/scripts/auto-tmux.sh help
skills/auto-tmux/scripts/swarm-state.sh help skills/auto-tmux/scripts/swarm-state.sh help
skills/auto-tmux/scripts/swarm-brief.sh --help skills/auto-tmux/scripts/swarm-brief.sh --help
skills/auto-tmux/scripts/safety-check.sh --text "make test"
skills/auto-tmux/scripts/render-swarm-prompt.sh commander --session ai-hub --task "smoke" skills/auto-tmux/scripts/render-swarm-prompt.sh commander --session ai-hub --task "smoke"
skills/auto-tmux/scripts/auto-tmux-smoke-test.sh skills/auto-tmux/scripts/auto-tmux-smoke-test.sh
skills/auto-tmux/scripts/validate-auto-tmux.sh skills/auto-tmux/scripts/validate-auto-tmux.sh
@@ -40,6 +42,7 @@ skills/auto-skill/scripts/validate-skill.sh skills/auto-tmux --strict
- 优先使用 `scripts/auto-tmux.sh`,需要低层调试时再直接使用 tmux 原生命令。 - 优先使用 `scripts/auto-tmux.sh`,需要低层调试时再直接使用 tmux 原生命令。
- 发送按键前必须先 `capture-pane` 复核目标上下文;脚本会默认打印最近上下文。 - 发送按键前必须先 `capture-pane` 复核目标上下文;脚本会默认打印最近上下文。
- 发送长文本、粘贴文件或下发 prompt 前先运行 `scripts/safety-check.sh`
- 批量操作前必须先列出 session/window/pane 白名单。 - 批量操作前必须先列出 session/window/pane 白名单。
- 多 worker 并发前用 `swarm-state.sh` 管理任务、锁和状态,避免重复修改同一资源。 - 多 worker 并发前用 `swarm-state.sh` 管理任务、锁和状态,避免重复修改同一资源。
- 不在未知 pane 中发送破坏性命令。 - 不在未知 pane 中发送破坏性命令。
+7 -1
View File
@@ -38,6 +38,7 @@ bash -n skills/auto-tmux/scripts/swarm-state.sh
bash -n skills/auto-tmux/scripts/swarm-brief.sh bash -n skills/auto-tmux/scripts/swarm-brief.sh
bash -n skills/auto-tmux/scripts/swarm-watch.sh bash -n skills/auto-tmux/scripts/swarm-watch.sh
bash -n skills/auto-tmux/scripts/swarm-archive.sh bash -n skills/auto-tmux/scripts/swarm-archive.sh
bash -n skills/auto-tmux/scripts/safety-check.sh
bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh
bash -n skills/auto-tmux/scripts/swarm-dispatch.sh bash -n skills/auto-tmux/scripts/swarm-dispatch.sh
bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh
@@ -76,7 +77,9 @@ tmux capture-pane -t <session>:<window>.<pane> -p -S -120
**向指定 pane 发送命令或确认键** **向指定 pane 发送命令或确认键**
```bash ```bash
skills/auto-tmux/scripts/safety-check.sh --text "make test"
skills/auto-tmux/scripts/auto-tmux.sh send -t <session>:<window>.<pane> --text "make test" --enter skills/auto-tmux/scripts/auto-tmux.sh send -t <session>:<window>.<pane> --text "make test" --enter
skills/auto-tmux/scripts/safety-check.sh --file /tmp/prompt.md --strict
skills/auto-tmux/scripts/auto-tmux.sh paste -t <session>:<window>.<pane> --file /tmp/prompt.md --enter --dry-run skills/auto-tmux/scripts/auto-tmux.sh paste -t <session>:<window>.<pane> --file /tmp/prompt.md --enter --dry-run
skills/auto-tmux/scripts/auto-tmux.sh rescue -t <session>:<window>.<pane> --pattern "(y/n)" --reply y skills/auto-tmux/scripts/auto-tmux.sh rescue -t <session>:<window>.<pane> --pattern "(y/n)" --reply y
``` ```
@@ -189,6 +192,7 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target <session>:<win
- MUST:批量操作前先 `list-windows`/`list-panes` 建立白名单,避免误控用户窗口。 - MUST:批量操作前先 `list-windows`/`list-panes` 建立白名单,避免误控用户窗口。
- SHOULD:救援/确认前先 grep 关键词(如 `(y/n)``password`),只对匹配目标发送。 - SHOULD:救援/确认前先 grep 关键词(如 `(y/n)``password`),只对匹配目标发送。
- SHOULD:发送完整命令行时避免先发 `Escape`;先 `C-c` 中断、`C-u` 清行,再用 `send-keys -l` 逐字发送完整命令。 - SHOULD:发送完整命令行时避免先发 `Escape`;先 `C-c` 中断、`C-u` 清行,再用 `send-keys -l` 逐字发送完整命令。
- SHOULD:长 prompt、文件粘贴、跨 worker 分发前运行 `scripts/safety-check.sh`,批量发送先 `--dry-run`
- SHOULDpane 处在 Codex UI 时,先发送 `/exit` 回到 shell 再执行命令。 - SHOULDpane 处在 Codex UI 时,先发送 `/exit` 回到 shell 再执行命令。
- SHOULD:长任务开启 `pipe-pane` 记录审计;广播完成后立即 `synchronize-panes off` - SHOULD:长任务开启 `pipe-pane` 记录审计;广播完成后立即 `synchronize-panes off`
- SHOULD:多 worker 修改同一文件、目录或服务前,先用 `swarm-state.sh lock-acquire` 声明锁。 - SHOULD:多 worker 修改同一文件、目录或服务前,先用 `swarm-state.sh lock-acquire` 声明锁。
@@ -243,6 +247,7 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target <session>:<win
- `references/getting_started.md`: 术语、oh-my-tmux 最小接入步骤 - `references/getting_started.md`: 术语、oh-my-tmux 最小接入步骤
- `references/api.md`: tmux/oh-my-tmux 常用命令、选项与 gpakosz 特色键位 - `references/api.md`: tmux/oh-my-tmux 常用命令、选项与 gpakosz 特色键位
- `references/automation.md`: `scripts/auto-tmux.sh` 子命令、安全模型与 AI 蜂群协作流程 - `references/automation.md`: `scripts/auto-tmux.sh` 子命令、安全模型与 AI 蜂群协作流程
- `references/safety-policy.md`: 发送、广播、清理、归档和敏感信息处理的安全策略
- `references/swarm-state.md`: 蜂群状态、任务、锁和报告协议 - `references/swarm-state.md`: 蜂群状态、任务、锁和报告协议
- `references/prompt-templates.md`: commander/worker/reviewer 提示词模板和下发方式 - `references/prompt-templates.md`: commander/worker/reviewer 提示词模板和下发方式
- `references/ai-swarm-collaboration.md`: tmux 蜂群协作历史文档、架构模式、协议、案例和风险限制 - `references/ai-swarm-collaboration.md`: tmux 蜂群协作历史文档、架构模式、协议、案例和风险限制
@@ -254,6 +259,7 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target <session>:<win
- `scripts/swarm-brief.sh`: 只读生成 tmux 蜂群交接报告 - `scripts/swarm-brief.sh`: 只读生成 tmux 蜂群交接报告
- `scripts/swarm-watch.sh`: 有限轮次巡检 tmux 蜂群输出和状态报告 - `scripts/swarm-watch.sh`: 有限轮次巡检 tmux 蜂群输出和状态报告
- `scripts/swarm-archive.sh`: 打包 brief、snapshot 和 swarm state 的交接归档 - `scripts/swarm-archive.sh`: 打包 brief、snapshot 和 swarm state 的交接归档
- `scripts/safety-check.sh`: 发送/粘贴/分发前检查危险命令、敏感信息和过大 payload
- `scripts/render-swarm-prompt.sh`: commander/worker/reviewer 提示词渲染脚本 - `scripts/render-swarm-prompt.sh`: commander/worker/reviewer 提示词渲染脚本
- `scripts/swarm-dispatch.sh`: 渲染并可选下发 commander/worker/reviewer 提示词 - `scripts/swarm-dispatch.sh`: 渲染并可选下发 commander/worker/reviewer 提示词
- `scripts/auto-tmux-smoke-test.sh`: tmux 自动化脚本端到端自测 - `scripts/auto-tmux-smoke-test.sh`: tmux 自动化脚本端到端自测
@@ -276,6 +282,6 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target <session>:<win
4. ≥3 个端到端示例,含输入/步骤/验收。 4. ≥3 个端到端示例,含输入/步骤/验收。
5. 长文档放在 `references/` 并可导航;无文档堆砌。 5. 长文档放在 `references/` 并可导航;无文档堆砌。
6. 不确定项给出验证路径;禁止虚构 tmux 行为。 6. 不确定项给出验证路径;禁止虚构 tmux 行为。
7. `bash -n skills/auto-tmux/scripts/auto-tmux.sh``bash -n skills/auto-tmux/scripts/swarm-state.sh``bash -n skills/auto-tmux/scripts/swarm-brief.sh``bash -n skills/auto-tmux/scripts/swarm-watch.sh``bash -n skills/auto-tmux/scripts/swarm-archive.sh``bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh``bash -n skills/auto-tmux/scripts/swarm-dispatch.sh``bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh` 通过。 7. `bash -n skills/auto-tmux/scripts/auto-tmux.sh``bash -n skills/auto-tmux/scripts/swarm-state.sh``bash -n skills/auto-tmux/scripts/swarm-brief.sh``bash -n skills/auto-tmux/scripts/swarm-watch.sh``bash -n skills/auto-tmux/scripts/swarm-archive.sh``bash -n skills/auto-tmux/scripts/safety-check.sh``bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh``bash -n skills/auto-tmux/scripts/swarm-dispatch.sh``bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh` 通过。
8. `skills/auto-tmux/scripts/auto-tmux-smoke-test.sh` 通过或在无 tmux 环境下明确跳过。 8. `skills/auto-tmux/scripts/auto-tmux-smoke-test.sh` 通过或在无 tmux 环境下明确跳过。
9. 运行 `skills/auto-tmux/scripts/validate-auto-tmux.sh``skills/auto-skill/scripts/validate-skill.sh skills/auto-tmux --strict` 通过。 9. 运行 `skills/auto-tmux/scripts/validate-auto-tmux.sh``skills/auto-skill/scripts/validate-skill.sh skills/auto-tmux --strict` 通过。
+1
View File
@@ -8,6 +8,7 @@
| [getting_started.md](./getting_started.md) | 术语、最短路径和工作姿势 | | [getting_started.md](./getting_started.md) | 术语、最短路径和工作姿势 |
| [api.md](./api.md) | tmux / oh-my-tmux 常用命令与配置速查 | | [api.md](./api.md) | tmux / oh-my-tmux 常用命令与配置速查 |
| [automation.md](./automation.md) | `auto-tmux.sh` / `swarm-brief.sh` 脚本子命令、安全模型和 AI 蜂群协作流程 | | [automation.md](./automation.md) | `auto-tmux.sh` / `swarm-brief.sh` 脚本子命令、安全模型和 AI 蜂群协作流程 |
| [safety-policy.md](./safety-policy.md) | 发送、广播、清理、归档和敏感信息处理的安全策略 |
| [swarm-state.md](./swarm-state.md) | 蜂群状态、任务、锁和报告协议 | | [swarm-state.md](./swarm-state.md) | 蜂群状态、任务、锁和报告协议 |
| [prompt-templates.md](./prompt-templates.md) | commander/worker/reviewer 提示词模板和下发方式 | | [prompt-templates.md](./prompt-templates.md) | commander/worker/reviewer 提示词模板和下发方式 |
| [ai-swarm-collaboration.md](./ai-swarm-collaboration.md) | tmux 蜂群协作完整说明、架构模式、协议、案例和风险限制 | | [ai-swarm-collaboration.md](./ai-swarm-collaboration.md) | tmux 蜂群协作完整说明、架构模式、协议、案例和风险限制 |
@@ -26,6 +26,7 @@
| `scan` | 批量巡检 pane 输出 | 可按 session 限定范围 | | `scan` | 批量巡检 pane 输出 | 可按 session 限定范围 |
| `record` | 开启/停止 pane 输出审计日志 | 文件写入到显式目录 | | `record` | 开启/停止 pane 输出审计日志 | 文件写入到显式目录 |
| `snapshot` | 导出拓扑和 pane 输出证据包 | 默认脱敏,写入显式目录 | | `snapshot` | 导出拓扑和 pane 输出证据包 | 默认脱敏,写入显式目录 |
| `safety-check.sh` | 检查待发送文本或文件 | 发现危险命令失败,敏感信息按 strict 策略告警或失败 |
| `hub` | 初始化 AI 多终端工作台 | 已存在 session 不覆盖 | | `hub` | 初始化 AI 多终端工作台 | 已存在 session 不覆盖 |
| `cleanup` | 清理指定 tmux session | 真实 kill 必须显式 `--force` | | `cleanup` | 清理指定 tmux session | 真实 kill 必须显式 `--force` |
| `wait` | 等待 pane 输出出现某个 pattern | 超时失败 | | `wait` | 等待 pane 输出出现某个 pattern | 超时失败 |
@@ -99,6 +100,13 @@ skills/auto-tmux/scripts/swarm-watch.sh --session ai-hub --swarm-dir /tmp/ai_swa
skills/auto-tmux/scripts/swarm-archive.sh --session ai-hub --swarm-dir /tmp/ai_swarm --out /tmp/ai-hub-handoff.tar.gz skills/auto-tmux/scripts/swarm-archive.sh --session ai-hub --swarm-dir /tmp/ai_swarm --out /tmp/ai-hub-handoff.tar.gz
``` ```
发送前对 payload 做安全预检:
```bash
skills/auto-tmux/scripts/safety-check.sh --text "make test"
skills/auto-tmux/scripts/safety-check.sh --file /tmp/prompt.md --strict
```
执行 auto-tmux 专属质量门禁: 执行 auto-tmux 专属质量门禁:
```bash ```bash
@@ -242,6 +250,7 @@ bash -n skills/auto-tmux/scripts/swarm-state.sh
bash -n skills/auto-tmux/scripts/swarm-brief.sh bash -n skills/auto-tmux/scripts/swarm-brief.sh
bash -n skills/auto-tmux/scripts/swarm-watch.sh bash -n skills/auto-tmux/scripts/swarm-watch.sh
bash -n skills/auto-tmux/scripts/swarm-archive.sh bash -n skills/auto-tmux/scripts/swarm-archive.sh
bash -n skills/auto-tmux/scripts/safety-check.sh
bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh bash -n skills/auto-tmux/scripts/render-swarm-prompt.sh
bash -n skills/auto-tmux/scripts/swarm-dispatch.sh bash -n skills/auto-tmux/scripts/swarm-dispatch.sh
bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh bash -n skills/auto-tmux/scripts/validate-auto-tmux.sh
+1
View File
@@ -5,6 +5,7 @@
- `getting_started.md`:术语、最小安装、前缀说明 - `getting_started.md`:术语、最小安装、前缀说明
- `api.md`tmux/oh-my-tmux 常用命令、同步广播、安全写法 - `api.md`tmux/oh-my-tmux 常用命令、同步广播、安全写法
- `automation.md``scripts/auto-tmux.sh` / `scripts/swarm-brief.sh` 子命令、安全模型与 AI 蜂群协作流程 - `automation.md``scripts/auto-tmux.sh` / `scripts/swarm-brief.sh` 子命令、安全模型与 AI 蜂群协作流程
- `safety-policy.md`:发送、广播、清理、归档和敏感信息处理的安全策略
- `swarm-state.md`:蜂群状态、任务、锁和报告协议 - `swarm-state.md`:蜂群状态、任务、锁和报告协议
- `prompt-templates.md`commander/worker/reviewer 提示词模板和下发方式 - `prompt-templates.md`commander/worker/reviewer 提示词模板和下发方式
- `ai-swarm-collaboration.md`:tmux 蜂群协作完整说明、架构模式、协议、案例和风险限制 - `ai-swarm-collaboration.md`:tmux 蜂群协作完整说明、架构模式、协议、案例和风险限制
@@ -23,14 +23,13 @@
| 15 | `bc37fc1` | 长文本粘贴 | `auto-tmux.sh paste --file` | | 15 | `bc37fc1` | 长文本粘贴 | `auto-tmux.sh paste --file` |
| 16 | `075a803` | session 清理 | `auto-tmux.sh cleanup --session` | | 16 | `075a803` | session 清理 | `auto-tmux.sh cleanup --session` |
| 17 | `dc59ee2` | 任务依赖 | `task-depend``task-ready` | | 17 | `dc59ee2` | 任务依赖 | `task-depend``task-ready` |
| 18 | `本轮` | 结果归档 | `swarm-archive.sh` | | 18 | `42bca78` | 结果归档 | `swarm-archive.sh` |
| 19 | `本轮` | 安全策略 | `safety-check.sh``safety-policy.md` |
## 后续候选方向 ## 后续候选方向
| 优先级 | 方向 | 说明 | | 优先级 | 方向 | 说明 |
|:---|:---|:---| |:---|:---|:---|
| P1 | 任务依赖 | 让任务声明 blocked-by / depends-on,减少 worker 乱序执行 |
| P1 | 安全策略 | 将危险命令、敏感输出、生产会话规则集中到可维护策略文档 |
| P2 | worker 分配 | 根据 TODO 队列和空闲 pane 自动生成 dispatch 建议 | | P2 | worker 分配 | 根据 TODO 队列和空闲 pane 自动生成 dispatch 建议 |
| P2 | 状态可视化 | 从 `tasks.tsv` 生成 Markdown 看板 | | P2 | 状态可视化 | 从 `tasks.tsv` 生成 Markdown 看板 |
| P2 | replay 审计 | 从 record 日志生成复盘摘要 | | P2 | replay 审计 | 从 record 日志生成复盘摘要 |
@@ -0,0 +1,91 @@
# auto-tmux Safety Policy
本文件定义 `auto-tmux` 的安全边界:什么时候只能观察,什么时候必须 dry-run,什么时候需要 `--force`,以及哪些信息不能进入共享 pane、归档或交接报告。
## 安全分层
| 层级 | 动作 | 默认策略 |
|:---|:---|:---|
| 只读观察 | `doctor``topology``inspect``capture``scan``snapshot``swarm-brief.sh``swarm-watch.sh``swarm-archive.sh` | 允许执行,输出默认脱敏 |
| 受控写入 | `send``paste``rescue``broadcast``swarm-dispatch.sh --send` | 先观察目标上下文;批量或长文本先 dry-run |
| 破坏性动作 | `cleanup --force`、危险命令文本、强制释放他人锁 | 必须显式 `--force`,并保留上下文证据 |
| 禁止自动化 | 密码输入、生产数据库变更、真实凭证分发、未知 pane 里的破坏性命令 | 交给人工确认,不由脚本静默执行 |
## 发送前检查
发送文本、粘贴文件或分发 prompt 前,先做三件事:
1. `inspect` 目标 pane,确认它是预期 session/window/pane。
2. 对 payload 运行 `scripts/safety-check.sh`
3. 对批量发送、长 prompt 或跨 worker 下发先使用 `--dry-run`
示例:
```bash
target="ai-hub:2.1"
skills/auto-tmux/scripts/auto-tmux.sh inspect -t "$target" -n 40
skills/auto-tmux/scripts/safety-check.sh --file /tmp/prompt.md --strict
skills/auto-tmux/scripts/auto-tmux.sh paste -t "$target" --file /tmp/prompt.md --enter --dry-run
```
## 敏感信息策略
- `capture``inspect``scan``snapshot` 默认遮蔽常见 API key、Bearer token、password、secret。
- 除非排查必须,不使用 `--no-redact`;使用后不得把原始输出写入公开文档或共享交接包。
- `swarm-state.sh` 的任务文本、结果和阻塞原因会做基础清洗,但仍不应写入真实凭证。
- `swarm-archive.sh` 会复制 state、brief 和 snapshot;归档前应确认 state 目录没有真实密钥、cookie、token 或私有用户数据。
## 危险命令策略
以下文本默认视为危险,需要显式 `--force` 或人工处理:
- `rm -rf`
- `mkfs`
- `dd if=`
- `shutdown` / `reboot` / `halt` / `poweroff`
- `tmux kill-server`
- `git reset --hard`
- `git clean -fd`
- `DROP DATABASE` / `DROP TABLE`
如果危险命令确实是任务目标,必须先说明:
1. 目标 pane 是什么。
2. 为什么必须执行。
3. 影响范围是什么。
4. 如何验证和回滚。
## 广播与分发策略
- `broadcast` 必须显式指定 `--session`,不能对全部 tmux server 盲发。
- `swarm-dispatch.sh` 默认只渲染文件;只有带 `--send` 才会下发。
- 指挥者应优先按 worker 单点下发任务,只有环境检查、状态查询等低风险命令才考虑广播。
- 广播前必须 dry-run,并确认目标 pane 列表。
## 清理与锁策略
- `cleanup` 默认只做 dry-run;真实 kill session 必须 `--force`
- 如果 session attached,脚本会警告;仍要继续时必须由操作者承担上下文确认责任。
- `lock-release` 默认只允许 owner 释放自己的锁;释放他人锁必须 `--force`
- `lock-prune` 先 dry-run,再真实清理过期锁。
## 交接与归档策略
- `swarm-brief.sh``swarm-watch.sh``swarm-archive.sh` 必须保持只读。
- 交接包用于恢复现场,不是长期公开材料。
- 交接包发布前至少检查:
- 是否含真实 token、cookie、password。
- 是否含用户隐私、私有路径或生产数据。
- 是否含未脱敏日志。
- 是否含不应公开的任务细节。
## 最小安全清单
```text
[ ] 已确认 target 是预期 pane。
[ ] 已 capture/inspect 最近输出。
[ ] 已对长文本或文件运行 safety-check。
[ ] 批量动作已 dry-run。
[ ] 危险动作有 force 理由、影响范围和回滚路径。
[ ] 交接包已检查敏感信息。
```
+2
View File
@@ -13,6 +13,7 @@ scripts/
├── swarm-brief.sh # 只读生成蜂群交接报告 ├── swarm-brief.sh # 只读生成蜂群交接报告
├── swarm-watch.sh # 有限轮次只读巡检和状态采样 ├── swarm-watch.sh # 有限轮次只读巡检和状态采样
├── swarm-archive.sh # 打包 brief、snapshot 和 swarm state ├── swarm-archive.sh # 打包 brief、snapshot 和 swarm state
├── safety-check.sh # 发送/粘贴/分发前的 payload 安全预检
├── render-swarm-prompt.sh # commander/worker/reviewer 提示词渲染 ├── render-swarm-prompt.sh # commander/worker/reviewer 提示词渲染
├── swarm-dispatch.sh # 渲染并可选下发蜂群提示词 ├── swarm-dispatch.sh # 渲染并可选下发蜂群提示词
├── auto-tmux-smoke-test.sh # 临时 tmux 会话端到端自测 ├── auto-tmux-smoke-test.sh # 临时 tmux 会话端到端自测
@@ -31,6 +32,7 @@ scripts/
- 交接报告脚本只读调用 doctor/topology/scan/report,不直接发送按键。 - 交接报告脚本只读调用 doctor/topology/scan/report,不直接发送按键。
- 巡检脚本必须是有限轮次,不允许默认无限循环。 - 巡检脚本必须是有限轮次,不允许默认无限循环。
- 归档脚本只复制状态和只读证据,不修改 tmux pane 或 swarm state。 - 归档脚本只复制状态和只读证据,不修改 tmux pane 或 swarm state。
- 安全预检脚本只能读取文本或文件,不控制 tmux,不写状态目录。
- 状态脚本只能写入显式状态目录,不保存密钥、Token、密码或私密项目内容。 - 状态脚本只能写入显式状态目录,不保存密钥、Token、密码或私密项目内容。
- 自测脚本必须创建独立临时 tmux session,并在退出时清理。 - 自测脚本必须创建独立临时 tmux session,并在退出时清理。
- 专属校验脚本必须覆盖脚本权限、语法、help 输出、关键索引、strict 校验和 smoke test。 - 专属校验脚本必须覆盖脚本权限、语法、help 输出、关键索引、strict 校验和 smoke test。
+4
View File
@@ -9,6 +9,7 @@
- [`swarm-brief.sh`](./swarm-brief.sh) - 只读生成蜂群交接报告,汇总 doctor、topology、pane 输出和状态报告。 - [`swarm-brief.sh`](./swarm-brief.sh) - 只读生成蜂群交接报告,汇总 doctor、topology、pane 输出和状态报告。
- [`swarm-watch.sh`](./swarm-watch.sh) - 有限轮次巡检蜂群 pane 输出和状态报告,形成连续证据。 - [`swarm-watch.sh`](./swarm-watch.sh) - 有限轮次巡检蜂群 pane 输出和状态报告,形成连续证据。
- [`swarm-archive.sh`](./swarm-archive.sh) - 打包 brief、snapshot 和 swarm state,生成可交接归档。 - [`swarm-archive.sh`](./swarm-archive.sh) - 打包 brief、snapshot 和 swarm state,生成可交接归档。
- [`safety-check.sh`](./safety-check.sh) - 发送、粘贴或分发前检查危险命令、敏感信息和过大 payload。
- [`render-swarm-prompt.sh`](./render-swarm-prompt.sh) - commander、worker、reviewer 提示词渲染。 - [`render-swarm-prompt.sh`](./render-swarm-prompt.sh) - commander、worker、reviewer 提示词渲染。
- [`swarm-dispatch.sh`](./swarm-dispatch.sh) - 渲染提示词并可选发送到指定 pane,默认只写文件。 - [`swarm-dispatch.sh`](./swarm-dispatch.sh) - 渲染提示词并可选发送到指定 pane,默认只写文件。
- [`auto-tmux-smoke-test.sh`](./auto-tmux-smoke-test.sh) - 创建临时 tmux 会话,端到端验证脚本能力。 - [`auto-tmux-smoke-test.sh`](./auto-tmux-smoke-test.sh) - 创建临时 tmux 会话,端到端验证脚本能力。
@@ -34,7 +35,9 @@ skills/auto-tmux/scripts/auto-tmux.sh inspect -t "$target" -n 40
skills/auto-tmux/scripts/auto-tmux.sh capture -t "$target" -n 80 skills/auto-tmux/scripts/auto-tmux.sh capture -t "$target" -n 80
# 发送命令并回车 # 发送命令并回车
skills/auto-tmux/scripts/safety-check.sh --text "make test"
skills/auto-tmux/scripts/auto-tmux.sh send -t "$target" --text "make test" --enter skills/auto-tmux/scripts/auto-tmux.sh send -t "$target" --text "make test" --enter
skills/auto-tmux/scripts/safety-check.sh --file /tmp/prompt.md --strict
skills/auto-tmux/scripts/auto-tmux.sh paste -t "$target" --file /tmp/prompt.md --enter --dry-run skills/auto-tmux/scripts/auto-tmux.sh paste -t "$target" --file /tmp/prompt.md --enter --dry-run
# 扫描某个 session 的错误 # 扫描某个 session 的错误
@@ -89,6 +92,7 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target "$target" --ta
- 默认对捕获输出做密钥脱敏。 - 默认对捕获输出做密钥脱敏。
- `send` 会先打印目标 pane 最近上下文,再发送按键。 - `send` 会先打印目标 pane 最近上下文,再发送按键。
- 危险命令默认拒绝,必须显式 `--force` - 危险命令默认拒绝,必须显式 `--force`
- 长 prompt、文件粘贴和 prompt 下发前先运行 `safety-check.sh`
- 批量操作必须使用明确的 session/window/pane 目标。 - 批量操作必须使用明确的 session/window/pane 目标。
- 批量广播必须先 `--dry-run`,确认目标列表后再真实发送。 - 批量广播必须先 `--dry-run`,确认目标列表后再真实发送。
- 多 worker 协作时用 `swarm-state.sh lock-acquire` 声明文件、目录或服务锁。 - 多 worker 协作时用 `swarm-state.sh lock-acquire` 声明文件、目录或服务锁。
@@ -9,6 +9,7 @@ RENDER_PROMPT="$SCRIPT_DIR/render-swarm-prompt.sh"
SWARM_BRIEF="$SCRIPT_DIR/swarm-brief.sh" SWARM_BRIEF="$SCRIPT_DIR/swarm-brief.sh"
SWARM_WATCH="$SCRIPT_DIR/swarm-watch.sh" SWARM_WATCH="$SCRIPT_DIR/swarm-watch.sh"
SWARM_ARCHIVE="$SCRIPT_DIR/swarm-archive.sh" SWARM_ARCHIVE="$SCRIPT_DIR/swarm-archive.sh"
SAFETY_CHECK="$SCRIPT_DIR/safety-check.sh"
SWARM_DISPATCH="$SCRIPT_DIR/swarm-dispatch.sh" SWARM_DISPATCH="$SCRIPT_DIR/swarm-dispatch.sh"
SESSION="auto-tmux-smoke-$$" SESSION="auto-tmux-smoke-$$"
SWARM_DIR="/tmp/auto-tmux-smoke-swarm-$$" SWARM_DIR="/tmp/auto-tmux-smoke-swarm-$$"
@@ -38,6 +39,7 @@ bash -n "$RENDER_PROMPT"
bash -n "$SWARM_BRIEF" bash -n "$SWARM_BRIEF"
bash -n "$SWARM_WATCH" bash -n "$SWARM_WATCH"
bash -n "$SWARM_ARCHIVE" bash -n "$SWARM_ARCHIVE"
bash -n "$SAFETY_CHECK"
bash -n "$SWARM_DISPATCH" bash -n "$SWARM_DISPATCH"
"$AUTO_TMUX" hub --session "$SESSION" --workers 1 --cmd bash "$AUTO_TMUX" hub --session "$SESSION" --workers 1 --cmd bash
@@ -52,6 +54,12 @@ worker_target="$(tmux list-panes -t "$SESSION:worker1" -F '#S:#I.#P' | head -n 1
"$AUTO_TMUX" inspect -t "$commander_target" -n 10 >/tmp/auto-tmux-smoke-inspect.txt "$AUTO_TMUX" inspect -t "$commander_target" -n 10 >/tmp/auto-tmux-smoke-inspect.txt
grep -q 'pane inspect' /tmp/auto-tmux-smoke-inspect.txt grep -q 'pane inspect' /tmp/auto-tmux-smoke-inspect.txt
printf '%s\n' 'echo AUTO_TMUX_PASTE_OK' > "$PASTE_FILE" printf '%s\n' 'echo AUTO_TMUX_PASTE_OK' > "$PASTE_FILE"
"$SAFETY_CHECK" --text "make test" >/tmp/auto-tmux-smoke-safety-clean.txt
if "$SAFETY_CHECK" --text "rm -rf /tmp/example" >/tmp/auto-tmux-smoke-safety-danger.txt 2>&1; then
echo "expected safety-check to reject dangerous text" >&2
exit 1
fi
"$SAFETY_CHECK" --file "$PASTE_FILE" --strict >/tmp/auto-tmux-smoke-safety-file.txt
"$AUTO_TMUX" paste -t "$worker_target" --file "$PASTE_FILE" --enter --dry-run >/tmp/auto-tmux-smoke-paste-dry-run.txt "$AUTO_TMUX" paste -t "$worker_target" --file "$PASTE_FILE" --enter --dry-run >/tmp/auto-tmux-smoke-paste-dry-run.txt
"$AUTO_TMUX" broadcast --session "$SESSION" --text "pwd" --enter --dry-run >/tmp/auto-tmux-smoke-broadcast.txt "$AUTO_TMUX" broadcast --session "$SESSION" --text "pwd" --enter --dry-run >/tmp/auto-tmux-smoke-broadcast.txt
"$AUTO_TMUX" send -t "$worker_target" --text "echo AUTO_TMUX_SMOKE_OK" --enter "$AUTO_TMUX" send -t "$worker_target" --text "echo AUTO_TMUX_SMOKE_OK" --enter
+1 -1
View File
@@ -153,7 +153,7 @@ cmd_doctor() {
status_line "WARN" "tmux server has no reachable session yet" status_line "WARN" "tmux server has no reachable session yet"
fi fi
for script in auto-tmux.sh swarm-state.sh swarm-brief.sh swarm-watch.sh swarm-archive.sh render-swarm-prompt.sh swarm-dispatch.sh auto-tmux-smoke-test.sh validate-auto-tmux.sh; do for script in auto-tmux.sh swarm-state.sh swarm-brief.sh swarm-watch.sh swarm-archive.sh safety-check.sh render-swarm-prompt.sh swarm-dispatch.sh auto-tmux-smoke-test.sh validate-auto-tmux.sh; do
if [[ -x "$script_dir/$script" ]]; then if [[ -x "$script_dir/$script" ]]; then
status_line "OK" "script executable: $script" status_line "OK" "script executable: $script"
else else
+105
View File
@@ -0,0 +1,105 @@
#!/usr/bin/env bash
# safety-check: inspect text/file payloads before tmux send, paste or dispatch.
set -euo pipefail
usage() {
cat <<'EOF'
safety-check: inspect an auto-tmux payload before sending it to a pane
Usage:
safety-check.sh --text TEXT [--strict]
safety-check.sh --file FILE [--strict]
safety-check.sh --stdin [--strict]
Checks:
- dangerous shell/database/tmux commands that require explicit review
- common secret patterns that should not be pasted into shared panes
- oversized payloads that should use paste/archive instead of send
Exit codes:
0: no issue found
1: warning found
2: blocking issue found
EOF
}
die() {
printf 'error: %s\n' "$*" >&2
exit 2
}
input=""
label=""
strict="0"
while [[ $# -gt 0 ]]; do
case "$1" in
--text)
input="${2:-}"
label="<text>"
shift 2
;;
--file)
[[ -f "${2:-}" ]] || die "file not found: ${2:-}"
input="$(cat "$2")"
label="$2"
shift 2
;;
--stdin)
input="$(cat)"
label="<stdin>"
shift
;;
--strict)
strict="1"
shift
;;
-h|--help)
usage
exit 0
;;
*)
die "unknown option: $1"
;;
esac
done
[[ -n "$label" ]] || die "one input source is required: --text, --file or --stdin"
dangerous_pattern='(^|[[:space:];|&])(rm[[:space:]]+-rf|mkfs|dd[[:space:]]+if=|shutdown|reboot|halt|poweroff|tmux[[:space:]]+kill-server|git[[:space:]]+reset[[:space:]]+--hard|git[[:space:]]+clean[[:space:]]+-fd|DROP[[:space:]]+(DATABASE|TABLE))'
secret_pattern='(OPENAI_API_KEY|ANTHROPIC_API_KEY|GITHUB_TOKEN|GH_TOKEN|API_KEY|TOKEN|PASSWORD|SECRET)=|Bearer[[:space:]]+[A-Za-z0-9._~+/=-]+|sk-[A-Za-z0-9_-]{12,}'
failures=0
warnings=0
if printf '%s\n' "$input" | grep -Eiq "$dangerous_pattern"; then
printf '[FAIL] dangerous command pattern detected in %s\n' "$label" >&2
failures=$((failures + 1))
fi
if printf '%s\n' "$input" | grep -Eiq "$secret_pattern"; then
if [[ "$strict" == "1" ]]; then
printf '[FAIL] possible secret detected in %s\n' "$label" >&2
failures=$((failures + 1))
else
printf '[WARN] possible secret detected in %s\n' "$label" >&2
warnings=$((warnings + 1))
fi
fi
byte_count="$(printf '%s' "$input" | wc -c | tr -d ' ')"
line_count="$(printf '%s\n' "$input" | wc -l | tr -d ' ')"
if (( byte_count > 8192 )); then
printf '[WARN] payload is large: %s bytes; prefer paste-buffer or archive handoff\n' "$byte_count" >&2
warnings=$((warnings + 1))
fi
printf 'safety-check target=%s bytes=%s lines=%s strict=%s\n' "$label" "$byte_count" "$line_count" "$strict"
if (( failures > 0 )); then
exit 2
fi
if (( warnings > 0 )); then
exit 1
fi
printf '[OK] no safety issue found\n'
@@ -82,6 +82,7 @@ scripts=(
"$script_dir/swarm-brief.sh" "$script_dir/swarm-brief.sh"
"$script_dir/swarm-watch.sh" "$script_dir/swarm-watch.sh"
"$script_dir/swarm-archive.sh" "$script_dir/swarm-archive.sh"
"$script_dir/safety-check.sh"
"$script_dir/render-swarm-prompt.sh" "$script_dir/render-swarm-prompt.sh"
"$script_dir/swarm-dispatch.sh" "$script_dir/swarm-dispatch.sh"
"$script_dir/auto-tmux-smoke-test.sh" "$script_dir/auto-tmux-smoke-test.sh"
@@ -97,6 +98,13 @@ run_gate "swarm-state help" "$script_dir/swarm-state.sh" help
run_gate "swarm-brief help" "$script_dir/swarm-brief.sh" --help run_gate "swarm-brief help" "$script_dir/swarm-brief.sh" --help
run_gate "swarm-watch help" "$script_dir/swarm-watch.sh" --help run_gate "swarm-watch help" "$script_dir/swarm-watch.sh" --help
run_gate "swarm-archive help" "$script_dir/swarm-archive.sh" --help run_gate "swarm-archive help" "$script_dir/swarm-archive.sh" --help
run_gate "safety-check help" "$script_dir/safety-check.sh" --help
run_gate "safety-check clean text" "$script_dir/safety-check.sh" --text "make test"
if "$script_dir/safety-check.sh" --text "rm -rf /tmp/example" >/tmp/auto-tmux-validate-gate.log 2>&1; then
fail "safety-check should reject dangerous text"
else
pass "safety-check rejects dangerous text"
fi
run_gate "render-swarm-prompt help" "$script_dir/render-swarm-prompt.sh" --help run_gate "render-swarm-prompt help" "$script_dir/render-swarm-prompt.sh" --help
run_gate "swarm-dispatch help" "$script_dir/swarm-dispatch.sh" --help run_gate "swarm-dispatch help" "$script_dir/swarm-dispatch.sh" --help
@@ -104,17 +112,22 @@ require_contains "$skill_dir/SKILL.md" "scripts/validate-auto-tmux.sh"
require_contains "$skill_dir/SKILL.md" "scripts/swarm-brief.sh" require_contains "$skill_dir/SKILL.md" "scripts/swarm-brief.sh"
require_contains "$skill_dir/SKILL.md" "scripts/swarm-watch.sh" require_contains "$skill_dir/SKILL.md" "scripts/swarm-watch.sh"
require_contains "$skill_dir/SKILL.md" "scripts/swarm-archive.sh" require_contains "$skill_dir/SKILL.md" "scripts/swarm-archive.sh"
require_contains "$skill_dir/SKILL.md" "scripts/safety-check.sh"
require_contains "$skill_dir/SKILL.md" "scripts/swarm-dispatch.sh" require_contains "$skill_dir/SKILL.md" "scripts/swarm-dispatch.sh"
require_contains "$skill_dir/references/index.md" "automation.md" require_contains "$skill_dir/references/index.md" "automation.md"
require_contains "$skill_dir/references/index.md" "safety-policy.md"
require_contains "$skill_dir/references/README.md" "swarm-state.md" require_contains "$skill_dir/references/README.md" "swarm-state.md"
require_contains "$skill_dir/references/README.md" "safety-policy.md"
require_contains "$script_dir/README.md" "validate-auto-tmux.sh" require_contains "$script_dir/README.md" "validate-auto-tmux.sh"
require_contains "$script_dir/README.md" "swarm-dispatch.sh" require_contains "$script_dir/README.md" "swarm-dispatch.sh"
require_contains "$script_dir/README.md" "swarm-watch.sh" require_contains "$script_dir/README.md" "swarm-watch.sh"
require_contains "$script_dir/README.md" "swarm-archive.sh" require_contains "$script_dir/README.md" "swarm-archive.sh"
require_contains "$script_dir/README.md" "safety-check.sh"
require_contains "$script_dir/AGENTS.md" "validate-auto-tmux.sh" require_contains "$script_dir/AGENTS.md" "validate-auto-tmux.sh"
require_contains "$script_dir/AGENTS.md" "swarm-dispatch.sh" require_contains "$script_dir/AGENTS.md" "swarm-dispatch.sh"
require_contains "$script_dir/AGENTS.md" "swarm-watch.sh" require_contains "$script_dir/AGENTS.md" "swarm-watch.sh"
require_contains "$script_dir/AGENTS.md" "swarm-archive.sh" require_contains "$script_dir/AGENTS.md" "swarm-archive.sh"
require_contains "$script_dir/AGENTS.md" "safety-check.sh"
if [[ -x "$repo_root/skills/auto-skill/scripts/validate-skill.sh" ]]; then if [[ -x "$repo_root/skills/auto-skill/scripts/validate-skill.sh" ]]; then
run_gate "auto-skill strict validation" "$repo_root/skills/auto-skill/scripts/validate-skill.sh" "$skill_dir" --strict run_gate "auto-skill strict validation" "$repo_root/skills/auto-skill/scripts/validate-skill.sh" "$skill_dir" --strict