mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-08-23 07:48:06 +00:00
feat: skills - add auto-tmux safety preflight
This commit is contained in:
@@ -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`。
|
||||||
|
|||||||
@@ -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 中发送破坏性命令。
|
||||||
|
|||||||
@@ -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`。
|
||||||
- SHOULD:pane 处在 Codex UI 时,先发送 `/exit` 回到 shell 再执行命令。
|
- SHOULD:pane 处在 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` 通过。
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 理由、影响范围和回滚路径。
|
||||||
|
[ ] 交接包已检查敏感信息。
|
||||||
|
```
|
||||||
@@ -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。
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Executable
+105
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user