u-foo 1.0.6 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +44 -4
  2. package/SKILLS/ufoo/SKILL.md +17 -2
  3. package/SKILLS/uinit/SKILL.md +8 -3
  4. package/bin/ucode-core.js +15 -0
  5. package/bin/ucode.js +125 -0
  6. package/bin/ufoo-assistant-agent.js +5 -0
  7. package/bin/ufoo-engine.js +25 -0
  8. package/bin/ufoo.js +4 -0
  9. package/modules/AGENTS.template.md +14 -4
  10. package/modules/bus/README.md +8 -5
  11. package/modules/bus/SKILLS/ubus/SKILL.md +5 -4
  12. package/modules/context/SKILLS/uctx/SKILL.md +3 -1
  13. package/modules/online/SKILLS/ufoo-online/SKILL.md +144 -0
  14. package/package.json +12 -3
  15. package/scripts/import-pi-mono.js +124 -0
  16. package/scripts/postinstall.js +20 -49
  17. package/scripts/sync-claude-skills.sh +21 -0
  18. package/src/agent/cliRunner.js +524 -31
  19. package/src/agent/internalRunner.js +76 -9
  20. package/src/agent/launcher.js +97 -45
  21. package/src/agent/normalizeOutput.js +1 -1
  22. package/src/agent/notifier.js +144 -4
  23. package/src/agent/ptyRunner.js +480 -10
  24. package/src/agent/ptyWrapper.js +28 -3
  25. package/src/agent/readyDetector.js +16 -0
  26. package/src/agent/ucode.js +443 -0
  27. package/src/agent/ucodeBootstrap.js +113 -0
  28. package/src/agent/ucodeBuild.js +67 -0
  29. package/src/agent/ucodeDoctor.js +184 -0
  30. package/src/agent/ucodeRuntimeConfig.js +129 -0
  31. package/src/agent/ufooAgent.js +11 -2
  32. package/src/assistant/agent.js +260 -0
  33. package/src/assistant/bridge.js +172 -0
  34. package/src/assistant/engine.js +252 -0
  35. package/src/assistant/stdio.js +58 -0
  36. package/src/assistant/ufooEngineCli.js +306 -0
  37. package/src/bus/activate.js +27 -11
  38. package/src/bus/daemon.js +133 -5
  39. package/src/bus/index.js +137 -80
  40. package/src/bus/inject.js +47 -17
  41. package/src/bus/message.js +145 -17
  42. package/src/bus/nickname.js +3 -1
  43. package/src/bus/queue.js +6 -1
  44. package/src/bus/store.js +189 -0
  45. package/src/bus/subscriber.js +20 -4
  46. package/src/bus/utils.js +9 -3
  47. package/src/chat/agentBar.js +117 -0
  48. package/src/chat/agentDirectory.js +88 -0
  49. package/src/chat/agentSockets.js +225 -0
  50. package/src/chat/agentViewController.js +298 -0
  51. package/src/chat/chatLogController.js +115 -0
  52. package/src/chat/commandExecutor.js +700 -0
  53. package/src/chat/commands.js +132 -0
  54. package/src/chat/completionController.js +414 -0
  55. package/src/chat/cronScheduler.js +160 -0
  56. package/src/chat/daemonConnection.js +166 -0
  57. package/src/chat/daemonCoordinator.js +64 -0
  58. package/src/chat/daemonMessageRouter.js +257 -0
  59. package/src/chat/daemonReconnect.js +41 -0
  60. package/src/chat/daemonTransport.js +36 -0
  61. package/src/chat/daemonTransportDefaults.js +10 -0
  62. package/src/chat/dashboardKeyController.js +480 -0
  63. package/src/chat/dashboardView.js +154 -0
  64. package/src/chat/index.js +935 -2909
  65. package/src/chat/inputHistoryController.js +105 -0
  66. package/src/chat/inputListenerController.js +304 -0
  67. package/src/chat/inputMath.js +104 -0
  68. package/src/chat/inputSubmitHandler.js +171 -0
  69. package/src/chat/layout.js +165 -0
  70. package/src/chat/pasteController.js +81 -0
  71. package/src/chat/rawKeyMap.js +42 -0
  72. package/src/chat/settingsController.js +132 -0
  73. package/src/chat/statusLineController.js +177 -0
  74. package/src/chat/streamTracker.js +138 -0
  75. package/src/chat/text.js +70 -0
  76. package/src/chat/transport.js +61 -0
  77. package/src/cli/busCoreCommands.js +59 -0
  78. package/src/cli/ctxCoreCommands.js +199 -0
  79. package/src/cli/onlineCoreCommands.js +379 -0
  80. package/src/cli.js +741 -238
  81. package/src/code/README.md +29 -0
  82. package/src/code/UCODE_PROMPT.md +32 -0
  83. package/src/code/agent.js +1651 -0
  84. package/src/code/cli.js +158 -0
  85. package/src/code/config +0 -0
  86. package/src/code/dispatch.js +42 -0
  87. package/src/code/index.js +70 -0
  88. package/src/code/nativeRunner.js +1213 -0
  89. package/src/code/runtime.js +154 -0
  90. package/src/code/sessionStore.js +162 -0
  91. package/src/code/taskDecomposer.js +269 -0
  92. package/src/code/tools/bash.js +53 -0
  93. package/src/code/tools/common.js +42 -0
  94. package/src/code/tools/edit.js +70 -0
  95. package/src/code/tools/read.js +44 -0
  96. package/src/code/tools/write.js +35 -0
  97. package/src/code/tui.js +1580 -0
  98. package/src/config.js +47 -1
  99. package/src/context/decisions.js +12 -2
  100. package/src/context/index.js +18 -1
  101. package/src/context/sync.js +127 -0
  102. package/src/daemon/agentProcessManager.js +74 -0
  103. package/src/daemon/cronOps.js +241 -0
  104. package/src/daemon/index.js +661 -488
  105. package/src/daemon/ipcServer.js +99 -0
  106. package/src/daemon/ops.js +417 -179
  107. package/src/daemon/promptLoop.js +319 -0
  108. package/src/daemon/promptRequest.js +101 -0
  109. package/src/daemon/providerSessions.js +32 -17
  110. package/src/daemon/reporting.js +90 -0
  111. package/src/daemon/run.js +2 -5
  112. package/src/daemon/status.js +24 -1
  113. package/src/init/index.js +68 -14
  114. package/src/online/bridge.js +663 -0
  115. package/src/online/client.js +245 -0
  116. package/src/online/runner.js +253 -0
  117. package/src/online/server.js +992 -0
  118. package/src/online/tokens.js +103 -0
  119. package/src/report/store.js +331 -0
  120. package/src/shared/eventContract.js +35 -0
  121. package/src/shared/ptySocketContract.js +21 -0
  122. package/src/status/index.js +50 -17
  123. package/src/terminal/adapterContract.js +87 -0
  124. package/src/terminal/adapterRouter.js +84 -0
  125. package/src/terminal/adapters/externalAdapter.js +14 -0
  126. package/src/terminal/adapters/internalAdapter.js +13 -0
  127. package/src/terminal/adapters/internalPtyAdapter.js +42 -0
  128. package/src/terminal/adapters/internalQueueAdapter.js +37 -0
  129. package/src/terminal/adapters/terminalAdapter.js +31 -0
  130. package/src/terminal/adapters/tmuxAdapter.js +30 -0
  131. package/src/ufoo/agentsStore.js +69 -3
  132. package/src/utils/banner.js +5 -2
  133. package/scripts/.archived/bash-to-js-migration/README.md +0 -46
  134. package/scripts/.archived/bash-to-js-migration/banner.sh +0 -89
  135. package/scripts/.archived/bash-to-js-migration/bus-alert.sh +0 -6
  136. package/scripts/.archived/bash-to-js-migration/bus-autotrigger.sh +0 -6
  137. package/scripts/.archived/bash-to-js-migration/bus-daemon.sh +0 -231
  138. package/scripts/.archived/bash-to-js-migration/bus-inject.sh +0 -176
  139. package/scripts/.archived/bash-to-js-migration/bus-listen.sh +0 -6
  140. package/scripts/.archived/bash-to-js-migration/bus.sh +0 -986
  141. package/scripts/.archived/bash-to-js-migration/context-decisions.sh +0 -167
  142. package/scripts/.archived/bash-to-js-migration/context-doctor.sh +0 -72
  143. package/scripts/.archived/bash-to-js-migration/context-lint.sh +0 -110
  144. package/scripts/.archived/bash-to-js-migration/doctor.sh +0 -22
  145. package/scripts/.archived/bash-to-js-migration/init.sh +0 -247
  146. package/scripts/.archived/bash-to-js-migration/skills.sh +0 -113
  147. package/scripts/.archived/bash-to-js-migration/status.sh +0 -125
  148. package/scripts/banner.sh +0 -2
  149. package/src/bus/API_DESIGN.md +0 -204
@@ -1,113 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
-
6
- skill_roots=()
7
- if [[ -d "$repo_root/SKILLS" ]]; then
8
- skill_roots+=("$repo_root/SKILLS")
9
- fi
10
- if [[ -d "$repo_root/modules" ]]; then
11
- while IFS= read -r d; do
12
- skill_roots+=("$d")
13
- done < <(find "$repo_root/modules" -maxdepth 2 -type d -name SKILLS | sort)
14
- fi
15
-
16
- usage() {
17
- cat <<'EOFU'
18
- skills
19
-
20
- Usage:
21
- ufoo skills list
22
- ufoo skills install <name|all> [--target <dir> | --codex | --agents]
23
- EOFU
24
- }
25
-
26
- cmd="${1:-}"
27
- shift || true
28
-
29
- case "$cmd" in
30
- list)
31
- for root in "${skill_roots[@]}"; do
32
- find "$root" -mindepth 1 -maxdepth 1 -type d -print
33
- done | sed 's|.*/||' | sort -u
34
- ;;
35
- install)
36
- name="${1:-}"
37
- shift || true
38
- if [[ -z "$name" ]]; then
39
- echo "FAIL: install requires <name|all>" >&2
40
- exit 1
41
- fi
42
-
43
- target=""
44
- while [[ $# -gt 0 ]]; do
45
- case "$1" in
46
- --target)
47
- target="$2"; shift 2 ;;
48
- --codex)
49
- target="${CODEX_HOME:-$HOME/.codex}/skills"; shift ;;
50
- --agents)
51
- target="$HOME/.agents/skills"; shift ;;
52
- *)
53
- echo "Unknown option: $1" >&2
54
- usage >&2
55
- exit 1
56
- ;;
57
- esac
58
- done
59
-
60
- if [[ -z "$target" ]]; then
61
- echo "FAIL: specify --target/--codex/--agents" >&2
62
- exit 1
63
- fi
64
-
65
- mkdir -p "$target"
66
-
67
- find_skill() {
68
- local skill_name="$1"
69
- local matches=()
70
- local root
71
- for root in "${skill_roots[@]}"; do
72
- if [[ -f "$root/$skill_name/SKILL.md" ]]; then
73
- matches+=("$root/$skill_name")
74
- fi
75
- done
76
- if (( ${#matches[@]} == 0 )); then
77
- echo "FAIL: missing skill '$skill_name'" >&2
78
- exit 1
79
- fi
80
- if (( ${#matches[@]} > 1 )); then
81
- echo "FAIL: duplicate skill name '$skill_name' in:" >&2
82
- printf ' - %s\n' "${matches[@]}" >&2
83
- exit 1
84
- fi
85
- echo "${matches[0]}"
86
- }
87
-
88
- install_one() {
89
- local skill_name="$1"
90
- local src_dir
91
- src_dir="$(find_skill "$skill_name")"
92
- local src_file="$src_dir/SKILL.md"
93
- local dst_dir="$target/$skill_name"
94
- local dst_file="$dst_dir/SKILL.md"
95
-
96
- mkdir -p "$dst_dir"
97
- cp "$src_file" "$dst_file"
98
- echo "Installed: $skill_name"
99
- }
100
-
101
- if [[ "$name" == "all" ]]; then
102
- while IFS= read -r d; do
103
- install_one "$d"
104
- done < <(for root in "${skill_roots[@]}"; do find "$root" -mindepth 1 -maxdepth 1 -type d -print; done | sed 's|.*/||' | sort -u)
105
- else
106
- install_one "$name"
107
- fi
108
- ;;
109
- *)
110
- usage
111
- exit 1
112
- ;;
113
- esac
@@ -1,125 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- if [[ ! -d ".ufoo" ]]; then
5
- echo "FAIL: .ufoo not found. Run: ufoo init" >&2
6
- exit 1
7
- fi
8
-
9
- repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
10
-
11
- if [[ -f "$repo_root/scripts/banner.sh" ]]; then
12
- # shellcheck disable=SC1090
13
- source "$repo_root/scripts/banner.sh"
14
- fi
15
-
16
- agent_type="claude"
17
- session_id="${CLAUDE_SESSION_ID:-}"
18
- if [[ -n "${CODEX_SESSION_ID:-}" ]]; then
19
- agent_type="codex"
20
- session_id="$CODEX_SESSION_ID"
21
- fi
22
-
23
- subscriber=""
24
- if [[ -f ".ufoo/bus/bus.json" ]]; then
25
- cur_tty="$(tty 2>/dev/null || true)"
26
- if [[ "$cur_tty" == /dev/* ]]; then
27
- subscriber="$(
28
- jq -r --arg tty "$cur_tty" \
29
- '.subscribers | to_entries[] | select(.value.tty == $tty) | .key' \
30
- .ufoo/bus/bus.json 2>/dev/null | head -1
31
- )"
32
- fi
33
- fi
34
-
35
- if [[ -z "$subscriber" && -n "$session_id" ]]; then
36
- if [[ "$agent_type" == "codex" ]]; then
37
- subscriber="codex:$session_id"
38
- else
39
- subscriber="claude-code:$session_id"
40
- fi
41
- fi
42
-
43
- if [[ -z "$session_id" && "$subscriber" == *:* ]]; then
44
- session_id="${subscriber#*:}"
45
- fi
46
- if [[ -z "$session_id" ]]; then
47
- session_id="unknown"
48
- fi
49
-
50
- if declare -F show_banner >/dev/null 2>&1; then
51
- show_banner "$agent_type" "$session_id" "$subscriber"
52
- else
53
- echo "=== ufoo status ==="
54
- echo "Agent: ${subscriber:-$agent_type}"
55
- echo ""
56
- fi
57
-
58
- echo "Project: $(pwd)"
59
-
60
- unread_total=0
61
- unread_lines=""
62
- if [[ -d ".ufoo/bus/queues" ]]; then
63
- shopt -s nullglob
64
- for queue_file in .ufoo/bus/queues/*/pending.jsonl; do
65
- [[ -s "$queue_file" ]] || continue
66
- count=$(wc -l < "$queue_file" | tr -d ' ')
67
- unread_total=$((unread_total + count))
68
- safe_name="$(basename "$(dirname "$queue_file")")"
69
- subscriber_name="$safe_name"
70
- if [[ -f ".ufoo/bus/bus.json" ]]; then
71
- subscriber_name="$(
72
- jq -r --arg safe "$safe_name" \
73
- '.subscribers | to_entries[] | select((.key|gsub(":";"_")) == $safe) | .key' \
74
- .ufoo/bus/bus.json 2>/dev/null | head -1
75
- )"
76
- [[ -n "$subscriber_name" && "$subscriber_name" != "null" ]] || subscriber_name="$safe_name"
77
- else
78
- subscriber_name="${safe_name/_/:}"
79
- fi
80
- unread_lines+=$' - '"$subscriber_name"$': '"$count"$'\n'
81
- done
82
- shopt -u nullglob
83
- fi
84
-
85
- echo "Unread messages: $unread_total"
86
- if [[ -n "$unread_lines" ]]; then
87
- printf "%s" "$unread_lines"
88
- fi
89
-
90
- decisions_dir=".ufoo/context/DECISIONS"
91
- open_count=0
92
- open_lines=""
93
-
94
- get_status() {
95
- local file="$1"
96
- local status
97
- if grep -q "^---$" "$file"; then
98
- status=$(awk '/^---$/{if(++c==2)exit} c==1 && /^status:/{print $2}' "$file")
99
- fi
100
- echo "${status:-open}"
101
- }
102
-
103
- get_title() {
104
- awk '/^#/{sub(/^# */,"");print; exit}' "$1"
105
- }
106
-
107
- if [[ -d "$decisions_dir" ]]; then
108
- shopt -s nullglob
109
- for f in "$decisions_dir"/*.md; do
110
- [[ -f "$f" ]] || continue
111
- status="$(get_status "$f")"
112
- if [[ "$status" == "open" ]]; then
113
- open_count=$((open_count + 1))
114
- title="$(get_title "$f")"
115
- [[ -z "$title" ]] && title="(no title)"
116
- open_lines+=$' - '"$(basename "$f")"$': '"$title"$'\n'
117
- fi
118
- done
119
- shopt -u nullglob
120
- fi
121
-
122
- echo "Open decisions: $open_count"
123
- if [[ -n "$open_lines" ]]; then
124
- printf "%s" "$open_lines"
125
- fi
package/scripts/banner.sh DELETED
@@ -1,2 +0,0 @@
1
- #!/bin/bash
2
- exit 1
@@ -1,204 +0,0 @@
1
- # Event Bus JavaScript API 设计
2
-
3
- ## 概述
4
-
5
- 已将 Event Bus 从 bash 迁移到 JavaScript,核心能力由 `src/bus` 模块提供。
6
-
7
- ## 核心类设计
8
-
9
- ```javascript
10
- class EventBus {
11
- constructor(projectRoot);
12
-
13
- // 初始化
14
- async init();
15
-
16
- // 订阅者管理
17
- async join(sessionId, agentType, nickname);
18
- async leave(subscriber);
19
- async rename(subscriber, nickname);
20
- async whoami(); // 获取当前订阅者 ID
21
-
22
- // 消息发送
23
- async send(target, message, publisher);
24
- async broadcast(message, publisher);
25
-
26
- // 消息接收
27
- async check(subscriber, autoAck);
28
- async ack(subscriber);
29
- async consume(subscriber, fromBeginning);
30
-
31
- // 查询与路由
32
- async status();
33
- async resolve(myId, targetType);
34
-
35
- // 后台监听
36
- async alert(subscriber, interval, options);
37
- async listen(subscriber, options);
38
- }
39
- ```
40
-
41
- ## 文件结构
42
-
43
- ```
44
- src/bus/
45
- ├── index.js # EventBus 主类
46
- ├── subscriber.js # 订阅者管理
47
- ├── message.js # 消息发送/接收
48
- ├── queue.js # 队列管理(offset, pending)
49
- ├── nickname.js # 昵称解析
50
- ├── daemon.js # bus daemon(自动注入 /ubus)
51
- ├── utils.js # 工具函数
52
- └── API_DESIGN.md # 本文件
53
- ```
54
-
55
- ## 数据结构
56
-
57
- ### .ufoo/agent/all-agents.json
58
- ```json
59
- {
60
- "schema_version": 1,
61
- "created_at": "2026-01-29T...",
62
- "agents": {
63
- "claude-code:abc123": {
64
- "agent_type": "claude-code",
65
- "nickname": "architect",
66
- "status": "active",
67
- "joined_at": "...",
68
- "last_seen": "...",
69
- "pid": 12345,
70
- "tty": "/dev/ttys001"
71
- }
72
- }
73
- }
74
- ```
75
-
76
- ### events/YYYY-MM-DD.jsonl
77
- ```json
78
- {"seq":1,"timestamp":"...","type":"message/targeted","event":"message","publisher":"...","target":"...","data":{...}}
79
- ```
80
-
81
- ### queues/{subscriber}/pending.jsonl
82
- ```json
83
- {"seq":1,"timestamp":"...","type":"message/targeted","event":"message","publisher":"...","data":{...}}
84
- ```
85
-
86
- ### queues/{subscriber}/offset
87
- ```
88
- 5
89
- ```
90
-
91
- ## 关键功能实现
92
-
93
- ### 1. 消息路由(支持昵称)
94
-
95
- ```javascript
96
- async resolveTarget(target) {
97
- // 优先级:
98
- // 1. 精确订阅者 ID (claude-code:abc123)
99
- // 2. 昵称匹配 (architect -> claude-code:abc123)
100
- // 3. 代理类型 (codex -> 所有 codex 代理)
101
- // 4. 通配符 (* -> 所有代理)
102
- }
103
- ```
104
-
105
- ### 2. 队列管理
106
-
107
- ```javascript
108
- class QueueManager {
109
- async getOffset(subscriber);
110
- async setOffset(subscriber, seq);
111
- async appendPending(subscriber, event);
112
- async readPending(subscriber);
113
- async clearPending(subscriber);
114
- }
115
- ```
116
-
117
- ### 3. 序号生成(全局唯一)
118
-
119
- ```javascript
120
- async getNextSeq() {
121
- // 读取所有 events/*.jsonl 文件的最后一行
122
- // 返回 max(seq) + 1
123
- // 保证全局唯一、单调递增
124
- }
125
- ```
126
-
127
- ### 4. 昵称冲突检测
128
-
129
- ```javascript
130
- async ensureUniqueNickname(nickname, excludeSubscriber) {
131
- // 检查 all-agents.json 中是否已存在该昵称
132
- // 返回是否唯一
133
- }
134
- ```
135
-
136
- ## 向后兼容性
137
-
138
- ### CLI 接口保持不变
139
-
140
- ```bash
141
- ufoo bus init
142
- ufoo bus join [session] [type] [nick]
143
- ufoo bus send <target> <message>
144
- # ... 所有命令保持原样
145
- ```
146
-
147
- ### 环境变量支持
148
-
149
- - `AI_BUS_PUBLISHER` - 发送者 ID
150
- - `CLAUDE_SESSION_ID` / `CODEX_SESSION_ID` - 会话 ID
151
- - `UFOO_NICKNAME` - 昵称
152
-
153
- ## 错误处理
154
-
155
- ```javascript
156
- class BusError extends Error {
157
- constructor(code, message) {
158
- super(message);
159
- this.code = code;
160
- }
161
- }
162
-
163
- // 错误码:
164
- // BUS_NOT_INITIALIZED
165
- // SUBSCRIBER_NOT_FOUND
166
- // NICKNAME_CONFLICT
167
- // INVALID_TARGET
168
- // ...
169
- ```
170
-
171
- ## 测试策略
172
-
173
- ### 单元测试
174
- - 每个模块独立测试
175
- - Mock 文件系统操作
176
-
177
- ### 集成测试
178
- - 完整消息流测试(send -> check -> ack)
179
- - 多订阅者场景
180
- - 昵称冲突处理
181
-
182
- ### 性能测试
183
- - 消息发送延迟 < 50ms
184
- - 序号生成 < 10ms
185
- - 状态查询 < 100ms
186
-
187
- ## 迁移检查清单
188
-
189
- - [ ] init 命令
190
- - [ ] join/leave 命令
191
- - [ ] send/broadcast 命令
192
- - [ ] check/ack 命令
193
- - [ ] status 命令
194
- - [ ] resolve 命令
195
- - [ ] rename 命令(支持昵称)
196
- - [ ] consume 命令
197
- - [ ] alert 后台监听
198
- - [ ] listen 前台监听
199
- - [ ] autotrigger 自动触发
200
- - [ ] 昵称解析(send 支持昵称)
201
- - [ ] 全局序号唯一性
202
- - [ ] 文件并发安全
203
- - [ ] 错误处理和日志
204
- - [ ] CLI 向后兼容