@shirayner/ace 0.1.8 → 0.1.10-SNAPSHOT

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 CHANGED
@@ -27,7 +27,7 @@ ACE 是一个**AI 开发环境配置工具**,基于 Claude Code 官方最佳
27
27
 
28
28
  - 🧠 **认知增强规则** — 8 条基于认知科学的深度思考与代码质量原则
29
29
  - 🤖 **专业级 AI Skills** — 4 个面向不同开发场景的智能技能
30
- - 🛡️ **安全防护体系** — Shell Hooks 守卫 + Settings Deny 规则双重保障
30
+ - 🛡️ **安全防护体系** — Hookify 守卫 + 角色脚本双重保障
31
31
  - 📝 **规范驱动工作流** — OpenSpec 集成的需求管理体系
32
32
  - 🧩 **跨会话记忆系统** — 持久化的开发者画像与项目记忆
33
33
 
@@ -76,7 +76,7 @@ $ ace init
76
76
  │ Customize
77
77
  │ Change role edit ~/.claude/memory/user_profile.md
78
78
  │ Adjust rules edit ~/.claude/rules/ace/
79
- │ Safety guards edit ~/.claude/settings.json (deny rules)
79
+ │ Safety guards edit ~/.claude/hookify.ace.*.local.md
80
80
  │ Verify setup ace doctor
81
81
 
82
82
  └ Done. Go to your project and run ace spec init.
@@ -151,7 +151,7 @@ $ ace doctor
151
151
  ✓ CLAUDE.md 配置正常
152
152
  ✓ 8 条规则文件完整
153
153
  ✓ 4 个 Skills 可正常加载
154
- Hooks 安全守卫运行中
154
+ Hookify 插件运行中
155
155
  ✓ 记忆目录可访问
156
156
  All systems operational.
157
157
  ```
@@ -166,17 +166,17 @@ All systems operational.
166
166
  ├─────────────────────────────────────────────────────────────┤
167
167
  │ │
168
168
  │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
169
- │ │ Rules │ │ Skills │ │ Hooks │ │
170
- │ │ (8 规则) │ │ (4 技能) │ │ (Shell守卫) │ │
169
+ │ │ Rules │ │ Skills │ │ Hookify │ │
170
+ │ │ (8 规则) │ │ (4 技能) │ │ (3 守卫) │ │
171
171
  │ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
172
- │ │ • thinking │ │ • auto-goal │ │ • bash- │ │
173
- │ │ • clean-code│ │ • coding │ │ guard │ │
174
- │ │ • code-qual │ │ • skill- │ │ • file- │ │
175
- │ │ • reporting │ │ creator │ │ guard │ │
176
- │ │ • task-rec │ │ • skill- │ │ • content- │ │
177
- │ │ • context- │ │ optimize │ │ guard │ │
178
- │ │ hygiene │ │ │ │ • java- │ │
179
- │ │ • memory- │ │ │ │ compile │ │
172
+ │ │ • thinking │ │ • auto-goal │ │ • block- │ │
173
+ │ │ • clean-code│ │ • coding │ │ dangerous │ │
174
+ │ │ • code-qual │ │ • skill- │ │ • protect- │ │
175
+ │ │ • reporting │ │ creator │ │ secrets │ │
176
+ │ │ • task-rec │ │ • skill- │ │ • require- │ │
177
+ │ │ • context- │ │ optimize │ │ verify │ │
178
+ │ │ hygiene │ │ │ │ │ │
179
+ │ │ • memory- │ │ │ │ │ │
180
180
  │ │ policy │ │ │ │ │ │
181
181
  │ │ • interactive│ │ │ │ │ │
182
182
  │ └─────────────┘ └─────────────┘ └─────────────┘ │
@@ -242,7 +242,7 @@ ace init
242
242
  - 全局 CLAUDE.md 索引
243
243
  - 8 条认知规则
244
244
  - 4 个 AI Skills
245
- - Shell Hooks 安全守卫
245
+ - Hookify 安全守卫
246
246
  - 角色特定脚本和开发者画像
247
247
 
248
248
  ### 3. 验证安装
@@ -284,7 +284,7 @@ claude
284
284
  - [8 条规则详解](docs/architecture/rules.md) — 每条规则的用途与设计
285
285
  - [4 个 Skills 详解](docs/architecture/skills.md) — 工作原理与最佳实践
286
286
  - [aspec 规范驱动](docs/architecture/aspec.md) — spec coding 完整工作流
287
- - [Shell Hooks 安全体系](docs/architecture/hooks.md)
287
+ - [Hookify 安全体系](docs/architecture/hookify.md)
288
288
  - [Hooks 角色脚本](docs/architecture/hooks.md)
289
289
  - [记忆系统](docs/architecture/memory.md)
290
290
  - [OpenSpec 集成](docs/architecture/spec.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shirayner/ace",
3
- "version": "0.1.8",
3
+ "version": "0.1.10-SNAPSHOT",
4
4
  "description": "AI Coding Environment - One command to set up your Claude Code harness",
5
5
  "bin": {
6
6
  "ace": "./bin/ace.js"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ace",
3
- "version": "0.1.8-SNAPSHOT.5",
3
+ "version": "0.1.8-SNAPSHOT",
4
4
  "description": "AI Coding Environment - Skills and commands for Claude Code",
5
5
  "author": {
6
6
  "name": "shirayner"
@@ -21,42 +21,21 @@ description: |
21
21
 
22
22
  ## 硬规则(不可跳过)
23
23
 
24
- ### 规则 0:Pre-execution Checkpoint(结构性屏障)
25
-
26
- **在发出第一个修改性工具调用(Edit/Write/创建或修改文件的 Bash)之前,必须通过此检查:**
27
-
28
- > 我是否已完成 Step 3 的对齐确认,且用户已通过 AskUserQuestion 确认?
29
-
30
- - **是** → 继续执行
31
- - **否** → **立即停止**,返回规则 1 执行对齐流程
32
-
33
- 此规则存在的原因:auto mode 的"立即执行"指令会与对齐要求冲突。当模型感到"这个任务很简单,不需要对齐"时,恰恰是最需要对齐的时刻——因为"简单"往往意味着隐含决策被忽略了。
34
-
35
- **Auto mode 优化的是执行效率,不是对齐质量。跳过对齐不是"更快"——是"更可能做错"。**
36
-
37
24
  ### 规则 1:首轮对齐(MANDATORY — 优先于 auto mode)
38
25
 
39
26
  接收目标后,**必须完成以下三步才能开始执行**。
40
27
 
41
- **Step 1: 苏格拉底式分析(AI 内部推理,不直接展示给用户)** 这是思维方法,不是输出格式。结合已有上下文(memory、CLAUDE.md、git status、会话历史)和探索性工具(Read/Grep/Glob/Agent),在内部深入分析目标。
28
+ **Step 1: 苏格拉底式分析**结合已有上下文(memory、CLAUDE.md、git status、会话历史)和探索性工具(Read/Grep/Glob/Agent),并行执行,形成对目标的深层理解。
42
29
 
43
- 在思考过程中执行以下追问,形成深层理解:
30
+ 分析时在内部(思考过程中)进行苏格拉底式追问:
44
31
  - **追问目的**:用户为什么要做这个?解决什么根本问题?做了之后谁受益?
45
32
  - **追问完整性**:用户说的是全貌还是冰山一角?有没有没意识到的关联问题或前置依赖?
46
33
  - **追问前提**:用户的假设成立吗?有没有更好的问题框架?是不是在解决错误的问题?
47
34
  - **追问约束**:什么不能动?什么是硬限制?时间/资源/技术债/团队认知负担?
48
35
 
49
- 输出:不是追问本身,而是经分析后形成的深层理解(用于指导 Step 2 的提问设计和 Step 3 的对齐展示)。
50
36
  目标:不只是理解用户说了什么,而是理解用户**真正需要**什么——包括他们自己可能没意识到的部分。
51
37
 
52
- **Step 2: 澄清** — 基于 Step 1 的内部分析结论,设计面向用户的具体问题,**调用 AskUserQuestion 工具**批量澄清歧义和关键决策点。问题应具体、可行动、关联用户场景,而非重复抽象的苏格拉底追问。复杂项目可多轮澄清。
53
-
54
- 跳过条件(必须**同时满足全部**才可跳过 Step 2,直接进入 Step 3):
55
- - 用户在**同一会话中**已明确表达过完整意图,且你在 Step 1 分析后未发现任何隐含决策点
56
- - 不存在"用户可能会惊讶"的假设需要验证
57
- - 任务是对前一个已对齐目标的延续性修复(而非新目标)
58
-
59
- **如果不确定是否需要澄清 → 澄清。** 默认执行,跳过是例外。
38
+ **Step 2: 澄清** — **调用 AskUserQuestion 工具**向用户批量澄清歧义和关键决策点。复杂项目可多轮澄清。仅当目标完全明确无歧义时可跳过。
60
39
 
61
40
  澄清时采用引导性提问(而非纯选择题):
62
41
  - "你提到了 X,但我注意到这还关联到 Y——这是否也在范围内?"
@@ -65,26 +44,12 @@ description: |
65
44
 
66
45
  好的引导性问题能帮用户发现自己没想到的维度,而不只是确认 AI 已知的信息。
67
46
 
68
- **Step 3: 对齐确认(不可跳过)** — 用普通文本(markdown)向用户呈现,格式要求:每要素标题独占一行,内容换行后写,列表用 bullet。
69
-
70
- ```
71
- **我的理解**
72
- (1-2 句概括核心意图 + 关联问题)
73
-
74
- **计划方向**
75
- (1-2 句高层策略)
76
-
77
- **关键假设**
78
- - 假设 1
79
- - 假设 2
80
-
81
- **完成标准**
82
- - 可测试条件 1
83
- - 可测试条件 2
84
- ```
47
+ **Step 3: 对齐确认(不可跳过)** — 用普通文本(markdown)向用户呈现:
85
48
 
86
- 禁止:标题和内容写在同一行(如"我的理解xxx"导致长行难读)。
87
- AskUserQuestion 仅用于确认("以上对齐是否正确?"),不放大段对齐内容。
49
+ 1. **我的理解** 复述目标核心意图(包含分析中发现的用户可能没意识到的关联问题)
50
+ 2. **计划方向** — 打算怎么做(高层策略)
51
+ 3. **关键假设** — 不确定的假设,标注出来
52
+ 4. **完成标准** — "我认为完成的标志是..."(必须可测试,描述需求状态而非执行命令)
88
53
 
89
54
  呈现完毕后,**调用 AskUserQuestion 工具**让用户确认或补充。确认后才能开始执行。
90
55
 
@@ -51,7 +51,7 @@ async function initTeamConventions(targetDir, options) {
51
51
 
52
52
  const urlInput = await p.text({
53
53
  message: 'Enter the Git repository URL for team conventions:',
54
- placeholder: 'http://git.dev.sh.ctripcorp.com/r.shi/dev-guide.git',
54
+ placeholder: 'https://gitlab.example.com/team/conventions.git',
55
55
  validate: (value) => {
56
56
  if (!value || value.trim().length === 0) return 'URL is required';
57
57
  if (!value.match(/^(https?:\/\/|git@)/)) return 'Must be a valid git URL (https:// or git@)';
@@ -17,7 +17,7 @@ export const MARKETPLACE_DIR = path.join(CLAUDE_DIR, 'plugins', 'marketplaces',
17
17
  export const PLUGIN_KEY = `${PLUGIN_NAME}@${MARKETPLACE_NAME}`;
18
18
 
19
19
  export const PRESETS = {
20
- full: ['core', 'rules', 'plugin', 'hooks', 'scripts', 'memory'],
20
+ full: ['core', 'rules', 'plugin', 'hooks', 'memory'],
21
21
  minimal: ['core', 'rules', 'plugin'],
22
22
  safe: ['core', 'rules', 'plugin', 'memory'],
23
23
  };
@@ -64,7 +64,6 @@ export const ACE_OWNED_PATTERNS = [
64
64
  /^ace\/rules\//, // ace/rules/*.md (v2.0+)
65
65
  /^rules\/ace\//, // rules/ace/*.md (legacy, for migration detection)
66
66
  /^hooks\/ace\./, // hooks/ace.*.sh
67
- /^scripts\/statusline/, // scripts/statusline*
68
67
  ];
69
68
 
70
69
  /**
@@ -120,14 +119,6 @@ export const COMPONENTS = {
120
119
  { src: 'hooks/ace.java-compile-check.sh', dest: 'hooks/ace.java-compile-check.sh', roles: ['backend', 'fullstack'] },
121
120
  ],
122
121
  },
123
- scripts: {
124
- description: 'Utility scripts (status line)',
125
- required: false,
126
- files: [
127
- { src: 'scripts/statusline-command.sh', dest: 'scripts/statusline-command.sh' },
128
- { src: 'scripts/statusline.py', dest: 'scripts/statusline.py' },
129
- ],
130
- },
131
122
  memory: {
132
123
  description: 'Global memory templates',
133
124
  required: false,
@@ -280,7 +280,7 @@ export class Installer {
280
280
 
281
281
  // 3. Register in known_marketplaces.json
282
282
  const marketplaceEntry = {
283
- source: { source: 'directory', path: MARKETPLACE_DIR },
283
+ source: { source: 'local' },
284
284
  installLocation: MARKETPLACE_DIR,
285
285
  lastUpdated: new Date().toISOString(),
286
286
  };
@@ -26,10 +26,11 @@
26
26
  - ~/.claude/ace/rules/gitflow.md — GitFlow 工作流(分支管理时阅读)
27
27
 
28
28
  ## 流程门禁优先级
29
- Auto mode 不覆盖 auto-goal/aspec/OpenSpec 流程门禁。标注"不可跳过"的门禁步骤(需求澄清、设计澄清、审批确认)在任何执行模式下均必须执行,不得以"减少打断"为由跳过。
29
+ Auto mode 不覆盖 aspec/OpenSpec 流程门禁。标注"不可跳过"的门禁步骤(需求澄清、设计澄清、审批确认)在任何执行模式下均必须执行,不得以"减少打断"为由跳过。
30
30
 
31
31
  ## 安全策略
32
32
  安全由外部机制保障,不占用上下文 token:
33
33
  - settings.json deny 规则 → 硬拦截 rm -rf、sudo 等
34
- - Shell hooks → 进程级检查(编译、类型检查、内容审查)
34
+ - Shell hooks → 进程级检查(编译、类型检查)
35
+ - Hookify 插件 → 模式匹配拦截(危险命令、敏感文件)
35
36
  <!-- ace:managed:end -->
@@ -0,0 +1,16 @@
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
+ 如确需执行,请手动在终端中运行。
@@ -0,0 +1,45 @@
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` | 警告标记 | 高风险代码,需要审查 |
@@ -0,0 +1,20 @@
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. 是否可以使用更安全的方式
@@ -0,0 +1,17 @@
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
+ - 使用环境变量引用敏感值
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: require-verification
3
+ enabled: true
4
+ event: stop
5
+ action: warn
6
+ ---
7
+
8
+ **交付前验证提醒**
9
+
10
+ 请确认已完成以下检查:
11
+ - 代码变更已通过编译
12
+ - 相关测试已执行且通过
13
+ - 变更符合项目规范
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: safe-git-commands
3
+ enabled: true
4
+ event: bash
5
+ pattern: git\s+push\s+.*(-f|--force)|git\s+reset\s+--hard|git\s+clean\s+-fd|git\s+rebase\s+-i|git\s+commit\s+--amend
6
+ action: warn
7
+ ---
8
+
9
+ **Git 危险操作警告!**
10
+
11
+ 即将执行可能影响团队协作的 Git 命令,请确认:
12
+
13
+ ## 受保护命令
14
+
15
+ ### Force Push (`git push --force`)
16
+ ⚠️ 这会覆盖远程分支历史,可能影响其他协作者
17
+ - **建议**: 使用 `git push --force-with-lease`
18
+ - **确认**: 已通知团队成员,无人基于此分支工作
19
+
20
+ ### Reset Hard (`git reset --hard`)
21
+ ⚠️ 这会丢弃所有未提交的更改
22
+ - **建议**: 先用 `git stash` 保存更改
23
+ - **确认**: 已备份重要修改
24
+
25
+ ### Clean Force (`git clean -fd`)
26
+ ⚠️ 这会删除未跟踪的文件和目录
27
+ - **建议**: 先用 `git clean -n` 预览将被删除的文件
28
+ - **确认**: 不会误删重要文件
29
+
30
+ ### Interactive Rebase (`git rebase -i`)
31
+ ⚠️ 修改已发布的提交会改变历史
32
+ - **建议**: 仅对本地未推送的提交使用
33
+ - **确认**: 了解变基后需要 force push
34
+
35
+ ### Amend Commit (`git commit --amend`)
36
+ ⚠️ 修改已推送的提交需要 force push
37
+ - **建议**: 仅修改本地最新提交
38
+ - **确认**: 尚未推送到远程
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: warn-sensitive-data
3
+ enabled: true
4
+ event: file
5
+ action: warn
6
+ conditions:
7
+ - field: new_text
8
+ operator: regex_match
9
+ pattern: (API_KEY|SECRET|TOKEN|PASSWORD|PWD)\s*[=:]\s*["'][^"']+["']
10
+ ---
11
+
12
+ **敏感信息 detected!**
13
+
14
+ 文件内容可能包含硬编码凭证:
15
+ - API_KEY / API_SECRET
16
+ - TOKEN / ACCESS_TOKEN
17
+ - PASSWORD / PWD
18
+
19
+ 建议:
20
+ 1. 使用环境变量替代硬编码
21
+ 2. 确认文件已在 .gitignore 中
22
+ 3. 考虑使用密钥管理服务
@@ -4,13 +4,11 @@
4
4
  # exit 0 = 允许(stdout 作为警告信息传递给模型)
5
5
  # exit 2 = 阻止执行
6
6
 
7
- # NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
8
- set -uo pipefail
7
+ set -euo pipefail
9
8
 
10
9
  INPUT=$(cat)
11
10
 
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)
11
+ COMMAND=$(echo "$INPUT" | grep -o '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"command"[[:space:]]*:[[:space:]]*"//;s/"$//')
14
12
 
15
13
  [[ -z "$COMMAND" ]] && exit 0
16
14
 
@@ -20,8 +18,8 @@ BLOCK_PATTERNS=(
20
18
  'rm\s+-rf'
21
19
  'rm\s+-r\s'
22
20
  'rm\s+.*--recursive'
23
- 'git\s+push\s+(.*\s)?-f(\s|$)'
24
- 'git\s+push\s+.*--force(\s|$)'
21
+ 'git\s+push\s+.*(-f|--force)[^-]'
22
+ 'git\s+push\s+.*--force$'
25
23
  'DROP\s+TABLE'
26
24
  'TRUNCATE\s+TABLE'
27
25
  'git\s+reset\s+--hard'
@@ -1,57 +1,52 @@
1
1
  #!/bin/bash
2
2
  # Content Guard — PostToolUse Hook
3
+ # 合并规则: sensitive-data, code-quality-gate
3
4
  # 检测写入内容中的硬编码凭证和调试代码残留
4
5
  # exit 0 = 无问题, exit 1 = 发现问题(反馈给模型)
5
6
 
6
- # NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
7
- set -uo pipefail
7
+ set -euo pipefail
8
8
 
9
9
  INPUT=$(cat)
10
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)
11
+ FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//')
13
12
 
14
13
  [[ -z "$FILE_PATH" ]] && exit 0
15
14
 
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:]]*//')
15
+ # 提取写入的新内容(new_string 用于 Edit, content 用于 Write)
16
+ NEW_CONTENT=$(echo "$INPUT" | grep -o '"new_string"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"new_string"[[:space:]]*:[[:space:]]*"//;s/"$//')
17
+ if [[ -z "$NEW_CONTENT" ]]; then
18
+ NEW_CONTENT=$(echo "$INPUT" | grep -o '"content"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"content"[[:space:]]*:[[:space:]]*"//;s/"$//')
24
19
  fi
25
20
 
26
- [[ -z "$CHECK_CONTENT" ]] && exit 0
21
+ [[ -z "$NEW_CONTENT" ]] && exit 0
27
22
 
28
23
  ISSUES=""
29
24
 
30
25
  # === 检测硬编码凭证 ===
31
- if echo "$CHECK_CONTENT" | grep -qiE '(API_KEY|API_SECRET|SECRET_KEY|ACCESS_TOKEN|PASSWORD|PWD)\s*[=:]\s*["\x27][^"\x27]+["\x27]'; then
26
+ if echo "$NEW_CONTENT" | grep -qiE '(API_KEY|API_SECRET|SECRET_KEY|ACCESS_TOKEN|TOKEN|PASSWORD|PWD)\s*[=:]\s*["'"'"'][^"'"'"']+["'"'"']'; then
32
27
  ISSUES="${ISSUES}⚠️ 检测到可能的硬编码凭证 (API_KEY/SECRET/TOKEN/PASSWORD)\n"
33
28
  fi
34
29
 
35
30
  # === 检测源代码中的调试残留(仅针对代码文件)===
36
31
  case "$FILE_PATH" in
37
32
  *.java)
38
- if echo "$CHECK_CONTENT" | grep -qE 'System\.(out|err)\.print'; then
33
+ if echo "$NEW_CONTENT" | grep -qE 'System\.(out|err)\.print'; then
39
34
  ISSUES="${ISSUES}⚠️ 检测到 System.out/err.print — 请使用 Logger\n"
40
35
  fi
41
36
  ;;
42
37
  *.js|*.ts|*.tsx)
43
- if echo "$CHECK_CONTENT" | grep -qE 'console\.(log|debug|warn|error)'; then
38
+ if echo "$NEW_CONTENT" | grep -qE 'console\.(log|debug|warn|error)'; then
44
39
  ISSUES="${ISSUES}⚠️ 检测到 console.log — 请确认是否为调试残留\n"
45
40
  fi
46
- if echo "$CHECK_CONTENT" | grep -qE '\bdebugger\b'; then
41
+ if echo "$NEW_CONTENT" | grep -qE '\bdebugger\b'; then
47
42
  ISSUES="${ISSUES}⚠️ 检测到 debugger 语句\n"
48
43
  fi
49
44
  ;;
50
45
  *.py)
51
- if echo "$CHECK_CONTENT" | grep -qE 'print\('; then
46
+ if echo "$NEW_CONTENT" | grep -qE '^\s*print\('; then
52
47
  ISSUES="${ISSUES}⚠️ 检测到 print() — 请确认是否为调试残留\n"
53
48
  fi
54
- if echo "$CHECK_CONTENT" | grep -qE 'breakpoint\(\)'; then
49
+ if echo "$NEW_CONTENT" | grep -qE '^\s*breakpoint\(\)'; then
55
50
  ISSUES="${ISSUES}⚠️ 检测到 breakpoint()\n"
56
51
  fi
57
52
  ;;
@@ -60,7 +55,7 @@ esac
60
55
  if [[ -n "$ISSUES" ]]; then
61
56
  echo "🔍 内容安全检查发现问题:"
62
57
  echo ""
63
- printf "%b" "$ISSUES"
58
+ echo -e "$ISSUES"
64
59
  echo "文件: $FILE_PATH"
65
60
  exit 1
66
61
  fi
@@ -4,12 +4,11 @@
4
4
  # 检测对敏感文件的编辑操作,输出警告
5
5
  # exit 0 + stdout = 警告(不阻止)
6
6
 
7
- # NOTE: 不使用 set -e — grep 无匹配返回 1 会导致脚本崩溃
8
- set -uo pipefail
7
+ set -euo pipefail
9
8
 
10
9
  INPUT=$(cat)
11
10
 
12
- FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//' || true)
11
+ FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//;s/"$//')
13
12
 
14
13
  [[ -z "$FILE_PATH" ]] && exit 0
15
14
 
@@ -1,5 +1,5 @@
1
1
  schema: spec-driven
2
- version: 12.0.0
2
+ version: 10.0.0
3
3
  context: |
4
4
  ## 语言
5
5
  所有交互、思考链、文档一律使用中文。OpenSpec 英文标题保留。
@@ -23,57 +23,11 @@ context: |
23
23
  - 惊讶测试:替用户做选择时,若用户看到会惊讶 → 暂停展示选项
24
24
  - 对齐内容用 markdown 文本输出(大段内容在 AskUserQuestion 中显示异常),确认通过 AskUserQuestion
25
25
 
26
- ## 深度认知方法论
27
-
28
- ### 苏格拉底式分析(AI 内部推理,不直接展示给用户)
29
- 这是 AI 的思维方法,不是输出格式。分析时在内部执行以下追问,形成深层理解后再转化为对用户的具体问题。
30
- - **追问目的**:用户为什么要这个?解决什么根本问题?做了之后谁受益?
31
- - **追问完整性**:说的是全貌还是冰山一角?关联问题?前置依赖?
32
- - **追问前提**:假设成立吗?有更好的问题框架吗?是不是在解决错误的问题?
33
- - **追问约束**:什么不能动?硬限制?时间/资源/技术债/团队认知负担?
34
-
35
- 输入:Read dimensions.md,用其深度提问启发分析方向,用盲区表验证覆盖完整性。
36
- 输出:不是追问本身,而是经分析后识别出的具体问题列表(写入 issues 文件)。
37
- 目标:不只理解用户说了什么,而是理解用户**真正需要**什么——包括他们没意识到的部分。
38
-
39
- ### 引导性提问(澄清时面向用户)
40
- 基于内部苏格拉底分析的结论,设计面向用户的引导性问题。问题应具体、可行动、关联用户业务场景,而非重复抽象追问。
41
- - "你提到了 X,但我注意到这还关联到 Y——这是否也在范围内?"
42
- - "如果做了 X 但不处理 Y,后续有什么风险?"
43
- - "在这几个约束中,你的首要优先级是什么?"
44
-
45
- ### 对齐确认四要素
46
- 展示时每个要素独占一段,要素标题单独一行,内容换行后写。列表项用 bullet:
47
-
48
- ```
49
- **我的理解**
50
- (1-2 句话概括核心意图)
51
-
52
- **方案方向**
53
- (1-2 句话概括策略)
54
-
55
- **关键假设**
56
- - 假设 1
57
- - 假设 2
58
-
59
- **完成标准**
60
- - 标准 1
61
- - 标准 2
62
- ```
63
-
64
- 禁止:标题和内容写在同一行(如"我的理解 — xxxxxx"),会导致长行难读。
65
- AskUserQuestion 仅用于确认("以上对齐是否正确?"),不要把对齐内容放入 AskUserQuestion。
66
-
67
- ### 深度聚焦
68
- Read dimensions.md 后不逐条遍历,而是主动筛选:哪些维度在当前需求中最不确定?哪些遗漏的返工成本最高?聚焦于这些维度深挖,其余略过。
69
-
70
- ### 并行探索策略
71
- 分析需求或设计时,通过 Agent 工具并行探索独立维度以提升深度:
72
- - 识别独立分析维度(彼此结果不影响),分组后每个 Agent 负责一组(2-3 维度)
73
- - 每个 Agent prompt 须自包含:分析目标 + 项目上下文 + 输出格式(问题列表)
74
- - 回收后整合:合并发现、识别交叉问题、去重后写入 issues 文件
75
- - 触发条件:分析维度 ≥3 个且彼此独立 → 并行;<3 个或强依赖 → 串行
76
- - 约束:并行 Agent ≤4 个,不修改同一文件
26
+ ## 深度探索
27
+ 不要遍历维度清单做表面扫描。聚焦于:
28
+ - 哪些部分让你最不确定?为什么?
29
+ - 哪些误解的返工成本最高?
30
+ - dimensions.md 的已知盲区是否相关?
77
31
 
78
32
  ## 文件约定
79
33
  - 需求问题:issues/requirement-issues.md(id, description, severity, status, answer)
@@ -95,15 +49,9 @@ rules:
95
49
  - "[PRE] 读取 experience.md 需求相关经验,告知用户"
96
50
  - |
97
51
  [PRE] 需求澄清流程(三步顺序执行,每步完成后再进入下一步):
98
- 1. **内部深度分析**Read dimensions.md,结合需求维度的深度提问和盲区表,运用苏格拉底式四追问(目的/完整性/前提/约束)在内部深入分析:
99
- - dimensions.md 的深度提问启发分析方向(如"数据从哪来?生命周期?""并发竞态?")
100
- - 用盲区表逐项验证是否遗漏高风险不确定性
101
- - 若分析维度 ≥3 个且独立,通过 Agent 工具并行探索(见"并行探索策略")
102
- - 分析结论写入 issues/requirement-issues.md,每个问题含:具体风险描述 + 为何重要(返工成本)
103
- 2. **引导性澄清** — 基于步骤 1 的分析结论,设计面向用户的具体问题,通过 AskUserQuestion 澄清 High/Medium 问题:
104
- - 问题应具体、可行动、关联用户业务,而非重复抽象的苏格拉底追问
105
- - 主动指出关联:"我注意到 X 还涉及 Y,是否在范围内?"
106
- 3. **结构化对齐** — 用 markdown 按"对齐确认四要素"格式展示(每要素独占一段,列表用 bullet),然后通过 AskUserQuestion 仅确认(不放内容)
52
+ 1. **分析→写入**自主分析需求不确定性(参考 dimensions.md 盲区),结果写入 issues/requirement-issues.md
53
+ 2. **澄清** 通过 AskUserQuestion 批量澄清 High/Medium 问题
54
+ 3. **对齐确认** — 用 markdown 展示需求理解摘要,再通过 AskUserQuestion 确认
107
55
  - |
108
56
  🚫 GATE: 满足以下全部条件前,禁止创建 proposal:
109
57
  - issues/requirement-issues.md 已创建且 High/Medium 问题已澄清
@@ -116,17 +64,9 @@ rules:
116
64
  - "[PRE] 读取 experience.md 技术相关经验,告知用户"
117
65
  - |
118
66
  [PRE] 设计澄清流程(三步顺序执行,每步完成后再进入下一步):
119
- 1. **内部深度分析**Read dimensions.md,结合设计维度的深度提问和盲区表,运用苏格拉底式四追问深入分析技术方案:
120
- - 追问目的:架构决策服务什么质量属性?(参考 dimensions.md 架构/性能/安全维度的深度提问)
121
- - 追问完整性:遗漏的交互场景或失败模式?(参考盲区表验证)
122
- - 追问前提:技术选型的隐含假设(性能、规模、团队能力)是否成立?
123
- - 追问约束:现有系统/团队/时间的硬限制?
124
- - 若需评估多个备选方案,通过 Agent 工具并行调研(每个 Agent 研究一个方案的可行性)
125
- - 分析结论写入 issues/design-issues.md,每个决策含:备选方案 + 排除理由 + 风险
126
- 2. **引导性澄清** — 基于步骤 1 的分析结论,设计面向用户的具体问题,通过 AskUserQuestion 澄清 High/Medium 决策:
127
- - 问题应具体、暴露取舍,而非重复抽象追问
128
- - 主动暴露取舍:"方案 A 更简单但 X 场景有风险,方案 B 更复杂但覆盖更全——优先级?"
129
- 3. **结构化对齐** — 用 markdown 按"对齐确认四要素"格式展示(每要素独占一段,列表用 bullet),然后通过 AskUserQuestion 仅确认(不放内容)
67
+ 1. **分析→写入**自主分析设计不确定性,结果写入 issues/design-issues.md
68
+ 2. **澄清** 通过 AskUserQuestion 批量澄清 High/Medium 决策(即使无问题也须展示决策摘要)
69
+ 3. **对齐确认** — 用 markdown 展示技术方案摘要,再通过 AskUserQuestion 确认
130
70
  - |
131
71
  🚫 GATE: 满足以下全部条件前,禁止创建 design.md:
132
72
  - issues/design-issues.md 已创建且 High/Medium 决策已澄清
@@ -1,90 +1,11 @@
1
1
  # 澄清维度
2
2
 
3
- 分析不确定性时参考以下维度和深度问题。**聚焦实际不确定的部分,不逐条遍历。**
3
+ **需求**:功能完整性 | 数据关切 | 用户体验 | 边界异常 | 集成依赖 | 优先级范围
4
+ **设计**:架构决策 | 技术选型 | 接口设计 | 数据状态 | 安全合规 | 性能可靠性 | 部署运维
4
5
 
5
- ## 需求维度
6
-
7
- **功能完整性**
8
- - 用户说的是最终目标还是只第一步?完整闭环还需要什么?
9
- - 涉及几种角色?每种角色的核心操作路径?
10
- - 正常流完成后系统状态应该是什么?如何验证?
11
-
12
- **数据关切**
13
- - 数据从哪来?谁写入?生命周期多长?
14
- - 一致性要求:最终一致还是强一致?跨服务如何协调?
15
- - 量级估算:初始多少?增长速率?是否影响方案选择?
16
-
17
- **用户体验**
18
- - 操作频率和场景?高频操作的摩擦成本?
19
- - 失败时用户看到什么?如何恢复?
20
- - 响应时间预期?异步还是同步?
21
-
22
- **边界异常**
23
- - 并发:多人同时操作同一资源会怎样?
24
- - 极端输入:为空?超长?格式异常?
25
- - 中断恢复:操作一半断连/崩溃,系统如何恢复?
26
-
27
- **集成依赖**
28
- - 外部服务 SLA?不可用时如何降级?
29
- - 上游接口版本兼容:变更如何感知和适配?
30
- - 超时和重试策略?
31
-
32
- **优先级范围**
33
- - MVP 边界:什么可以二期?判断标准?
34
- - 硬截止日期?日期压力如何影响范围?
35
- - 只能交付 60% 时哪些最优先?
36
-
37
- ## 设计维度
38
-
39
- **架构决策**
40
- - 什么规模下会不适用?预期何时需重新评估?
41
- - 选 X 意味着放弃什么(lock-in)?回头成本?
42
- - 团队有运维经验吗?学习曲线?
43
-
44
- **技术选型**
45
- - 隐含假设(版本稳定性、社区活跃度)是否成立?
46
- - 与现有技术栈集成成本?新运维负担?
47
- - 是否有"够用就好"的简单替代?
48
-
49
- **接口设计**
50
- - 消费者是谁?最在意什么(延迟/吞吐/易用性)?
51
- - 向后兼容:字段废弃、版本迁移如何处理?
52
- - 数据量增长后接口行为如何变化(批量/分页)?
53
-
54
- **数据状态**
55
- - Schema 变更迁移策略?需要双写过渡期?
56
- - 删除策略:软删还是物理删?合规要求?
57
- - 缓存与源数据一致性?失效策略?
58
-
59
- **安全合规**
60
- - 认证授权模型:谁能访问什么?最小权限?
61
- - 敏感数据(PII)处理:加密?审计?
62
- - 第三方依赖安全状态?已知 CVE?
63
-
64
- **性能可靠性**
65
- - 量化目标:P99 延迟?QPS 峰值?
66
- - 故障隔离:组件失败的爆炸半径?熔断/限流?
67
- - 可观测性:如何发现问题?告警阈值?
68
-
69
- **部署运维**
70
- - 发布策略:滚动/蓝绿/金丝雀?回滚时间目标?
71
- - 配置管理:环境相关的部分如何切换?
72
- - 关键监控指标?on-call 责任?
73
-
74
- ## 通用高频盲区(首次使用即有效)
75
-
76
- | 维度 | 盲区 | 为何常被忽视 | 暴露时机 |
77
- |------|------|-------------|----------|
78
- | 边界异常 | 并发竞态条件 | 单用户测试通过 | 上线后流量压力下 |
79
- | 集成依赖 | 第三方限流/降级 | 开发环境无限制 | 生产流量尖峰 |
80
- | 数据状态 | 迁移向后兼容 | 新字段易加旧数据难迁 | 发布后无法回滚 |
81
- | 性能可靠性 | 缓存击穿/雪崩 | 缓存正常时一切OK | 缓存失效瞬间 |
82
- | 接口设计 | 幂等性缺失 | 正常调用无问题 | 重试/补偿场景 |
83
- | 安全合规 | 横向越权 | 纵向权限明确横向常漏 | 渗透测试 |
84
- | 部署运维 | 有状态服务扩缩容 | 无状态容易有状态难 | 扩容时数据不一致 |
85
- | 功能完整性 | 取消/撤销/回退路径 | 正向流程优先实现 | 用户误操作时 |
6
+ 分析不确定性时参考以上维度,聚焦实际不确定的部分,不逐条遍历。
86
7
 
87
8
  ## 项目已知盲区(优先检查)
88
9
 
89
- <!-- 由经验进化体系自动维护。格式:维度 | 盲区描述 | 来源 change -->
10
+ <!-- 由进化体系自动维护。格式:维度 | 盲区描述 | 来源 change -->
90
11
  *首次 archive 后自动填充。*
@@ -1,2 +0,0 @@
1
- #!/bin/bash
2
- cat | python ~/.claude/scripts/statusline.py
@@ -1,32 +0,0 @@
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))