新增 Edit/Write/MultiEdit 事件攔截(原僅攔截 git commit Bash 指令), 補齊 getenv fallback 模式偵測,防止 hardcoded Token 透過工具直寫入檔案。 - .claude/hooks/commit-quality.js: 改寫為 PreToolUse JSON 格式,覆蓋 Edit/Write/MultiEdit - .claude/settings.json: 新增 Edit|Write|MultiEdit|Bash matcher 註冊 - .claude/hooks/__test__/commit-quality.test.sh: 4 case 自動化測試 - docs/guides/DISK_EXPANSION_GUIDE.md: 磁碟擴充 SOP 歸檔 - docs/p9_completion_report_*.md: P9-1 + P9-2 Sprint 完成報告 - docs/refactor/callback_prefix_proposal.md: 308 按鈕回呼前綴分析(Method C) - docs/refactor/openclaw_bot_routes_split_plan.md: 5999 行神檔拆分計畫 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
101 lines
5.2 KiB
JSON
101 lines
5.2 KiB
JSON
{
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(bash \"/Users/ooo/Library/Mobile Documents/com~apple~CloudDocs/momo-pro-system/.claude/hooks/__test__/commit-quality.test.sh\")",
|
|
"Read(//Users/ooo/.nvm/versions/**)",
|
|
"Bash(command -v node)",
|
|
"Bash(env)",
|
|
"Bash(awk -F: '$1>=4647 && $1<=4950')",
|
|
"Bash(python -m py_compile services/telegram_templates.py services/telegram_bot_service.py)",
|
|
"Bash(/bin/zsh -ilc 'echo PATH=$PATH; which node; node -v')",
|
|
"Bash(git clean *)",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('routes/openclaw_bot_routes.py'\\).read\\(\\)\\); print\\('routes OK'\\)\")",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('services/telegram_bot_service.py'\\).read\\(\\)\\); print\\('service OK'\\)\")",
|
|
"Bash(awk 'NR>=2912 && NR<=2920; NR>=3007 && NR<=3015; NR>=3109 && NR<=3117; NR>=3178 && NR<=3186; NR>=3257 && NR<=3265; NR>=3296 && NR<=3304' routes/openclaw_bot_routes.py)",
|
|
"Bash(awk 'NR>=4347 && NR<=4520' routes/openclaw_bot_routes.py)",
|
|
"Bash(awk 'NR>=2164 && NR<=2180; NR>=2720 && NR<=2740; NR>=1287 && NR<=1295; NR>=1384 && NR<=1395; NR>=1474 && NR<=1490; NR>=4327 && NR<=4345; NR>=4512 && NR<=4550' routes/openclaw_bot_routes.py)",
|
|
"Bash(awk 'NR>=1979 && NR<=2000; NR>=2164 && NR<=2180; NR>=1962 && NR<=1978' routes/openclaw_bot_routes.py)",
|
|
"Bash(awk -F: '{print $1}')",
|
|
"Bash(python3 -c ' *)",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('services/telegram_bot_service.py'\\).read\\(\\)\\); print\\('bot_service OK'\\)\")",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('services/telegram_templates.py'\\).read\\(\\)\\); print\\('templates OK'\\)\")",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('services/mcp_context_service.py'\\).read\\(\\)\\); print\\('mcp_context OK'\\)\")",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('config.py'\\).read\\(\\)\\); print\\('config OK'\\)\")",
|
|
"Bash(node -e \"require\\('./.claude/hooks/commit-quality.js'\\)\")",
|
|
"Bash(/Users/ooo/.nvm/versions/node/*/bin/node -e \"require\\('./.claude/hooks/commit-quality.js'\\); console.log\\('hook loads OK'\\)\")",
|
|
"Bash(python -c \"import ast; ast.parse\\(open\\('services/telegram_templates.py'\\).read\\(\\)\\); print\\('AST OK'\\)\")",
|
|
"Bash(python -c \"from services.telegram_templates import decision_result, ops_action_result; print\\('IMPORT OK'\\); print\\(decision_result\\('原訊息 <test>', 'approve', 'owen'\\)\\); print\\('---'\\); print\\(ops_action_result\\('原運維訊息', 'pause1h', 'owen', {'status':'ok','task_name':'momo_crawler','duration_min':60,'message':'已暫停'}\\)\\); print\\('---'\\); print\\(ops_action_result\\('x', 'retry', 'owen', {'status':'error','error':'conn refused'}\\)\\)\")",
|
|
"Bash(python -c \"import ast; [ast.parse\\(open\\(f\\).read\\(\\)\\) for f in ['services/ai_orchestrator.py','services/hermes_analyst_service.py','services/nemoton_dispatcher_service.py','services/openclaw_strategist_service.py','telegram_ai_integration.py']]; print\\('syntax OK'\\)\")",
|
|
"Bash(python -c \"from services.ai_orchestrator import AIOrchestrator; print\\('import OK'\\)\")",
|
|
"Bash(python3 -c \"import sqlalchemy; print\\(sqlalchemy.__version__\\)\")",
|
|
"Bash(./bin/python3 -c \"import sqlalchemy; print\\('sqlalchemy', sqlalchemy.__version__\\)\")",
|
|
"Bash(python3 -c \"import ast; [ast.parse\\(open\\(f\\).read\\(\\)\\) for f in ['services/ai_orchestrator.py','services/hermes_analyst_service.py','services/nemoton_dispatcher_service.py','services/openclaw_strategist_service.py','telegram_ai_integration.py']]; print\\('syntax OK'\\)\")"
|
|
],
|
|
"defaultMode": "bypassPermissions",
|
|
"additionalDirectories": [
|
|
"/tmp",
|
|
"/Users/ooo/Library/Mobile Documents/com~apple~CloudDocs/momo-pro-system/.claude/hooks"
|
|
]
|
|
},
|
|
"hooks": {
|
|
"PreToolUse": [
|
|
{
|
|
"matcher": "",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/momo-prod-guard.js"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/large-file-warner.js"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/mcp-health.js"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"matcher": "Edit|Write|MultiEdit|Bash",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/commit-quality.js"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"PostToolUse": [
|
|
{
|
|
"matcher": "",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/audit-log.js"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/suggest-compact.js"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"Stop": [
|
|
{
|
|
"matcher": "",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/cost-tracker.js"
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/session-summary.js"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|