mcpField
G
groove-admin-claude-hooks

groove-admin-claude-hooks

github.com/andreadellacorteAgent 工作流6530 次安装14 周前更新
代码仓库

关于 groove-admin-claude-hooks

用于安装、列出和停用 groove 原生 Claude Code shell hook 的技能。它在保留现有设置的同时注册生命周期脚本,并提供六种可选 hook,涵盖提醒、Git 活动、路径保护、上下文加载、版本检查和会话记录。

主要功能

  1. 01安装选定的生命周期 hook
  2. 02列出已注册的 hook 和脚本
  3. 03停用指定 hook
  4. 04合并设置并保留其他条目
  5. 05提供六种工作流事件 hook

适用场景

  1. 01为 Claude Code 会话添加提醒
  2. 02记录 Git 活动以便后续审阅
  3. 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-reminderStop—如果本地时间为 16–21 点且 .groove/index.md 存在,则打印提醒,提示运行 /groove-daily-end
git-activity-bufferPostToolUseBash如果 Bash 命令包含 git commit,则向 .groove/.cache/git-activity-buffer.txt 追加一行带时间戳的记录
block-managed-pathsPreToolUseWrite、Edit如果 file_path 以 .agents/skills/groove 或 skills/groove 开头,则以非零状态码退出,阻止写入并显示说明
context-reprimeSessionStartstartup|compact直接运行 prime 脚本,确保每次会话启动和压缩后都加载完整的工作流上下文
version-checkPostToolUse—每小时检查一次是否有新版 groove;调用 groove-utilities-check
session-captureStop—如果本次会话有 Git 活动(自午夜以来的提交、工作区更改或缓冲的提交),则将捕获草稿写入 .groove/.cache/pending-capture.md,供下一次会话审阅。静默执行。

步骤

--list

如果 .claude/settings.json 存在,则读取该文件。报告已注册的 groove hooks,以及 .groove/hooks/claude/ 中存在的脚本。退出。

--disable <hook>

从 .claude/settings.json 中移除指定 hook 的条目(保留脚本)。报告已移除或未找到。退出。

默认(安装)
  1. 询问要启用哪些 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.
    
  2. 如果 .claude/settings.json 存在,则读取并解析为 JSON(默认 {})。绝不丢弃现有的非 groove 条目。

  3. 如果 .groove/hooks/claude/ 目录不存在,则创建该目录。将每个脚本设为可执行(chmod +x)。

  4. 对于每个选定的 hook:写入 shell 脚本,并将 hook 条目合并到 .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
    

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.hooks Git 策略

评论

支持 Markdown