feat: 融合 devflow-claude P0 批机制 (REQ-20260416-0017)
P0-1: SessionStart Hook — hooks/session-context.sh 从分支名解析 REQ-ID,调 MCP API 查询需求详情注入 system-reminder P0-2: PreToolUse Hook — hooks/pre-tool-confirm.sh 拦截生产推送、force push、docker prod 容器操作、git reset --hard 等 P0-3: Release Draft 闸门设计文档 — docs/design/release-draft-gate.md 完整架构 + 渐进式落地路径(拆 7 个子任务延后) 附最小可用脚本 hooks/release-draft.sh 创建 Gitea draft release P0-4: Memory 隔离规则 — 写入 req-prd / req-design / req-workflow 禁止 auto-memory 污染模板产出物(章节结构、字段定义、文档结构) P0-5: CLAUDE.md 架构检查 + 架构片段库 dev-coding skill 执行前检查架构关键词 新增 templates/claude-md-snippets/ 含 Go+Gin / React+AntD / Vue+Element / MCP+TS / generic 五套骨架 P0-6: /commit 分支保护自动化 — 新 skill dev-commit-plugin 保护分支自动建功能分支 + Conventional Commits + REQ-XXX 自动关联 安装: bash hooks/install.sh 后续: P0-3 完整实现拆 7 个子任务(P0-3.1 ~ P0-3.7) 建议先部署 hooks 跑 1-2 周观察,再推进 Release 机制落地
This commit is contained in:
81
hooks/install.sh
Executable file
81
hooks/install.sh
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/bin/bash
|
||||
# install.sh
|
||||
# 一键把 ai-proj-helper hooks 注册到 ~/.claude/settings.json
|
||||
#
|
||||
# 用法: bash hooks/install.sh
|
||||
|
||||
set -e
|
||||
|
||||
HOOKS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
SETTINGS_FILE="$HOME/.claude/settings.json"
|
||||
|
||||
if ! command -v python3 >/dev/null 2>&1; then
|
||||
echo "❌ 需要 python3(用于合并 JSON)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
echo "⚠️ 未安装 jq,PreToolUse hook 将无法正常工作"
|
||||
echo " 请执行: brew install jq"
|
||||
fi
|
||||
|
||||
mkdir -p "$HOME/.claude"
|
||||
|
||||
python3 << EOF
|
||||
import json
|
||||
import os
|
||||
|
||||
settings_file = "$SETTINGS_FILE"
|
||||
hooks_dir = "$HOOKS_DIR"
|
||||
|
||||
# 读已有配置
|
||||
if os.path.exists(settings_file):
|
||||
with open(settings_file) as f:
|
||||
data = json.load(f)
|
||||
else:
|
||||
data = {}
|
||||
|
||||
# 合并 hooks
|
||||
hooks = data.setdefault("hooks", {})
|
||||
|
||||
# SessionStart
|
||||
session_start = hooks.setdefault("SessionStart", [])
|
||||
session_cmd = f"{hooks_dir}/session-context.sh"
|
||||
already_registered = any(
|
||||
any(h.get("command") == session_cmd for h in entry.get("hooks", []))
|
||||
for entry in session_start
|
||||
)
|
||||
if not already_registered:
|
||||
session_start.append({
|
||||
"hooks": [{"type": "command", "command": session_cmd, "timeout": 10}]
|
||||
})
|
||||
print("✅ 注册 SessionStart hook")
|
||||
else:
|
||||
print("⏭️ SessionStart hook 已存在")
|
||||
|
||||
# PreToolUse (Bash)
|
||||
pre_tool = hooks.setdefault("PreToolUse", [])
|
||||
pre_cmd = f"{hooks_dir}/pre-tool-confirm.sh"
|
||||
already_registered = any(
|
||||
entry.get("matcher") == "Bash" and any(h.get("command") == pre_cmd for h in entry.get("hooks", []))
|
||||
for entry in pre_tool
|
||||
)
|
||||
if not already_registered:
|
||||
pre_tool.append({
|
||||
"matcher": "Bash",
|
||||
"hooks": [{"type": "command", "command": pre_cmd, "timeout": 30}]
|
||||
})
|
||||
print("✅ 注册 PreToolUse (Bash) hook")
|
||||
else:
|
||||
print("⏭️ PreToolUse hook 已存在")
|
||||
|
||||
# 写回
|
||||
with open(settings_file, "w") as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"\n📝 已更新: {settings_file}")
|
||||
print("\n下一步:")
|
||||
print(" 1. 重启 Claude Code 会话")
|
||||
print(" 2. 切到含 REQ-ID 的分支测试 SessionStart hook")
|
||||
print(" 3. 让 AI 尝试 'git push origin main' 测试 PreToolUse hook")
|
||||
EOF
|
||||
Reference in New Issue
Block a user