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
package/docs/PRD.md ADDED
@@ -0,0 +1,1004 @@
1
+ EVO Skills 设计文档 v2
2
+ 0. 一句话定义
3
+
4
+ EVO Skills 是一个后台常驻的元 Agent。它不会替代主 Agent 执行任务,而是持续观察主 Agent 的真实执行,并为每个项目维护一份来自全局 Skill 的影子副本(Shadow Skill),再基于 trace 对这份影子副本做小步、自动、可回滚的持续优化。
5
+
6
+ 1. 设计目标
7
+ 1.1 产品目标
8
+
9
+ 让用户几乎无感地获得这样一种效果:
10
+
11
+ 我本机安装的通用 skill,在不同项目里会自动长成更适合这个项目的版本,而且这个过程是后台持续发生的,不需要我手动管理复杂的 skills 分支体系。
12
+
13
+ 1.2 关键设计原则
14
+ A. 用户无感
15
+
16
+ 产品应尽量不要求用户理解:
17
+
18
+ branch
19
+
20
+ merge
21
+
22
+ draft
23
+
24
+ active
25
+
26
+ deprecated
27
+
28
+ skill tree 管理
29
+
30
+ 用户只需要知道:
31
+
32
+ 自己本机有原始 skill
33
+
34
+ 每个项目里系统会自动维护更适配本项目的影子 skill
35
+
36
+ 如果优化出问题,可以回滚
37
+
38
+ B. 单实体演化,不做多分支管理
39
+
40
+ 对于同一个 origin skill A,在某个项目里只维护一个 shadow skill A',以及它的演化日志。
41
+ 不默认创建多个 branch。
42
+
43
+ C. 本地隔离
44
+
45
+ 所有自动优化优先作用于项目级 shadow skill,不污染全局 origin skill。
46
+
47
+ D. 小步修改、持续积累
48
+
49
+ 系统不追求大改,而是通过大量小步 patch 持续提升 shadow skill 的项目适配性。
50
+
51
+ E. 可回滚
52
+
53
+ 所有自动修改都必须有演化记录、revision、checkpoint,保证可回退。
54
+
55
+ 2. 核心模型
56
+
57
+ 这套设计的核心不是 Skill Tree,而是:
58
+
59
+ Origin Skill + Project Shadow Skill + Evolution Journal
60
+ 2.1 Origin Skill
61
+
62
+ Origin Skill 是用户本机已有的、全局安装的 skill。
63
+ 它可能来自:
64
+
65
+ 用户自己写的 skill
66
+
67
+ 官方 / 第三方 skill 市场安装的 skill
68
+
69
+ 从 git / repo 拷贝来的通用 skill
70
+
71
+ 它的特点是:
72
+
73
+ 面向全局
74
+
75
+ 默认不被自动修改
76
+
77
+ 作为各项目影子 skill 的“源头版本”
78
+
79
+ 示意:
80
+
81
+ ~/.skills/
82
+ A/
83
+ B/
84
+ C/
85
+ 2.2 Project Shadow Skill
86
+
87
+ 当某个项目第一次实际使用到全局 skill A 时,EVO Skills 会自动在该项目下创建一个影子副本:
88
+
89
+ repo-x/.evo/skills/A/
90
+
91
+ 这个项目内副本就是 A'。
92
+
93
+ 它的特点是:
94
+
95
+ 只属于当前项目
96
+
97
+ 是主 Agent 在这个项目中的实际消费版本
98
+
99
+ 可被后台自动优化
100
+
101
+ 与 origin A 保持来源关系,但不共享运行时状态
102
+
103
+ 2.3 Evolution Journal
104
+
105
+ 每次对 A' 的修改,不创建新 branch,而是直接:
106
+
107
+ 对当前 A' 做 patch
108
+
109
+ 记录一条 append-only 的演化日志
110
+
111
+ 周期性生成 checkpoint
112
+
113
+ 所以版本关系不是树,而是一条线:
114
+
115
+ A (origin)
116
+ └── A' rev1 -> rev2 -> rev3 -> rev4 ...
117
+
118
+ 这个模型更像:
119
+
120
+ 文档修订历史
121
+
122
+ 本地长期学习副本
123
+
124
+ 单实体演进体
125
+
126
+ 而不是复杂知识图谱。
127
+
128
+ 3. 用户体验设计
129
+ 3.1 默认行为
130
+
131
+ 用户启动主 Agent 后,EVO Skills 在后台运行。
132
+ 默认情况下用户不需要主动操作。
133
+
134
+ 它会自动完成:
135
+
136
+ 观察主 Agent 的任务执行
137
+
138
+ 识别项目中被使用到的全局 skill
139
+
140
+ 创建对应 shadow skill
141
+
142
+ 持续收集 trace
143
+
144
+ 判断 shadow skill 是否需要优化
145
+
146
+ 小步 patch
147
+
148
+ 写入 journal
149
+
150
+ 必要时生成 checkpoint
151
+
152
+ 3.2 用户感知的最小界面
153
+
154
+ V1 不需要复杂 UI。
155
+ 只需要最小的几个交互:
156
+
157
+ 查看当前项目有哪些 shadow skills
158
+ evo skills status
159
+ 查看某个 shadow skill 的最近优化记录
160
+ evo skills log A
161
+ 回滚某个 shadow skill 到某个 revision / checkpoint
162
+ evo skills rollback A --to rev_12
163
+ 暂停某个 skill 的自动优化
164
+ evo skills freeze A
165
+ 恢复自动优化
166
+ evo skills unfreeze A
167
+ 4. 系统职责划分
168
+ 4.1 主 Agent 负责什么
169
+
170
+ 主 Agent 继续负责原本的事情:
171
+
172
+ 接收用户任务
173
+
174
+ 调工具
175
+
176
+ 修改代码 / 文件
177
+
178
+ 输出回答
179
+
180
+ 完成业务工作
181
+
182
+ 4.2 EVO Skills 负责什么
183
+
184
+ EVO Skills 只负责 skill 本身:
185
+
186
+ 观察 trace
187
+
188
+ 检查 skill 命中与实际执行的偏差
189
+
190
+ 从失败 / retry / manual fix 中提取优化信号
191
+
192
+ 修改 shadow skill
193
+
194
+ 记录 revision / journal / checkpoint
195
+
196
+ 在必要时提示用户是否需要同步或回滚
197
+
198
+ 5. 系统运行循环
199
+
200
+ 新版本不再采用复杂的 branch lifecycle,而采用一个更轻的循环:
201
+
202
+ Observe → Evaluate → Patch A' → Journal
203
+ 5.1 Observe
204
+
205
+ 持续观察主 Agent 的外显执行过程,包括:
206
+
207
+ 用户输入
208
+
209
+ assistant 输出
210
+
211
+ tool calls
212
+
213
+ tool results
214
+
215
+ file changes
216
+
217
+ retry / interruption
218
+
219
+ 用户人工修正
220
+
221
+ 当前命中的 skill 文件
222
+
223
+ 这一步的目标不是理解内部思维,而是建立“这次执行到底怎么走的”的外显轨迹。
224
+
225
+ 5.2 Evaluate
226
+
227
+ 基于 trace 判断当前项目中的 shadow skill A' 是否存在优化机会。
228
+ 重点判断:
229
+
230
+ skill 是否频繁被绕开
231
+
232
+ skill 中某段说明是否总被忽略
233
+
234
+ 某种 fallback 是否被反复手动使用
235
+
236
+ 某段规则是否已不适合当前项目
237
+
238
+ 某些步骤是否冗余
239
+
240
+ 某种项目上下文是否值得写入 skill
241
+
242
+ 这一步不做“树分叉判断”,而只做:
243
+
244
+ 当前这个 A' 是否应该再往前修一步
245
+
246
+ 5.3 Patch A'
247
+
248
+ 如果满足条件,则直接对 A' 做局部修改。
249
+ V1 只支持小步 patch,不做大规模重写。
250
+
251
+ 修改类型建议限制为 5 类:
252
+
253
+ append_context:补充项目特定上下文
254
+
255
+ tighten_trigger:收紧适用条件
256
+
257
+ add_fallback:补写高频 fallback
258
+
259
+ prune_noise:删除低价值噪音描述
260
+
261
+ rewrite_section:局部重写某一小段
262
+
263
+ 5.4 Journal
264
+
265
+ 每次 patch 后,系统必须:
266
+
267
+ revision +1
268
+
269
+ 记录 patch 原因
270
+
271
+ 记录来源 session
272
+
273
+ 记录 before/after hash
274
+
275
+ 写入 journal
276
+
277
+ 按策略生成 checkpoint
278
+
279
+ 这样就形成一条单实体演化链。
280
+
281
+ 6. 核心对象设计
282
+ 6.1 OriginSkill
283
+
284
+ 表示全局原始 skill。
285
+
286
+ {
287
+ "skill_id": "A",
288
+ "origin_path": "~/.skills/A",
289
+ "origin_version": "hash_or_semver",
290
+ "source": "local|marketplace|git",
291
+ "installed_at": "",
292
+ "last_seen_at": ""
293
+ }
294
+
295
+ 说明:
296
+
297
+ origin_version 可以先用 hash,不必强依赖 semver
298
+
299
+ origin 默认只读,不自动修改
300
+
301
+ 6.2 ProjectSkillShadow
302
+
303
+ 表示某个项目中的影子 skill。
304
+
305
+ {
306
+ "project_id": "repo-x",
307
+ "skill_id": "A",
308
+ "shadow_id": "A@repo-x",
309
+ "origin_skill_id": "A",
310
+ "origin_version_at_fork": "hash_001",
311
+ "shadow_path": "repo-x/.evo/skills/A/current.md",
312
+ "current_revision": 12,
313
+ "status": "active|frozen",
314
+ "created_at": "",
315
+ "last_optimized_at": ""
316
+ }
317
+
318
+ 说明:
319
+
320
+ 一个项目里同一个 origin skill 只对应一个 shadow skill
321
+
322
+ status=frozen 表示暂停自动优化,但仍可被主 Agent 消费
323
+
324
+ 6.3 EvolutionRecord
325
+
326
+ 表示一次演化记录。
327
+
328
+ {
329
+ "revision": 12,
330
+ "shadow_id": "A@repo-x",
331
+ "timestamp": "",
332
+ "reason": "Repeated manual fallback after root lint failure",
333
+ "source_sessions": ["s1", "s2", "s3"],
334
+ "change_type": "append_context|tighten_trigger|add_fallback|prune_noise|rewrite_section",
335
+ "patch": "...",
336
+ "before_hash": "",
337
+ "after_hash": "",
338
+ "applied_by": "auto|manual"
339
+ }
340
+
341
+ 说明:
342
+
343
+ patch 推荐保存 unified diff 或结构化 patch
344
+
345
+ 这是 append-only 的,不修改历史
346
+
347
+ 6.4 ShadowSkillState
348
+
349
+ 表示当前运行状态。
350
+
351
+ {
352
+ "shadow_id": "A@repo-x",
353
+ "current_content_hash": "",
354
+ "current_revision": 12,
355
+ "last_hit_at": "",
356
+ "last_optimized_at": "",
357
+ "hit_count": 0,
358
+ "success_count": 0,
359
+ "manual_override_count": 0,
360
+ "health_score": 0.0
361
+ }
362
+
363
+ 说明:
364
+
365
+ health_score 不是绝对准确值,只是一个粗健康度指标
366
+
367
+ 先用于内部判断和 CLI 提示
368
+
369
+ 7. 项目目录结构
370
+
371
+ 建议每个项目内维护一个 .evo/ 目录:
372
+
373
+ repo-x/
374
+ .evo/
375
+ skills/
376
+ A/
377
+ current.md
378
+ meta.json
379
+ journal.ndjson
380
+ snapshots/
381
+ rev_0005.md
382
+ rev_0010.md
383
+ B/
384
+ current.md
385
+ meta.json
386
+ journal.ndjson
387
+ snapshots/
388
+ state/
389
+ sessions.db
390
+ traces.ndjson
391
+ runtime_state.json
392
+ config/
393
+ settings.toml
394
+ 7.1 current.md
395
+
396
+ 当前项目生效中的 shadow skill 内容。
397
+
398
+ 7.2 meta.json
399
+
400
+ 保存 ProjectSkillShadow + ShadowSkillState 的当前状态。
401
+
402
+ 7.3 journal.ndjson
403
+
404
+ append-only 演化记录。
405
+
406
+ 7.4 snapshots/
407
+
408
+ 少量检查点文件。
409
+ 建议每隔 N 次 revision 或重大 patch 生成一次。
410
+
411
+ 7.5 state/
412
+
413
+ 本地 trace、session 状态、运行态缓存。
414
+
415
+ 8. 技术架构
416
+ Main Agent Runtime
417
+ ├─ Codex
418
+ ├─ OpenCode
419
+ └─ Claude Code
420
+
421
+ Observer Layer
422
+
423
+ Trace Store
424
+
425
+ Shadow Skill Manager
426
+ ├─ Origin Registry
427
+ ├─ Shadow Registry
428
+ ├─ Evolution Evaluator
429
+ ├─ Patch Generator
430
+ └─ Journal Manager
431
+
432
+ Project Shadow Skills (.evo/skills/*)
433
+ 9. 模块设计
434
+ 9.1 Origin Registry
435
+
436
+ 职责:
437
+
438
+ 扫描用户本机已安装 skills
439
+
440
+ 维护 OriginSkill 列表
441
+
442
+ 识别 origin 是否更新
443
+
444
+ 来源目录可配置,例如:
445
+
446
+ ~/.skills/
447
+ ~/.claude/skills/
448
+ ~/.opencode/skills/
449
+
450
+ V1 先做简单版:
451
+
452
+ 配置型路径扫描
453
+
454
+ 基于文件 hash 识别版本
455
+
456
+ 9.2 Shadow Registry
457
+
458
+ 职责:
459
+
460
+ 管理项目中的 shadow skills
461
+
462
+ 首次命中 origin skill 时自动 fork 为 A'
463
+
464
+ 维护 shadow 与 origin 的映射关系
465
+
466
+ 逻辑:
467
+
468
+ 主 Agent 在项目中命中 A
469
+
470
+ 若项目中不存在 A'
471
+
472
+ 从 origin 复制到 .sea/skills/A/current.md
473
+
474
+ 初始化 meta.json
475
+
476
+ 开始后续演化
477
+
478
+ 9.3 Observer Layer
479
+
480
+ 职责:
481
+
482
+ 从主 Agent CLI 获取足够做演化判断的 trace
483
+
484
+ 不追求 CoT,只追求外显执行证据
485
+
486
+ 输入信号包括:
487
+
488
+ prompt / response
489
+
490
+ tool call / result
491
+
492
+ files changed
493
+
494
+ retry / failure
495
+
496
+ session id
497
+
498
+ 命中的 skill 文件(若可获得)
499
+
500
+ V1 继续支持三个 observer:
501
+
502
+ CodexObserver
503
+
504
+ OpenCodeObserver
505
+
506
+ ClaudeObserver
507
+
508
+ 但在这版架构里,它们只是“感知层”,不是产品核心。
509
+
510
+ 9.4 Evolution Evaluator
511
+
512
+ 职责:
513
+
514
+ 给定某个 shadow skill A' 及近期 trace,判断是否需要优化。
515
+
516
+ 不再输出复杂 branch plan,而输出:
517
+
518
+ {
519
+ "should_patch": true,
520
+ "change_type": "add_fallback",
521
+ "reason": "...",
522
+ "source_sessions": ["..."],
523
+ "confidence": 0.78
524
+ }
525
+
526
+ V1 先支持以下判断规则:
527
+
528
+ A. Repeated Manual Fix
529
+
530
+ 同类任务里,主 Agent 输出后用户总补同一个步骤
531
+ → add_fallback 或 append_context
532
+
533
+ B. Repeated Drift
534
+
535
+ skill 被命中,但执行反复绕过某一段
536
+ → rewrite_section 或 prune_noise
537
+
538
+ C. Overly Broad Trigger
539
+
540
+ skill 在这个项目里经常在不合适的场景被触发
541
+ → tighten_trigger
542
+
543
+ D. Noisy Redundancy
544
+
545
+ 某些说明长期不影响执行或被新上下文覆盖
546
+ → prune_noise
547
+
548
+ 9.5 Patch Generator
549
+
550
+ 职责:
551
+
552
+ 把评估结果变成对 A' 的具体 patch。
553
+
554
+ 输出不是“新 branch”,而是对 current.md 的局部 diff。
555
+
556
+ 支持的 patch 类型:
557
+
558
+ append 段落
559
+
560
+ 修改 frontmatter
561
+
562
+ 替换某一小节
563
+
564
+ 重排步骤顺序
565
+
566
+ 删除冗余说明
567
+
568
+ 建议 first pass 不做 LLM 自由重写全文,而采用:
569
+
570
+ 定位要改的 section
571
+
572
+ 做局部 patch
573
+
574
+ 保留原始结构
575
+
576
+ 这样更稳。
577
+
578
+ 9.6 Journal Manager
579
+
580
+ 职责:
581
+
582
+ 生成 revision
583
+
584
+ 写 journal.ndjson
585
+
586
+ 维护 snapshot
587
+
588
+ 提供 rollback
589
+
590
+ 规则建议:
591
+
592
+ 每次 patch 都写 journal
593
+
594
+ 每 5 次 revision 自动 snapshot 一次
595
+
596
+ rewrite_section 类型 patch 完成后立即 snapshot
597
+
598
+ rollback 默认回到:
599
+
600
+ 指定 revision
601
+
602
+ 上一个 snapshot
603
+
604
+ fork 初始版本
605
+
606
+ 9.7 Shadow Skill Manager
607
+
608
+ 这是本系统的核心编排模块。
609
+
610
+ 职责:
611
+
612
+ 确保 origin 和 shadow 的映射关系
613
+
614
+ 收到 trace 后调用 evaluator
615
+
616
+ 决定是否 patch
617
+
618
+ 调用 patch generator
619
+
620
+ 调用 journal manager
621
+
622
+ 更新 meta.json
623
+
624
+ 它是整个产品里最像“Agent 控制器”的地方。
625
+
626
+ 10. 自动优化策略
627
+ 10.1 默认自动修改的范围
628
+
629
+ 为了保证“无感”,但又防止失控,V1 只自动做低风险修改:
630
+
631
+ 自动允许
632
+
633
+ 增加项目上下文说明
634
+
635
+ 增加高频 fallback
636
+
637
+ 收紧 trigger 条件
638
+
639
+ 删除明显重复的说明
640
+
641
+ 重排步骤顺序
642
+
643
+ 增加局部 caution / note
644
+
645
+ 默认不自动做
646
+
647
+ 大段重写整个 skill
648
+
649
+ 删除大量核心步骤
650
+
651
+ 改变 skill 的总体目标
652
+
653
+ 回写到全局 origin
654
+
655
+ 跨项目同步优化结果
656
+
657
+ 10.2 自动 patch 的触发条件
658
+
659
+ 建议至少满足:
660
+
661
+ 同类信号出现 >= N 次
662
+
663
+ 来源 session 不少于 2 或 3 个
664
+
665
+ 置信度高于阈值
666
+
667
+ 最近没有对该 shadow skill 做过同类 patch
668
+
669
+ 当前 shadow skill 未被冻结
670
+
671
+ 这可以防止系统过于躁动。
672
+
673
+ 11. Origin 更新策略
674
+
675
+ 这个问题在 shadow 模型里非常关键。
676
+
677
+ 11.1 三态策略
678
+ 情况 A:origin 未更新
679
+
680
+ 继续正常迭代 A'
681
+
682
+ 情况 B:origin 更新,但 A' 与 origin 差异较小
683
+
684
+ 系统尝试自动 rebase:
685
+
686
+ 读取新 origin A
687
+
688
+ 读取当前 shadow A'
689
+
690
+ 将 shadow 的局部 patch 重放到新 origin 上
691
+
692
+ 若成功,则更新:
693
+
694
+ origin_version_at_fork
695
+
696
+ current.md
697
+
698
+ 情况 C:origin 更新,但 A' 已偏离较多
699
+
700
+ 系统不自动 rebase,只记录状态:
701
+
702
+ origin 已更新
703
+
704
+ 当前 shadow 分化较深
705
+
706
+ 用户可手动触发 rebase
707
+
708
+ 11.2 为什么不一开始做复杂 merge
709
+
710
+ 因为你当前目标是“后台无感优化”,不是“分布式版本控制系统”。
711
+
712
+ 先实现:
713
+
714
+ 检测 origin 变化
715
+
716
+ 简单重放 patch
717
+
718
+ 失败则提示人工处理
719
+
720
+ 就够了。
721
+
722
+ 12. 状态机设计
723
+
724
+ 对于每个 shadow skill,只需要一个很轻的状态机:
725
+
726
+ not_created
727
+ → active
728
+ → frozen
729
+ → active
730
+ → rebasing
731
+ → active
732
+
733
+ 可选辅助状态:
734
+
735
+ needs_attention
736
+
737
+ rollback_ready
738
+
739
+ 状态说明
740
+ not_created
741
+
742
+ 项目还未命中该 origin skill,尚未 fork
743
+
744
+ active
745
+
746
+ shadow skill 正常被消费,并允许自动优化
747
+
748
+ frozen
749
+
750
+ 停止自动优化,但仍然可以继续被主 Agent 使用
751
+
752
+ rebasing
753
+
754
+ 正在尝试从新 origin 重新套用本地 patch
755
+
756
+ needs_attention
757
+
758
+ 自动 rebase 失败,或近期 patch 质量异常,需要用户处理
759
+
760
+ 13. 观察与存储设计
761
+ 13.1 最小 Trace Schema
762
+ {
763
+ "trace_id": "",
764
+ "runtime": "codex|opencode|claude",
765
+ "session_id": "",
766
+ "turn_id": "",
767
+ "event_type": "user_input|assistant_output|tool_call|tool_result|file_change|retry|status",
768
+ "timestamp": "",
769
+ "user_input": "",
770
+ "assistant_output": "",
771
+ "tool_name": "",
772
+ "tool_args": {},
773
+ "tool_result": {},
774
+ "files_changed": [],
775
+ "status": "success|failure|retry|interrupted",
776
+ "metadata": {}
777
+ }
778
+
779
+ 够用就行。
780
+ 这版不追求复杂病例模型。
781
+
782
+ 13.2 本地状态存储
783
+
784
+ 建议 V1 使用:
785
+
786
+ SQLite:session / shadow meta / small indexes
787
+
788
+ NDJSON:raw trace 与 journal
789
+
790
+ Markdown:shadow skill 当前内容
791
+
792
+ snapshot files:回滚检查点
793
+
794
+ 这样足够轻。
795
+
796
+ 14. 三个 CLI 的接入策略
797
+
798
+ 保持之前调研结论,但产品接口简化。
799
+
800
+ 14.1 Codex
801
+ 适合作为第一接入源
802
+
803
+ 原因:
804
+
805
+ 有 codex exec --json
806
+
807
+ 事件流结构明确
808
+
809
+ 本地 transcript / session log 较友好
810
+
811
+ 接法
812
+
813
+ 优先消费 JSONL 事件流
814
+
815
+ 补充读取本地 session 日志
816
+
817
+ 抽取 tool calls / file changes / final outputs
818
+
819
+ 在本架构中的作用
820
+
821
+ 只负责给 Evaluator 提供:
822
+
823
+ 本次任务如何走
824
+
825
+ 是否反复 fallback
826
+
827
+ 用户是否手动补救
828
+
829
+ 14.2 OpenCode
830
+ 适合作为第二接入源
831
+
832
+ 原因:
833
+
834
+ 插件与事件系统适合长期后台采集
835
+
836
+ 本地存储清晰
837
+
838
+ 可做更主动的 observability
839
+
840
+ 接法
841
+
842
+ 优先用 plugin 事件写入 trace
843
+
844
+ 辅助用 session/export 或 server API 补数
845
+
846
+ 在本架构中的作用
847
+
848
+ 适合做“后台长期运行”的稳定观察器。
849
+
850
+ 14.3 Claude Code
851
+ 适合作为第三接入源
852
+
853
+ 原因:
854
+
855
+ hooks 强
856
+
857
+ transcript_path / subagent transcript 明确
858
+
859
+ 但更适合走主动 hooks 采集,而不是纯文件解析
860
+
861
+ 接法
862
+
863
+ 用 hooks 捕捉关键生命周期
864
+
865
+ transcript 作为补充
866
+
867
+ 合并主会话与 subagent 轨迹
868
+
869
+ 15. CLI 设计
870
+
871
+ V1 的 CLI 不要太多,保留最必要的命令:
872
+
873
+ 查看当前项目影子 skill 状态
874
+ evo skills status
875
+ 查看某个 skill 的演化日志
876
+ evo skills log A
877
+ 查看当前内容与 origin 的 diff
878
+ evo skills diff A
879
+ 回滚
880
+ evo skills rollback A --to rev_8
881
+ 冻结 / 解冻自动优化
882
+ evo skills freeze A
883
+ evo skills unfreeze A
884
+ 手动触发一次优化评估
885
+ evo optimize A
886
+ 重新同步 origin
887
+ evo skills rebase A
888
+ 16. MVP 范围
889
+ MVP 必须具备
890
+ 1. 能识别 origin skill 并创建项目 shadow
891
+
892
+ 这是产品成立的基础。
893
+
894
+ 2. 能接一个 runtime 的 trace
895
+
896
+ 建议先接 Codex。
897
+
898
+ 3. 能自动做 3 类 patch
899
+
900
+ append_context
901
+
902
+ add_fallback
903
+
904
+ tighten_trigger
905
+
906
+ 4. 能写 journal 与 snapshot
907
+
908
+ 这是安全底线。
909
+
910
+ 5. 能 rollback
911
+
912
+ 没有 rollback,就不适合默认无感自动优化。
913
+
914
+ MVP 不做
915
+
916
+ 不做多分支 skill tree
917
+
918
+ 不做可视化管理台
919
+
920
+ 不做跨项目经验合并
921
+
922
+ 不做全局 origin 自动回写
923
+
924
+ 不做复杂 router
925
+
926
+ 不做复杂 merge engine
927
+
928
+ 17. 成功指标
929
+ 用户体验层
930
+
931
+ 用户无需理解复杂版本概念
932
+
933
+ 自动优化默认可运行
934
+
935
+ 绝大多数优化无需人工介入
936
+
937
+ 技术层
938
+
939
+ shadow 创建成功率
940
+
941
+ trace 完整率
942
+
943
+ auto patch 成功率
944
+
945
+ rollback 成功率
946
+
947
+ origin rebase 成功率
948
+
949
+ 效果层
950
+
951
+ 项目内 skill 命中后绕路次数下降
952
+
953
+ 同类任务人工补救次数下降
954
+
955
+ 主 Agent 在该项目中的稳定性提升
956
+
957
+ 18. 风险与应对
958
+ 风险 1:自动 patch 把 skill 改坏
959
+
960
+ 应对:
961
+
962
+ 仅允许小步 patch
963
+
964
+ journal + snapshot
965
+
966
+ 一键 rollback
967
+
968
+ 风险 2:origin 更新后 shadow 漂移严重
969
+
970
+ 应对:
971
+
972
+ 先检测
973
+
974
+ 差异小时自动 rebase
975
+
976
+ 差异大时只告警不自动合并
977
+
978
+ 风险 3:trace 不足导致误判
979
+
980
+ 应对:
981
+
982
+ 先定义最小证据集
983
+
984
+ patch 需要重复证据
985
+
986
+ 低置信不动
987
+
988
+ 风险 4:后台太频繁修改,引发抖动
989
+
990
+ 应对:
991
+
992
+ 每个 shadow skill 设置冷却窗口
993
+
994
+ 同类 patch 设最短间隔
995
+
996
+ 近期刚回滚过则暂停自动优化
997
+
998
+ 19. 最终产品定义
999
+
1000
+ 这版产品最准确的定义应该是:
1001
+
1002
+ EVO Skills 是一个后台常驻的本地元 Agent。它不管理复杂的 skill 分支树,而是为每个项目维护全局 skills 的影子副本,并基于真实 trace 对影子副本做持续的小步自动优化,同时用演化日志和 checkpoint 保证整个过程可追踪、可回滚。
1003
+
1004
+