mcpField
G
groove-admin-claude-hooks

groove-admin-claude-hooks

github.com/andreadellacorteエージェントワークフロー6530 回インストール14 週間前に更新
リポジトリ

groove-admin-claude-hooks について

groove の Claude Code ネイティブシェルフックをインストール、一覧表示、無効化するスキルです。既存設定を保ってライフサイクルスクリプトを登録し、通知、Git の活動記録、パス保護、コンテキスト読み込み、バージョン確認、セッション記録の6種類を選べます。

主な機能

  1. 01選択したライフサイクルフックをインストール
  2. 02登録済みフックとスクリプトを一覧表示
  3. 03指定したフックを無効化
  4. 04他の項目を保持して設定をマージ
  5. 05ワークフローイベント用の6種類のフック

活用シーン

  1. 01Claude Code セッション中のリマインダー追加
  2. 02後で確認するための Git 活動記録
  3. 03groove 管理対象パスへの編集を防止

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/andreadellacorte/groove --skill groove-admin-claude-hooks

インストール後、Claude Code で/groove-admin-claude-hooksを入力して読み込まれたか確認します。

詳細

groove-admin-claude-hooks

groove の Claude Code ネイティブシェルフックをインストールします。これらはモデルの外部で動作し、決定論的かつ無条件に実行されるもので、groove のアドバイザリー Markdown フック(.groove/hooks/start.md、end.md)を補完します。

特定のフックを削除するには --disable <hook> を使用します。現在の状態を表示するには --list を使用します。

実行結果

選択したフックは .claude/settings.json に登録され、シェルスクリプトは .groove/hooks/claude/ に書き込まれます。フックは、モデルの関与なしに Claude Code のライフサイクルイベントで自動的に実行されます。

利用可能なフック

名前イベントマッチャー動作
daily-end-reminderStop—現地時間が16~21時で .groove/index.md が存在する場合、/groove-daily-end の実行を促すリマインダーを表示します
git-activity-bufferPostToolUseBashBash コマンドに git commit が含まれている場合、タイムスタンプ付きの行を .groove/.cache/git-activity-buffer.txt に追記します
block-managed-pathsPreToolUseWrite、Editfile_path が .agents/skills/groove または skills/groove で始まる場合、説明メッセージを表示してゼロ以外の終了コードで終了し、書き込みをブロックします
context-reprimeSessionStartstartup|compactプライムスクリプトを直接実行し、セッション開始とコンパクションのたびにワークフローのコンテキスト全体が読み込まれるようにします
version-checkPostToolUse—1時間に1回、groove の新バージョンを確認し、groove-utilities-check を呼び出します
session-captureStop—このセッションで Git のアクティビティ(午前0時以降のコミット、作業ツリーの変更、またはバッファー内のコミット)がある場合、次のセッションで確認するためのキャプチャ下書きを .groove/.cache/pending-capture.md にステージします。通知は表示されません。

手順

--list

.claude/settings.json が存在する場合は読み込みます。登録されている groove フックと、.groove/hooks/claude/ に存在するスクリプトを報告します。終了します。

--disable <hook>

指定したフックのエントリーを .claude/settings.json から削除します(スクリプトはそのまま残します)。削除済み、または見つからなかったことを報告します。終了します。

デフォルト(インストール)
  1. 有効にするフックを尋ねます(デフォルト:6つすべて)。

    Which hooks to install? (all / comma-separated: daily-end-reminder, git-activity-buffer, block-managed-paths, context-reprime, version-check, session-capture)
    Press enter for all.
    
  2. .claude/settings.json が存在する場合は読み込み、JSON として解析します(デフォルト {})。既存の groove 以外のエントリーは絶対に破棄しません。

  3. .groove/hooks/claude/ ディレクトリがなければ作成します。各スクリプトを実行可能にします(chmod +x)。

  4. 選択したフックごとに、シェルスクリプトを書き込み、フックのエントリーを .claude/settings.json にマージします。

  5. マージ結果を .claude/settings.json に書き込みます。

  6. 概要を報告します。

    ✓ daily-end-reminder  — Stop hook → .groove/hooks/claude/daily-end-reminder.sh
    ✓ git-activity-buffer — PostToolUse/Bash hook → .groove/hooks/claude/git-activity-buffer.sh
    ✓ block-managed-paths — PreToolUse/Write+Edit hook → .groove/hooks/claude/block-managed-paths.sh
    ✓ context-reprime     — SessionStart hook → groove-utilities-prime.sh
    ✓ version-check       — PostToolUse hook → .groove/hooks/claude/version-check.sh
    ✓ session-capture     — Stop hook → .groove/hooks/claude/session-capture.sh
    ✓ .claude/settings.json updated
    

シェルスクリプトのテンプレート

以下を .groove/hooks/claude/ にそのまま書き込みます。既存のスクリプトを、差分を表示して確認を得ずに上書きしてはいけません。

daily-end-reminder.sh
#!/usr/bin/env bash
# groove: Stop hook — remind about /groove-daily-end during work hours
hour=$(date +%H)
if [ -f "$CLAUDE_PROJECT_DIR/.groove/index.md" ] && [ "$hour" -ge 16 ] && [ "$hour" -le 21 ]; then
  echo "groove: end of work hours — consider running /groove-daily-end"
fi
git-activity-buffer.sh
#!/usr/bin/env bash
# groove: PostToolUse/Bash hook — buffer git commits for memory log
input=$(cat)
command=$(echo "$input" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('command',''))" 2>/dev/null)
if echo "$command" | grep -q "git commit"; then
  msg=$(echo "$command" | grep -oP '(?<=-m ")[^"]+' | head -1)
  mkdir -p "$CLAUDE_PROJECT_DIR/.groove/.cache"
  echo "$(date '+%Y-%m-%d %H:%M') | ${msg:-<no message>}" >> "$CLAUDE_PROJECT_DIR/.groove/.cache/git-activity-buffer.txt"
fi
block-managed-paths.sh
#!/usr/bin/env bash
# groove: PreToolUse/Write+Edit hook — block edits to managed groove paths
input=$(cat)
path=$(echo "$input" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('file_path',''))" 2>/dev/null)
if echo "$path" | grep -qE '^(\.agents/skills/groove|skills/groove)'; then
  echo "groove: blocked — '$path' is managed by groove update. Edit under skills/ and rsync to .agents/skills/." >&2
  exit 1
fi
version-check.sh
#!/usr/bin/env bash
# groove: PostToolUse hook — check for new groove version (once per hour)
CACHE="$CLAUDE_PROJECT_DIR/.groove/.cache/last-version-check-ts"
mkdir -p "$CLAUDE_PROJECT_DIR/.groove/.cache"
now=$(date +%s)
if [ -f "$CACHE" ]; then
  last=$(cat "$CACHE")
  diff=$((now - last))
  [ "$diff" -lt 3600 ] && exit 0
fi
echo "$now" > "$CACHE"
bash "$CLAUDE_PROJECT_DIR/.agents/skills/groove-utilities-check/scripts/check.sh" 2>/dev/null || true
session-capture.sh
#!/usr/bin/env bash
# groove: Stop hook — stage a session capture draft from git activity for next-session review
ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
[ -f "$ROOT/.groove/index.md" ] || exit 0
command -v git >/dev/null 2>&1 || exit 0
git -C "$ROOT" rev-parse --git-dir >/dev/null 2>&1 || exit 0

CACHE="$ROOT/.groove/.cache"
PENDING="$CACHE/pending-capture.md"
BUFFER="$CACHE/git-activity-buffer.txt"

commits=$(git -C "$ROOT" log --since=midnight --oneline 2>/dev/null)
changes=$(git -C "$ROOT" diff --stat HEAD 2>/dev/null)
buffered=""
[ -s "$BUFFER" ] && buffered=$(cat "$BUFFER")

# No activity → clear any stale draft and stay silent.
if [ -z "$commits" ] && [ -z "$changes" ] && [ -z "$buffered" ]; then
  rm -f "$PENDING"
  exit 0
fi

mkdir -p "$CACHE"
{
  echo "# Pending capture — $(date '+%Y-%m-%d %H:%M')"
  echo
  echo "## Commits since midnight"
  echo "${commits:-(none)}"
  echo
  echo "## Working changes"
  echo "${changes:-(none)}"
  if [ -n "$buffered" ]; then
    echo
    echo "## Buffered commit messages"
    echo "$buffered"
  fi
} > "$PENDING"

.claude/settings.json のエントリー

これらを hooks キーにマージします。それ以外のキーはすべて保持します。

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/daily-end-reminder.sh" }
        ]
      },
      {
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/session-capture.sh" }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/git-activity-buffer.sh" }
        ]
      },
      {
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/version-check.sh" }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/block-managed-paths.sh" }
        ]
      },
      {
        "matcher": "Edit",
        "hooks": [
          { "type": "command", "command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/claude/block-managed-paths.sh" }
        ]
      }
    ],
    "SessionStart": [
      {
        "matcher": "startup|compact",
        "hooks": [
          {
            "type": "command",
            "command": "bash $CLAUDE_PROJECT_DIR/.agents/skills/groove-utilities-prime/scripts/groove-utilities-prime.sh"
          }
        ]
      }
    ]
  }
}

マージ時に hooks キーがすでに存在する場合は、該当するイベント配列に groove のエントリーを追加します。重複を作成しないでください。追加前に、groove のコマンドエントリーがすでに存在するか確認します。

制約

  • .claude/settings.json の groove 以外のエントリーを上書きしてはいけません
  • 差分を表示して確認を得ずに、既存のスクリプトを上書きしてはいけません
  • スクリプトは python3 を使って JSON 標準入力を解析します。python3 がない場合は、そのフックをスキップして警告します
  • block-managed-paths は強制的にブロックします。誤検知が発生した場合は、--disable block-managed-paths で無効にできます
  • インストール後、フックは次回の Claude Code セッション再起動後に有効になることをユーザーに伝えます
  • .groove/hooks/claude/ は .groove/index.md の git.hooks Git 戦略に従います

コメント