Human review gate shell
Skill bokuwalily/claude-code-skills/skills/human-review-gate-shell
バッチ生成したファイル(記事・コード・レポートなど)をシェルで対話的に1件ずつレビューし、approve/skip/reject/editで振り分けるゲートスクリプトを作るとき。From its SKILL.md
npx -y skills add bokuwalily/claude-code-skills --skill human-review-gate-shellAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.7 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Procedure
1. ディレクトリ構成
project/
├── drafts/ # 未レビューのファイル置き場
├── approved/ # 承認済み(次処理へ)
├── rejected/ # 却下済み
└── review-gate.sh
2. スクリプト全体
#!/bin/bash
# 対話型レビューゲート
# a=承認 s=保留 d=却下 e=編集 q=終了
set -uo pipefail
DIR="$(cd "$(dirname "$0")" && pwd)"
mkdir -p "$DIR/approved" "$DIR/rejected"
shopt -s nullglob
drafts=("$DIR"/drafts/*.md) # 対象の拡張子を変えて流用可
if [ ${#drafts[@]} -eq 0 ]; then
echo "drafts/ は空。先に生成スクリプトを実行してください。"
exit 0
fi
echo "未チェック: ${#drafts[@]} 件"
echo "操作: [a]承認 [s]保留 [d]却下 [e]編集 [q]終了"
echo "────────────────────────────────────────────"
for f in "${drafts[@]}"; do
while true; do
clear 2>/dev/null || true
echo "📄 $(basename "$f")"
# メタ行(HTMLコメントなど)を先頭1行だけ表示
head -1 "$f" | sed 's/<!-- *//; s/ *-->//'
echo "────────────────────────────────────────────"
# 本文プレビュー(メタ行除く先頭60行)
tail -n +2 "$f" | sed '/./,$!d' | head -60
echo "────────────────────────────────────────────"
printf "[a]承認 [s]保留 [d]却下 [e]編集 [q]終了 > "
read -r ans </dev/tty
case "$ans" in
a|A) mv "$f" "$DIR/approved/"; echo "✅ 承認"; sleep 0.4; break ;;
d|D) mv "$f" "$DIR/rejected/"; echo "🗑 却下"; sleep 0.4; break ;;
s|S) echo "⏭ 保留"; sleep 0.3; break ;;
e|E) "${EDITOR:-vi}" "$f" </dev/tty >/dev/tty 2>&1 ;;
q|Q) echo "終了"; exit 0 ;;
*) echo "a/s/d/e/q のどれかを入力"; sleep 0.6 ;;
esac
done
done
echo "────────────────────────────────────────────"
echo "承認済み: $(ls "$DIR"/approved/*.md 2>/dev/null | wc -l | tr -d ' ') 件"
3. 呼び出し方
# 通常実行(drafts/ のファイルを順に表示)
bash review-gate.sh
# 承認済みを後処理(例: 投稿キューへコピー)
for f in approved/*.md; do
# 投稿処理...
rm "$f" # 処理済みは削除してキューを空にする
done
4. 拡張パターン
メタ情報をファイル先頭に埋め込む(生成スクリプト側)
{
printf '<!-- TYPE: %s | SCORE: %s | gen: %s -->\n\n' "$TYPE" "$AVG" "$(date +%F_%T)"
printf '%s\n' "$BODY"
} > "drafts/${TS}.md"
こうすると review-gate.sh の head -1 | sed でメタを1行表示できる。
バッチ承認(全件承認)
mv drafts/*.md approved/
承認件数のしきい値チェック
count=$(ls approved/*.md 2>/dev/null | wc -l | tr -d ' ')
if [ "$count" -ge 5 ]; then
echo "承認済みが $count 件溜まっています。投稿処理を実行してください。"
fi
Pitfalls
read -r ans </dev/tty: パイプ経由で実行すると stdin がパイプになりreadが失敗する。必ず/dev/ttyから読むshopt -s nullglob: glob が空にマッチしたとき配列が空になる。これがないとdrafts/*.mdが文字列として残り誤動作するclear 2>/dev/null || true: TTY でない環境(CI)では clear が失敗することがある。|| trueで握りつぶす- 編集後の再判断:
e|Eでエディタを開いたあとループをbreakしないことで、編集後に再度 a/s/d を聞ける設計になっている - approved/ の肥大化: 処理済みファイルをそのまま残すと次回 glob に引っかかる場合がある。後処理で削除またはアーカイブする
Verification
# テスト用ダミーファイルを作成
mkdir -p drafts
echo "<!-- TYPE: テスト | SCORE: 8.0 | gen: 2026-06-20 -->
# テスト記事
本文サンプル。
" > drafts/2026-06-20_test.md
# ゲートを起動して a を入力 → approved/ に移動することを確認
bash review-gate.sh
ls approved/ # ファイルが存在すること
ls drafts/ # 空であること
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.