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.
- package/README.md +44 -4
- package/SKILLS/ufoo/SKILL.md +17 -2
- package/SKILLS/uinit/SKILL.md +8 -3
- package/bin/ucode-core.js +15 -0
- package/bin/ucode.js +125 -0
- package/bin/ufoo-assistant-agent.js +5 -0
- package/bin/ufoo-engine.js +25 -0
- package/bin/ufoo.js +4 -0
- package/modules/AGENTS.template.md +14 -4
- package/modules/bus/README.md +8 -5
- package/modules/bus/SKILLS/ubus/SKILL.md +5 -4
- package/modules/context/SKILLS/uctx/SKILL.md +3 -1
- package/modules/online/SKILLS/ufoo-online/SKILL.md +144 -0
- package/package.json +12 -3
- package/scripts/import-pi-mono.js +124 -0
- package/scripts/postinstall.js +20 -49
- package/scripts/sync-claude-skills.sh +21 -0
- package/src/agent/cliRunner.js +524 -31
- package/src/agent/internalRunner.js +76 -9
- package/src/agent/launcher.js +97 -45
- package/src/agent/normalizeOutput.js +1 -1
- package/src/agent/notifier.js +144 -4
- package/src/agent/ptyRunner.js +480 -10
- package/src/agent/ptyWrapper.js +28 -3
- package/src/agent/readyDetector.js +16 -0
- package/src/agent/ucode.js +443 -0
- package/src/agent/ucodeBootstrap.js +113 -0
- package/src/agent/ucodeBuild.js +67 -0
- package/src/agent/ucodeDoctor.js +184 -0
- package/src/agent/ucodeRuntimeConfig.js +129 -0
- package/src/agent/ufooAgent.js +11 -2
- package/src/assistant/agent.js +260 -0
- package/src/assistant/bridge.js +172 -0
- package/src/assistant/engine.js +252 -0
- package/src/assistant/stdio.js +58 -0
- package/src/assistant/ufooEngineCli.js +306 -0
- package/src/bus/activate.js +27 -11
- package/src/bus/daemon.js +133 -5
- package/src/bus/index.js +137 -80
- package/src/bus/inject.js +47 -17
- package/src/bus/message.js +145 -17
- package/src/bus/nickname.js +3 -1
- package/src/bus/queue.js +6 -1
- package/src/bus/store.js +189 -0
- package/src/bus/subscriber.js +20 -4
- package/src/bus/utils.js +9 -3
- package/src/chat/agentBar.js +117 -0
- package/src/chat/agentDirectory.js +88 -0
- package/src/chat/agentSockets.js +225 -0
- package/src/chat/agentViewController.js +298 -0
- package/src/chat/chatLogController.js +115 -0
- package/src/chat/commandExecutor.js +700 -0
- package/src/chat/commands.js +132 -0
- package/src/chat/completionController.js +414 -0
- package/src/chat/cronScheduler.js +160 -0
- package/src/chat/daemonConnection.js +166 -0
- package/src/chat/daemonCoordinator.js +64 -0
- package/src/chat/daemonMessageRouter.js +257 -0
- package/src/chat/daemonReconnect.js +41 -0
- package/src/chat/daemonTransport.js +36 -0
- package/src/chat/daemonTransportDefaults.js +10 -0
- package/src/chat/dashboardKeyController.js +480 -0
- package/src/chat/dashboardView.js +154 -0
- package/src/chat/index.js +935 -2909
- package/src/chat/inputHistoryController.js +105 -0
- package/src/chat/inputListenerController.js +304 -0
- package/src/chat/inputMath.js +104 -0
- package/src/chat/inputSubmitHandler.js +171 -0
- package/src/chat/layout.js +165 -0
- package/src/chat/pasteController.js +81 -0
- package/src/chat/rawKeyMap.js +42 -0
- package/src/chat/settingsController.js +132 -0
- package/src/chat/statusLineController.js +177 -0
- package/src/chat/streamTracker.js +138 -0
- package/src/chat/text.js +70 -0
- package/src/chat/transport.js +61 -0
- package/src/cli/busCoreCommands.js +59 -0
- package/src/cli/ctxCoreCommands.js +199 -0
- package/src/cli/onlineCoreCommands.js +379 -0
- package/src/cli.js +741 -238
- package/src/code/README.md +29 -0
- package/src/code/UCODE_PROMPT.md +32 -0
- package/src/code/agent.js +1651 -0
- package/src/code/cli.js +158 -0
- package/src/code/config +0 -0
- package/src/code/dispatch.js +42 -0
- package/src/code/index.js +70 -0
- package/src/code/nativeRunner.js +1213 -0
- package/src/code/runtime.js +154 -0
- package/src/code/sessionStore.js +162 -0
- package/src/code/taskDecomposer.js +269 -0
- package/src/code/tools/bash.js +53 -0
- package/src/code/tools/common.js +42 -0
- package/src/code/tools/edit.js +70 -0
- package/src/code/tools/read.js +44 -0
- package/src/code/tools/write.js +35 -0
- package/src/code/tui.js +1580 -0
- package/src/config.js +47 -1
- package/src/context/decisions.js +12 -2
- package/src/context/index.js +18 -1
- package/src/context/sync.js +127 -0
- package/src/daemon/agentProcessManager.js +74 -0
- package/src/daemon/cronOps.js +241 -0
- package/src/daemon/index.js +661 -488
- package/src/daemon/ipcServer.js +99 -0
- package/src/daemon/ops.js +417 -179
- package/src/daemon/promptLoop.js +319 -0
- package/src/daemon/promptRequest.js +101 -0
- package/src/daemon/providerSessions.js +32 -17
- package/src/daemon/reporting.js +90 -0
- package/src/daemon/run.js +2 -5
- package/src/daemon/status.js +24 -1
- package/src/init/index.js +68 -14
- package/src/online/bridge.js +663 -0
- package/src/online/client.js +245 -0
- package/src/online/runner.js +253 -0
- package/src/online/server.js +992 -0
- package/src/online/tokens.js +103 -0
- package/src/report/store.js +331 -0
- package/src/shared/eventContract.js +35 -0
- package/src/shared/ptySocketContract.js +21 -0
- package/src/status/index.js +50 -17
- package/src/terminal/adapterContract.js +87 -0
- package/src/terminal/adapterRouter.js +84 -0
- package/src/terminal/adapters/externalAdapter.js +14 -0
- package/src/terminal/adapters/internalAdapter.js +13 -0
- package/src/terminal/adapters/internalPtyAdapter.js +42 -0
- package/src/terminal/adapters/internalQueueAdapter.js +37 -0
- package/src/terminal/adapters/terminalAdapter.js +31 -0
- package/src/terminal/adapters/tmuxAdapter.js +30 -0
- package/src/ufoo/agentsStore.js +69 -3
- package/src/utils/banner.js +5 -2
- package/scripts/.archived/bash-to-js-migration/README.md +0 -46
- package/scripts/.archived/bash-to-js-migration/banner.sh +0 -89
- package/scripts/.archived/bash-to-js-migration/bus-alert.sh +0 -6
- package/scripts/.archived/bash-to-js-migration/bus-autotrigger.sh +0 -6
- package/scripts/.archived/bash-to-js-migration/bus-daemon.sh +0 -231
- package/scripts/.archived/bash-to-js-migration/bus-inject.sh +0 -176
- package/scripts/.archived/bash-to-js-migration/bus-listen.sh +0 -6
- package/scripts/.archived/bash-to-js-migration/bus.sh +0 -986
- package/scripts/.archived/bash-to-js-migration/context-decisions.sh +0 -167
- package/scripts/.archived/bash-to-js-migration/context-doctor.sh +0 -72
- package/scripts/.archived/bash-to-js-migration/context-lint.sh +0 -110
- package/scripts/.archived/bash-to-js-migration/doctor.sh +0 -22
- package/scripts/.archived/bash-to-js-migration/init.sh +0 -247
- package/scripts/.archived/bash-to-js-migration/skills.sh +0 -113
- package/scripts/.archived/bash-to-js-migration/status.sh +0 -125
- package/scripts/banner.sh +0 -2
- package/src/bus/API_DESIGN.md +0 -204
package/src/init/index.js
CHANGED
|
@@ -72,8 +72,11 @@ class UfooInit {
|
|
|
72
72
|
fs.writeFileSync(agentsFile, content, "utf8");
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
// CLAUDE.md
|
|
76
|
-
|
|
75
|
+
// 仅在不存在时创建 CLAUDE.md;存在时保留用户文件类型(普通文件或 symlink)
|
|
76
|
+
const claudeStat = this.safeLstat(claudeFile);
|
|
77
|
+
if (!claudeStat) {
|
|
78
|
+
fs.writeFileSync(claudeFile, "AGENTS.md\n", "utf8");
|
|
79
|
+
}
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
/**
|
|
@@ -111,36 +114,87 @@ class UfooInit {
|
|
|
111
114
|
return;
|
|
112
115
|
}
|
|
113
116
|
|
|
114
|
-
|
|
117
|
+
const template = fs.readFileSync(this.agentsTemplate, "utf8");
|
|
118
|
+
const targets = this.resolveTemplateTargets(project);
|
|
119
|
+
if (targets.length === 0) {
|
|
120
|
+
console.log("[template] No target markdown files found, skipping");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
115
123
|
|
|
116
|
-
const
|
|
117
|
-
|
|
124
|
+
const labels = targets.map((file) => path.relative(project, file) || path.basename(file));
|
|
125
|
+
console.log(`[template] Injecting ufoo template into: ${labels.join(", ")}`);
|
|
118
126
|
|
|
119
|
-
const
|
|
127
|
+
for (const file of targets) {
|
|
128
|
+
this.injectTemplateIntoFile(file, template);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
console.log("[template] Done");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
safeLstat(filePath) {
|
|
135
|
+
try {
|
|
136
|
+
return fs.lstatSync(filePath);
|
|
137
|
+
} catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
resolveTemplateTargets(project) {
|
|
143
|
+
const agentsFile = path.resolve(path.join(project, "AGENTS.md"));
|
|
144
|
+
const claudeFile = path.resolve(path.join(project, "CLAUDE.md"));
|
|
145
|
+
const targets = new Set();
|
|
146
|
+
|
|
147
|
+
if (fs.existsSync(agentsFile)) {
|
|
148
|
+
targets.add(agentsFile);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const claudeStat = this.safeLstat(claudeFile);
|
|
152
|
+
if (!claudeStat) return Array.from(targets);
|
|
153
|
+
|
|
154
|
+
if (claudeStat.isSymbolicLink()) {
|
|
155
|
+
try {
|
|
156
|
+
const rawTarget = fs.readlinkSync(claudeFile);
|
|
157
|
+
const sourceFile = path.resolve(path.dirname(claudeFile), rawTarget);
|
|
158
|
+
const projectRoot = path.resolve(project);
|
|
159
|
+
const inProject =
|
|
160
|
+
sourceFile === projectRoot ||
|
|
161
|
+
sourceFile.startsWith(`${projectRoot}${path.sep}`);
|
|
162
|
+
if (inProject) {
|
|
163
|
+
targets.add(sourceFile);
|
|
164
|
+
} else {
|
|
165
|
+
console.warn(`[template] CLAUDE.md symlink target outside project, skipped: ${sourceFile}`);
|
|
166
|
+
}
|
|
167
|
+
} catch {
|
|
168
|
+
// ignore broken symlink
|
|
169
|
+
}
|
|
170
|
+
return Array.from(targets);
|
|
171
|
+
}
|
|
120
172
|
|
|
121
|
-
//
|
|
173
|
+
// CLAUDE.md 为独立文件时,双文件都注入模板
|
|
174
|
+
targets.add(claudeFile);
|
|
175
|
+
return Array.from(targets);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
injectTemplateIntoFile(filePath, template) {
|
|
179
|
+
if (!fs.existsSync(filePath)) return;
|
|
180
|
+
|
|
181
|
+
let content = fs.readFileSync(filePath, "utf8");
|
|
122
182
|
const marker = "<!-- ufoo-template -->";
|
|
123
183
|
if (content.includes(marker)) {
|
|
124
|
-
// 替换现有块
|
|
125
184
|
const startIdx = content.indexOf(marker);
|
|
126
185
|
const endIdx = content.indexOf(marker, startIdx + marker.length);
|
|
127
|
-
|
|
128
186
|
if (endIdx !== -1) {
|
|
129
187
|
content =
|
|
130
188
|
content.slice(0, startIdx) +
|
|
131
189
|
`${marker}\n${template}\n${marker}` +
|
|
132
190
|
content.slice(endIdx + marker.length);
|
|
133
191
|
} else {
|
|
134
|
-
// 只有开始标记,追加到末尾
|
|
135
192
|
content += `\n${marker}\n${template}\n${marker}\n`;
|
|
136
193
|
}
|
|
137
194
|
} else {
|
|
138
|
-
// 追加到末尾
|
|
139
195
|
content += `\n${marker}\n${template}\n${marker}\n`;
|
|
140
196
|
}
|
|
141
|
-
|
|
142
|
-
fs.writeFileSync(agentsFile, content, "utf8");
|
|
143
|
-
console.log("[template] Done");
|
|
197
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
144
198
|
}
|
|
145
199
|
|
|
146
200
|
/**
|