design-gate-hook.sh 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. # 安全声明:本hook**不会被skill自动安装**——SKILL.md/README没有任何写入settings.json的
  15. # 指令,只有你手动把它配进settings.json后才生效。行为上限:对匹配的长片渲染命令exit 2
  16. # 阻止执行并打印原因,无网络请求、无文件写入、无删除。见仓库根SECURITY.md。
  17. #
  18. # settings.json配置:PreToolUse / matcher "Bash" / command指向本脚本
  19. INPUT=$(cat)
  20. CMD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null)
  21. CWD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('cwd',''))" 2>/dev/null)
  22. # 谈论命令的命令(echo/grep等)直接放行,防纯文本误伤(QA Bug1)
  23. FIRST=$(echo "$CMD" | sed -E 's/^[[:space:]]*//' | cut -d' ' -f1)
  24. case "$FIRST" in echo|printf|grep|cat|ls|head|tail|wc|sed|awk) exit 0;; esac
  25. # 只管渲染命令(含npm run render与解说长片渲染)
  26. echo "$CMD" | grep -qE "hyperframes(@[0-9.]+)? +render|render-video(-seek)?\.js|render-narration\.sh|npm +run +render\b" || exit 0
  27. # 显式跳过(可审计的逃生门)
  28. echo "$CMD" | grep -q "SKIP_DESIGN_GATE=1" && exit 0
  29. # 定位项目目录:命令中cd的目标 > hook cwd
  30. DIR="$CWD"
  31. CDDIR=$(echo "$CMD" | grep -oE 'cd +"[^"]+"|cd +[^ &;]+' | head -1 | sed -E 's/^cd +//; s/"//g')
  32. [ -n "$CDDIR" ] && [ -d "$CDDIR" ] && DIR="$CDDIR"
  33. # 取合成时长:hyperframes项目读index.html的data-duration;render-video-seek读--duration参数
  34. DUR=""
  35. D_ARG=$(echo "$CMD" | grep -oE '\-\-duration=[0-9]+' | head -1 | cut -d= -f2)
  36. [ -n "$D_ARG" ] && DUR="$D_ARG"
  37. if [ -z "$DUR" ] && [ -f "$DIR/index.html" ]; then
  38. DUR=$(grep -oE 'data-duration="[0-9.]+"' "$DIR/index.html" | head -1 | grep -oE '[0-9.]+' | cut -d. -f1)
  39. fi
  40. # 判不出时长或短片 → 放行
  41. [ -z "$DUR" ] && exit 0
  42. [ "$DUR" -lt 45 ] 2>/dev/null && exit 0
  43. # 长片:查gate文件(项目目录及上两级)
  44. for d in "$DIR" "$DIR/.." "$DIR/../.."; do
  45. [ -f "$d/direction-approved.md" ] && exit 0
  46. done
  47. cat >&2 << EOF
  48. 🛑 设计流程gate:该合成时长${DUR}s(≥45s长片),但项目内未找到 direction-approved.md。
  49. huashu-design铁律:长片渲染前必须完成「三方向真实视觉给用户选择」(或用户明示豁免),并把选择/豁免记录写入项目目录的 direction-approved.md(含:展示了哪几版、截图路径、用户的选择原话)。
  50. 补齐后重渲;用户当面明说跳过时,在命令前加 SKIP_DESIGN_GATE=1 显式放行。
  51. (依据:2026-07-17 B00实测,跳过方向确认渲210s全片→整片视觉返工)
  52. EOF
  53. exit 2