From 7f334448c516da744ad0b5fcfab38eb0940dfee4 Mon Sep 17 00:00:00 2001 From: tukuaiai Date: Tue, 19 May 2026 03:20:52 +0800 Subject: [PATCH] feat: skills - query and reopen auto-tmux tasks --- skills/auto-tmux/SKILL.md | 2 + skills/auto-tmux/references/automation.md | 2 + skills/auto-tmux/references/swarm-state.md | 13 ++++++ skills/auto-tmux/scripts/README.md | 2 + .../auto-tmux/scripts/auto-tmux-smoke-test.sh | 5 +++ skills/auto-tmux/scripts/swarm-state.sh | 40 ++++++++++++++++++- 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/skills/auto-tmux/SKILL.md b/skills/auto-tmux/SKILL.md index 9a9d2cd..784e5cf 100644 --- a/skills/auto-tmux/SKILL.md +++ b/skills/auto-tmux/SKILL.md @@ -153,6 +153,8 @@ skills/auto-tmux/scripts/swarm-state.sh lock-acquire --name README.md --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 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 a95e659..c3754d9 100644 --- a/skills/auto-tmux/references/automation.md +++ b/skills/auto-tmux/references/automation.md @@ -199,6 +199,8 @@ skills/auto-tmux/scripts/swarm-state.sh task-next --owner "ai-hub:2.1" ```bash skills/auto-tmux/scripts/swarm-state.sh task-block --id task-001 --owner "ai-hub:2.1" --reason "等待用户确认" skills/auto-tmux/scripts/swarm-state.sh task-fail --id task-001 --owner "ai-hub:2.1" --reason "make test failed" +skills/auto-tmux/scripts/swarm-state.sh task-list --status FAIL +skills/auto-tmux/scripts/swarm-state.sh task-reopen --id task-001 --owner "ai-hub:2.1" --reason "修复后重试" ``` 获取文件锁: diff --git a/skills/auto-tmux/references/swarm-state.md b/skills/auto-tmux/references/swarm-state.md index 7d2b566..a77afe5 100644 --- a/skills/auto-tmux/references/swarm-state.md +++ b/skills/auto-tmux/references/swarm-state.md @@ -127,8 +127,21 @@ skills/auto-tmux/scripts/swarm-state.sh task-fail \ ```bash skills/auto-tmux/scripts/swarm-state.sh task-list +skills/auto-tmux/scripts/swarm-state.sh task-list --status FAIL +skills/auto-tmux/scripts/swarm-state.sh task-list --owner "ai-hub:2.1" ``` +重开失败或阻塞任务: + +```bash +skills/auto-tmux/scripts/swarm-state.sh task-reopen \ + --id task-001 \ + --owner "ai-hub:2.1" \ + --reason "修复依赖后重新执行" +``` + +`task-reopen` 会把任务状态改回 `TODO`,同时在状态日志中记录 `REOPEN`。 + 校验状态一致性: ```bash diff --git a/skills/auto-tmux/scripts/README.md b/skills/auto-tmux/scripts/README.md index d361976..436de7d 100644 --- a/skills/auto-tmux/scripts/README.md +++ b/skills/auto-tmux/scripts/README.md @@ -56,6 +56,8 @@ skills/auto-tmux/scripts/swarm-state.sh task-next --owner "$target" --dir /tmp/a skills/auto-tmux/scripts/swarm-state.sh lock-prune --older-than 3600 --dry-run --dir /tmp/ai_swarm 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 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 ae0b4d1..dfae4c4 100755 --- a/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh +++ b/skills/auto-tmux/scripts/auto-tmux-smoke-test.sh @@ -70,12 +70,17 @@ grep -q 'imported-001' /tmp/auto-tmux-smoke-task-next.txt "$SWARM_STATE" task-block --dir "$SWARM_DIR" --id imported-001 --owner "$worker_target" --reason "waiting for input" "$SWARM_STATE" task-add --dir "$SWARM_DIR" --id smoke-fail --text "fail task" >/tmp/auto-tmux-smoke-task-fail-add.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" 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 grep -q 'imported-001' /tmp/auto-tmux-smoke-report.txt grep -q 'BLOCKED' /tmp/auto-tmux-smoke-report.txt grep -q 'FAIL' /tmp/auto-tmux-smoke-report.txt +"$SWARM_STATE" task-reopen --dir "$SWARM_DIR" --id smoke-fail --owner "$worker_target" --reason "retry after failure" +"$SWARM_STATE" task-list --dir "$SWARM_DIR" --status TODO >/tmp/auto-tmux-smoke-task-list-todo.txt +grep -q 'smoke-fail' /tmp/auto-tmux-smoke-task-list-todo.txt "$SWARM_BRIEF" --session "$SESSION" --swarm-dir "$SWARM_DIR" --out "$BRIEF_DIR" -n 10 >/tmp/auto-tmux-smoke-brief.txt grep -q 'auto-tmux Swarm Brief' "$BRIEF_DIR/brief.md" "$SWARM_WATCH" --session "$SESSION" --swarm-dir "$SWARM_DIR" --out "$WATCH_DIR" --iterations 1 --interval 0 -n 10 >/tmp/auto-tmux-smoke-watch.txt diff --git a/skills/auto-tmux/scripts/swarm-state.sh b/skills/auto-tmux/scripts/swarm-state.sh index eb12a76..a6be5f1 100755 --- a/skills/auto-tmux/scripts/swarm-state.sh +++ b/skills/auto-tmux/scripts/swarm-state.sh @@ -19,12 +19,13 @@ Usage: swarm-state.sh status [--dir DIR] swarm-state.sh task-add --text TEXT [--id ID] [--dir DIR] swarm-state.sh task-import --file FILE [--prefix PREFIX] [--dir DIR] - swarm-state.sh task-list [--dir DIR] + swarm-state.sh task-list [--status STATUS] [--owner TARGET] [--dir DIR] swarm-state.sh task-next --owner TARGET [--dir DIR] swarm-state.sh task-claim --id ID --owner TARGET [--dir DIR] swarm-state.sh task-done --id ID --owner TARGET [--result TEXT] [--dir DIR] swarm-state.sh task-block --id ID --owner TARGET --reason TEXT [--dir DIR] swarm-state.sh task-fail --id ID --owner TARGET --reason TEXT [--dir DIR] + swarm-state.sh task-reopen --id ID --owner TARGET --reason TEXT [--dir DIR] swarm-state.sh lock-acquire --name NAME --owner TARGET [--dir DIR] swarm-state.sh lock-release --name NAME --owner TARGET [--dir DIR] [--force] swarm-state.sh lock-list [--dir DIR] @@ -181,14 +182,27 @@ cmd_task_import() { } cmd_task_list() { + local status_filter="" owner_filter="" while [[ $# -gt 0 ]]; do case "$1" in --dir) set_dir "${2:-}"; shift 2 ;; + --status) status_filter="${2:-}"; shift 2 ;; + --owner) owner_filter="${2:-}"; shift 2 ;; *) die "unknown task-list option: $1" ;; esac done ensure_init - column -t -s $'\t' "$TASKS_TSV" 2>/dev/null || cat "$TASKS_TSV" + awk -F '\t' -v OFS='\t' -v status="$status_filter" -v owner="$owner_filter" ' + NR == 1 {print; next} + status != "" && $2 != status {next} + owner != "" && $3 != owner {next} + {print} + ' "$TASKS_TSV" | column -t -s $'\t' 2>/dev/null || awk -F '\t' -v OFS='\t' -v status="$status_filter" -v owner="$owner_filter" ' + NR == 1 {print; next} + status != "" && $2 != status {next} + owner != "" && $3 != owner {next} + {print} + ' "$TASKS_TSV" } update_task() { @@ -305,6 +319,27 @@ cmd_task_terminal() { cmd_log --target "$owner" --status "$status" --message "$id $reason" } +cmd_task_reopen() { + local id="" owner="" reason="" + while [[ $# -gt 0 ]]; do + case "$1" in + --dir) set_dir "${2:-}"; shift 2 ;; + --id) id="${2:-}"; shift 2 ;; + --owner) owner="${2:-}"; shift 2 ;; + --reason) reason="${2:-}"; shift 2 ;; + *) die "unknown task-reopen option: $1" ;; + esac + done + [[ -n "$id" ]] || die "missing --id" + [[ -n "$owner" ]] || die "missing --owner" + [[ -n "$reason" ]] || die "missing --reason" + ensure_init + reason="$(printf '%s' "$reason" | sanitize)" + update_task "$id" "TODO" "-" "reopened: $reason" + cmd_log --target "$owner" --status "REOPEN" --message "$id $reason" + printf 'task reopened: %s\n' "$id" +} + lock_path() { local name="$1" name="$(printf '%s' "$name" | sed -E 's#[^A-Za-z0-9_.-]+#_#g')" @@ -519,6 +554,7 @@ main() { task-done) cmd_task_done "$@" ;; task-block) cmd_task_terminal "BLOCKED" "$@" ;; task-fail) cmd_task_terminal "FAIL" "$@" ;; + task-reopen) cmd_task_reopen "$@" ;; lock-acquire) cmd_lock_acquire "$@" ;; lock-release) cmd_lock_release "$@" ;; lock-list) cmd_lock_list "$@" ;;