@zq-silk/yui 0.15.7 → 0.15.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/ARCHITECTURE.md +192 -399
  2. package/README.md +127 -1149
  3. package/dist/agent/adapterCatalog.js +15 -2
  4. package/dist/agent/agent.js +23 -3
  5. package/dist/agent/argumentPolicy.js +7 -1
  6. package/dist/agent/connectionPlan.js +62 -0
  7. package/dist/agent/executionComponents.js +158 -0
  8. package/dist/agent/launchEnvironment.js +31 -3
  9. package/dist/agent/managedRuntimeEnvironment.js +3 -5
  10. package/dist/{turn/turn.js → agentRun/agentRun.js} +166 -109
  11. package/dist/{turn/turnIdentity.js → agentRun/runIdentity.js} +4 -4
  12. package/dist/brief/taskBrief.js +12 -0
  13. package/dist/cli/agentConfigurationPicker.js +13 -0
  14. package/dist/cli/commandCatalog.js +157 -70
  15. package/dist/cli/interactionCandidates.js +5 -5
  16. package/dist/cli/interactionPolicy.js +38 -8
  17. package/dist/cli/invocationRouter.js +1 -1
  18. package/dist/cli/managedDiagnostics.js +28 -0
  19. package/dist/cli/operatorWizard.js +1 -7
  20. package/dist/cli/roleOptionOrder.js +27 -0
  21. package/dist/cli/roleWizard.js +50 -14
  22. package/dist/cli/updateOrchestrator.js +1 -1
  23. package/dist/cli/updatePorts.js +3 -4
  24. package/dist/cli.js +178 -95
  25. package/dist/commands/agentCommands.js +72 -14
  26. package/dist/commands/capabilityCommands.js +9 -6
  27. package/dist/commands/configCommands.js +20 -20
  28. package/dist/commands/deliveryGuardPreflight.js +2 -2
  29. package/dist/commands/executionAuditCommands.js +24 -24
  30. package/dist/commands/globalRoleCommands.js +1 -1
  31. package/dist/commands/grantCommands.js +4 -4
  32. package/dist/commands/operatorCommands.js +1 -7
  33. package/dist/commands/projectCommands.js +4 -4
  34. package/dist/commands/resourcesCommands.js +2 -2
  35. package/dist/commands/roleConfiguration.js +25 -5
  36. package/dist/commands/roleRuntimeGuard.js +4 -5
  37. package/dist/commands/sessionCommands.js +3 -7
  38. package/dist/commands/taskActivationCommands.js +259 -0
  39. package/dist/commands/taskActor.js +28 -49
  40. package/dist/commands/taskCommands.js +1188 -710
  41. package/dist/commands/taskContextCommand.js +39 -583
  42. package/dist/commands/taskExecutionCommands.js +32 -32
  43. package/dist/commands/taskInputCommands.js +40 -104
  44. package/dist/commands/taskIntegrationCommands.js +3 -2
  45. package/dist/commands/taskIntegrationQueueCommands.js +1 -1
  46. package/dist/commands/taskNextActionCommand.js +8 -8
  47. package/dist/commands/taskOverviewCommand.js +33 -45
  48. package/dist/commands/taskRemoteDeliveryCommand.js +2 -2
  49. package/dist/commands/taskRoleRuntimeStatus.js +133 -102
  50. package/dist/commands/telemetryCommands.js +36 -38
  51. package/dist/config/configCatalog.js +4 -4
  52. package/dist/config/yuiConfig.js +8 -8
  53. package/dist/context/contextSnapshot.js +10 -10
  54. package/dist/context/dispatchContext.js +11 -11
  55. package/dist/context/roleSessionContext.js +6 -3
  56. package/dist/context/{turnContextPack.js → runContextPack.js} +146 -81
  57. package/dist/context/{turnInputContract.js → runInputContract.js} +73 -60
  58. package/dist/context/sessionBootstrapManifest.js +21 -2
  59. package/dist/context/sourceRunContext.js +30 -0
  60. package/dist/context/taskContext.js +458 -0
  61. package/dist/context/wakeNotification.js +27 -27
  62. package/dist/controller/agentRuntimeObserver.js +21 -24
  63. package/dist/controller/capabilityBridge.js +17 -6
  64. package/dist/controller/clientRuntime.js +65 -92
  65. package/dist/controller/controller.js +114 -188
  66. package/dist/controller/fileSchedulerStoreAdapter.js +787 -887
  67. package/dist/controller/jobControl.js +54 -85
  68. package/dist/controller/resourceInventory.js +8 -27
  69. package/dist/controller/resourceInventoryLinux.js +12 -13
  70. package/dist/controller/runtime.js +529 -479
  71. package/dist/controller/runtimeEventInbox.js +55 -25
  72. package/dist/controller/runtimeEventProcessor.js +22 -31
  73. package/dist/controller/{runtimeHookTurnFence.js → runtimeHookRunFence.js} +91 -115
  74. package/dist/controller/runtimeLaunchCoordinator.js +80 -426
  75. package/dist/controller/runtimeObservationHook.js +14 -18
  76. package/dist/controller/sessionNotify.js +16 -24
  77. package/dist/controller/sessionOwnerReconciliation.js +168 -50
  78. package/dist/controller/structuredProviderObservation.js +138 -99
  79. package/dist/coordination/workMailbox.js +3 -3
  80. package/dist/coordination/workMailboxQueue.js +36 -33
  81. package/dist/core/boundedRpc.js +8 -1
  82. package/dist/core/controllerClient.js +20 -1
  83. package/dist/core/controllerServer.js +4 -4
  84. package/dist/doctor/doctor.js +13 -2
  85. package/dist/domain/agentResultTransport.js +9 -9
  86. package/dist/execution/codexThreadNaming.js +2 -8
  87. package/dist/execution/executionHealth.js +51 -63
  88. package/dist/execution/reviewMainRun.js +137 -0
  89. package/dist/execution/workItemExecution.js +28 -29
  90. package/dist/execution/workItemExecutionProjection.js +99 -107
  91. package/dist/execution/workItemMainRun.js +141 -0
  92. package/dist/executor/agentAdapter.js +227 -20
  93. package/dist/executor/agentConfigurationCatalog.js +126 -4
  94. package/dist/executor/agentConfigurationProbe.js +162 -4
  95. package/dist/executor/agentExecutor.js +79 -78
  96. package/dist/executor/effectiveLaunch.js +105 -18
  97. package/dist/executor/executorRegistry.js +29 -44
  98. package/dist/executor/fileRoleLaunchPlanner.js +229 -154
  99. package/dist/executor/workspacePreflightClassification.js +16 -16
  100. package/dist/grant/capabilityGrant.js +6 -3
  101. package/dist/input/inputRequest.js +12 -10
  102. package/dist/integration/gitIntegrationService.js +4 -11
  103. package/dist/integration/integrationQueueService.js +4 -4
  104. package/dist/interaction/operatorPresentation.js +1 -1
  105. package/dist/kernel/builtinCapabilities.js +247 -12
  106. package/dist/kernel/capabilityRegistry.js +64 -18
  107. package/dist/kernel/instanceHost.js +12 -1
  108. package/dist/kernel/kernelPorts.js +2 -2
  109. package/dist/lifecycle/canonicalLifecycleEvent.js +44 -49
  110. package/dist/lifecycle/exactRunTerminalization.js +449 -0
  111. package/dist/message/message.js +62 -6
  112. package/dist/message/messageContinuation.js +204 -0
  113. package/dist/observability/executionAudit.js +70 -72
  114. package/dist/observability/faultClassification.js +2 -2
  115. package/dist/observability/orchestrationMetrics.js +8 -8
  116. package/dist/operator/operatorSessionHistory.js +1 -7
  117. package/dist/output/agentConfigurationPresentation.js +8 -3
  118. package/dist/output/agentRunConfigurationPresentation.js +128 -0
  119. package/dist/output/rolePresentation.js +54 -3
  120. package/dist/plugins/pluginChild.js +104 -0
  121. package/dist/plugins/pluginIntent.js +26 -0
  122. package/dist/plugins/pluginInterpreter.js +43 -0
  123. package/dist/plugins/pluginPackage.js +101 -0
  124. package/dist/plugins/pluginProcess.js +112 -0
  125. package/dist/plugins/pluginService.js +380 -0
  126. package/dist/profile/agentProfile.js +1 -1
  127. package/dist/repository/gitWorkspace.js +26 -4
  128. package/dist/repository/project.js +19 -4
  129. package/dist/repository/taskBaseFreshness.js +13 -13
  130. package/dist/repository/taskWorkspaceCoordinator.js +20 -27
  131. package/dist/repository/taskWorkspacePreparer.js +344 -83
  132. package/dist/resources/autoResourceGc.js +3 -3
  133. package/dist/resources/liveReferences.js +3 -3
  134. package/dist/resources/projectResource.js +123 -0
  135. package/dist/resources/projectResourceService.js +421 -0
  136. package/dist/resources/resourceDiscovery.js +6 -6
  137. package/dist/resources/resourceGc.js +1 -1
  138. package/dist/resources/resourceRegistrar.js +1 -1
  139. package/dist/resources/resourceTypes.js +1 -1
  140. package/dist/review/deltaRecheck.js +3 -3
  141. package/dist/review/reviewAcceptance.js +16 -16
  142. package/dist/review/reviewDecision.js +7 -7
  143. package/dist/review/reviewRound.js +21 -20
  144. package/dist/review/reviewerAvailability.js +2 -2
  145. package/dist/role/role.js +51 -7
  146. package/dist/role/taskRoleUpdate.js +30 -0
  147. package/dist/runtime/acpProtocol.js +425 -0
  148. package/dist/runtime/acpSession.js +731 -0
  149. package/dist/runtime/acpSessionConfiguration.js +260 -0
  150. package/dist/runtime/agentDriver.js +30 -11
  151. package/dist/runtime/agentEndpoint.js +278 -0
  152. package/dist/runtime/agentEndpointIdentity.js +86 -0
  153. package/dist/runtime/agentEndpointOwnership.js +239 -0
  154. package/dist/runtime/agentError.js +2 -10
  155. package/dist/runtime/agentHost.js +565 -314
  156. package/dist/runtime/agentRunConfiguration.js +258 -0
  157. package/dist/runtime/builtinAgentDrivers.js +134 -18
  158. package/dist/runtime/builtinAgentErrorMappers.js +55 -3
  159. package/dist/runtime/builtinTranscriptUsage.js +1 -1
  160. package/dist/runtime/claude-process-owner +0 -0
  161. package/dist/runtime/codexAppServerRuntime.js +38 -30
  162. package/dist/runtime/codexInteractiveHost.js +41 -6
  163. package/dist/runtime/continuationManager.js +2 -6
  164. package/dist/runtime/executionEnvironment.js +30 -0
  165. package/dist/runtime/firstProgressAdvisory.js +11 -11
  166. package/dist/runtime/index.js +4 -3
  167. package/dist/runtime/jsonLineChannel.js +109 -0
  168. package/dist/runtime/launchBroker.js +91 -16
  169. package/dist/runtime/launchDiagnostics.js +2 -2
  170. package/dist/runtime/lifecycleReservation.js +10 -18
  171. package/dist/runtime/managedCaller.js +61 -17
  172. package/dist/runtime/nativeSessionControl.js +102 -0
  173. package/dist/runtime/ports.js +6 -21
  174. package/dist/runtime/processExitObservation.js +8 -7
  175. package/dist/runtime/promptEnvelope.js +17 -6
  176. package/dist/runtime/providerContinuation.js +3 -9
  177. package/dist/runtime/providerContinuationReconciliationService.js +4 -13
  178. package/dist/runtime/providerControl.js +2 -7
  179. package/dist/runtime/providerRuntimeIdentity.js +110 -222
  180. package/dist/runtime/providerRuntimeReconciler.js +5 -9
  181. package/dist/runtime/runtimeBinding.js +0 -1
  182. package/dist/runtime/runtimeContinuationProjection.js +4 -7
  183. package/dist/runtime/runtimeDeadlines.js +9 -0
  184. package/dist/runtime/runtimeHealthPolicy.js +1 -1
  185. package/dist/runtime/runtimeObservation.js +29 -65
  186. package/dist/runtime/runtimeProjection.js +43 -51
  187. package/dist/runtime/runtimeSessionCandidate.js +1 -3
  188. package/dist/runtime/sessionLaunchRequest.js +3 -7
  189. package/dist/runtime/sessionOwnerIdentity.js +7 -54
  190. package/dist/runtime/sessionOwnerRegistry.js +22 -17
  191. package/dist/runtime/sessionReconciliation.js +4 -8
  192. package/dist/runtime/sessionTerminationGuard.js +70 -259
  193. package/dist/runtime/sessionTokenMetrics.js +5 -16
  194. package/dist/runtime/structuredProviderHost.js +237 -117
  195. package/dist/runtime/taskRuntimeIsolation.js +39 -122
  196. package/dist/runtime/tmuxAdapters.js +39 -86
  197. package/dist/scheduler/activeRoleRunDelivery.js +354 -0
  198. package/dist/scheduler/leaderWakeupProcessor.js +75 -266
  199. package/dist/scheduler/operatorInputNotificationProcessor.js +1 -1
  200. package/dist/scheduler/ports.js +80 -9
  201. package/dist/scheduler/{roleTurnLiveness.js → roleRunLiveness.js} +26 -30
  202. package/dist/scheduler/{roleTurnStall.js → roleRunStall.js} +128 -139
  203. package/dist/scheduler/taskExecutionProjection.js +120 -124
  204. package/dist/scheduler/taskObservabilityProjection.js +29 -29
  205. package/dist/scheduler/taskWake.js +11 -4
  206. package/dist/scheduler/wakeReason.js +9 -1
  207. package/dist/setup/setupCommand.js +1 -0
  208. package/dist/storage/migrations/agentRunContract.js +159 -0
  209. package/dist/storage/migrations/removeRuntimeGeneration.js +207 -0
  210. package/dist/storage/sqliteSchema.js +431 -5
  211. package/dist/storage/sqliteStore.js +375 -220
  212. package/dist/storage/storageVersions.js +1 -1
  213. package/dist/storage/storeRpc.js +10 -5
  214. package/dist/storage/taskStore.js +13 -11
  215. package/dist/storage/upgrade/upgradeOrchestrator.js +5 -7
  216. package/dist/surface/surfaceContributions.js +102 -0
  217. package/dist/task/completionReadiness.js +32 -6
  218. package/dist/task/deliveryGuard.js +16 -16
  219. package/dist/task/draftPlan.js +72 -12
  220. package/dist/task/nextAction.js +144 -128
  221. package/dist/task/remoteDelivery.js +6 -6
  222. package/dist/task/task.js +184 -18
  223. package/dist/task/taskActivation.js +301 -0
  224. package/dist/task/taskActivationService.js +392 -0
  225. package/dist/task/taskRecordReference.js +5 -4
  226. package/dist/task/taskRecordRetirement.js +1 -1
  227. package/dist/telemetry/sqliteTelemetryStore.js +55 -68
  228. package/dist/telemetry/telemetryConfig.js +14 -14
  229. package/dist/telemetry/telemetryWiring.js +2 -2
  230. package/dist/web/assets/assetManifest.js +2 -0
  231. package/dist/web/assets/client/app.js +120 -20
  232. package/dist/web/assets/client/components.js +87 -54
  233. package/dist/web/assets/client/i18n.js +83 -41
  234. package/dist/web/assets/client/markdown.js +1 -1
  235. package/dist/web/assets/client/taskSurface.js +353 -0
  236. package/dist/web/assets/client/view.js +49 -44
  237. package/dist/web/assets/shell.js +1 -1
  238. package/dist/web/assets/styles/cards.js +22 -4
  239. package/dist/web/controllerWeb.js +60 -0
  240. package/dist/web/webMutation.js +28 -0
  241. package/dist/web/webServer.js +118 -8
  242. package/dist/web/webSnapshot.js +81 -74
  243. package/dist/web/webTaskSurface.js +64 -0
  244. package/dist/workItem/dependencyGate.js +1 -1
  245. package/dist/workItem/workItem.js +80 -48
  246. package/dist/workspace/workItemChangeSetManager.js +16 -9
  247. package/docs/agent-result-consumption.md +94 -0
  248. package/docs/agent-runtime-drivers.md +91 -0
  249. package/docs/architecture/README.md +38 -0
  250. package/docs/architecture/capabilities-and-resources.md +79 -0
  251. package/docs/managed-turn-and-session-runtime.md +222 -0
  252. package/docs/observability/README.md +81 -0
  253. package/docs/plugin-sdk.md +290 -0
  254. package/docs/provider-runtime.md +163 -0
  255. package/docs/release-workflow.md +303 -0
  256. package/docs/roles-and-configuration.md +113 -0
  257. package/docs/sqlite-control-plane-design.md +76 -0
  258. package/docs/task-dag-semantics.md +57 -0
  259. package/docs/task-delivery.md +103 -0
  260. package/docs/task-local-identity.md +6 -6
  261. package/docs/testing/verification-levels.md +86 -0
  262. package/i18n/README.zh-CN.md +98 -739
  263. package/package.json +2 -2
  264. package/skills/yui-leader/SKILL.md +130 -103
  265. package/skills/yui-leader/references/integration.md +39 -0
  266. package/skills/yui-leader/references/replicated-execution.md +42 -0
  267. package/skills/yui-leader/references/task-plugins.md +33 -0
  268. package/skills/yui-operator/SKILL.md +30 -59
  269. package/skills/yui-reviewer/SKILL.md +35 -36
  270. package/skills/yui-runtime/SKILL.md +88 -24
  271. package/skills/yui-runtime/references/publication.md +22 -0
  272. package/skills/yui-runtime/references/recovery.md +64 -0
  273. package/skills/yui-worker/SKILL.md +37 -39
  274. package/dist/cli/roleOptionCatalog.js +0 -68
  275. package/dist/context/sourceTurnContext.js +0 -30
  276. package/dist/execution/reviewMainTurn.js +0 -161
  277. package/dist/execution/workItemMainTurn.js +0 -164
  278. package/dist/lifecycle/exactTurnTerminalization.js +0 -407
  279. package/dist/runtime/preallocatedNativeSession.js +0 -13
  280. package/dist/runtime/runtimeStopReceipt.js +0 -42
  281. package/dist/scheduler/activeRoleTurnDelivery.js +0 -315
@@ -2,804 +2,163 @@
2
2
 
3
3
  # Yui
4
4
 
5
- Yui 是面向智能 Codex/Claude Agent 的本地控制平面。它持久保存用户意图、
6
- Project Knowledge、Task、交接和结果,并提供上下文、消息、委派、工作区、
7
- Session、审查和集成等小而原子的能力。Agent 组合这些能力,自主决定规划、
8
- 顺序、委派、重试和恢复。
5
+ Agent 持续推进你的任务,而不只是回答一轮对话。
9
6
 
10
- Yui 不把 Agent 的判断固化成确定性的工作流引擎。核心只负责持久身份、用户
11
- 授权、工作区隔离和原子状态变更;Provider Session 与运行时观测用于执行和
12
- 连续性,但不是 Task 事实的另一套来源。用户只需和 Operator 对话,Operator
13
- 负责路由,Leader 负责目标拆解、执行选择、验收和集成。
7
+ Yui 帮你把日常请求组织成任务,再协调 Agent 解决它们。你只需在对话中描述
8
+ 目标:Agent 识别相关 Project,区分新任务与已有任务的补充,把相关需求放在
9
+ 一起。每个 Task 由一个 Leader 负责规划,按需调用其他已配置的 Agent,
10
+ 并把结果和需要你决定的事项带回来。
14
11
 
15
- 当前实现保留实用的 Role/Agent/session 与 CLI 框架,不恢复后期膨胀的数据维护、租约、定时调度和恢复账本体系。
12
+ 你不必为每个步骤手动建单,在多个终端之间搬运上下文,或记住哪个 Agent
13
+ 正在处理哪条需求。Yui 把意图、进展和结果保存在单次对话之外,让继续工作
14
+ 从任务本身开始,而不是依赖你的记忆。
16
15
 
17
- [目标架构手册](../docs/architecture/README.md) 保存了供后续重构使用的
18
- 2026-09-06 版设计基线,不代表当前已实现行为。
16
+ [快速开始](#快速开始) · [通过对话管理工作](#通过对话管理工作) · [核心设计](#核心设计)
19
17
 
20
- ## 核心模型
21
-
22
- - `WorkItem`:唯一的有界工作单元,保存目标、验收条件、依赖、状态和精简结果。
23
- - `WorkerProfile`:可复用的 Worker 模板,分别保存可移植行为与继承或显式指定的 Agent runtime。
24
- - `TaskRole`:Task 内可修改的 Worker 实例,可绑定多个 Agent,并分别保存运行配置。
25
- - `Turn`:Task Role 的一次受管派发与结果交付。
26
- - `ChangeSet`:隔离 WorkItem 当前 HEAD 的不可变 Git 结果。
27
- - Integration:候选集成、检查、冲突报告和 Leader 决策。
28
-
29
- 每个 WorkItem 只选择三条路径之一:Leader 直接执行、Leader 在当前
30
- Agent 对话内创建 native subagent,或交给 Task Role Turn。Yui
31
- 不提供 subagent 启动命令,也不创建 child Session 记录。
18
+ ## 快速开始
32
19
 
33
- 内置 Profile:
20
+ 需要 Linux x64 / glibc、Git、tmux,以及 Node.js `^20.17.0`、`^22.9.0` 或
21
+ `^24.0.0`。最简单的方式是先安装 Codex CLI 或 Claude Code CLI,并确保它
22
+ 已经可以使用你自己的账号正常工作。Yui 负责协调 Agent,不提供模型访问额度。
34
23
 
35
- ```text
36
- worker explorer implementer reviewer
37
- ```
24
+ Yui 传递 Claude 的认证环境并保留原生配置目录,由 Claude 自身按本地配置
25
+ 选择 API key 或登录方式。更换 Session 不会重置登录或初始化记录。首次运行时,
26
+ Claude 自身的 key 确认、目录信任等交互仍可能需要你完成。
38
27
 
39
- Profile runtime 要么动态继承当前全局 Worker active binding,要么显式指定
40
- 一个 Agent 及可选 model/effort;adapter 始终由 Agent 配置派生。`profile list`
41
- 和 `profile show` 会展示当前有效 Agent,以及继承时的 Worker launch revision,
42
- 但不会因此改写 Profile 或增加其 revision。Profile 本身不持有 Session 或
43
- workspace。显式 Profile 指向的 Agent 只要在全局 Worker 中存在 binding(无论
44
- active 还是 dormant),其余 binding 配置就取自该 binding;未绑定的 Agent
45
- 使用 Provider 默认值。被显式 Profile 这样引用的 Worker binding,必须先更新
46
- Profile、改为继承或删除 Profile 后才能解绑。model/effort 仍由 Profile 自身
47
- 决定,省略即表示 Provider 默认值,而不是 Worker 中的值。把 Yui Agent Profile
48
- 应用到新 Task Role 时,会冻结完整解析后的
49
- binding,以及 instructions、Skills 和访问意图;之后 Profile 或全局 Worker
50
- 变更不会反向改写已有 Task Role。它与 Codex 通过 `--profile` 选择的原生 config
51
- profile 不是一回事。Operator、Leader 与 Task Role 是运行时 Role。
52
-
53
- ## 环境要求
54
-
55
- - Node.js 20.17+、22.9+ 或 24.x
56
- - Git
57
- - tmux
58
- - Codex CLI 或 Claude Code CLI
59
-
60
- ## 初始化
28
+ ### 1. 安装
61
29
 
62
30
  ```sh
63
31
  npm install -g @zq-silk/yui
64
- yui setup
65
- yui doctor
66
32
  ```
67
33
 
68
- `setup` 被刻意缩减为最小流程:检查 tmux,复用或创建一个可用 Agent,在
69
- Yui home 外创建默认 workspace,并配置 Operator 与 Leader,使用户可以启动
70
- Yui 并执行 Task。它不会创建 Worker、Reviewer、Profile 或 review policy,
71
- 也不会询问 model/effort、permission 或 shell completion。Operator 与 Leader
72
- 的必需 binding 使用 Yui 的 adapter 默认 permission strategy(`bypass`);
73
- 后续调整统一通过 `config role` 完成。再次运行会原样保留已经可用的 Operator
74
- 和 Leader;setup 成功返回前会启动当前 Home 的后台 Controller。
75
-
76
- 所有持久配置都位于 `yui config` 下。`config show` 展示完整有效状态,
77
- `config --help` 介绍各配置域并给出示例。Operator 可通过结构化的
78
- `config describe` 读取配置目录,向用户说明当前值、具体影响、可选值和生效
79
- 方式,并只执行用户确认的修改。
34
+ ### 2. 自己初始化,或交给 Agent
80
35
 
81
- 持久设置按职责分组:`config system` 管理 Home 默认值和展示方式,
82
- `config runtime` 管理 Controller 健康阈值、并发、启动、投递和 Provider
83
- 重试,`config workflow` 管理 Leader、context 与 review policy,
84
- `config resources` 管理隔离区和 GC,`config tools` 管理 tmux 与诊断
85
- telemetry。Agent、全局 Role、Profile 和 shell completion 则继续位于同级的
86
- `config agent|role|profile|completion` 域。每个持久设置域统一使用
87
- `show`、`set`、`clear`。
88
-
89
- 运行时能力目录会在每次命令中刷新,并缓存在 Yui home。实时探测超时或失败时,Yui 会展示同一 Agent 启动上下文最近一次成功的缓存并明确提示数据可能过期;没有匹配缓存时,则提供 CLI 默认值和自定义入口。`yui config agent capabilities <id>` 可一次性读取同一份目录,包括模型、逐模型思考强度,以及权限、搜索可用性、profile、settings source、service tier 等其他运行时选项。
90
-
91
- `completion` 无论是否指定 shell,都会进入确认流程:
36
+ 在终端中运行交互式初始化:
92
37
 
93
38
  ```sh
94
- yui config completion
95
- yui config completion zsh
96
- ```
97
-
98
- 流程会确认生成脚本、安装路径和 shell 启动文件修改。补全脚本直接由命令目录生成,支持二级及更深层子命令。
99
-
100
- 默认 home 是 `~/.yui`。隔离环境可设置:
101
-
102
- ```sh
103
- export YUI_HOME=/absolute/path/to/yui-home
104
39
  yui setup
105
40
  ```
106
41
 
107
- home 中包含权威 SQLite 数据库 `yui.db`、Project Catalog、项目知识和
108
- Controller 发现文件。稳定 Project checkout 与受管理 worktree 位于 home
109
- 外部的 workspace。旧 `schema.json` 与 `state.json` 只作为历史证据存在,
110
- 不再是版本权威。运行时只接受当前存储契约;支持区间内的早期存储版本只允许
111
- 通过显式升级入口。
112
-
113
- 所有 Task-owned 记录族都在各自 Task 内分配单调递增的本地 ID。因此,不同
114
- Task 可以同时拥有 `work-item-1`、`turn-1` 或 `input-1`。受管 Task
115
- session 可由 `YUI_TASK_ID` 提供作用域并使用本地短 ID;Task session 外必须
116
- 使用 `<task-id>/<local-id>`。Yui 不会拿裸 ID 扫描所有 Task。已经显式接收
117
- Task 的命令(例如 `task work create`、`task integration start`)仍使用该
118
- Task 内的本地子记录 ID。Candidate 只在所属 WorkItem 内递增,并同时保存
119
- Task 与 WorkItem provenance。
120
-
121
- Yui Home 只有一个存储版本,权威值是 SQLite 中连续且校验和有效的迁移
122
- ledger 头。CLI 同时公布当前存储版本和最小支持迁移版本。普通运行时代码只读取
123
- 最新结构,不提供双读;`yui upgrade --dry-run` 只显示迁移计划,
124
- `yui upgrade` 会停住正在运行的 Controller、创建一致性备份、在一个事务中执行
125
- 全部缺失迁移并校验最新结构。处于支持区间内的任意历史 Home 都可以直接跨多个
126
- 版本升级,无需逐个安装中间版本。当前引用契约见
127
- [Task 本地 ID](../docs/task-local-identity.md)。
128
-
129
- ## 快速开始
130
-
131
- ```sh
132
- yui project add app /absolute/workspace/app \
133
- --remote git@example.com:team/app.git --stable main --development develop
134
- yui project update app --alias app-cli --development develop
135
- yui project list
136
-
137
- yui task create "修复 CSV 转义" --project app --type bugfix
138
- yui task create "交付 CSV 导出" --project app --type feature
139
- yui task update <task-id> --priority high --tags release,csv --due-at 2026-08-01T00:00:00Z
140
- yui task update <task-id> --clear-priority --clear-tags --clear-due-at
141
- yui task message update <task-id>/<message-id> --body-file updated-message.md --wake-policy none
142
- yui task work edit <task-id>/<work-item-id> --objective "修订后的目标" \
143
- --accept "新的可观察验收标准"
144
- yui task work retire <task-id>/<work-item-id> --summary "从当前 Draft 中移除"
145
- yui task show <task-id>
146
- yui task context <task-id>
147
- yui task activate <task-id>
148
- ```
149
-
150
- Draft 只保存规划记录和 Project 绑定,不采用可写 managed Workspace。Message
151
- 与 WorkItem 编辑只替换显式指定的可变字段,记录 ID 和审计历史保持不变;重复
152
- 选项表示整体替换,对应 `--clear-*` 显式表示空集合。retired 记录继续保留在历史
153
- 视图中,但退出当前 Draft。retired WorkItem 不满足依赖,也不会通过可选
154
- replacement 自动重定向下游;激活前必须修正剩余 Draft。所有 Draft-only 编辑和
155
- retire 都不创建、停止或清理运行时资源;`task activate` 会在采用任何 Workspace
156
- 之前校验当前依赖图、Role 和 Project scope。
157
-
158
- Task type 描述需求意图,不选择执行协议。软件 Project 通常使用 `bugfix` 或
159
- `feature`:bugfix 由 Leader 在 Task main 独立、快速完成;如果范围扩大到需要
160
- 独立 owner,应先改为 feature 再创建 WorkItem。feature 由 Leader 判断是自己直接
161
- 交付,还是拆成由不同 Worker 独立负责、可并行推进的较大
162
- WorkItem。实现步骤、测试、review finding 和局部修复都不是 WorkItem。只有当一项
163
- 需求本身具有独立 owner 和可验收结果时才创建 WorkItem。只有当前 governing
164
- Candidate 的 ChangeSet 是交付义务:它们必须通过 committed Integration 汇总回
165
- Task main,或由 Leader 在队列中显式 supersede;旧 Candidate 和 ChangeSet 只保留为审计证据。
166
-
167
- 面向用户的时间默认按北京时间(`Asia/Shanghai`)显示;持久化记录和
168
- `--json` 数据仍使用 UTC/RFC 3339。可通过以下命令查看或修改 IANA 时区:
169
-
170
- ```sh
171
- yui config show
172
- yui config system set time-zone Europe/London
173
- ```
174
-
175
- WorkItem 审查只有一条可选的全局规则,并直接复用已有 Global Role 的
176
- Agent、model、权限、prompt 和 Skills:
177
-
178
- ```sh
179
- yui config workflow set review --role reviewer --trigger always
180
- yui config show
181
- yui config workflow clear review
182
- ```
183
-
184
- 对带 Project 的软件交付,可使用 `--trigger final` 提供默认 Reviewer Role;
185
- 是否需要独立的 Task-final Review 仍由 Leader 根据风险判断:
186
-
187
- ```sh
188
- yui config workflow set review --role reviewer --trigger final
189
- ```
190
-
191
- 每个进入 Leader 验收阶段的结果,都会成为原 WorkItem 上一个明确的候选。
192
- 当前全局规则对所有新旧 Task 的下一个候选生效,并在候选提交时形成快照;
193
- 后续 `set`/`clear` 不会改变已经在途的判断。
194
- `always` 会为每个候选启动 ReviewRound,包括已结束的 Role Turn 结果和 Leader 直接管理的
195
- 结果;`leader` 则让候选保持等待验收,由 Leader 直接 accept 或执行
196
- `yui task work review <task-id>/<work-item-id>`。因此只要配置了审查规则,Leader
197
- 管理的候选也不会直接标记为完成。ReviewRound 引用不可变候选,审查
198
- Turn 不创建新 WorkItem,也不会递归触发审查。审查以自然语言结果
199
- 唤醒 Leader;Leader 决定验收、reject 后在原 Role 与原 Session 中修复、
200
- 再次审查,或通过 InputRequest 询问用户。审查失败会保留为可见证据并
201
- 唤醒 Leader,但不会取代 Leader 的最终判断。
202
- `final` 不为每个 WorkItem 创建完整 ReviewRound,也不决定 Task 拓扑。Leader
203
- 显式请求 Task 级 Review;不可变 Task contract 也可以强制要求。Task-final Round
204
- 直接冻结 Task main,不需要虚构 WorkItem/Candidate,因此没有 WorkItem 的小任务也能
205
- review。冻结头变化时创建新的语义 Round;同一 Reviewer 的兼容原生 Session 可以在
206
- 稳定 workspace 中继续,而每个 Turn 仍严格绑定自己的 Round 和冻结头。旧报告保留为
207
- 证据。Reviewer 按 Project Policy/Knowledge 检查整个 Task,并只报告有直接证据的
208
- 可达、重要、可行动问题或有限验证缺口。
209
- 所有候选、ReviewRound 和 Leader 决策都集中在原 WorkItem 下;reject
210
- 后的下一轮会复用原执行 Role、Session 与 workspace,并追加新候选。
211
-
212
- 显式 WorkItem Candidate Review 与 Task-final Review 默认都直接创建一个 main
213
- Reviewer Turn;只有 Leader 明确提供至少两个不同的 `--lane-role` 时才使用复制执行。
214
- 复制执行最多支持八个 Lane。所有 Producer Lane 在隔离 workspace 中检查同一冻结 Assignment,全部 settle 且至少
215
- 两个成功后,才创建一个权威 main synthesis Turn。自动 policy 触发的 Candidate
216
- Review 始终保持直接执行。主 Reviewer 通过冻结 Context 按 Lane 顺序读取每个成功
217
- Producer Turn 的原始结果;Core 不复制其 prompt/workspace/runtime,也不解析结果语义。
218
-
219
- ```sh
220
- yui task work review <task-id>/<work-item-id>
221
- yui task work review <task-id>/<work-item-id> \
222
- --lane-role security-reviewer --lane-role correctness-reviewer
223
-
224
- yui task review request <task-id> --role reviewer
225
- yui task review request <task-id> --role reviewer \
226
- --lane-role security-reviewer --lane-role correctness-reviewer
227
- ```
228
-
229
- 查看已有 Task 的详细状态时,优先使用 `task context`。它一次聚合 Task、Brief、Active Decision、最近的 Milestone、Role、当前及最近的 WorkItem 与关联 Turn、最近的 Message、Open/Resolved InputRequest 和 Event。终端输出会精简历史和长文本;`yui --json task context <task-id>` 会在顶层 `data` 中返回完整记录。
230
-
231
- Task identity 由一个有界交付目标决定,而不是由涉及几个仓库决定。带仓库的
232
- Task 可以绑定多个 Project,并为每个 Project 记录独立 base ref:
233
-
234
- ```text
235
- <workspace>/tasks/<task-id>/main/
236
- ├── backend/
237
- ├── frontend/
238
- └── shared-sdk/
239
- ```
240
-
241
- `<workspace>/tasks/<task-id>/main` 是逻辑上的多 Project 容器,不是 Git 仓库。
242
- 每个 Project 子目录才是受支持的 Git cwd(例如
243
- `<workspace>/tasks/<task-id>/main/yui`),并指向该 Project 的受管 worktree:
244
- `<workspace>/worktree/<project>/<task-id>/main`。Git 命令必须在对应的
245
- Project 子目录中运行。只绑定一个 Project 时,原生 Agent 直接从该 Project
246
- 的受管 worktree 启动,因此会按 Agent 自身机制发现项目配置和 Skills。
247
- 绑定多个 Project 时,Agent
248
- 从逻辑根目录启动,Yui 通过 Provider 原生的 additional-directory 机制声明
249
- 每个 Project worktree。创建时应一次绑定已知 Project;如果同一目标在执行中
250
- 确认还需要另一个仓库,只能由 active Task 的 Leader 追加:
251
-
252
- ```sh
253
- yui task create "升级认证协议" \
254
- --project backend --project frontend \
255
- --base backend=develop --base frontend=main
256
- yui task project add <task-id> shared-sdk --base main
257
- ```
258
-
259
- 实现型 WorkItem 必须声明允许修改的 Project。它保留与 Task main 一致的
260
- 相对目录布局,只为写入范围创建隔离 worktree,其他 Task Project 作为上下文
261
- 从 Task main 暴露。Yui 会在受管派发和 `yui-worker` Skill 中明确列出可写与
262
- 仅上下文 Project,由 Agent 严格遵守该边界。原生 Agent 权限作用于整个会话,
263
- 而 Profile `access` 只是行为意图,不是 provider sandbox 或写入授权。所有受管 Role binding(包括
264
- `explorer`)默认使用 `permission.strategy=bypass`,避免 provider 权限提示阻塞
265
- 正常工作;Profile 与 Skill 负责约束行为,只有精确 WorkItem/ReviewRound 范围
266
- 和匹配的 managed workspace 才能授权修改 Project。Role 也可以显式选择
267
- `default`,或用 `configured` 保留显式设置的任意 provider 原生权限选项子集。
268
-
269
- 写入范围只能扩大,不能缩小。Worker 报告还需要另一个仓库后,
270
- Leader 使用完整的“旧范围 + 新范围”更新并重新派发:
42
+ 也可以直接告诉你正在使用的编程 Agent:
271
43
 
272
- ```sh
273
- yui task work create <task-id> "升级协议与客户端" \
274
- --project backend --project frontend --role implementer
275
- yui task work scope <task-id>/<work-item-id> \
276
- --project backend --project frontend --project shared-sdk
277
- yui task work isolate <task-id>/<work-item-id>
278
- yui task work reject <task-id>/<work-item-id> \
279
- --summary "已扩大写入范围,请在刷新后的 workspace 继续。"
280
- yui task work dispatch <task-id>/<work-item-id>
281
- yui task work capture <task-id>/<work-item-id>
282
- yui task integration start <task-id> --project backend \
283
- --change-set <backend-change-set-id> --check "<validation command>"
284
- yui task integration cleanup <task-id>/<integration-id>
285
- yui task work cleanup <task-id>/<work-item-id> --integrated
286
- ```
44
+ > 我已经安装了 Yui。请在交互式终端中帮我执行 `yui setup`,选择可用的
45
+ > Agent,并用 `yui doctor` 检查结果。遇到账号或需要我决定的配置时问我。
287
46
 
288
- `capture` 为每个实际修改的 Project 记录一个不可变 ChangeSet;同一 HEAD
289
- 重复 capture 会复用记录,修复后的新 HEAD 会产生新候选。Integration 保持
290
- Project Git 事务,所以 Leader 分别集成每个 Project。只有所有已修改
291
- Project 的最新候选都完成集成,WorkItem 才能验收;仍有未集成结果时不能执行
292
- `--integrated` 清理。`--abandon` 只用于明确放弃,dirty worktree 会原地保留。
293
- 原生 Agent Session 可能绑定启动目录,因此 Role 在 Task main 与隔离
294
- WorkItem workspace 之间移动时,Yui 会退役已停止的旧 Session;下一次派发
295
- 在新目录创建 Session,持久 Yui 记录继续提供上下文。
47
+ Setup 会配置与你对话的 Operator 和默认任务 Leader,并启动本地 Controller。
48
+ 先用这两个角色即可开始,Worker、Reviewer 可以之后再配置。如果 Agent
49
+ 没有操作交互式终端的能力,就自己运行 setup;它只负责初始配置。
296
50
 
297
- 通过 Operator 提交消息:
51
+ ### 3. 开始对话
298
52
 
299
53
  ```sh
300
- yui operator submit "比较 CSV 与 JSON 的兼容性" --task <task-id>
301
- yui operator submit "研究更小的缓存设计"
302
- yui operator status
303
- yui operator list
304
- yui operator resume
305
- yui operator resume --last
306
- yui operator new
307
54
  yui operator enter
308
55
  ```
309
56
 
310
- Task Role 当前的原生 Session 无法继续时,只需按意图重置:
311
-
312
- ```sh
313
- yui task role reset <task-id> <role> --reason "<该 generation 无法继续的原因>"
314
- ```
315
-
316
- Yui 从自己的记录中推导当前 Turn、Agent、launch、receipt 和 native Session。
317
- 它只失败化该精确 active Turn(以及对应 execution WorkItem),把当前 Session
318
- 保存为 broken history,并要求 Controller 只停止该 Role 拥有的 runtime。该命令
319
- 不会创建 Candidate、验收工作或完成 Task。cleanup pending 期间,`task role status`
320
- 和 `task context` 会阻止 fresh launch;已有 message、review 和交付历史都会保留。
321
-
322
- 不带 `--task` 时会创建新 Draft。Draft 可以继续规划,但激活前不会执行 Agent 工作。
323
- Operator 会结合 Project Catalog 和现有 Task context 路由请求。同一有界
324
- 目标的追加需求、修复、审查和咨询继续进入原 Task,即使它涉及多个 Project。
325
- 目标、所有权边界或生命周期独立时才创建新 Task。需求、Bug 和咨询共用同一
326
- Task/WorkItem 模型,不增加额外任务类型。
327
- `operator status` 将 GlobalRole 选中的唯一 active writer 与保留的历史对话
328
- 分开展示。`operator list` 按固定的最近更新时间倒序展示历史对话,并显示 Agent
329
- 及可读的标题或摘要;底层 provider session ID 始终保持内部实现细节。
330
- 若 adapter 尚未提供这些元数据,Yui 会显示 provider 和稳定的 Yui
331
- 短引用,确保无标题会话仍可区分。`operator resume` 使用轻量历史编号列表,
332
- `--last` 可直接恢复最近一条;新建会话不会伪装成 resume 选项,必须显式使用
333
- `operator new`,并把原对话保留在历史中。
334
-
335
- 从 Profile 当前解析出的 runtime 创建 Task Role 并派发 WorkItem:
336
-
337
- ```sh
338
- yui config role show worker
339
- yui config profile show implementer
340
- yui task role add <task-id> implementer --profile implementer
341
- yui task role show <task-id> implementer
342
-
343
- yui task work create <task-id> "实现导出器" \
344
- --project app --role implementer
345
- yui task work isolate <task-id>/<work-item-id>
346
- yui task work dispatch <task-id>/<work-item-id> --input "完成实现并运行聚焦测试"
347
- ```
348
-
349
- 不传 `--lane-role` 时,assignee 直接在 WorkItem 主工作区执行。若要让多个生产者
350
- 基于完全相同的冻结 Assignment 独立执行,必须传入至少两个不同的 Task Role;
351
- 单个 Role、重复 Role 或 assignee 本身都会被拒绝:
352
-
353
- ```sh
354
- yui task work dispatch <task-id>/<work-item-id> \
355
- --input "完成实现并运行聚焦测试" \
356
- --lane-role producer-a --lane-role producer-b
357
- ```
358
-
359
- Lane 是可恢复的逻辑槽。成功 Lane 指向不可变的 Producer Turn 结果;Turn 失败时
360
- Lane 仍保持 open,并显示为 `needs-attention`。Leader 对精确失败 Turn 执行重试或
361
- 显式结算:
362
-
363
- ```sh
364
- yui task turn retry <task-id>/<failed-turn-id>
365
- yui task turn settle <task-id>/<failed-turn-id>
366
- ```
367
-
368
- Yui 会等待所有 Lane 结算。至少两个 Producer 成功结果才会为 WorkItem assignee
369
- 幂等创建一个主 Turn;成功数不足时本次 WorkItem 尝试失败,不会降级使用单个结果。
370
- 主 Turn 重试继续引用同一来源 Group,也不会重跑成功 Lane。只有成功的主 Turn 能
371
- 形成 Review 与 Integration 使用的 Candidate。`task work show`、`task work list`、
372
- Task context 和 Web 控制室从相同持久事实推导执行形态、恢复目标、综合资格、主 Turn、
373
- Candidate 溯源、下一步及责任人。缺失事实保持 `unknown` 或 `unobserved`;token、
374
- 耗时和工具调用只读展示,不参与调度、恢复或生命周期决策。
375
-
376
- 每个 Agent binding 只有一套 adapter-specific 权限枚举配置:`default` 遵循
377
- provider 默认行为;`bypass` 编译 provider 支持的 bypass flag;`configured`
378
- 保留其中显式设置的原生选项。Codex 选项是 `sandbox` 和 `approval`;Claude 选项是
379
- `mode`、`allowedTools` 与 `disallowedTools`。provider 权限与 Profile 行为意图、
380
- Project 写入授权彼此独立:普通写入只由精确 WorkItem 范围和匹配的 managed
381
- workspace 授权。任意非 Leader
382
- Task Role 在创建时同时不传 `--profile` 和 `--agent`,会复制全局 Worker Role
383
- 的完整 Agent bindings,Leader 无需重新拼接 model、effort 和权限。传
384
- `--profile` 时会冻结该 Profile 当前解析出的完整 binding。创建时的 model、
385
- effort、权限和其他 Agent 设置必须与 `--agent` 同时提供,以便在任何持久化前
386
- 完成能力校验并原子写入一套完整 binding。创建时同时传入 `--profile` 与
387
- `--agent`,Agent 必须与 Profile 当前解析出的 Agent 一致;Profile runtime
388
- 仍作为基础 binding,显式 Agent 设置覆盖对应字段。更新 Task Role 时,不传
389
- `--agent` 会更新 active binding;传入 `--agent` 则只更新指定 binding 而不
390
- 激活它,只有 `task role bind` 会切换 active Agent。显式 Profile 必须解析到
391
- 该更新目标,其 runtime 作为基础 binding,显式 Agent 设置覆盖对应字段。单独
392
- 使用继承 Worker 的 Profile 时,可以只更新可移植 Role 行为,而不重新定向绑定
393
- 到其他 Agent 的 Role;若同时传入 `--agent` 或 Agent 设置,其当前解析出的
394
- Worker Agent 必须与更新目标一致。创建回执与 `task context` 分别记录 Profile
395
- intent、精确可写 Project 与实际 permission strategy。应用 Profile 会替换
396
- AgentProfile 所拥有的可移植字段(`defaultAccess`、description、instructions、
397
- skills 及由 access 派生的 constraints);同一命令中的显式 Role 选项随后覆盖。
398
-
399
- ReviewRound 从冻结 Candidate SHA 创建独立的可写 worktree。只有 exact
400
- ReviewRound owner、reviewRoundId、冻结 base 与 workspace 全部匹配时,才获得
401
- 该 workspace 的写入授权;Skill 仍禁止 push、Integration、Task state、其他
402
- workspace 与真实 YUI_HOME 变更。Reviewer 以最终 Provider 回复交付当前 Turn,
403
- Yui 原样保存其完整的自由格式 Markdown、JSON 或普通文本结果,不解析标题、字段、
404
- checks、severity、finding、verdict 或 evidence commit。Skill 和派发消息可以建议
405
- 输出结构,但该结构不是 Core 协议;格式缺失或 JSON 无效由 Leader 阅读原文后判断。
406
- Core 自己观测的 workspace 与 Git 证据独立保存。
407
-
408
- Reviewer 可以修改文件并在不提交的情况下结束 Turn;脏字节不会被推断为 evidence。
409
- 该 Round 仍会精确终结且不产生 Candidate/ChangeSet,workspace 会为 Leader 判断而
410
- 保留,cleanup 会在其重新变干净前拒绝删除。
411
-
412
- Provider 原生 Turn 终态会结束 Turn,Yui 保存最终回复,将 WorkItem 提交给 Leader 审查,并追加结果消息和
413
- 唤醒 Leader;它不会验收或完成 WorkItem。有效结果在 512 KiB 限制内逐字保留;
414
- 缺失、空白、含 NUL 或超限结果不会伪造成功文本,而是以 `missing-result` 和
415
- Core 诊断失败终结该 Turn。Leader 不会自唤醒,pending wake 会保留到 Leader 空闲。
416
-
417
- 如果无法最终判断结果,交接必须明确标为 `uncertain`、`incomplete`、
418
- `blocked` 或 `requiring Leader judgment`,并提交最完整且真实的身份、已执行
419
- 动作、仓库状态、检查与错误、最后生命周期边界、未完成工作、待决事项、风险、
420
- 置信度及有界下一选项。Turn 结果只是不可变的执行证据;
421
- 它不表示验收、WorkItem 完成、ChangeSet capture、Integration 或 Task 完成。
422
-
423
- 对于有界工作,Leader 可以直接执行 roleless WorkItem,也可以在当前
424
- Agent 对话中创建 native subagent:
425
-
426
- ```sh
427
- yui task work create <task-id> "审查实现" \
428
- --objective "返回有源码依据的问题" \
429
- --accept "每个问题都标明受影响路径"
430
- yui task work update <task-id>/<work-item-id> running
431
- yui config profile show reviewer
432
- ```
433
-
434
- subagent 的创建与结果返回完全由 Leader 当前 Agent 的 native child 能力
435
- 完成,没有 `yui ... subagent` 命令。Leader 必须选择并读取一个显式
436
- Worker Profile;没有合适的专用 Profile 时使用 `worker`。child brief
437
- 需要包含 Profile revision、instructions、Skills、访问边界、验证要求,并把
438
- Profile 当前解析出的 Agent/model/effort 仅作为上下文。
439
-
440
- native subagent 继承 Leader Agent、凭据和对话上下文,忽略 Task Role 的
441
- Agent bindings;Profile 的 runtime 选择只控制 Task Role 物化。只有当 Profile
442
- 解析到同一个 Agent 且 native child API 支持时,才应用其中的 model/effort,
443
- 否则继承实际 runtime。Leader 审查返回结果后,在 WorkItem summary 中登记真实
444
- 执行信息:
445
-
446
- ```sh
447
- yui task work update <task-id>/<work-item-id> done \
448
- --summary "executor=subagent; profile=reviewer@3; model=inherited; round=1; result=reviewed; checks=npm test passed"
449
- ```
450
-
451
- 无法确认实际 model/effort 时使用 `inherited` 或 `unknown`,不能猜测。
452
- 需要独立 provider、凭据、交互 Session 或持久生命周期时,使用 Task Role
453
- Turn。
454
-
455
- 隔离 Task Role 的结果按“Provider Turn 终态记录 Turn 结果 → Leader 语义审查 → capture 当前
456
- HEAD → candidate 集成和检查 → Leader accept”的顺序处理。审查不通过时,
457
- Leader reject 并在同一 workspace 重新派发。相同 HEAD 重复 capture 复用
458
- 原 ChangeSet;修复后的新 HEAD 形成新候选:
459
-
460
- ```sh
461
- yui task work reject <task-id>/<work-item-id> --summary "需要修复的具体问题"
462
- yui task work dispatch <task-id>/<work-item-id> --input "结合上一轮结果修复"
463
- yui task work capture <task-id>/<work-item-id>
464
- yui task integration start <task-id> \
465
- --change-set <latest-change-set-id> --check "npm test"
466
- ```
467
-
468
- Integration 只保存紧凑检查结果和失败诊断。完整 stdout/stderr 流式写入
469
- `YUI_HOME/artifacts/integration-checks/...`;`task integration show`
470
- 展示相对日志路径,cleanup 同时清理候选 worktree 和日志。
471
-
472
- 代码或语义冲突会保持 blocked,直到该 Task 的 Leader 记录决策:
473
-
474
- ```sh
475
- yui task integration resolve <task-id>/<integration-id> \
476
- --option manual-resolution \
477
- --rationale "保留公开契约并组合两边实现"
478
- yui task integration continue <task-id>/<integration-id>
479
- ```
480
-
481
- Worker Turn 完成不等于 WorkItem 完成。Leader 审查结果、验证和最新
482
- ChangeSet 集成后再显式验收:
483
-
484
- ```sh
485
- yui task work accept <task-id>/<work-item-id> --summary "验收标准满足。"
486
- ```
487
-
488
- 使用 `task work reject` 退回待验收结果以便修复和重新派发,使用
489
- `task work retire <task>/<work> --summary "..."` 退役过时工作,并可选指定
490
- replacement。WorkItem、Integration
491
- worktree 与检查日志会作为证据保留,直到显式清理。
492
-
493
- 错误的历史指令或执行记录可以从运行投影中废弃,而不删除审计证据:
494
-
495
- ```sh
496
- yui task message retire <task>/<message> --reason "已被新指令替代"
497
- yui task turn retire <task>/<turn> --reason "无效的启动记录"
498
- ```
499
-
500
- 这些命令追加 retirement 事实;列表和审计仍保留并标记原 Message、
501
- WorkItem 或 Turn,而受管 Turn 上下文、actionability、恢复、Review 证据和调度会忽略
502
- 它。活动 Turn 会先按精确身份终态化;重复废弃是幂等操作。Message 与
503
- Turn 只能由用户或全局 Operator 废弃,WorkItem 也可由所属 Task Leader
504
- 废弃。
505
-
506
- 长期 Task 不依赖 native transcript 恢复。Leader 每次结束 Provider Turn 前更新 Brief
507
- 的 focus 和 leader summary;材料性技术选择写入 Decision;可独立汇报的
508
- 阶段成果写入 Milestone;只有跨 Task 稳定有效的信息才进入 Project
509
- Knowledge。
510
-
511
- 当活动 Leader Turn 必须获得用户决定才能继续时,可以创建持久 InputRequest,然后以真实的 blocked 结果结束当前 Provider Turn:
512
-
513
- ```sh
514
- yui task input request <task-id> --question "默认使用哪种格式?" \
515
- --choice csv="CSV" --choice json="JSON" --blocks work-item:<work-item-id>
516
- yui task input list
517
- yui task input show <task-id>/<input-id>
518
- yui task input answer <task-id>/<input-id> --choice csv
519
- ```
520
-
521
- 请求默认必须由用户回答,并保持开放直到回答或取消。当 Agent 存在安全的推荐方案时,可以为选项设置明确的超时回退:
522
-
523
- ```sh
524
- yui task input request <task-id> --question "默认使用哪种格式?" \
525
- --choice csv="CSV" --choice json="JSON" \
526
- --recommend csv --timeout-seconds 300
527
- ```
528
-
529
- 推荐项会明确展示给用户;如果截止时间前没有回答,独立的最近 deadline timer 会唤醒 Controller,原子采用这个确定选项,并排队恢复固定的 Leader session。自由文本和必须由用户回答的请求永远不会自动解决。
530
-
531
- `task input list` 是权威的全局开放输入 Inbox;可附加 Task ID 限定范围,或使用 `--all` 查看已回答和已取消的请求。Task 完成、退役、Leader attention、stall 和开放输入只以不可变 TaskEvent 或 InputRequest 引用进入全局 Operator mailbox。Controller 把一个待处理 batch 合并成一条带回执的 `[Yui updates]` user message,仅投递给已有且 ready 的 Operator;Operator 再通过 CLI 读取引用记录,判断哪些信息值得呈现。Operator 正在运行或不可用时,Yui 不启动也不打断它,整批引用保持持久化,并在原生 turn 完成或后续 Controller 处理中重试。该路径是 user message,不是 tool call,也不会读取或分类 Agent 终端文本。用户和 Operator 都可回答。存在开放请求时,无关的 pending wake 不会绕过等待,Task 也不能 complete 或 archive。原 Leader 也可执行 `yui task input cancel <task-id> <input-id> --reason "..."`,取消会排队恢复该固定 Leader session。
532
-
533
- ```sh
534
- yui task context <task-id>
535
- ```
536
-
537
- 需要查看单个集合或记录时,再使用 `task work`、`task message`、`task turn` 和 Task Knowledge 下的细分命令。
538
-
539
- 使用一个幂等命令记录 Task 已确认的 PR/MR 外部交付状态:
540
-
541
- ```sh
542
- yui task publication upsert <task-id> --project <project> \
543
- --provider github --repository <owner/name> --kind pull-request --id <number> \
544
- --url <url> --state open --reported
545
- ```
546
-
547
- 必需的 provider/repository/external ID 会定位当前 Publication。首次 upsert
548
- 创建记录。后续 upsert 会继承未指定的元数据;只有完整证据上下文不变时才继承未指定的
549
- 合入证据。证据上下文包括 local commit、PR/MR state、remote commit、evidence 文本
550
- 和 mergedAt。任一显式提供的上下文值真正变化时,未显式提供的 verification 会重置为
551
- `reported`,未重新提供的合入证据字段会清除;仅改变 local commit 且未显式提供 state
552
- 时还会把 Publication 重置为 `open`。重复提供相同值仍保持幂等。只有语义发生变化时才
553
- 追加新的不可变记录,并由 Yui 自动关联上一版本;相同输入不会新增事件。`list`、`show`
554
- 和 `task context` 继续保留完整历史。该命令只记录调用方已经掌握的事实,不会自行查询
555
- Provider,也不替代 Review、Integration 或 Task completion 门禁。
556
-
557
- 可针对当前 GitHub Publication 查询真实 PR 状态并记录验证结果:
558
-
559
- ```sh
560
- yui task publication verify <task-id>/<publication-id>
561
- ```
562
-
563
- 验证是一次显式的外部读取。一期调用 PATH 中已固定绝对路径的可信本地 `gh`,复用
564
- `gh` 自己的认证,Yui 不保存 GitHub token。命令先要求当前未 supersede
565
- Publication 的 local commit 精确等于 Task 交付 head,再要求 GitHub 返回相同的
566
- PR head、真实 merged 状态和远端合入 commit。远端调用结束后还会重新核对 Task head
567
- 与 Publication,全部不变才追加新的不可变 `verified` 记录。缺少 `gh`、认证不可用、
568
- Provider 输出不明确、PR 仍 open/closed、head 已移动或本地权威并发变化时都不会写入
569
- verified。一期不支持 GitLab 远端验证。
570
-
571
- 可查询每个已交付 Project head 是否都有当前 merged Publication 覆盖:
572
-
573
- ```sh
574
- yui task remote-delivery <task-id>
575
- yui task remote-delivery <task-id> --json
576
- ```
577
-
578
- 这是只读派生投影,不是新的 Task 状态,也不存在可单独写入的 `merged` 标志。
579
- active 或 reopened Task 使用当前干净的 Task main heads,并明确标记为 provisional;
580
- completed 或 archived Task 使用最近一次 `task.completed` 冻结的 heads。每个 Project
581
- 都会展示预期 local commit、匹配的当前未 supersede Publication、PR/MR state、
582
- verification 与 remote commit。聚合状态为 `none`、`unavailable`、`pending`、
583
- `partial` 或 `merged`,并分别暴露 `allMerged` 与 `allVerified`。只有
584
- `localCommit` 精确匹配
585
- 预期 head 且 state 为 `merged` 的当前 Publication 才贡献 merged 覆盖;缺 commit、
586
- open/closed、陈旧 head 与已 supersede 记录都不会被推断为已合入。Task head 与
587
- managed base 相同的 Project 不需要 Publication。`task show`、`task context`、
588
- `task next-action` 和 Web detail 共用同一个 selector。
589
- `Archive --integrated coverage` 同时要求 `allMerged=true` 和
590
- `allVerified=true`。
591
-
592
- 有效旧版本 completed Task 如果没有冻结的 completion heads,Yui 会报告
593
- `unavailable`,并继续对 integrated archive fail closed。先 reopen,再重新 complete
594
- 以记录精确 heads,之后重试 archive。Yui 不会从 Publication 或 worktree 猜测缺失的
595
- head,`--force` 也不能绕过缺失 head 证据。
596
-
597
- 完成目标后,可将 Task 标记为 completed,从而停止自动唤醒,同时保留 session 和 Task main worktree:
598
-
599
- ```sh
600
- yui task complete <task-id> --summary "CSV 导出已交付并验证"
601
- yui task reopen <task-id>
602
- ```
603
-
604
- completed Task 在显式 reopen 前会拒绝消息、派发、进入 session、重试和迟到的
605
- Turn 交付。终态 WorkItem、Review、Integration 与 Lane worktree 会作为非阻塞的
606
- completion advisory 返回,但必须在 archive 前处理。每个隔离 WorkItem worktree
607
- 仍需显式标记 integrated 或 abandoned,清理时也会删除其受管分支;archive 还必须
608
- 通过 `--integrated` 或 `--abandon` 明确 Task main 的处理结果。`--integrated`
609
- 还要求 remote-delivery 的 `allMerged=true` 与 `allVerified=true`;Task
610
- completion 或只有 reported 的 merge 都不等同于已验证远端交付。如果所有精确
611
- Task head 都已合入但仍有 Publication 是 `reported`,archive 会列出这些记录并拒绝。
612
- 只有获得明确授权后,`task archive <task-id> --integrated --force` 才能仅覆盖这一
613
- verification 缺口,并在归档事件中记录 override;它不能绕过缺失、陈旧、open 或
614
- closed 的合入证据。有意不合入时继续使用显式 `--abandon` 路径。之后 archive 才会
615
- 停止 session 并清理干净的 Task main。Task 与 WorkItem 记录都会保留,Task main
616
- 分支作为恢复信息保留,不会被静默删除。
617
- Task 生命周期的交互选择只展示有效来源状态:activate 只展示 Draft,complete 只展示 active,reopen 只展示 completed。
618
-
619
- ## Session 与 tmux
620
-
621
- 受管理的 Provider 会话仍然是普通用户会话。Yui 只添加对应的 Role Skill 与 Session Manifest 指针,并通过 Provider 原生结构化协议提交 Task 工作;Yui 不接管完整对话历史。受管理输入绝不会作为终端按键、粘贴文本或启动 argv 发送。Codex 在只转发字节的 `app-server proxy` 上完成 App Server WebSocket 握手,接入与 Desktop 相同的共享 daemon;原生 thread 可在 Desktop 中直接查看和操作。Task execution stop 只终止 Yui 的 Agent Host、WebSocket 与 proxy,保留共享 daemon、原生 thread、Task、WorkItem、代码与持久消息;start 创建新的 attachment。Claude 继续使用独立的持久 stream-json 进程,并以精确回放的 user message 作为接收确认。
622
-
623
- Session、Activation 与 Turn 是独立身份。Session 可以跨多个 Turn 和客户端连接;Activation 只代表 Yui 当前的连接,而不是对 Provider thread 的独占所有权。每次 Provider 执行对应一个持久 Turn;写入超时或结果不明确会进入 `delivery-unknown`,不会自动重发。Codex 已存在的 active Turn 只会让 Yui 暂时等待,不会导致待投递 Turn 失败;Claude 等独立进程 Provider 继续通过 Yui 的 view/takeover 边界进行人工控制。
624
-
625
- 恢复只在真的续不下去时被拦住:provider 侧没有可恢复的 Session、换了 Agent 或适配器、换了物理工作区。模型、推理强度、权限策略、Role 说明与 Skill、声明的写范围只决定下一次 activation 用什么,审查轮次、候选 commit、工作区基线这类每轮事实不影响复用。因此当 Role 存在活跃 Session 时,`task role update`、`config role update`、`config agent update` 会先报告该 Session 并要求 `--yes` 确认;需要立刻生效则先停止该 Session。
626
-
627
- Turn 是 Role 是否有工作正在执行的唯一持久调度状态,记录可见输入、来源/渠道与最终回复,不复制思考过程或工具调用。所有经 Yui 中转或生成的输入统一使用 `source: yui`;Provider UI 中直接输入的消息使用 `source: user`;显式 Goal continuation 使用 `source: provider`。Provider Turn 终态后 Yui 完成该 Turn,再把下一个 Turn 投递到同一 Session。TaskRole 本身只保存身份和期望启动配置,不再保存可写的运行状态;CLI/Web 展示的 Role 状态由活动 Turn 派生,并叠加 Session/Driver 生命周期事实用于诊断。
628
-
629
- Goal 是 Session 级显式 Provider 事实,可以跨越多个 Turn。Codex 通过 Goal API/事件提供,Claude 通过 `active_goal` 提供;Yui 不用静默等待来猜测 Goal 是否完成。Turn 结束不等于 Goal、WorkItem 或 Task 完成,只有 Leader 更新 WorkItem 与 Task 的持久语义。
630
-
631
- Task Role 使用以下显式入口:
632
-
633
- ```sh
634
- yui session enter <global-role>
635
- yui session stop --all
636
- yui task role view <task-id> <role>
637
- yui task role takeover <task-id> <role>
638
- yui task role release <task-id> <role>
639
- ```
640
-
641
- Codex Role thread 可在 Desktop 中直接查看和操作;Desktop 已有 active Turn 时,Yui 只保留待投递工作并等待,不会失败或重复投递。`view`、`takeover`、`release` 继续作为 Claude 等独立进程 Provider 的人工控制入口。Yui 不写入全局 Hook/config,也不启动、重启或停止共享 daemon;Codex CLI/daemon 故障由 Task 生命周期之外修复。Global Operator 与 global Role 继续使用原生交互式 CLI,不属于受管理 Task Provider 协议;Yui 在内部将 Codex 的 Global TUI 连接到同一个默认 App Server,用户不能通过 Agent 或 Role 参数覆盖该连接,Session Manifest 自带不依赖启动进程环境的 Global Context 命令,因此同一 thread 可直接切换到 Desktop 继续对话。
642
-
643
- Global Codex 的薄 Host 与原生 TUI 位于同一个 pane,透明转发 App Server 连接,并从该 TUI 自己的 `thread/start` 或 `thread/resume` 成功响应取得 Thread ID。Yui 在首条用户消息之前通过既有启动回执登记身份,不依赖 `notify`、历史目录扫描或 bootstrap 消息;旧的 global `notify` 不能登记或修改 Session 生命周期。连接随 TUI 退出,不依赖 Controller 的持续运行。tmux 窗口存在不等于 Agent 存活:`pane_dead=0` 才是运行中,`pane_dead=1` 是保留的退出现场,读取失败则报错。状态查询不删除现场;显式启动可重建精确的死亡窗口,但不能覆盖身份未知的活 Operator。
644
-
645
- `yui update` 会用目标版本先做只读预检,在停住精确的旧 Controller 后自动执行
646
- 所需的离线迁移,再校验并启动新 Controller。若升级前希望结束所有 Agent
647
- 活动,可先执行 `yui session stop --all`;这不是存储版本链的一部分。
648
- Yui 0.15.0 建立 storage version 1 和迁移下限。更早版本(包括 0.14.2)
649
- 创建的 Home 不在这条兼容链上:应保留给匹配的历史 Yui 版本查看,或者初始化
650
- 新的 Home。从 0.15.0 开始,后续版本必须保留完整迁移链,因此可以由
651
- `yui update` 直接跨版本升级。
652
-
653
- tmux 会在 pane 创建时固定其历史容量。配置该限制之前创建的 Role 会保留原容量;Yui 会在 Terminal attach 和 Web 中提示用户退出并重新进入一次,从而创建具有 100,000 行历史的新 pane。
654
-
655
- 每个 Role(包括 Operator)可绑定多个 Agent,但任一时刻只有一个 active Agent,
656
- 并为每个 Agent binding 独立保存 native session。同一种 adapter 可以有多个
657
- binding,用于不同账号、模型、profile 或环境来源;这些 binding 是预先保存、
658
- 可随时切换的配置,而不是并行 writer。Operator 可为
659
- 每个 binding 保留多条历史对话。`operator new` 与 `operator resume`
660
- 复用唯一的 Operator tmux pane;存在运行中进程时,Yui 会先确认再停止
661
- 并切换。跨 Agent 切换默认复用已保存的 model/effort,只有用户明确选择
662
- 更新时才进入现有配置选择流程。
663
-
664
- 受管理 Session 的普通工作流命令统一调用 PATH 中的 `yui`。Session Manifest
665
- 与持久 Role/Turn fence 负责身份认证,CLI 和 Controller 只需满足协议与存储兼容,
666
- 不会因包版本升级而使现有 Session 失效;Provider 回调等内部路径仍保留精确围栏。
667
- `update` 会幂等刷新旧版本生成的精确 CLI wrapper,使历史 Session 也转为这一
668
- 兼容入口。
669
-
670
- 使用 `yui config role unbind <global-role> <agent-id>` 或 `yui task role unbind <task-id> <role> <agent-id>` 可移除休眠 binding。active binding 或任何未 stopped 的 native session 都会被拒绝;stopped session 记录会和 binding 在同一事务中删除。
671
-
672
- Claude 的 session ID 在启动前分配,并由持久 stream-json Provider 进程承载多个 Turn;Codex 使用持久 App Server thread。两者都复用同一套 Conversation、Activation、Turn 与 authority fence,不再向模型对话注入 session-bind prompt。
673
-
674
- 自动生命周期与投递判断只使用 Provider 原生事件或受支持 Hook 的结构化 payload、持久身份、tmux process
675
- state、receipt 与 pane fence。Yui 不会解析 prompt glyph、进度文本、trust dialog
676
- 或其他 Agent 终端输出来推断 ready 或 success。`captureRole()` 只用于显式的人类
677
- transcript 查看,不具备生命周期权威。
678
-
679
- 稳定的 Role 上下文不会创建额外的 bootstrap Turn。Task execution Turn 按角色使用通用 Leader 或 Worker Skill,review Turn 则按持久 Turn purpose 使用通用 Reviewer Skill;Provider 可以通过安全的追加式原生上下文通道携带 Skill,也可以在普通 Task 投递中指向它。这些都只是 Yui 自己拥有的可移植编排规则。Project Skills 始终是 Project 中正常版本化的文件,由 Agent 通过自身项目机制发现、选择并按需加载;Yui 不扫描、不解析、不复制,也不注入 Project Skills。Managed Codex 保留用户原有的 developer instructions;普通 Task 消息会携带精简的 Session Manifest 绝对路径,Manifest 再指向对应的 Yui Role Skill,供 Codex 按需读取。model、effort、permission、workspace 与 shell 设置作为共享 daemon 上的线程级 `thread/start` 或 `thread/resume` 配置传入;Codex 原生 config profile 因无法隔离到单条共享 thread 而被拒绝,Yui 不修改底层 Codex 配置文件。App Server 原生通知是 Managed Codex 线程的生命周期权威;Yui 不为它安装 Hook,也不占用 `notify`。交互式 Codex Session 仍可使用 Yui 的结构化 `notify` callback,Doctor 会报告最终生效的配置冲突。`skills.config` 只负责启停已发现 Skill,Yui 不会误用它。Claude 从 Yui 管理的私有 `0600` context 文件读取同一份 Yui Role Skill 内容,不再把大段或敏感文本放进 argv;重试和 resume 会复用按 purpose 区分的稳定路径。非 Operator 的 global Role 保持中性,不会注入 Task 编排 Skill。因此 Operator 会停在空白的原生 composer,用户输入仍是第一条 user message;Leader wake、Worker 和 Reviewer Turn assignment 仍是邮箱投递的真实工作消息。
680
-
681
- ## Controller 与失败处理
682
-
683
- 每个 `YUI_HOME` 有一个后台 Controller:
684
-
685
- ```sh
686
- yui controller status
687
- yui controller stop
688
- yui controller restart
689
- ```
690
-
691
- `controller restart` 会用当前安装的 Yui 版本替换 Controller 进程及其调度循环、socket 服务,不会停止或重启已受管的 tmux/Agent 会话;普通 Session 命令按协议与存储身份兼容,不要求 Controller 与 CLI 包版本完全相同。
57
+ 告诉 Operator 你想做什么:
692
58
 
693
- 成功的 `setup` `update` 会确保当前 Home 有一个运行中的 Controller。
694
- `upgrade` 只会在迁移前存在 Controller 时恢复它;只读命令和
695
- `upgrade --dry-run` 不会启动 Controller。`update` 只有在迁移和新二进制健康
696
- 检查都通过后,才会替换或启动 Controller。
59
+ > 我的项目在 `/absolute/path/to/app`。帮我增加 CSV 导出,先明确范围,
60
+ > 然后实现并验证。不要发布。
697
61
 
698
- 恢复 reconciliation 默认每 120 秒执行一次。普通持久状态变化只会将 Task、Role 或 Operator key 放入队列并立即返回;固定 100ms 窗口内到达的 key 会合并触发一次不重叠的定向处理。Operator 呈现使用独立 lane,不会被 Task 的 Git/worktree 操作阻塞;周期 Git/worktree 处理只覆盖仍有持久 Task mailbox 工作的 Task,活动 Role 的存活检查合并为一次 tmux inventory。来自 Provider 原生事件或受支持 Hook 的结构化 Agent Driver observation,会经过精确 fence 后进入持久 runtime inbox。终态 Turn observation 会原子记录精确的 Turn 结果。持久 WorkMailbox 会冻结当前 processing 批次,期间的新事件合并到下一 pending 批次;失败会释放当前批次供恢复。推荐输入与 pending Turn 共用最近 deadline 选择器,不依赖恢复扫描间隔;显式 `task reconcile` 仍会立即请求恢复扫描。保留的闭环为:
62
+ Operator 可以帮你登记 Project、把请求整理成 Task,再由该 Task 的 Leader
63
+ 在你的要求范围内规划和执行。之后可以继续提问、修改需求,或把另一个请求
64
+ 交给同一个 Operator,不必先学习 Task ID 和内部命令。
699
65
 
700
- 1. 准备 active Project Task 的主 worktree;
701
- 2. 停止 archived Task 的 tmux,并只清理干净 worktree;
702
- 3. 投递排队的 Worker Turn;
703
- 4. 检测活动 Role 进程退出;
704
- 5. Leader 空闲时投递 pending wake。
66
+ ## 通过对话管理工作
705
67
 
706
- 自动输入只通过 tmux 投递。每次处理只做一次非阻塞的 process-state readiness 检查;启动阶段忙碌时通过小型有界 mailbox timer 重试,后续忙碌会话通常由 Codex turn-complete 事件再次唤醒。pane 内 receipt 可避免 Controller 重试时重复输入同一 Turn。
68
+ ### Agent 识别和整理任务
707
69
 
708
- Role 进程未产生 Provider 终态结果就退出时,Controller 会失败对应 Turn 和 running WorkItem,并唤醒 Leader。恢复状态通过精简的 Jobs 视图呈现:
70
+ 新需求、补充说明和问题可以像平常一样表达:
709
71
 
710
- ```sh
711
- yui jobs list
712
- yui jobs retry leader-recovery:<task-id>
713
- yui task reconcile <task-id>
714
- yui task turn retry <failed-turn-id>
715
- ```
72
+ > CSV 导出还要保留账号开头的零。另外,单独排查一下登录慢的问题,
73
+ > 优先把导出做好。
716
74
 
717
- `jobs` 不是旧版通用队列,只展示持久 Leader wake 和 Leader recovery failure。
75
+ Operator 会结合已有任务判断哪些属于同一个结果,哪些应该独立成 Task,
76
+ 并按 Project、类型、优先级和标签组织工作。补充需求不必另起任务,
77
+ 实现中的每一步也不需要拆成 WorkItem。
718
78
 
719
- completion 是可逆的执行屏障。只有活动工作已处理且所有 worktree 干净时才能归档;归档停止 Task 的 tmux session 并移除托管 worktree,但保留 Task 记录。脏 worktree 会让 Task 保持 completed,供后续处理。
79
+ Leader 负责交付:小任务可以自己完成;有独立交付价值的需求可以安排给已配置
80
+ 的 Worker;需要审查时再安排 Reviewer。Agent 决定计划与分工,Controller
81
+ 负责自动投递已安排的工作、观察执行、把结果送回负责人,你不必在会话之间
82
+ 充当传话人。
720
83
 
721
- ## 本地 Web 控制室
84
+ ### 用对话修改配置
722
85
 
723
- 默认在 loopback 地址启动本地控制室:
86
+ 继续在 Operator 对话里提出你的偏好:
724
87
 
725
- ```sh
726
- yui web
727
- # Yui web control room: http://127.0.0.1:4173
728
- ```
88
+ > 看看我有哪些可用的 Agent 和模型,给我一套规划、实现、审查的配置建议,
89
+ > 确认后帮我应用。
729
90
 
730
- 可用 `--port <port>` 或 `--host 127.0.0.1|::1|localhost` 修改监听参数。Yui 会拒绝非 loopback host,因为控制室会展示 Task、Role、WorkItem、Turn、Message、Decision、Milestone 和 InputRequest 等信息。服务启动时生成的随机 token 会嵌入页面,并保护写操作和终端连接。
91
+ Operator 会先读取实际配置和受支持的选项,再执行修改。你可以让它切换模型、
92
+ 绑定另一个 Agent、调整审查偏好,或解释某个设置。它应说明改了什么、影响
93
+ 后续启动还是当前 Session,以及哪些选择需要你确认,不要求你手动编辑配置文件。
731
94
 
732
- Web 端可以通过与 Terminal 相同的持久化 CLI 路径回答 open InputRequest,也可以通过原生 xterm 客户端 attach 到已有 Operator、Leader 或 Worker tmux pane。关闭浏览器终端只会 detach 当前 tmux client,Agent 进程与对话继续保留;Web 不复制 transcript,也不维护第二套会话状态。
95
+ ### 离开后,接着做
733
96
 
734
- 控制台默认打开概览驾驶舱:四个运营指标(进行中任务、等待你处理的输入、已完成任务、总数)、跨任务的关注收件箱(把所有 open InputRequest 连同问题和紧急程度集中展示,无需进入任务即可回答),以及当前进行中的任务列表。选中任务后进入带锚点的详情视图(摘要、焦点、工作项、运行、角色、历史、消息),顶部标签栏会跟随滚动高亮当前所在分区。
97
+ > 现在有哪些任务还在进行?哪些需要我决定?从保存的状态继续 CSV 任务,
98
+ > 告诉我还剩什么。
735
99
 
736
- 控制室支持 English 与简体中文,首次打开时跟随浏览器语言,也可以手动切换并记住选择。主题选择器可在深色「控制室」、浅色「纸本台账」和深蓝「Atlas 深空」之间切换。语言与主题偏好只保存在浏览器 `localStorage`,不会修改 `YUI_HOME`。
100
+ 需求、决策和结果独立于原生聊天记录保存。Yui 将持久更新送给 Operator,
101
+ Agent 可以重新读取任务上下文,继续兼容的 Session,或在必要时选择新的执行。
102
+ 进程失败不会抹掉任务,结果不确定的投递也不会被静默重复。
737
103
 
738
- ## 管理命令
104
+ 想直观看进展,可以在另一个终端运行 `yui web`。本地 Web 展示同一份任务与
105
+ 待回答问题,不是另一套需要同步的任务系统。
739
106
 
740
- ```sh
741
- yui update
742
- yui upgrade [--dry-run]
743
- yui config agent add|list|show|capabilities|update|remove
744
- yui config role add|list|show|update|remove|bind|unbind
745
- yui config profile add|list|show|update|remove|reset
746
- yui config completion [bash|zsh|fish]
747
- yui session enter|record|replace|reconcile
748
- yui project add|clone|update|discover|list|show|knowledge
749
- ```
107
+ ## 核心设计
750
108
 
751
- Agent 环境变量绑定只保存进程环境变量名,不保存 secret 值;raw args 不能覆盖 adapter 管理的生命周期参数。
109
+ ### Agent 做判断,Yui 保存工作事实
752
110
 
753
- ## 范围
111
+ Yui 是本地控制面与上下文 API,不是固定流程引擎。Operator 识别和分流请求,
112
+ 每个 Task 的 Leader 对结果负责,决定计划、委派、审查与恢复。Controller
113
+ 处理投递和运行事实,不代替 Agent 判断一份回答是否足够好。
754
114
 
755
- Yui 面向一台机器上的一个受信任本地用户。它的 Web/API 仅支持 loopback,不包含远程或多用户 Web、分布式协调、backup/import/export、trash/restore、derived index、recovery journal、runtime lease、inactivity TTL、cooldown 或 recurring schedule。
115
+ Task、消息、决策、原始执行结果和 Project Knowledge 构成持久上下文。
116
+ Agent 通过范围明确的小型 CLI 操作读取和更新它们。Session 和进程状态服务于
117
+ 执行,但不替代“用户要求了什么、工作做到哪里”的任务记录。
756
118
 
757
- 持久化和调度细节见 [ARCHITECTURE.md](../ARCHITECTURE.md)。
119
+ ### 把任务与对话分开
758
120
 
759
- ## 本地开发
121
+ Task 表示目标,WorkItem 表示可独立验收的需求,Session 表示原生对话,
122
+ AgentRun 表示明确请求的一次执行。分开这些概念,你就能先讨论而不启动交付、
123
+ 跨多次执行延续同一需求,并查看原始结果,而不把“Agent 说完了”当成“工作已验收”。
760
124
 
761
- ```sh
762
- npm ci
763
- npm run build
764
- npm test
765
- npm run lint
766
- ```
125
+ Draft 可以先保存规划,之后再采用交付工作区。涉及仓库时,修改发生在受管
126
+ worktree 中,而不是稳定的 Project checkout。Leader 对照实际范围判断结果,
127
+ 组织审查和集成。
767
128
 
768
- `npm test` 只保留秒级核心 smoke:CLI 启动、正常 SQLite Task、存储基线、
769
- 目标驱动更新和内置 Agent Driver。针对当前修改编写的 TDD、异常数据和故障复现
770
- 仅作为开发期证据,需求完成后删除,不累积为常驻回归测试。具体约束见
771
- [验证策略](../docs/testing/verification-levels.md)。
129
+ ### 执行可以替换,权限保持明确
772
130
 
773
- 如需让用户终端使用当前 checkout,可逆地接管用户级 `yui` 命令:
131
+ Codex CLI、Claude Code CLI 和 ACP 连接(包括 Claude Agent SDK 桥接)
132
+ 通过统一执行边界接入,同时保留各自的原生能力与会话。配置里期望的值和
133
+ 运行 Agent 实际回报的值分开记录,不假设不同接入方式完全等价。
774
134
 
775
- ```sh
776
- make link
777
- command -v yui
778
- yui doctor
779
- ```
135
+ Task 缺少某项能力时,Leader 可以在现有权限范围内创建、验证并显式激活
136
+ Task-local 插件。可执行插件仍需要具体执行授权;业务结果可以独立保存,
137
+ 不依赖产生它的插件或 Session 一直存活。
780
138
 
781
- 第一次执行 `make link` 会把最初的 `yui` 入口保存在同一个用户级 bin 目录,再用指向当前 checkout 的受管符号链接接管命令。之后在其他 checkout 执行 `make link` 只会移动这个受管链接:最后执行者生效,开发环境之间不会形成备份链。请串行执行 `make link` 和 `make unlink`,不要从多个环境或 checkout 并发调用。launcher 默认使用当前生效 checkout 的 `output/dev/home` 作为 `YUI_HOME`;显式设置的 `YUI_HOME` 仍然优先。受管 Agent 不依赖这个全局链接:Controller 会把指向自身 Yui CLI `YUI_HOME` 的私有 launcher 放到 PATH 最前面。若已有 Controller 也需要加载新代码,请执行 `yui controller restart`。任意采用本实现的 checkout 都可以执行 `make unlink`;它会校验共享受管状态并恢复唯一一份最初 `yui` 入口。
782
-
783
- ```sh
784
- make unlink
785
- ```
139
+ Yui 面向一个受信任本地用户,不是 OS 沙箱,也不是远程多用户服务。发布、
140
+ 授予新权限等外部效果仍需相应授权。
786
141
 
787
- 若只想隔离运行当前 checkout、而不改动全局 `yui`,构建它的本地 launcher,而不是执行 `link`:
142
+ ## 深入了解
788
143
 
789
- ```sh
790
- make install-local
791
- ./output/dev/bin/yui doctor
792
- ```
144
+ [总体架构](../ARCHITECTURE.md)介绍端到端设计,
145
+ [文档导航](../docs/architecture/README.md)提供配置、执行、交付、存储和插件的
146
+ 当前合同。想直接操作 CLI 时,使用 `yui --help` 查看命令。
793
147
 
794
- `make install-local` 会在 `output/dev/bin/yui` 写入一个自包含 launcher,并且完全不碰用户级 `yui` 命令。该 launcher 会自行解析所在 checkout,并把 `YUI_HOME` 默认指向本 checkout 的 `output/dev/home`;因此 Yui 从 `YUI_HOME` 派生的所有实例标识(Controller socket、tmux server、state)都会与其他 checkout 或全局安装保持隔离。该命令是幂等的,拉取新代码后可重复执行(若已有 Controller 在运行,再执行 `./output/dev/bin/yui controller restart`)。请以绝对路径调用该 launcher,作为每个 checkout 稳定的入口;把 `output/dev/bin` 加入 `PATH` 只是单个 shell 会话的便捷做法。
148
+ Yui 默认将控制面数据保存在 `~/.yui`,通过 `YUI_HOME` 选择另一个实例。
149
+ 切换构建或更新已有 Home 前,请查看[存储与升级](../docs/sqlite-control-plane-design.md)。
795
150
 
796
- `make install-local` 会先 build 出 `dist/`,然后只写入一个文件——launcher 本身。它不会修改 `PATH`,也不会创建数据 home,因此在需要状态的命令之前先执行一次 `./output/dev/bin/yui setup`。注意:裸敲 `yui` 是按 `PATH` 解析的,**与当前所在目录无关**;即使人在本 checkout 目录里,裸 `yui` 也不会用到本地 launcher,仍然会执行 `PATH` 找到的那个(通常是全局 `yui`)。要选中本实例,请使用 launcher 的绝对路径;或仅针对某一个交互式 shell,把它前置到 `PATH`:
151
+ ## 参与开发
797
152
 
798
- ```sh
799
- export PATH="$PWD/output/dev/bin:$PATH" # 仅当前 shell 生效;不适用于自动化
800
- ```
153
+ 源码 checkout 中从 `npm ci` 和 `npm test` 开始,阅读
154
+ `.agents/skills/develop-yui/SKILL.md` 与[验证策略](../docs/testing/verification-levels.md)。
155
+ 源码构建还需要 Linux C 编译器和静态 libc 开发库,用于构建 Claude 子进程
156
+ 监督器;发布的 npm 包已包含该可执行文件,安装使用时无需编译。
801
157
 
802
- 这也是推荐给 agent 和脚本的入口:执行一次 `make install-local`,之后在任意工作目录下以绝对路径调用 `<checkout>/output/dev/bin/yui ...`。不要依赖 `export` 跨命令留存,因为每条命令都在全新进程中运行。
158
+ 验证当前 checkout 时,先执行 `make install-local`,之后使用绝对路径
159
+ `<checkout>/output/dev/bin/yui`。它默认使用 checkout 内的隔离 Home,首次使用
160
+ 状态命令前执行该 launcher 的 `setup`。不要用全局 `yui` 或 `make link`
161
+ 验证本地修改。真实模型、付费或共享资源测试需要用户明确请求这些资源。
803
162
 
804
163
  ## 许可证
805
164