agent-trellis 0.19.0 → 0.20.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/dist/cli.js +12 -1
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.js +87 -2
- package/dist/commands/evolve.d.ts +43 -0
- package/dist/commands/evolve.js +479 -0
- package/dist/commands/mcpGateway.d.ts +28 -0
- package/dist/commands/mcpGateway.js +40 -6
- package/dist/evolve/agentView.d.ts +32 -0
- package/dist/evolve/agentView.js +34 -0
- package/dist/evolve/apply.d.ts +71 -0
- package/dist/evolve/apply.js +162 -0
- package/dist/evolve/archive.d.ts +23 -0
- package/dist/evolve/archive.js +58 -0
- package/dist/evolve/erase.d.ts +17 -0
- package/dist/evolve/erase.js +65 -0
- package/dist/evolve/extension.d.ts +37 -0
- package/dist/evolve/extension.js +63 -0
- package/dist/evolve/gate.d.ts +95 -0
- package/dist/evolve/gate.js +295 -0
- package/dist/evolve/importHistory.d.ts +91 -0
- package/dist/evolve/importHistory.js +239 -0
- package/dist/evolve/jobMain.d.ts +22 -0
- package/dist/evolve/jobMain.js +52 -0
- package/dist/evolve/jobRun.d.ts +94 -0
- package/dist/evolve/jobRun.js +273 -0
- package/dist/evolve/jobShell.d.ts +46 -0
- package/dist/evolve/jobShell.js +75 -0
- package/dist/evolve/l2.d.ts +93 -0
- package/dist/evolve/l2.js +81 -0
- package/dist/evolve/lesson.d.ts +57 -0
- package/dist/evolve/lesson.js +97 -0
- package/dist/evolve/pending.d.ts +69 -0
- package/dist/evolve/pending.js +116 -0
- package/dist/evolve/probeWorkspace.d.ts +57 -0
- package/dist/evolve/probeWorkspace.js +69 -0
- package/dist/evolve/propose.d.ts +73 -0
- package/dist/evolve/propose.js +136 -0
- package/dist/evolve/recorder.d.ts +68 -0
- package/dist/evolve/recorder.js +169 -0
- package/dist/evolve/report.d.ts +26 -0
- package/dist/evolve/report.js +37 -0
- package/dist/evolve/reportView.d.ts +96 -0
- package/dist/evolve/reportView.js +311 -0
- package/dist/evolve/risk.d.ts +106 -0
- package/dist/evolve/risk.js +224 -0
- package/dist/evolve/sources.d.ts +19 -0
- package/dist/evolve/sources.js +29 -0
- package/dist/evolve/stateDir.d.ts +21 -0
- package/dist/evolve/stateDir.js +56 -0
- package/dist/evolve/surface.d.ts +34 -0
- package/dist/evolve/surface.js +72 -0
- package/dist/evolve/trajectory.d.ts +25 -0
- package/dist/evolve/trajectory.js +88 -0
- package/dist/evolve/treeToCanonical.d.ts +28 -0
- package/dist/evolve/treeToCanonical.js +79 -0
- package/dist/evolve/trellisSubstrate.d.ts +65 -0
- package/dist/evolve/trellisSubstrate.js +154 -0
- package/dist/evolve/trigger.d.ts +177 -0
- package/dist/evolve/trigger.js +400 -0
- package/dist/evolve/types.d.ts +126 -0
- package/dist/evolve/types.js +15 -0
- package/dist/evolve/validate.d.ts +139 -0
- package/dist/evolve/validate.js +315 -0
- package/dist/host/checks.d.ts +57 -0
- package/dist/host/checks.js +126 -0
- package/dist/host/delivery.d.ts +42 -0
- package/dist/host/delivery.js +59 -0
- package/dist/host/edits.d.ts +87 -0
- package/dist/host/edits.js +102 -0
- package/dist/host/hostEvents.d.ts +74 -0
- package/dist/host/hostEvents.js +45 -0
- package/dist/host/index.d.ts +22 -0
- package/dist/host/index.js +17 -0
- package/dist/host/levels.d.ts +106 -0
- package/dist/host/levels.js +206 -0
- package/dist/host/staging.d.ts +56 -0
- package/dist/host/staging.js +106 -0
- package/dist/host/surface.d.ts +36 -0
- package/dist/host/surface.js +20 -0
- package/dist/lib/backup.js +12 -3
- package/dist/lib/fsAtomic.d.ts +7 -0
- package/dist/lib/fsAtomic.js +14 -0
- package/dist/lib/hostEventBus.d.ts +47 -0
- package/dist/lib/hostEventBus.js +94 -0
- package/dist/lib/hostExtensions.d.ts +75 -0
- package/dist/lib/hostExtensions.js +196 -0
- package/dist/lib/mcpRuntime.d.ts +12 -1
- package/dist/lib/mcpRuntime.js +34 -2
- package/dist/lib/mcpToolRegistry.d.ts +18 -2
- package/dist/lib/mcpToolRegistry.js +29 -9
- package/dist/pi-bridge/bundle.js +16 -6
- package/docs/magpie-gateway-research.md +422 -0
- package/docs/roadmap.md +22 -12
- package/docs/runtime-infra.md +41 -22
- package/docs/self-evolution.md +138 -44
- package/package.json +7 -2
package/dist/cli.js
CHANGED
|
@@ -18,6 +18,10 @@ import { runMcpAuth } from "./commands/mcpAuth.js";
|
|
|
18
18
|
import { runMcpRenew } from "./commands/mcpRenew.js";
|
|
19
19
|
import { runSecretsAudit } from "./commands/secretsAudit.js";
|
|
20
20
|
import { runRollback } from "./commands/rollback.js";
|
|
21
|
+
// consumer-wiring(8.7):`trellis evolve` 管理面挂载。这条 import 是
|
|
22
|
+
// 托管层仅有的消费者接线,登记在 test/unit/hostingIndependence.test.ts
|
|
23
|
+
// 的 CONSUMER_WIRING;物理移出自我进化时与下文 evolve 分支一并删除。
|
|
24
|
+
import { runEvolveCommand } from "./commands/evolve.js";
|
|
21
25
|
import { runSkillList, runSkillAdd, runSkillRemove, runSkillScope, runSkillUpdateBuiltin } from "./commands/skill.js";
|
|
22
26
|
import { runRemoteSkillAdd, runRemoteSkillList, runRemoteSkillUpdate } from "./commands/remoteSkill.js";
|
|
23
27
|
import { collectMemoryList, runMemoryExtraction, runMemorySync } from "./commands/memory.js";
|
|
@@ -26,7 +30,7 @@ import { runKimi } from "./commands/kimi.js";
|
|
|
26
30
|
import { TRELLIS_VERSION } from "./lib/cliMetadata.js";
|
|
27
31
|
import { flagValue } from "./lib/cliArgs.js";
|
|
28
32
|
import { parseSyncArgs } from "./lib/syncArgs.js";
|
|
29
|
-
const KNOWN_COMMANDS = ["onboard", "init", "migrate", "doctor", "sync", "mcp", "mcp-gateway", "mcp-runtime", "skill", "add", "update", "memory", "manage", "kimi", "secrets", "rollback"];
|
|
33
|
+
const KNOWN_COMMANDS = ["onboard", "init", "migrate", "doctor", "sync", "mcp", "mcp-gateway", "mcp-runtime", "skill", "add", "update", "memory", "manage", "kimi", "secrets", "rollback", "evolve"];
|
|
30
34
|
function printUsage() {
|
|
31
35
|
console.log(`trellis - a single source of capability for every coding agent
|
|
32
36
|
|
|
@@ -625,6 +629,13 @@ async function main(argv) {
|
|
|
625
629
|
process.exitCode = exitCode;
|
|
626
630
|
return;
|
|
627
631
|
}
|
|
632
|
+
if (command === "evolve") {
|
|
633
|
+
// 自我进化管理面(trellis-evolve 12.4):批准仅限交互式终端,由
|
|
634
|
+
// runEvolveCommand 内部检测;argv 原样传入,不拼 shell。
|
|
635
|
+
const { exitCode } = await runEvolveCommand(rest);
|
|
636
|
+
process.exitCode = exitCode;
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
628
639
|
console.error(`\`trellis ${command}\` is not implemented yet — this is a pre-alpha scaffold.\nSee docs/roadmap.md for status.`);
|
|
629
640
|
process.exitCode = 1;
|
|
630
641
|
}
|
|
@@ -8,6 +8,7 @@ import { loadCanonicalSource } from "../core/canonical.js";
|
|
|
8
8
|
import type { AgentId, AgentSnapshot, CanonicalSource } from "../core/types.js";
|
|
9
9
|
import { type VersionExecutor } from "../lib/cliEntrypoints.js";
|
|
10
10
|
import { type WorkspaceDoctorSection } from "../lib/workspaceDoctor.js";
|
|
11
|
+
import { type EvolveLevelSection } from "../host/levels.js";
|
|
11
12
|
/**
|
|
12
13
|
* Interim default until P1 wires this from `.trellis/mcp/servers.yaml`'s
|
|
13
14
|
* real `known_host_injected` field (P0 has no canonical source at all —
|
|
@@ -74,6 +75,13 @@ export interface DoctorReport {
|
|
|
74
75
|
/** Per-entry layer attribution when a `.agents/` workspace layer
|
|
75
76
|
* participated (trellis-workspace-scope task 3.5). */
|
|
76
77
|
workspace?: WorkspaceDoctorSection;
|
|
78
|
+
/** Self-evolution levels when `~/.trellis/evolve.yaml` has any explicit
|
|
79
|
+
* setting (trellis-evolve task 10.2). Absent when unconfigured — a
|
|
80
|
+
* machine that never enabled evolution sees byte-identical output. */
|
|
81
|
+
evolve?: EvolveLevelSection;
|
|
82
|
+
/** Pending proposal count (trellis-evolve task 12.4; spec: doctor SHALL
|
|
83
|
+
* list it). Present when > 0 or the evolve section is shown. Read-only. */
|
|
84
|
+
evolvePending?: number;
|
|
77
85
|
}
|
|
78
86
|
/** Exported so tests can assert on this resolution directly, without
|
|
79
87
|
* routing through real per-agent probes `runDoctor` also runs. */
|
package/dist/commands/doctor.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* current state against each other, the same manual process used
|
|
5
5
|
* throughout docs/research.md's investigation, now formalized.
|
|
6
6
|
*/
|
|
7
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
7
9
|
import { homedir } from "node:os";
|
|
8
10
|
import * as claudeCodeProbe from "../probes/claude-code.js";
|
|
9
11
|
import * as codexProbe from "../probes/codex.js";
|
|
@@ -13,12 +15,43 @@ import * as kimiCodeProbe from "../probes/kimi-code.js";
|
|
|
13
15
|
import * as zcodeProbe from "../probes/zcode.js";
|
|
14
16
|
import { loadCanonicalSource } from "../core/canonical.js";
|
|
15
17
|
import { GATEWAY_ENTRY_NAME, RUNTIME_ENTRY_NAME, resolveMcpPlan } from "../adapters/mcpPlan.js";
|
|
16
|
-
import { ALL_AGENTS, isOAuthAuth, oauthOwner } from "../core/types.js";
|
|
18
|
+
import { ALL_AGENTS, capabilityDeliveryForAgent, isOAuthAuth, oauthOwner } from "../core/types.js";
|
|
17
19
|
import { classifyStoredToken, remediationFor } from "../lib/oauth/renew.js";
|
|
18
20
|
import { readToken } from "../lib/oauth/store.js";
|
|
19
21
|
import { findWorkspaceRoot } from "../lib/workspace.js";
|
|
20
22
|
import { detectCliVersionSplit, findCliEntrypoints } from "../lib/cliEntrypoints.js";
|
|
21
23
|
import { collectWorkspaceDoctorSection } from "../lib/workspaceDoctor.js";
|
|
24
|
+
import { describeEvolveLevels, loadEvolveLevelPolicy, } from "../host/levels.js";
|
|
25
|
+
/**
|
|
26
|
+
* Pending proposal count via the on-disk data contract (8.1 状态目录 /
|
|
27
|
+
* 12.4 pending 存储:`~/.trellis/evolve/pending/<safeId>.json`,记录含
|
|
28
|
+
* `status` 字段)。doctor 属托管层,只读数据、不 import 自我进化代码,
|
|
29
|
+
* 物理移出消费者后 doctor 仍自洽(目录不存在 → 0)。
|
|
30
|
+
*/
|
|
31
|
+
function countPendingProposalRecords(homeDir) {
|
|
32
|
+
const dir = join(homeDir, ".trellis", "evolve", "pending");
|
|
33
|
+
let names;
|
|
34
|
+
try {
|
|
35
|
+
names = readdirSync(dir);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
let count = 0;
|
|
41
|
+
for (const name of names) {
|
|
42
|
+
if (!name.endsWith(".json"))
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(readFileSync(join(dir, name), "utf-8"));
|
|
46
|
+
if (parsed.status === "pending")
|
|
47
|
+
count += 1;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// 坏文件不阻塞 doctor 扫描。
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return count;
|
|
54
|
+
}
|
|
22
55
|
/**
|
|
23
56
|
* Interim default until P1 wires this from `.trellis/mcp/servers.yaml`'s
|
|
24
57
|
* real `known_host_injected` field (P0 has no canonical source at all —
|
|
@@ -183,7 +216,39 @@ export async function collectDoctorReport(homeDir = homedir(), knownHostInjected
|
|
|
183
216
|
}
|
|
184
217
|
const oauth = canonical ? collectOAuthHealth(homeDir, canonical) : [];
|
|
185
218
|
findings.push(...detectDuplication(snapshots), ...detectCollisions(snapshots, knownHostInjected), ...detectCrossAgentDrift(snapshots), ...detectCaseMismatches(snapshots), ...detectParseDiagnostics(snapshots), ...(canonical ? detectRuntimeDrift(snapshots, canonical) : []), ...detectMcpUnreachable(snapshots), ...oauth.flatMap((entry) => (entry.status === "valid" ? [] : [oauthFinding(entry)])));
|
|
186
|
-
|
|
219
|
+
// 分级开启(trellis-evolve 10.2):级别策略是显式用户选择,读取零副作用。
|
|
220
|
+
// 未配置(或全空)时整段缺席 —— 从未开启自我进化的机器输出与未安装时
|
|
221
|
+
// 一致;损坏的策略文件不拖垮扫描,降级为段内诊断呈现。
|
|
222
|
+
let evolve;
|
|
223
|
+
try {
|
|
224
|
+
const policy = loadEvolveLevelPolicy(homeDir);
|
|
225
|
+
// 整段只在存在显式设置时出现(与未安装时输出一致);托管 agent 的
|
|
226
|
+
// 列表只是展示面,不构成出现理由。
|
|
227
|
+
const hasExplicitSetting = policy.defaultLevel !== undefined || Object.keys(policy.agents).length > 0 || Object.keys(policy.workspaces).length > 0;
|
|
228
|
+
if (hasExplicitSetting) {
|
|
229
|
+
// 11.4:观测形态按 capability delivery 分类——runtime 交付
|
|
230
|
+
// ("mcp"/"both")的 agent 走 gateway 事件观察;仅原生渲染
|
|
231
|
+
// ("native"/未配置)只有 doctor/sync 信号。
|
|
232
|
+
const observationOf = (agent) => canonical !== undefined && capabilityDeliveryForAgent(agent, canonical.mcp) !== "native"
|
|
233
|
+
? "events"
|
|
234
|
+
: "doctor-only";
|
|
235
|
+
evolve = describeEvolveLevels(policy, (canonical?.managedAgents ?? []).map((agent) => ({ agent, observation: observationOf(agent) })));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
evolve = { agents: [], workspaces: [], diagnostics: [err.message] };
|
|
240
|
+
}
|
|
241
|
+
// 12.4:pending 提案数量(spec "trellis doctor SHALL 同样列出")。
|
|
242
|
+
// 只读状态目录;未开启进化且无存储时为 0,输出保持零噪音。
|
|
243
|
+
const evolvePending = countPendingProposalRecords(homeDir);
|
|
244
|
+
return {
|
|
245
|
+
snapshots,
|
|
246
|
+
findings,
|
|
247
|
+
...(oauth.length > 0 ? { oauth } : {}),
|
|
248
|
+
...(workspace ? { workspace } : {}),
|
|
249
|
+
...(evolve ? { evolve } : {}),
|
|
250
|
+
...(evolve || evolvePending > 0 ? { evolvePending } : {}),
|
|
251
|
+
};
|
|
187
252
|
}
|
|
188
253
|
/**
|
|
189
254
|
* Read-only OAuth credential health (trellis-mcp-oauth-renew design.md
|
|
@@ -463,4 +528,24 @@ export function printReport(report) {
|
|
|
463
528
|
console.log(` ⚠ ${warning}`);
|
|
464
529
|
}
|
|
465
530
|
}
|
|
531
|
+
if (report.evolve) {
|
|
532
|
+
const ev = report.evolve;
|
|
533
|
+
console.log(`\nSelf-evolution (evolve.yaml):`);
|
|
534
|
+
if (ev.defaultLevel !== undefined)
|
|
535
|
+
console.log(` default level: ${ev.defaultLevel}`);
|
|
536
|
+
for (const entry of ev.agents) {
|
|
537
|
+
console.log(` agent ${entry.agent}: ${entry.level} (${entry.observation})`);
|
|
538
|
+
}
|
|
539
|
+
for (const entry of ev.workspaces) {
|
|
540
|
+
console.log(` workspace ${entry.root}: ${entry.level}`);
|
|
541
|
+
}
|
|
542
|
+
for (const diagnostic of ev.diagnostics) {
|
|
543
|
+
console.log(` ⚠ ${diagnostic}`);
|
|
544
|
+
}
|
|
545
|
+
console.log(` pending proposals: ${report.evolvePending ?? 0}`);
|
|
546
|
+
}
|
|
547
|
+
else if ((report.evolvePending ?? 0) > 0) {
|
|
548
|
+
// 无级别配置但有 pending 存储:同样列出(spec SHALL),单行提示。
|
|
549
|
+
console.log(`\nSelf-evolution: ${report.evolvePending} pending proposal(s) — run \`trellis evolve pending\``);
|
|
550
|
+
}
|
|
466
551
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自我进化管理面命令(trellis-evolve 任务 12.4)。
|
|
3
|
+
*
|
|
4
|
+
* 消费者归属(8.7):本文件是自我进化子系统的一部分,物理移出消费者时
|
|
5
|
+
* 与 src/evolve/**、CLI 挂载(src/cli.ts 的 CONSUMER_WIRING 接线行)一并
|
|
6
|
+
* 删除;hostingIndependence.test.ts 的 CONSUMER_OWNED/CONSUMER_WIRING
|
|
7
|
+
* 登记了这条移出清单。
|
|
8
|
+
*
|
|
9
|
+
* `trellis evolve <status | report | pending | approve | reject | apply | run | import | enable | disable | rollback>`
|
|
10
|
+
*
|
|
11
|
+
* 批准只走这里,且**仅限交互式终端**(spec"批准只走带外通道"):非交互
|
|
12
|
+
* 环境一律拒绝,提案保持 pending。不存在任何 `--yes` / `--confirm` 之类的
|
|
13
|
+
* 非交互批准捷径 —— agent 传入的"确认"参数不构成批准,加了也只会被当
|
|
14
|
+
* 未知参数忽略。循环副作用边界:除 `run`(唯一命令行触发入口,手动
|
|
15
|
+
* 触发一次运行)外的命令不写信号、不触发观察/提案/probe。approve
|
|
16
|
+
* 决策后**立即应用**(spec"批准即应用与显式应用入口":持单飞作业锁经
|
|
17
|
+
* 备份会话写入,锁忙暂缓并告知);apply 幂等应用全部已批准未应用的编辑
|
|
18
|
+
* (失败重试与滞留消化入口);reject 只做状态迁移 + 档案;enable/disable
|
|
19
|
+
* 写 canonical 级别策略,并按 design 8.1 同步扩展清单条目——级别升至
|
|
20
|
+
* observe 及以上时写入、置回 off 时移除;rollback 转发既有备份会话回滚。
|
|
21
|
+
*/
|
|
22
|
+
import { type ApplyAgent } from "../evolve/apply.js";
|
|
23
|
+
export interface EvolveCommandOptions {
|
|
24
|
+
/** 测试/sandbox 注入缝;缺省用户 HOME。永不作为 CLI 标志暴露。 */
|
|
25
|
+
readonly homeDir?: string;
|
|
26
|
+
/** TTY 检测缝;缺省 stdin+stdout 同时为 TTY。 */
|
|
27
|
+
readonly isTTY?: boolean;
|
|
28
|
+
/** 时间源(毫秒);缺省 Date.now。 */
|
|
29
|
+
readonly now?: () => number;
|
|
30
|
+
/** 应用阶段的 agent 分类(测试/sandbox 注入缝;缺省按 delivery 分类)。 */
|
|
31
|
+
readonly applyAgents?: readonly ApplyAgent[];
|
|
32
|
+
/** 原生渲染同步触发缝(测试注入;缺省 host `triggerRenderSync`)。 */
|
|
33
|
+
readonly triggerSync?: () => Promise<{
|
|
34
|
+
exitCode: number;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 管理面命令入口。`args` 为 `evolve` 之后的 argv(子命令 + 参数),
|
|
39
|
+
* 由 cli 原样传入 —— 不经 shell 拼接。
|
|
40
|
+
*/
|
|
41
|
+
export declare function runEvolveCommand(args: readonly string[], options?: EvolveCommandOptions): Promise<{
|
|
42
|
+
exitCode: number;
|
|
43
|
+
}>;
|