@shirayner/ace 0.1.7 → 0.1.8-SNAPSHOT.2
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/openspec/config.yaml +43 -12
- 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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
schema: spec-driven
|
|
2
|
-
version:
|
|
2
|
+
version: 11.0.0
|
|
3
3
|
context: |
|
|
4
4
|
## 语言
|
|
5
5
|
所有交互、思考链、文档一律使用中文。OpenSpec 英文标题保留。
|
|
@@ -23,11 +23,30 @@ context: |
|
|
|
23
23
|
- 惊讶测试:替用户做选择时,若用户看到会惊讶 → 暂停展示选项
|
|
24
24
|
- 对齐内容用 markdown 文本输出(大段内容在 AskUserQuestion 中显示异常),确认通过 AskUserQuestion
|
|
25
25
|
|
|
26
|
-
##
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
26
|
+
## 深度认知方法论
|
|
27
|
+
|
|
28
|
+
### 苏格拉底式追问(分析时在内部执行)
|
|
29
|
+
- **追问目的**:用户为什么要这个?解决什么根本问题?做了之后谁受益?
|
|
30
|
+
- **追问完整性**:说的是全貌还是冰山一角?关联问题?前置依赖?
|
|
31
|
+
- **追问前提**:假设成立吗?有更好的问题框架吗?是不是在解决错误的问题?
|
|
32
|
+
- **追问约束**:什么不能动?硬限制?时间/资源/技术债/团队认知负担?
|
|
33
|
+
|
|
34
|
+
目标:不只理解用户说了什么,而是理解用户**真正需要**什么——包括他们没意识到的部分。
|
|
35
|
+
|
|
36
|
+
### 引导性提问(澄清时使用)
|
|
37
|
+
不使用纯选择题。通过引导性提问暴露用户没想到的维度:
|
|
38
|
+
- "你提到了 X,但我注意到这还关联到 Y——这是否也在范围内?"
|
|
39
|
+
- "如果做了 X 但不处理 Y,后续有什么风险?"
|
|
40
|
+
- "在这几个约束中,你的首要优先级是什么?"
|
|
41
|
+
|
|
42
|
+
### 对齐确认四要素
|
|
43
|
+
1. **我的理解** — 复述核心意图 + 分析中发现的关联问题
|
|
44
|
+
2. **方案方向** — 高层策略(非实现细节)
|
|
45
|
+
3. **关键假设** — 不确定的假设,显式标注
|
|
46
|
+
4. **完成标准** — 可测试的验收条件
|
|
47
|
+
|
|
48
|
+
### 深度聚焦
|
|
49
|
+
不遍历维度清单做广度扫描。聚焦于:最不确定的、返工成本最高的、dimensions.md 盲区相关的。
|
|
31
50
|
|
|
32
51
|
## 文件约定
|
|
33
52
|
- 需求问题:issues/requirement-issues.md(id, description, severity, status, answer)
|
|
@@ -49,9 +68,14 @@ rules:
|
|
|
49
68
|
- "[PRE] 读取 experience.md 需求相关经验,告知用户"
|
|
50
69
|
- |
|
|
51
70
|
[PRE] 需求澄清流程(三步顺序执行,每步完成后再进入下一步):
|
|
52
|
-
1.
|
|
53
|
-
|
|
54
|
-
|
|
71
|
+
1. **苏格拉底分析→写入** — 运用四追问(目的/完整性/前提/约束)深度分析需求:
|
|
72
|
+
- 不只列"缺失信息",要追问"为什么需要?""前提成立吗?""影响范围完整吗?"
|
|
73
|
+
- 参考 dimensions.md 盲区,识别高风险不确定性
|
|
74
|
+
- 结果写入 issues/requirement-issues.md,每个问题含:追问链路 + 为何重要(返工成本)
|
|
75
|
+
2. **引导性澄清** — 通过 AskUserQuestion 澄清 High/Medium 问题:
|
|
76
|
+
- 不使用纯选择题,采用引导性提问暴露用户未察觉的维度
|
|
77
|
+
- 主动指出关联:"我注意到 X 还涉及 Y,是否在范围内?"
|
|
78
|
+
3. **结构化对齐** — 用 markdown 展示四要素(我的理解/方案方向/关键假设/完成标准),再通过 AskUserQuestion 确认
|
|
55
79
|
- |
|
|
56
80
|
🚫 GATE: 满足以下全部条件前,禁止创建 proposal:
|
|
57
81
|
- issues/requirement-issues.md 已创建且 High/Medium 问题已澄清
|
|
@@ -64,9 +88,16 @@ rules:
|
|
|
64
88
|
- "[PRE] 读取 experience.md 技术相关经验,告知用户"
|
|
65
89
|
- |
|
|
66
90
|
[PRE] 设计澄清流程(三步顺序执行,每步完成后再进入下一步):
|
|
67
|
-
1.
|
|
68
|
-
|
|
69
|
-
|
|
91
|
+
1. **苏格拉底分析→写入** — 运用四追问深度分析技术方案:
|
|
92
|
+
- 追问目的:架构决策服务什么质量属性?
|
|
93
|
+
- 追问完整性:遗漏的交互场景或失败模式?
|
|
94
|
+
- 追问前提:技术选型的隐含假设(性能、规模、团队能力)是否成立?
|
|
95
|
+
- 追问约束:现有系统/团队/时间的硬限制?
|
|
96
|
+
- 结果写入 issues/design-issues.md,每个决策含:备选方案 + 排除理由 + 风险
|
|
97
|
+
2. **引导性澄清** — 通过 AskUserQuestion 澄清 High/Medium 决策:
|
|
98
|
+
- 即使无问题也须展示决策摘要
|
|
99
|
+
- 主动暴露取舍:"方案 A 更简单但 X 场景有风险,方案 B 更复杂但覆盖更全——优先级?"
|
|
100
|
+
3. **结构化对齐** — 用 markdown 展示四要素(我的理解/方案方向/关键假设/完成标准),再通过 AskUserQuestion 确认
|
|
70
101
|
- |
|
|
71
102
|
🚫 GATE: 满足以下全部条件前,禁止创建 design.md:
|
|
72
103
|
- issues/design-issues.md 已创建且 High/Medium 决策已澄清
|
|
@@ -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
|
-
如确需执行,请手动在终端中运行。
|