Hwip Auto — 時間制限付き自律作業モード
固定の時間予算内で自律的に作業します: 探索→計画→実装→検証→コミットを1ユニットずつ繰り返します。ユーザーはスマートフォンから hwip_ask ボタンで指示を与え、応答がない場合は事前に設定された安全なデフォルトで処理が継続されます。全実行は単一の応答内で行われ、ターンを終了するとモードも終了します。
前提条件 — 満たされていない場合は拒否
- フックIDが設定されている —
~/.hwip/config.jsonのhookId(hwip installが書き込むもの)、またはHWIP_HOOK_IDによる上書き。SessionStart コンテキストにフックIDがある場合、Mode: two-way (notify + ask)と表示されます。Mode: one-wayの場合は指示チャネルがないことを意味するため拒否し、ユーザーに/hwip-configを案内してください。 - ミュートされていない。
/hwip-modeがNOTIFICATIONS: mutedと報告する場合、拒否: 通知なしの自律モードは無人作業であり指示ができません。/hwip-mode unmuteを提案してください。 - 明示的なユーザー呼び出し。 タスクが「長そう」という理由でこのモードを自己トリガーしてはいけません。ユーザーが
/hwip-auto ...でオプトインします。
引数
/hwip-auto [duration] [task description...]
- duration —
2h、90m、1h30m、または分数を示す数値。デフォルト:1h。最小10分~最大8時間にクランプ。 - task — duration 以降のすべて。省略した場合は会話の流れから導出し、会話がない場合はキックオフアスクで2~3の候補タスク(例: 失敗しているテストの修正、lint 警告の解消、TODO の整理)を提案します。
セットアップ
-
期限を記録する(状態ファイルはコンテキスト圧縮後も保持 — 残り時間が不明な場合は再読み込み):
HASH=$(printf '%s' "${CLAUDE_PROJECT_DIR:-$(pwd)}" | cksum | cut -d' ' -f1) STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/hwip" mkdir -p "$STATE_DIR" MINUTES=120 # duration 引数からパース DEADLINE=$(( $(date +%s) + MINUTES * 60 )) printf '%s %s\n' "$DEADLINE" "$MINUTES" > "$STATE_DIR/auto-$HASH" date -r "$DEADLINE" 2>/dev/null || date -d "@$DEADLINE" # macOS | Linux -
保護ブランチガード —
main/master/developでは直接作業しない:BRANCH=$(git branch --show-current 2>/dev/null) case "$BRANCH" in main|master|develop) git checkout -b "auto/$(date +%Y%m%d)-<task-slug>" ;; esac -
検証ツールを事前に発見する — コードを書く前に: プロジェクトの決定論的チェック(package.json、Makefile、CI 設定からのテスト/lint/型チェック/ビルドコマンド)。これらが各コミットのゲートとなります。プロジェクトにチェックがない場合は、キックオフアスクでその旨を伝え、「コードがコンパイル/実行される」ことを最小限のゲートとします。
-
キックオフアスク — 何かに手を付ける前に1回の
hwip_ask:title: "Auto mode: ()"body: 2~3行の計画 + どの検証ツールがコミットをゲートするか + ブランチ名actions:[{id:"start", label:"Start", style:"primary"}, {id:"stop", label:"Cancel"}](タスクがあいまいだった場合は、"Start" を2~3個の候補タスクボタンに置き換える)placeholder: "adjust the plan or scope..."timeout: 180、fallback:"start"(または推奨される候補)
自由文の返信は計画を修正します。
stopはモードをキャンセルします(状態ファイルを削除)。
ループ
タスクをユニットに分割します: 最小の独立して検証可能かつコミット可能なチャンク(約15~45分)。各ユニットに対して:
-
時間チェック(各ユニット開始前):
HASH=$(printf '%s' "${CLAUDE_PROJECT_DIR:-$(pwd)}" | cksum | cut -d' ' -f1) read -r DEADLINE MINUTES < "${XDG_STATE_HOME:-$HOME/.local/state}/hwip/auto-$HASH" echo "remaining: $(( (DEADLINE - $(date +%s)) / 60 ))m of ${MINUTES}m"残り時間がラップアップ基準 — 予算の10%、最低5分 — を下回った場合、新しいユニットを開始せずにラップアップに進みます。
-
探索→計画 ユニット(まず関連コードを読む; 盲目的編集はしない)。
-
実装 ユニット。
-
検証 決定論的チェックを実行。グリーンが唯一のパスシグナル — 「正しく見える」は検証ツールではなく、グリーンにするために失敗するテストを弱めたり削除したりしてはいけません。失敗した場合は修正して再検証、最大3回試行。それでも赤の場合はユニットの変更を元に戻し(
git checkout -- <files>/git stash)、ツリーをクリーンに保ち、スキップとして記録して次に進みます。 -
コミット グリーンのユニットを明確な conventional commit メッセージでコミット。プッシュはしない。
-
ハートビート — コミット後、短い
hwip_notify("✅ — m left")を送信しますが、約15分に1回まで。小さなユニットはまとめて通知。ブロッカーは例外: 発生したら即座にpriority: "high"の通知を送信。
ユニットが完了するか、ラップアップ基準に達するまで繰り返します。
質問プロトコル — 決して停止せず、破壊もしない
実行中の質問は hwip_ask を経由します(AskUserQuestion や平文は不可 — CORE_RULES ルール3/10が適用):
- 推奨デフォルトを最初に配置し、本文にタイムアウト時に自動進行することを記載し、
timeout: 180(真に大きな決定の場合は最大600)とfallbackをそのデフォルトのidに設定。 - フォールバックで決定されたすべての決定を記録 — 最終報告にリストアップし、ユーザーが自分なしで決定された内容を監査できるようにする。
- 返信はすべて直接の指示: 即座に適用。
stopの返信(または自由文によるセッション終了)は今すぐラップアップすることを意味します。 - 不可逆または外向きのアクションはフォールバック対象外: プッシュ、PR/公開、デプロイ、データ削除、スキーマ削除、強制操作、ワーキングツリー外のもの。これらのフォールバックは
skipでなければなりません — タイムアウト時はアクションをスキップして記録し、実行しません。明示的なボタンタップのみが許可されます。
ラップアップ
- 実行中のユニットを完了するか元に戻す(同じ3回試行ルール — ツリーを赤やダーティなままにしない)。
- 状態ファイルを削除:
rm -f "${XDG_STATE_HOME:-$HOME/.local/state}/hwip/auto-$HASH"。 - 応答テキストで最終報告: 完了したユニット(コミットハッシュ付き)、スキップされたユニットとその理由、フォールバック解決されたすべての決定、残っている作業。
- 最終アスク:
actions:[{id:"extend", label:"+30m"}, {id:"review", label:"Review"}, {id:"done", label:"Done", style:"primary"}]timeout: 300、fallback:"done"extend→ 新しい期限(+30m)を状態ファイルに書き込み、ループに再入。review→ diff をウォークスルー。done→ 終了。
問題発生時
- フックIDなし(
Mode: one-way) — two-way ツールが利用不可。自動モードは実行不可。/hwip-configを実行してセットアップ。 - 実行中に状態ファイルが消失(例: 状態ディレクトリがクリアされた): 期限を今として扱い、残り予算を推測せずにラップアップ。
- ユーザーが実行中にターミナルに入力: そのメッセージは
hwip_askの返信と同じく指示入力。適用してループを継続。 - 検証ツールが不安定(同じコマンドが変更なしでグリーン/赤を交互に出す): 再実行で試行回数を浪費せず、
hwip_notify(priority: "high")でブロッカーとして報告し、次のユニットに進む。