fix(setup): code review issues — provider URLs, readline leak, variable shadowing #221

Closed
opened 2026-05-13 01:38:08 +00:00 by xiaoju · 0 comments
Owner

Background

Code review of the setup subcommand (dispatch.ts, providers.yaml, preset-providers.ts, setup.ts).

🔴 Critical

1. promptSecretresolve 变量名遮蔽 path import

dispatch.ts:4 imports resolve from node:path,而 dispatch.ts:156 的 Promise callback 参数也叫 resolve。第 334 行又用了 path 的 resolve()。当前没 bug 但极其脆弱,应改名为 donefulfill

2. readline 泄漏

collectInteractiveSetup 中(dispatch.ts:245),invalid choice 时直接 return err(...) 但没调 rl.close()。应用 try/finally 确保关闭。

3. Anthropic / Gemini URL 不是 OpenAI 兼容的

providers.yaml 中 Anthropic (https://api.anthropic.com/v1) 和 Gemini (https://generativelanguage.googleapis.com/v1beta) 的原生 API 不走 OpenAI 兼容格式,用户选了会直接报错。要么标注需要代理,要么删掉。

providers.yaml:55 写的 https://api.z.ai/api/paas/v4z.ai 不是智谱的域名,正确的是 https://open.bigmodel.cn/api/paas/v4

⚠️ Warning

5. 类型定义位置违反约定

PresetProvider 定义在 preset-providers.tsCmdSetupSuccess 定义在 setup.ts,应移到 types.ts("types in types.ts" 约定)。

6. process.exit(130) 在 raw mode 里

dispatch.ts:185 — Ctrl+C 时直接 exit,应先 setRawMode(false) 再退出,否则可能破坏终端状态。

7. fetchAvailableModels 静默失败

dispatch.ts:220 — 失败时返回 [],应加 debug log(用 createLogger)方便排查。

💡 Suggestion

  • workspace.ts 用字符串数组拼 bundle.ts,脆弱且无法编译期检查,建议改用 template 文件
  • NON_CHAT_RE 过滤器是 DashScope 特有的(cosyvoice, sambert 等),加注释说明
  • interactive mode、loadPresetProviders、错误路径缺少测试覆盖

小橘 🍊(NEKO Team)

## Background Code review of the `setup` subcommand (dispatch.ts, providers.yaml, preset-providers.ts, setup.ts). ## 🔴 Critical ### 1. `promptSecret` 中 `resolve` 变量名遮蔽 path import `dispatch.ts:4` imports `resolve` from `node:path`,而 `dispatch.ts:156` 的 Promise callback 参数也叫 `resolve`。第 334 行又用了 path 的 `resolve()`。当前没 bug 但极其脆弱,应改名为 `done` 或 `fulfill`。 ### 2. readline 泄漏 `collectInteractiveSetup` 中(dispatch.ts:245),invalid choice 时直接 `return err(...)` 但没调 `rl.close()`。应用 `try/finally` 确保关闭。 ### 3. Anthropic / Gemini URL 不是 OpenAI 兼容的 `providers.yaml` 中 Anthropic (`https://api.anthropic.com/v1`) 和 Gemini (`https://generativelanguage.googleapis.com/v1beta`) 的原生 API 不走 OpenAI 兼容格式,用户选了会直接报错。要么标注需要代理,要么删掉。 `providers.yaml:55` 写的 `https://api.z.ai/api/paas/v4`,`z.ai` 不是智谱的域名,正确的是 `https://open.bigmodel.cn/api/paas/v4`。 ## ⚠️ Warning ### 5. 类型定义位置违反约定 `PresetProvider` 定义在 `preset-providers.ts`,`CmdSetupSuccess` 定义在 `setup.ts`,应移到 `types.ts`("types in types.ts" 约定)。 ### 6. `process.exit(130)` 在 raw mode 里 `dispatch.ts:185` — Ctrl+C 时直接 exit,应先 `setRawMode(false)` 再退出,否则可能破坏终端状态。 ### 7. `fetchAvailableModels` 静默失败 `dispatch.ts:220` — 失败时返回 `[]`,应加 debug log(用 `createLogger`)方便排查。 ## 💡 Suggestion - `workspace.ts` 用字符串数组拼 `bundle.ts`,脆弱且无法编译期检查,建议改用 template 文件 - `NON_CHAT_RE` 过滤器是 DashScope 特有的(cosyvoice, sambert 等),加注释说明 - interactive mode、`loadPresetProviders`、错误路径缺少测试覆盖 --- 小橘 🍊(NEKO Team)
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#221