flavor-code 1.2.13 → 1.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/README.zh-CN.md +9 -1
- package/dist/agent/planner.d.ts +2 -0
- package/dist/{app-Z3YWFIBB.js → app-3KW2FTVJ.js} +2 -2
- package/dist/astgraph/db.mjs +237 -237
- package/dist/astgraph/extract.mjs +239 -239
- package/dist/astgraph/flavor-plugin.json +25 -25
- package/dist/astgraph/grammars.mjs +68 -68
- package/dist/astgraph/index.js +301 -301
- package/dist/astgraph/indexer.mjs +175 -175
- package/dist/astgraph/query.mjs +165 -165
- package/dist/astgraph/resolve.mjs +93 -93
- package/dist/astgraph/vendor/tree-sitter.js +3980 -3980
- package/dist/astgraph/vendor/zod/LICENSE +21 -21
- package/dist/astgraph/vendor/zod/index.js +4 -4
- package/dist/astgraph/vendor/zod/locales/index.js +1 -1
- package/dist/astgraph/vendor/zod/locales/package.json +7 -7
- package/dist/astgraph/vendor/zod/package.json +135 -135
- package/dist/astgraph/vendor/zod/v4/classic/checks.js +1 -1
- package/dist/astgraph/vendor/zod/v4/classic/coerce.js +17 -17
- package/dist/astgraph/vendor/zod/v4/classic/compat.js +31 -31
- package/dist/astgraph/vendor/zod/v4/classic/errors.js +48 -48
- package/dist/astgraph/vendor/zod/v4/classic/external.js +20 -20
- package/dist/astgraph/vendor/zod/v4/classic/from-json-schema.js +599 -599
- package/dist/astgraph/vendor/zod/v4/classic/index.js +4 -4
- package/dist/astgraph/vendor/zod/v4/classic/iso.js +30 -30
- package/dist/astgraph/vendor/zod/v4/classic/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/classic/parse.js +15 -15
- package/dist/astgraph/vendor/zod/v4/classic/schemas.js +1395 -1395
- package/dist/astgraph/vendor/zod/v4/core/api.js +1087 -1087
- package/dist/astgraph/vendor/zod/v4/core/checks.js +575 -575
- package/dist/astgraph/vendor/zod/v4/core/core.js +78 -78
- package/dist/astgraph/vendor/zod/v4/core/doc.js +35 -35
- package/dist/astgraph/vendor/zod/v4/core/errors.js +185 -185
- package/dist/astgraph/vendor/zod/v4/core/index.js +16 -16
- package/dist/astgraph/vendor/zod/v4/core/json-schema-generator.js +95 -95
- package/dist/astgraph/vendor/zod/v4/core/json-schema-processors.js +601 -601
- package/dist/astgraph/vendor/zod/v4/core/json-schema.js +1 -1
- package/dist/astgraph/vendor/zod/v4/core/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/core/parse.js +93 -93
- package/dist/astgraph/vendor/zod/v4/core/regexes.js +139 -139
- package/dist/astgraph/vendor/zod/v4/core/registries.js +51 -51
- package/dist/astgraph/vendor/zod/v4/core/schemas.js +2239 -2239
- package/dist/astgraph/vendor/zod/v4/core/standard-schema.js +1 -1
- package/dist/astgraph/vendor/zod/v4/core/to-json-schema.js +448 -448
- package/dist/astgraph/vendor/zod/v4/core/util.js +674 -674
- package/dist/astgraph/vendor/zod/v4/core/versions.js +5 -5
- package/dist/astgraph/vendor/zod/v4/index.js +3 -3
- package/dist/astgraph/vendor/zod/v4/locales/ar.js +106 -106
- package/dist/astgraph/vendor/zod/v4/locales/az.js +105 -105
- package/dist/astgraph/vendor/zod/v4/locales/be.js +156 -156
- package/dist/astgraph/vendor/zod/v4/locales/bg.js +120 -120
- package/dist/astgraph/vendor/zod/v4/locales/ca.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/cs.js +111 -111
- package/dist/astgraph/vendor/zod/v4/locales/da.js +115 -115
- package/dist/astgraph/vendor/zod/v4/locales/de.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/el.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/en.js +113 -113
- package/dist/astgraph/vendor/zod/v4/locales/eo.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/es.js +132 -132
- package/dist/astgraph/vendor/zod/v4/locales/fa.js +114 -114
- package/dist/astgraph/vendor/zod/v4/locales/fi.js +112 -112
- package/dist/astgraph/vendor/zod/v4/locales/fr-CA.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/fr.js +125 -125
- package/dist/astgraph/vendor/zod/v4/locales/he.js +214 -214
- package/dist/astgraph/vendor/zod/v4/locales/hr.js +122 -122
- package/dist/astgraph/vendor/zod/v4/locales/hu.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/hy.js +147 -147
- package/dist/astgraph/vendor/zod/v4/locales/id.js +106 -106
- package/dist/astgraph/vendor/zod/v4/locales/index.js +52 -52
- package/dist/astgraph/vendor/zod/v4/locales/is.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/it.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ja.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/ka.js +112 -112
- package/dist/astgraph/vendor/zod/v4/locales/kh.js +5 -5
- package/dist/astgraph/vendor/zod/v4/locales/km.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/ko.js +111 -111
- package/dist/astgraph/vendor/zod/v4/locales/lt.js +203 -203
- package/dist/astgraph/vendor/zod/v4/locales/mk.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/ms.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/nl.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/no.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ota.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/locales/pl.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/ps.js +114 -114
- package/dist/astgraph/vendor/zod/v4/locales/pt.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ro.js +119 -119
- package/dist/astgraph/vendor/zod/v4/locales/ru.js +156 -156
- package/dist/astgraph/vendor/zod/v4/locales/sl.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/sv.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/ta.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/th.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/tr.js +105 -105
- package/dist/astgraph/vendor/zod/v4/locales/ua.js +5 -5
- package/dist/astgraph/vendor/zod/v4/locales/uk.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/ur.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/uz.js +110 -110
- package/dist/astgraph/vendor/zod/v4/locales/vi.js +108 -108
- package/dist/astgraph/vendor/zod/v4/locales/yo.js +107 -107
- package/dist/astgraph/vendor/zod/v4/locales/zh-CN.js +109 -109
- package/dist/astgraph/vendor/zod/v4/locales/zh-TW.js +107 -107
- package/dist/astgraph/vendor/zod/v4/mini/checks.js +1 -1
- package/dist/astgraph/vendor/zod/v4/mini/coerce.js +22 -22
- package/dist/astgraph/vendor/zod/v4/mini/external.js +14 -14
- package/dist/astgraph/vendor/zod/v4/mini/index.js +3 -3
- package/dist/astgraph/vendor/zod/v4/mini/iso.js +34 -34
- package/dist/astgraph/vendor/zod/v4/mini/package.json +7 -7
- package/dist/astgraph/vendor/zod/v4/mini/parse.js +1 -1
- package/dist/astgraph/vendor/zod/v4/mini/schemas.js +961 -961
- package/dist/astgraph/vendor/zod/v4/package.json +7 -7
- package/dist/{chunk-Y5MZDG7I.js → chunk-5TG3E2EJ.js} +3253 -1909
- package/dist/{chunk-G6Q2Y2A7.js → chunk-BKARQJQZ.js} +1 -1
- package/dist/{chunk-XFCJXRJ2.js → chunk-IG4Z23CL.js} +6 -0
- package/dist/cli.js +80 -18
- package/dist/config/schema.d.ts +6 -0
- package/dist/desktop/main.js +6216 -4807
- package/dist/desktop-renderer/assets/{index-CCnSpff0.js → index-BCJjMvbX.js} +1 -1
- package/dist/desktop-renderer/index.html +1 -1
- package/dist/evolve/loader.d.ts +21 -0
- package/dist/evolve/service.d.ts +37 -0
- package/dist/evolve/store.d.ts +117 -0
- package/dist/git/insights.d.ts +52 -0
- package/dist/git/service.d.ts +43 -0
- package/dist/git/tools.d.ts +9 -0
- package/dist/hooks/types.d.ts +5 -1
- package/dist/{load-6ZMEBHSG.js → load-GKA7P6RJ.js} +1 -1
- package/dist/plugins/host.d.ts +9 -0
- package/dist/plugins/types.d.ts +1 -0
- package/dist/sdk/index.js +3 -3
- package/dist/session/store.d.ts +1 -0
- package/dist/tools/shell.d.ts +13 -0
- package/dist/ui/commands.d.ts +11 -2
- package/dist/ui/session.d.ts +3 -0
- package/package.json +1 -1
- package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +303 -1
package/dist/sdk/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
FlavorRpcServer,
|
|
5
5
|
TraceRecordSchema,
|
|
6
6
|
TraceRecorder
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-BKARQJQZ.js";
|
|
8
8
|
import {
|
|
9
9
|
AgentMessageQueue,
|
|
10
10
|
DockerExecutionEnvironment,
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
WorkspaceCheckpointStore,
|
|
14
14
|
buildDockerInvocation,
|
|
15
15
|
createProductionRuntime
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
16
|
+
} from "../chunk-5TG3E2EJ.js";
|
|
17
|
+
import "../chunk-IG4Z23CL.js";
|
|
18
18
|
import "../chunk-RQTYHUMK.js";
|
|
19
19
|
import "../chunk-S32JRDZK.js";
|
|
20
20
|
|
package/dist/session/store.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export declare const SessionDocumentSchema: z.ZodObject<{
|
|
|
35
35
|
dependencies: z.ZodArray<z.ZodString>;
|
|
36
36
|
expectedOutputs: z.ZodArray<z.ZodString>;
|
|
37
37
|
verification: z.ZodArray<z.ZodString>;
|
|
38
|
+
files: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
38
39
|
}, z.core.$strict>>;
|
|
39
40
|
}, z.core.$strict>>;
|
|
40
41
|
states: z.ZodRecord<z.ZodString, z.ZodEnum<{
|
package/dist/tools/shell.d.ts
CHANGED
|
@@ -42,6 +42,19 @@ export interface ShellBackgroundResult extends ShellResult {
|
|
|
42
42
|
type ShellTool = Omit<ToolDefinition<z.infer<typeof ShellInput>, ShellResult | ShellBackgroundResult>, "execute"> & {
|
|
43
43
|
execute(input: z.infer<typeof ShellInput>, signal: AbortSignal, context?: import("./types.js").ToolContext): Promise<ShellResult | ShellBackgroundResult>;
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Normalize weak model calls that stuff a whole command line into `command`
|
|
47
|
+
* (e.g. `command: "git log --oneline"`). Splits only when the first token is a
|
|
48
|
+
* bare command name (no path separators), so explicit paths with spaces —
|
|
49
|
+
* `command: "C:\\Program Files\\node.exe"` — are left untouched.
|
|
50
|
+
*/
|
|
51
|
+
export declare function normalizeShellCommand(input: {
|
|
52
|
+
command: string;
|
|
53
|
+
args: readonly string[];
|
|
54
|
+
}): {
|
|
55
|
+
command: string;
|
|
56
|
+
args: string[];
|
|
57
|
+
};
|
|
45
58
|
export declare function createShellTool(workspace: string, options?: ShellToolOptions): ShellTool;
|
|
46
59
|
export declare function executeShell(root: string, input: z.infer<typeof ShellInput>, cancellation: AbortSignal, maxBytes: number, onOutput?: (stream: "stdout" | "stderr", text: string) => void): Promise<ShellResult>;
|
|
47
60
|
export {};
|
package/dist/ui/commands.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const MVP_COMMANDS: readonly ["model", "init", "config", "login", "permissions", "skills", "plugins", "hooks", "tasks", "finish", "compact", "clear", "help", "exit", "audit", "usage", "loop", "goal", "mcp", "ide", "memory", "remember", "forget", "forget-cold", "checkpoint", "tree", "rewind", "unrevert", "fork", "pals", "chat", "co-work"];
|
|
1
|
+
export declare const MVP_COMMANDS: readonly ["model", "init", "config", "login", "permissions", "skills", "plugins", "hooks", "tasks", "finish", "compact", "clear", "help", "exit", "audit", "usage", "loop", "goal", "evolve", "mcp", "commit", "review", "ide", "memory", "remember", "forget", "forget-cold", "checkpoint", "tree", "rewind", "unrevert", "fork", "pals", "chat", "co-work"];
|
|
2
2
|
export declare const COMMAND_DESCRIPTIONS: Record<(typeof MVP_COMMANDS)[number], string>;
|
|
3
3
|
export type PermissionCommandMode = PermissionMode;
|
|
4
4
|
export type ModelRole = "main" | "subagent";
|
|
@@ -63,6 +63,12 @@ export type SlashCommand = {
|
|
|
63
63
|
} | {
|
|
64
64
|
name: "goal";
|
|
65
65
|
goal: string;
|
|
66
|
+
} | {
|
|
67
|
+
name: "commit";
|
|
68
|
+
hint?: string;
|
|
69
|
+
} | {
|
|
70
|
+
name: "review";
|
|
71
|
+
focus?: string;
|
|
66
72
|
} | {
|
|
67
73
|
name: "remember";
|
|
68
74
|
type: MemoryType;
|
|
@@ -81,10 +87,13 @@ export type SlashCommand = {
|
|
|
81
87
|
target: string;
|
|
82
88
|
goal: string;
|
|
83
89
|
} | CoWorkSlashCommand | {
|
|
84
|
-
name: Exclude<(typeof MVP_COMMANDS)[number], "model" | "permissions" | "audit" | "loop" | "goal" | "mcp" | "remember" | "forget" | "checkpoint" | "rewind" | "fork" | "pals" | "chat" | "co-work">;
|
|
90
|
+
name: Exclude<(typeof MVP_COMMANDS)[number], "model" | "permissions" | "audit" | "loop" | "goal" | "evolve" | "commit" | "review" | "mcp" | "remember" | "forget" | "checkpoint" | "rewind" | "fork" | "pals" | "chat" | "co-work">;
|
|
85
91
|
} | {
|
|
86
92
|
name: "audit";
|
|
87
93
|
toolFilter?: string | undefined;
|
|
94
|
+
} | {
|
|
95
|
+
name: "evolve";
|
|
96
|
+
args: string[];
|
|
88
97
|
} | {
|
|
89
98
|
name: "unknown";
|
|
90
99
|
input: string;
|
package/dist/ui/session.d.ts
CHANGED
|
@@ -128,6 +128,9 @@ export interface SessionServices {
|
|
|
128
128
|
hooksStatus(): readonly unknown[];
|
|
129
129
|
tasks(): unknown;
|
|
130
130
|
audit(toolFilter?: string): string | Promise<string>;
|
|
131
|
+
evolve(args: readonly string[]): string | Promise<string>;
|
|
132
|
+
gitCommit?(hint: string | undefined, signal: AbortSignal): Promise<string>;
|
|
133
|
+
gitReview?(focus: string | undefined, signal: AbortSignal): Promise<string>;
|
|
131
134
|
usage(): string | Promise<string>;
|
|
132
135
|
cancelActiveTask(): void | Promise<void>;
|
|
133
136
|
clearContext(): void | Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# flavor-code 技术方案报告
|
|
2
2
|
|
|
3
|
-
> 版本:1.2.
|
|
3
|
+
> 版本:1.2.14 | 语言:TypeScript | 运行时:Node.js ≥20 | 包管理器:npm
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -139,6 +139,25 @@
|
|
|
139
139
|
- [38.8 原生 WebSearch 与 WebFetch](#388-原生-websearch-与-webfetch)
|
|
140
140
|
- [38.9 安全边界](#389-安全边界)
|
|
141
141
|
- [38.10 文件地图与验证](#3810-文件地图与验证)
|
|
142
|
+
- [39. 1.2.13 代码图索引(astgraph)与结构化输出强健化](#39-1213-代码图索引astgraph与结构化输出强健化)
|
|
143
|
+
- [39.1 总体架构](#391-总体架构)
|
|
144
|
+
- [39.2 索引管道:提取、入库与增量同步](#392-索引管道提取入库与增量同步)
|
|
145
|
+
- [39.3 存储模型:SQLite + FTS5](#393-存储模型sqlite--fts5)
|
|
146
|
+
- [39.4 查询语义与工具](#394-查询语义与工具)
|
|
147
|
+
- [39.5 插件形态与懒加载](#395-插件形态与懒加载)
|
|
148
|
+
- [39.6 结构化输出强健化](#396-结构化输出强健化)
|
|
149
|
+
- [39.7 只读工具声明](#397-只读工具声明)
|
|
150
|
+
- [39.8 安全边界](#398-安全边界)
|
|
151
|
+
- [39.9 文件地图与验证](#399-文件地图与验证)
|
|
152
|
+
- [40. 1.2.14 自进化闭环(evolve)](#40-1214-自进化闭环evolve)
|
|
153
|
+
- [40.1 总体架构](#401-总体架构)
|
|
154
|
+
- [40.2 信号捕获与去重存储](#402-信号捕获与去重存储)
|
|
155
|
+
- [40.3 建议生成与趋势排序](#403-建议生成与趋势排序)
|
|
156
|
+
- [40.4 修复插件生命周期](#404-修复插件生命周期)
|
|
157
|
+
- [40.5 运行评估与自动验证](#405-运行评估与自动验证)
|
|
158
|
+
- [40.6 配置与命令](#406-配置与命令)
|
|
159
|
+
- [40.7 安全边界](#407-安全边界)
|
|
160
|
+
- [40.8 文件地图与验证](#408-文件地图与验证)
|
|
142
161
|
|
|
143
162
|
---
|
|
144
163
|
|
|
@@ -255,6 +274,12 @@
|
|
|
255
274
|
- **原型沙箱预览** — 只监听 `127.0.0.1` 的静态服务器 + 严格 CSP + sandbox iframe,确认设计基线前可安全地交互体验原型;拒绝路径穿越、切换工作区/退出时自动停止
|
|
256
275
|
- 新增 `docs/specs/2026-08-12-e2e-requirement-to-delivery.md` 规范文档及 `tests/d2c/product.test.ts`、`tests/d2c/interaction-review.test.ts`、`tests/desktop/e2e-shell.test.ts`、`tests/desktop/d2c-product-preview.test.ts` 等测试
|
|
257
276
|
|
|
277
|
+
**1.2.13 新增:**
|
|
278
|
+
|
|
279
|
+
- **astgraph 代码图索引** — 项目初始化时在 `.flavor/plugins/astgraph/` 安装基于 tree-sitter 的代码图插件,生成 `.flavor/astgraph/index.db`(SQLite + FTS5),提供 `ast_search` / `ast_callers` / `ast_callees` / `ast_impact` / `ast_context` 五个只读工具与 `/ast` 命令定位符号、追踪可达性、计算爆炸半径、装配精确读范围;`FLAVOR.md` 自动生成 Search 章节,PostToolUse 钩子对编辑过的文件做增量同步,详见第 39 章
|
|
280
|
+
- **结构化输出强健化** — 模型以纯文本(含 ```json 代码块)返回 JSON 时自动提取;按 JSON Schema 对字符串形式的数字/布尔字段做类型强制转换后再校验,减少无效的修复模型调用
|
|
281
|
+
- **只读工具声明** — 工具可声明 `readOnly`,只读工具在默认模式与 plan 模式下自动放行,与 Read/Glob/Grep 同等对待
|
|
282
|
+
|
|
258
283
|
### 2.2 非目标(明确排除)
|
|
259
284
|
|
|
260
285
|
- 全局用户画像、云端记忆同步和团队自动同步
|
|
@@ -5546,3 +5571,280 @@ npm run typecheck
|
|
|
5546
5571
|
npm run vscode:typecheck
|
|
5547
5572
|
npm run build
|
|
5548
5573
|
```
|
|
5574
|
+
|
|
5575
|
+
---
|
|
5576
|
+
|
|
5577
|
+
## 39. 1.2.13 代码图索引(astgraph)与结构化输出强健化
|
|
5578
|
+
|
|
5579
|
+
1.2.13 为 Agent 补上“先看代码图、再读文件”的定位能力:项目初始化时在 `.flavor/plugins/astgraph/` 安装一个基于 tree-sitter 的代码图插件,把工作区的函数、类、方法、接口、类型别名和变量连同调用/导入边建成 `.flavor/astgraph/index.db`(SQLite + FTS5),并提供 `ast_search` / `ast_callers` / `ast_callees` / `ast_impact` / `ast_context` 五个只读工具。模型先用代码图确定改动点与爆炸半径,再按精确行范围读取文件,替代“全仓 grep + 大段读文件”的盲目探索。同批还落地了结构化输出强健化(纯文本 JSON 提取 + 字符串类型强制转换)与只读工具声明(`readOnly` 免审批)。
|
|
5580
|
+
|
|
5581
|
+
### 39.1 总体架构
|
|
5582
|
+
|
|
5583
|
+
```mermaid
|
|
5584
|
+
flowchart LR
|
|
5585
|
+
INIT["initializeFlavor\n项目初始化"] --> COPY["copyAstgraphPlugin\n复制到 .flavor/plugins/astgraph/"]
|
|
5586
|
+
COPY --> SESSION["SessionStart 钩子\n缓存工作区"]
|
|
5587
|
+
COPY --> TOOLS["5 个只读工具\nast_search/ast_callers/ast_callees/ast_impact/ast_context"]
|
|
5588
|
+
COPY --> HOOK["PostToolUse 钩子\n编辑后增量同步"]
|
|
5589
|
+
TOOLS --> DB[".flavor/astgraph/index.db\nSQLite WAL + FTS5"]
|
|
5590
|
+
HOOK --> DB
|
|
5591
|
+
DB --> FLAVOR["FLAVOR.md\n自动生成 Search 章节"]
|
|
5592
|
+
```
|
|
5593
|
+
|
|
5594
|
+
设计要点:
|
|
5595
|
+
|
|
5596
|
+
1. **插件即交付物**:astgraph 以 flavor-code 插件(`flavor-plugin.json` + 运行时 + vendored WASM grammar + zod)的形式随项目初始化复制安装,已存在时不覆盖,与 codeisland 插件同一条分发路径。
|
|
5597
|
+
2. **重量级工作全部懒加载**:插件 activation 只注册命令、工具与钩子;WASM grammar 与数据库连接在首次使用时才加载,保证激活不超时。
|
|
5598
|
+
3. **编辑即同步**:PostToolUse 钩子从 Edit/Write/ApplyPatch 输入中提取工作区相对路径,仅对变更文件增量重索引,fire-and-forget 语义,绝不阻塞或失败 Agent 的编辑。
|
|
5599
|
+
4. **定位优先于阅读**:`FLAVOR.md` 在检测到索引存在时自动生成 Search 章节,引导模型把 `ast_search` 与 `grep`/`glob` 配对使用,用 `ast_impact` 等确定可达性后再决定读哪些行。
|
|
5600
|
+
|
|
5601
|
+
### 39.2 索引管道:提取、入库与增量同步
|
|
5602
|
+
|
|
5603
|
+
#### 文件发现
|
|
5604
|
+
|
|
5605
|
+
`indexer.listCodeFiles` 递归遍历工作区,只收录 tree-sitter 语法支持的文件(`.ts/.tsx/.js/.jsx/.mts/.cts/.mjs/.cjs`),并跳过以下目录(无论深度):
|
|
5606
|
+
|
|
5607
|
+
```text
|
|
5608
|
+
node_modules dist build out coverage release .git .flavor
|
|
5609
|
+
.claude .worktrees .cache .idea .vscode vendor
|
|
5610
|
+
```
|
|
5611
|
+
|
|
5612
|
+
#### 结构提取
|
|
5613
|
+
|
|
5614
|
+
`extract.mjs` 用 web-tree-sitter 解析每个文件,产出三类记录:
|
|
5615
|
+
|
|
5616
|
+
- **nodes** — `function_declaration` / `class_declaration` / `interface_declaration` / `type_alias_declaration` / 词法声明中的 `variable_declarator`(值为函数时按 function 计),类成员 `method_definition` 使用 `ClassName.methodName` 限定名;每个节点携带 1-based 起止行号(与 Read 工具坐标一致)、单行签名、JSDoc/`//` 注释 docstring、`isExported`、`isAsync`
|
|
5617
|
+
- **edges** — 文件内调用(`calls`)、继承(`extends` / `implements`),指向本地已声明符号
|
|
5618
|
+
- **refs** — 跨文件引用:import 绑定、未解析的调用/继承,先入 `unresolved_refs` 表等待解析
|
|
5619
|
+
|
|
5620
|
+
#### 入库与解析
|
|
5621
|
+
|
|
5622
|
+
`indexOneFile` 按文件先清旧边/旧引用、`replaceNodes` 替换全部节点(单事务 + FTS 触发器同步),再插入新边/新引用,最后用 SHA-256 内容哈希更新 `files` 记录。全量/增量 pass 结束后执行 `resolvePass`:把 `module_specifier` 指向已索引文件的 pending 引用解析成具体边——import 语句本身不属于任何函数,会归属到同文件中真正使用该绑定的节点;未使用的 import 静默解析为空。
|
|
5623
|
+
|
|
5624
|
+
#### 增量同步
|
|
5625
|
+
|
|
5626
|
+
- 全量构建:`/ast init` 或首次工具调用前的 `indexProject(root)`,遍历全部代码文件
|
|
5627
|
+
- 增量构建:`/ast sync [path...]` 与 PostToolUse 钩子,只对指定路径重索引;磁盘上已删除的文件仍会被裁剪
|
|
5628
|
+
- 内容哈希相同即跳过,避免重复解析
|
|
5629
|
+
|
|
5630
|
+
### 39.3 存储模型:SQLite + FTS5
|
|
5631
|
+
|
|
5632
|
+
数据库使用 Node 内置 `node:sqlite` 的 `DatabaseSync`,打开时设置 WAL 日志模式(并发读者不阻塞写者)、外键约束与 `synchronous = NORMAL`:
|
|
5633
|
+
|
|
5634
|
+
| 表 | 作用 |
|
|
5635
|
+
|----|------|
|
|
5636
|
+
| `files` | 路径、内容哈希、语言、大小、节点数(增量检测依据) |
|
|
5637
|
+
| `nodes` | 节点 id(`src/order.ts#cancelOrder`)、kind、name、qualified_name、文件、语言、起止行、签名、docstring、exported/async 标记 |
|
|
5638
|
+
| `edges` | `source → target` 调用/导入/继承边,带行列;`(source, target, kind, line, col)` 唯一索引去重 |
|
|
5639
|
+
| `unresolved_refs` | 待解析的跨文件引用(`pending` 状态),解析成功后删除 |
|
|
5640
|
+
| `nodes_fts` | FTS5 虚拟表,`content='nodes'` + 触发器维护,覆盖 name / qualified_name / signature / docstring |
|
|
5641
|
+
| `project_metadata` | 最近索引时间戳等 provenance 元数据 |
|
|
5642
|
+
|
|
5643
|
+
边与引用通过外键级联删除;`schema_versions` 记录初始 schema 版本以便未来迁移。
|
|
5644
|
+
|
|
5645
|
+
### 39.4 查询语义与工具
|
|
5646
|
+
|
|
5647
|
+
五个工具全部声明 `readOnly: true`,输入 Schema 的数字字段用 `z.coerce` 接受字符串形式(`"10"` 而非 `10`):
|
|
5648
|
+
|
|
5649
|
+
| 工具 | 语义 | 关键参数 |
|
|
5650
|
+
|------|------|----------|
|
|
5651
|
+
| `ast_search` | 锚点搜索:先 FTS5 前缀匹配,再用 camelCase/snake_case 标识符分段匹配(`order cancel` 可命中 `cancelOrder`),按分数排序 | `query`;`limit` 1–50(默认 10) |
|
|
5652
|
+
| `ast_callers` | 谁调用/导入了该节点(反向边,kind ∈ calls/imports) | `id` |
|
|
5653
|
+
| `ast_callees` | 该节点调用了谁(正向边) | `id` |
|
|
5654
|
+
| `ast_impact` | K-hop 爆炸半径:`up`=谁依赖我、`down`=我依赖谁、`both`=并集,按 hop 排序 | `id`;`hops` 1–5(默认 2);`direction`(默认 up) |
|
|
5655
|
+
| `ast_context` | 锚点 + K-hop 双方向可达子图,装配为精确 `file:start-end` 读范围清单 | `id`;`hops` 1–3(默认 1) |
|
|
5656
|
+
|
|
5657
|
+
CLI 侧对应 `/ast` 命令:`/ast init | sync | status | search <query> | callers/callees/impact/context <node-id> [--hops N] [--direction up|down|both]`。未知节点 id 会提示先用 `ast_search` 找锚点;索引未构建时返回 `"astgraph index not built"` 引导先执行 `/ast init`。
|
|
5658
|
+
|
|
5659
|
+
### 39.5 插件形态与懒加载
|
|
5660
|
+
|
|
5661
|
+
- `src/init/astgraph/flavor-plugin.json`:`apiVersion: 1`,声明 1 个命令、5 个工具、SessionStart 与 PostToolUse 两个钩子,`permissions: []`
|
|
5662
|
+
- `index.js` 的 `activate(context)` 只注册 handler;`grammars.mjs` 通过 `import.meta.url` 解析 vendor 目录,使其在源码树(`src/init/astgraph`)与复制后的插件根(`.flavor/plugins/astgraph`)下都能工作
|
|
5663
|
+
- WASM grammar(typescript / tsx / javascript)与 `tree-sitter.js` 运行时按语言缓存,首次使用时加载一次
|
|
5664
|
+
- `PluginHost.registerCommand` 支持可选 description 参数,命令注册语义向后兼容
|
|
5665
|
+
|
|
5666
|
+
### 39.6 结构化输出强健化
|
|
5667
|
+
|
|
5668
|
+
`src/models/structured.ts` 新增两个能力,减少“模型输出了可修复的数据却仍被送去修复调用”的浪费:
|
|
5669
|
+
|
|
5670
|
+
1. **纯文本 JSON 提取**(`extractJsonObject`):部分 provider 用纯文本(含 ```json 围栏或嵌在 prose 中)而不是工具调用返回 JSON。`withStructuredOutput` 在未收到工具调用但收到文本时提取第一个可解析的 JSON 对象/数组作为候选,纳入既有校验重试管道。
|
|
5671
|
+
2. **字符串类型强制转换**(`coerceByJsonSchema`):按 JSON Schema 递归把字符串形式的数字/布尔字段转成真实类型(`"10"` → `10`、`"true"` → `true`),再做 schema 校验;`AgentLoop` 对标记为 `valid` 的工具调用同样先按 `strictJsonSchema` 强制转换并复验,能过才继续,否则才走修复模型调用。可选字段在 strict schema 中统一展开为 `anyOf [T, null]` 且 `additionalProperties: false`,提升 provider 的服从性。
|
|
5672
|
+
|
|
5673
|
+
修复提示词仍携带原始无效输出、最近候选与校验错误,但触发条件明显收窄。
|
|
5674
|
+
|
|
5675
|
+
### 39.7 只读工具声明
|
|
5676
|
+
|
|
5677
|
+
- `ToolDefinition` 新增 `readOnly?: boolean`:声明后与 Read/Glob/Grep 同等对待
|
|
5678
|
+
- `PermissionEngine` 在默认模式、plan 模式与 d2c profile 下对 `request.readOnly === true` 直接放行,无需用户审批;`ToolRuntime` 构造权限请求时透传该标记
|
|
5679
|
+
- 规划模式仍保持只读语义:只读工具可执行,写工具照旧拒绝
|
|
5680
|
+
|
|
5681
|
+
### 39.8 安全边界
|
|
5682
|
+
|
|
5683
|
+
| 层面 | 措施 |
|
|
5684
|
+
|------|------|
|
|
5685
|
+
| 索引范围 | 固定排除依赖/产物/元数据目录(node_modules、dist、.git、.flavor 等),不索引工作区外的任何路径 |
|
|
5686
|
+
| 插件分发 | 复制安装沿用 codeisland 模式:目标已存在即跳过,不覆盖用户修改;插件目录权限 `0o700` |
|
|
5687
|
+
| 增量同步 | PostToolUse 钩子只接受 Edit/Write/ApplyPatch 输入中解析出的相对路径,fire-and-forget,失败仅记 debug 日志 |
|
|
5688
|
+
| 工具权限 | 五个 AST 工具声明 `readOnly`,只读放行但不持有任何写路径;`z.coerce` 仅做类型标准化,不改变校验边界 |
|
|
5689
|
+
| 运行时隔离 | grammar 全部 vendored 本地 WASM,无网络请求;数据库仅本工作区 `.flavor/astgraph/` 内 |
|
|
5690
|
+
|
|
5691
|
+
### 39.9 文件地图与验证
|
|
5692
|
+
|
|
5693
|
+
| 路径 | 职责 |
|
|
5694
|
+
|------|------|
|
|
5695
|
+
| `src/init/astgraph/index.js` | 插件入口:`/ast` 命令、5 个工具、SessionStart/PostToolUse 钩子、增量同步调度 |
|
|
5696
|
+
| `src/init/astgraph/extract.mjs` | tree-sitter 结构提取:nodes/edges/refs、docstring、签名、限定名 |
|
|
5697
|
+
| `src/init/astgraph/indexer.mjs` | 全量/增量索引、内容哈希跳过、文件裁剪、resolvePass 调度 |
|
|
5698
|
+
| `src/init/astgraph/db.mjs` | `node:sqlite` WAL 数据库、schema、FTS5 触发器、统计与元数据 |
|
|
5699
|
+
| `src/init/astgraph/query.mjs` | FTS5 + 标识符分段搜索、callers/callees、K-hop impact、子图读范围装配 |
|
|
5700
|
+
| `src/init/astgraph/resolve.mjs` | 模块说明符解析(`.js`→`.ts` 重定向、扩展名/`index` 候选)与引用→边 |
|
|
5701
|
+
| `src/init/astgraph/grammars.mjs` | WASM grammar 加载与语言缓存 |
|
|
5702
|
+
| `src/init/astgraph/vendor/` | vendored tree-sitter 运行时、三种语言 grammar、zod |
|
|
5703
|
+
| `src/init/project.ts` | `copyAstgraphPlugin`、`hasCodeGraph` 探测、FLAVOR.md Search 章节生成 |
|
|
5704
|
+
| `src/models/structured.ts` / `src/agent/loop.ts` | 纯文本 JSON 提取、字符串类型强制转换、strict schema |
|
|
5705
|
+
| `src/permissions/engine.ts` / `src/tools/runtime.ts` / `src/tools/types.ts` | `readOnly` 声明、放行逻辑与权限请求透传 |
|
|
5706
|
+
|
|
5707
|
+
对应测试位于 `tests/plugins/astgraph/{db,extract,indexer,plugin,query,resolve}.test.mjs`、`tests/init/astgraph-copy.test.ts`、`tests/init/project.test.ts`、`tests/models/structured.test.ts`、`tests/permissions/engine.test.ts` 与 `tests/ui/slash-completion.test.ts`。
|
|
5708
|
+
|
|
5709
|
+
---
|
|
5710
|
+
|
|
5711
|
+
## 40. 1.2.14 自进化闭环(evolve)
|
|
5712
|
+
|
|
5713
|
+
1.2.14 引入内置的**有界自进化闭环**(evolve):Agent 在日常运行中捕获重复的工具失败信号,把它们聚合、去重后以建议形式注入系统提示词,由模型自行判断是否值得修;修复以 flavor-code 插件的形式落地(`fix-<tool>/`),必须先通过影子沙箱干跑与完整测试套件两道门禁,才允许热重载进运行中的宿主。循环永不完全自治:建议只是提案,任何修改仍走普通工具循环与权限系统,用户可以随时用 `/evolve` 查看、验证、回滚或关闭。
|
|
5714
|
+
|
|
5715
|
+
### 40.1 总体架构
|
|
5716
|
+
|
|
5717
|
+
```mermaid
|
|
5718
|
+
flowchart LR
|
|
5719
|
+
CAPTURE["1. CAPTURE\nPostToolUseFailure + Shell 非零退出旁路"] --> STORE[".flavor/evolve/\nsignals.jsonl 指纹去重聚合"]
|
|
5720
|
+
STORE --> ASSESS["2. ASSESS\n重复 >= minRepeats 建议注入系统提示词"]
|
|
5721
|
+
ASSESS --> MODIFY["3. MODIFY\nevolve_improve / /evolve improve\n脚手架 fix-<tool>/ 插件 + PLAN.md"]
|
|
5722
|
+
MODIFY --> VERIFY["4. VERIFY\n影子沙箱干跑 → 测试套件 → 热重载"]
|
|
5723
|
+
VERIFY --> REPEAT["5. REPEAT\nendRun 写 reflection\nsignalDelta / perTool 趋势"]
|
|
5724
|
+
REPEAT --> CAPTURE
|
|
5725
|
+
```
|
|
5726
|
+
|
|
5727
|
+
循环分五步:
|
|
5728
|
+
|
|
5729
|
+
1. **CAPTURE**:`PostToolUseFailure` 记录工具失败;Shell 工具对命令失败刻意返回结果而非抛异常,因此从 `PostToolUse` 输出旁路捕获非零退出与超时(用户取消除外)。
|
|
5730
|
+
2. **ASSESS**:同一失败重复 ≥ `minRepeats` 次后,按趋势排序取前 `promptTop` 条注入系统提示词;模型决定是否值得修、修什么。
|
|
5731
|
+
3. **MODIFY**:模型侧 `evolve_improve` 工具或人工侧 `/evolve improve <id>` 脚手架 `fix-<tool>/` 插件目录并写入 PLAN.md;实现本身(Write/Edit + reload)走普通工具循环。
|
|
5732
|
+
4. **VERIFY**:`/evolve verify` 在影子 PluginHost 沙箱中干跑;`/evolve test` 运行测试套件;`/evolve reload` 热重载;`/evolve revert` 回滚到最近良好快照。
|
|
5733
|
+
5. **REPEAT**:每次 loop 运行结束追加一条 reflection,记录 `signalDelta` 与按工具维度的 `perTool` 趋势,使“修复是否真的减少了失败”跨运行可度量。
|
|
5734
|
+
|
|
5735
|
+
### 40.2 信号捕获与去重存储
|
|
5736
|
+
|
|
5737
|
+
`EvolveStore` 将全部状态持久化在 `<workspace>/.flavor/evolve/`:
|
|
5738
|
+
|
|
5739
|
+
| 文件 | 内容 |
|
|
5740
|
+
|------|------|
|
|
5741
|
+
| `signals.jsonl` | 聚合后的工具失败信号(按指纹去重,上限 400 条,超出丢最旧) |
|
|
5742
|
+
| `reflections.jsonl` | 每次 agent 运行(loop 结束)一行评估记录 |
|
|
5743
|
+
| `done.json` / `verified.json` | 建议的已处理 / 已自动验证标记 |
|
|
5744
|
+
|
|
5745
|
+
捕获来源:
|
|
5746
|
+
|
|
5747
|
+
- **`PostToolUseFailure`**:工具抛错、校验失败、权限拒绝等真实失败;
|
|
5748
|
+
- **`PostToolUse` Shell 旁路**:Shell 工具对 `exit ≠ 0` 或超时返回结果对象而非异常,从不触发失败事件。evolve 从输出中识别非零退出与 `timeout`(`cancelled` 不计),错误码记为 `shell_exit_<code>` / `shell_exit_timeout`,与工具失败信号同一去重管线;
|
|
5749
|
+
- **`AfterModelCall`**:统计每轮模型调用次数。
|
|
5750
|
+
|
|
5751
|
+
去重与隐私:
|
|
5752
|
+
|
|
5753
|
+
- 按 `(tool, errorCode, 规范化错误)` 三元组计算 SHA-1 指纹(前 12 位);重复失败只 bump `count` 与 `lastAt`,不无限增长;
|
|
5754
|
+
- `normalizeError` 折叠空白、把双引号/反引号包裹的值替换为 `"…"` 占位符、截断 160 字符,敏感细节不落盘;
|
|
5755
|
+
- 参数只记录键名(`argKeys`,最多 12 个),**绝不记录值**;
|
|
5756
|
+
- 目录权限 `0700`,文件权限 `0600`;文件写入经串行队列,避免钩子并发互踩。
|
|
5757
|
+
|
|
5758
|
+
### 40.3 建议生成与趋势排序
|
|
5759
|
+
|
|
5760
|
+
- 同一失败重复 ≥ `minRepeats`(默认 2)次即成为候选建议;
|
|
5761
|
+
- 系统提示词在末尾追加 `# self-improvement suggestions (evolve)` 段,最多 `promptTop`(默认 3)条,只含 id、工具与一行提示;
|
|
5762
|
+
- 排序按趋势:恶化(delta > 0)优先于稳定(delta = 0),稳定优先于改善(delta < 0);同趋势下重复次数多者优先;
|
|
5763
|
+
- 某信号首次达到重复阈值时,通过 notice 向用户提示一次(指向 `/evolve suggest`),不会反复打扰;
|
|
5764
|
+
- `/evolve suggest` 列出全部开放建议与修复思路;`/evolve`(无参数)显示状态概览(信号数 / 开放建议 / 已验证 / 总失败数 / 最近信号)。
|
|
5765
|
+
|
|
5766
|
+
### 40.4 修复插件生命周期
|
|
5767
|
+
|
|
5768
|
+
`fixPluginDir = .flavor/plugins/fix-<tool>/`,快照目录 `.flavor/plugins/.versions/fix-<tool>/<timestamp>/`。
|
|
5769
|
+
|
|
5770
|
+
1. **脚手架**:`evolve_improve` 或 `/evolve improve <id>` 生成 `flavor-plugin.json`(apiVersion "1")+ `index.js` 模板 + `PLAN.md`;幂等,已存在绝不覆盖 Agent 已写内容;
|
|
5771
|
+
2. **沙箱验证**:`/evolve verify <name>` 把插件复制到临时目录,用影子 `PluginHost` 加载,检查 activation、`contributes` 声明与实际注册的一致性及诊断信息,不触碰真实宿主的 hooks/tools/commands;通过后自动写入快照;
|
|
5772
|
+
3. **热重载**:`/evolve reload <name>` 调用 `PluginHost.reload`——先卸载旧实例、重新发现并激活当前版本;入口 import 附加 `&v=${Date.now()}` 查询参数,绕过 Node ESM 模块缓存,保证取到磁盘最新代码;
|
|
5773
|
+
4. **测试门禁**:`/evolve test` 运行配置的测试命令(默认 `npm test`,120s 超时,超时杀进程);
|
|
5774
|
+
5. **回滚**:`/evolve revert <name>` 从 `.versions/` 恢复最后一份良好快照;
|
|
5775
|
+
6. **关闭**:`/evolve done <id>` 将建议标记为已处理,不再提议。
|
|
5776
|
+
|
|
5777
|
+
### 40.5 运行评估与自动验证
|
|
5778
|
+
|
|
5779
|
+
- loop 运行前 `beginRun` 重置每轮计数器(modelCalls / toolCalls / toolErrors / runToolErrors);
|
|
5780
|
+
- 运行结束 `endRun` 追加 reflection:`iterations`、`toolCalls`、`toolErrors`、`steers`、`totalFailures`(历史累计失败数)、`signalDelta`(相对上次 reflection 的失败总数变化,负值 = 修复生效)、`failedTools`、`perTool`(每工具当次失败数与 delta);
|
|
5781
|
+
- **自动验证闭环**:某工具 delta < 0 时,其开放建议自动标记 `verified` 不再提议;某工具 delta > 0(再次恶化)时,已验证的建议重新开放并标注 `worsening`——意味着旧修复可能失效,应重做或回滚;
|
|
5782
|
+
- 运行结束输出一行用户摘要(工具错误数、失败总数 `前→后 (delta)`、逐工具 `improved/worsening` 与“建议自动验证/重开”标注);无错误时仅一行静默摘要;
|
|
5783
|
+
- 同时广播 `LoopEnd` hook 事件(status / iterations / toolCalls / toolErrors / totalFailures / signalDelta),插件可订阅。
|
|
5784
|
+
|
|
5785
|
+
### 40.6 配置与命令
|
|
5786
|
+
|
|
5787
|
+
`flavor.json` 新增 `evolve` 配置段:
|
|
5788
|
+
|
|
5789
|
+
```json
|
|
5790
|
+
{
|
|
5791
|
+
"evolve": {
|
|
5792
|
+
"promptTop": 3,
|
|
5793
|
+
"minRepeats": 2,
|
|
5794
|
+
"testCommand": "npm test",
|
|
5795
|
+
"testTimeoutMs": 120000
|
|
5796
|
+
}
|
|
5797
|
+
}
|
|
5798
|
+
```
|
|
5799
|
+
|
|
5800
|
+
| 字段 | 范围 | 默认 | 含义 |
|
|
5801
|
+
|------|------|------|------|
|
|
5802
|
+
| `promptTop` | 1–10 | 3 | 注入系统提示词的建议条数 |
|
|
5803
|
+
| `minRepeats` | 2–100 | 2 | 同一失败重复多少次才成为建议 |
|
|
5804
|
+
| `testCommand` | — | `npm test` | `/evolve test` 使用的测试命令 |
|
|
5805
|
+
| `testTimeoutMs` | 1,000–600,000 | 120,000 | 测试命令超时 |
|
|
5806
|
+
|
|
5807
|
+
命令族:
|
|
5808
|
+
|
|
5809
|
+
```text
|
|
5810
|
+
/evolve 状态概览
|
|
5811
|
+
/evolve signals 最近失败信号
|
|
5812
|
+
/evolve suggest 聚合重复失败为建议(趋势排序)
|
|
5813
|
+
/evolve improve <id> 脚手架 fix 插件 + PLAN.md
|
|
5814
|
+
/evolve verify <name> 影子沙箱干跑(通过后自动快照)
|
|
5815
|
+
/evolve reload <name> 热重载进运行中宿主
|
|
5816
|
+
/evolve test 运行测试套件
|
|
5817
|
+
/evolve revert <name> 恢复最后良好快照
|
|
5818
|
+
/evolve done <id> 关闭建议
|
|
5819
|
+
/evolve verified 已自动验证的建议
|
|
5820
|
+
/evolve clear 重置信号与标记
|
|
5821
|
+
```
|
|
5822
|
+
|
|
5823
|
+
模型侧对应 `evolve_improve` 工具(输入 `suggestionId` + `implementation`),在系统提示词出现建议时由模型自行调用。
|
|
5824
|
+
|
|
5825
|
+
### 40.7 安全边界
|
|
5826
|
+
|
|
5827
|
+
| 层面 | 措施 |
|
|
5828
|
+
|------|------|
|
|
5829
|
+
| 修改有界 | 建议只是系统提示词中的提案;实现走普通工具循环,Write/Edit 与 Shell 照旧经过权限引擎 |
|
|
5830
|
+
| 验证门禁 | 激活前必须通过影子沙箱干跑与测试套件;`verify` 在临时目录的影子 PluginHost 中执行,不触碰真实宿主的 hooks/tools/commands |
|
|
5831
|
+
| 可回滚 | 每次 `improve`/`verify` 后自动快照到 `.flavor/plugins/.versions/`,`revert` 恢复最后良好快照 |
|
|
5832
|
+
| 隐私 | 信号只存规范化错误与参数键名,值、密钥、Token 不落盘;文件 `0600`、目录 `0700` |
|
|
5833
|
+
| 存储有界 | 信号上限 400 条自动淘汰最旧;reflection 追加式、不重写历史 |
|
|
5834
|
+
| 资源防护 | 测试命令默认 120s 超时,超时强杀子进程;捕获钩子失败只记 warn,绝不影响主循环 |
|
|
5835
|
+
|
|
5836
|
+
### 40.8 文件地图与验证
|
|
5837
|
+
|
|
5838
|
+
| 路径 | 职责 |
|
|
5839
|
+
|------|------|
|
|
5840
|
+
| `src/evolve/service.ts` | 循环编排:捕获钩子、提示词段缓存、命令处理、`evolve_improve` 工具、reflection 与自动验证 |
|
|
5841
|
+
| `src/evolve/store.ts` | `signals.jsonl` / `reflections.jsonl` / `done.json` / `verified.json` 持久化、指纹去重、趋势聚合 |
|
|
5842
|
+
| `src/evolve/loader.ts` | fix 插件脚手架、影子沙箱验证、快照与回滚 |
|
|
5843
|
+
| `src/plugins/host.ts` | `PluginHost.reload` 热重载;import 时间戳查询参数破除 ESM 缓存 |
|
|
5844
|
+
| `src/hooks/types.ts` | 新增 `LoopEnd` hook 事件 |
|
|
5845
|
+
| `src/config/schema.ts` | `evolve` 配置段(promptTop / minRepeats / testCommand / testTimeoutMs) |
|
|
5846
|
+
| `src/production.ts` | 运行时集成:service 创建、`evolve_improve` 注册、system 段注入、`beginRun`/`endRun` 挂接、dispose |
|
|
5847
|
+
| `src/ui/commands.ts` / `src/ui/session.ts` | `/evolve` 命令解析、帮助与分发 |
|
|
5848
|
+
| `src/tools/shell.ts` | 弱类型模型命令分词(整行命令拆为 command + args),保证 Shell 失败旁路在 Windows 下稳定 |
|
|
5849
|
+
|
|
5850
|
+
对应测试位于 `tests/evolve/{store,service,loader}.test.ts`、`tests/plugins/host.test.ts`、`tests/tools/shell.test.ts`、`tests/cli/commands.test.ts`、`tests/cli/session.test.ts` 与 `tests/config/load.test.ts`。
|