{ "env": { "MAX_MCP_OUTPUT_TOKENS": "60000", "BASH_DEFAULT_TIMEOUT_MS": "300000", "BASH_MAX_TIMEOUT_MS": "600000", "MAX_THINKING_TOKENS": "8192", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "64000", "CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS": "45000", "NODE_ENV": "development", "NEXT_PUBLIC_APP_ENV": "development" }, "includeCoAuthoredBy": false, "permissions": { "allow": [ "Bash(.venv/bin/pip:*)", "Bash(.venv/bin/python:*)", "Bash(awk:*)", "Bash(cat:*)", "Bash(ccusage daily)", "Bash(ccusage daily:*)", "Bash(chmod:*)", "Bash(claude config get)", "Bash(claude mcp:*)", "Bash(cp:*)", "Bash(curl:*)", "Bash(do)", "Bash(done)", "Bash(echo:*)", "Bash(env)", "Bash(fd:*)", "Bash(find:*)", "Bash(gemini:*)", "Bash(git cherry-pick:*)", "Bash(git log:*)", "Bash(git show:*)", "Bash(git stash:*)", "Bash(grep:*)", "Bash(gtimeout:*)", "Bash(jq:*)", "Bash(ls:*)", "Bash(mcp:*)", "Bash(mkdir:*)", "Bash(mv:*)", "Bash(npx eslint:*)", "Bash(npx tsc:*)", "Bash(pip install:*)", "Bash(psql:*)", "Bash(python:*)", "Bash(readlink:*)", "Bash(rg:*)", "Bash(sed:*)", "Bash(source:*)", "Bash(then)", "Bash(timeout:*)", "Bash(tree:*)", "Bash(true)", "Bash(uv pip install:*)", "Bash(uv run:*)", "Bash(uv venv:*)", "Bash(wc:*)", "Bash(xargs grep:*)", "Bash(xargs ls:*)", "Bash(zai:*)", "Skill(anthropic:update-memory-bank)", "Skill(claude-docs-consultant)", "Skill(consult-zai)", "WebFetch(domain:docs.anthropic.com)", "WebFetch(domain:docs.convex.dev)", "WebFetch(domain:docs.z.ai)", "WebFetch(domain:github.com)", "WebFetch(domain:openrouter.ai)", "WebFetch(domain:www.comet.com)", "WebSearch", "mcp__cf-docs__search_cloudflare_documentation", "mcp__chrome-devtools__click", "mcp__chrome-devtools__emulate_cpu", "mcp__chrome-devtools__emulate_network", "mcp__chrome-devtools__evaluate_script", "mcp__chrome-devtools__fill", "mcp__chrome-devtools__fill_form", "mcp__chrome-devtools__hover", "mcp__chrome-devtools__list_console_messages", "mcp__chrome-devtools__list_network_requests", "mcp__chrome-devtools__list_pages", "mcp__chrome-devtools__navigate_page", "mcp__chrome-devtools__navigate_page_history", "mcp__chrome-devtools__new_page", "mcp__chrome-devtools__resize_page", "mcp__chrome-devtools__take_screenshot", "mcp__chrome-devtools__take_snapshot", "mcp__context7__get-library-docs", "mcp__context7__query-docs", "mcp__context7__resolve-library-id", "mcp__gemini-cli__gemini_ai_collaboration", "mcp__gemini-cli__gemini_cli", "mcp__gemini-cli__gemini_help", "mcp__gemini-cli__gemini_metrics", "mcp__gemini-cli__gemini_models", "mcp__gemini-cli__gemini_openrouter_models", "mcp__gemini-cli__gemini_openrouter_opinion", "mcp__gemini-cli__gemini_openrouter_usage_stats", "mcp__gemini-cli__gemini_prompt", "mcp__gemini-cli__gemini_review_code", "mcp__gemini-cli__gemini_summarize", "mcp__gemini-cli__gemini_summarize_files", "mcp__gemini-cli__gemini_verify_solution", "mcp__gemini-cli__gemini_version", "mcp__ide__getDiagnostics" ], "deny": [ "Bash(npm run build:*)" ], "defaultMode": "plan" }, "statusLine": { "type": "command", "command": ".claude/statuslines/statusline.sh" }, "hooks": { "PreToolUse": [ { "matcher": "Edit|MultiEdit|Write", "hooks": [ { "type": "command", "command": "sh -c 'file=\"$(echo \"$STDIN\" | jq -r .tool_input.file_path)\"; if [[ \"$file\" == *.tsx ]] || [[ \"$file\" == *.jsx ]]; then ext=\"${file##*.}\"; if grep -q \"useState\\|useEffect\\|useReducer\\|useCallback\\|useMemo\" \"$file\" 2>/dev/null; then if ! grep -q \"^['\\\"]use client['\\\"]\" \"$file\" 2>/dev/null; then echo \"⚠️ Warning: Client hooks detected. Add \\'use client\\' directive if needed.\"; fi; fi; fi'" } ] }, { "matcher": "Bash", "hooks": [ { "type": "command", "command": "sh -c 'cmd=\"$(echo \"$STDIN\" | jq -r .tool_input.command)\"; if echo \"$cmd\" | grep -q \"^npm install\\|^yarn add\\|^pnpm add\"; then echo \"📦 Installing dependencies - checking for Next.js compatibility...\"; fi'" } ] } ], "PostToolUse": [ { "matcher": "Write|MultiEdit", "hooks": [ { "type": "command", "command": "sh -c 'file=\"$(echo \"$STDIN\" | jq -r .tool_input.file_path)\"; if [[ \"$file\" == app/**/page.tsx ]] || [[ \"$file\" == app/**/page.jsx ]]; then dir=\"$(dirname \"$file\")\"; if [ ! -f \"$dir/loading.tsx\" ] && [ ! -f \"$dir/loading.jsx\" ]; then echo \"💡 Tip: Consider adding a loading.tsx for better UX\"; fi; if [ ! -f \"$dir/error.tsx\" ] && [ ! -f \"$dir/error.jsx\" ]; then echo \"💡 Tip: Consider adding an error.tsx for error handling\"; fi; fi'" } ] }, { "matcher": "Write|MultiEdit", "hooks": [ { "type": "command", "command": "sh -c 'file=\"$(echo \"$STDIN\" | jq -r .tool_input.file_path)\"; if [[ \"$file\" == *.ts ]] || [[ \"$file\" == *.tsx ]]; then if which prettier >/dev/null 2>&1; then prettier --write \"$file\" 2>/dev/null || true; fi; fi'" } ] } ], "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "sh -c 'if [ -f \"package.json\" ] && [ -d \"app\" ]; then echo \"🚀 Next.js Tip: Run \\`npm run dev\\` to start the development server\"; if [ -f \"tsconfig.json\" ]; then echo \"📝 Run \\`npm run type-check\\` to verify TypeScript types\"; fi; fi'" } ] } ], "Notification": [ { "matcher": "permission_prompt", "hooks": [ { "type": "command", "command": "notify-send -u critical -i dialog-warning '🤖 Claude Code' 'Permission confirmation required'", "timeout": 5 } ] }, { "matcher": "idle_prompt", "hooks": [ { "type": "command", "command": "notify-send -i dialog-question '🤖 Claude Code' 'Waiting for input'", "timeout": 5 } ] } ] }, "_metadata": { "name": "Next.js 15", "version": "1.0.0", "category": "framework", "generated": "2025-08-20T13:36:56.329Z", "generator": "manual", "note": "Official Claude Code configuration" } }