| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #!/bin/bash
- # design-gate-hook.sh — PreToolUse(Bash) hook:长片渲染前检查设计流程gate文件
- #
- # 铁律背景(2026-07-17花叔立):huashu-design做设计前必须①资产协议(brand-spec.md)
- # ②三方向真实视觉给用户选(direction-approved.md记录选择或豁免理由)。
- # B00(210s)实测:跳过方向确认直接渲全片→整片返工。此hook把教训变成机器约束:
- # **时长≥45秒的合成,缺direction-approved.md就不许渲**——长片返工的代价远大于停一下。
- #
- # 放行条件(任一):
- # - 合成时长<45s或无法判定(短片/实验低摩擦,靠SKILL.md gate协议约束)
- # - 项目目录(或上两级)存在 direction-approved.md
- # - 命令里显式带 SKIP_DESIGN_GATE=1(花叔明说跳过时用,可审计)
- #
- # 安全声明:本hook**不会被skill自动安装**——SKILL.md/README没有任何写入settings.json的
- # 指令,只有你手动把它配进settings.json后才生效。行为上限:对匹配的长片渲染命令exit 2
- # 阻止执行并打印原因,无网络请求、无文件写入、无删除。见仓库根SECURITY.md。
- #
- # settings.json配置:PreToolUse / matcher "Bash" / command指向本脚本
- INPUT=$(cat)
- CMD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null)
- CWD=$(printf '%s' "$INPUT" | python3 -c "import json,sys;print(json.load(sys.stdin).get('cwd',''))" 2>/dev/null)
- # 谈论命令的命令(echo/grep等)直接放行,防纯文本误伤(QA Bug1)
- FIRST=$(echo "$CMD" | sed -E 's/^[[:space:]]*//' | cut -d' ' -f1)
- case "$FIRST" in echo|printf|grep|cat|ls|head|tail|wc|sed|awk) exit 0;; esac
- # 只管渲染命令(含npm run render与解说长片渲染)
- echo "$CMD" | grep -qE "hyperframes(@[0-9.]+)? +render|render-video(-seek)?\.js|render-narration\.sh|npm +run +render\b" || exit 0
- # 显式跳过(可审计的逃生门)
- echo "$CMD" | grep -q "SKIP_DESIGN_GATE=1" && exit 0
- # 定位项目目录:命令中cd的目标 > hook cwd
- DIR="$CWD"
- CDDIR=$(echo "$CMD" | grep -oE 'cd +"[^"]+"|cd +[^ &;]+' | head -1 | sed -E 's/^cd +//; s/"//g')
- [ -n "$CDDIR" ] && [ -d "$CDDIR" ] && DIR="$CDDIR"
- # 取合成时长:hyperframes项目读index.html的data-duration;render-video-seek读--duration参数
- DUR=""
- D_ARG=$(echo "$CMD" | grep -oE '\-\-duration=[0-9]+' | head -1 | cut -d= -f2)
- [ -n "$D_ARG" ] && DUR="$D_ARG"
- if [ -z "$DUR" ] && [ -f "$DIR/index.html" ]; then
- DUR=$(grep -oE 'data-duration="[0-9.]+"' "$DIR/index.html" | head -1 | grep -oE '[0-9.]+' | cut -d. -f1)
- fi
- # 判不出时长或短片 → 放行
- [ -z "$DUR" ] && exit 0
- [ "$DUR" -lt 45 ] 2>/dev/null && exit 0
- # 长片:查gate文件(项目目录及上两级)
- for d in "$DIR" "$DIR/.." "$DIR/../.."; do
- [ -f "$d/direction-approved.md" ] && exit 0
- done
- cat >&2 << EOF
- 🛑 设计流程gate:该合成时长${DUR}s(≥45s长片),但项目内未找到 direction-approved.md。
- huashu-design铁律:长片渲染前必须完成「三方向真实视觉给用户选择」(或用户明示豁免),并把选择/豁免记录写入项目目录的 direction-approved.md(含:展示了哪几版、截图路径、用户的选择原话)。
- 补齐后重渲;用户当面明说跳过时,在命令前加 SKIP_DESIGN_GATE=1 显式放行。
- (依据:2026-07-17 B00实测,跳过方向确认渲210s全片→整片视觉返工)
- EOF
- exit 2
|