@zq-silk/yui 0.15.8 → 0.15.9
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/ARCHITECTURE.md +2 -0
- package/ARCHITECTURE.zh-CN.md +151 -0
- package/README.md +211 -14
- package/dist/artifacts/artifactCapability.js +74 -0
- package/dist/artifacts/artifactCommitLock.js +249 -0
- package/dist/artifacts/artifactPaths.js +151 -0
- package/dist/artifacts/gitArtifactRef.js +146 -0
- package/dist/artifacts/managedGit.js +332 -0
- package/dist/artifacts/taskArtifactRepository.js +277 -0
- package/dist/cli/commandCatalog.js +14 -10
- package/dist/cli.js +67 -0
- package/dist/commands/operatorCommands.js +33 -2
- package/dist/commands/taskActivationCommands.js +22 -0
- package/dist/commands/taskCommands.js +342 -79
- package/dist/context/runContextPack.js +28 -16
- package/dist/context/taskContext.js +26 -3
- package/dist/controller/controller.js +8 -2
- package/dist/kernel/builtinCapabilities.js +32 -24
- package/dist/message/message.js +56 -0
- package/dist/plugins/pluginService.js +11 -3
- package/dist/resources/projectResource.js +0 -48
- package/dist/resources/projectResourceService.js +3 -81
- package/dist/setup/setupCommand.js +3 -8
- package/dist/storage/migrations/artifactsToGit.js +338 -0
- package/dist/storage/migrations/submitIntent.js +126 -0
- package/dist/storage/sqliteSchema.js +37 -3
- package/dist/storage/sqliteStore.js +1 -21
- package/dist/storage/storageVersions.js +1 -1
- package/dist/storage/storeRpc.js +1 -1
- package/dist/task/taskActivation.js +26 -0
- package/dist/task/taskActivationService.js +85 -69
- package/dist/task/taskSubmission.js +236 -0
- package/dist/web/assets/client/app.js +3 -2
- package/dist/web/assets/client/taskSurface.js +96 -7
- package/dist/web/webServer.js +18 -3
- package/dist/web/webTaskSurface.js +6 -6
- package/dist/workItem/workItem.js +14 -10
- package/docs/agent-result-consumption.md +2 -0
- package/docs/agent-result-consumption.zh-CN.md +81 -0
- package/docs/agent-runtime-drivers.md +2 -0
- package/docs/agent-runtime-drivers.zh-CN.md +77 -0
- package/docs/architecture/README.md +44 -32
- package/docs/architecture/README.zh-CN.md +43 -0
- package/docs/architecture/capabilities-and-resources.md +118 -79
- package/docs/architecture/capabilities-and-resources.zh-CN.md +83 -0
- package/docs/managed-turn-and-session-runtime.md +2 -0
- package/docs/managed-turn-and-session-runtime.zh-CN.md +180 -0
- package/docs/observability/README.md +2 -0
- package/docs/observability/README.zh-CN.md +71 -0
- package/docs/plugin-sdk.md +320 -217
- package/docs/plugin-sdk.zh-CN.md +293 -0
- package/docs/provider-runtime.md +2 -0
- package/docs/provider-runtime.zh-CN.md +132 -0
- package/docs/release-workflow.md +2 -0
- package/docs/release-workflow.zh-CN.md +237 -0
- package/docs/roles-and-configuration.md +2 -0
- package/docs/roles-and-configuration.zh-CN.md +96 -0
- package/docs/sqlite-control-plane-design.md +2 -0
- package/docs/sqlite-control-plane-design.zh-CN.md +62 -0
- package/docs/task-dag-semantics.md +80 -57
- package/docs/task-dag-semantics.zh-CN.md +59 -0
- package/docs/task-delivery.md +2 -0
- package/docs/task-delivery.zh-CN.md +82 -0
- package/docs/task-local-identity.md +2 -0
- package/docs/task-local-identity.zh-CN.md +58 -0
- package/docs/testing/verification-levels.md +2 -0
- package/docs/testing/verification-levels.zh-CN.md +69 -0
- package/i18n/README.zh-CN.md +199 -10
- package/package.json +2 -1
- package/skills/yui-leader/SKILL.md +88 -331
- package/skills/yui-leader/references/execution.md +303 -0
- package/skills/yui-leader/references/planning.md +109 -0
- package/skills/yui-leader/references/task-plugins.md +8 -4
- package/skills/yui-operator/SKILL.md +16 -3
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<p align="right"><a href="./task-delivery.md">English</a> | <strong>简体中文</strong></p>
|
|
2
|
+
|
|
3
|
+
# Task 交付与资源生命周期
|
|
4
|
+
|
|
5
|
+
## 生命周期与规划
|
|
6
|
+
|
|
7
|
+
Task 生命周期是 `draft / active / completed / cancelled / archived`。Draft 保存
|
|
8
|
+
意图、Project 绑定、规划讨论和可变需求。它在创建时不采用可写的交付工作区。
|
|
9
|
+
|
|
10
|
+
激活会校验当前 Role、依赖、Project 范围和资源,准备物理工作区,并原子地采用
|
|
11
|
+
状态/所有权。准备失败会让 Task 停在 Draft,附带一个失败请求和投递给 Leader 的
|
|
12
|
+
诊断。延迟激活保留确切意图并等待原生静止,无论它是在规划 Run 中还是在后续讨论中
|
|
13
|
+
被请求的。
|
|
14
|
+
|
|
15
|
+
Task type 描述被请求的结果,而不是强制的执行者。Leader 直接负责有界工作,或分派
|
|
16
|
+
有独立价值的 WorkItem。直接执行没有 Group。复制是为了在同一个冻结 Assignment 上
|
|
17
|
+
进行独立尝试而被显式请求的,随后由 Leader 选择综合。
|
|
18
|
+
|
|
19
|
+
## 受管工作区
|
|
20
|
+
|
|
21
|
+
稳定的 Project checkout 是只读参考。Task main 是一个逻辑上的多 Project 根,带有
|
|
22
|
+
按 Project 划分的 Git worktree。对单个 Project,Agent 的正常 cwd 是其受管 Git 根;
|
|
23
|
+
对多个 Project,根加上原生的附加目录机制暴露明确的 Project 集合。
|
|
24
|
+
|
|
25
|
+
一个隔离的 WorkItem 为可写 Project 拥有独立 worktree,为其余 Project 提供 Task-main
|
|
26
|
+
上下文。写范围是显式的,且只能由获授权的 owner 扩大。Review 拥有一个单独的冻结
|
|
27
|
+
工作区,不能变成 Develop 或 Integration 来源。验收或退役不释放 WorkItem 的持久
|
|
28
|
+
工作区。Task-main 准备会保留一个 Role 保留的 WorkItem/Review cwd,直到显式清理或
|
|
29
|
+
重新分派。决策支持类读取观察当前 Git head,而不准备工作区或迁移 Session。
|
|
30
|
+
|
|
31
|
+
启动前,实际 Git 血缘必须由已记录的基线派生而来。落在该血缘之外的 reset 是物理
|
|
32
|
+
漂移,而不是猜测或修复所有权的理由。一个显式采用的环境可以选择不同的原生 cwd,
|
|
33
|
+
而受管工作区仍是 Git/控制所有权记录。
|
|
34
|
+
|
|
35
|
+
## Candidate、Review 与 Integration
|
|
36
|
+
|
|
37
|
+
Provider 终态保存确切的原始 Run 结果。它不验收 WorkItem。Leader 评估结果,并为
|
|
38
|
+
隔离代码捕获不可变的、按 Project 划分的 ChangeSet。治理 Candidate 为 Review 和
|
|
39
|
+
Integration 提供来源;Producer 不独立进入这两条路径中的任何一条。
|
|
40
|
+
|
|
41
|
+
Integration 在候选 worktree 中套用固定 ChangeSet,运行已配置的检查,然后只有在
|
|
42
|
+
目标 head 仍匹配时才推进目标。冲突、检查失败、目标移动或拒绝都保留证据,绝不推进
|
|
43
|
+
目标。Agent 在保留的工作区内选择重试或手动解决。
|
|
44
|
+
|
|
45
|
+
当检查是一个 DurableJob 时,Integration 在运行期间保留那个确切的 jobId。Job 结算
|
|
46
|
+
后,`task integration continue <task>/<integration>` 消费其结果并执行带守卫的收尾。
|
|
47
|
+
这个直接操作不依赖单独 integration 队列中的条目。
|
|
48
|
+
|
|
49
|
+
Review 遵循适用的 Candidate 规则或 Task-final 合同以及冻结的 head。确切的 main
|
|
50
|
+
Reviewer Run 持有报告;执行成功不等于语义通过。验收归 Leader。即使默认审查策略
|
|
51
|
+
被关闭,用户明确要求委派或获取独立 Review 仍是验收的一部分。`next-action` 报告已
|
|
52
|
+
存储的事实和备选项;它不能削弱 Task Contract,也不能推断“没有记录 WorkItem”就
|
|
53
|
+
意味着请求了直接执行。
|
|
54
|
+
|
|
55
|
+
## 完成与远程交付
|
|
56
|
+
|
|
57
|
+
完成会检查当前的 WorkItem、最新捕获/集成的结果、适用的 Review 合同以及确切的、
|
|
58
|
+
干净且已提交的 Task-main 快照。当有一条新的 user/Operator 消息仍在等待 Leader
|
|
59
|
+
投递时,它也会拒绝完成。当前原生轮次必须结束,待处理的通知才能到达;随后 Leader
|
|
60
|
+
读取原始消息并重新评估完成。这派生自既有的 Message 和 mailbox 投递,而不是第二套
|
|
61
|
+
确认或工作流状态。终态工作区清理在完成时可以只是建议,但在归档时不行。被选作
|
|
62
|
+
结果的 Artifact 必须是固定的、存在的且 Task 局部的。
|
|
63
|
+
|
|
64
|
+
发布记录一个远程 PR/MR 引用。被报告的合并、独立验证的合并以及确切的 Task-head
|
|
65
|
+
覆盖是彼此独立的事实。Task 完成不证明其中任何一项。远程交付从确切的发布/head
|
|
66
|
+
证据读取,而不从标题或分支名推断。
|
|
67
|
+
|
|
68
|
+
取消意图不证明运行时已停止。user/Operator 可以重开已取消的 Task;Leader 可以重开
|
|
69
|
+
已完成的 Task。重开需要全新的显式输入/工作选择,绝不重放先前的交付请求。
|
|
70
|
+
|
|
71
|
+
## 归档
|
|
72
|
+
|
|
73
|
+
归档是一次单独的授权动作,发生在活动工作已了结、资源干净可移除之后。显式选择
|
|
74
|
+
集成交付或有意放弃。集成归档要求确切的已合并 head 和已验证的发布证据。一次显式
|
|
75
|
+
授权的验证覆盖不能绕过缺失或陈旧的 head,也不能绕过一个未合并的结果。
|
|
76
|
+
|
|
77
|
+
受管的 WorkItem 资源必须在清理前被集成或有意放弃。Review、Lane 和 Integration
|
|
78
|
+
资源必须已结算。脏 worktree 留给 Agent 解决;不发生隐式 reset 或强制删除。Task
|
|
79
|
+
main 分支和持久 Task 记录保留恢复信息。已归档的 Task 不能重开。
|
|
80
|
+
|
|
81
|
+
清理前用每个命令的 `--help` 查看它确切的权限和选项;阅读一份生命周期文档不授权
|
|
82
|
+
一次外部写入。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<p align="right"><a href="./task-local-identity.md">English</a> | <strong>简体中文</strong></p>
|
|
2
|
+
|
|
3
|
+
# Task 局部身份
|
|
4
|
+
|
|
5
|
+
Yui 把 Task 作为持久工作流记录的聚合边界。每个 Task 为下面每一类记录族维护
|
|
6
|
+
一条独立、单调递增的序列:
|
|
7
|
+
|
|
8
|
+
- WorkItem
|
|
9
|
+
- AgentRun
|
|
10
|
+
- ReviewRound
|
|
11
|
+
- ChangeSet
|
|
12
|
+
- IntegrationAttempt
|
|
13
|
+
- Message
|
|
14
|
+
- InputRequest
|
|
15
|
+
- Decision
|
|
16
|
+
- Milestone
|
|
17
|
+
- Event
|
|
18
|
+
|
|
19
|
+
序列从 1 开始,因此每个 Task 内某个族的第一条记录本地编号都以 `-1` 结尾
|
|
20
|
+
(例如 `work-item-1`)。删除、取消、完成、重开和归档都不会降低已持久化的
|
|
21
|
+
高水位,所以本地 ID 在同一个 Task 内永不复用。每次分配都在 Store 事务内推进
|
|
22
|
+
该聚合高水位。
|
|
23
|
+
|
|
24
|
+
Candidate 身份的范围更窄:`candidate-N` 是 WorkItem 内的局部序列。每个
|
|
25
|
+
Candidate 都保存自己的 `taskId` 和 `workItemId`,在有来源 AgentRun 时再附带
|
|
26
|
+
其引用。
|
|
27
|
+
|
|
28
|
+
## 引用合同
|
|
29
|
+
|
|
30
|
+
Task 所属引用的可移植形式为:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
<task-id>/<local-id>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
例如 `task-7/work-item-1` 和 `task-9/work-item-1` 是不同的。CLI、JSON、mailbox、
|
|
37
|
+
Controller、Hook、回执、Web 以及错误路径都保留 Task 范围。无上下文的命令会
|
|
38
|
+
拒绝裸的本地 ID,而不是在所有 Task 中搜索,即使该 ID 当前恰好唯一。
|
|
39
|
+
|
|
40
|
+
受管的 Task 会话可以直接用 `work-item-1` 或 `run-1`,因为它的 `YUI_TASK_ID`
|
|
41
|
+
是明确的。已经通过其他参数收到 Task 的命令也可以使用从属的本地 ID。除这两种
|
|
42
|
+
情形外,一律使用限定形式。投递回执沿用同样的来源标注,例如:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
run:task-7/run-1
|
|
46
|
+
input-request:task-7/input-1
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
不存在兼容查找、跨 Task 猜测或裸 ID 回退。
|
|
50
|
+
|
|
51
|
+
## 当前 schema 边界
|
|
52
|
+
|
|
53
|
+
运行时只打开当前 Home 存储版本和当前记录形态,普通工作中既不双读也不推断
|
|
54
|
+
历史记录。历史解码与改写只发生在显式的 `yui upgrade` 边界和 `yui update` 的
|
|
55
|
+
迁移阶段;凡是不低于 CLI 最低支持存储版本的有效 Home 都能直接推进到当前版本。
|
|
56
|
+
|
|
57
|
+
这条边界让 Task 局部引用、Role 期望配置以及不可变的 AgentRun/RoleSession
|
|
58
|
+
生效快照都处在同一份无歧义的运行时合同下,而只追加的迁移链保留受支持的历史。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<p align="right"><a href="./verification-levels.md">English</a> | <strong>简体中文</strong></p>
|
|
2
|
+
|
|
3
|
+
# 验证策略
|
|
4
|
+
|
|
5
|
+
Yui 是一个单用户本地产品。永久验证保护关键的 happy path 和少数几个高影响、易被改动
|
|
6
|
+
的正确性边界。它不是一份把每个缺陷或边界情况都收录在案的历史目录。
|
|
7
|
+
|
|
8
|
+
## 本地开发
|
|
9
|
+
|
|
10
|
+
使用当前变更所需的最小证据。仅当以下全部成立时才保留一个聚焦的回归测试:
|
|
11
|
+
|
|
12
|
+
- 失败会丢失持久意图、越过权限/隔离边界,或阻止 Agent/Operator 取得正当进展。
|
|
13
|
+
- 该边界被频繁改动的代码共享,或已经在一次真实执行中失败过。
|
|
14
|
+
- 该检查是确定性的、使用一次性本地夹具、在毫秒级运行,并断言可观察行为而非附带布局。
|
|
15
|
+
- 尚不存在等价覆盖;优先用一个连贯的场景,而不是为每个历史症状分开建用例。
|
|
16
|
+
|
|
17
|
+
把宽泛的故障矩阵、真实模型演练、畸形数据组合和针对具体事故的脚本保持为临时的。变更
|
|
18
|
+
完成后移除它们的 harness,并保留有用的报告。真实资源结果不替代快速回归,快速回归也
|
|
19
|
+
不确立真实模型行为。
|
|
20
|
+
|
|
21
|
+
## 永久 core smoke
|
|
22
|
+
|
|
23
|
+
`npm test` 和 `npm run test:core` 构建 checkout 并运行一个永久套件:
|
|
24
|
+
|
|
25
|
+
1. 打包后的 CLI 能启动,并暴露 setup/update/upgrade/Task 命令;
|
|
26
|
+
2. 一个普通的 SQLite Task 和 Message 能在重开后存活;
|
|
27
|
+
3. 一个受支持的历史 Home 沿线性存储链迁移到当前版本;
|
|
28
|
+
4. 内置的 Codex 与 Claude Driver 已注册;
|
|
29
|
+
5. 一个独立的声明式插件通过认证入口被创建、验证、调用和停用,其选择和验证被保留。
|
|
30
|
+
6. 一个 Task 从持久的 Operator 输入启动,暴露规划 Context,并在原始意图和捕获的
|
|
31
|
+
planning 权限被保留的情况下进入交付。
|
|
32
|
+
7. Session 替换保留待处理的原始 Message 和独立工作;旧 Session 保留范围受限的读取,
|
|
33
|
+
但不能重获写权限;
|
|
34
|
+
8. InputRequest 在没有合成 AgentRun 的情况下经受 Session 替换;
|
|
35
|
+
9. 迟到的原生终态不能结算后继输入或编造接受;
|
|
36
|
+
10. 远程 Operator 启动携带其保留工作区、Role 指令和范围受限的 CLI 身份,同时离线
|
|
37
|
+
诊断/恢复仍可达。
|
|
38
|
+
11. 持久排队的原生结果经受 Controller 中断并重放,而不毒化 Host;已知的终态输入不会
|
|
39
|
+
仅因时间变老就变为活动;
|
|
40
|
+
12. Task-final 审查能在没有全局模板的情况下使用其 Task 局部 Reviewer。
|
|
41
|
+
13. 一个原生错误标签只有在具备最新 Turn 终态证据且后台执行已排空时才允许替换;一个
|
|
42
|
+
错误的原生账号不能授权清理。
|
|
43
|
+
14. Claude 收到其原生环境和 settings 路径,而没有被注入的认证 helper、被改写的批准
|
|
44
|
+
记录,也没有把 secret 转发给无关适配器;原生认证选择仍归 Claude。环境刷新移除
|
|
45
|
+
已撤销的 key,并把值挡在持久 Task/Role 记录之外。
|
|
46
|
+
|
|
47
|
+
把测试阶段保持在秒级;单独度量 TypeScript 构建。新增一个关键回归时记录其增量运行
|
|
48
|
+
时长。这七个恢复边界用例在开发主机上最初约增加 0.4 秒的测试体(独立运行约 0.6 秒,
|
|
49
|
+
含模块启动)。避免在永久套件中使用基于 sleep 的检查或强制的模型/daemon 启动。
|
|
50
|
+
|
|
51
|
+
## Skill 与指令变更
|
|
52
|
+
|
|
53
|
+
一并审阅共享的 Runtime 合同和受影响的 Role/Project Skill。用几个相关场景检查指令
|
|
54
|
+
边界:分析保持只读、复用既有机制、Session 丢失保留 Task 意图,以及执行失败不阻止获
|
|
55
|
+
授权的监督。这是一次有界审阅,而不是一套新的永久矩阵,也不是使用真实模型的许可。
|
|
56
|
+
|
|
57
|
+
package-start 检查跟随已安装树中的本地 Skill 引用,包括跨 Role 链接。入口点及其引用
|
|
58
|
+
的 Markdown 必须一起发布。文件/格式检查确立可用性,而不是 Agent 行为;不要添加基于
|
|
59
|
+
散文匹配的测试,也不要从静态检查中宣称模型验证。
|
|
60
|
+
|
|
61
|
+
## CI 与发布
|
|
62
|
+
|
|
63
|
+
`ci.yml` 运行 core smoke 加一个包装配/启动检查。它不运行第二遍 lint,也不运行单独的
|
|
64
|
+
宽泛回归套件。`publish.yml` 复用那个确切的、已过门的提交,只增加发布独有的 tag、
|
|
65
|
+
产物、安装和 provenance 检查。
|
|
66
|
+
|
|
67
|
+
作为开发者或审查者的已配置 Agent 是普通执行资源。把一个真实 provider 或模型作为验证
|
|
68
|
+
对象则不同:付费 API、共享 Home、生产系统、真实账号额度以及其他不可丢弃的外部效果,
|
|
69
|
+
绝不由一个测试或验证请求隐含。它们需要用户就确切的资源和效果边界提出显式请求。
|
package/i18n/README.zh-CN.md
CHANGED
|
@@ -2,18 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
# Yui
|
|
4
4
|
|
|
5
|
+
[](https://github.com/zhangqian-silk/yui/actions/workflows/ci.yml)
|
|
6
|
+
[](../LICENSE)
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
[](#参与开发)
|
|
10
|
+
|
|
5
11
|
让 Agent 持续推进你的任务,而不只是回答一轮对话。
|
|
6
12
|
|
|
7
|
-
Yui
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
Yui 是面向编程 Agent 的本地控制面。你只需用自然语言把目标告诉 Operator:它
|
|
14
|
+
识别相关 Project,区分新任务与已有任务的补充,并把每个请求整理成一个 Task,
|
|
15
|
+
由一个 Leader 负责规划、委派,并把结果与决策带回来。意图、进展和结果都保存
|
|
16
|
+
在单次对话之外,因此继续工作从 Task 开始——而不是靠你在多个终端之间搬运
|
|
17
|
+
上下文或凭记忆。
|
|
18
|
+
|
|
19
|
+
**亮点**
|
|
20
|
+
|
|
21
|
+
- **天生持久** —— Task、决策与结果都保存在本地的单一 SQLite 存储里,进程
|
|
22
|
+
崩溃或重启都不丢,继续工作从 Task 开始,而不是从聊天记录开始。
|
|
23
|
+
- **一处对话,多个 Task** —— Operator 把自然语言请求变成新 Task 或已有
|
|
24
|
+
Task 的补充,无需记 Task ID,也不用在多个终端之间搬运上下文。
|
|
25
|
+
- **每个结果都有 Leader 负责** —— 规划、拆成 WorkItem、委派给 Worker 与
|
|
26
|
+
Reviewer 并闭环;你也可以随时直接和它沟通。
|
|
27
|
+
- **自带 Agent** —— Codex CLI、Claude Code CLI 和 ACP 通过统一边界接入,
|
|
28
|
+
可替换而不丢失 Task。
|
|
29
|
+
- **本地优先、私有** —— 一切运行在你自己的机器上,面向单个受信任用户;
|
|
30
|
+
Web 视图仅本地回环、只读。
|
|
31
|
+
- **默认隔离** —— 仓库改动发生在受管 Git worktree 中,稳定 checkout 保持只读。
|
|
11
32
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
从任务本身开始,而不是依赖你的记忆。
|
|
33
|
+
> **状态:** 尚未发布 1.0(0.15.x)。CLI 与配置在版本之间仍可能变化;每次升级
|
|
34
|
+
> 都会迁移有效的既有 Home。
|
|
15
35
|
|
|
16
|
-
[快速开始](#快速开始) · [通过对话管理工作](#通过对话管理工作) · [
|
|
36
|
+
[快速开始](#快速开始) · [通过对话管理工作](#通过对话管理工作) · [架构](#架构) · [设计原则](#设计原则)
|
|
17
37
|
|
|
18
38
|
## 快速开始
|
|
19
39
|
|
|
@@ -104,7 +124,156 @@ Agent 可以重新读取任务上下文,继续兼容的 Session,或在必要
|
|
|
104
124
|
想直观看进展,可以在另一个终端运行 `yui web`。本地 Web 展示同一份任务与
|
|
105
125
|
待回答问题,不是另一套需要同步的任务系统。
|
|
106
126
|
|
|
107
|
-
##
|
|
127
|
+
## 架构
|
|
128
|
+
|
|
129
|
+
在底层,Yui 把每一条持久事实都保存在同一个本地 SQLite 存储里,并让 Agent
|
|
130
|
+
通过小而明确的操作来读写它。下面从几个不同角度看同一套系统:
|
|
131
|
+
|
|
132
|
+
- [产品结构](#产品结构) —— 你面对的持久对象
|
|
133
|
+
- [工作如何流转](#工作如何流转) —— 围绕 Task 的闭环
|
|
134
|
+
- [用户消息流转](#用户消息流转) —— 你发一条消息时发生了什么
|
|
135
|
+
- [核心模块](#核心模块) —— 长期运行的运行时组件
|
|
136
|
+
- [分层设计](#分层设计) —— 自上而下的职责划分
|
|
137
|
+
- [生命周期](#生命周期) —— Task 与 WorkItem 经历的状态
|
|
138
|
+
|
|
139
|
+
### 产品结构
|
|
140
|
+
|
|
141
|
+
Yui 为你组织的东西 —— 是持久对象,而不是进程:
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
全局
|
|
145
|
+
├─ Operator ── 与你对话的 Agent;横跨所有 Project 与 Task
|
|
146
|
+
└─ Projects
|
|
147
|
+
└─ Project ── 受管的代码库 + 它的 Project Knowledge
|
|
148
|
+
└─ Task ── 你要的一个明确结果
|
|
149
|
+
├─ Brief ......... 目标 · 边界 · 方法
|
|
150
|
+
├─ Roles ......... Leader(负责)· Workers · Reviewers
|
|
151
|
+
├─ WorkItem ...... 可独立验收的需求
|
|
152
|
+
│ └─ AgentRun .. 一次明确请求的执行 ─▶ Result
|
|
153
|
+
├─ 消息 .......... 持久对话 + Decision
|
|
154
|
+
└─ 审查 / 集成 ─▶ 验收交付
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 工作如何流转
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
你
|
|
161
|
+
│ 用自然语言描述工作 · 回答问题 · 细化范围
|
|
162
|
+
▼
|
|
163
|
+
Operator ── 读取你的意图,然后:
|
|
164
|
+
│ • 新建一个 Task,或
|
|
165
|
+
│ • 把补充追加到已有 Task(follow-up)
|
|
166
|
+
▼
|
|
167
|
+
Task ── 由一个 Leader 负责,闭环推进:
|
|
168
|
+
│
|
|
169
|
+
│ 规划 ─▶ 拆解为多个 WorkItem ─▶ 交付 ─▶ 审查 ─▶ 关闭
|
|
170
|
+
│
|
|
171
|
+
│ 每个 WorkItem 由 Leader 自己推进,或委派出去:
|
|
172
|
+
│ ├──▶ Worker 另一个 Agent 来实现
|
|
173
|
+
│ └──▶ Reviewer 在验收前检查结果
|
|
174
|
+
│
|
|
175
|
+
▼
|
|
176
|
+
结果与决策回到你这里 —— 你也可以随时直接和 Leader 沟通某个任务的细节。
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 用户消息流转
|
|
180
|
+
|
|
181
|
+
你发一条消息时会发生什么 —— Controller 只负责唤醒 Agent,持久记录始终在存储里:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
── 入站 ────────────────────────────────────────────────────────────────────
|
|
185
|
+
你 ─▶ Operator ─▶ 记录一个 Task(新建或 follow-up)+ 一条 Message ─▶ yui.db
|
|
186
|
+
│
|
|
187
|
+
Controller 唤醒 Leader
|
|
188
|
+
▼
|
|
189
|
+
── 处理 ────────────────────────────────────────────────────────────────────
|
|
190
|
+
Leader 读取 Context ─▶ 自己动手,或委派给 Worker / Reviewer
|
|
191
|
+
─▶ 把结果 · 决策 · 消息写回 ─▶ yui.db
|
|
192
|
+
│
|
|
193
|
+
Controller 唤醒 Operator
|
|
194
|
+
▼
|
|
195
|
+
── 出站 ────────────────────────────────────────────────────────────────────
|
|
196
|
+
yui.db ─▶ Operator 读取更新 ─▶ 回复你
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 核心模块
|
|
200
|
+
|
|
201
|
+
长期运行的运行时组件。你始终只和 Operator 对话,真正读写存储的是 Agent
|
|
202
|
+
与 Controller:
|
|
203
|
+
|
|
204
|
+
```text
|
|
205
|
+
你
|
|
206
|
+
│ 你用自然语言和 Operator 对话
|
|
207
|
+
│ (你不直接驱动 Controller 或存储)
|
|
208
|
+
▼
|
|
209
|
+
Agent 会话 · 在 tmux 中
|
|
210
|
+
│ Operator ── 与你对话的 Agent;把请求归入 Task
|
|
211
|
+
│ Leader · Workers · Reviewers ── 规划、交付、审查
|
|
212
|
+
│ 每个角色通过 AgentHost / AgentEndpoint / Driver 驱动一个原生 Agent:
|
|
213
|
+
│ Codex CLI(App Server)· Claude Code CLI(stream-json)· ACP
|
|
214
|
+
│
|
|
215
|
+
│ Agent 读取 Context 并做原子修改(yui 操作)
|
|
216
|
+
▼
|
|
217
|
+
┌─ yui.db — SQLite (WAL) · 唯一事实来源 · 每次修改一个事务
|
|
218
|
+
│ Task · WorkItem · AgentRun · 消息 · 决策 · 结果
|
|
219
|
+
└─ Project Knowledge · 配置
|
|
220
|
+
▲
|
|
221
|
+
│ 读取并记录运行事实;唤醒会话并投递工作
|
|
222
|
+
│
|
|
223
|
+
Controller · 每个 Home 一个
|
|
224
|
+
投递 · Scheduler · Job · 能力宿主 · Web 监听
|
|
225
|
+
它负责搬运工作、记录事实——但从不判断回答好坏
|
|
226
|
+
|
|
227
|
+
Agent 在 Project 中工作:只读 checkout + 隔离 worktree。
|
|
228
|
+
Web 视图(yui web):对存储的本地回环、只读投影。
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 分层设计
|
|
232
|
+
|
|
233
|
+
每一层只负责一件事,并暴露小而明确的能力,而不是固定流程:
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
体验层 Experience — 你如何交互
|
|
237
|
+
CLI(Operator)· Web(本地回环、只读)· 原生 Agent 会话
|
|
238
|
+
采集输入 · 展示事实 · 确认操作 · 调用能力
|
|
239
|
+
▼
|
|
240
|
+
决策层 Intelligence — 谁来决定
|
|
241
|
+
Operator:识别请求、划分 Task
|
|
242
|
+
Leader: 规划 · 委派 · 判断 · 完成一个 Task
|
|
243
|
+
Workers · Reviewers(行为来自 Role 与 Skill)
|
|
244
|
+
▼
|
|
245
|
+
能力层 Capability — Yui 暴露的原子操作
|
|
246
|
+
交付: Task · WorkItem · Decision · Candidate · Review
|
|
247
|
+
上下文:Context · Message · InputRequest · Project Knowledge
|
|
248
|
+
配置: Role · Agent 配置 · Project · Plugin
|
|
249
|
+
执行: dispatch · inspect · stop · 资源操作 · Artifact
|
|
250
|
+
▼
|
|
251
|
+
执行层 Execution — 工作实际如何运行
|
|
252
|
+
AgentHost / AgentEndpoint / Driver,各自运行在 tmux 会话中
|
|
253
|
+
Codex CLI(App Server)· Claude Code CLI(stream-json)· ACP
|
|
254
|
+
受管 Git worktree · 采用的环境
|
|
255
|
+
▼
|
|
256
|
+
内核 Kernel — 持久权威:yui.db(SQLite,WAL)
|
|
257
|
+
存储 · 身份 · 权限 · 操作事实 · 实例宿主
|
|
258
|
+
|
|
259
|
+
▲ 插件通过 Capability Registry 扩展能力层
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 生命周期
|
|
263
|
+
|
|
264
|
+
每个对象的状态只有一个权威;执行与等待是运行事实,不是额外状态:
|
|
265
|
+
|
|
266
|
+
```text
|
|
267
|
+
Task draft ─▶ active ─▶ completed ─▶ archived
|
|
268
|
+
└────▶ cancelled ─▶ archived
|
|
269
|
+
|
|
270
|
+
WorkItem open ─▶ accepted ─▶ retired
|
|
271
|
+
|
|
272
|
+
Draft 只保存规划;激活后才采用交付工作区。
|
|
273
|
+
归档需要工作已了结、worktree 干净,且不可重新打开。
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## 设计原则
|
|
108
277
|
|
|
109
278
|
### Agent 做判断,Yui 保存工作事实
|
|
110
279
|
|
|
@@ -139,6 +308,17 @@ Task-local 插件。可执行插件仍需要具体执行授权;业务结果可
|
|
|
139
308
|
Yui 面向一个受信任本地用户,不是 OS 沙箱,也不是远程多用户服务。发布、
|
|
140
309
|
授予新权限等外部效果仍需相应授权。
|
|
141
310
|
|
|
311
|
+
## 对比
|
|
312
|
+
|
|
313
|
+
| | 只聊天的 Agent | 手动 Agent CLI + tmux | Yui |
|
|
314
|
+
| --- | --- | --- | --- |
|
|
315
|
+
| 工作能否跨会话留存 | 否 | 靠你自己记 | 持久 Task,集中存储 |
|
|
316
|
+
| 新请求还是补充 | 你判断 | 你判断 | Operator 自动分流 |
|
|
317
|
+
| 多步委派 | 手动 | 手动 | Leader → WorkItem → Worker/Reviewer |
|
|
318
|
+
| 中途换模型/Agent | 上下文丢失 | 手动重配 | 统一边界下可替换 |
|
|
319
|
+
| 并行工作隔离 | —— | 自己管分支 | 受管 Git worktree |
|
|
320
|
+
| 事实存放在哪 | 聊天记录 | 分散各处 | 单一 SQLite 事实来源 |
|
|
321
|
+
|
|
142
322
|
## 深入了解
|
|
143
323
|
|
|
144
324
|
[总体架构](../ARCHITECTURE.md)介绍端到端设计,
|
|
@@ -150,7 +330,9 @@ Yui 默认将控制面数据保存在 `~/.yui`,通过 `YUI_HOME` 选择另一
|
|
|
150
330
|
|
|
151
331
|
## 参与开发
|
|
152
332
|
|
|
153
|
-
|
|
333
|
+
完整流程见 [CONTRIBUTING.md](../CONTRIBUTING.md),并请遵守
|
|
334
|
+
[行为准则](../CODE_OF_CONDUCT.md)。简而言之:源码 checkout 中从
|
|
335
|
+
`npm ci` 和 `npm test` 开始,阅读
|
|
154
336
|
`.agents/skills/develop-yui/SKILL.md` 与[验证策略](../docs/testing/verification-levels.md)。
|
|
155
337
|
源码构建还需要 Linux C 编译器和静态 libc 开发库,用于构建 Claude 子进程
|
|
156
338
|
监督器;发布的 npm 包已包含该可执行文件,安装使用时无需编译。
|
|
@@ -160,6 +342,13 @@ Yui 默认将控制面数据保存在 `~/.yui`,通过 `YUI_HOME` 选择另一
|
|
|
160
342
|
状态命令前执行该 launcher 的 `setup`。不要用全局 `yui` 或 `make link`
|
|
161
343
|
验证本地修改。真实模型、付费或共享资源测试需要用户明确请求这些资源。
|
|
162
344
|
|
|
345
|
+
## 社区与支持
|
|
346
|
+
|
|
347
|
+
- 问题、缺陷与功能建议:提交
|
|
348
|
+
[GitHub issue](https://github.com/zhangqian-silk/yui/issues)。
|
|
349
|
+
- 安全:见[安全策略](../SECURITY.md)。Yui 面向单个受信任的本地用户,不是
|
|
350
|
+
OS 沙箱,也不是远程服务;涉及安全的问题请私下报告,不要公开提交 issue。
|
|
351
|
+
|
|
163
352
|
## 许可证
|
|
164
353
|
|
|
165
354
|
[MIT](../LICENSE)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zq-silk/yui",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.9",
|
|
4
4
|
"description": "Local control plane for long-running native agent CLI sessions backed by tmux.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"docs",
|
|
15
15
|
"README.md",
|
|
16
16
|
"ARCHITECTURE.md",
|
|
17
|
+
"ARCHITECTURE.zh-CN.md",
|
|
17
18
|
"i18n/README.zh-CN.md",
|
|
18
19
|
"LICENSE"
|
|
19
20
|
],
|