#!/usr/bin/env bash
# validate-task-schema.sh
#
# TaskCreated hook — fires when a task is being created in Agent Teams runtime.
# 目的：强制 lead 在 Task description 里写齐 6 段契约（hand-off 契约 + 上游产物传播），
#       缺任一段 → exit 2 阻断 TaskCreate 并把缺失项反馈给 lead 让其重试。
# 行为：
#   - description 缺失/解析失败 → exit 0 放过（不破坏现有流程，避免 false positive）
#   - description 存在但缺段 → exit 2 + stderr 列出缺失段
#   - description 6 段齐 → exit 0
#
# 注册位置：.claude/settings.json → hooks.TaskCreated
# 参考：https://code.claude.com/docs/en/agent-teams#enforce-quality-gates-with-hooks
# Schema 定义：.claude/agents/product-lead.md "Step 2：分配任务给执行层"

set -uo pipefail

INPUT=$(cat || true)

# 防御式提取 task description（jq 优先，多路径尝试；不同 hook payload shape 可能字段位置不同）
extract_first_nonempty() {
  if ! command -v jq >/dev/null 2>&1; then
    return 1
  fi
  local val=""
  for path in "$@"; do
    val=$(printf '%s' "$INPUT" | jq -r "$path // empty" 2>/dev/null || echo "")
    if [[ -n "$val" && "$val" != "null" ]]; then
      printf '%s' "$val"
      return 0
    fi
  done
  return 1
}

DESC=$(extract_first_nonempty \
  '.tool_input.description' \
  '.task.description' \
  '.description' \
  '.tool_input.task.description' \
  || true)

# 无法提取 description → 不阻断（保护现有流程；payload shape 变更或非 TaskCreate 事件不应误杀）
if [[ -z "${DESC:-}" ]]; then
  exit 0
fi

# 必备 6 段（顺序无关，缺任一项即 fail）—— 与 product-lead.md Step 2 schema 严格对齐
REQUIRED=(
  "任务描述"
  "任务类型"
  "上下文"
  "上游产物"
  "验收标准"
  "预期产物"
)

MISSING=()
for KW in "${REQUIRED[@]}"; do
  if ! printf '%s' "$DESC" | grep -qF "$KW"; then
    MISSING+=("$KW")
  fi
done

if [[ ${#MISSING[@]} -gt 0 ]]; then
  echo "❌ [validate-task-schema] TaskCreate 被阻断 — Task description 缺少以下必备段落：" >&2
  for KW in "${MISSING[@]}"; do
    echo "   • $KW" >&2
  done
  echo "" >&2
  echo "请按 .claude/agents/product-lead.md 'Step 2：分配任务给执行层' 的 6 段 schema 补全后重试。" >&2
  echo "Schema：任务描述 / 任务类型 / 上下文 / 上游产物 / 验收标准 / 预期产物" >&2
  exit 2
fi

exit 0
