#!/bin/bash # 依頼箱の見張り係を、偽の claude で確かめる(Linux の作業環境で動かす) # 使い方: bash test_inbox_runner.sh set -u SRC="$(cd "$1" && pwd)" T="$(mktemp -d)" mkdir -p "$T/run" "$T/box/新規" "$T/work" "$T/other" cp "$SRC/inbox_runner.py" "$SRC/settings.json" "$T/run/" export FAKE_LOG="$T/fake.log" # 偽の claude:渡された環境変数を記録し、依頼文の言葉で振る舞いを変える cat > "$T/fakeclaude" <<'EOF' #!/bin/bash if [ "$1" = "--version" ]; then echo "2.1.311 (fake)"; exit 0; fi echo "key=${ANTHROPIC_API_KEY:-なし} mcp=${ENABLE_CLAUDEAI_MCP_SERVERS:-なし}" > "$FAKE_LOG" [ -n "${ANTHROPIC_API_KEY:-}" ] && echo "⚠ claude.ai connectors are disabled because ANTHROPIC_API_KEY or another auth source is set" >&2 if grep -q "少し待つ" <<<"$2"; then sleep 5; fi if grep -q "置いていく" <<<"$2"; then nohup sleep 200 >/dev/null 2>&1 & fi if grep -q "眠る" <<<"$2"; then trap 'echo "{\"result\":\"中断\",\"is_error\":true}"; exit 130' INT sleep 300 & wait fi echo '{"type":"result","is_error":false,"result":"やったこと:確認\n決めてほしいこと:なし","session_id":"abc-123","permission_denials":[{"tool_name":"Bash","tool_input":{"command":"git clean -fd"}}]}' EOF chmod +x "$T/fakeclaude" python3 - "$SRC/config.json" "$T" <<'EOF' import json, sys c = json.load(open(sys.argv[1], encoding="utf-8")) t = sys.argv[2] c.update(inbox=f"{t}/box", allowed_dirs=[f"{t}/work"], claude=f"{t}/fakeclaude", settle_seconds=0, default_limit_minutes=1) json.dump(c, open(f"{t}/run/config.json", "w", encoding="utf-8"), ensure_ascii=False) EOF req() { printf -- '---\n作業フォルダ: %s\n%s---\n%s\n' "$2" "$3" "$4" > "$T/box/新規/$1.md"; } echo "== 確かめ1:設定の確かめ(APIキーが設定された窓)" ANTHROPIC_API_KEY=dummy-not-a-key python3 "$T/run/inbox_runner.py" --check echo; echo "== 確かめ2:正常/自動で回さない場所/頭の項目なし/子のプロセスを残す/時間切れ" req 01_ok "$T/work" "" "疎通確認です" req 02_ng "$T/other" "" "だめな場所" printf 'ヘッダなし\n' > "$T/box/新規/03_nohead.md" req 04_leave "$T/work" "" "置いていく依頼" req 05_sleep "$T/work" "上限時間: 1 " "眠る依頼" mkdir -p "$T/box/実行中"; echo "x" > "$T/box/実行中/00_stuck.md" START=$(date +%s) ANTHROPIC_API_KEY=dummy-not-a-key timeout 200 python3 "$T/run/inbox_runner.py" --once echo "かかった秒数: $(( $(date +%s) - START ))" echo "偽の claude が受け取った環境: $(cat "$FAKE_LOG")" echo; echo "== フォルダの中身" (cd "$T/box" && find . -type f | sort) for f in "$T"/box/結果/*.md; do echo; echo "---- $(basename "$f")"; sed -n '1,3p;/## Claude Code の報告/,$p' "$f"; done echo; echo "== 確かめ3:APIキーを外さない設定にしたとき、報告に★が付くか" python3 - "$T/run/config.json" <<'EOF' import json, sys c = json.load(open(sys.argv[1], encoding="utf-8")); c["drop_env"] = [] json.dump(c, open(sys.argv[1], "w", encoding="utf-8"), ensure_ascii=False) EOF req 06_key "$T/work" "" "キーの確かめ" ANTHROPIC_API_KEY=dummy-not-a-key python3 "$T/run/inbox_runner.py" --once echo "偽の claude が受け取った環境: $(cat "$FAKE_LOG")" grep "★" "$T"/box/結果/06_key_*.md echo; echo "== 確かめ4:2つ目の見張り係は起動しない" req 07_wait "$T/work" "" "少し待つ依頼" python3 "$T/run/inbox_runner.py" --once & P=$! sleep 1; python3 "$T/run/inbox_runner.py" --once; echo "2つ目の終了コード: $?"; wait $P pkill -f "sleep 200" 2>/dev/null; pkill -f "sleep 300" 2>/dev/null rm -rf "$T"