---
date: 2026-05-08
tags: [claude-code, settings, permissions, productivity]
---

# Claude Code 权限 allowlist 批量预置

## 背景

`defaultMode: bypassPermissions` 理论上放行一切，但用户反复反馈某些命令仍触发确认提示（可能与 IDE 模式、临时切到 `default` / `acceptEdits` 模式有关）。显式 allowlist 是双保险。

## 项目级常见命令模式

整理出本项目高频会被打断的 Bash 命令分类，按"打断频次 × 安全性"决定是否进 allow：

### Git 写（高频，但有限风险）
- `git add:*` / `git commit:*` ✅ 可放行
- `git push:*` ❌ 保留确认（不可逆远程操作）
- `git reset --hard*` / `git rebase*` / `git checkout*` ❌ 保留（改 working tree）

### Git 只读（高频，零风险）
- `git status*` / `git diff*` / `git log*` / `git show*` / `git branch*` / `git blame*` / `git ls-files*` / `git rev-parse*` ✅

### 文件查看 / 目录操作（高频，零风险）
- `ls:*` / `cat:*` / `head:*` / `tail:*` / `wc:*` / `find:*` / `grep:*` / `rg:*` / `file:*` / `stat:*` / `tree:*` / `pwd` / `which:*` ✅

### 工作区切换（前缀模式覆盖大量复合命令）
- `cd <project-root>*` ✅ —— 覆盖 `cd workspace && do-something` 这种链式
- 注意：复合命令（`&&` / `|` 连接）必须把**完整链**放进 allow，否则不匹配

### 测试 / 数据库 / 脚本（项目特有但高频）
- `source testing/*` / `bash testing/*` / `bash scripts/*` ✅
- `setup_test_*` / `ensure_test_*` / `reset_test_*` / `teardown_test_*` ✅（函数名前缀）
- `npm run db:seed*` / `npm run prisma:*` / `npx prisma:*` ✅
- `docker exec*ffoa-dev-postgres*` ✅（仅限本项目容器名）/ `docker ps*` / `docker logs*` ✅

### 仍需确认的高危类
- `rm` / `mv`（删除/移动）
- `npm install/uninstall` / `pnpm`（依赖变更副作用大）
- `docker volume rm` / `docker system prune`（毁数据）
- `pm2 restart` / `pm2 reload`（生产敏感）

## 通配模式陷阱

Claude Code 权限匹配是**字符串前缀通配**：

| 写法 | 含义 |
|---|---|
| `Bash(git status*)` | 匹配 `git status`、`git status -s`、`git status --short`，但**不**匹配 `git statusfoo` |
| `Bash(git status:*)` | 等价（冒号语法等同于空格分隔后续 args）|
| `Bash(cd /path && do-something*)` | 必须完整链作前缀；只 allow `cd /path*` 不会自动放行 `cd /path && do-something` |
| `Bash(source testing/*)` | 匹配 `source testing/scripts/x.sh`、`source testing/setup.sh` |

## 推荐套用：新项目 settings.json 启动模板

完整 50+ 行的 allow 列表见 [.claude/settings.json](../.claude/settings.json) 当前实现。新项目快速套用步骤：

1. 复制本仓库 `.claude/settings.json` 的 `permissions.allow` 数组
2. 把 `cd /home/lijian/Code/workspace*` 改为新项目的根路径
3. 把 `docker exec*ffoa-dev-postgres*` 改为新项目的容器名（或删除）
4. 把 `npm run db:seed*` 等保留如适用，否则删除
5. **保留**：所有 git 只读、文件查看、git add/commit
6. **不要复制**：项目特有的脚本路径（例如 `testing/scripts/lib-test-db.sh`），按需新增

## 为什么不直接 `defaultMode: bypassPermissions` 一刀切

理论上这个模式确实放行一切，但实际遇到：
- 用户切换到 plan 模式时，allowlist 仍生效；bypass 模式被覆盖
- 团队成员复用 settings 时，bypass 模式有些人不开心；显式 allow 更可控
- IDE 集成 / 多 agent 场景下，bypass 模式不一定被尊重；显式 allow 仍工作

显式 allow 是更稳的兜底。

## 关联

- [.claude/settings.json](../.claude/settings.json) 完整配置
- 项目里有 `fewer-permission-prompts` skill（扫描 transcript 自动生成 allowlist），可作为本笔记的工具补充
