codebee 0.1.0 → 0.1.1

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/app/ui/style.css CHANGED
@@ -1288,7 +1288,7 @@ details.prow-hidden[open] > summary { margin-bottom: 6px; }
1288
1288
  background: var(--panel2, var(--panel)); color: var(--text);
1289
1289
  border: 1px solid var(--border-strong); border-radius: 8px; resize: vertical;
1290
1290
  }
1291
- /* 代码版本隔离面板:任务分支 tutti/<id> 的变更快照 + 合并/丢弃裁决 */
1291
+ /* 代码版本隔离面板:任务分支 codebee/<id> 的变更快照 + 合并/丢弃裁决 */
1292
1292
  .rd-git {
1293
1293
  margin-top: 10px; padding: 10px 12px;
1294
1294
  background: var(--panel); border: 1px solid var(--border-strong); border-radius: 10px;
package/bin/tutti.js CHANGED
@@ -6,8 +6,9 @@
6
6
  * 找不到就报错并给出安装指引(不写 postinstall,避免在别人机器上制造环境事故)。
7
7
  *
8
8
  * 安全边界:
9
- * - 子进程可执行文件全部是本文件内的字面量(py / python / python3),
10
- * 参数数组全由字面量常量拼成,不启用 shell;
9
+ * - 子进程可执行文件全部是本文件内的字面量(py / python / python3)——包括
10
+ * TUTTI_PYTHON 覆盖时:它只允许在这三个字面量里选一个,绝不拼接任意路径;
11
+ * - 参数数组全由字面量常量拼成,不启用 shell;
11
12
  * - 探测只传 `--version`(不向解释器传递任何代码);Windows 商店的 python.exe
12
13
  * 假占位会非零退出,被 catch 后自然跳过;
13
14
  * - 用户参数逐个过白名单校验(仅字母数字与 _ - . : = / @ % 空格),
@@ -76,7 +77,7 @@ function guide() {
76
77
  return 'CodeBee 需要本机安装 Python 3.8+(npm 包不含解释器)。\n'
77
78
  + ' · 安装:' + url + '\n'
78
79
  + ' · Windows 安装时勾选 “Add python.exe to PATH”(自带 py 启动器)\n'
79
- + '装好后重新运行:tutti';
80
+ + '装好后重新运行:codebee';
80
81
  }
81
82
 
82
83
  const py = resolvePython();
@@ -99,20 +100,45 @@ for (const a of process.argv.slice(2)) {
99
100
  }
100
101
  }
101
102
 
102
- // CLI 转发契约:tutti 之后的用户参数(已过白名单)原样作为 main.py 的 argv。
103
+ // CLI 转发契约:codebee 之后的用户参数(已过白名单)原样作为 main.py 的 argv。
104
+ // 控制台日志即见:GBK 控制台下强制 UTF-8 输出(否则中文 print 触发 UnicodeEncodeError 静默卡死)。
105
+ const childEnv = Object.assign({}, process.env, { PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' });
106
+ // TUTTI_PYTHON 覆盖解释器:只允许在三个字面量里选(py/python/python3,.exe
107
+ // 后缀可选、大小写不限)——环境变量永远只做「选择题」,不做「填空题」;
108
+ // 机器上有多个解释器且探测选错时,用它切换。
109
+ let exe = py.name;
110
+ const ovRaw = String(process.env.TUTTI_PYTHON || '').trim().toLowerCase();
111
+ const ov = ovRaw.endsWith('.exe') ? ovRaw.slice(0, -4) : ovRaw;
112
+ if (ov === 'python') {
113
+ exe = 'python';
114
+ } else if (ov === 'python3') {
115
+ exe = 'python3';
116
+ } else if (ov === 'py') {
117
+ exe = 'py';
118
+ }
119
+
103
120
  let child;
104
- if (py.name === 'py') {
105
- child = spawn('py', ['-3', MAIN, ...userArgs], { stdio: 'inherit' });
106
- } else if (py.name === 'python') {
107
- child = spawn('python', [MAIN, ...userArgs], { stdio: 'inherit' });
121
+ if (exe === 'py') {
122
+ child = spawn('py', ['-3', MAIN, ...userArgs], { stdio: 'inherit', env: childEnv });
123
+ } else if (exe === 'python') {
124
+ child = spawn('python', [MAIN, ...userArgs], { stdio: 'inherit', env: childEnv });
108
125
  } else {
109
- child = spawn('python3', [MAIN, ...userArgs], { stdio: 'inherit' });
126
+ child = spawn('python3', [MAIN, ...userArgs], { stdio: 'inherit', env: childEnv });
110
127
  }
128
+ console.log('[CodeBee] 正在启动(Python: ' + exe + ')… 浏览器将自动打开 http://127.0.0.1:8765;'
129
+ + '本窗口保持开着就是服务,Ctrl+C 退出。');
111
130
 
112
131
  for (const sig of ['SIGINT', 'SIGTERM']) {
113
132
  process.on(sig, () => { try { child.kill(sig); } catch (e) { /* 已退出 */ } });
114
133
  }
134
+ const t0 = Date.now();
115
135
  child.on('exit', (code, signal) => {
136
+ if (!signal && code != null && code !== 0 && Date.now() - t0 < 4000) {
137
+ // 秒退:多半是 py 启动器指到了坏解释器(如损坏的 Anaconda)。给排障出口。
138
+ console.error('[CodeBee] 启动失败:Python 进程 ' + (code ? '退出码 ' + code : '异常终止') + '。'
139
+ + '\n · 运行 python --version 确认可用且为 3.8+'
140
+ + '\n · 若装有多个 Python,可设环境变量 TUTTI_PYTHON 切换(cmd:set TUTTI_PYTHON=python)');
141
+ }
116
142
  process.exit(signal ? 1 : (code == null ? 0 : code));
117
143
  });
118
144
  child.on('error', (e) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebee",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "CodeBee · 多智能体编排台 — 统一编排本机 AI 编码 CLI(Codex / Claude Code / QwenCode / OpenCode / Aider…):目标→拆解→路由→执行→验证→跨厂商评审→修复→报告。纯 Python 标准库实现,本地 Web UI。",
5
5
  "license": "MIT",
6
6
  "bin": {