groove-admin-cursor-hooks について
groove の Cursor ネイティブフックをインストール、管理するスキルです。モデルを介さずセッションやツールなどのイベントに応じて動作し、既存の groove 以外の設定も保持します。
主な機能
- 016 種類の Cursor ライフサイクルフックを導入
- 02登録済みフックとスクリプトを一覧表示
- 03名前を指定してフックを無効化
- 04既存項目を保った設定のマージ
- 05Git の活動を記録しセッション記録を準備
活用シーン
- 01セッション開始時に groove のワークフローコンテキストを再読み込み
- 02指定時間帯に終業時の手順をリマインド
- 03groove 管理下のスキルパスへの編集をブロック
- 04後で確認するため Git のセッション記録を準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ andreadellacorte/ groove --skill groove-admin-cursor-hooksインストール後、Claude Code で/groove-admin-cursor-hooksを入力して読み込まれたか確認します。
詳細
groove-admin-cursor-hooks
groove の Cursor ネイティブフックをインストールします。これらはモデルの外部で実行され、決定的かつ無条件に動作し、groove のアドバイザリー Markdown フック(.groove/hooks/start.md、end.md)を補完します。
特定のフックを削除するには --disable <hook> を使用します。現在の状態を表示するには --list を使用します。
実行結果
選択したフックは .cursor/hooks.json に登録され、シェルスクリプトは .groove/hooks/cursor/ に書き込まれます。フックはモデルを介さず、Cursor のライフサイクルイベントで自動的に実行されます。
利用可能なフック
| 名前 | イベント | マッチャー | 動作 |
|---|---|---|---|
context-reprime | sessionStart | — | prime スクリプトを --json 付きで実行します — セッション開始とコンパクションのたびに、完全なワークフローコンテキストが読み込まれるようにします |
daily-end-reminder | stop | — | 現地時間が16~21時で、.groove/index.md が存在する場合、/groove-daily-end の実行を促すリマインダーを表示します |
git-activity-buffer | postToolUse | Shell | コマンドに git commit が含まれている場合、タイムスタンプ付きの行を .groove/.cache/git-activity-buffer.txt に追記します |
block-managed-paths | preToolUse | Write | file_path が .agents/skills/groove または skills/groove で始まる場合、説明メッセージとともにコード2で終了し、書き込みをブロックします |
version-check | postToolUse | — | 1時間に1回、新しい groove バージョンがあるか確認し、groove-utilities-check を呼び出します |
session-capture | stop | — | このセッション中に Git のアクティビティ(深夜以降のコミット、作業中の変更、またはバッファー内のコミット)があった場合、次のセッションで確認するためのキャプチャの下書きを .groove/.cache/pending-capture.md にステージします。通知は表示されません。 |
手順
--list
.cursor/hooks.json が存在する場合は読み込みます。登録されている groove フックと、.groove/hooks/cursor/ に存在するスクリプトを報告します。終了します。
--disable <hook>
.cursor/hooks.json から指定されたフックのエントリーを削除します(スクリプトはそのまま残します)。削除済み、または見つからなかったことを報告します。終了します。
デフォルト(インストール)
-
有効にするフックを確認します(デフォルト:6つすべて)。
Which hooks to install? (all / comma-separated: context-reprime, daily-end-reminder, git-activity-buffer, block-managed-paths, version-check, session-capture) Press enter for all. -
.cursor/hooks.jsonが存在する場合は読み込み、JSON として解析します(デフォルトは{"version": 1, "hooks": {}})。既存の groove 以外のエントリーを破棄してはいけません。 -
.groove/hooks/cursor/ディレクトリが存在しない場合は作成します。各スクリプトに実行権限を付与します(chmod +x)。 -
選択した各フックについて、シェルスクリプトを書き込み、フックのエントリーを
.cursor/hooks.jsonにマージします。 -
マージした結果を
.cursor/hooks.jsonに書き込みます。 -
概要を報告します。
✓ context-reprime — sessionStart hook → groove-utilities-prime.sh --json ✓ daily-end-reminder — stop hook → .groove/hooks/cursor/daily-end-reminder.sh ✓ git-activity-buffer — postToolUse/Shell hook → .groove/hooks/cursor/git-activity-buffer.sh ✓ block-managed-paths — preToolUse/Write hook → .groove/hooks/cursor/block-managed-paths.sh ✓ version-check — postToolUse hook → .groove/hooks/cursor/version-check.sh ✓ session-capture — stop hook → .groove/hooks/cursor/session-capture.sh ✓ .cursor/hooks.json updated
シェルスクリプトのテンプレート
以下を .groove/hooks/cursor/ にそのまま書き込みます。差分を表示して確認を得ることなく、既存のスクリプトを上書きしてはいけません。
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/Shell 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 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 2
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"
.cursor/hooks.json のテンプレート
これらを hooks キーにマージします。他のすべてのキーは保持します。
{
"version": 1,
"hooks": {
"sessionStart": [
{
"command": "bash $CLAUDE_PROJECT_DIR/.agents/skills/groove-utilities-prime/scripts/groove-utilities-prime.sh --json"
}
],
"stop": [
{
"command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/cursor/daily-end-reminder.sh"
},
{
"command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/cursor/session-capture.sh"
}
],
"postToolUse": [
{
"matcher": "Shell",
"command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/cursor/git-activity-buffer.sh"
},
{
"command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/cursor/version-check.sh"
}
],
"preToolUse": [
{
"matcher": "Write",
"command": "bash $CLAUDE_PROJECT_DIR/.groove/hooks/cursor/block-managed-paths.sh"
}
]
}
}
マージ時に hooks キーがすでに存在する場合は、該当するイベント配列に groove のエントリーを追加します。重複を作成しないでください — 追加する前に、groove のコマンドエントリーがすでに存在するか確認します。
制約
.cursor/hooks.jsonにある groove 以外のエントリーを上書きしてはいけません- 差分を表示して確認を得ることなく、既存のスクリプトを上書きしてはいけません
- スクリプトは
python3を使用して標準入力の JSON を解析します —python3がない場合は、そのフックをスキップして警告します block-managed-pathsは終了コード2を使用します(Cursor では、ツールの使用をブロックするための規約です)- インストール後、フックを有効にするには次回の Cursor セッション再起動が必要であることをユーザーに伝えます
.groove/hooks/cursor/は.groove/index.mdのgit.hooksGit 戦略に従います.cursor/ディレクトリが存在しない場合は作成します