mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-08-20 06:18:05 +00:00
feat: skills - add auto-tmux report manifest
This commit is contained in:
@@ -289,7 +289,7 @@ skills/auto-tmux/scripts/swarm-dispatch.sh --role worker --target <session>:<win
|
|||||||
- `scripts/swarm-export.sh`: 导出任务、依赖和锁的 JSONL 状态包
|
- `scripts/swarm-export.sh`: 导出任务、依赖和锁的 JSONL 状态包
|
||||||
- `scripts/swarm-timeline.sh`: 渲染 `status.log` 的 Markdown 时间线
|
- `scripts/swarm-timeline.sh`: 渲染 `status.log` 的 Markdown 时间线
|
||||||
- `scripts/swarm-blockers.sh`: 聚合 BLOCKED/FAIL 任务、锁和最近异常状态
|
- `scripts/swarm-blockers.sh`: 聚合 BLOCKED/FAIL 任务、锁和最近异常状态
|
||||||
- `scripts/swarm-report-pack.sh`: 聚合 board、依赖图、时间线、阻塞清单、分配建议、附件和 JSONL 导出
|
- `scripts/swarm-report-pack.sh`: 聚合 board、依赖图、时间线、阻塞清单、分配建议、附件和 `manifest.json`
|
||||||
- `scripts/swarm-assign.sh`: 根据 ready tasks 和 worker pane 生成只读分配建议
|
- `scripts/swarm-assign.sh`: 根据 ready tasks 和 worker pane 生成只读分配建议
|
||||||
- `scripts/swarm-health.sh`: 汇总 tmux 与 swarm state 的只读健康检查报告包
|
- `scripts/swarm-health.sh`: 汇总 tmux 与 swarm state 的只读健康检查报告包
|
||||||
- `scripts/remote-readonly.sh`: 通过 SSH 只读采集远端 tmux 拓扑、pane 输出和 `metadata.jsonl`
|
- `scripts/remote-readonly.sh`: 通过 SSH 只读采集远端 tmux 拓扑、pane 输出和 `metadata.jsonl`
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
| `swarm-export.sh` | 导出 JSONL 状态包 | 只读读取 state,写显式输出目录 |
|
| `swarm-export.sh` | 导出 JSONL 状态包 | 只读读取 state,写显式输出目录 |
|
||||||
| `swarm-timeline.sh` | 渲染状态日志时间线 | 只读生成 Markdown |
|
| `swarm-timeline.sh` | 渲染状态日志时间线 | 只读生成 Markdown |
|
||||||
| `swarm-blockers.sh` | 聚合阻塞、失败、锁和异常状态 | 只读生成 Markdown |
|
| `swarm-blockers.sh` | 聚合阻塞、失败、锁和异常状态 | 只读生成 Markdown |
|
||||||
| `swarm-report-pack.sh` | 聚合多个只读报告、附件与 JSONL 导出 | 只写显式输出目录 |
|
| `swarm-report-pack.sh` | 聚合多个只读报告、附件与 JSONL 导出 | 生成 `index.md` 和 `manifest.json` |
|
||||||
| `swarm-assign.sh` | 生成 ready task 到 worker pane 的分配建议 | 只读,不 claim,不发送 |
|
| `swarm-assign.sh` | 生成 ready task 到 worker pane 的分配建议 | 只读,不 claim,不发送 |
|
||||||
| `swarm-health.sh` | 汇总 tmux 与 swarm state 健康报告 | 只读,不自动修复 |
|
| `swarm-health.sh` | 汇总 tmux 与 swarm state 健康报告 | 只读,不自动修复 |
|
||||||
| `remote-readonly.sh` | SSH 只读采集远端 tmux 证据 | 不发送按键,输出默认脱敏,生成 `metadata.jsonl` |
|
| `remote-readonly.sh` | SSH 只读采集远端 tmux 证据 | 不发送按键,输出默认脱敏,生成 `metadata.jsonl` |
|
||||||
|
|||||||
@@ -39,13 +39,14 @@
|
|||||||
| 31 | `565352b` | 远程只读采集 | `remote-readonly.sh` |
|
| 31 | `565352b` | 远程只读采集 | `remote-readonly.sh` |
|
||||||
| 32 | `4a35cbc` | session 安全策略 | `session-safety.md` |
|
| 32 | `4a35cbc` | session 安全策略 | `session-safety.md` |
|
||||||
| 33 | `ff8cd86` | 远程证据包增强 | `remote-readonly.sh` 输出 `metadata.jsonl`,validator 覆盖 fake SSH |
|
| 33 | `ff8cd86` | 远程证据包增强 | `remote-readonly.sh` 输出 `metadata.jsonl`,validator 覆盖 fake SSH |
|
||||||
| 34 | `本轮` | 报告附件索引 | `swarm-report-pack.sh --attach` |
|
| 34 | `5677df3` | 报告附件索引 | `swarm-report-pack.sh --attach` |
|
||||||
|
| 35 | `本轮` | 报告包 manifest | `swarm-report-pack.sh` 输出根级 `manifest.json` |
|
||||||
|
|
||||||
## 后续候选方向
|
## 后续候选方向
|
||||||
|
|
||||||
| 优先级 | 方向 | 说明 |
|
| 优先级 | 方向 | 说明 |
|
||||||
|:---|:---|:---|
|
|:---|:---|:---|
|
||||||
| P3 | 报告包 manifest 增强 | 为 `swarm-report-pack.sh` 输出机器可读 `manifest.json` |
|
| P3 | 报告包压缩 | 为 `swarm-report-pack.sh` 增加可选 tar.gz 打包 |
|
||||||
|
|
||||||
## 每轮验收清单
|
## 每轮验收清单
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
- [`swarm-timeline.sh`](./swarm-timeline.sh) - 将 `status.log` 渲染为 Markdown 时间线。
|
- [`swarm-timeline.sh`](./swarm-timeline.sh) - 将 `status.log` 渲染为 Markdown 时间线。
|
||||||
- [`swarm-blockers.sh`](./swarm-blockers.sh) - 聚合 BLOCKED/FAIL 任务、锁和最近异常状态。
|
- [`swarm-blockers.sh`](./swarm-blockers.sh) - 聚合 BLOCKED/FAIL 任务、锁和最近异常状态。
|
||||||
- [`swarm-report-pack.sh`](./swarm-report-pack.sh) - 聚合 board、依赖图、时间线、阻塞清单、分配建议和 JSONL 导出。
|
- [`swarm-report-pack.sh`](./swarm-report-pack.sh) - 聚合 board、依赖图、时间线、阻塞清单、分配建议和 JSONL 导出。
|
||||||
|
- 报告包根目录会生成 `index.md` 和 `manifest.json`,附件目录通过 `--attach` 显式加入。
|
||||||
- [`swarm-assign.sh`](./swarm-assign.sh) - 根据 ready tasks 和 worker pane 生成只读分配建议。
|
- [`swarm-assign.sh`](./swarm-assign.sh) - 根据 ready tasks 和 worker pane 生成只读分配建议。
|
||||||
- [`swarm-health.sh`](./swarm-health.sh) - 汇总 doctor、topology、scan、validate、metrics、board 和 assign。
|
- [`swarm-health.sh`](./swarm-health.sh) - 汇总 doctor、topology、scan、validate、metrics、board 和 assign。
|
||||||
- [`remote-readonly.sh`](./remote-readonly.sh) - 通过 SSH 只读采集远端 tmux 拓扑、pane 输出和 `metadata.jsonl`。
|
- [`remote-readonly.sh`](./remote-readonly.sh) - 通过 SSH 只读采集远端 tmux 拓扑、pane 输出和 `metadata.jsonl`。
|
||||||
|
|||||||
@@ -23,11 +23,22 @@ die() {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json_escape() {
|
||||||
|
local value="$1"
|
||||||
|
value="${value//\\/\\\\}"
|
||||||
|
value="${value//\"/\\\"}"
|
||||||
|
value="${value//$'\n'/\\n}"
|
||||||
|
value="${value//$'\r'/\\r}"
|
||||||
|
value="${value//$'\t'/\\t}"
|
||||||
|
printf '%s' "$value"
|
||||||
|
}
|
||||||
|
|
||||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
swarm_dir="${AUTO_TMUX_SWARM_DIR:-/tmp/ai_swarm}"
|
swarm_dir="${AUTO_TMUX_SWARM_DIR:-/tmp/ai_swarm}"
|
||||||
session=""
|
session=""
|
||||||
out_dir="/tmp/auto-tmux-report-pack-$(date +%Y%m%d-%H%M%S)"
|
out_dir="/tmp/auto-tmux-report-pack-$(date +%Y%m%d-%H%M%S)"
|
||||||
attachments=()
|
attachments=()
|
||||||
|
created_at="$(date -Is)"
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@@ -83,6 +94,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
attachment_lines=""
|
attachment_lines=""
|
||||||
|
attachment_json=""
|
||||||
|
attachment_count=0
|
||||||
if ((${#attachments[@]} > 0)); then
|
if ((${#attachments[@]} > 0)); then
|
||||||
mkdir -p "$out_dir/attachments"
|
mkdir -p "$out_dir/attachments"
|
||||||
cat > "$out_dir/attachments.md" <<EOF
|
cat > "$out_dir/attachments.md" <<EOF
|
||||||
@@ -103,13 +116,39 @@ EOF
|
|||||||
rel_path="attachments/$(basename "$dest")"
|
rel_path="attachments/$(basename "$dest")"
|
||||||
printf -- '- [%s](./%s)\n' "$attachment" "$rel_path" >> "$out_dir/attachments.md"
|
printf -- '- [%s](./%s)\n' "$attachment" "$rel_path" >> "$out_dir/attachments.md"
|
||||||
attachment_lines+="- [$rel_path](./$rel_path)"$'\n'
|
attachment_lines+="- [$rel_path](./$rel_path)"$'\n'
|
||||||
|
if ((attachment_count > 0)); then
|
||||||
|
attachment_json+=","$'\n'
|
||||||
|
fi
|
||||||
|
attachment_json+=" {\"source\":\"$(json_escape "$attachment")\",\"path\":\"$(json_escape "$rel_path")\"}"
|
||||||
|
attachment_count=$((attachment_count + 1))
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cat > "$out_dir/manifest.json" <<EOF
|
||||||
|
{
|
||||||
|
"type": "auto-tmux-swarm-report-pack",
|
||||||
|
"created_at": "$(json_escape "$created_at")",
|
||||||
|
"swarm_dir": "$(json_escape "$swarm_dir")",
|
||||||
|
"session": "$(json_escape "${session:-<not provided>}")",
|
||||||
|
"files": [
|
||||||
|
"index.md",
|
||||||
|
"board.md",
|
||||||
|
"deps.md",
|
||||||
|
"timeline.md",
|
||||||
|
"blockers.md",
|
||||||
|
"assign.md",
|
||||||
|
"export/manifest.json"
|
||||||
|
],
|
||||||
|
"attachments": [
|
||||||
|
$attachment_json
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
cat > "$out_dir/index.md" <<EOF
|
cat > "$out_dir/index.md" <<EOF
|
||||||
# auto-tmux Swarm Report Pack
|
# auto-tmux Swarm Report Pack
|
||||||
|
|
||||||
- created_at: \`$(date -Is)\`
|
- created_at: \`$created_at\`
|
||||||
- swarm_dir: \`$swarm_dir\`
|
- swarm_dir: \`$swarm_dir\`
|
||||||
- session: \`${session:-<not provided>}\`
|
- session: \`${session:-<not provided>}\`
|
||||||
|
|
||||||
@@ -120,6 +159,7 @@ cat > "$out_dir/index.md" <<EOF
|
|||||||
- [timeline.md](./timeline.md)
|
- [timeline.md](./timeline.md)
|
||||||
- [blockers.md](./blockers.md)
|
- [blockers.md](./blockers.md)
|
||||||
- [assign.md](./assign.md)
|
- [assign.md](./assign.md)
|
||||||
|
- [manifest.json](./manifest.json)
|
||||||
- [export/manifest.json](./export/manifest.json)
|
- [export/manifest.json](./export/manifest.json)
|
||||||
$(if [[ -n "$attachment_lines" ]]; then printf '%s' "- [attachments.md](./attachments.md)"; fi)
|
$(if [[ -n "$attachment_lines" ]]; then printf '%s' "- [attachments.md](./attachments.md)"; fi)
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -145,6 +145,9 @@ run_gate "swarm-report-pack attachment" bash -c '
|
|||||||
printf "remote evidence\n" > "$tmp/remote/remote-tmux.txt"
|
printf "remote evidence\n" > "$tmp/remote/remote-tmux.txt"
|
||||||
"$1" --dir "$tmp/swarm" --out "$tmp/out" --attach "$tmp/remote" >/dev/null
|
"$1" --dir "$tmp/swarm" --out "$tmp/out" --attach "$tmp/remote" >/dev/null
|
||||||
grep -Fq "attachments.md" "$tmp/out/index.md"
|
grep -Fq "attachments.md" "$tmp/out/index.md"
|
||||||
|
grep -Fq "manifest.json" "$tmp/out/index.md"
|
||||||
|
grep -Fq "\"type\": \"auto-tmux-swarm-report-pack\"" "$tmp/out/manifest.json"
|
||||||
|
grep -Fq "\"attachments\"" "$tmp/out/manifest.json"
|
||||||
grep -Fq "remote-tmux.txt" "$tmp/out/attachments/remote/remote-tmux.txt"
|
grep -Fq "remote-tmux.txt" "$tmp/out/attachments/remote/remote-tmux.txt"
|
||||||
rm -rf "$tmp"
|
rm -rf "$tmp"
|
||||||
' _ "$script_dir/swarm-report-pack.sh"
|
' _ "$script_dir/swarm-report-pack.sh"
|
||||||
|
|||||||
Reference in New Issue
Block a user