u-foo 2.3.32 → 2.4.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.
Files changed (235) hide show
  1. package/README.md +157 -213
  2. package/README.zh-CN.md +151 -197
  3. package/SKILLS/ufoo/SKILL.md +8 -8
  4. package/bin/uagy.js +69 -0
  5. package/bin/uclaude.js +2 -2
  6. package/bin/ucode.js +4 -4
  7. package/bin/ucodex.js +2 -2
  8. package/bin/ufoo.js +5 -23
  9. package/modules/AGENTS.template.md +1 -1
  10. package/modules/bus/SKILLS/ubus/SKILL.md +35 -10
  11. package/package.json +5 -5
  12. package/scripts/chat-app-smoke.js +1 -1
  13. package/scripts/global-chat-switch-benchmark.js +5 -5
  14. package/scripts/ink-demo.js +1 -1
  15. package/scripts/ink-smoke.js +1 -1
  16. package/scripts/ucode-app-smoke.js +1 -1
  17. package/src/{agent → agents/activity}/activityDetector.js +39 -2
  18. package/src/{agent → agents/activity}/activityStatePublisher.js +1 -1
  19. package/src/{agent → agents/activity}/activityStateWriter.js +2 -2
  20. package/src/{agent → agents/activity}/activityTracker.js +1 -1
  21. package/src/agents/activity/index.js +8 -0
  22. package/src/{agent → agents/controller}/controllerToolExecutor.js +4 -4
  23. package/src/agents/controller/index.js +8 -0
  24. package/src/{agent → agents/controller}/loopObservability.js +2 -2
  25. package/src/{agent → agents/controller}/loopRuntime.js +1 -1
  26. package/src/{agent → agents/controller}/ufooAgent.js +9 -9
  27. package/src/agents/index.js +10 -0
  28. package/src/agents/internal/index.js +3 -0
  29. package/src/{agent → agents/internal}/internalRunner.js +45 -22
  30. package/src/agents/launch/agyConversation.js +159 -0
  31. package/src/agents/launch/index.js +12 -0
  32. package/src/{agent → agents/launch}/launchEnvironment.js +2 -3
  33. package/src/{agent → agents/launch}/launcher.js +64 -21
  34. package/src/{agent → agents/launch}/notifier.js +23 -12
  35. package/src/{agent → agents/launch}/ptyRunner.js +44 -12
  36. package/src/{agent → agents/launch}/ptyWrapper.js +2 -2
  37. package/src/{agent → agents/launch}/publisherRouting.js +1 -1
  38. package/src/{agent → agents/launch}/readyDetector.js +23 -0
  39. package/src/{agent → agents/prompts}/defaultBootstrap.js +63 -4
  40. package/src/{group/bootstrap.js → agents/prompts/groupBootstrap.js} +41 -6
  41. package/src/agents/prompts/index.js +8 -0
  42. package/src/{code/prompts → agents/prompts/native}/index.js +1 -1
  43. package/src/{agent → agents/providers}/claudeThreadProvider.js +1 -1
  44. package/src/{agent → agents/providers}/codexThreadProvider.js +1 -1
  45. package/src/{agent → agents/providers}/directAuthStatus.js +184 -1
  46. package/src/agents/providers/index.js +13 -0
  47. package/src/{agent → agents/providers}/upstreamTransport.js +2 -2
  48. package/src/{chat → app/chat}/agentSockets.js +1 -1
  49. package/src/{chat → app/chat}/commandExecutor.js +50 -26
  50. package/src/{chat → app/chat}/commands.js +119 -5
  51. package/src/{chat → app/chat}/daemonConnection.js +1 -1
  52. package/src/{chat → app/chat}/daemonMessageRouter.js +45 -3
  53. package/src/{chat → app/chat}/dashboardView.js +2 -1
  54. package/src/app/chat/index.js +6 -0
  55. package/src/{chat → app/chat}/inputSubmitHandler.js +4 -13
  56. package/src/{chat → app/chat}/internalAgentLogHistory.js +1 -1
  57. package/src/app/chat/multiWindow/index.js +268 -0
  58. package/src/app/chat/multiWindow/paneLayout.js +84 -0
  59. package/src/app/chat/multiWindow/paneManager.js +299 -0
  60. package/src/app/chat/multiWindow/renderer.js +384 -0
  61. package/src/app/chat/multiWindow/virtualTerminal.js +327 -0
  62. package/src/{chat → app/chat}/transport.js +1 -1
  63. package/src/{cli → app/cli}/ctxCoreCommands.js +3 -3
  64. package/src/{doctor/index.js → app/cli/features/doctor.js} +1 -1
  65. package/src/{init/index.js → app/cli/features/init.js} +14 -32
  66. package/src/{cli → app/cli}/groupCoreCommands.js +2 -2
  67. package/src/app/cli/index.js +9 -0
  68. package/src/{cli → app/cli}/onlineCoreCommands.js +5 -5
  69. package/src/{cli.js → app/cli/run.js} +59 -57
  70. package/src/app/index.js +6 -0
  71. package/src/code/agent.js +10 -9
  72. package/src/code/index.js +2 -0
  73. package/src/code/launcher/index.js +9 -0
  74. package/src/{agent → code/launcher}/ucode.js +7 -8
  75. package/src/{agent → code/launcher}/ucodeBootstrap.js +3 -3
  76. package/src/{agent → code/launcher}/ucodeBuild.js +2 -2
  77. package/src/{agent → code/launcher}/ucodeDoctor.js +2 -2
  78. package/src/{agent → code/launcher}/ucodeRuntimeConfig.js +1 -2
  79. package/src/code/nativeRunner.js +4 -4
  80. package/src/code/tui.js +3 -1454
  81. package/src/config.js +15 -2
  82. package/src/{bus → coordination/bus}/activate.js +2 -2
  83. package/src/{bus → coordination/bus}/daemon.js +15 -5
  84. package/src/coordination/bus/envelope.js +173 -0
  85. package/src/{bus → coordination/bus}/index.js +7 -3
  86. package/src/{bus → coordination/bus}/inject.js +11 -3
  87. package/src/{bus → coordination/bus}/message.js +1 -1
  88. package/src/coordination/bus/messageMeta.js +130 -0
  89. package/src/coordination/bus/promptEnvelope.js +65 -0
  90. package/src/{bus → coordination/bus}/shake.js +1 -1
  91. package/src/{bus → coordination/bus}/store.js +3 -3
  92. package/src/{bus → coordination/bus}/subscriber.js +2 -2
  93. package/src/{bus → coordination/bus}/utils.js +2 -2
  94. package/src/{history → coordination/history}/inputTimeline.js +5 -5
  95. package/src/coordination/index.js +10 -0
  96. package/src/{memory → coordination/memory}/historySearch.js +1 -1
  97. package/src/{memory → coordination/memory}/index.js +3 -3
  98. package/src/{report → coordination/report}/store.js +2 -2
  99. package/src/{status → coordination/status}/index.js +3 -3
  100. package/src/online/bridge.js +2 -2
  101. package/src/{controller → orchestration/controller}/flags.js +1 -1
  102. package/src/{controller → orchestration/controller}/gateRouter.js +1 -1
  103. package/src/orchestration/controller/index.js +10 -0
  104. package/src/{controller → orchestration/controller}/shadowGuard.js +1 -1
  105. package/src/orchestration/groups/bootstrap.js +3 -0
  106. package/src/orchestration/groups/index.js +10 -0
  107. package/src/orchestration/groups/promptProfiles.js +3 -0
  108. package/src/{group → orchestration/groups}/templates.js +1 -1
  109. package/src/{group → orchestration/groups}/validateTemplate.js +1 -1
  110. package/src/orchestration/index.js +7 -0
  111. package/src/orchestration/solo/index.js +3 -0
  112. package/src/{daemon → runtime/daemon}/agentProcessManager.js +1 -1
  113. package/src/{daemon → runtime/daemon}/cronOps.js +3 -2
  114. package/src/{daemon → runtime/daemon}/groupOrchestrator.js +26 -9
  115. package/src/{daemon → runtime/daemon}/index.js +105 -53
  116. package/src/{daemon → runtime/daemon}/ipcServer.js +1 -1
  117. package/src/{daemon → runtime/daemon}/nicknameScope.js +6 -3
  118. package/src/{daemon → runtime/daemon}/ops.js +48 -61
  119. package/src/{daemon → runtime/daemon}/promptLoop.js +1 -1
  120. package/src/{daemon → runtime/daemon}/promptRequest.js +7 -7
  121. package/src/runtime/daemon/providerSessions.js +230 -0
  122. package/src/{daemon → runtime/daemon}/reporting.js +4 -4
  123. package/src/{daemon → runtime/daemon}/run.js +4 -4
  124. package/src/{daemon → runtime/daemon}/soloBootstrap.js +7 -7
  125. package/src/{daemon → runtime/daemon}/status.js +5 -5
  126. package/src/runtime/index.js +10 -0
  127. package/src/{projects → runtime/projects}/registry.js +1 -1
  128. package/src/{terminal → runtime/terminal}/adapterRouter.js +0 -10
  129. package/src/{terminal → runtime/terminal}/adapters/internalAdapter.js +0 -4
  130. package/src/tools/handlers/common.js +1 -1
  131. package/src/tools/handlers/listAgents.js +1 -1
  132. package/src/tools/handlers/memory.js +3 -3
  133. package/src/tools/handlers/readBusSummary.js +1 -1
  134. package/src/tools/handlers/readOpenDecisions.js +1 -1
  135. package/src/tools/handlers/readProjectRegistry.js +1 -1
  136. package/src/tools/handlers/readPromptHistory.js +2 -2
  137. package/src/tools/schemaFixtures.js +1 -1
  138. package/src/ui/MIGRATION.md +42 -88
  139. package/src/ui/format/index.js +5 -28
  140. package/src/ui/index.js +1 -1
  141. package/src/ui/{components → ink}/ChatApp.js +812 -88
  142. package/src/ui/ink/DashboardBar.js +685 -0
  143. package/src/ui/{components → ink}/MultilineInput.js +230 -5
  144. package/src/ui/{components → ink}/UcodeApp.js +16 -7
  145. package/src/ui/{components → ink}/agentMirror.js +24 -19
  146. package/src/ui/{components → ink}/chatReducer.js +29 -7
  147. package/src/bus/messageMeta.js +0 -52
  148. package/src/chat/agentViewController.js +0 -1072
  149. package/src/chat/chatLogController.js +0 -138
  150. package/src/chat/completionController.js +0 -533
  151. package/src/chat/dashboardKeyController.js +0 -533
  152. package/src/chat/index.js +0 -2222
  153. package/src/chat/inputHistoryController.js +0 -135
  154. package/src/chat/inputListenerController.js +0 -470
  155. package/src/chat/layout.js +0 -186
  156. package/src/chat/pasteController.js +0 -81
  157. package/src/chat/statusLineController.js +0 -223
  158. package/src/chat/streamTracker.js +0 -156
  159. package/src/code/config +0 -0
  160. package/src/daemon/providerSessions.js +0 -488
  161. package/src/terminal/adapters/internalPtyAdapter.js +0 -42
  162. package/src/ui/components/DashboardBar.js +0 -417
  163. /package/src/{code/prompts → agents/prompts/native}/actions.js +0 -0
  164. /package/src/{code/prompts → agents/prompts/native}/efficiency.js +0 -0
  165. /package/src/{code/prompts → agents/prompts/native}/environment.js +0 -0
  166. /package/src/{code/prompts → agents/prompts/native}/identity.js +0 -0
  167. /package/src/{code/prompts → agents/prompts/native}/safety.js +0 -0
  168. /package/src/{code/prompts → agents/prompts/native}/sections.js +0 -0
  169. /package/src/{code/prompts → agents/prompts/native}/system.js +0 -0
  170. /package/src/{code/prompts → agents/prompts/native}/tasks.js +0 -0
  171. /package/src/{code/prompts → agents/prompts/native}/toolDescriptions/bash.js +0 -0
  172. /package/src/{code/prompts → agents/prompts/native}/toolDescriptions/edit.js +0 -0
  173. /package/src/{code/prompts → agents/prompts/native}/toolDescriptions/read.js +0 -0
  174. /package/src/{code/prompts → agents/prompts/native}/toolDescriptions/write.js +0 -0
  175. /package/src/{code/prompts → agents/prompts/native}/ufoo.js +0 -0
  176. /package/src/{group → agents/prompts}/promptProfiles.js +0 -0
  177. /package/src/{agent → agents/providers}/claudeEventTranslator.js +0 -0
  178. /package/src/{agent → agents/providers}/claudeOauthTokenReader.js +0 -0
  179. /package/src/{agent → agents/providers}/claudeSessionFiles.js +0 -0
  180. /package/src/{agent → agents/providers}/codexEventTranslator.js +0 -0
  181. /package/src/{agent → agents/providers}/credentials/claude.js +0 -0
  182. /package/src/{agent → agents/providers}/credentials/codex.js +0 -0
  183. /package/src/{agent → agents/providers}/credentials/index.js +0 -0
  184. /package/src/{chat → app/chat}/agentBar.js +0 -0
  185. /package/src/{chat → app/chat}/agentDirectory.js +0 -0
  186. /package/src/{chat → app/chat}/cronScheduler.js +0 -0
  187. /package/src/{chat → app/chat}/daemonCoordinator.js +0 -0
  188. /package/src/{chat → app/chat}/daemonReconnect.js +0 -0
  189. /package/src/{chat → app/chat}/daemonTransport.js +0 -0
  190. /package/src/{chat → app/chat}/daemonTransportDefaults.js +0 -0
  191. /package/src/{chat → app/chat}/inputMath.js +0 -0
  192. /package/src/{chat → app/chat}/projectCloseController.js +0 -0
  193. /package/src/{chat → app/chat}/rawKeyMap.js +0 -0
  194. /package/src/{chat → app/chat}/settingsController.js +0 -0
  195. /package/src/{chat → app/chat}/shellCommand.js +0 -0
  196. /package/src/{chat → app/chat}/text.js +0 -0
  197. /package/src/{chat → app/chat}/transientAgentState.js +0 -0
  198. /package/src/{cli → app/cli}/busCoreCommands.js +0 -0
  199. /package/src/{skills/index.js → app/cli/features/skills.js} +0 -0
  200. /package/src/{bus → coordination/bus}/nickname.js +0 -0
  201. /package/src/{bus → coordination/bus}/queue.js +0 -0
  202. /package/src/{context → coordination/context}/decisions.js +0 -0
  203. /package/src/{context → coordination/context}/doctor.js +0 -0
  204. /package/src/{context → coordination/context}/index.js +0 -0
  205. /package/src/{context → coordination/context}/sync.js +0 -0
  206. /package/src/{ufoo → coordination/state}/agentRegistryDiagnostics.js +0 -0
  207. /package/src/{ufoo → coordination/state}/agentsStore.js +0 -0
  208. /package/src/{ufoo → coordination/state}/paths.js +0 -0
  209. /package/src/{controller → orchestration/controller}/launchRouting.js +0 -0
  210. /package/src/{controller → orchestration/controller}/routerFastPath.js +0 -0
  211. /package/src/{controller → orchestration/controller}/routerFinalize.js +0 -0
  212. /package/src/{group → orchestration/groups}/diagram.js +0 -0
  213. /package/src/{group → orchestration/groups}/templateValidation.js +0 -0
  214. /package/src/{solo → orchestration/solo}/commands.js +0 -0
  215. /package/src/{shared → runtime/contracts}/eventContract.js +0 -0
  216. /package/src/{shared → runtime/contracts}/ptySocketContract.js +0 -0
  217. /package/src/{providerapi → runtime/privacy}/redactor.js +0 -0
  218. /package/src/{providerapi → runtime/privacy}/shadowDiff.js +0 -0
  219. /package/src/{utils → runtime/process}/nodeExecutable.js +0 -0
  220. /package/src/{projects → runtime/projects}/identity.js +0 -0
  221. /package/src/{projects → runtime/projects}/index.js +0 -0
  222. /package/src/{projects → runtime/projects}/projectId.js +0 -0
  223. /package/src/{projects → runtime/projects}/runtimes.js +0 -0
  224. /package/src/{terminal → runtime/terminal}/adapterContract.js +0 -0
  225. /package/src/{terminal → runtime/terminal}/adapters/externalAdapter.js +0 -0
  226. /package/src/{terminal → runtime/terminal}/adapters/hostAdapter.js +0 -0
  227. /package/src/{terminal → runtime/terminal}/adapters/internalQueueAdapter.js +0 -0
  228. /package/src/{terminal → runtime/terminal}/adapters/terminalAdapter.js +0 -0
  229. /package/src/{terminal → runtime/terminal}/adapters/tmuxAdapter.js +0 -0
  230. /package/src/{terminal → runtime/terminal}/detect.js +0 -0
  231. /package/src/{terminal → runtime/terminal}/index.js +0 -0
  232. /package/src/{terminal → runtime/terminal}/iterm2.js +0 -0
  233. /package/src/{utils → ui/format}/banner.js +0 -0
  234. /package/src/{shared → ui/format}/markdownRenderer.js +0 -0
  235. /package/src/ui/{components → ink}/InkDemo.js +0 -0
package/README.zh-CN.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  [English](README.md)
4
4
 
5
- ufoo 是一个多 Agent 工作区协议,用于在同一个项目运行 Claude Code、OpenAI Codex、ufoo 原生 `ucode`,以及按模板编排的 Agent 小组。
5
+ ufoo 是一个按项目隔离的多 Agent 工作区运行时。它把 Claude Code、
6
+ OpenAI Codex、Antigravity 和 ufoo 原生 `ucode` Agent 接入同一个 chat
7
+ 仪表盘、daemon、事件总线、memory、report、group 编排和终端启动层。
6
8
 
7
9
  npm 包:[u-foo](https://www.npmjs.com/package/u-foo)
8
10
 
@@ -12,21 +14,24 @@ npm 包:[u-foo](https://www.npmjs.com/package/u-foo)
12
14
  [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)
13
15
  [![Platform](https://img.shields.io/badge/platform-macOS-blue.svg)](https://www.apple.com/macos)
14
16
 
15
- ## 功能概览
17
+ ## 亮点
16
18
 
17
- - `ufoo` / `ufoo chat` 打开交互式多 Agent 仪表盘。
18
- - `uclaude`、`ucodex`、`ucode` 会带着项目 bootstrap、bus 身份和 ufoo 协议上下文启动 Agent。
19
- - `ufoo daemon` 负责项目运行态、启动/恢复、组编排、报告和 chat bridge 请求。
20
- - `ufoo bus` 提供项目内 Agent 消息、唤醒、监听、提醒和终端激活。
21
- - `ufoo ctx`、`ufoo memory`、`ufoo history` 把决策、长期事实和输入时间线写入 `.ufoo/`。
22
- - `ufoo group` 从 `templates/groups/` 的内置模板启动多 Agent 小组。
23
- - `ufoo online` 提供远程 relay、频道、房间、token 和 inbox 辅助命令。
19
+ - 一个 TUI 仪表盘,用来启动、观察、消息通知和恢复多个 Agent
20
+ - 项目 daemon 通过 `.ufoo/run/ufoo.sock` 管理启动/恢复、report、group、
21
+ cron controller 路由。
22
+ - 项目内事件总线支持 Agent 间消息、唤醒、队列检查和终端激活。
23
+ - 共享上下文能力:decision、durable memory、prompt history、report
24
+ agent registry state。
25
+ - 支持 internal、tmux、host、Terminal.app、iTerm2 等启动模式。
26
+ - 内置 group 模板,用于启动和编排多 Agent 工作流。
27
+ - 提供原生 ufoo coding-agent 运行时 `ucode`。
24
28
 
25
29
  ## 环境要求
26
30
 
27
31
  - Node.js 18 或更新版本。
28
- - macOS,用于 Terminal.app/iTerm2 启动和激活集成。
29
- - 使用 `uclaude` 或 `ucodex` 时,需要本机已经安装 Claude Code 或 Codex CLI
32
+ - macOS,用于 Terminal.app/iTerm2 集成。
33
+ - 使用对应包装器时,需要安装 Claude Code、Codex CLI Antigravity CLI
34
+ `uclaude`、`ucodex`、`uagy`。
30
35
 
31
36
  ## 安装
32
37
 
@@ -45,120 +50,145 @@ npm install
45
50
  npm link
46
51
  ```
47
52
 
48
- 安装后会提供这些命令:`ufoo`、`uclaude`、`ucodex`、`ucode`、`ucode-core`。
53
+ 安装后提供这些命令:
54
+
55
+ | 命令 | 用途 |
56
+ |---|---|
57
+ | `ufoo` | 主 CLI、chat 仪表盘、daemon、group、bus、context、memory、report 和 online helper。 |
58
+ | `uclaude` | Claude Code 包装器,注入 ufoo bootstrap 和 bus 身份。 |
59
+ | `ucodex` | Codex 包装器,注入 ufoo bootstrap 和 bus 身份。 |
60
+ | `uagy` | Antigravity 包装器,注入 ufoo bootstrap 和 bus 身份。 |
61
+ | `ucode` | 原生 ufoo coding-agent CLI/TUI。 |
49
62
 
50
63
  ## 快速开始
51
64
 
65
+ 初始化项目并打开 chat 仪表盘:
66
+
52
67
  ```bash
53
68
  cd your-project
54
69
  ufoo init --modules context,bus
55
70
  ufoo
56
71
  ```
57
72
 
58
- 在 chat UI 里启动 Agent:
73
+ 在 chat 中启动 Agent:
59
74
 
60
75
  ```text
61
- > /launch claude
62
- > /launch codex
63
- > /launch ucode
64
- > @claude-1 read the project structure and summarize the risks
76
+ > /launch codex reviewer
77
+ > /launch claude builder
78
+ > /launch ucode fixer
79
+ > @reviewer inspect the current diff and list release risks
65
80
  ```
66
81
 
67
- 也可以直接从项目目录启动包装器:
82
+ 也可以在项目目录中直接启动包装器:
68
83
 
69
84
  ```bash
70
85
  uclaude
71
86
  ucodex
87
+ uagy
72
88
  ucode
73
89
  ```
74
90
 
75
- `ufoo chat` 会按需启动项目 daemon。跨项目全局模式:
91
+ 跨项目全局 chat 模式:
76
92
 
77
93
  ```bash
78
94
  ufoo -g
79
95
  ```
80
96
 
81
- ## 架构
97
+ ## 运行模型
82
98
 
83
99
  ```text
84
- ufoo chat / ufoo -g
85
- |
86
- v
87
- +----------------+----------------+
88
- | project daemon / IPC / reports |
89
- +----------------+----------------+
90
- |
91
- +--------------+--------------+
92
- | | |
93
- v v v
94
- controller group runtime project registry
95
- gate/router loop orchestration ~/.ufoo/projects
96
- |
97
- v
98
- provider API transports and tools
99
- codex/claude/ucode, memory, bus, terminal
100
- |
101
- v
102
- uclaude / ucodex / ucode agent sessions
100
+ ufoo / ufoo chat
101
+ -> src/app/chat + src/ui/ink
102
+ -> project daemon over .ufoo/run/ufoo.sock
103
+ -> runtime daemon launch/resume/recover/reports/cron/groups
104
+ -> orchestration router, group templates, solo roles
105
+ -> agents launch/providers/internal/controller/activity
106
+ -> coordination bus/context/memory/history/report/state/status
107
+ -> shared controller/worker tools and native ucode tools
103
108
  ```
104
109
 
105
- Chat UI 通过 `.ufoo/run/ufoo.sock` 和项目 daemon 通信。daemon 负责启动、恢复、recover、group 编排、report、controller 路由和项目注册表更新。Agent 通过项目 bus 通信,并可使用共享决策、memoryreport、prompt history 和工具处理器。
110
+ Chat UI client。daemon 拥有项目运行态。Agent 通过 bus queue、prompt
111
+ injection、shared memory、report 和 tool handler 协作,而不是直接依赖
112
+ chat UI 代码。
106
113
 
107
- ## 常用命令
114
+ ## 日常使用
108
115
 
109
- ### 项目运行态
116
+ 日常路径通常是先进入 chat,再在仪表盘里启动 Agent 和执行项目命令:
110
117
 
111
118
  ```bash
112
- ufoo init --modules context,bus,resources
113
- ufoo status
114
- ufoo doctor
115
- ufoo daemon --start
116
- ufoo daemon --status
117
- ufoo daemon --stop
119
+ ufoo
120
+ ufoo -g
118
121
  ```
119
122
 
120
- `ufoo init` 会创建 `.ufoo/`,向 `AGENTS.md` `CLAUDE.md` 注入 ufoo 协议块,创建 shared memory 存储,并初始化指定模块。默认模块是 `context`;常用多 Agent 项目建议使用 `--modules context,bus`。
123
+ `ufoo` 打开当前项目 chat。`ufoo -g` 打开全局 chat,用于在已注册项目之间
124
+ 切换。项目 daemon 会按需启动。
121
125
 
122
- ### Chat 和 Agent
126
+ ### Chat 内命令
123
127
 
124
- ```bash
125
- ufoo
126
- ufoo chat
127
- ufoo chat -g
128
- ufoo launch codex reviewer --profile review-critic
129
- ufoo solo list
130
- ufoo solo run implementation-lead --agent codex --nickname builder
131
- ufoo role ufoo-builder implementation-lead
132
- ufoo resume <ucode|uclaude|ucodex|nickname>
133
- ufoo recover list
128
+ ```text
129
+ /launch codex reviewer
130
+ /launch claude builder
131
+ /launch ucode fixer
132
+ @reviewer inspect the current diff and list release risks
133
+
134
+ /status
135
+ /settings
136
+ /multi
137
+ /resume list
138
+ /project list
139
+ /project switch 2
140
+ /open /path/to/project
141
+ ```
142
+
143
+ `uclaude`、`ucodex`、`uagy`、`ucode` 这些直接包装器仍然可用,但 ufoo 的
144
+ 主要工作流是在 chat 里完成。
145
+
146
+ ### 初始化与维护
147
+
148
+ 这些是初始化或排障命令。进入 chat 后优先使用 slash command:
149
+
150
+ ```text
151
+ /init context bus resources
152
+ /doctor
153
+ /status
154
+ /daemon status
155
+ /daemon restart
156
+ /daemon stop
157
+ /daemon start
134
158
  ```
135
159
 
136
- 常见 chat 命令包括 `/status`、`/bus list`、`/bus status`、`/settings`、`/project list`、`/project switch <index|path>`、`/open <path>`、`/resume list`、`/group status`、`/skills` 和 `@nickname <message>`。
160
+ `ufoo init` 会创建 `.ufoo/`,确保 `AGENTS.md``CLAUDE.md` 存在,
161
+ 初始化选中的模块,并准备共享存储。`CLAUDE.md` 可以是 symlink;项目指令
162
+ 优先编辑 `AGENTS.md`。
137
163
 
138
- `ufoo chat` 中,`/skills` 用于列出 ufoo 内置的可用 skills 和预设工作流能力,方便用户发现和选择。它本身不等于执行任务,也不表示某个 agent 的私有能力列表。
164
+ 项目尚未初始化时,也可以先在外部执行等价 CLI:`ufoo init --modules context,bus`。
139
165
 
140
166
  ### 事件总线
141
167
 
142
- ```bash
143
- ufoo bus join
144
- ufoo bus status
145
- ufoo bus send codex:abc123 "Please implement the approved slice."
146
- ufoo bus check codex:abc123
147
- ufoo bus listen codex:abc123 --from-beginning
148
- ufoo bus alert codex:abc123 --daemon --notify
149
- ufoo bus wake ufoo-builder --reason follow-up
150
- ufoo bus activate ufoo-builder
168
+ ```text
169
+ /bus list
170
+ /bus status
171
+ /bus send codex:abc123 Please implement the approved slice.
172
+ /bus activate reviewer
173
+ /bus rename codex:abc123 reviewer
151
174
  ```
152
175
 
153
- 先用 `ufoo bus status` 查看真实 subscriber ID 或可解析昵称。当前项目会给显式 group 昵称加项目前缀,例如 `ufoo-builder`;裸 `builder` 目标不一定能解析。
176
+ 发送消息前,先用 `/bus status` 查看真实 subscriber ID 或可解析昵称。
177
+ Agent 应处理 pending work、回复发送方,并 ack 自己的队列。
154
178
 
155
- ### 上下文、Memory、Report
179
+ ### Context、Memory、History、Report
156
180
 
157
- ```bash
158
- ufoo ctx decisions -l
159
- ufoo ctx decisions -n 1
160
- ufoo ctx decisions new "Adopt API-backed loop architecture"
181
+ 在 chat 内:
161
182
 
183
+ ```text
184
+ /ctx status
185
+ /ctx doctor
186
+ /ctx decisions
187
+ ```
188
+
189
+ Memory、history、report 管理仍是 CLI 辅助能力:
190
+
191
+ ```bash
162
192
  ufoo memory add "Provider contract" --body "Durable fact..." --tags provider,contract
163
193
  ufoo memory list --tag provider
164
194
  ufoo memory show mem-0001
@@ -167,41 +197,41 @@ ufoo history build
167
197
  ufoo history show 20
168
198
  ufoo history prompt 30
169
199
 
170
- ufoo report start "Implement README refresh" --task docs-readme --agent ufoo-builder
171
- ufoo report done "README updated" --task docs-readme --agent ufoo-builder
200
+ ufoo report start "Implement README refresh" --task docs-readme --agent builder
201
+ ufoo report done "README updated" --task docs-readme --agent builder
172
202
  ufoo report list
173
203
  ```
174
204
 
175
- 决策只用于计划级约束;长期项目事实应写入 memory。
205
+ Decision 只用于计划级约束;长期项目事实应写入 memory。
176
206
 
177
207
  ### Group
178
208
 
179
- ```bash
180
- ufoo group templates
181
- ufoo group template show build-lane
182
- ufoo group template validate templates/groups/build-lane.json
183
- ufoo group run build-lane --dry-run
184
- ufoo group run build-lane --instance docs-refresh
185
- ufoo group status
186
- ufoo group diagram build-lane --mermaid
187
- ufoo group stop docs-refresh
188
- ```
209
+ 内置 group 模板位于 `templates/groups/`。
189
210
 
190
- 当前内置模板包括 `build-lane`、`build-ultra`、`design-system`、`product-discovery`、`ui-plan-review`、`ui-polish` 和 `verify-ship`。
211
+ ```text
212
+ /group templates
213
+ /group template show build-lane
214
+ /group template validate templates/groups/build-lane.json
215
+ /group run build-lane dry_run=true
216
+ /group run build-lane instance=docs-refresh
217
+ /group status
218
+ /group diagram build-lane mermaid
219
+ /group stop docs-refresh
220
+ ```
191
221
 
192
222
  ### Online Relay
193
223
 
194
224
  ```bash
195
225
  ufoo online server --host 127.0.0.1 --port 8787
196
226
  ufoo online token codex:abc123 --nickname builder
197
- ufoo online channel list --nickname builder
198
227
  ufoo online room create --nickname builder --name review-room --type private --password secret
199
228
  ufoo online connect --nickname builder --room <room_id> --room-password secret
200
229
  ufoo online send --nickname builder --room <room_id> --text "handoff ready"
201
230
  ufoo online inbox builder --unread
202
231
  ```
203
232
 
204
- `room create` 会返回生成的 room ID,例如 `room_000000`;`connect` 和 `send` 的 `--room` 应使用这个 ID。`--name` 是展示元数据,不是加入/发送时的标识。默认公开服务地址是 `https://online.ufoo.dev`;本地开发可用 `ufoo online server` 启动自己的 relay。
233
+ 默认公开服务地址是 `https://online.ufoo.dev`。本地开发可以用
234
+ `ufoo online server` 启动自己的 relay。
205
235
 
206
236
  ### 原生 ucode 运行时
207
237
 
@@ -209,36 +239,15 @@ ufoo online inbox builder --unread
209
239
  ufoo ucode doctor
210
240
  ufoo ucode prepare
211
241
  ufoo ucode build
212
-
213
- ucode-core submit --tool read --args-json '{"path":"README.md"}' --json
214
- ucode-core run-once --json
215
- ucode-core list --json
216
- ucode-core skills list --json
217
- ucode-core skills show <name>
218
242
  ```
219
243
 
220
- `ucode-core skills list` 用于发现 ufoo/ucode 内置和本地 `SKILL.md` 预设工作流能力,输出的是供选择的元数据;完整 skill 内容只会在用户显式引用 `$demo` 或直接链接某个 `SKILL.md` 时由 ucode 加载。
221
-
222
- ## 命令参考
223
-
224
- | 范围 | 命令 |
225
- |------|------|
226
- | 运行态 | `ufoo`, `ufoo chat`, `ufoo -g`, `ufoo init`, `ufoo status`, `ufoo doctor`, `ufoo daemon --start|--status|--stop` |
227
- | 项目 | `ufoo project list`, `ufoo project current`, `ufoo project switch`(v1 中仅 chat 可切换), chat `/open <path>` |
228
- | Agent | `ufoo launch`, `ufoo solo list|run`, `ufoo role`, `ufoo resume <target>`, `ufoo recover list|run` |
229
- | Bus | `ufoo bus join|status|send|check|listen|alert|wake|activate` |
230
- | Context | `ufoo ctx doctor`, `ufoo ctx decisions`, `ufoo ctx sync` |
231
- | Memory | `ufoo memory add|list|show|edit|forget|rebuild-index|audit` |
232
- | Report | `ufoo report start|progress|done|error|list` |
233
- | Group | `ufoo group templates|template|run|status|diagram|stop` |
234
- | Online | `ufoo online server|token|room|channel|connect|send|inbox` |
235
- | History | `ufoo history build|show|prompt` |
236
- | Skills | `ufoo skills list|install` |
237
- | Chat 命令 | `/skills`, `/settings`, `/settings agent`, `/settings router`, `/settings ucode` |
244
+ `ucode` 可以发现内置和本地 `SKILL.md` 工作流能力。完整 skill 内容只会在被
245
+ 显式引用时加载。
238
246
 
239
247
  ## 配置
240
248
 
241
- 项目配置文件是 `.ufoo/config.json`。`ucode` provider 凭据写入全局 `~/.ufoo/config.json`,加载项目配置时会合并进来。
249
+ 项目配置文件是 `.ufoo/config.json`。`ucode` provider 凭据写入全局
250
+ `~/.ufoo/config.json`,加载项目配置时会合并进来。
242
251
 
243
252
  常见项目配置:
244
253
 
@@ -260,7 +269,8 @@ ucode-core skills show <name>
260
269
  }
261
270
  ```
262
271
 
263
- `launchMode` 支持 `auto`、`internal`、`internal-pty`、`tmux`、`terminal`、`host`。`controllerMode` 支持 `main`、`shadow`、`loop` 和 legacy 兼容值。
272
+ `launchMode` 支持 `auto`、`internal`、`tmux`、`terminal`、`host`。
273
+ `controllerMode` 支持 `main`、`shadow`、`loop` 和 legacy 兼容值。
264
274
 
265
275
  全局 `ucode` 配置:
266
276
 
@@ -274,79 +284,23 @@ ucode-core skills show <name>
274
284
  }
275
285
  ```
276
286
 
277
- ## 项目结构
278
-
279
- 仓库结构:
280
-
281
- ```text
282
- ufoo/
283
- bin/ CLI 入口
284
- src/ CommonJS 实现
285
- agent/ Agent 启动、bootstrap、运行时、provider
286
- bus/ 项目事件总线
287
- chat/ 终端 dashboard UI
288
- cli/ 命令适配层
289
- code/ 原生 ucode core
290
- controller/ gate router、launch routing、shadow guard
291
- context/ 决策与上下文检查
292
- daemon/ 项目 daemon、IPC、编排
293
- group/ prompt profiles 与 group templates
294
- memory/ shared memory store
295
- online/ relay client/server helpers
296
- projects/ 全局项目注册表
297
- providerapi/ redaction 与 provider shadow-diff helpers
298
- report/ Agent report store
299
- terminal/ Terminal.app、iTerm2、tmux、host adapters
300
- tools/ controller/tool handler registry
301
- templates/groups/ 内置多 Agent group 模板
302
- modules/ init 模板和打包模块文档
303
- SKILLS/ 打包的 Agent skills
304
- test/ Jest 单元测试和集成测试
305
- ```
306
-
307
- 执行 `ufoo init --modules context,bus` 后创建:
308
-
309
- ```text
310
- your-project/
311
- .ufoo/
312
- memory/ 长期项目事实
313
- context/
314
- decisions/ decision 文件
315
- decisions.jsonl decision 索引
316
- bus/
317
- events/ event log files
318
- queues/ per-agent queues
319
- logs/ bus logs
320
- offsets/ read offsets
321
- agent/
322
- all-agents.json Agent 元数据注册表
323
- daemon/
324
- counts/ bus daemon delivery counts
325
- docs -> docs/ 当项目存在 docs/ 时创建的可选 symlink
326
- AGENTS.md 规范 Agent 指令文件
327
- CLAUDE.md Claude 兼容指令文件
328
- ```
329
-
330
- 运行时或相关功能使用后创建:
287
+ ## 源码结构
331
288
 
332
289
  ```text
333
- .ufoo/run/
334
- ufoo.sock project daemon IPC socket
335
- ufoo-daemon.pid project daemon pid
336
- ufoo-daemon.log project daemon log
337
- .ufoo/daemon/
338
- daemon.pid bus auto-inject daemon pid
339
- daemon.log bus auto-inject daemon log
340
- .ufoo/chat/ chat runtime state
341
- .ufoo/groups/ group runtime instances
342
- .ufoo/history/ Agent 输入时间线
343
- .ufoo/agent/
344
- reports/ Agent report records
345
- private-inbox/ private controller inbox
346
- sessions/ provider/session metadata
290
+ src/
291
+ app/ chat client state 和 CLI command entry
292
+ ui/ Ink components 和纯格式化 helper
293
+ runtime/ daemon、projects、terminal adapters、contracts、privacy、process helpers
294
+ coordination/ bus、context、memory、history、reports、state、status
295
+ orchestration/ router/controller logic、groups、solo roles
296
+ agents/ launchers、providers、prompts、internal runner、activity、controller
297
+ code/ 原生 ucode runtime、launcher、skills、file/shell tools
298
+ tools/ shared controller/worker tool registry 和 handlers
299
+ online/ relay client/server/runner/token helpers
347
300
  ```
348
301
 
349
- 全局运行态位于 `~/.ufoo/`,包括 `~/.ufoo/config.json` `ucode` provider 设置,以及 `~/.ufoo/projects/runtime/*.json` 的全局 chat 项目注册记录。
302
+ 维护者视角的项目地图见 [PROJECT.md](PROJECT.md),更细的目录 ownership
303
+ [docs/source-structure.md](docs/source-structure.md)。
350
304
 
351
305
  ## 开发
352
306
 
@@ -363,41 +317,41 @@ npm test
363
317
  npm run test:watch
364
318
  npm run test:coverage
365
319
  npm run bench:global-switch
366
- node bin/ucode-core.js --help
367
320
  ```
368
321
 
369
- 测试框架是 Jest,`testEnvironment` `node`。覆盖率忽略 `node_modules` 和 `src/code/tui.js`。
322
+ 本仓库是 CommonJS,目标 Node.js 18+,没有 build step。
370
323
 
371
324
  ## 发布
372
325
 
373
- `package.json` 没有专用 release script。请在干净工作区按标准 npm 流程发布:
326
+ 请在干净工作区按标准 npm 流程发布:
374
327
 
375
328
  ```bash
376
329
  npm test
377
330
  npm pack --dry-run
378
- npm version patch # 或 minor/major
379
- npm publish
331
+ npm version patch
332
+ npm publish --access public
380
333
  git push --follow-tags
381
334
  ```
382
335
 
383
- 发布前用 `npm pack --dry-run` 检查最终 tarball
336
+ 发布前用 `npm pack --dry-run` 检查最终 tarball。发布需要有 `u-foo` 权限的
337
+ npm 账号/token。
384
338
 
385
339
  ## 故障排查
386
340
 
387
- 如果 `ufoo` 不在 `PATH`:
341
+ 如果 linked binary 不在 `PATH`,可以直接运行本地入口:
388
342
 
389
343
  ```bash
390
344
  node bin/ufoo.js --help
391
345
  ```
392
346
 
393
- 如果 Codex 默认 home 不可写:
347
+ 如果 Codex 默认 home 不可写,可以在启动 chat 或 Agent 前指定项目内目录:
394
348
 
395
349
  ```bash
396
350
  export CODEX_HOME="$PWD/.ufoo/codex"
397
351
  ufoo
398
352
  ```
399
353
 
400
- Codex 场景下建议使用 bus alert/listen,而不是依赖终端文本注入提醒:
354
+ Codex 场景下建议使用 bus helper,而不是依赖原始终端文本注入提醒:
401
355
 
402
356
  ```bash
403
357
  ufoo bus alert codex:abc123 --daemon
@@ -15,12 +15,6 @@ ufoo is the multi-agent coordination layer. It provides four capabilities:
15
15
  3. **Event Bus** — Inter-agent messaging
16
16
  4. **Initialization** — Project setup for ufoo modules
17
17
 
18
- ## Session Marker
19
-
20
- When you see a probe marker command like `/ufoo <marker>` (Claude) or `$ufoo <marker>` (Codex), this is daemon session tracking. **Do not reply.** Silently ignore it and wait for the next user input.
21
-
22
- ---
23
-
24
18
  ## 1. Context Decisions (uctx)
25
19
 
26
20
  ### When to Record
@@ -161,8 +155,14 @@ Notes:
161
155
 
162
156
  1. Check: `ufoo bus check $UFOO_SUBSCRIBER_ID`
163
157
  2. Execute each task
164
- 3. Reply: `ufoo bus send "<publisher>" "<result>"`
165
- 4. **Always ack**: `ufoo bus ack $UFOO_SUBSCRIBER_ID`
158
+ 3. **Always ack**: `ufoo bus ack $UFOO_SUBSCRIBER_ID`
159
+ 4. Reply only when substantive — send `ufoo bus send "<publisher>" "<result>"` only if:
160
+ - The sender asked a question → reply with the answer
161
+ - The sender delegated a task → reply with the result / artifact
162
+ - You found something the sender needs to proceed
163
+ Do NOT reply with greetings, acknowledgments, or emoji alone — those create infinite reply loops.
164
+ 5. **Report** if the work arrived from `[manual]<to:...>` or `[ufoo]<from:...>`:
165
+ `ufoo report progress|done|error "<short summary>"`
166
166
 
167
167
  ---
168
168
 
package/bin/uagy.js ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * uagy: Launch Antigravity CLI (agy) and auto-join the ufoo event bus.
4
+ *
5
+ * Usage: uagy [agy args...]
6
+ *
7
+ * Differences vs ucodex / uclaude:
8
+ * - agy is authenticated via Google OAuth + the OS keyring; ufoo does NOT
9
+ * manage credentials. Requires an account that is eligible for
10
+ * Antigravity (18+, supported region).
11
+ * - Model selection is in-REPL via `/model` (no command-line flag),
12
+ * so we never inject --model.
13
+ * - Session resume uses agy's own conversation UUIDs: when a previous
14
+ * session is found for the current tty/tmux pane, we pass
15
+ * `--conversation=<UUID>`. The id is captured on the previous exit by
16
+ * grepping the `Resume: agy --conversation=<UUID>` line agy prints to
17
+ * stdout right before quitting (see src/agents/launch/launcher.js +
18
+ * src/agents/launch/agyConversation.js).
19
+ */
20
+
21
+ const AgentLauncher = require("../src/agents/launch/launcher");
22
+ const { resolveDefaultManualBootstrap } = require("../src/agents/prompts/defaultBootstrap");
23
+ const {
24
+ readPreviousConversationId,
25
+ buildAgyLaunchArgs,
26
+ } = require("../src/agents/launch/agyConversation");
27
+
28
+ const cwd = process.cwd();
29
+
30
+ // Resume: read the most recent conversation UUID recorded for the current
31
+ // tty/tmux pane. If found, agy will receive --conversation=<id>.
32
+ //
33
+ // IMPORTANT: use the launcher's own tty detection (shell `tty` command) so
34
+ // the value here matches what the launcher will later record on the agent
35
+ // meta. Reading only env vars (UFOO_TTY_OVERRIDE / TMUX_PANE) means
36
+ // autoResume silently no-ops for typical terminal users.
37
+ const ttyForLookup = (AgentLauncher._getEnvTtyOverride && AgentLauncher._getEnvTtyOverride())
38
+ || (AgentLauncher._detectTtyOnce && AgentLauncher._detectTtyOnce())
39
+ || "";
40
+ const previousConversationId = readPreviousConversationId(cwd, {
41
+ tty: ttyForLookup,
42
+ tmuxPane: process.env.TMUX_PANE || "",
43
+ });
44
+
45
+ // In internal / unattended modes, auto-approve tool prompts so the agent
46
+ // doesn't stall waiting on a y/n the operator can't see. Terminal/tmux
47
+ // modes leave permissions in the user's hands (agy's default).
48
+ const launchMode = String(process.env.UFOO_LAUNCH_MODE || "").trim().toLowerCase();
49
+ const skipPermissions = launchMode === "internal";
50
+
51
+ const launchArgs = buildAgyLaunchArgs({
52
+ userArgs: process.argv.slice(2),
53
+ previousConversationId,
54
+ skipPermissions,
55
+ });
56
+
57
+ const launcher = new AgentLauncher("agy", "agy");
58
+ const resolved = resolveDefaultManualBootstrap({
59
+ projectRoot: cwd,
60
+ agentType: "agy",
61
+ args: launchArgs,
62
+ env: process.env,
63
+ });
64
+
65
+ for (const [key, value] of Object.entries(resolved.env || {})) {
66
+ process.env[key] = String(value);
67
+ }
68
+
69
+ launcher.launch(resolved.args);
package/bin/uclaude.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * Usage: uclaude [claude args...]
6
6
  */
7
7
 
8
- const AgentLauncher = require("../src/agent/launcher");
9
- const { resolveDefaultManualBootstrap } = require("../src/agent/defaultBootstrap");
8
+ const AgentLauncher = require("../src/agents/launch/launcher");
9
+ const { resolveDefaultManualBootstrap } = require("../src/agents/prompts/defaultBootstrap");
10
10
 
11
11
  const launcher = new AgentLauncher("claude-code", "claude");
12
12
  const resolved = resolveDefaultManualBootstrap({
package/bin/ucode.js CHANGED
@@ -11,10 +11,10 @@
11
11
  */
12
12
 
13
13
  const fs = require("fs");
14
- const AgentLauncher = require("../src/agent/launcher");
15
- const { resolveUcodeLaunch } = require("../src/agent/ucode");
16
- const { prepareUcodeBootstrap } = require("../src/agent/ucodeBootstrap");
17
- const { prepareUcodeRuntimeConfig } = require("../src/agent/ucodeRuntimeConfig");
14
+ const AgentLauncher = require("../src/agents/launch/launcher");
15
+ const { resolveUcodeLaunch } = require("../src/code/launcher/ucode");
16
+ const { prepareUcodeBootstrap } = require("../src/code/launcher/ucodeBootstrap");
17
+ const { prepareUcodeRuntimeConfig } = require("../src/code/launcher/ucodeRuntimeConfig");
18
18
 
19
19
  function stripAppendSystemPromptArgs(args = [], targetFile = "") {
20
20
  const normalizedTarget = String(targetFile || "").trim();
package/bin/ucodex.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * Usage: ucodex [codex args...]
6
6
  */
7
7
 
8
- const AgentLauncher = require("../src/agent/launcher");
9
- const { resolveDefaultManualBootstrap } = require("../src/agent/defaultBootstrap");
8
+ const AgentLauncher = require("../src/agents/launch/launcher");
9
+ const { resolveDefaultManualBootstrap } = require("../src/agents/prompts/defaultBootstrap");
10
10
 
11
11
  const launcher = new AgentLauncher("codex", "codex");
12
12
  const resolved = resolveDefaultManualBootstrap({