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
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 指向 AGENTS.md
76
- fs.writeFileSync(claudeFile, "AGENTS.md\n", "utf8");
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
- console.log("[template] Injecting ufoo template into AGENTS.md...");
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 agentsFile = path.join(project, "AGENTS.md");
117
- let content = fs.readFileSync(agentsFile, "utf8");
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 template = fs.readFileSync(this.agentsTemplate, "utf8");
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
- // 查找或添加 ufoo 标记块
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
  /**