design-gate-hook.sh 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/bin/bash
  2. # design-gate-hook.sh — PreToolUse(Bash) hook:长片渲染前检查设计流程gate文件
  3. #
  4. # 铁律背景(2026-07-17花叔立):huashu-design做设计前必须①资产协议(brand-spec.md)
  5. # ②三方向真实视觉给用户选(direction-approved.md记录选择或豁免理由)。
  6. # B00(210s)实测:跳过方向确认直接渲全片→整片返工。此hook把教训变成机器约束:
  7. # **时长≥45秒的合成,缺direction-approved.md就不许渲**——长片返工的代价远大于停一下。
  8. #
  9. # 放行条件(任一):
  10. # - 合成时长<45s或无法判定(短片/实验低摩擦,靠SKILL.md gate协议约束)
  11. # - 项目目录(或上两级)存在 direction-approved.md
  12. # - 命令里显式带 SKIP_DESIGN_GATE=1(花叔明说跳过时用,可审计)
  13. #
  14. # settings.json配置:PreToolUse / matcher "Bash" / command指向本脚本
  15. INPUT=$(cat)
  16. CMD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null)
  17. CWD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('cwd',''))" 2>/dev/null)
  18. # 谈论命令的命令(echo/grep等)直接放行,防纯文本误伤(QA Bug1)
  19. FIRST=$(echo "$CMD" | sed -E 's/^[[:space:]]*//' | cut -d' ' -f1)
  20. case "$FIRST" in echo|printf|grep|cat|ls|head|tail|wc|sed|awk) exit 0;; esac
  21. # 只管渲染命令(含npm run render与解说长片渲染)
  22. echo "$CMD" | grep -qE "hyperframes(@[0-9.]+)? +render|render-video(-seek)?\.js|render-narration\.sh|npm +run +render\b" || exit 0
  23. # 显式跳过(可审计的逃生门)
  24. echo "$CMD" | grep -q "SKIP_DESIGN_GATE=1" && exit 0
  25. # 定位项目目录:命令中cd的目标 > hook cwd
  26. DIR="$CWD"
  27. CDDIR=$(echo "$CMD" | grep -oE 'cd +"[^"]+"|cd +[^ &;]+' | head -1 | sed -E 's/^cd +//; s/"//g')
  28. [ -n "$CDDIR" ] && [ -d "$CDDIR" ] && DIR="$CDDIR"
  29. # 取合成时长:hyperframes项目读index.html的data-duration;render-video-seek读--duration参数
  30. DUR=""
  31. D_ARG=$(echo "$CMD" | grep -oE '\-\-duration=[0-9]+' | head -1 | cut -d= -f2)
  32. [ -n "$D_ARG" ] && DUR="$D_ARG"
  33. if [ -z "$DUR" ] && [ -f "$DIR/index.html" ]; then
  34. DUR=$(grep -oE 'data-duration="[0-9.]+"' "$DIR/index.html" | head -1 | grep -oE '[0-9.]+' | cut -d. -f1)
  35. fi
  36. # 判不出时长或短片 → 放行
  37. [ -z "$DUR" ] && exit 0
  38. [ "$DUR" -lt 45 ] 2>/dev/null && exit 0
  39. # 长片:查gate文件(项目目录及上两级)
  40. for d in "$DIR" "$DIR/.." "$DIR/../.."; do
  41. [ -f "$d/direction-approved.md" ] && exit 0
  42. done
  43. cat >&2 << EOF
  44. 🛑 设计流程gate:该合成时长${DUR}s(≥45s长片),但项目内未找到 direction-approved.md。
  45. huashu-design铁律:长片渲染前必须完成「三方向真实视觉给用户选择」(或用户明示豁免),并把选择/豁免记录写入项目目录的 direction-approved.md(含:展示了哪几版、截图路径、用户的选择原话)。
  46. 补齐后重渲;用户当面明说跳过时,在命令前加 SKIP_DESIGN_GATE=1 显式放行。
  47. (依据:2026-07-17 B00实测,跳过方向确认渲210s全片→整片视觉返工)
  48. EOF
  49. exit 2