evo-skills 0.1.0

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 (188) hide show
  1. package/.eslintrc.json +36 -0
  2. package/.prettierrc +11 -0
  3. package/README.md +227 -0
  4. package/USER-GUIDE.md +382 -0
  5. package/dist/cli/commands/diff.d.ts +7 -0
  6. package/dist/cli/commands/diff.d.ts.map +1 -0
  7. package/dist/cli/commands/diff.js +126 -0
  8. package/dist/cli/commands/diff.js.map +1 -0
  9. package/dist/cli/commands/freeze.d.ts +12 -0
  10. package/dist/cli/commands/freeze.d.ts.map +1 -0
  11. package/dist/cli/commands/freeze.js +93 -0
  12. package/dist/cli/commands/freeze.js.map +1 -0
  13. package/dist/cli/commands/log.d.ts +7 -0
  14. package/dist/cli/commands/log.d.ts.map +1 -0
  15. package/dist/cli/commands/log.js +76 -0
  16. package/dist/cli/commands/log.js.map +1 -0
  17. package/dist/cli/commands/rollback.d.ts +7 -0
  18. package/dist/cli/commands/rollback.d.ts.map +1 -0
  19. package/dist/cli/commands/rollback.js +92 -0
  20. package/dist/cli/commands/rollback.js.map +1 -0
  21. package/dist/cli/commands/status.d.ts +7 -0
  22. package/dist/cli/commands/status.d.ts.map +1 -0
  23. package/dist/cli/commands/status.js +88 -0
  24. package/dist/cli/commands/status.js.map +1 -0
  25. package/dist/cli/index.d.ts +3 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +25 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config/defaults.d.ts +6 -0
  30. package/dist/config/defaults.d.ts.map +1 -0
  31. package/dist/config/defaults.js +31 -0
  32. package/dist/config/defaults.js.map +1 -0
  33. package/dist/config/index.d.ts +68 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +195 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/core/evaluator/base-rule.d.ts +50 -0
  38. package/dist/core/evaluator/base-rule.d.ts.map +1 -0
  39. package/dist/core/evaluator/base-rule.js +69 -0
  40. package/dist/core/evaluator/base-rule.js.map +1 -0
  41. package/dist/core/evaluator/index.d.ts +33 -0
  42. package/dist/core/evaluator/index.d.ts.map +1 -0
  43. package/dist/core/evaluator/index.js +74 -0
  44. package/dist/core/evaluator/index.js.map +1 -0
  45. package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
  46. package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
  47. package/dist/core/evaluator/rules/repeated-drift.js +82 -0
  48. package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
  49. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
  50. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
  51. package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
  52. package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
  53. package/dist/core/journal/index.d.ts +76 -0
  54. package/dist/core/journal/index.d.ts.map +1 -0
  55. package/dist/core/journal/index.js +207 -0
  56. package/dist/core/journal/index.js.map +1 -0
  57. package/dist/core/observer/base-observer.d.ts +64 -0
  58. package/dist/core/observer/base-observer.d.ts.map +1 -0
  59. package/dist/core/observer/base-observer.js +142 -0
  60. package/dist/core/observer/base-observer.js.map +1 -0
  61. package/dist/core/observer/codex-observer.d.ts +71 -0
  62. package/dist/core/observer/codex-observer.d.ts.map +1 -0
  63. package/dist/core/observer/codex-observer.js +248 -0
  64. package/dist/core/observer/codex-observer.js.map +1 -0
  65. package/dist/core/observer/index.d.ts +7 -0
  66. package/dist/core/observer/index.d.ts.map +1 -0
  67. package/dist/core/observer/index.js +7 -0
  68. package/dist/core/observer/index.js.map +1 -0
  69. package/dist/core/observer/trace-manager.d.ts +82 -0
  70. package/dist/core/observer/trace-manager.d.ts.map +1 -0
  71. package/dist/core/observer/trace-manager.js +196 -0
  72. package/dist/core/observer/trace-manager.js.map +1 -0
  73. package/dist/core/origin-registry/index.d.ts +59 -0
  74. package/dist/core/origin-registry/index.d.ts.map +1 -0
  75. package/dist/core/origin-registry/index.js +235 -0
  76. package/dist/core/origin-registry/index.js.map +1 -0
  77. package/dist/core/patch-generator/base-strategy.d.ts +35 -0
  78. package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
  79. package/dist/core/patch-generator/base-strategy.js +55 -0
  80. package/dist/core/patch-generator/base-strategy.js.map +1 -0
  81. package/dist/core/patch-generator/index.d.ts +32 -0
  82. package/dist/core/patch-generator/index.d.ts.map +1 -0
  83. package/dist/core/patch-generator/index.js +101 -0
  84. package/dist/core/patch-generator/index.js.map +1 -0
  85. package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
  86. package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
  87. package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
  88. package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
  89. package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
  90. package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
  91. package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
  92. package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
  93. package/dist/core/shadow-manager/index.d.ts +65 -0
  94. package/dist/core/shadow-manager/index.d.ts.map +1 -0
  95. package/dist/core/shadow-manager/index.js +229 -0
  96. package/dist/core/shadow-manager/index.js.map +1 -0
  97. package/dist/core/shadow-registry/index.d.ts +68 -0
  98. package/dist/core/shadow-registry/index.d.ts.map +1 -0
  99. package/dist/core/shadow-registry/index.js +173 -0
  100. package/dist/core/shadow-registry/index.js.map +1 -0
  101. package/dist/daemon/index.d.ts +43 -0
  102. package/dist/daemon/index.d.ts.map +1 -0
  103. package/dist/daemon/index.js +144 -0
  104. package/dist/daemon/index.js.map +1 -0
  105. package/dist/storage/index.d.ts +7 -0
  106. package/dist/storage/index.d.ts.map +1 -0
  107. package/dist/storage/index.js +7 -0
  108. package/dist/storage/index.js.map +1 -0
  109. package/dist/storage/markdown.d.ts +66 -0
  110. package/dist/storage/markdown.d.ts.map +1 -0
  111. package/dist/storage/markdown.js +227 -0
  112. package/dist/storage/markdown.js.map +1 -0
  113. package/dist/storage/ndjson.d.ts +118 -0
  114. package/dist/storage/ndjson.d.ts.map +1 -0
  115. package/dist/storage/ndjson.js +238 -0
  116. package/dist/storage/ndjson.js.map +1 -0
  117. package/dist/storage/sqlite.d.ts +131 -0
  118. package/dist/storage/sqlite.d.ts.map +1 -0
  119. package/dist/storage/sqlite.js +415 -0
  120. package/dist/storage/sqlite.js.map +1 -0
  121. package/dist/types/index.d.ts +158 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +5 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/utils/diff.d.ts +20 -0
  126. package/dist/utils/diff.d.ts.map +1 -0
  127. package/dist/utils/diff.js +47 -0
  128. package/dist/utils/diff.js.map +1 -0
  129. package/dist/utils/hash.d.ts +17 -0
  130. package/dist/utils/hash.d.ts.map +1 -0
  131. package/dist/utils/hash.js +28 -0
  132. package/dist/utils/hash.js.map +1 -0
  133. package/dist/utils/index.d.ts +8 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +8 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/logger.d.ts +11 -0
  138. package/dist/utils/logger.d.ts.map +1 -0
  139. package/dist/utils/logger.js +64 -0
  140. package/dist/utils/logger.js.map +1 -0
  141. package/dist/utils/path.d.ts +67 -0
  142. package/dist/utils/path.d.ts.map +1 -0
  143. package/dist/utils/path.js +115 -0
  144. package/dist/utils/path.js.map +1 -0
  145. package/docs/ENGINEERING_PLAN.md +1065 -0
  146. package/docs/PRD.md +1004 -0
  147. package/docs/PROGRESS.md +523 -0
  148. package/package.json +60 -0
  149. package/src/cli/commands/diff.ts +158 -0
  150. package/src/cli/commands/freeze.ts +108 -0
  151. package/src/cli/commands/log.ts +87 -0
  152. package/src/cli/commands/rollback.ts +99 -0
  153. package/src/cli/commands/status.ts +101 -0
  154. package/src/cli/index.ts +31 -0
  155. package/src/config/defaults.ts +32 -0
  156. package/src/config/index.ts +220 -0
  157. package/src/core/evaluator/base-rule.ts +90 -0
  158. package/src/core/evaluator/index.ts +86 -0
  159. package/src/core/evaluator/rules/repeated-drift.ts +109 -0
  160. package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
  161. package/src/core/journal/index.ts +286 -0
  162. package/src/core/observer/base-observer.ts +200 -0
  163. package/src/core/observer/codex-observer.ts +309 -0
  164. package/src/core/observer/index.ts +7 -0
  165. package/src/core/observer/trace-manager.ts +250 -0
  166. package/src/core/origin-registry/index.ts +264 -0
  167. package/src/core/patch-generator/base-strategy.ts +67 -0
  168. package/src/core/patch-generator/index.ts +118 -0
  169. package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
  170. package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
  171. package/src/core/shadow-manager/index.ts +278 -0
  172. package/src/core/shadow-registry/index.ts +200 -0
  173. package/src/daemon/index.ts +174 -0
  174. package/src/storage/index.ts +7 -0
  175. package/src/storage/markdown.ts +267 -0
  176. package/src/storage/ndjson.ts +273 -0
  177. package/src/storage/sqlite.ts +555 -0
  178. package/src/types/index.ts +212 -0
  179. package/src/utils/diff.ts +60 -0
  180. package/src/utils/hash.ts +31 -0
  181. package/src/utils/index.ts +8 -0
  182. package/src/utils/logger.ts +78 -0
  183. package/src/utils/path.ts +129 -0
  184. package/tests/unit/config.test.ts +65 -0
  185. package/tests/unit/path.test.ts +89 -0
  186. package/tests/unit/utils.test.ts +45 -0
  187. package/tsconfig.json +31 -0
  188. package/vitest.config.ts +19 -0
@@ -0,0 +1,1065 @@
1
+ # EVO Skills 工程计划 v1.0
2
+
3
+ ## 1. 技术栈选型
4
+
5
+ ### 1.1 核心技术栈
6
+
7
+ | 组件 | 技术选型 | 理由 |
8
+ |------|---------|------|
9
+ | **语言** | TypeScript | 类型安全、生态丰富、与 Node.js 原生集成 |
10
+ | **运行时** | Node.js 18+ | 跨平台、异步 I/O 优秀、CLI 工具成熟 |
11
+ | **CLI 框架** | Commander.js | 轻量、灵活、广泛使用 |
12
+ | **数据库** | SQLite (better-sqlite3) | 轻量、无需服务、单文件存储 |
13
+ | **文件监控** | chokidar | 跨平台文件监听、性能优秀 |
14
+ | **Diff/Patch** | diff (npm) | 生成和应用 unified diff |
15
+ | **Hash** | crypto (Node.js 内置) | 文件版本标识 |
16
+ | **日志** | winston | 灵活的日志级别和输出配置 |
17
+ | **配置管理** | cosmiconfig | 支持多种配置文件格式 |
18
+
19
+ ### 1.2 开发工具链
20
+
21
+ | 工具 | 用途 |
22
+ |------|------|
23
+ | **TypeScript Compiler** | 类型检查和编译 |
24
+ | **ESLint** | 代码规范检查 |
25
+ | **Prettier** | 代码格式化 |
26
+ | **Vitest** | 单元测试框架 |
27
+ | **tsx** | TypeScript 直接执行(开发用) |
28
+ | **pkg / esbuild** | 打包为可执行文件 |
29
+
30
+ ---
31
+
32
+ ## 2. 项目结构
33
+
34
+ ```
35
+ EVOSkills/
36
+ ├── src/
37
+ │ ├── cli/ # CLI 命令入口
38
+ │ │ ├── index.ts # 主入口
39
+ │ │ ├── commands/ # 各命令实现
40
+ │ │ │ ├── status.ts
41
+ │ │ │ ├── log.ts
42
+ │ │ │ ├── diff.ts
43
+ │ │ │ ├── rollback.ts
44
+ │ │ │ ├── freeze.ts
45
+ │ │ │ ├── unfreeze.ts
46
+ │ │ │ ├── optimize.ts
47
+ │ │ │ └── rebase.ts
48
+ │ │ └── utils/
49
+ │ │ ├── formatter.ts # 输出格式化
50
+ │ │ └── prompt.ts # 交互提示
51
+ │ │
52
+ │ ├── core/ # 核心业务逻辑
53
+ │ │ ├── origin-registry/ # Origin Skill 注册表
54
+ │ │ │ ├── index.ts
55
+ │ │ │ ├── scanner.ts # 扫描本机 skills
56
+ │ │ │ └── types.ts
57
+ │ │ │
58
+ │ │ ├── shadow-registry/ # Shadow Skill 注册表
59
+ │ │ │ ├── index.ts
60
+ │ │ │ ├── manager.ts # Shadow 生命周期管理
61
+ │ │ │ └── types.ts
62
+ │ │ │
63
+ │ │ ├── observer/ # 观察层
64
+ │ │ │ ├── index.ts
65
+ │ │ │ ├── base-observer.ts
66
+ │ │ │ ├── codex-observer.ts
67
+ │ │ │ ├── opencode-observer.ts
68
+ │ │ │ ├── claude-observer.ts
69
+ │ │ │ └── types.ts
70
+ │ │ │
71
+ │ │ ├── evaluator/ # 演化评估器
72
+ │ │ │ ├── index.ts
73
+ │ │ │ ├── rules/ # 评估规则
74
+ │ │ │ │ ├── repeated-manual-fix.ts
75
+ │ │ │ │ ├── repeated-drift.ts
76
+ │ │ │ │ ├── overly-broad-trigger.ts
77
+ │ │ │ │ └── noisy-redundancy.ts
78
+ │ │ │ └── types.ts
79
+ │ │ │
80
+ │ │ ├── patch-generator/ # Patch 生成器
81
+ │ │ │ ├── index.ts
82
+ │ │ │ ├── strategies/ # 各类 patch 策略
83
+ │ │ │ │ ├── append-context.ts
84
+ │ │ │ │ ├── tighten-trigger.ts
85
+ │ │ │ │ ├── add-fallback.ts
86
+ │ │ │ │ ├── prune-noise.ts
87
+ │ │ │ │ └── rewrite-section.ts
88
+ │ │ │ └── types.ts
89
+ │ │ │
90
+ │ │ ├── journal/ # 日志管理
91
+ │ │ │ ├── index.ts
92
+ │ │ │ ├── writer.ts # 写入 journal
93
+ │ │ │ ├── reader.ts # 读取 journal
94
+ │ │ │ ├── snapshot.ts # 快照管理
95
+ │ │ │ └── rollback.ts # 回滚逻辑
96
+ │ │ │
97
+ │ │ └── shadow-manager/ # Shadow Skill 主控制器
98
+ │ │ ├── index.ts
99
+ │ │ ├── orchestrator.ts # 编排器
100
+ │ │ └── types.ts
101
+ │ │
102
+ │ ├── storage/ # 存储层
103
+ │ │ ├── sqlite.ts # SQLite 封装
104
+ │ │ ├── ndjson.ts # NDJSON 读写
105
+ │ │ ├── markdown.ts # Markdown skill 文件操作
106
+ │ │ └── types.ts
107
+ │ │
108
+ │ ├── daemon/ # 后台服务
109
+ │ │ ├── index.ts # 守护进程入口
110
+ │ │ ├── watcher.ts # 文件/事件监听
111
+ │ │ └── scheduler.ts # 定时任务调度
112
+ │ │
113
+ │ ├── types/ # 全局类型定义
114
+ │ │ ├── origin-skill.ts
115
+ │ │ ├── shadow-skill.ts
116
+ │ │ ├── evolution-record.ts
117
+ │ │ ├── trace.ts
118
+ │ │ └── index.ts
119
+ │ │
120
+ │ ├── config/ # 配置管理
121
+ │ │ ├── index.ts
122
+ │ │ ├── defaults.ts
123
+ │ │ └── schema.ts
124
+ │ │
125
+ │ └── utils/ # 工具函数
126
+ │ ├── hash.ts
127
+ │ ├── diff.ts
128
+ │ ├── path.ts
129
+ │ ├── logger.ts
130
+ │ └── validation.ts
131
+
132
+ ├── tests/ # 测试文件
133
+ │ ├── unit/
134
+ │ │ ├── origin-registry.test.ts
135
+ │ │ ├── shadow-registry.test.ts
136
+ │ │ ├── evaluator.test.ts
137
+ │ │ ├── patch-generator.test.ts
138
+ │ │ ├── journal.test.ts
139
+ │ │ └── shadow-manager.test.ts
140
+ │ ├── integration/
141
+ │ │ ├── observer-integration.test.ts
142
+ │ │ ├── full-evolution-cycle.test.ts
143
+ │ │ └── rollback.test.ts
144
+ │ └── fixtures/ # 测试数据
145
+ │ ├── skills/
146
+ │ ├── traces/
147
+ │ └── projects/
148
+
149
+ ├── docs/ # 文档
150
+ │ ├── PRD.md
151
+ │ ├── ENGINEERING_PLAN.md
152
+ │ ├── API.md
153
+ │ └── ARCHITECTURE.md
154
+
155
+ ├── scripts/ # 构建/工具脚本
156
+ │ ├── build.ts
157
+ │ ├── dev.ts
158
+ │ └── test.ts
159
+
160
+ ├── package.json
161
+ ├── tsconfig.json
162
+ ├── .eslintrc.json
163
+ ├── .prettierrc
164
+ ├── vitest.config.ts
165
+ └── README.md
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 3. 核心模块详细设计
171
+
172
+ ### 3.1 Origin Registry(Origin Skill 注册表)
173
+
174
+ **职责**:
175
+ - 扫描用户本机已安装的 skills 目录
176
+ - 维护 OriginSkill 元数据列表
177
+ - 检测 origin 版本变化
178
+ - 提供 origin skill 查询接口
179
+
180
+ **关键接口**:
181
+ ```typescript
182
+ interface IOriginRegistry {
183
+ // 扫描所有配置的 skill 目录
184
+ scan(): Promise<OriginSkill[]>;
185
+
186
+ // 获取指定 skill
187
+ get(skillId: string): OriginSkill | null;
188
+
189
+ // 获取所有 skills
190
+ list(): OriginSkill[];
191
+
192
+ // 检测 skill 是否有更新
193
+ checkUpdate(skillId: string): Promise<boolean>;
194
+
195
+ // 读取 origin skill 内容
196
+ readContent(skillId: string): Promise<string>;
197
+ }
198
+
199
+ interface OriginSkill {
200
+ skill_id: string;
201
+ origin_path: string;
202
+ origin_version: string; // file hash
203
+ source: 'local' | 'marketplace' | 'git';
204
+ installed_at: string;
205
+ last_seen_at: string;
206
+ }
207
+ ```
208
+
209
+ **配置**:
210
+ ```toml
211
+ # ~/.evo/settings.toml
212
+ [origin_paths]
213
+ paths = [
214
+ "~/.skills",
215
+ "~/.claude/skills",
216
+ "~/.opencode/skills"
217
+ ]
218
+
219
+ [scan]
220
+ auto_scan_interval = 3600 # 秒
221
+ ```
222
+
223
+ ---
224
+
225
+ ### 3.2 Shadow Registry(Shadow Skill 注册表)
226
+
227
+ **职责**:
228
+ - 管理项目内的 shadow skills
229
+ - 首次命中 origin skill 时自动 fork
230
+ - 维护 shadow 与 origin 的映射关系
231
+ - 管理 shadow 生命周期状态
232
+
233
+ **关键接口**:
234
+ ```typescript
235
+ interface IShadowRegistry {
236
+ // 获取项目的 shadow skill
237
+ get(projectId: string, skillId: string): ProjectSkillShadow | null;
238
+
239
+ // 列出项目的所有 shadow skills
240
+ listByProject(projectId: string): ProjectSkillShadow[];
241
+
242
+ // 从 origin 创建 shadow
243
+ fork(projectId: string, skillId: string): Promise<ProjectSkillShadow>;
244
+
245
+ // 更新 shadow 状态
246
+ updateStatus(shadowId: string, status: ShadowStatus): void;
247
+
248
+ // 检查 shadow 是否存在
249
+ exists(projectId: string, skillId: string): boolean;
250
+ }
251
+
252
+ type ShadowStatus = 'active' | 'frozen' | 'rebasing' | 'needs_attention';
253
+
254
+ interface ProjectSkillShadow {
255
+ project_id: string;
256
+ skill_id: string;
257
+ shadow_id: string; // "A@repo-x"
258
+ origin_skill_id: string;
259
+ origin_version_at_fork: string;
260
+ shadow_path: string;
261
+ current_revision: number;
262
+ status: ShadowStatus;
263
+ created_at: string;
264
+ last_optimized_at: string;
265
+ }
266
+ ```
267
+
268
+ **项目目录结构初始化**:
269
+ ```
270
+ project/
271
+ └── .evo/
272
+ ├── skills/
273
+ │ └── {skill_id}/
274
+ │ ├── current.md # 当前内容
275
+ │ ├── meta.json # 元数据
276
+ │ ├── journal.ndjson # 演化日志
277
+ │ └── snapshots/ # 快照
278
+ │ ├── rev_0005.md
279
+ │ └── rev_0010.md
280
+ ├── state/
281
+ │ ├── sessions.db # SQLite 数据库
282
+ │ ├── traces.ndjson # 原始 trace
283
+ │ └── runtime_state.json # 运行时状态
284
+ └── config/
285
+ └── settings.toml # 项目配置
286
+ ```
287
+
288
+ ---
289
+
290
+ ### 3.3 Observer Layer(观察层)
291
+
292
+ **职责**:
293
+ - 从不同 runtime 获取执行 trace
294
+ - 标准化 trace 格式
295
+ - 持久化 trace 到本地存储
296
+
297
+ **架构**:
298
+ ```typescript
299
+ interface IObserver {
300
+ readonly name: string;
301
+ start(): Promise<void>;
302
+ stop(): Promise<void>;
303
+ onTrace(callback: (trace: Trace) => void): void;
304
+ }
305
+
306
+ interface Trace {
307
+ trace_id: string;
308
+ runtime: 'codex' | 'opencode' | 'claude';
309
+ session_id: string;
310
+ turn_id: string;
311
+ event_type: 'user_input' | 'assistant_output' | 'tool_call' |
312
+ 'tool_result' | 'file_change' | 'retry' | 'status';
313
+ timestamp: string;
314
+ user_input?: string;
315
+ assistant_output?: string;
316
+ tool_name?: string;
317
+ tool_args?: Record<string, any>;
318
+ tool_result?: Record<string, any>;
319
+ files_changed?: string[];
320
+ status: 'success' | 'failure' | 'retry' | 'interrupted';
321
+ metadata?: Record<string, any>;
322
+ }
323
+ ```
324
+
325
+ **Observer 实现优先级**:
326
+ 1. **Codex Observer**(Phase 1)
327
+ - 监听 `codex exec --json` 输出
328
+ - 解析 JSONL 事件流
329
+ - 读取本地 session 日志
330
+
331
+ 2. **OpenCode Observer**(Phase 2)
332
+ - 通过插件事件系统采集
333
+ - 使用 session/export API
334
+
335
+ 3. **Claude Observer**(Phase 3)
336
+ - 使用 hooks 捕捉生命周期
337
+ - 解析 transcript 文件
338
+
339
+ ---
340
+
341
+ ### 3.4 Evolution Evaluator(演化评估器)
342
+
343
+ **职责**:
344
+ - 分析 trace 数据
345
+ - 判断 shadow skill 是否需要优化
346
+ - 输出评估结果
347
+
348
+ **评估规则**:
349
+
350
+ #### 规则 1:Repeated Manual Fix(重复人工修复)
351
+ ```
352
+ 触发条件:
353
+ - 同类任务中,主 Agent 输出后用户总是补充相同步骤
354
+ - 出现次数 >= 3 次
355
+ - 来源 session >= 2 个
356
+
357
+ 输出:
358
+ - change_type: "add_fallback" | "append_context"
359
+ - reason: "用户在 {N} 个 session 中重复手动补充 {步骤描述}"
360
+ ```
361
+
362
+ #### 规则 2:Repeated Drift(重复绕过)
363
+ ```
364
+ 触发条件:
365
+ - skill 被命中但执行反复绕过某一段
366
+ - 绕过次数 >= 3 次
367
+
368
+ 输出:
369
+ - change_type: "rewrite_section" | "prune_noise"
370
+ - reason: "skill 中 {section} 在 {N} 次执行中被绕过"
371
+ ```
372
+
373
+ #### 规则 3:Overly Broad Trigger(触发过宽)
374
+ ```
375
+ 触发条件:
376
+ - skill 在不合适的场景被频繁触发
377
+ - 误触发率 > 30%
378
+
379
+ 输出:
380
+ - change_type: "tighten_trigger"
381
+ - reason: "skill 在 {场景} 中被误触发 {N} 次"
382
+ ```
383
+
384
+ #### 规则 4:Noisy Redundancy(冗余噪音)
385
+ ```
386
+ 触发条件:
387
+ - 某些说明长期不影响执行
388
+ - 被忽略次数 >= 5 次
389
+
390
+ 输出:
391
+ - change_type: "prune_noise"
392
+ - reason: "{section} 在最近 {N} 次执行中未被使用"
393
+ ```
394
+
395
+ **关键接口**:
396
+ ```typescript
397
+ interface IEvaluator {
398
+ evaluate(shadow: ProjectSkillShadow, traces: Trace[]): EvaluationResult;
399
+ }
400
+
401
+ interface EvaluationResult {
402
+ should_patch: boolean;
403
+ change_type?: ChangeType;
404
+ reason?: string;
405
+ source_sessions: string[];
406
+ confidence: number; // 0-1
407
+ target_section?: string; // 要修改的 section
408
+ }
409
+
410
+ type ChangeType = 'append_context' | 'tighten_trigger' |
411
+ 'add_fallback' | 'prune_noise' | 'rewrite_section';
412
+ ```
413
+
414
+ ---
415
+
416
+ ### 3.5 Patch Generator(Patch 生成器)
417
+
418
+ **职责**:
419
+ - 根据评估结果生成具体 patch
420
+ - 应用 patch 到 shadow skill
421
+ - 生成 unified diff
422
+
423
+ **Patch 策略**:
424
+
425
+ ```typescript
426
+ interface IPatchGenerator {
427
+ generate(
428
+ shadow: ProjectSkillShadow,
429
+ evaluation: EvaluationResult,
430
+ currentContent: string
431
+ ): PatchResult;
432
+
433
+ apply(content: string, patch: string): string;
434
+ }
435
+
436
+ interface PatchResult {
437
+ success: boolean;
438
+ patch: string; // unified diff
439
+ newContent: string;
440
+ changeType: ChangeType;
441
+ error?: string;
442
+ }
443
+ ```
444
+
445
+ **各策略实现**:
446
+
447
+ 1. **AppendContextStrategy**
448
+ - 在适当位置追加上下文说明
449
+ - 识别 skill 结构,找到最佳插入点
450
+
451
+ 2. **TightenTriggerStrategy**
452
+ - 修改 frontmatter 中的 triggers
453
+ - 添加更具体的条件
454
+
455
+ 3. **AddFallbackStrategy**
456
+ - 在相关步骤后添加 fallback 说明
457
+ - 保持格式一致
458
+
459
+ 4. **PruneNoiseStrategy**
460
+ - 删除被忽略的冗余说明
461
+ - 保留核心逻辑
462
+
463
+ 5. **RewriteSectionStrategy**
464
+ - 局部重写某个 section
465
+ - 保留原始结构框架
466
+
467
+ ---
468
+
469
+ ### 3.6 Journal Manager(日志管理器)
470
+
471
+ **职责**:
472
+ - 管理 evolution journal(append-only)
473
+ - 生成和管理 snapshots
474
+ - 提供 rollback 能力
475
+
476
+ **关键接口**:
477
+ ```typescript
478
+ interface IJournalManager {
479
+ // 记录一次演化
480
+ record(shadowId: string, record: Omit<EvolutionRecord, 'revision'>): number;
481
+
482
+ // 获取 journal
483
+ getJournal(shadowId: string, options?: {
484
+ fromRevision?: number;
485
+ toRevision?: number;
486
+ limit?: number;
487
+ }): EvolutionRecord[];
488
+
489
+ // 生成 snapshot
490
+ createSnapshot(shadowId: string, revision: number): Promise<void>;
491
+
492
+ // 回滚到指定 revision
493
+ rollback(shadowId: string, targetRevision: number): Promise<void>;
494
+
495
+ // 回滚到上一个 snapshot
496
+ rollbackToSnapshot(shadowId: string): Promise<void>;
497
+
498
+ // 获取所有 snapshots
499
+ listSnapshots(shadowId: string): SnapshotInfo[];
500
+ }
501
+
502
+ interface EvolutionRecord {
503
+ revision: number;
504
+ shadow_id: string;
505
+ timestamp: string;
506
+ reason: string;
507
+ source_sessions: string[];
508
+ change_type: ChangeType;
509
+ patch: string;
510
+ before_hash: string;
511
+ after_hash: string;
512
+ applied_by: 'auto' | 'manual';
513
+ }
514
+
515
+ interface SnapshotInfo {
516
+ revision: number;
517
+ timestamp: string;
518
+ file_path: string;
519
+ content_hash: string;
520
+ }
521
+ ```
522
+
523
+ **Snapshot 策略**:
524
+ - 每 5 次 revision 自动 snapshot 一次
525
+ - `rewrite_section` 类型 patch 完成后立即 snapshot
526
+ - 用户手动 rollback 时自动创建 snapshot
527
+
528
+ ---
529
+
530
+ ### 3.7 Shadow Skill Manager(主控制器)
531
+
532
+ **职责**:
533
+ - 编排整个演化流程
534
+ - 接收 trace 并分发处理
535
+ - 协调各子模块
536
+ - 管理自动优化策略
537
+
538
+ **核心流程**:
539
+ ```typescript
540
+ interface IShadowManager {
541
+ // 处理新的 trace
542
+ processTrace(trace: Trace): Promise<void>;
543
+
544
+ // 手动触发优化
545
+ triggerOptimize(shadowId: string): Promise<EvaluationResult>;
546
+
547
+ // 获取 shadow 状态
548
+ getShadowState(shadowId: string): ShadowSkillState;
549
+ }
550
+
551
+ interface ShadowSkillState {
552
+ shadow_id: string;
553
+ current_content_hash: string;
554
+ current_revision: number;
555
+ last_hit_at: string;
556
+ last_optimized_at: string;
557
+ hit_count: number;
558
+ success_count: number;
559
+ manual_override_count: number;
560
+ health_score: number; // 0-100
561
+ }
562
+ ```
563
+
564
+ **自动优化策略配置**:
565
+ ```typescript
566
+ interface AutoOptimizePolicy {
567
+ min_signal_count: number; // 最少信号次数,默认 3
568
+ min_source_sessions: number; // 最少来源 session,默认 2
569
+ min_confidence: number; // 最小置信度,默认 0.7
570
+ cooldown_hours: number; // 冷却时间(小时),默认 24
571
+ max_patches_per_day: number; // 每日最大 patch 数,默认 3
572
+ pause_after_rollback_hours: number; // 回滚后暂停时间,默认 48
573
+ }
574
+ ```
575
+
576
+ ---
577
+
578
+ ## 4. 数据库设计
579
+
580
+ ### 4.1 SQLite 表结构
581
+
582
+ ```sql
583
+ -- Shadow Skills 表
584
+ CREATE TABLE shadow_skills (
585
+ shadow_id TEXT PRIMARY KEY,
586
+ project_id TEXT NOT NULL,
587
+ skill_id TEXT NOT NULL,
588
+ origin_skill_id TEXT NOT NULL,
589
+ origin_version_at_fork TEXT NOT NULL,
590
+ shadow_path TEXT NOT NULL,
591
+ current_revision INTEGER DEFAULT 0,
592
+ status TEXT DEFAULT 'active',
593
+ created_at TEXT NOT NULL,
594
+ last_optimized_at TEXT,
595
+ hit_count INTEGER DEFAULT 0,
596
+ success_count INTEGER DEFAULT 0,
597
+ manual_override_count INTEGER DEFAULT 0,
598
+ health_score REAL DEFAULT 100.0,
599
+ UNIQUE(project_id, skill_id)
600
+ );
601
+
602
+ -- Evolution Records 表(索引用,完整记录在 ndjson)
603
+ CREATE TABLE evolution_records_index (
604
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
605
+ shadow_id TEXT NOT NULL,
606
+ revision INTEGER NOT NULL,
607
+ timestamp TEXT NOT NULL,
608
+ change_type TEXT NOT NULL,
609
+ source_sessions TEXT, -- JSON array
610
+ confidence REAL,
611
+ FOREIGN KEY (shadow_id) REFERENCES shadow_skills(shadow_id)
612
+ );
613
+
614
+ -- Snapshots 表
615
+ CREATE TABLE snapshots (
616
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
617
+ shadow_id TEXT NOT NULL,
618
+ revision INTEGER NOT NULL,
619
+ timestamp TEXT NOT NULL,
620
+ file_path TEXT NOT NULL,
621
+ content_hash TEXT NOT NULL,
622
+ FOREIGN KEY (shadow_id) REFERENCES shadow_skills(shadow_id)
623
+ );
624
+
625
+ -- Sessions 表
626
+ CREATE TABLE sessions (
627
+ session_id TEXT PRIMARY KEY,
628
+ runtime TEXT NOT NULL,
629
+ project_id TEXT,
630
+ started_at TEXT NOT NULL,
631
+ ended_at TEXT,
632
+ trace_count INTEGER DEFAULT 0
633
+ );
634
+
635
+ -- Traces 索引表
636
+ CREATE TABLE traces_index (
637
+ trace_id TEXT PRIMARY KEY,
638
+ session_id TEXT NOT NULL,
639
+ runtime TEXT NOT NULL,
640
+ event_type TEXT NOT NULL,
641
+ timestamp TEXT NOT NULL,
642
+ status TEXT,
643
+ FOREIGN KEY (session_id) REFERENCES sessions(session_id)
644
+ );
645
+
646
+ -- 创建索引
647
+ CREATE INDEX idx_shadow_project ON shadow_skills(project_id);
648
+ CREATE INDEX idx_evolution_shadow ON evolution_records_index(shadow_id);
649
+ CREATE INDEX idx_traces_session ON traces_index(session_id);
650
+ CREATE INDEX idx_traces_timestamp ON traces_index(timestamp);
651
+ ```
652
+
653
+ ---
654
+
655
+ ## 5. 实现阶段规划
656
+
657
+ ### Phase 1: 基础框架(2 周)
658
+
659
+ **目标**:搭建项目骨架,实现核心数据结构
660
+
661
+ **任务清单**:
662
+ - [x] 项目初始化(package.json, tsconfig, eslint)
663
+ - [ ] 全局类型定义
664
+ - [ ] 配置管理系统
665
+ - [ ] 工具函数库(hash, diff, path, logger)
666
+ - [ ] SQLite 存储层
667
+ - [ ] NDJSON 读写器
668
+ - [ ] Markdown 文件操作器
669
+
670
+ **交付物**:
671
+ - 可运行的空项目框架
672
+ - 存储层单元测试通过
673
+
674
+ ---
675
+
676
+ ### Phase 2: Origin & Shadow Registry(2 周)
677
+
678
+ **目标**:实现 skill 发现和 shadow 管理
679
+
680
+ **任务清单**:
681
+ - [ ] Origin Registry
682
+ - [ ] 目录扫描器
683
+ - [ ] 版本 hash 计算
684
+ - [ ] Origin 列表管理
685
+ - [ ] Shadow Registry
686
+ - [ ] Shadow 创建(fork)
687
+ - [ ] Shadow 状态管理
688
+ - [ ] 项目目录结构初始化
689
+ - [ ] Journal Manager 基础版
690
+ - [ ] Journal 写入
691
+ - [ ] Journal 读取
692
+ - [ ] Revision 管理
693
+
694
+ **交付物**:
695
+ - `sea skills status` 命令可用
696
+ - 能自动发现 origin skills
697
+ - 能创建 shadow skills
698
+
699
+ ---
700
+
701
+ ### Phase 3: Observer Layer(2 周)
702
+
703
+ **目标**:实现 trace 采集
704
+
705
+ **任务清单**:
706
+ - [ ] Observer 基类
707
+ - [ ] Trace 数据模型
708
+ - [ ] Trace 存储(NDJSON + SQLite 索引)
709
+ - [ ] Codex Observer
710
+ - [ ] JSONL 事件流解析
711
+ - [ ] Session 日志读取
712
+ - [ ] 文件变化检测
713
+
714
+ **交付物**:
715
+ - 能从 Codex 采集 trace
716
+ - Trace 数据正确存储
717
+
718
+ ---
719
+
720
+ ### Phase 4: Evaluator & Patch Generator(3 周)
721
+
722
+ **目标**:实现自动优化核心逻辑
723
+
724
+ **任务清单**:
725
+ - [ ] Evaluator 框架
726
+ - [ ] Repeated Manual Fix 规则
727
+ - [ ] Repeated Drift 规则
728
+ - [ ] Overly Broad Trigger 规则
729
+ - [ ] Noisy Redundancy 规则
730
+ - [ ] Patch Generator 框架
731
+ - [ ] AppendContext 策略
732
+ - [ ] AddFallback 策略
733
+ - [ ] TightenTrigger 策略
734
+ - [ ] PruneNoise 策略
735
+ - [ ] RewriteSection 策略
736
+ - [ ] Patch 应用器
737
+ - [ ] Unified Diff 生成器
738
+
739
+ **交付物**:
740
+ - 能自动评估是否需要优化
741
+ - 能生成和应用 patch
742
+
743
+ ---
744
+
745
+ ### Phase 5: Shadow Manager & 自动循环(2 周)
746
+
747
+ **目标**:实现完整的自动演化循环
748
+
749
+ **任务清单**:
750
+ - [ ] Shadow Manager 编排器
751
+ - [ ] Trace 处理流程
752
+ - [ ] 评估触发逻辑
753
+ - [ ] Patch 执行流程
754
+ - [ ] 自动优化策略
755
+ - [ ] 信号计数
756
+ - [ ] 冷却窗口
757
+ - [ ] 置信度阈值
758
+ - [ ] Snapshot 管理
759
+ - [ ] 自动 snapshot
760
+ - [ ] Snapshot 创建
761
+ - [ ] 后台守护进程
762
+ - [ ] 文件监听
763
+ - [ ] 定时任务
764
+
765
+ **交付物**:
766
+ - 完整的 Observe → Evaluate → Patch → Journal 循环
767
+ - 后台自动运行
768
+
769
+ ---
770
+
771
+ ### Phase 6: Rollback & Rebase(1.5 周)
772
+
773
+ **目标**:实现回滚和 origin 同步
774
+
775
+ **任务清单**:
776
+ - [ ] Rollback 功能
777
+ - [ ] 回滚到指定 revision
778
+ - [ ] 回滚到 snapshot
779
+ - [ ] 回滚到初始版本
780
+ - [ ] Origin 更新检测
781
+ - [ ] Rebase 策略
782
+ - [ ] 差异检测
783
+ - [ ] Patch 重放
784
+ - [ ] 冲突处理
785
+ - [ ] `sea skills rollback` 命令
786
+ - [ ] `sea skills rebase` 命令
787
+
788
+ **交付物**:
789
+ - 完整的回滚能力
790
+ - Origin 更新同步
791
+
792
+ ---
793
+
794
+ ### Phase 7: CLI 完善 & 集成(1.5 周)
795
+
796
+ **目标**:完善所有 CLI 命令
797
+
798
+ **任务清单**:
799
+ - [ ] `sea skills status` 完善
800
+ - [ ] `sea skills log` 命令
801
+ - [ ] `sea skills diff` 命令
802
+ - [ ] `sea skills freeze/unfreeze` 命令
803
+ - [ ] `sea optimize` 命令
804
+ - [ ] 输出格式化
805
+ - [ ] 交互式提示
806
+ - [ ] 错误处理和用户友好提示
807
+
808
+ **交付物**:
809
+ - 所有 CLI 命令可用
810
+ - 用户体验优化
811
+
812
+ ---
813
+
814
+ ### Phase 8: 测试 & 打包(2 周)
815
+
816
+ **目标**:全面测试和发布准备
817
+
818
+ **任务清单**:
819
+ - [ ] 单元测试补全
820
+ - [ ] 所有核心模块 >= 80% 覆盖率
821
+ - [ ] 集成测试
822
+ - [ ] 完整演化周期测试
823
+ - [ ] Rollback 测试
824
+ - [ ] 并发场景测试
825
+ - [ ] E2E 测试
826
+ - [ ] 真实项目场景测试
827
+ - [ ] 性能测试
828
+ - [ ] 大量 trace 处理
829
+ - [ ] 长时间运行稳定性
830
+ - [ ] 打包和分发
831
+ - [ ] npm 包配置
832
+ - [ ] 二进制打包(可选)
833
+ - [ ] 安装脚本
834
+ - [ ] 文档完善
835
+ - [ ] 用户使用手册
836
+ - [ ] API 文档
837
+ - [ ] 开发者指南
838
+
839
+ **交付物**:
840
+ - 可发布的 npm 包
841
+ - 完整文档
842
+
843
+ ---
844
+
845
+ ## 6. 关键技术决策
846
+
847
+ ### 6.1 为什么选择 TypeScript + Node.js
848
+
849
+ 1. **生态匹配**:主 Agent(Codex/OpenCode/Claude)都是 Node.js 生态
850
+ 2. **CLI 友好**:Node.js 的 CLI 工具开发成熟
851
+ 3. **异步模型**:适合事件驱动的 observer 架构
852
+ 4. **类型安全**:复杂的状态管理需要类型保障
853
+
854
+ ### 6.2 为什么选择 SQLite
855
+
856
+ 1. **轻量**:单文件数据库,无需服务
857
+ 2. **可靠**:ACID 事务,数据安全
858
+ 3. **性能**:对于本场景足够快
859
+ 4. **跨平台**:Node.js 原生支持好
860
+
861
+ ### 6.3 为什么用 NDJSON 存储 Trace 和 Journal
862
+
863
+ 1. **Append-only 友好**:天然支持追加写入
864
+ 2. **可读性**:文本格式,便于调试
865
+ 3. **流式处理**:可以逐行处理大文件
866
+ 4. **简单**:无需复杂查询时,比 SQLite 更简单
867
+
868
+ ### 6.4 Shadow Skill 用 Markdown 而非 JSON
869
+
870
+ 1. **Skill 本身是 Markdown**:保持格式一致
871
+ 2. **人类可读**:便于用户理解和手动编辑
872
+ 3. **Diff 友好**:Git diff 天然支持
873
+ 4. **灵活**:支持各种 skill 格式变体
874
+
875
+ ---
876
+
877
+ ## 7. 配置系统设计
878
+
879
+ ### 7.1 全局配置(~/.evo/settings.toml)
880
+
881
+ ```toml
882
+ [origin_paths]
883
+ paths = ["~/.skills", "~/.claude/skills"]
884
+
885
+ [observer]
886
+ enabled_runtimes = ["codex", "opencode", "claude"]
887
+ trace_retention_days = 30
888
+
889
+ [evaluator]
890
+ min_signal_count = 3
891
+ min_source_sessions = 2
892
+ min_confidence = 0.7
893
+
894
+ [patch]
895
+ allowed_types = ["append_context", "tighten_trigger", "add_fallback", "prune_noise"]
896
+ cooldown_hours = 24
897
+ max_patches_per_day = 3
898
+
899
+ [journal]
900
+ snapshot_interval = 5
901
+ max_snapshots = 20
902
+
903
+ [daemon]
904
+ auto_start = true
905
+ log_level = "info"
906
+ ```
907
+
908
+ ### 7.2 项目配置(.evo/config/settings.toml)
909
+
910
+ ```toml
911
+ [project]
912
+ name = "my-project"
913
+ auto_optimize = true
914
+
915
+ [skills]
916
+ # 特定 skill 的配置覆盖
917
+ [skills.A]
918
+ auto_optimize = false # 冻结此 skill
919
+
920
+ [skills.B]
921
+ allowed_patch_types = ["append_context"] # 只允许追加上下文
922
+ ```
923
+
924
+ ---
925
+
926
+ ## 8. 错误处理策略
927
+
928
+ ### 8.1 错误分级
929
+
930
+ | 级别 | 处理方式 | 示例 |
931
+ |------|---------|------|
932
+ | **Fatal** | 终止运行,提示用户 | 数据库损坏、配置文件格式错误 |
933
+ | **Error** | 记录日志,跳过当前操作 | Patch 失败、Shadow 创建失败 |
934
+ | **Warning** | 记录日志,继续运行 | Trace 解析部分失败、Origin 路径不存在 |
935
+ | **Info** | 仅记录日志 | 优化评估结果、Snapshot 创建 |
936
+
937
+ ### 8.2 Patch 失败处理
938
+
939
+ ```typescript
940
+ interface PatchFailureStrategy {
941
+ // 重试次数
942
+ maxRetries: number; // 默认 2
943
+
944
+ // 失败后行为
945
+ onFailure: 'skip' | 'pause_skill' | 'notify_user';
946
+
947
+ // 记录失败
948
+ logFailure: boolean;
949
+ }
950
+ ```
951
+
952
+ ---
953
+
954
+ ## 9. 测试策略
955
+
956
+ ### 9.1 单元测试
957
+
958
+ **覆盖目标**:核心模块 >= 80%
959
+
960
+ **重点测试**:
961
+ - Evaluator 规则逻辑
962
+ - Patch Generator 各策略
963
+ - Journal 读写和回滚
964
+ - Hash 计算和 Diff 生成
965
+
966
+ ### 9.2 集成测试
967
+
968
+ **场景**:
969
+ 1. 完整演化周期:Trace → Evaluate → Patch → Journal
970
+ 2. Rollback 流程:Patch → Snapshot → Rollback → 验证
971
+ 3. Origin Rebase:Origin 更新 → 差异检测 → Patch 重放
972
+
973
+ ### 9.3 E2E 测试
974
+
975
+ **场景**:
976
+ 1. 模拟 Codex 执行 → 自动创建 shadow → 自动优化
977
+ 2. 多 session 并发 → 信号累积 → 触发优化
978
+ 3. 回滚后恢复 → 验证内容正确
979
+
980
+ ---
981
+
982
+ ## 10. 依赖清单
983
+
984
+ ### 10.1 生产依赖
985
+
986
+ ```json
987
+ {
988
+ "commander": "^11.0.0",
989
+ "better-sqlite3": "^9.0.0",
990
+ "chokidar": "^3.5.3",
991
+ "diff": "^5.1.0",
992
+ "cosmiconfig": "^8.3.0",
993
+ "winston": "^3.11.0",
994
+ "glob": "^10.3.0",
995
+ "toml": "^3.0.0",
996
+ "chalk": "^5.3.0",
997
+ "ora": "^7.0.0"
998
+ }
999
+ ```
1000
+
1001
+ ### 10.2 开发依赖
1002
+
1003
+ ```json
1004
+ {
1005
+ "typescript": "^5.3.0",
1006
+ "tsx": "^4.7.0",
1007
+ "vitest": "^1.0.0",
1008
+ "eslint": "^8.50.0",
1009
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
1010
+ "@typescript-eslint/parser": "^6.0.0",
1011
+ "prettier": "^3.0.0",
1012
+ "@types/better-sqlite3": "^7.6.0",
1013
+ "@types/diff": "^5.0.0",
1014
+ "@types/node": "^20.0.0"
1015
+ }
1016
+ ```
1017
+
1018
+ ---
1019
+
1020
+ ## 11. 时间估算
1021
+
1022
+ | 阶段 | 时间 | 累计 |
1023
+ |------|------|------|
1024
+ | Phase 1: 基础框架 | 2 周 | 2 周 |
1025
+ | Phase 2: Registry | 2 周 | 4 周 |
1026
+ | Phase 3: Observer | 2 周 | 6 周 |
1027
+ | Phase 4: Evaluator & Patch | 3 周 | 9 周 |
1028
+ | Phase 5: 自动循环 | 2 周 | 11 周 |
1029
+ | Phase 6: Rollback & Rebase | 1.5 周 | 12.5 周 |
1030
+ | Phase 7: CLI | 1.5 周 | 14 周 |
1031
+ | Phase 8: 测试 & 打包 | 2 周 | 16 周 |
1032
+
1033
+ **预计总工期**:16 周(约 4 个月)
1034
+
1035
+ ---
1036
+
1037
+ ## 12. 风险和缓解
1038
+
1039
+ | 风险 | 概率 | 影响 | 缓解措施 |
1040
+ |------|------|------|---------|
1041
+ | Patch 质量不稳定 | 中 | 高 | 严格的置信度阈值 + 快速回滚 |
1042
+ | Trace 采集不完整 | 中 | 中 | 多信号源冗余 + 手动补充机制 |
1043
+ | 性能问题 | 低 | 中 | 异步处理 + 批量操作 |
1044
+ | Origin 兼容性 | 低 | 中 | 版本检测 + 差异告警 |
1045
+
1046
+ ---
1047
+
1048
+ ## 13. MVP 验收标准
1049
+
1050
+ MVP 完成后应满足:
1051
+
1052
+ 1. ✅ 能自动发现本机 origin skills
1053
+ 2. ✅ 能在项目中创建 shadow skills
1054
+ 3. ✅ 能从 Codex 采集 trace
1055
+ 4. ✅ 能自动执行 3 类 patch(append_context, add_fallback, tighten_trigger)
1056
+ 5. ✅ 能写入 journal 和创建 snapshot
1057
+ 6. ✅ 能回滚到指定 revision
1058
+ 7. ✅ 所有 CLI 命令可用
1059
+ 8. ✅ 单元测试覆盖率 >= 70%
1060
+
1061
+ ---
1062
+
1063
+ *文档版本:v1.0*
1064
+ *最后更新:2026-03-19*
1065
+ *作者:Engineering Team*