9c7ab5b229
High priority: - Auto-format on edit (.claude/hooks/format-elixir.sh): runs mix format synchronously after every Edit/Write on .ex, .exs, and .heex files. Ensures code is formatted before the next read or tool call. - mix test permissions: added Bash(mix test) (bare) and Bash(mix test *) (with path/flags) to the allow list. Previously only Bash(mix test:*) was allowed, which didn't match common invocations. - Slash commands: /precommit runs the full mix precommit pipeline and reports failures with fix suggestions. /oban-status queries Oban job state via Tidewave SQL, grouped by state and worker. Medium priority: - Chrome DevTools permissions: added 8 new tools (select_page, list_network_requests, get_network_request, list_console_messages, get_console_message, hover, press_key, wait_for) for debugging API traffic, JS hook errors, hover states, and keyboard navigation. - Gettext extraction hook (.claude/hooks/gettext-extract.sh): runs mix gettext.extract --merge asynchronously after editing .heex files. Async because it's project-wide and doesn't need to block the next edit. - Sobelow permission: added Bash(mix sobelow:*) to the allow list for independent security checks.
97 lines
3.3 KiB
JSON
97 lines
3.3 KiB
JSON
{
|
|
"permissions": {
|
|
"allow": [
|
|
"mcp__tidewave__get_ecto_schemas",
|
|
"Bash(mix test:*)",
|
|
"Bash(mix test)",
|
|
"Bash(mix test *)",
|
|
"mcp__tidewave__get_source_location",
|
|
"WebFetch(domain:hexdocs.pm)",
|
|
"mcp__tidewave__execute_sql_query",
|
|
"Bash(mix ecto.gen.migration:*)",
|
|
"Bash(mkdir:*)",
|
|
"Bash(mix ecto.migrate:*)",
|
|
"Bash(grep:*)",
|
|
"Bash(mix ecto.rollback:*)",
|
|
"Bash(mix format)",
|
|
"Bash(mix credo:*)",
|
|
"Bash(mix do:*)",
|
|
"Bash(mix gettext.extract:*)",
|
|
"Bash(mv:*)",
|
|
"Bash(mix compile)",
|
|
"Bash(mix phx.routes:*)",
|
|
"Bash(mix assets.deploy:*)",
|
|
"mcp__tidewave__get_logs",
|
|
"mcp__tidewave__project_eval",
|
|
"Bash(mix format:*)",
|
|
"Bash(mise run dev:static-checks:*)",
|
|
"Bash(find:*)",
|
|
"Bash(xargs sed:*)",
|
|
"Bash(git show:*)",
|
|
"Bash(head:*)",
|
|
"Bash(cat:*)",
|
|
"Bash(mise tasks:*)",
|
|
"Bash(mix run:*)",
|
|
"Bash(sqlite3:*)",
|
|
"WebSearch",
|
|
"Bash(mix shellcheck:*)",
|
|
"Bash(mix compile:*)",
|
|
"mcp__tidewave__get_docs",
|
|
"mcp__tidewave__search_package_docs",
|
|
"Bash(wc:*)",
|
|
"Bash(python3:*)",
|
|
"Bash(MIX_ENV=test mix ecto.migrate:*)",
|
|
"WebFetch(domain:api-dashboard.search.brave.com)",
|
|
"WebFetch(domain:api.search.brave.com)",
|
|
"Bash(while read dir)",
|
|
"Bash(MIX_ENV=dev mix run:*)",
|
|
"Bash(mix deps.get:*)",
|
|
"Bash(ls:*)",
|
|
"WebFetch(domain:raw.githubusercontent.com)",
|
|
"WebFetch(domain:github.com)",
|
|
"WebFetch(domain:hex.pm)",
|
|
"Bash(gh issue:*)",
|
|
"Bash(mise run:*)",
|
|
"Bash(gh label:*)",
|
|
"Bash(mix sobelow:*)",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__list_pages",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__navigate_page",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__take_screenshot",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__take_snapshot",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__fill",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__click",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__evaluate_script",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__new_page",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__select_page",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__list_network_requests",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__get_network_request",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__list_console_messages",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__get_console_message",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__hover",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__press_key",
|
|
"mcp__plugin_chrome-devtools-mcp_chrome-devtools__wait_for"
|
|
]
|
|
},
|
|
"hooks": {
|
|
"PostToolUse": [
|
|
{
|
|
"matcher": "Edit|Write",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/format-elixir.sh",
|
|
"timeout": 30
|
|
},
|
|
{
|
|
"type": "command",
|
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/gettext-extract.sh",
|
|
"timeout": 30,
|
|
"async": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"enableAllProjectMcpServers": false
|
|
}
|