@shirayner/ace 0.1.7-snapshot.1 → 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.
Files changed (43) hide show
  1. package/README.md +55 -19
  2. package/bin/ace.js +1 -0
  3. package/package.json +1 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/skills/auto-goal/SKILL.md +131 -87
  6. package/plugin/skills/auto-goal/references/recovery.md +29 -0
  7. package/plugin/skills/auto-goal/references/state-template.md +97 -0
  8. package/src/commands/doctor.js +12 -5
  9. package/src/commands/init.js +9 -5
  10. package/src/commands/list.js +26 -0
  11. package/src/commands/spec.js +57 -0
  12. package/src/commands/uninstall.js +65 -31
  13. package/src/core/constants.js +23 -20
  14. package/src/core/installer.js +84 -4
  15. package/src/core/merger.js +15 -3
  16. package/src/core/team-installer.js +96 -0
  17. package/src/core/ui.js +0 -1
  18. package/templates/CLAUDE.md +28 -14
  19. package/templates/ace/rules/git.md +50 -0
  20. package/templates/ace/rules/gitflow.md +109 -0
  21. package/templates/{rules/ace → ace/rules}/thinking.md +5 -0
  22. package/templates/hooks/ace.bash-guard.sh +71 -0
  23. package/templates/hooks/ace.content-guard.sh +68 -0
  24. package/templates/hooks/ace.file-guard.sh +29 -0
  25. package/templates/hooks/ace.java-compile-check.sh +4 -2
  26. package/templates/hooks/ace.stop-verify.sh +28 -0
  27. package/templates/scripts/statusline-command.sh +2 -0
  28. package/templates/scripts/statusline.py +32 -0
  29. package/templates/settings.json +58 -2
  30. package/templates/hookify/hookify.ace.block-dangerous-ops.local.md +0 -16
  31. package/templates/hookify/hookify.ace.code-quality-gate.local.md +0 -45
  32. package/templates/hookify/hookify.ace.dangerous-commands.local.md +0 -20
  33. package/templates/hookify/hookify.ace.protect-secrets.local.md +0 -17
  34. package/templates/hookify/hookify.ace.require-verification.local.md +0 -13
  35. package/templates/hookify/hookify.ace.safe-git-commands.local.md +0 -38
  36. package/templates/hookify/hookify.ace.sensitive-data.local.md +0 -22
  37. /package/templates/{rules/ace → ace/rules}/clean-code.md +0 -0
  38. /package/templates/{rules/ace → ace/rules}/code-quality.md +0 -0
  39. /package/templates/{rules/ace → ace/rules}/context-hygiene.md +0 -0
  40. /package/templates/{rules/ace → ace/rules}/interactive-clarify.md +0 -0
  41. /package/templates/{rules/ace → ace/rules}/memory-policy.md +0 -0
  42. /package/templates/{rules/ace → ace/rules}/reporting.md +0 -0
  43. /package/templates/{rules/ace → ace/rules}/task-recovery.md +0 -0
package/README.md CHANGED
@@ -31,17 +31,27 @@ ACE 是一个**AI 开发环境配置工具**,基于 Claude Code 官方最佳
31
31
  - 📝 **规范驱动工作流** — OpenSpec 集成的需求管理体系
32
32
  - 🧩 **跨会话记忆系统** — 持久化的开发者画像与项目记忆
33
33
 
34
+ ### 视频教程
35
+
36
+ 从下载安装到实际使用的完整演示:
37
+
38
+ ![ACE 使用示例](assets/ace-demo.gif)
39
+
40
+ 动图速度过快,另有示例视频:[ACE 使用示例](assets/ace-demo.mp4)
41
+
42
+ ---
43
+
44
+ ## ✨ 一分钟速览
45
+
46
+ ### 安装
47
+
34
48
  ```bash
35
49
  # 一键安装,即刻拥有专业级 AI 开发环境
36
50
  npm install -g @shirayner/ace
37
- ace init
38
51
  ```
39
52
 
40
- ---
41
53
 
42
- ## ✨ 一分钟速览
43
-
44
- ### 初始化向导
54
+ ### 初始化
45
55
 
46
56
  ```bash
47
57
  $ ace init
@@ -74,38 +84,64 @@ $ ace init
74
84
 
75
85
  ### Spec Coding 完整流程
76
86
 
87
+ 进入工作目录
88
+
77
89
  ```bash
78
90
  # 进入工作目录
79
91
  $ mkdir my-project
80
92
  $ cd my-project
81
93
 
94
+ ```
95
+
96
+ Spec 初始化
97
+
98
+ ```bash
82
99
  # 执行 aspec 初始化
83
100
  $ ace spec init
84
101
  ✓ aspec 工作流已初始化
85
102
  Done! 规范驱动开发已就绪。
86
103
 
87
- # 在 Claude Code 中体验三命令开发流程:
104
+ ```
105
+
106
+ Spec驱动开发
107
+
108
+ ```bash
109
+ # 在 Claude Code 中体验Spec开发流程:
110
+ # 输入 /opsx:proposal 命令后,一路交互式澄清、确认,然后需求完成,Spec归档
88
111
  $ claude
89
112
 
90
113
  > /opsx:proposal 帮我实现用户积分系统
91
114
 
92
- Claude:
93
- 【需求澄清】积分获取规则?消费规则?过期策略?→ 3 个问题确认
94
- 【创建提案】proposal.md
95
- 【技术澄清】并发扣减方案?积分流水存储?→ 2 个问题确认
96
- 【确定方案】design.md + tasks.md(8 个可执行任务)
115
+ Claude: 【需求澄清】对需求不确定的地方提出疑问?→ 请求人工澄清
116
+ 人工:选择选项,或者进行纠正,然后点击submit
117
+
118
+ Claude: 【需求对齐】Claude输出自己对本需求的理解 → 请求人工确认
119
+ 人工:选择确认,或者纠正信息,然后点击submit
120
+
121
+ -- 人工确认之后,Cluade会创建提案
122
+
123
+ Claude: 【技术设计澄清】对技术不确定的地方提出疑问 → 请求人工确认
124
+ 人工:选择确认,或者纠正信息,然后点击submit
125
+
126
+ Claude: 【技术设计对齐】Claude输出自己对本需求的技术方案设计的理解 → 请求人工确认
127
+ 人工:选择确认,或者纠正信息,然后点击submit
128
+
129
+ -- 人工确认之后,Cluade会创建Design
130
+
131
+ Claude: 【Design审批并创建Tasks】Claude请求人工确认Design设计,然后创建Tasks → 请求人工审批
132
+ 人工:选择确认,或者纠正信息,然后点击submit
133
+
134
+ -- 人工确认之后,Cluade会创建tasks
97
135
 
98
- > /opsx:apply
136
+ Claude: 【执行】Claude 请求按规划的任务进行代码实现 → 请求人工审批
137
+ 人工:选择确认,或者纠正信息,然后点击submit
99
138
 
100
- Claude:
101
- 按 tasks.md 逐项实现,每步验证
102
- ✓ 所有任务完成,测试通过
139
+ -- 人工确认之后,Cluade会进行代码实现,然后进行经验收集
103
140
 
104
- > /opsx:archive
141
+ Claude: 【归档同步】Claude 会请求进行归档同步→ 请求人工审批
142
+ 人工:选择确认,或者纠正信息,然后点击submit
105
143
 
106
- Claude:
107
- spec 归档,收敛检查
108
- ✓ 归档完成
144
+ -- 人工确认之后,Cluade会对Spec进行归档同步
109
145
  ```
110
146
 
111
147
  ### 健康检查
package/bin/ace.js CHANGED
@@ -51,6 +51,7 @@ spec
51
51
  .option('-f, --force', 'Overwrite existing configuration', false)
52
52
  .option('--dry-run', 'Preview without making changes', false)
53
53
  .option('--skip-openspec', 'Skip openspec CLI installation', false)
54
+ .option('--team-repo <url>', 'Git repository URL for team conventions')
54
55
  .action(specInitCommand);
55
56
 
56
57
  spec
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shirayner/ace",
3
- "version": "0.1.7-snapshot.1",
3
+ "version": "0.1.8-SNAPSHOT.1",
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.3",
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"
@@ -11,27 +11,62 @@ description: |
11
11
 
12
12
  DO NOT TRIGGER: 明确代码变更(修 bug、加功能、重构、写测试 → coding);优化/创建 skill(→ skill-optimize / skill-creator);单步可完成的简单操作(→ 直接执行)。
13
13
  ---
14
-
15
14
  # Auto Goal Skill
16
15
 
17
- 自主完成目标的赋能系统。信任模型的推理能力,只做模型不会自发做的事。
16
+ 自主完成目标的赋能系统。信任模型推理能力,只做模型不会自发做的事。
18
17
 
19
18
  **核心信念**:对齐优先于效率。准确完成用户真正想要的,胜过高效完成 agent 以为的。
20
19
 
21
20
  ---
22
21
 
23
- ## 三条硬规则(不可跳过)
22
+ ## 硬规则(不可跳过)
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 优化的是执行效率,不是对齐质量。跳过对齐不是"更快"——是"更可能做错"。**
24
36
 
25
37
  ### 规则 1:首轮对齐(MANDATORY — 优先于 auto mode)
26
38
 
27
39
  接收目标后,**必须完成以下三步才能开始执行**。
28
40
 
29
- **Step 1: 初步分析** — 结合已有上下文(memory、CLAUDE.md、git status、会话历史)和探索性工具(Read/Grep/Glob/Agent),形成对目标的理解。
41
+ **Step 1: 苏格拉底式分析** — 结合已有上下文(memory、CLAUDE.md、git status、会话历史)和探索性工具(Read/Grep/Glob/Agent),并行执行,形成对目标的深层理解。
42
+
43
+ 分析时在内部(思考过程中)进行苏格拉底式追问:
44
+ - **追问目的**:用户为什么要做这个?解决什么根本问题?做了之后谁受益?
45
+ - **追问完整性**:用户说的是全貌还是冰山一角?有没有没意识到的关联问题或前置依赖?
46
+ - **追问前提**:用户的假设成立吗?有没有更好的问题框架?是不是在解决错误的问题?
47
+ - **追问约束**:什么不能动?什么是硬限制?时间/资源/技术债/团队认知负担?
48
+
49
+ 目标:不只是理解用户说了什么,而是理解用户**真正需要**什么——包括他们自己可能没意识到的部分。
50
+
51
+ **Step 2: 澄清** — **调用 AskUserQuestion 工具**向用户批量澄清歧义和关键决策点。复杂项目可多轮澄清。
52
+
53
+ 跳过条件(必须**同时满足全部**才可跳过 Step 2,直接进入 Step 3):
54
+ - 用户在**同一会话中**已明确表达过完整意图,且你在 Step 1 分析后未发现任何隐含决策点
55
+ - 不存在"用户可能会惊讶"的假设需要验证
56
+ - 任务是对前一个已对齐目标的延续性修复(而非新目标)
57
+
58
+ **如果不确定是否需要澄清 → 澄清。** 默认执行,跳过是例外。
59
+
60
+ 澄清时采用引导性提问(而非纯选择题):
61
+ - "你提到了 X,但我注意到这还关联到 Y——这是否也在范围内?"
62
+ - "如果我们做了 X 但不处理 Y,后续会有什么风险?"
63
+ - "在时间、质量、范围之间,你的首要约束是什么?"
30
64
 
31
- **Step 2: 澄清** — **调用 AskUserQuestion 工具**向用户批量澄清歧义和关键决策点。复杂项目可多轮澄清。仅当目标完全明确无歧义时可跳过。
65
+ 好的引导性问题能帮用户发现自己没想到的维度,而不只是确认 AI 已知的信息。
32
66
 
33
- **Step 3: 对齐确认(不可跳过)** — 用普通文本(markdown)向用户呈现对齐内容:
34
- 1. **我的理解** — 复述目标核心意图
67
+ **Step 3: 对齐确认(不可跳过)** — 用普通文本(markdown)向用户呈现:
68
+
69
+ 1. **我的理解** — 复述目标核心意图(包含分析中发现的用户可能没意识到的关联问题)
35
70
  2. **计划方向** — 打算怎么做(高层策略)
36
71
  3. **关键假设** — 不确定的假设,标注出来
37
72
  4. **完成标准** — "我认为完成的标志是..."(必须可测试,描述需求状态而非执行命令)
@@ -40,131 +75,129 @@ description: |
40
75
 
41
76
  ### 规则 2:替用户做选择时,必须暂停
42
77
 
43
- 模型最危险的特征是自信地做错事。以下情况**必须暂停,向用户呈现选项**:
78
+ **一句话判断**:如果用户此刻看到我的决策会惊讶 → 暂停询问。
79
+
80
+ 触发条件:
81
+
44
82
  - 存在多个可行方案且各有取舍
45
83
  - 决策依赖用户偏好(风格、架构、优先级)
46
84
  - 范围超出原始目标描述
47
85
  - 不可逆操作(删除、重写、架构变更)
48
86
  - 正在用自己的理解填补用户未说明的部分
49
87
 
50
- **一句话判断**:如果用户此刻看到我的决策会惊讶 暂停询问。
51
-
52
- ### 规则 3:长任务外化状态
88
+ ### 规则 3:状态外化
53
89
 
54
- 预估超过 10 步的任务,**用户确认对齐后、首个执行动作前**,必须创建 `.tasks/auto-goal-{id}/state.md`。这是从对齐到执行的过渡门——不创建就不开始执行。执行中发现任务超出预估时同理。
90
+ | 任务规模 | 策略 |
91
+ | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
92
+ | ≤5 步 | 无需状态文件,直接执行 |
93
+ | 6-9 步 | 轻量 checkpoint:创建 `.tasks/auto-goal-{id}/state.md`,只写目标+进度+下一步(见 `references/state-template.md` 中的轻量模板) |
94
+ | ≥10 步 | 完整状态管理:Read `references/state-template.md` 获取完整模板后创建,含 Phase 规划、Tier 2 索引、风险追踪 |
55
95
 
56
- 设计目标:**让一个全新 agent 读完 state.md 后能定位自己,按需加载 Tier 2 后能以 80% 效率继续**。模板中 `Phase Final: 收尾` 是强制阶段,确保经验进化和正式交付不被跳过。
96
+ 设计目标:让一个全新 agent 读完 state.md 后能定位自己,按需加载 Tier 2 后能以 80% 效率继续。
57
97
 
58
- **分层架构(懒加载)**:
98
+ ---
59
99
 
60
- ```
61
- .tasks/auto-goal-{id}/
62
- ├── state.md # Tier 1:核心状态索引(≤40 行,恢复必读)
63
- ├── context.md # Tier 2:世界模型详情(按需创建/加载)
64
- ├── decisions.md # Tier 2:决策日志(按需创建/加载)
65
- └── reflections.md # Tier 2:反思日志(按需创建/加载)
66
- ```
100
+ ## 执行原则
67
101
 
68
- **Tier 1 — state.md**(始终加载,严格控制体积):
102
+ 1. **先定义完成,再开始执行** 每个目标都需要可测试的完成标准。验证力度匹配错误成本
103
+ 2. **承诺当前计划,卡住时换方向** — 新信息更新信念,不自动更新计划。同一方法连续失败时换策略,三次失败后质疑前提。每次意外失败都问:这揭示了哪个假设是错的?
104
+ 3. **永不空手而归** — 任意时刻中断都应有可用产出。按价值排序交付
105
+ 4. **上下文是稀缺资源** — 探索性工作用 sub-agent 隔离;大阶段完成后压缩保留决策和结论;关键中间结果外化到文件
106
+ 5. **对齐不是一次性事件** — 发现目标理解偏差时,回到对齐。连续成功对齐后可降低确认频率,遇到意外时重新提高
69
107
 
70
- ```markdown
71
- ---
72
- status: in-progress
73
- last-updated: {timestamp}
74
108
  ---
75
109
 
76
- ## 目标与完成标准
77
- [用户确认的目标]
78
- - [ ] 可测试的完成标准 1
79
- - [ ] 可测试的完成标准 2
110
+ ## 并行执行
80
111
 
81
- ## 进度
82
- ### Phase 1: {name} [done]
83
- ### Phase 2: {name} [active]
84
- - [x] 已完成子任务
85
- - [ ] → 当前进行中
86
- - [ ] 待做子任务
87
- ### Phase 3: {name} [pending]
88
- ### Phase Final: 收尾 [pending]
89
- - [ ] 经验进化 → experience.md
90
- - [ ] 交付结果
112
+ **原则**:独立子任务必须并行,有依赖的必须串行。默认寻找并行机会,而非默认串行。
91
113
 
92
- ## 已修改文件
114
+ **识别并行机会**:
93
115
 
94
- ## 下一步
116
+ - 多个文件/模块的独立调研 → 并行 Agent
117
+ - 多个不相关的代码修改 → 并行 Agent(配合 worktree 隔离)
118
+ - 信息收集 + 不依赖其结果的准备工作 → 并行
119
+ - 多个独立验证步骤(测试、lint、类型检查)→ 并行 Bash
95
120
 
96
- ## 活跃风险与未确认假设
121
+ **执行方式**:在**单个 response** 中发出多个 Agent tool 调用。Claude Code 原生支持同一 message 内的并行 tool 调用——利用它。
97
122
 
98
- ## Tier 2 索引
99
- | 文件 | 摘要 | 条目数 |
100
- |------|------|--------|
101
- ```
123
+ **依赖判断**:如果 A 的结果完全不同,B 的执行方式会变吗?不会 → 并行。
102
124
 
103
- **Tier 2 — 按需加载**(agent 根据当前需要自行决定加载):
104
- - **context.md** — 环境上下文(技术栈、项目结构发现)、约束空间(不可行路径、硬限制)、信念状态(✓已验证 / ~假设 / ?待验)
105
- - **decisions.md** 关键决策 + 理由 + 被排除的替代方案
106
- - **reflections.md** 失败根因 + 揭示的错误假设 + 策略调整
125
+ **约束**:
126
+
127
+ - 并行 agent 数量 4(避免结果整合复杂度爆炸)
128
+ - 每个 agent prompt 必须自包含(明确目标、上下文、交付物格式)
129
+ - 结果回收后,主 agent 负责整合、冲突解决、更新 state.md
130
+ - 并行 agent 不应修改同一文件(冲突风险)
131
+
132
+ **state.md 标注**:`⟂` 标记可并行子任务,`(depends: X)` 标记依赖。
107
133
 
108
134
  ---
109
135
 
110
- ## 生成式原则(引导方向,不规定过程)
136
+ ## 进度通信与自检
111
137
 
112
- 以下原则指定**方向**,模型自主决定**如何**执行:
138
+ ### 进度心跳
113
139
 
114
- 1. **先定义完成,再开始执行** 每个目标都需要可测试的完成标准。验证力度匹配错误成本
115
- 2. **承诺当前计划,卡住时换方向** 新信息更新信念,不自动更新计划。同一方法连续失败时换策略,三次失败后质疑前提。每次意外失败都问:这揭示了哪个假设是错的?
116
- 3. **永不空手而归** 任意时刻中断都应有可用产出。按价值排序交付
117
- 4. **上下文是稀缺资源** 探索性工作用 sub-agent 隔离;大阶段完成后压缩保留决策和结论;关键中间结果外化到文件
118
- 5. **对齐不是一次性事件** — 发现目标理解偏差时,回到对齐。连续成功对齐后可降低确认频率,遇到意外时重新提高
140
+ - 完成一个 Phase → 一句话报告进展 + 下一步预告
141
+ - 连续 5+ 工具调用无文本输出 → 插入一句进展说明
142
+ - 遇到意外或方向变化 立即告知用户并说明原因
143
+ - 预估剩余时间显著变化 更新用户预期
144
+
145
+ 用户不应感到"黑箱"。但心跳是一句话,不是段落。
146
+
147
+ ### 执行后自检
148
+
149
+ 完成代码修改后,**必须用适当手段验证**:
150
+
151
+ - 有编译器/类型检查 → 运行它
152
+ - 有相关测试 → 运行它
153
+ - 无自动化手段 → 人工 review 关键路径,向用户说明验证范围和局限
154
+
155
+ 自检失败 → 修复后再报告完成。不要把失败的产出交给用户。
119
156
 
120
157
  ---
121
158
 
122
159
  ## 上下文纪律
123
160
 
124
- | 策略 | 时机 |
125
- |------|------|
126
- | **隔离** — 搜索/读大文件/查资料用 sub-agent | 会污染主上下文的工作 |
127
- | **压缩** — 已完成阶段只保留决策和结论 | 大阶段完成后 |
128
- | **外化** — 关键发现/决策写入状态文件 | 重要信息出现时 |
161
+ | 策略 | 时机 |
162
+ | ---------------------------------------------------- | -------------------- |
163
+ | **隔离** — 搜索/读大文件/查资料用 sub-agent | 会污染主上下文的工作 |
164
+ | **压缩** — 已完成阶段只保留决策和结论 | 大阶段完成后 |
165
+ | **外化** — 关键发现/决策写入状态文件 | 重要信息出现时 |
166
+ | **预算感知** — 上下文接近极限时主动压缩或外化 | 对话持续较长时 |
129
167
 
130
168
  压缩时必须保留:当前目标、完成标准、关键决策及理由、已修改文件、未完成待办。
131
169
 
132
170
  ---
133
171
 
134
- ## 恢复协议
172
+ ## 经验进化(条件触发)
135
173
 
136
- 恢复中断的任务时:
137
- 1. 读取 `.tasks/auto-goal-{id}/state.md`(Tier 1 定位)
138
- 2. 验证声称的产出是否真实存在(Glob/Read 轻量确认)
139
- 3. 根据当前需要加载 Tier 2 文件
140
- 4. 读取 `.tasks/experience.md` 摘要(如存在)
141
- 5. 用 TaskCreate 重建 UI 进度
142
- 6. 从"下一步"继续
174
+ **触发条件**(满足任一才写 experience.md):
143
175
 
144
- ---
176
+ - 执行中遇到意外、踩坑、策略转换
177
+ - 发现反直觉的技术事实
178
+ - 找到了跨任务可复用的模式
179
+
180
+ **不触发时**:任务顺利完成且无新发现 → 标注"无新经验",直接交付。不要为了仪式感而编造经验。
145
181
 
146
- ## 经验进化(交付门控)
182
+ **执行**(触发时):
147
183
 
148
- **结构性规则**:经验进化是交付的前置条件——**不写 experience.md,不交付结果**。这不是建议,而是与首轮对齐同等强制的流程步骤。state.md `Phase Final: 收尾` 追踪此步,未勾选即未完成。
184
+ 1. 写入 `.tasks/experience.md`(每条:编号 / 场景 / 发现 / 适用范围)
185
+ 2. 更新 state.md 的 Phase Final(如有状态文件)
186
+ 3. 交付结果
149
187
 
150
- **触发时机**:所有执行阶段完成后、向用户交付结果前。
188
+ **经验应用**:新任务启动时读取 experience.md(如存在),应用时告知用户("基于经验 E3,采用…")。每次应用后记录验证结果(✓有效 / ✗无效 / — 不适用)。
151
189
 
152
- **执行步骤**(三步,不可省略):
190
+ **全局提升**:经验累计 3+ 次 ✓有效 → 调用 AskUserQuestion 向用户提议提升至 `~/.claude/memory/`。
153
191
 
154
- 1. **提取经验** — 写入 `.tasks/experience.md`
155
- - 每条经验:编号 / 场景 / 发现 / 适用范围
156
- - 只记录反直觉的、踩坑才知道的、跨任务可复用的发现
157
- - 跳过显而易见的技术常识
158
- 2. **更新 state.md** — 勾选 `Phase Final` 中的经验进化项
159
- 3. **交付结果** — 此时才向用户呈现最终交付
192
+ **收敛**:条目 >20 条时合并相似、淘汰无效。
160
193
 
161
- **新任务启动时**:读取 experience.md(如存在),应用经验时告知用户("基于经验 E3,采用…")。每次应用后记录验证结果(✓有效 / ✗无效 / — 不适用)。
194
+ ---
162
195
 
163
- **全局提升** — 经验累计 3+ 次 ✓有效 后:
164
- - **必须调用 AskUserQuestion** 向用户提议提升至 `~/.claude/memory/`
165
- - 用户确认后写入全局,拒绝则标记为"仅项目级"
196
+ ## 恢复协议
166
197
 
167
- **收敛**:条目 >20 条时合并相似、淘汰无效。
198
+ 恢复中断任务时,Read `references/recovery.md` 获取详细流程。
199
+
200
+ 简要流程:读 state.md → 验证产出真实存在(Glob/Read 确认)→ 按需加载 Tier 2 → 读 experience.md → TaskCreate 重建 UI 进度 → 从"下一步"继续。
168
201
 
169
202
  ---
170
203
 
@@ -174,3 +207,14 @@ last-updated: {timestamp}
174
207
  - **全自动**:仅不可逆操作前确认
175
208
 
176
209
  未声明时默认协作。
210
+
211
+ ---
212
+
213
+ ## 参考文件索引
214
+
215
+ 以下文件按需 Read,不预加载:
216
+
217
+ | 文件 | 何时加载 |
218
+ | -------------------------------- | ----------------------------------------------------------------- |
219
+ | `references/state-template.md` | 创建状态文件时(含完整模板、轻量模板、Tier 2 说明、并行标注约定) |
220
+ | `references/recovery.md` | 恢复中断任务时(含标准流程和 fallback 路径) |
@@ -0,0 +1,29 @@
1
+ # 恢复协议
2
+
3
+ 恢复中断的 auto-goal 任务时,按以下步骤执行:
4
+
5
+ ## 标准恢复流程
6
+
7
+ 1. **定位** — 读取 `.tasks/auto-goal-{id}/state.md`(Tier 1)
8
+ 2. **验证** — Glob/Read 轻量确认声称的产出是否真实存在
9
+ 3. **加载上下文** — 根据当前需要加载 Tier 2 文件(context.md / decisions.md / reflections.md)
10
+ 4. **读经验** — 读取 `.tasks/experience.md`(如存在)
11
+ 5. **重建 UI** — 用 TaskCreate 重建进度显示
12
+ 6. **继续** — 从 state.md 的"下一步"继续执行
13
+
14
+ ## Fallback:state.md 不存在时
15
+
16
+ 如果 `.tasks/` 目录不存在或为空(用户换了环境、清理了文件):
17
+
18
+ 1. **从 git 重建** — `git log --oneline -20` + `git diff --stat` 了解最近工作
19
+ 2. **从文件重建** — Glob 查找最近修改的文件,推断进度
20
+ 3. **向用户确认** — 呈现你重建的理解,确认后继续
21
+ 4. **创建新 state.md** — 基于重建的理解创建,避免再次丢失
22
+
23
+ ## 恢复后验证清单
24
+
25
+ - [ ] state.md 中标记 [done] 的 Phase,产出文件确实存在
26
+ - [ ] 当前 Phase 的"已完成子任务"对应的代码变更确实存在
27
+ - [ ] 没有遗留的半完成修改(编译错误、broken import 等)
28
+
29
+ 验证失败 → 将对应项标回 pending,从正确的状态重新开始。
@@ -0,0 +1,97 @@
1
+ # 状态文件模板
2
+
3
+ ## 完整状态文件(≥10 步任务)
4
+
5
+ 创建路径:`.tasks/auto-goal-{id}/state.md`
6
+
7
+ ```markdown
8
+ ---
9
+ status: in-progress
10
+ last-updated: {timestamp}
11
+ ---
12
+
13
+ ## 目标与完成标准
14
+ [用户确认的目标]
15
+ - [ ] 可测试的完成标准 1
16
+ - [ ] 可测试的完成标准 2
17
+
18
+ ## 进度
19
+ ### Phase 1: {name} [done]
20
+ ### Phase 2: {name} [active]
21
+ - [x] 已完成子任务
22
+ - [ ] → 当前进行中 ⟂
23
+ - [ ] 待做子任务 ⟂
24
+ - [ ] 依赖项 (depends: 上两项)
25
+ ### Phase 3: {name} [pending]
26
+ ### Phase Final: 收尾 [pending]
27
+ - [ ] 经验进化(如有新发现)
28
+ - [ ] 交付结果
29
+
30
+ ## 已修改文件
31
+
32
+ ## 下一步
33
+
34
+ ## 活跃风险与未确认假设
35
+
36
+ ## Tier 2 索引
37
+ | 文件 | 摘要 | 条目数 |
38
+ |------|------|--------|
39
+ ```
40
+
41
+ **≤40 行原则**:state.md 是索引,不是文档。超出时移入 Tier 2。
42
+
43
+ ---
44
+
45
+ ## 轻量 checkpoint(6-9 步任务)
46
+
47
+ 同样创建 `.tasks/auto-goal-{id}/state.md`,但只需:
48
+
49
+ ```markdown
50
+ ---
51
+ status: in-progress
52
+ last-updated: {timestamp}
53
+ ---
54
+
55
+ ## 目标
56
+ [一句话目标]
57
+
58
+ ## 进度
59
+ - [x] 已完成
60
+ - [ ] → 当前
61
+ - [ ] 待做
62
+
63
+ ## 下一步
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Tier 2 文件(按需创建)
69
+
70
+ ```
71
+ .tasks/auto-goal-{id}/
72
+ ├── state.md # Tier 1:核心状态索引
73
+ ├── context.md # Tier 2:世界模型详情
74
+ ├── decisions.md # Tier 2:决策日志
75
+ └── reflections.md # Tier 2:反思日志
76
+ ```
77
+
78
+ ### context.md
79
+ - 环境上下文(技术栈、项目结构发现)
80
+ - 约束空间(不可行路径、硬限制)
81
+ - 信念状态:✓已验证 / ~假设 / ?待验
82
+
83
+ ### decisions.md
84
+ - 每条:决策 + 理由 + 被排除的替代方案
85
+ - 格式:`### D{n}: {决策标题}` + 正文
86
+
87
+ ### reflections.md
88
+ - 失败根因 + 揭示的错误假设 + 策略调整
89
+ - 格式:`### R{n}: {事件}` + 分析
90
+
91
+ ---
92
+
93
+ ## 并行标注约定
94
+
95
+ 在 state.md 进度中:
96
+ - `⟂` — 该任务可与同级其他 `⟂` 任务并行
97
+ - `(depends: X, Y)` — 该任务依赖 X 和 Y 完成后才能开始
@@ -27,10 +27,10 @@ export async function doctorCommand() {
27
27
  const ruleFiles = await fs.readdir(templateRulesDir);
28
28
  for (const file of ruleFiles) {
29
29
  if (!file.endsWith('.md')) continue;
30
- checks.push(await check(`rules/ace/${file}`, fs.pathExists(path.join(CLAUDE_DIR, rulesDir, file))));
30
+ checks.push(await check(`ace/rules/${file}`, fs.pathExists(path.join(CLAUDE_DIR, rulesDir, file))));
31
31
  }
32
32
  } catch {
33
- checks.push({ name: 'rules/ace/ directory', ok: false });
33
+ checks.push({ name: 'ace/rules/ directory', ok: false });
34
34
  }
35
35
  }
36
36
 
@@ -91,14 +91,21 @@ export async function doctorCommand() {
91
91
  checks.push({ name: 'settings.json parseable', ok: false });
92
92
  }
93
93
 
94
- // 8. Validate CLAUDE.md @references
94
+ // 8. Validate CLAUDE.md references (both @refs and path-index style)
95
95
  try {
96
96
  const claudeMd = await fs.readFile(path.join(CLAUDE_DIR, 'CLAUDE.md'), 'utf-8');
97
- const refs = claudeMd.match(/@~?\/?\.?claude\/[^\s)]+/g) || [];
98
- for (const ref of refs) {
97
+ // Check @references (legacy format)
98
+ const atRefs = claudeMd.match(/@~?\/?\.?claude\/[^\s)]+/g) || [];
99
+ for (const ref of atRefs) {
99
100
  const refPath = ref.replace(/^@/, '').replace(/^~/, process.env.HOME || process.env.USERPROFILE);
100
101
  checks.push(await check(`@ref: ${path.basename(refPath)}`, fs.pathExists(refPath)));
101
102
  }
103
+ // Check path-index style references (new format: lines starting with "- ~/.claude/...")
104
+ const pathRefs = claudeMd.match(/(?:^|\n)-\s+(~\/.claude\/[^\s—]+)/g) || [];
105
+ for (const match of pathRefs) {
106
+ const refPath = match.replace(/(?:^|\n)-\s+/, '').replace(/^~/, process.env.HOME || process.env.USERPROFILE);
107
+ checks.push(await check(`path: ${path.basename(refPath)}`, fs.pathExists(refPath)));
108
+ }
102
109
  } catch {
103
110
  checks.push({ name: 'CLAUDE.md readable', ok: false });
104
111
  }
@@ -14,7 +14,6 @@ const componentLabels = {
14
14
  rules: 'Rules',
15
15
  plugin: 'Plugin',
16
16
  hooks: 'Hooks',
17
- hookify: 'Safety Guards',
18
17
  memory: 'Memory',
19
18
  };
20
19
 
@@ -91,6 +90,11 @@ export async function initCommand(options) {
91
90
 
92
91
  s.start('Installing...');
93
92
 
93
+ // Prepare: migrate legacy directory structure if needed
94
+ if (!options.dryRun) {
95
+ await installer.prepare();
96
+ }
97
+
94
98
  for (const componentName of components) {
95
99
  const component = COMPONENTS[componentName];
96
100
  if (!component) continue;
@@ -149,8 +153,8 @@ export async function initCommand(options) {
149
153
  '',
150
154
  'Customize',
151
155
  ' Change role edit ~/.claude/memory/user_profile.md',
152
- ' Adjust rules edit ~/.claude/rules/ace/',
153
- ' Safety guards edit ~/.claude/hookify.ace.*.local.md',
156
+ ' Adjust rules edit ~/.claude/ace/rules/',
157
+ ' Safety guards edit ~/.claude/hooks/ace.*.sh',
154
158
  ' Verify setup ace doctor',
155
159
  ].join('\n'),
156
160
  'Next steps'
@@ -224,8 +228,8 @@ async function buildInstallPreview(installer, components) {
224
228
  try {
225
229
  const existing = await fs.readFile(path.join(installer.targetDir, item.dest), 'utf-8');
226
230
  const template = await fs.readFile(path.join(installer.templatesDir, item.src), 'utf-8');
227
- const { added } = mergeClaudeMd(existing, template);
228
- item.detail = added.length > 0 ? `adds ${added.length} new @references` : 'up to date';
231
+ const { content } = mergeClaudeMd(existing, template);
232
+ item.detail = content !== existing ? 'will update managed section' : 'up to date';
229
233
  } catch {
230
234
  item.detail = 'will merge';
231
235
  }