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.
- package/.eslintrc.json +36 -0
- package/.prettierrc +11 -0
- package/README.md +227 -0
- package/USER-GUIDE.md +382 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +126 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/freeze.d.ts +12 -0
- package/dist/cli/commands/freeze.d.ts.map +1 -0
- package/dist/cli/commands/freeze.js +93 -0
- package/dist/cli/commands/freeze.js.map +1 -0
- package/dist/cli/commands/log.d.ts +7 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +76 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +7 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +92 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +88 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +195 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/evaluator/base-rule.d.ts +50 -0
- package/dist/core/evaluator/base-rule.d.ts.map +1 -0
- package/dist/core/evaluator/base-rule.js +69 -0
- package/dist/core/evaluator/base-rule.js.map +1 -0
- package/dist/core/evaluator/index.d.ts +33 -0
- package/dist/core/evaluator/index.d.ts.map +1 -0
- package/dist/core/evaluator/index.js +74 -0
- package/dist/core/evaluator/index.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.js +82 -0
- package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
- package/dist/core/journal/index.d.ts +76 -0
- package/dist/core/journal/index.d.ts.map +1 -0
- package/dist/core/journal/index.js +207 -0
- package/dist/core/journal/index.js.map +1 -0
- package/dist/core/observer/base-observer.d.ts +64 -0
- package/dist/core/observer/base-observer.d.ts.map +1 -0
- package/dist/core/observer/base-observer.js +142 -0
- package/dist/core/observer/base-observer.js.map +1 -0
- package/dist/core/observer/codex-observer.d.ts +71 -0
- package/dist/core/observer/codex-observer.d.ts.map +1 -0
- package/dist/core/observer/codex-observer.js +248 -0
- package/dist/core/observer/codex-observer.js.map +1 -0
- package/dist/core/observer/index.d.ts +7 -0
- package/dist/core/observer/index.d.ts.map +1 -0
- package/dist/core/observer/index.js +7 -0
- package/dist/core/observer/index.js.map +1 -0
- package/dist/core/observer/trace-manager.d.ts +82 -0
- package/dist/core/observer/trace-manager.d.ts.map +1 -0
- package/dist/core/observer/trace-manager.js +196 -0
- package/dist/core/observer/trace-manager.js.map +1 -0
- package/dist/core/origin-registry/index.d.ts +59 -0
- package/dist/core/origin-registry/index.d.ts.map +1 -0
- package/dist/core/origin-registry/index.js +235 -0
- package/dist/core/origin-registry/index.js.map +1 -0
- package/dist/core/patch-generator/base-strategy.d.ts +35 -0
- package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
- package/dist/core/patch-generator/base-strategy.js +55 -0
- package/dist/core/patch-generator/base-strategy.js.map +1 -0
- package/dist/core/patch-generator/index.d.ts +32 -0
- package/dist/core/patch-generator/index.d.ts.map +1 -0
- package/dist/core/patch-generator/index.js +101 -0
- package/dist/core/patch-generator/index.js.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
- package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
- package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
- package/dist/core/shadow-manager/index.d.ts +65 -0
- package/dist/core/shadow-manager/index.d.ts.map +1 -0
- package/dist/core/shadow-manager/index.js +229 -0
- package/dist/core/shadow-manager/index.js.map +1 -0
- package/dist/core/shadow-registry/index.d.ts +68 -0
- package/dist/core/shadow-registry/index.d.ts.map +1 -0
- package/dist/core/shadow-registry/index.js +173 -0
- package/dist/core/shadow-registry/index.js.map +1 -0
- package/dist/daemon/index.d.ts +43 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +144 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/markdown.d.ts +66 -0
- package/dist/storage/markdown.d.ts.map +1 -0
- package/dist/storage/markdown.js +227 -0
- package/dist/storage/markdown.js.map +1 -0
- package/dist/storage/ndjson.d.ts +118 -0
- package/dist/storage/ndjson.d.ts.map +1 -0
- package/dist/storage/ndjson.js +238 -0
- package/dist/storage/ndjson.js.map +1 -0
- package/dist/storage/sqlite.d.ts +131 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +415 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/diff.d.ts +20 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +47 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/hash.d.ts +17 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +28 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +64 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +67 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +115 -0
- package/dist/utils/path.js.map +1 -0
- package/docs/ENGINEERING_PLAN.md +1065 -0
- package/docs/PRD.md +1004 -0
- package/docs/PROGRESS.md +523 -0
- package/package.json +60 -0
- package/src/cli/commands/diff.ts +158 -0
- package/src/cli/commands/freeze.ts +108 -0
- package/src/cli/commands/log.ts +87 -0
- package/src/cli/commands/rollback.ts +99 -0
- package/src/cli/commands/status.ts +101 -0
- package/src/cli/index.ts +31 -0
- package/src/config/defaults.ts +32 -0
- package/src/config/index.ts +220 -0
- package/src/core/evaluator/base-rule.ts +90 -0
- package/src/core/evaluator/index.ts +86 -0
- package/src/core/evaluator/rules/repeated-drift.ts +109 -0
- package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
- package/src/core/journal/index.ts +286 -0
- package/src/core/observer/base-observer.ts +200 -0
- package/src/core/observer/codex-observer.ts +309 -0
- package/src/core/observer/index.ts +7 -0
- package/src/core/observer/trace-manager.ts +250 -0
- package/src/core/origin-registry/index.ts +264 -0
- package/src/core/patch-generator/base-strategy.ts +67 -0
- package/src/core/patch-generator/index.ts +118 -0
- package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
- package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
- package/src/core/shadow-manager/index.ts +278 -0
- package/src/core/shadow-registry/index.ts +200 -0
- package/src/daemon/index.ts +174 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/markdown.ts +267 -0
- package/src/storage/ndjson.ts +273 -0
- package/src/storage/sqlite.ts +555 -0
- package/src/types/index.ts +212 -0
- package/src/utils/diff.ts +60 -0
- package/src/utils/hash.ts +31 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +78 -0
- package/src/utils/path.ts +129 -0
- package/tests/unit/config.test.ts +65 -0
- package/tests/unit/path.test.ts +89 -0
- package/tests/unit/utils.test.ts +45 -0
- package/tsconfig.json +31 -0
- 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*
|