mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-07-28 11:17:46 +00:00
92 lines
2.5 KiB
Bash
92 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# Render a swarm prompt and optionally dispatch it to a tmux pane.
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
swarm-dispatch: render and optionally send commander/worker/reviewer prompts
|
|
|
|
Usage:
|
|
swarm-dispatch.sh --role ROLE --target TARGET [--session NAME] [--swarm-dir DIR] [--task TEXT] [--out FILE] [--send] [--dry-run]
|
|
|
|
Roles:
|
|
commander
|
|
worker
|
|
reviewer
|
|
codex-worker
|
|
|
|
Examples:
|
|
swarm-dispatch.sh --role worker --target ai-hub:2.1 --task "只运行 make test" --out /tmp/worker.md
|
|
swarm-dispatch.sh --role worker --target ai-hub:2.1 --task "只运行 make test" --send --dry-run
|
|
swarm-dispatch.sh --role commander --target ai-hub:1.1 --task "拆分并推进 README 重构" --send
|
|
swarm-dispatch.sh --role codex-worker --target codex-pilot:worker.0 --task "进入持久 worker 待命状态" --send --dry-run
|
|
EOF
|
|
}
|
|
|
|
die() {
|
|
printf 'error: %s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
render="$script_dir/render-swarm-prompt.sh"
|
|
auto_tmux="$script_dir/auto-tmux.sh"
|
|
|
|
role=""
|
|
target=""
|
|
session="ai-hub"
|
|
swarm_dir="${AUTO_TMUX_SWARM_DIR:-/tmp/ai_swarm}"
|
|
task="未指定;请等待主 Codex 分配具体任务。"
|
|
out_file=""
|
|
send="0"
|
|
dry_run="0"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--role) role="${2:-}"; shift 2 ;;
|
|
--target) target="${2:-}"; shift 2 ;;
|
|
--session) session="${2:-}"; shift 2 ;;
|
|
--swarm-dir) swarm_dir="${2:-}"; shift 2 ;;
|
|
--task) task="${2:-}"; shift 2 ;;
|
|
--out) out_file="${2:-}"; shift 2 ;;
|
|
--send) send="1"; shift ;;
|
|
--dry-run) dry_run="1"; shift ;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*) die "unknown option: $1" ;;
|
|
esac
|
|
done
|
|
|
|
[[ -n "$role" ]] || die "missing --role"
|
|
[[ -n "$target" ]] || die "missing --target"
|
|
|
|
case "$role" in
|
|
commander|reviewer) ;;
|
|
worker|codex-worker) ;;
|
|
*) die "unknown role: $role" ;;
|
|
esac
|
|
|
|
prompt_file="$out_file"
|
|
if [[ -z "$prompt_file" ]]; then
|
|
prompt_file="$(mktemp "/tmp/auto-tmux-${role}-prompt.XXXXXX.md")"
|
|
fi
|
|
|
|
render_args=("$role" --session "$session" --swarm-dir "$swarm_dir" --task "$task")
|
|
if [[ "$role" == "worker" || "$role" == "codex-worker" ]]; then
|
|
render_args+=(--target "$target")
|
|
fi
|
|
|
|
bash "$render" "${render_args[@]}" > "$prompt_file"
|
|
printf 'prompt written: %s\n' "$prompt_file"
|
|
|
|
if [[ "$send" != "1" ]]; then
|
|
printf 'send skipped; add --send to dispatch to %s\n' "$target"
|
|
exit 0
|
|
fi
|
|
|
|
send_args=(-t "$target" --text "$(cat "$prompt_file")" --enter)
|
|
if [[ "$dry_run" == "1" ]]; then
|
|
send_args+=(--dry-run)
|
|
fi
|
|
|
|
bash "$auto_tmux" send "${send_args[@]}"
|