@shirayner/ace 0.1.7 → 0.1.8-SNAPSHOT.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -19
- package/bin/ace.js +1 -0
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/skills/auto-goal/SKILL.md +131 -87
- package/plugin/skills/auto-goal/references/recovery.md +29 -0
- package/plugin/skills/auto-goal/references/state-template.md +97 -0
- package/src/commands/doctor.js +12 -5
- package/src/commands/init.js +9 -5
- package/src/commands/list.js +26 -0
- package/src/commands/spec.js +57 -0
- package/src/commands/uninstall.js +65 -31
- package/src/core/constants.js +23 -20
- package/src/core/installer.js +84 -4
- package/src/core/merger.js +15 -3
- package/src/core/team-installer.js +96 -0
- package/src/core/ui.js +0 -1
- package/templates/CLAUDE.md +28 -14
- package/templates/ace/rules/git.md +50 -0
- package/templates/ace/rules/gitflow.md +109 -0
- package/templates/{rules/ace → ace/rules}/thinking.md +5 -0
- package/templates/hooks/ace.bash-guard.sh +71 -0
- package/templates/hooks/ace.content-guard.sh +68 -0
- package/templates/hooks/ace.file-guard.sh +29 -0
- package/templates/hooks/ace.java-compile-check.sh +4 -2
- package/templates/hooks/ace.stop-verify.sh +28 -0
- package/templates/scripts/statusline-command.sh +2 -0
- package/templates/scripts/statusline.py +32 -0
- package/templates/settings.json +58 -2
- package/templates/hookify/hookify.ace.block-dangerous-ops.local.md +0 -16
- package/templates/hookify/hookify.ace.code-quality-gate.local.md +0 -45
- package/templates/hookify/hookify.ace.dangerous-commands.local.md +0 -20
- package/templates/hookify/hookify.ace.protect-secrets.local.md +0 -17
- package/templates/hookify/hookify.ace.require-verification.local.md +0 -13
- package/templates/hookify/hookify.ace.safe-git-commands.local.md +0 -38
- package/templates/hookify/hookify.ace.sensitive-data.local.md +0 -22
- /package/templates/{rules/ace → ace/rules}/clean-code.md +0 -0
- /package/templates/{rules/ace → ace/rules}/code-quality.md +0 -0
- /package/templates/{rules/ace → ace/rules}/context-hygiene.md +0 -0
- /package/templates/{rules/ace → ace/rules}/interactive-clarify.md +0 -0
- /package/templates/{rules/ace → ace/rules}/memory-policy.md +0 -0
- /package/templates/{rules/ace → ace/rules}/reporting.md +0 -0
- /package/templates/{rules/ace → ace/rules}/task-recovery.md +0 -0
package/templates/CLAUDE.md
CHANGED
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 交互语言
|
|
2
|
+
始终使用中文与用户交互。所有回复、解释、总结使用中文;代码和技术标识符保持英文。
|
|
2
3
|
|
|
3
4
|
<!-- ace:managed:start -->
|
|
4
|
-
|
|
5
|
-
- @~/.claude/rules/ace/thinking.md - 深度思考原则(序验深广辨简)
|
|
5
|
+
# ACE 配置
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
- @~/.claude/rules/ace/clean-code.md - Clean Code 核心原则(始终加载)
|
|
9
|
-
- @~/.claude/rules/ace/code-quality.md - 代码质量标准(编辑代码文件时加载)
|
|
7
|
+
## 核心原则(始终适用)
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
- @~/.claude/rules/ace/reporting.md - 报告输出规则
|
|
13
|
-
- @~/.claude/rules/ace/task-recovery.md - 任务恢复规则
|
|
14
|
-
- @~/.claude/rules/ace/context-hygiene.md - 上下文卫生与 Compaction 保护
|
|
9
|
+
**深度思考** — 理解先于规划,规划先于行动。用事实闭环,不以假设收尾。多问一层为什么,追问前提、追问替代、追问问题本身。在系统中定位局部。主动找反证,复杂度是负债。
|
|
15
10
|
|
|
16
|
-
|
|
17
|
-
- @~/.claude/rules/ace/memory-policy.md - Memory 质量策略
|
|
11
|
+
**Clean Code** — 意图清晰(命名即意图)、单一职责(一个理由改变)、最小 Surprise(做读者期望的事)、DRY(知识只表达一次)、简洁胜于复杂(KISS/YAGNI)、渐进改进(离开时更干净)。
|
|
18
12
|
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
**优先级** — 正确性 > 可读性 > 清晰 > 简单 > 显式。
|
|
14
|
+
|
|
15
|
+
## 编码规则(编辑代码前,先阅读对应规则文件)
|
|
16
|
+
- ~/.claude/ace/rules/code-quality.md — 代码质量标准(函数/命名/结构/SOLID 检查清单)
|
|
17
|
+
- ~/.claude/ace/rules/clean-code.md — Clean Code 详细原则与反模式速查
|
|
18
|
+
|
|
19
|
+
## 工作流规则(对应场景时参考)
|
|
20
|
+
- ~/.claude/ace/rules/context-hygiene.md — 上下文卫生与压缩保护(长任务时阅读)
|
|
21
|
+
- ~/.claude/ace/rules/task-recovery.md — 任务恢复流程(用户说"继续"时阅读)
|
|
22
|
+
- ~/.claude/ace/rules/reporting.md — 报告输出规则(生成报告前阅读)
|
|
23
|
+
- ~/.claude/ace/rules/memory-policy.md — 记忆质量策略(保存记忆前阅读)
|
|
24
|
+
- ~/.claude/ace/rules/interactive-clarify.md — 交互式澄清规则(需要提问时阅读)
|
|
25
|
+
- ~/.claude/ace/rules/git.md — Git 提交规范与分支命名(Git 操作时阅读)
|
|
26
|
+
- ~/.claude/ace/rules/gitflow.md — GitFlow 工作流(分支管理时阅读)
|
|
27
|
+
|
|
28
|
+
## 流程门禁优先级
|
|
29
|
+
Auto mode 不覆盖 auto-goal/aspec/OpenSpec 流程门禁。标注"不可跳过"的门禁步骤(需求澄清、设计澄清、审批确认)在任何执行模式下均必须执行,不得以"减少打断"为由跳过。
|
|
30
|
+
|
|
31
|
+
## 安全策略
|
|
32
|
+
安全由外部机制保障,不占用上下文 token:
|
|
33
|
+
- settings.json deny 规则 → 硬拦截 rm -rf、sudo 等
|
|
34
|
+
- Shell hooks → 进程级检查(编译、类型检查、内容审查)
|
|
21
35
|
<!-- ace:managed:end -->
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Git 规则
|
|
2
|
+
|
|
3
|
+
## 重要原则
|
|
4
|
+
- **重要**:不要自动提交 git 代码,除非有明确的提示
|
|
5
|
+
- 提交前确保代码通过所有测试
|
|
6
|
+
- 保持提交信息简洁明了,描述清楚变更内容
|
|
7
|
+
- 避免大型提交,尽量将变更分解为小的、相关的提交
|
|
8
|
+
|
|
9
|
+
## 提交规范
|
|
10
|
+
git 提交模板<type>(<scope>): <subject>,具体要求如下:
|
|
11
|
+
1. 注意冒号 : 后有空格
|
|
12
|
+
2. type 的枚举值有:
|
|
13
|
+
- feat: 新增功能
|
|
14
|
+
- fix: 修复 bug
|
|
15
|
+
- docs: 文档注释
|
|
16
|
+
- style: 代码格式(不影响代码运行的变动)
|
|
17
|
+
- refactor: 重构、优化(既不增加新功能, 也不是修复bug)
|
|
18
|
+
- perf: 性能优化
|
|
19
|
+
- test: 增加测试
|
|
20
|
+
- chore: 构建过程或辅助工具的变动
|
|
21
|
+
- revert: 回退
|
|
22
|
+
- build: 打包
|
|
23
|
+
3. 若 subject 中描述超过两种要点,请使用要点列表描述详情,每个要点使用-符号开头,多个换行,参考如下样例:
|
|
24
|
+
```
|
|
25
|
+
feat(web): implement email verification workflow
|
|
26
|
+
|
|
27
|
+
- Add email verification token generation service
|
|
28
|
+
- Create verification email template with dynamic links
|
|
29
|
+
- Add API endpoint for token validation
|
|
30
|
+
- Update user model with verification status field
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 分支管理
|
|
34
|
+
- main/master: 主分支,保持稳定可发布状态
|
|
35
|
+
- develop: 开发分支,包含最新开发特性
|
|
36
|
+
- feature/*: 功能分支,用于开发新功能
|
|
37
|
+
- bugfix/*: 修复分支,用于修复bug
|
|
38
|
+
- release/*: 发布分支,用于准备发布
|
|
39
|
+
|
|
40
|
+
**常用分支命名约定**:
|
|
41
|
+
|
|
42
|
+
| 分支类型 | 命名格式 | 示例 |
|
|
43
|
+
| ---------- | -------------------- | ------------------------- |
|
|
44
|
+
| 功能分支 | feature/[描述] | feature/user-auth |
|
|
45
|
+
| 修复分支 | fix/[问题ID]-[描述] | fix/issue-42-login-crash |
|
|
46
|
+
| 发布分支 | release/[版本] | release/v2.1.0 |
|
|
47
|
+
| 热修复分支 | hotfix/[版本]-[描述] | hotfix/v2.0.1-payment-fix |
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
|
|
2
|
+
# Gitflow工作流规则
|
|
3
|
+
|
|
4
|
+
## 主分支
|
|
5
|
+
|
|
6
|
+
### main(或master)
|
|
7
|
+
- 包含生产就绪代码
|
|
8
|
+
- 永远不要直接提交到main分支
|
|
9
|
+
- 只接受来自以下分支的合并:
|
|
10
|
+
- hotfix/* 分支
|
|
11
|
+
- release/* 分支
|
|
12
|
+
- 每次合并后必须使用版本号标记
|
|
13
|
+
|
|
14
|
+
### develop
|
|
15
|
+
- 主开发分支
|
|
16
|
+
- 包含最新交付的开发变更
|
|
17
|
+
- 功能分支的源分支
|
|
18
|
+
- 永远不要直接提交到develop分支
|
|
19
|
+
|
|
20
|
+
## 支持分支
|
|
21
|
+
|
|
22
|
+
### feature/*
|
|
23
|
+
- 从develop分支创建
|
|
24
|
+
- 合并回:develop
|
|
25
|
+
- 命名约定:feature/[issue-id]-描述性名称
|
|
26
|
+
- 示例:feature/123-user-authentication
|
|
27
|
+
- 创建PR前必须与develop分支保持同步
|
|
28
|
+
- 合并后删除
|
|
29
|
+
|
|
30
|
+
### release/*
|
|
31
|
+
- 从develop分支创建
|
|
32
|
+
- 合并回:
|
|
33
|
+
- main
|
|
34
|
+
- develop
|
|
35
|
+
- 命名约定:release/vX.Y.Z
|
|
36
|
+
- 示例:release/v1.2.0
|
|
37
|
+
- 仅进行bug修复、文档编写及与发布相关的任务
|
|
38
|
+
- 不添加新功能
|
|
39
|
+
- 合并后删除
|
|
40
|
+
|
|
41
|
+
### hotfix/*
|
|
42
|
+
- 从main分支创建
|
|
43
|
+
- 合并回:
|
|
44
|
+
- main
|
|
45
|
+
- develop
|
|
46
|
+
- 命名约定:hotfix/vX.Y.Z
|
|
47
|
+
- 示例:hotfix/v1.2.1
|
|
48
|
+
- 仅用于紧急生产环境修复
|
|
49
|
+
- 合并后删除
|
|
50
|
+
|
|
51
|
+
## 提交信息
|
|
52
|
+
|
|
53
|
+
- 格式:`type(scope): description`
|
|
54
|
+
- 类型:
|
|
55
|
+
- feat: 新功能
|
|
56
|
+
- fix: Bug修复
|
|
57
|
+
- docs: 文档变更
|
|
58
|
+
- style: 格式调整、缺失分号等
|
|
59
|
+
- refactor: 代码重构
|
|
60
|
+
- test: 添加测试
|
|
61
|
+
- chore: 维护任务
|
|
62
|
+
|
|
63
|
+
## 版本控制
|
|
64
|
+
|
|
65
|
+
### 语义化版本
|
|
66
|
+
- MAJOR版本用于不兼容的API变更
|
|
67
|
+
- MINOR版本用于向后兼容的功能性变更
|
|
68
|
+
- PATCH版本用于向后兼容的bug修复
|
|
69
|
+
|
|
70
|
+
## Pull Request规则
|
|
71
|
+
|
|
72
|
+
1. 所有变更必须通过Pull Request进行
|
|
73
|
+
2. 所需批准:至少1个
|
|
74
|
+
3. CI检查必须通过
|
|
75
|
+
4. 不允许直接提交到受保护分支(main, develop)
|
|
76
|
+
5. 合并前分支必须保持最新
|
|
77
|
+
6. 合并后删除分支
|
|
78
|
+
|
|
79
|
+
## 分支保护规则
|
|
80
|
+
|
|
81
|
+
### main和develop
|
|
82
|
+
- 要求Pull Request审核
|
|
83
|
+
- 要求状态检查通过
|
|
84
|
+
- 要求分支保持最新
|
|
85
|
+
- 限制规则包括管理员
|
|
86
|
+
- 禁止强制推送
|
|
87
|
+
- 禁止删除
|
|
88
|
+
|
|
89
|
+
## 发布流程
|
|
90
|
+
|
|
91
|
+
1. 从develop创建release分支
|
|
92
|
+
2. 更新版本号
|
|
93
|
+
3. 修复任何与发布相关的问题
|
|
94
|
+
4. 创建PR到main
|
|
95
|
+
5. 合并到main后:
|
|
96
|
+
- 标记发布
|
|
97
|
+
- 合并回develop
|
|
98
|
+
- 删除release分支
|
|
99
|
+
|
|
100
|
+
## 热修复流程
|
|
101
|
+
|
|
102
|
+
1. 从main创建hotfix分支
|
|
103
|
+
2. 修复问题
|
|
104
|
+
3. 更新patch版本号
|
|
105
|
+
4. 创建PR到main
|
|
106
|
+
5. 合并到main后:
|
|
107
|
+
- 标记发布
|
|
108
|
+
- 合并回develop
|
|
109
|
+
- 删除hotfix分支
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
**深** — 多问一层为什么。表面问题是深层问题的症状。抵达机制层和根因层才算理解。
|
|
14
14
|
|
|
15
|
+
苏格拉底式追问:
|
|
16
|
+
- 追问前提:"这个假设成立吗?依据是什么?"
|
|
17
|
+
- 追问替代:"还有没有其他解释?"
|
|
18
|
+
- 追问问题本身:"这是正确的问题吗?问题框架对吗?"
|
|
19
|
+
|
|
15
20
|
**广** — 在系统中定位局部。一切都有上下文、依赖和边界。改动一处,影响传向何方?
|
|
16
21
|
|
|
17
22
|
**辨** — 主动为自己的结论找反证。方案都有代价,判断都有前提。区分事实、推断与猜测,对不确定性诚实。
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Bash Command Guard — PreToolUse Hook
|
|
3
|
+
# 合并规则: block-dangerous-ops, dangerous-commands, safe-git-commands
|
|
4
|
+
# exit 0 = 允许(stdout 作为警告信息传递给模型)
|
|
5
|
+
# exit 2 = 阻止执行
|
|
6
|
+
|
|
7
|
+
# NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
|
|
8
|
+
set -uo pipefail
|
|
9
|
+
|
|
10
|
+
INPUT=$(cat)
|
|
11
|
+
|
|
12
|
+
# 提取命令:替换转义引号为占位符,用 grep -o 精确匹配 JSON value,再还原
|
|
13
|
+
COMMAND=$(echo "$INPUT" | sed 's/\\"/\x01/g' | grep -o '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"command"[[:space:]]*:[[:space:]]*"//;s/"$//' | sed 's/\x01/\\"/g' || true)
|
|
14
|
+
|
|
15
|
+
[[ -z "$COMMAND" ]] && exit 0
|
|
16
|
+
|
|
17
|
+
# === BLOCK: 高危操作,直接阻止 ===
|
|
18
|
+
|
|
19
|
+
BLOCK_PATTERNS=(
|
|
20
|
+
'rm\s+-rf'
|
|
21
|
+
'rm\s+-r\s'
|
|
22
|
+
'rm\s+.*--recursive'
|
|
23
|
+
'git\s+push\s+(.*\s)?-f(\s|$)'
|
|
24
|
+
'git\s+push\s+.*--force(\s|$)'
|
|
25
|
+
'DROP\s+TABLE'
|
|
26
|
+
'TRUNCATE\s+TABLE'
|
|
27
|
+
'git\s+reset\s+--hard'
|
|
28
|
+
'git\s+clean\s+-fd'
|
|
29
|
+
'git\s+clean\s+-ffd'
|
|
30
|
+
'sudo\s+'
|
|
31
|
+
'dd\s+if='
|
|
32
|
+
'mkfs\.'
|
|
33
|
+
'format\s+[A-Za-z]:'
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
for pattern in "${BLOCK_PATTERNS[@]}"; do
|
|
37
|
+
if echo "$COMMAND" | grep -qiE "$pattern"; then
|
|
38
|
+
echo "⛔ 危险操作已阻止!"
|
|
39
|
+
echo ""
|
|
40
|
+
echo "匹配规则: $pattern"
|
|
41
|
+
echo "命令: $COMMAND"
|
|
42
|
+
echo ""
|
|
43
|
+
echo "如确需执行,请手动在终端中运行。"
|
|
44
|
+
exit 2
|
|
45
|
+
fi
|
|
46
|
+
done
|
|
47
|
+
|
|
48
|
+
# === WARN: 风险操作,允许但警告 ===
|
|
49
|
+
|
|
50
|
+
WARN_PATTERNS=(
|
|
51
|
+
'git\s+push\s+.*--force-with-lease'
|
|
52
|
+
'git\s+rebase\s+-i'
|
|
53
|
+
'git\s+commit\s+--amend'
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
for pattern in "${WARN_PATTERNS[@]}"; do
|
|
57
|
+
if echo "$COMMAND" | grep -qiE "$pattern"; then
|
|
58
|
+
echo "⚠️ Git 风险操作提醒"
|
|
59
|
+
echo ""
|
|
60
|
+
echo "命令: $COMMAND"
|
|
61
|
+
echo ""
|
|
62
|
+
case "$COMMAND" in
|
|
63
|
+
*force-with-lease*) echo "提醒: --force-with-lease 相对安全,但仍会覆盖远程历史" ;;
|
|
64
|
+
*rebase*) echo "提醒: 仅对本地未推送的提交使用 rebase -i" ;;
|
|
65
|
+
*amend*) echo "提醒: 仅修改本地最新未推送的提交" ;;
|
|
66
|
+
esac
|
|
67
|
+
exit 0
|
|
68
|
+
fi
|
|
69
|
+
done
|
|
70
|
+
|
|
71
|
+
exit 0
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Content Guard — PostToolUse Hook
|
|
3
|
+
# 检测写入内容中的硬编码凭证和调试代码残留
|
|
4
|
+
# exit 0 = 无问题, exit 1 = 发现问题(反馈给模型)
|
|
5
|
+
|
|
6
|
+
# NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
|
|
7
|
+
set -uo pipefail
|
|
8
|
+
|
|
9
|
+
INPUT=$(cat)
|
|
10
|
+
|
|
11
|
+
# 提取 file_path(文件路径不含转义引号,简单模式安全)
|
|
12
|
+
FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//' || true)
|
|
13
|
+
|
|
14
|
+
[[ -z "$FILE_PATH" ]] && exit 0
|
|
15
|
+
|
|
16
|
+
# 提取待检查内容:取 "new_string": 或 "content": 之后的全部文本
|
|
17
|
+
# 策略:不做精确 JSON value 提取(转义引号会截断),而是检查 key 之后的原始文本
|
|
18
|
+
# 在 Claude Code 的 JSON 中,old_string 位于 new_string 之前,不会误报
|
|
19
|
+
CHECK_CONTENT=""
|
|
20
|
+
if echo "$INPUT" | grep -q '"new_string"'; then
|
|
21
|
+
CHECK_CONTENT=$(echo "$INPUT" | sed 's/.*"new_string"[[:space:]]*:[[:space:]]*//')
|
|
22
|
+
elif echo "$INPUT" | grep -q '"content"'; then
|
|
23
|
+
CHECK_CONTENT=$(echo "$INPUT" | sed 's/.*"content"[[:space:]]*:[[:space:]]*//')
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
[[ -z "$CHECK_CONTENT" ]] && exit 0
|
|
27
|
+
|
|
28
|
+
ISSUES=""
|
|
29
|
+
|
|
30
|
+
# === 检测硬编码凭证 ===
|
|
31
|
+
if echo "$CHECK_CONTENT" | grep -qiE '(API_KEY|API_SECRET|SECRET_KEY|ACCESS_TOKEN|PASSWORD|PWD)\s*[=:]\s*["\x27][^"\x27]+["\x27]'; then
|
|
32
|
+
ISSUES="${ISSUES}⚠️ 检测到可能的硬编码凭证 (API_KEY/SECRET/TOKEN/PASSWORD)\n"
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# === 检测源代码中的调试残留(仅针对代码文件)===
|
|
36
|
+
case "$FILE_PATH" in
|
|
37
|
+
*.java)
|
|
38
|
+
if echo "$CHECK_CONTENT" | grep -qE 'System\.(out|err)\.print'; then
|
|
39
|
+
ISSUES="${ISSUES}⚠️ 检测到 System.out/err.print — 请使用 Logger\n"
|
|
40
|
+
fi
|
|
41
|
+
;;
|
|
42
|
+
*.js|*.ts|*.tsx)
|
|
43
|
+
if echo "$CHECK_CONTENT" | grep -qE 'console\.(log|debug|warn|error)'; then
|
|
44
|
+
ISSUES="${ISSUES}⚠️ 检测到 console.log — 请确认是否为调试残留\n"
|
|
45
|
+
fi
|
|
46
|
+
if echo "$CHECK_CONTENT" | grep -qE '\bdebugger\b'; then
|
|
47
|
+
ISSUES="${ISSUES}⚠️ 检测到 debugger 语句\n"
|
|
48
|
+
fi
|
|
49
|
+
;;
|
|
50
|
+
*.py)
|
|
51
|
+
if echo "$CHECK_CONTENT" | grep -qE 'print\('; then
|
|
52
|
+
ISSUES="${ISSUES}⚠️ 检测到 print() — 请确认是否为调试残留\n"
|
|
53
|
+
fi
|
|
54
|
+
if echo "$CHECK_CONTENT" | grep -qE 'breakpoint\(\)'; then
|
|
55
|
+
ISSUES="${ISSUES}⚠️ 检测到 breakpoint()\n"
|
|
56
|
+
fi
|
|
57
|
+
;;
|
|
58
|
+
esac
|
|
59
|
+
|
|
60
|
+
if [[ -n "$ISSUES" ]]; then
|
|
61
|
+
echo "🔍 内容安全检查发现问题:"
|
|
62
|
+
echo ""
|
|
63
|
+
printf "%b" "$ISSUES"
|
|
64
|
+
echo "文件: $FILE_PATH"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
exit 0
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# File Guard — PreToolUse Hook
|
|
3
|
+
# 规则: protect-secrets
|
|
4
|
+
# 检测对敏感文件的编辑操作,输出警告
|
|
5
|
+
# exit 0 + stdout = 警告(不阻止)
|
|
6
|
+
|
|
7
|
+
# NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
|
|
8
|
+
set -uo pipefail
|
|
9
|
+
|
|
10
|
+
INPUT=$(cat)
|
|
11
|
+
|
|
12
|
+
FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//' || true)
|
|
13
|
+
|
|
14
|
+
[[ -z "$FILE_PATH" ]] && exit 0
|
|
15
|
+
|
|
16
|
+
SENSITIVE_PATTERNS='\.env$|\.env\.|credentials|\.key$|secrets|\.pem$|\.p12$|password|\.keystore$|\.jks$'
|
|
17
|
+
|
|
18
|
+
if echo "$FILE_PATH" | grep -qiE "$SENSITIVE_PATTERNS"; then
|
|
19
|
+
echo "⚠️ 敏感文件编辑警告"
|
|
20
|
+
echo ""
|
|
21
|
+
echo "文件: $FILE_PATH"
|
|
22
|
+
echo ""
|
|
23
|
+
echo "请确认:"
|
|
24
|
+
echo "- 文件已加入 .gitignore"
|
|
25
|
+
echo "- 未硬编码任何凭据或密钥"
|
|
26
|
+
echo "- 使用环境变量引用敏感值"
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
exit 0
|
|
@@ -92,7 +92,8 @@ COMPILE_OUTPUT=$(timeout 30 bash -c "$COMPILE_CMD" 2>&1) || {
|
|
|
92
92
|
echo "⏱ Java 编译超时(30s),跳过本次检查。请手动验证。"
|
|
93
93
|
exit 0
|
|
94
94
|
fi
|
|
95
|
-
# 编译失败 — 喧嚣输出
|
|
95
|
+
# 编译失败 — 喧嚣输出 + 留下标记供 Stop hook 检查
|
|
96
|
+
touch /tmp/.claude-java-compile-failed
|
|
96
97
|
echo "❌ Java 编译失败!修改文件: $(basename "$FILE_PATH")"
|
|
97
98
|
echo "项目: $PROJECT_ROOT"
|
|
98
99
|
echo ""
|
|
@@ -102,5 +103,6 @@ COMPILE_OUTPUT=$(timeout 30 bash -c "$COMPILE_CMD" 2>&1) || {
|
|
|
102
103
|
exit 1
|
|
103
104
|
}
|
|
104
105
|
|
|
105
|
-
# 编译成功 —
|
|
106
|
+
# 编译成功 — 静默退出,清除失败标记
|
|
107
|
+
rm -f /tmp/.claude-java-compile-failed
|
|
106
108
|
exit 0
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Stop Hook — 交付前验证
|
|
3
|
+
# 合并规则: require-verification + Java 编译检查
|
|
4
|
+
# exit 0 = 允许停止, exit 2 = 阻止停止(强制继续)
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
INPUT=$(cat)
|
|
9
|
+
|
|
10
|
+
ISSUES=""
|
|
11
|
+
|
|
12
|
+
# === 检查 Java 编译失败标记 ===
|
|
13
|
+
FAIL_MARKER="/tmp/.claude-java-compile-failed"
|
|
14
|
+
if [[ -f "$FAIL_MARKER" ]]; then
|
|
15
|
+
ISSUES="${ISSUES}❌ Java 编译未通过,请先修复编译错误\n"
|
|
16
|
+
rm -f "$FAIL_MARKER"
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# 如果有阻塞性问题,阻止停止
|
|
20
|
+
if [[ -n "$ISSUES" ]]; then
|
|
21
|
+
echo "⛔ 交付前验证未通过:"
|
|
22
|
+
echo ""
|
|
23
|
+
echo -e "$ISSUES"
|
|
24
|
+
echo "请修复以上问题后再结束任务。"
|
|
25
|
+
exit 2
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
exit 0
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import sys, json, subprocess
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
d = json.load(sys.stdin)
|
|
5
|
+
except Exception:
|
|
6
|
+
print('')
|
|
7
|
+
sys.exit(0)
|
|
8
|
+
|
|
9
|
+
cwd = d.get('workspace', {}).get('current_dir', '')
|
|
10
|
+
model = d.get('model', {}).get('display_name', '')
|
|
11
|
+
used = d.get('context_window', {}).get('used_percentage')
|
|
12
|
+
|
|
13
|
+
parts = []
|
|
14
|
+
if model:
|
|
15
|
+
parts.append(model)
|
|
16
|
+
if used is not None:
|
|
17
|
+
parts.append(f'ctx:{round(used)}%')
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
branch = subprocess.check_output(
|
|
21
|
+
['git', '-C', cwd, 'rev-parse', '--abbrev-ref', 'HEAD'],
|
|
22
|
+
stderr=subprocess.DEVNULL, text=True
|
|
23
|
+
).strip()
|
|
24
|
+
if branch:
|
|
25
|
+
parts.append(branch)
|
|
26
|
+
except Exception:
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
if cwd:
|
|
30
|
+
parts.append(cwd.rstrip('/').split('/')[-1])
|
|
31
|
+
|
|
32
|
+
print(' | '.join(parts))
|
package/templates/settings.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"effortLevel": "high",
|
|
2
3
|
"permissions": {
|
|
3
4
|
"allow": [
|
|
4
5
|
"Bash(*)",
|
|
@@ -39,9 +40,64 @@
|
|
|
39
40
|
"PostToolUse": []
|
|
40
41
|
}
|
|
41
42
|
},
|
|
42
|
-
"hooks": {
|
|
43
|
+
"hooks": {
|
|
44
|
+
"PreToolUse": [
|
|
45
|
+
{
|
|
46
|
+
"matcher": "Bash",
|
|
47
|
+
"hooks": [
|
|
48
|
+
{
|
|
49
|
+
"type": "command",
|
|
50
|
+
"command": "bash ~/.claude/hooks/ace.bash-guard.sh",
|
|
51
|
+
"timeout": 5000
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"matcher": "Edit|Write",
|
|
57
|
+
"hooks": [
|
|
58
|
+
{
|
|
59
|
+
"type": "command",
|
|
60
|
+
"command": "bash ~/.claude/hooks/ace.file-guard.sh",
|
|
61
|
+
"timeout": 5000
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"PostToolUse": [
|
|
67
|
+
{
|
|
68
|
+
"matcher": "Edit|Write",
|
|
69
|
+
"hooks": [
|
|
70
|
+
{
|
|
71
|
+
"type": "command",
|
|
72
|
+
"command": "bash ~/.claude/hooks/ace.java-compile-check.sh",
|
|
73
|
+
"timeout": 35000
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "command",
|
|
77
|
+
"command": "bash ~/.claude/hooks/ace.content-guard.sh",
|
|
78
|
+
"timeout": 5000
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"Stop": [
|
|
84
|
+
{
|
|
85
|
+
"matcher": "*",
|
|
86
|
+
"hooks": [
|
|
87
|
+
{
|
|
88
|
+
"type": "command",
|
|
89
|
+
"command": "bash ~/.claude/hooks/ace.stop-verify.sh",
|
|
90
|
+
"timeout": 10000
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"statusLine": {
|
|
97
|
+
"type": "command",
|
|
98
|
+
"command": "bash ~/.claude/scripts/statusline-command.sh"
|
|
99
|
+
},
|
|
43
100
|
"enabledPlugins": {
|
|
44
|
-
"hookify@claude-plugins-official": true,
|
|
45
101
|
"revealjs@revealjs-skill": true,
|
|
46
102
|
"ace@ace-local": true
|
|
47
103
|
},
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: block-dangerous-ops
|
|
3
|
-
enabled: true
|
|
4
|
-
event: bash
|
|
5
|
-
pattern: rm\s+-rf|git\s+push\s+.*(-f|--force)|DROP\s+TABLE|TRUNCATE\s+TABLE|git\s+reset\s+--hard|git\s+clean\s+-fd
|
|
6
|
-
action: block
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**危险操作已阻止!**
|
|
10
|
-
|
|
11
|
-
检测到高风险命令,已自动拦截。请确认:
|
|
12
|
-
- 是否真的需要执行此操作?
|
|
13
|
-
- 是否有更安全的替代方案?
|
|
14
|
-
- 数据是否已备份?
|
|
15
|
-
|
|
16
|
-
如确需执行,请手动在终端中运行。
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-quality-gate
|
|
3
|
-
enabled: true
|
|
4
|
-
event: file
|
|
5
|
-
conditions:
|
|
6
|
-
- field: file_extension
|
|
7
|
-
operator: in
|
|
8
|
-
value: [".js", ".ts", ".tsx", ".java", ".py", ".go", ".rs"]
|
|
9
|
-
action: warn
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
**代码质量检查**
|
|
13
|
-
|
|
14
|
-
保存代码文件时,请自检以下项目:
|
|
15
|
-
|
|
16
|
-
## 检查清单
|
|
17
|
-
|
|
18
|
-
### 1. 调试代码
|
|
19
|
-
- [ ] 已移除 `console.log` / `System.out.println` / `print`
|
|
20
|
-
- [ ] 已移除 `debugger;` 语句
|
|
21
|
-
- [ ] 已移除临时代码注释 (`// TEMP`, `// HACK`)
|
|
22
|
-
|
|
23
|
-
### 2. 代码规范
|
|
24
|
-
- [ ] 函数长度适中(理想 20 行内,最多 30 行)
|
|
25
|
-
- [ ] 嵌套深度不超过 3 层
|
|
26
|
-
- [ ] 无魔法值,使用命名常量
|
|
27
|
-
- [ ] 错误处理显性化
|
|
28
|
-
|
|
29
|
-
### 3. 测试相关
|
|
30
|
-
- [ ] 新增代码有对应测试
|
|
31
|
-
- [ ] 测试能通过
|
|
32
|
-
- [ ] 考虑边界条件
|
|
33
|
-
|
|
34
|
-
### 4. 敏感信息
|
|
35
|
-
- [ ] 无硬编码密码/API Key
|
|
36
|
-
- [ ] 配置文件使用环境变量
|
|
37
|
-
|
|
38
|
-
## 代码异味标记
|
|
39
|
-
|
|
40
|
-
| 标记 | 含义 | 建议 |
|
|
41
|
-
|------|------|------|
|
|
42
|
-
| `TODO` | 待办事项 | 确保有跟进计划 |
|
|
43
|
-
| `FIXME` | 需要修复 | 优先处理或创建 Issue |
|
|
44
|
-
| `HACK` | 临时方案 | 记录原因,计划重构 |
|
|
45
|
-
| `XXX` | 警告标记 | 高风险代码,需要审查 |
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: block-dangerous-commands
|
|
3
|
-
enabled: true
|
|
4
|
-
event: bash
|
|
5
|
-
pattern: rm\s+-rf|sudo\s+|dd\s+if=|mkfs|format\s+|>:\s*/
|
|
6
|
-
action: block
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
**危险命令 detected!**
|
|
10
|
-
|
|
11
|
-
此命令可能造成数据丢失或系统损坏:
|
|
12
|
-
- `rm -rf` - 强制递归删除
|
|
13
|
-
- `sudo` - 特权执行
|
|
14
|
-
- `dd if=` / `mkfs` / `format` - 磁盘操作
|
|
15
|
-
- `> /path` - 重定向到系统文件
|
|
16
|
-
|
|
17
|
-
请确认:
|
|
18
|
-
1. 路径是否正确
|
|
19
|
-
2. 是否有备份
|
|
20
|
-
3. 是否可以使用更安全的方式
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: protect-secrets
|
|
3
|
-
enabled: true
|
|
4
|
-
event: file
|
|
5
|
-
conditions:
|
|
6
|
-
- field: file_path
|
|
7
|
-
operator: regex_match
|
|
8
|
-
pattern: \.env$|\.env\.|credentials|\.key$|secrets|\.pem$|\.p12$|password
|
|
9
|
-
action: warn
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
**敏感文件编辑警告!**
|
|
13
|
-
|
|
14
|
-
正在编辑可能包含敏感信息的文件。请确认:
|
|
15
|
-
- 文件已加入 .gitignore
|
|
16
|
-
- 未硬编码任何凭据或密钥
|
|
17
|
-
- 使用环境变量引用敏感值
|