Skip to content

Commit f157484

Browse files
committed
Merge branch '3.5.x'
2 parents ac720eb + c71e8e4 commit f157484

File tree

3 files changed

+150
-16
lines changed

3 files changed

+150
-16
lines changed

.claude/README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
├── pr-update.md # 更新 PR 描述
1414
├── commit.md # 提交变更
1515
├── upgrade-dep.md # 升级依赖
16-
└── review.md # 审查 PR
16+
├── review.md # 审查 PR
17+
└── fix-permissions.md # 检查和修复文件权限
1718
```
1819

1920
## 📋 项目规则
@@ -22,7 +23,8 @@
2223

2324
### 规则 1: 文件权限管理
2425
- 所有新建/修改的文件必须设置正确的所有者权限
25-
- 动态从 `pom.xml` 等参考文件获取权限信息
26+
- 动态从 `README.md` 等参考文件获取权限信息
27+
- README.md 是通用文件,适用于所有语言的项目
2628
- 避免硬编码用户名和用户组
2729

2830
### 规则 2: PR 提交规范
@@ -97,6 +99,20 @@
9799
- 测试覆盖情况
98100
- 生成审查报告
99101

102+
### 检查和修复权限
103+
104+
```bash
105+
# 检查并修复所有文件和目录权限
106+
/fix-permissions
107+
```
108+
109+
**自动化流程:**
110+
1. 从 README.md 获取正确的所有者信息
111+
2. 扫描所有文件和目录
112+
3. 识别权限不一致的文件
113+
4. 自动修复为正确的所有者
114+
5. 生成检查报告
115+
100116
## 🎯 最佳实践
101117

102118
### 1. 使用 Slash Commands
@@ -188,7 +204,7 @@ gh pr view 369
188204
**解决方案**:使用 `/pr-update <pr-number>` 命令更新
189205

190206
### 问题:文件权限错误
191-
**解决方案**已在 `project-rules.md` 中配置自动处理
207+
**解决方案**使用 `/fix-permissions` 命令自动检查和修复
192208

193209
### 问题:想要自定义命令
194210
**解决方案**:在 `.claude/commands/` 目录创建新的 `.md` 文件
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
检查并修复项目中所有文件和文件夹的权限,确保符合项目规范。
2+
3+
**用法:**
4+
- `/fix-permissions` - 检查并自动修复所有权限问题
5+
6+
**执行步骤:**
7+
8+
1. **获取参考文件的所有者信息**
9+
```bash
10+
ls -l README.md | awk '{print $3":"$4}'
11+
```
12+
- 从项目根目录的 `README.md` 动态获取正确的所有者信息
13+
- README.md 是所有项目都有的通用文件
14+
- 不硬编码用户名和用户组
15+
16+
2. **统计当前文件权限分布**
17+
```bash
18+
# 检查所有文件的所有者分布
19+
find . -type f -print0 2>/dev/null | xargs -0 ls -l 2>/dev/null | awk '{print $3":"$4}' | sort | uniq -c | sort -rn
20+
21+
# 检查所有目录的所有者分布
22+
find . -type d -print0 2>/dev/null | xargs -0 ls -ld 2>/dev/null | awk '{print $3":"$4}' | sort | uniq -c | sort -rn
23+
```
24+
25+
3. **识别权限不一致的文件**
26+
```bash
27+
# 找出所有者不是参考用户的文件
28+
find . -type f -print0 2>/dev/null | xargs -0 ls -l 2>/dev/null | awk '$3 == "root" {print $9}'
29+
30+
# 找出所有者不是参考用户的目录
31+
find . -type d -print0 2>/dev/null | xargs -0 ls -ld 2>/dev/null | awk '$3 == "root" {print $9}'
32+
```
33+
34+
4. **修复文件权限**
35+
```bash
36+
# 获取正确的所有者信息
37+
OWNER_GROUP=$(ls -l README.md | awk '{print $3":"$4}')
38+
39+
# 修复所有文件权限
40+
find . -type f -print0 2>/dev/null | xargs -0 ls -l 2>/dev/null | awk '$3 == "root" {print $9}' | xargs sudo chown $OWNER_GROUP
41+
42+
# 修复所有目录权限
43+
find . -type d -print0 2>/dev/null | xargs -0 ls -ld 2>/dev/null | awk '$3 == "root" {print $9}' | xargs sudo chown $OWNER_GROUP
44+
```
45+
46+
5. **最终验证**
47+
```bash
48+
# 统计修复后的权限分布
49+
find . \( -type f -o -type d \) -print0 2>/dev/null | xargs -0 ls -ld 2>/dev/null | awk '{print $3":"$4}' | sort | uniq -c | sort -rn
50+
51+
# 抽查几个之前有问题的文件
52+
ls -ld ./.claude/settings.local.json ./framework/.claude/settings.local.json
53+
```
54+
55+
6. **生成检查报告**
56+
- 显示参考所有者信息
57+
- 显示发现的问题文件和目录数量
58+
- 显示修复的文件和目录列表
59+
- 显示最终验证结果
60+
61+
**规范说明:**
62+
63+
根据 `.claude/project-rules.md` 中的规则 1:
64+
- 所有文件必须设置正确的所有者权限
65+
- 不要硬编码用户名和用户组
66+
- 动态从 `README.md` 等参考文件获取权限信息
67+
- README.md 是通用文件,适用于所有语言的项目
68+
- 确保用户可以自主修改所有文件
69+
70+
**常见问题:**
71+
72+
**为什么有些文件是 root 所有者?**
73+
- 可能是使用 `sudo` 创建的文件或目录
74+
- Git 操作时使用了 sudo 权限
75+
- Claude Code 创建文件时权限设置不当
76+
77+
**修复后会影响 Git 吗?**
78+
- 不会影响 Git 历史和提交
79+
- 只改变文件系统级别的所有者
80+
- Git 内容和状态保持不变
81+
82+
**需要 sudo 权限吗?**
83+
- 修复 root 所有者的文件时需要 sudo
84+
- 确保当前用户在 sudoers 列表中
85+
86+
**参考文档:**
87+
- 项目规则:`.claude/project-rules.md` (规则 1)
88+
- 动态获取权限方法的详细说明

.claude/project-rules.md

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
**动态获取权限的方法:**
1212

1313
```bash
14-
# 方法1: 从项目根目录的 pom.xml 获取所有者
15-
REF_FILE="pom.xml" # 或其他稳定存在的文件
14+
# 方法1: 从项目根目录的 README.md 获取所有者
15+
REF_FILE="README.md" # 所有项目都有的通用文件
1616
OWNER=$(ls -l $REF_FILE | awk '{print $3}')
1717
GROUP=$(ls -l $REF_FILE | awk '{print $4}')
1818

@@ -32,22 +32,47 @@ GROUP=$(stat -c "%G" $REF_FILE) # Linux
3232

3333
```bash
3434
# 1. 先获取参考文件的所有者
35-
OWNER_GROUP=$(ls -l pom.xml | awk '{print $3":"$4}')
35+
OWNER_GROUP=$(ls -l README.md | awk '{print $3":"$4}')
3636

3737
# 2. 应用到新文件
3838
sudo chown $OWNER_GROUP <file_path>
3939

4040
# 或者分步执行
41-
OWNER=$(ls -l pom.xml | awk '{print $3}')
42-
GROUP=$(ls -l pom.xml | awk '{print $4}')
41+
OWNER=$(ls -l README.md | awk '{print $3}')
42+
GROUP=$(ls -l README.md | awk '{print $4}')
4343
sudo chown $OWNER:$GROUP <file_path>
4444
```
4545

46+
**⚠️ 强制执行规则(CRITICAL):**
47+
48+
每次使用 `Write``Edit` 工具创建/修改文件后,**必须立即**在同一个响应中使用 `Bash` 工具修复权限。
49+
50+
**标准流程(必须遵循):**
51+
52+
```bash
53+
# 步骤 1: 创建或修改文件
54+
Write(file_path, content) # 或 Edit(...)
55+
56+
# 步骤 2: 立即动态获取正确的所有者并修复权限(在同一个响应中)
57+
Bash("OWNER_GROUP=$(ls -l README.md | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP " + file_path)
58+
59+
# 或者批量修复多个文件
60+
Bash("OWNER_GROUP=$(ls -l README.md | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP file1 file2 file3")
61+
```
62+
63+
**为什么必须这样做:**
64+
- Write 和 Edit 工具可能会将文件所有者更改为 root
65+
- 这会导致用户无法修改自己的文件
66+
- 必须动态获取权限,不能硬编码用户名
67+
- 必须在工具调用后立即修复,不能延后到下一个响应
68+
4669
**检查清单:**
47-
- [ ] 使用 Write 工具创建新文件后,立即从已有文件获取权限并设置
48-
- [ ] 使用 Edit 工具修改文件时,确认文件所有者与项目其他文件一致
49-
- [ ] 批量创建文件后,统一修改所有权
70+
- [ ] 使用 Write 工具创建新文件后,**立即**在同一响应中动态获取并修复权限
71+
- [ ] 使用 Edit 工具修改文件后,**立即**在同一响应中动态获取并修复权限
72+
- [ ] 批量创建/修改文件后,统一修改所有权
5073
- [ ] 创建目录后,递归修改目录及其内容的所有权
74+
- [ ] 每次修改后验证权限是否正确
75+
- [ ] **绝对不要**硬编码用户名和用户组
5176

5277
**完整示例:**
5378

@@ -58,14 +83,14 @@ Bash("sudo chown jiyujie:staff " + file_path) # 在其他人电脑上会失败
5883

5984
# ✅ 正确做法:动态获取权限
6085
Write(file_path, content)
61-
# 从项目根目录的 pom.xml 获取所有者信息
62-
Bash("OWNER_GROUP=$(ls -l pom.xml | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP " + file_path)
86+
# 从项目根目录的 README.md 获取所有者信息
87+
Bash("OWNER_GROUP=$(ls -l README.md | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP " + file_path)
6388

6489
# ✅ 更简洁的做法:批量处理
6590
Write(file1, content1)
6691
Write(file2, content2)
6792
Write(file3, content3)
68-
Bash("OWNER_GROUP=$(ls -l pom.xml | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP file1 file2 file3")
93+
Bash("OWNER_GROUP=$(ls -l README.md | awk '{print $3\":\"$4}') && sudo chown $OWNER_GROUP file1 file2 file3")
6994
```
7095

7196
## Pull Request 提交规范
@@ -201,8 +226,8 @@ mvn test
201226
# 检查文件权限
202227
ls -l <file>
203228
204-
# 动态修改文件权限(从 pom.xml 获取所有者)
205-
OWNER_GROUP=$(ls -l pom.xml | awk '{print $3":"$4}')
229+
# 动态修改文件权限(从 README.md 获取所有者)
230+
OWNER_GROUP=$(ls -l README.md | awk '{print $3":"$4}')
206231
sudo chown $OWNER_GROUP <file>
207232
```
208233
@@ -225,6 +250,11 @@ sudo chown $OWNER_GROUP <file>
225250
**`/review <pr-number>`** - 审查 Pull Request
226251
- `/review 369` - 审查 #369 PR
227252
253+
### 项目管理命令
254+
255+
**`/fix-permissions`** - 检查和修复文件权限
256+
- `/fix-permissions` - 检查并自动修复所有权限问题
257+
228258
### 开发相关命令
229259
230260
**`/commit [message]`** - 提交变更

0 commit comments

Comments
 (0)