关于 groove-admin-claude-hooks
用于安装、列出和停用 groove 原生 Claude Code shell hook 的技能。它在保留现有设置的同时注册生命周期脚本,并提供六种可选 hook,涵盖提醒、Git 活动、路径保护、上下文加载、版本检查和会话记录。
主要功能
- 01安装选定的生命周期 hook
- 02列出已注册的 hook 和脚本
- 03停用指定 hook
- 04合并设置并保留其他条目
- 05提供六种工作流事件 hook
适用场景
- 01为 Claude Code 会话添加提醒
- 02记录 Git 活动以便后续审阅
- 03阻止修改 groove 管理的路径
安装
复制下面的命令,在终端中运行。
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 原生 shell hooks。这些 hooks 在模型之外运行,具有确定性且无条件,并与 groove 的建议性 Markdown hooks(.groove/hooks/start.md、end.md)相辅相成。
使用 --disable <hook> 移除指定 hook。使用 --list 查看当前状态。
结果
所选 hooks 会注册到 .claude/settings.json,shell 脚本会写入 .groove/hooks/claude/。这些 hooks 会在 Claude Code 生命周期事件发生时自动触发,无需模型参与。
可用 hooks
| 名称 | 事件 | 匹配器 | 功能 |
|---|---|---|---|
daily-end-reminder | Stop | — | 如果本地时间为 16–21 点且 .groove/index.md 存在,则打印提醒,提示运行 /groove-daily-end |
git-activity-buffer | PostToolUse | Bash | 如果 Bash 命令包含 git commit,则向 .groove/.cache/git-activity-buffer.txt 追加一行带时间戳的记录 |
block-managed-paths | PreToolUse | Write、Edit | 如果 file_path 以 .agents/skills/groove 或 skills/groove 开头,则以非零状态码退出,阻止写入并显示说明 |
context-reprime | SessionStart | startup|compact | 直接运行 prime 脚本,确保每次会话启动和压缩后都加载完整的工作流上下文 |
version-check | PostToolUse | — | 每小时检查一次是否有新版 groove;调用 groove-utilities-check |
session-capture | Stop | — | 如果本次会话有 Git 活动(自午夜以来的提交、工作区更改或缓冲的提交),则将捕获草稿写入 .groove/.cache/pending-capture.md,供下一次会话审阅。静默执行。 |
步骤
--list
如果 .claude/settings.json 存在,则读取该文件。报告已注册的 groove hooks,以及 .groove/hooks/claude/ 中存在的脚本。退出。
--disable <hook>
从 .claude/settings.json 中移除指定 hook 的条目(保留脚本)。报告已移除或未找到。退出。
默认(安装)
-
询问要启用哪些 hooks(默认:全部六个):
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. -
如果
.claude/settings.json存在,则读取并解析为 JSON(默认{})。绝不丢弃现有的非 groove 条目。 -
如果
.groove/hooks/claude/目录不存在,则创建该目录。将每个脚本设为可执行(chmod +x)。 -
对于每个选定的 hook:写入 shell 脚本,并将 hook 条目合并到
.claude/settings.json。 -
将合并后的结果写入
.claude/settings.json。 -
报告摘要:
✓ 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
Shell 脚本模板
将以下内容原样写入 .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,则跳过该 hook 并发出警告 block-managed-paths较为激进:如果导致误报,用户可以使用--disable block-managed-paths禁用它- 安装后:提醒用户 hooks 要在下次重启 Claude Code 会话后才会生效
.groove/hooks/claude/遵循.groove/index.md中的git.hooksGit 策略