#!/usr/bin/env bash set -euo pipefail usage() { cat <<'USAGE' Usage: bin/agent-prompts.sh --task TASK_ID [options] Options: --task TASK_ID Required. Task identifier (e.g. AUTH-LOGIN-REVIEW-001) --role ROLE planner|executor|executor-rerun|reviewer-guards|reviewer-acceptance|finalizer|all Default: all --goal TEXT Planner goal text --scope-in TEXT Planner scope-in text --scope-out TEXT Planner scope-out text --guards CSV Planner required guards (e.g. GR-CORE-005,GR-SEC-001) --gates CSV Planner required gates (e.g. QG-001,QG-002,QG-003,QG-006) --run-dir PATH Override run directory (default: agent-system/runs/) --short Emit 3-line one-pager prompt variants -h, --help Show help Examples: bin/agent-prompts.sh --task AUTH-LOGIN-REVIEW-001 bin/agent-prompts.sh --task REVIEW-USER-THEME-001 --role planner --goal "Auth/Login review" bin/agent-prompts.sh --task TASK-42 --short USAGE } task_id="" role="all" goal="" scope_in="" scope_out="" guards="" gates="" short_mode=0 while [[ $# -gt 0 ]]; do case "$1" in --task) [[ $# -ge 2 ]] || { echo "[ERROR] --task requires a value" >&2; exit 2; } task_id="$2" shift 2 ;; --role) [[ $# -ge 2 ]] || { echo "[ERROR] --role requires a value" >&2; exit 2; } role="$2" shift 2 ;; --goal) [[ $# -ge 2 ]] || { echo "[ERROR] --goal requires a value" >&2; exit 2; } goal="$2" shift 2 ;; --scope-in) [[ $# -ge 2 ]] || { echo "[ERROR] --scope-in requires a value" >&2; exit 2; } scope_in="$2" shift 2 ;; --scope-out) [[ $# -ge 2 ]] || { echo "[ERROR] --scope-out requires a value" >&2; exit 2; } scope_out="$2" shift 2 ;; --guards) [[ $# -ge 2 ]] || { echo "[ERROR] --guards requires a value" >&2; exit 2; } guards="$2" shift 2 ;; --gates) [[ $# -ge 2 ]] || { echo "[ERROR] --gates requires a value" >&2; exit 2; } gates="$2" shift 2 ;; --run-dir) [[ $# -ge 2 ]] || { echo "[ERROR] --run-dir requires a value" >&2; exit 2; } run_dir="$2" shift 2 ;; --short) short_mode=1 shift ;; -h|--help) usage exit 0 ;; *) echo "[ERROR] Unknown option: $1" >&2 usage exit 2 ;; esac done if [[ -z "$task_id" ]]; then echo "[ERROR] --task is required" >&2 usage exit 2 fi if [[ "${run_dir:-}" == "" ]]; then run_dir="agent-system/runs/${task_id}" fi is_valid_role() { case "$1" in planner|executor|executor-rerun|reviewer-guards|reviewer-acceptance|finalizer|all) return 0 ;; *) return 1 ;; esac } if ! is_valid_role "$role"; then echo "[ERROR] Invalid --role: $role" >&2 usage exit 2 fi print_divider() { echo echo "============================================================" echo "$1" echo "============================================================" } print_short_prompts() { cat < ${run_dir}/plan.json. Executor (3 Zeilen) Du bist Executor im agent-system; liefere nur valid JSON nach executor.schema.json. Input: ${run_dir}/plan.json; implementiere nur im Scope, keine Drift. Führe relevante Gates aus (pass nur Exit 0), sonst blocked+open_items -> ${run_dir}/execution-report.json. Executor Re-Run (3 Zeilen) Du bist Executor Re-Run; liefere nur valid JSON nach executor.schema.json. Input: plan.json + execution-report.json + review-guards.json; behebe alle Findings. Gates neu ausführen, Report synchronisieren -> ${run_dir}/execution-report.json. Reviewer-Guards (3 Zeilen) Du bist Reviewer-Guards; liefere nur valid JSON nach reviewer-guards.schema.json. Prüfe execution-report gegen alle required_guard_ids + required_quality_gate_ids aus plan.json. Findings nur mit rule_ref, severity, file -> ${run_dir}/review-guards.json. Reviewer-Acceptance (3 Zeilen) Du bist Reviewer-Acceptance; liefere nur valid JSON nach reviewer-acceptance.schema.json. Prüfe jedes SC-* aus plan.json gegen execution-report mit klarer Evidence. Bei fail missing_or_wrong füllen -> ${run_dir}/review-acceptance.json. Finalizer (3 Zeilen) Du bist Finalizer; liefere nur valid JSON nach finalizer.schema.json. Input: execution-report.json + review-guards.json + review-acceptance.json. Nur commit/merge bei guard=pass, acceptance=pass, ci=pass; sonst hold+hold_reason -> ${run_dir}/finalize.json. EOF } print_planner() { cat <