diff --git a/skills/auto-tmux/SKILL.md b/skills/auto-tmux/SKILL.md index 784e5cf..8c4ee35 100644 --- a/skills/auto-tmux/SKILL.md +++ b/skills/auto-tmux/SKILL.md @@ -154,6 +154,7 @@ skills/auto-tmux/scripts/swarm-state.sh lock-prune --older-than 3600 --dry-run skills/auto-tmux/scripts/swarm-state.sh task-block --id task-001 --owner :. --reason "等待输入" skills/auto-tmux/scripts/swarm-state.sh task-fail --id task-001 --owner :. --reason "测试失败" skills/auto-tmux/scripts/swarm-state.sh task-list --status FAIL --dir /tmp/ai_swarm +skills/auto-tmux/scripts/swarm-state.sh metrics --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh task-reopen --id task-001 --owner :. --reason "重新执行" skills/auto-tmux/scripts/swarm-state.sh validate --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh report --dir /tmp/ai_swarm diff --git a/skills/auto-tmux/references/automation.md b/skills/auto-tmux/references/automation.md index c3754d9..19f57a6 100644 --- a/skills/auto-tmux/references/automation.md +++ b/skills/auto-tmux/references/automation.md @@ -219,6 +219,7 @@ skills/auto-tmux/scripts/swarm-state.sh lock-prune --older-than 3600 --dry-run ```bash skills/auto-tmux/scripts/swarm-state.sh task-done --id task-001 --owner "ai-hub:2.1" --result "make test passed" +skills/auto-tmux/scripts/swarm-state.sh metrics skills/auto-tmux/scripts/swarm-state.sh validate skills/auto-tmux/scripts/swarm-state.sh report ``` diff --git a/skills/auto-tmux/references/swarm-state.md b/skills/auto-tmux/references/swarm-state.md index a77afe5..91888b6 100644 --- a/skills/auto-tmux/references/swarm-state.md +++ b/skills/auto-tmux/references/swarm-state.md @@ -145,9 +145,12 @@ skills/auto-tmux/scripts/swarm-state.sh task-reopen \ 校验状态一致性: ```bash +skills/auto-tmux/scripts/swarm-state.sh metrics skills/auto-tmux/scripts/swarm-state.sh validate ``` +`metrics` 会按任务状态、owner 和当前锁数量输出摘要,适合 commander 快速判断蜂群是否堵塞。 + `validate` 会检查 `tasks.tsv` 表头、字段数量、重复任务 ID、非法状态、终态任务结果文件,以及锁目录中的 `owner` / `created_at`。 ## 锁管理 diff --git a/skills/auto-tmux/scripts/README.md b/skills/auto-tmux/scripts/README.md index 436de7d..2c7779c 100644 --- a/skills/auto-tmux/scripts/README.md +++ b/skills/auto-tmux/scripts/README.md @@ -57,6 +57,7 @@ skills/auto-tmux/scripts/swarm-state.sh lock-prune --older-than 3600 --dry-run - skills/auto-tmux/scripts/swarm-state.sh task-block --id task-001 --owner "$target" --reason "等待输入" --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh task-fail --id task-001 --owner "$target" --reason "测试失败" --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh task-list --status FAIL --dir /tmp/ai_swarm +skills/auto-tmux/scripts/swarm-state.sh metrics --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh task-reopen --id task-001 --owner "$target" --reason "重新执行" --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh validate --dir /tmp/ai_swarm skills/auto-tmux/scripts/swarm-state.sh report --dir /tmp/ai_swarm diff --git a/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh b/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh index dfae4c4..ba7bc84 100755 --- a/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh +++ b/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh @@ -72,6 +72,8 @@ grep -q 'imported-001' /tmp/auto-tmux-smoke-task-next.txt "$SWARM_STATE" task-fail --dir "$SWARM_DIR" --id smoke-fail --owner "$worker_target" --reason "expected failure" "$SWARM_STATE" task-list --dir "$SWARM_DIR" --status FAIL >/tmp/auto-tmux-smoke-task-list-fail.txt grep -q 'smoke-fail' /tmp/auto-tmux-smoke-task-list-fail.txt +"$SWARM_STATE" metrics --dir "$SWARM_DIR" >/tmp/auto-tmux-smoke-metrics.txt +grep -q 'FAIL' /tmp/auto-tmux-smoke-metrics.txt "$SWARM_STATE" report --dir "$SWARM_DIR" >/tmp/auto-tmux-smoke-report.txt "$SWARM_STATE" validate --dir "$SWARM_DIR" >/tmp/auto-tmux-smoke-state-validate.txt grep -q 'smoke-task' /tmp/auto-tmux-smoke-report.txt diff --git a/skills/auto-tmux/scripts/swarm-state.sh b/skills/auto-tmux/scripts/swarm-state.sh index a6be5f1..edb808a 100755 --- a/skills/auto-tmux/scripts/swarm-state.sh +++ b/skills/auto-tmux/scripts/swarm-state.sh @@ -31,6 +31,7 @@ Usage: swarm-state.sh lock-list [--dir DIR] swarm-state.sh lock-prune --older-than SEC [--dir DIR] [--dry-run] swarm-state.sh report [--dir DIR] + swarm-state.sh metrics [--dir DIR] swarm-state.sh validate [--dir DIR] Environment: @@ -467,6 +468,27 @@ cmd_report() { cmd_status -n 20 } +cmd_metrics() { + while [[ $# -gt 0 ]]; do + case "$1" in + --dir) set_dir "${2:-}"; shift 2 ;; + *) die "unknown metrics option: $1" ;; + esac + done + ensure_init + printf '# swarm metrics\n\n' + printf 'dir: %s\n\n' "$SWARM_DIR" + printf '## by status\n\n' + awk -F '\t' 'NR > 1 {count[$2]++} END {for (status in count) print status "\t" count[status]}' "$TASKS_TSV" | + sort | column -t -s $'\t' 2>/dev/null || true + printf '\n## by owner\n\n' + awk -F '\t' 'NR > 1 {count[$3]++} END {for (owner in count) print owner "\t" count[owner]}' "$TASKS_TSV" | + sort | column -t -s $'\t' 2>/dev/null || true + printf '\n## locks\n\n' + find "$LOCKS_DIR" -mindepth 1 -maxdepth 1 -type d -name '*.lock.d' | wc -l | awk '{print "active_locks\t" $1}' | + column -t -s $'\t' 2>/dev/null || true +} + cmd_validate() { while [[ $# -gt 0 ]]; do case "$1" in @@ -560,6 +582,7 @@ main() { lock-list) cmd_lock_list "$@" ;; lock-prune) cmd_lock_prune "$@" ;; report) cmd_report "$@" ;; + metrics) cmd_metrics "$@" ;; validate) cmd_validate "$@" ;; *) die "unknown command: $cmd" ;; esac