@vibeapi/api-helper 0.0.25 → 0.0.28
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 +17 -17
- package/dist/__tests__/claude-code-manager.test.js +1 -1
- package/dist/__tests__/claude-code-manager.test.js.map +1 -1
- package/dist/__tests__/command.test.js +1 -1
- package/dist/__tests__/command.test.js.map +1 -1
- package/dist/__tests__/commands.test.js +1 -1
- package/dist/__tests__/config-profiles.test.js +1 -1
- package/dist/__tests__/config.test.js +1 -1
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/env-cleanup.test.d.ts +1 -0
- package/dist/__tests__/env-cleanup.test.js +1 -0
- package/dist/__tests__/env-cleanup.test.js.map +1 -0
- package/dist/__tests__/extra-commands.test.js +1 -1
- package/dist/__tests__/i18n.test.js +1 -1
- package/dist/__tests__/i18n.test.js.map +1 -1
- package/dist/__tests__/model-registry.test.js +1 -1
- package/dist/__tests__/model-registry.test.js.map +1 -1
- package/dist/__tests__/opencode-manager.test.js +1 -1
- package/dist/__tests__/runtime-options.test.js +1 -1
- package/dist/__tests__/secret-store.test.js +1 -1
- package/dist/__tests__/tool-adapters.test.js +1 -1
- package/dist/__tests__/tool-adapters.test.js.map +1 -1
- package/dist/__tests__/tool-manager.test.js +1 -1
- package/dist/__tests__/tool-manager.test.js.map +1 -1
- package/dist/commands/completion.js +1 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/lib/claude-code-manager.d.ts +0 -8
- package/dist/lib/claude-code-manager.js +1 -1
- package/dist/lib/claude-code-manager.js.map +1 -1
- package/dist/lib/command.d.ts +5 -0
- package/dist/lib/command.js +1 -1
- package/dist/lib/command.js.map +1 -1
- package/dist/lib/config.d.ts +27 -19
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/env-cleanup.d.ts +23 -0
- package/dist/lib/env-cleanup.js +1 -0
- package/dist/lib/env-cleanup.js.map +1 -0
- package/dist/lib/i18n.d.ts +6 -0
- package/dist/lib/i18n.js +1 -1
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/secret-store.js +1 -1
- package/dist/lib/tool-manager.d.ts +2 -2
- package/dist/lib/tools/backup.d.ts +8 -1
- package/dist/lib/tools/backup.js +1 -1
- package/dist/lib/tools/backup.js.map +1 -1
- package/dist/lib/tools/opencode.js +1 -1
- package/dist/lib/tools/opencode.js.map +1 -1
- package/dist/lib/tools/types.d.ts +5 -5
- package/dist/lib/tools/types.js +1 -1
- package/dist/lib/wizard.d.ts +7 -2
- package/dist/lib/wizard.js +1 -1
- package/dist/lib/wizard.js.map +1 -1
- package/dist/locales/en_US.json +38 -33
- package/dist/locales/zh_CN.json +39 -34
- package/dist/models.json +2 -2
- package/dist/utils/logger.js +1 -1
- package/models.json +2 -2
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# @vibeapi/api-helper
|
|
2
2
|
|
|
3
|
-
> 一条命令,在 Claude Code /
|
|
3
|
+
> 一条命令,在 Claude Code / Codex / OpenClaw / Hermes / AtomCode 之间统一配置 API Key 与模型。
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@vibeapi/api-helper)
|
|
6
6
|
[](https://nodejs.org)
|
|
7
7
|
|
|
8
|
-
CLI 名:`
|
|
8
|
+
CLI 名:`vibecli`(也可用 `api-helper`)。需要 **Node.js >= 20**。
|
|
9
9
|
|
|
10
10
|
## 安装 / 运行
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npx @vibeapi/api-helper
|
|
14
|
-
npm install -g @vibeapi/api-helper # 或全局安装后用
|
|
13
|
+
npx @vibeapi/api-helper@latest # 免安装直接跑(@latest 确保拿到最新版)
|
|
14
|
+
npm install -g @vibeapi/api-helper # 或全局安装后用 vibecli
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
**npmjs.com 连不上时走 CNB 镜像**(同步发布):
|
|
@@ -25,34 +25,34 @@ npm install -g @vibeapi/api-helper
|
|
|
25
25
|
## 快速开始
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
vibecli init # 向导:API Key → 选工具 → 配置该工具的模型(中文系统自动中文界面,非中文系统先选语言)
|
|
29
|
+
vibecli status # 查看当前配置
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
非交互(CI):
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
vibecli auth sk-xxx --non-interactive
|
|
36
|
+
vibecli config claude-code --non-interactive
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
## 能做什么
|
|
40
40
|
|
|
41
|
-
- **多工具一键配置**:把当前 API Key / 模型注入 Claude Code、
|
|
41
|
+
- **多工具一键配置**:把当前 API Key / 模型注入 Claude Code、Codex、OpenClaw、Hermes、AtomCode(OpenCode 暂时下架,`vibecli config opencode` 仍可用)。
|
|
42
42
|
- **按工具选模型**:使用默认 / 实时从 API 拉取 / 内置预设 / 手动输入;每个工具可用不同模型。
|
|
43
|
-
- Claude Code 默认用 Claude 组合(opus 为 1M 变体 `claude-opus-4-8[1m]
|
|
44
|
-
- **改前自动备份 + 一键还原**:覆盖配置前先快照(每文件留 10 份),`
|
|
45
|
-
- **多 Profile + 加密密钥**:work/personal 各自独立;API Key 经 AES-256-GCM 存 `~/.
|
|
43
|
+
- Claude Code 默认用 Claude 组合(sonnet 为 1M 变体 `claude-sonnet-5[1m]`,opus 为 1M 变体 `claude-opus-4-8[1m]`);Codex 默认 `gpt-5.6-sol`,其余工具默认 `gpt-5.5`。
|
|
44
|
+
- **改前自动备份 + 一键还原**:覆盖配置前先快照(每文件留 10 份),`vibecli config <tool> restore` 随时回退;还原本身也可再撤销。
|
|
45
|
+
- **多 Profile + 加密密钥**:work/personal 各自独立;API Key 经 AES-256-GCM 存 `~/.vibecli/secrets.enc`,绝不明文落盘。
|
|
46
46
|
- **CI 友好**:所有命令支持 `--json` / `--non-interactive` / `--yes` / `--dry-run` / `--no-color`。
|
|
47
47
|
|
|
48
48
|
## 常用命令
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
vibecli config <tool> # 配置某工具(选模型 → 应用 / 移除 / 还原)
|
|
52
|
+
vibecli config <tool> restore # 还原该工具到上次更改前
|
|
53
|
+
vibecli config tool-model set codex gpt-5.6-sol # 单独给某工具指定模型
|
|
54
|
+
vibecli config profile use work # 切换 profile
|
|
55
|
+
vibecli doctor # 健康巡检
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
> 完整命令、旗标、配置文件结构、自动化与安全细节见 **[docs/reference.md](./docs/reference.md)**。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as t,expect as n,beforeEach as o,afterEach as s,vi as i}from"vitest";import{mkdirSync as a,rmSync as r,existsSync as O,readFileSync as g}from"fs";import{join as l}from"path";import{tmpdir as d}from"os";const v=l(d(),`
|
|
1
|
+
import{describe as e,it as t,expect as n,beforeEach as o,afterEach as s,vi as i}from"vitest";import{mkdirSync as a,rmSync as r,existsSync as O,readFileSync as g}from"fs";import{join as l}from"path";import{tmpdir as d}from"os";const v=l(d(),`vibecli-cc-${Date.now()}-${Math.random().toString(36).slice(2)}`);i.mock("os",async()=>({...await i.importActual("os"),homedir:()=>v})),e("ClaudeCodeManager",()=>{let e;o(async()=>{a(v,{recursive:!0}),({claudeCodeManager:e}=await import("../lib/claude-code-manager.js"))}),s(()=>{try{r(v,{recursive:!0,force:!0})}catch{}}),t("returns empty settings when file is missing",()=>{const t=e.getSettings();n(t).toEqual({})}),t("persists and reads settings via atomic write",()=>{e.saveSettings({env:{ANTHROPIC_AUTH_TOKEN:"tk",FOO:"bar"}});const t=l(v,".claude","settings.json");n(O(t)).toBe(!0);const o=JSON.parse(g(t,"utf-8"));n(o.env.ANTHROPIC_AUTH_TOKEN).toBe("tk");const s=e.getSettings();n(s.env?.ANTHROPIC_AUTH_TOKEN).toBe("tk")}),t("returns empty MCP config when file is missing",()=>{n(e.getMCPConfig()).toEqual({})}),t("marks onboarding completed and stores api credentials",()=>{e.loadPrivateConfig("sk-test",{haiku:"h",sonnet:"s",opus:"o",reasoning:"r"});const t=e.getSettings();n(t.env?.ANTHROPIC_AUTH_TOKEN).toBe("sk-test"),n(t.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe("h"),n(t.env?.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe("s"),n(t.env?.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe("o"),n(t.env?.ANTHROPIC_MODEL).toBe("o");const o=e.getMCPConfig();n(o.hasCompletedOnboarding).toBe(!0)}),t("always writes the model env vars, even for default models",async()=>{const{DEFAULT_MODELS:t}=await import("../lib/config.js");e.loadPrivateConfig("sk-test",{...t});const o=e.getSettings();n(o.env?.ANTHROPIC_AUTH_TOKEN).toBe("sk-test"),n(o.env?.ANTHROPIC_BASE_URL).toBeDefined(),n(o.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe(t.haiku),n(o.env?.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe(t.sonnet),n(o.env?.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe(t.opus),n(o.env?.ANTHROPIC_MODEL).toBe(t.opus),n(t.sonnet).toBe("claude-sonnet-5[1m]"),n(t.opus).toContain("[1m]")}),t("refreshes model env vars on reload (no stale values)",async()=>{const{DEFAULT_MODELS:t}=await import("../lib/config.js");e.loadPrivateConfig("sk-test",{...t,opus:"glm-5",sonnet:"glm-5",haiku:"glm-5"}),n(e.getSettings().env?.ANTHROPIC_MODEL).toBe("glm-5"),e.loadPrivateConfig("sk-test",{...t}),n(e.getSettings().env?.ANTHROPIC_MODEL).toBe(t.opus),n(e.getSettings().env?.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe(t.sonnet)}),t("applies the top-level model from settings-template.json",()=>{e.loadPrivateConfig("sk-test",{haiku:"h",sonnet:"s",opus:"o",reasoning:"r"}),n(e.getSettings().model).toBe("opus[1m]")}),t("removes private env vars on unload but preserves user vars",()=>{e.saveSettings({env:{ANTHROPIC_AUTH_TOKEN:"tk",ANTHROPIC_BASE_URL:"https://x",CUSTOM_FLAG:"keep-me"}}),e.unloadPrivateConfig();const t=e.getSettings();n(t.env?.ANTHROPIC_AUTH_TOKEN).toBeUndefined(),n(t.env?.ANTHROPIC_BASE_URL).toBeUndefined(),n(t.env?.CUSTOM_FLAG).toBe("keep-me")}),t("drops env field entirely when no vars remain after unload",()=>{e.saveSettings({env:{ANTHROPIC_AUTH_TOKEN:"tk"}}),e.unloadPrivateConfig();const t=e.getSettings();n(t.env).toBeUndefined()}),t("detectCurrentConfig returns null when no token configured",()=>{const t=e.detectCurrentConfig();n(t.apiKey).toBeNull()}),t("detectCurrentConfig returns the configured token",()=>{e.saveSettings({env:{ANTHROPIC_AUTH_TOKEN:"sk-detect"}}),n(e.detectCurrentConfig().apiKey).toBe("sk-detect")}),t("experimental feature: set / get / remove are idempotent",()=>{e.setExperimentalFeature("FOO_FLAG","1"),n(e.getExperimentalFeature("FOO_FLAG")).toBe("1"),e.setExperimentalFeature("FOO_FLAG","1"),n(e.getExperimentalFeature("FOO_FLAG")).toBe("1"),e.removeExperimentalFeature("FOO_FLAG"),n(e.getExperimentalFeature("FOO_FLAG")).toBeUndefined(),n(()=>e.removeExperimentalFeature("FOO_FLAG")).not.toThrow()}),t("saveMCPConfig persists onto disk",()=>{e.saveMCPConfig({hasCompletedOnboarding:!0});const t=l(v,".claude.json");n(O(t)).toBe(!0);const o=JSON.parse(g(t,"utf-8"));n(o.hasCompletedOnboarding).toBe(!0)})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-code-manager.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"claude-code-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-code-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as t,beforeEach as
|
|
1
|
+
import{describe as e,it as o,expect as t,beforeEach as n,afterEach as a,vi as s}from"vitest";import{mkdirSync as i,rmSync as c}from"fs";import{join as r}from"path";import{tmpdir as m}from"os";const p=r(m(),`vibecli-cmd-${Date.now()}-${Math.random().toString(36).slice(2)}`);e("Command class",()=>{let e;n(()=>{i(p,{recursive:!0}),e=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=p}),a(()=>{void 0!==e?process.env.VIBECLI_TEST_HOME=e:delete process.env.VIBECLI_TEST_HOME;try{c(p,{recursive:!0,force:!0})}catch{}}),o("constructs and exposes commander program",async()=>{const{Command:e}=await import("../lib/command.js"),o=(new e).getProgram();t(o).toBeDefined(),t(o.name()).toBe("vibecli")}),o("registers expected subcommands",async()=>{const{Command:e}=await import("../lib/command.js"),o=(new e).getProgram().commands.map(e=>e.name());t(o).toContain("init"),t(o).toContain("lang"),t(o).toContain("auth"),t(o).toContain("doctor"),t(o).toContain("status"),t(o).toContain("enter")}),o("exposes --base global option",async()=>{const{Command:e}=await import("../lib/command.js"),o=(new e).getProgram().options.map(e=>e.long);t(o).toContain("--base")}),o("exposes a version derived from package.json",async()=>{const{Command:e}=await import("../lib/command.js"),o=(new e).getProgram();t(typeof o.version).toBe("function")})}),e("config tool via commander honors global --non-interactive",()=>{let e;n(()=>{i(p,{recursive:!0}),e=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=p}),a(async()=>{const{resetRuntimeOptions:o}=await import("../lib/runtime-options.js");o(),void 0!==e?process.env.VIBECLI_TEST_HOME=e:delete process.env.VIBECLI_TEST_HOME;try{c(p,{recursive:!0,force:!0})}catch{}}),o("config <tool> --non-interactive resolves without opening the interactive menu",async()=>{const{Command:e}=await import("../lib/command.js"),o=new e,n=[],a=s.spyOn(console,"log").mockImplementation((...e)=>{n.push(e.join(" "))});try{await o.execute(["config","atomcode","--non-interactive"])}finally{a.mockRestore()}t(n.join("\n")).toMatch(/AtomCode|API/i)})}),e("command --base preflight",()=>{let e;n(()=>{i(p,{recursive:!0}),e=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=p}),a(()=>{void 0!==e?process.env.VIBECLI_TEST_HOME=e:delete process.env.VIBECLI_TEST_HOME;try{c(p,{recursive:!0,force:!0})}catch{}}),o("execute() applies --base before parse",async()=>{const{configManager:e}=await import("../lib/config.js"),{Command:o}=await import("../lib/command.js"),n=new o,a=s.spyOn(e,"setBaseUrl");try{await n.execute(["--base","https://example.com","--help"])}catch{}t(a).toHaveBeenCalledWith("https://example.com")}),o("execute() also accepts --base=URL form",async()=>{const{configManager:e}=await import("../lib/config.js"),{Command:o}=await import("../lib/command.js"),n=new o,a=s.spyOn(e,"setBaseUrl");try{await n.execute(["--base=https://eq.example.com","--help"])}catch{}t(a).toHaveBeenCalledWith("https://eq.example.com")})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../src/__tests__/command.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../src/__tests__/command.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as a,it as o,expect as t,beforeEach as e,afterEach as n,vi as s}from"vitest";import{mkdirSync as i,rmSync as m}from"fs";import{join as r}from"path";import{tmpdir as c}from"os";const d=r(c(),`
|
|
1
|
+
import{describe as a,it as o,expect as t,beforeEach as e,afterEach as n,vi as s}from"vitest";import{mkdirSync as i,rmSync as m}from"fs";import{join as r}from"path";import{tmpdir as c}from"os";const d=r(c(),`vibecli-handlers-${Date.now()}-${Math.random().toString(36).slice(2)}`);a("command handlers",()=>{let r,c;e(()=>{i(d,{recursive:!0}),r=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=d,c=s.spyOn(console,"log").mockImplementation(()=>{})}),n(()=>{void 0!==r?process.env.VIBECLI_TEST_HOME=r:delete process.env.VIBECLI_TEST_HOME;try{m(d,{recursive:!0,force:!0})}catch{}s.restoreAllMocks()}),a("langCommand",()=>{o("show prints current language without throwing",async()=>{const{langCommand:a}=await import("../commands/lang.js");await a(["show"]),t(c).toHaveBeenCalled()}),o("set updates language for a supported locale",async()=>{const{langCommand:a}=await import("../commands/lang.js"),{configManager:o}=await import("../lib/config.js");await a(["set","en_US"]),t(o.getLang()).toBe("en_US")}),o("set rejects an unsupported locale",async()=>{const{langCommand:a}=await import("../commands/lang.js");await t(a(["set","xx_YY"])).resolves.toBeUndefined(),t(c).toHaveBeenCalled()})}),a("statusCommand",()=>{o("prints something without throwing",async()=>{const{statusCommand:a}=await import("../commands/status.js");await a(),t(c).toHaveBeenCalled()})}),a("authCommand",()=>{o("reload exits early when no api key is configured",async()=>{const{authCommand:a}=await import("../commands/auth.js");await a(["reload","claude"]),t(c).toHaveBeenCalled()}),o("reload rejects unsupported tools",async()=>{const{authCommand:a}=await import("../commands/auth.js");await a(["reload","unsupported-tool"]),t(c).toHaveBeenCalled()}),o("directAuth path attempts validation",async()=>{const a=await import("../lib/api-validator.js"),o=s.spyOn(a,"validateApiKey").mockResolvedValue({valid:!1,error:"invalid_api_key"}),{authCommand:e}=await import("../commands/auth.js");await e(["some-token"]),t(o).toHaveBeenCalled()})}),a("doctorCommand",()=>{o("runs without throwing when no api key",async()=>{const{doctorCommand:a}=await import("../commands/doctor.js");await a(),t(c).toHaveBeenCalled()})}),a("configCommand",()=>{o("exists and is invokable",async()=>{const a=await import("../commands/config.js");t(typeof a.configCommand).toBe("function")})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as a,expect as t,beforeEach as o,afterEach as n,vi as
|
|
1
|
+
import{describe as e,it as a,expect as t,beforeEach as o,afterEach as n,vi as i}from"vitest";import{mkdirSync as r,rmSync as s,existsSync as c,readFileSync as g}from"fs";import{join as l}from"path";import{tmpdir as f}from"os";import*as p from"js-yaml";e("ConfigManager profiles & presets & backups",()=>{let e,m,M;o(async()=>{e=l(f(),`vibecli-profile-${Date.now()}-${Math.random().toString(36).slice(2)}`),r(e,{recursive:!0}),m=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e,i.resetModules(),M=await import("../lib/config.js")}),n(()=>{void 0!==m?process.env.VIBECLI_TEST_HOME=m:delete process.env.VIBECLI_TEST_HOME;try{s(e,{recursive:!0,force:!0})}catch{}}),a("starts with a default profile",()=>{const e=M.configManager.listProfiles();t(e).toContain(M.DEFAULT_PROFILE_NAME),t(M.configManager.getActiveProfileName()).toBe(M.DEFAULT_PROFILE_NAME)}),a("persists API key on the active profile only",()=>{M.configManager.setApiKey("key-default"),M.configManager.createProfile("alt"),M.configManager.setActiveProfile("alt"),M.configManager.setApiKey("key-alt"),M.configManager.setActiveProfile(M.DEFAULT_PROFILE_NAME),t(M.configManager.getApiKey()).toBe("key-default"),M.configManager.setActiveProfile("alt"),t(M.configManager.getApiKey()).toBe("key-alt")}),a("refuses to delete the only remaining profile",()=>{t(()=>M.configManager.deleteProfile(M.DEFAULT_PROFILE_NAME)).toThrow()}),a("deletes a profile and re-elects an active one",()=>{M.configManager.createProfile("alt"),M.configManager.setActiveProfile("alt"),M.configManager.deleteProfile("alt"),t(M.configManager.listProfiles()).not.toContain("alt"),t(M.configManager.getActiveProfileName()).toBe(M.DEFAULT_PROFILE_NAME)}),a("saves and applies custom presets",()=>{const e={haiku:"h-x",sonnet:"s-x",opus:"o-x",reasoning:"r-x"};M.configManager.saveCustomPreset("mine",e);const a=M.configManager.getCustomPresets();t(a.mine.models).toEqual(e),t(typeof a.mine.updated_at).toBe("string"),M.configManager.setModels(M.DEFAULT_MODELS),M.configManager.setModels(a.mine.models),t(M.configManager.getModels()).toEqual(e),M.configManager.deleteCustomPreset("mine"),t(M.configManager.getCustomPresets()).not.toHaveProperty("mine")}),a("creates manual backups and lists them",()=>{M.configManager.setApiKey("key-1");const e=M.configManager.createBackup("snapshot one");t(c(e)).toBe(!0);const a=M.configManager.listBackups();t(a.length).toBeGreaterThan(0),t(a[0].name).toBe(e.split(/[/\\]/).pop())}),a("restores a previous backup",async()=>{M.configManager.setApiKey("key-old");const e=M.configManager.createBackup();M.configManager.setApiKey("key-new"),i.resetModules();const a=await import("../lib/config.js");a.configManager.restoreBackup(e.split(/[/\\]/).pop()),t(a.configManager.getApiKey()).toBe("key-old")}),a("rejects backup names containing path-traversal segments",()=>{t(()=>M.configManager.restoreBackup("..")).toThrow(/Invalid backup name/),t(()=>M.configManager.restoreBackup("../etc/passwd")).toThrow(/Invalid backup name/),t(()=>M.configManager.restoreBackup("a/b.yaml")).toThrow(/Invalid backup name/),t(()=>M.configManager.restoreBackup("a\\b.yaml")).toThrow(/Invalid backup name/)}),a("migrates legacy plan field on disk",async()=>{const a=l(e,".vibecli");r(a,{recursive:!0}),(await import("fs")).writeFileSync(l(a,"config.yaml"),p.dump({lang:"zh_CN",api_key:"legacy-key",plan:"legacy-plan"}),"utf-8"),i.resetModules();const o=await import("../lib/config.js");t(o.configManager.getApiKey()).toBe("legacy-key");const n=p.load(g(l(a,"config.yaml"),"utf-8"));t(n).not.toHaveProperty("plan"),t(n).toHaveProperty("profiles")}),a("revokeApiKey clears both yaml profile and the encrypted secrets entry",async()=>{M.configManager.setApiKey("sk-revoke-test"),t(M.configManager.getApiKey()).toBe("sk-revoke-test");const a=await import("../lib/secret-store.js");t(a.secretStore.getApiKey(M.DEFAULT_PROFILE_NAME)).toBe("sk-revoke-test"),M.configManager.revokeApiKey(),t(M.configManager.getApiKey()).toBeUndefined();const o=p.load(g(l(e,".vibecli","config.yaml"),"utf-8"));t(o.profiles?.[M.DEFAULT_PROFILE_NAME]?.api_key).toBeUndefined(),t(a.secretStore.getApiKey(M.DEFAULT_PROFILE_NAME)).toBeUndefined(),t(a.secretStore.listProfilesWithKeys()).not.toContain(M.DEFAULT_PROFILE_NAME)}),a("--base=URL form is recognized as a transient runtime override (not persisted)",async()=>{M.configManager.setApiKey("sk-anchor");const{Command:a}=await import("../lib/command.js"),o=new a;try{await o.execute(["--base=https://transient.example.com","--help"])}catch{}t(M.configManager.getBaseUrl()).toBe("https://transient.example.com");const n=p.load(g(l(e,".vibecli","config.yaml"),"utf-8")),i=M.configManager.getActiveProfileName();t(n.profiles?.[i]?.base_url).not.toBe("https://transient.example.com")})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as
|
|
1
|
+
import{describe as e,it as o,expect as c,beforeEach as t,afterEach as i,vi as n}from"vitest";import{mkdirSync as s,rmSync as r,existsSync as a,readFileSync as l,writeFileSync as g}from"fs";import{join as p}from"path";import{tmpdir as v}from"os";import*as u from"js-yaml";e("legacy ~/.chelper migration",()=>{let e,l;t(()=>{e=p(v(),`vibecli-mig-${Date.now()}-${Math.random().toString(36).slice(2)}`),s(e,{recursive:!0}),l=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e}),i(()=>{void 0!==l?process.env.VIBECLI_TEST_HOME=l:delete process.env.VIBECLI_TEST_HOME;try{r(e,{recursive:!0,force:!0})}catch{}}),o("renames ~/.chelper to ~/.vibecli on startup (whole-directory move)",async()=>{const o=p(e,".chelper");s(o,{recursive:!0}),g(p(o,"config.yaml"),u.dump({lang:"zh_CN"}),"utf-8"),g(p(o,"secrets.enc"),"opaque-envelope","utf-8"),n.resetModules();const{configManager:t}=await import("../lib/config.js");c(a(p(e,".vibecli","config.yaml"))).toBe(!0),c(a(p(e,".vibecli","secrets.enc"))).toBe(!0),c(a(o)).toBe(!1),c(t.getLang()).toBe("zh_CN")}),o("migrates into a pre-created empty ~/.vibecli (e.g. logger made the dir first)",async()=>{s(p(e,".vibecli","logs"),{recursive:!0});const o=p(e,".chelper");s(o,{recursive:!0}),g(p(o,"config.yaml"),u.dump({lang:"zh_CN"}),"utf-8"),g(p(o,"secrets.enc"),"opaque-envelope","utf-8"),n.resetModules();const{configManager:t}=await import("../lib/config.js");c(a(p(e,".vibecli","config.yaml"))).toBe(!0),c(a(p(e,".vibecli","secrets.enc"))).toBe(!0),c(a(o)).toBe(!1),c(t.getLang()).toBe("zh_CN")}),o("leaves an existing ~/.vibecli untouched even when ~/.chelper also exists",async()=>{s(p(e,".vibecli"),{recursive:!0}),g(p(e,".vibecli","config.yaml"),u.dump({lang:"en_US"}),"utf-8"),s(p(e,".chelper"),{recursive:!0}),g(p(e,".chelper","config.yaml"),u.dump({lang:"zh_CN"}),"utf-8"),n.resetModules();const{configManager:o}=await import("../lib/config.js");c(o.getLang()).toBe("en_US"),c(a(p(e,".chelper"))).toBe(!0)})}),e("ConfigManager",()=>{let e,n;t(()=>{e=p(v(),`vibecli-test-${Date.now()}-${Math.random().toString(36).slice(2)}`),s(e,{recursive:!0}),n=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e}),i(()=>{void 0!==n?process.env.VIBECLI_TEST_HOME=n:delete process.env.VIBECLI_TEST_HOME;try{r(e,{recursive:!0,force:!0})}catch{}}),o("should detect first run when no config exists",async()=>{const o=p(e,".vibecli","config.yaml");c(a(o)).toBe(!1)}),o("should save and load config correctly",async()=>{const o=p(e,".vibecli");s(o,{recursive:!0});const t=p(o,"config.yaml"),i=u.dump({lang:"zh_CN",api_key:"test-key-123"});g(t,i,"utf-8");const n=u.load(l(t,"utf-8"));c(n.lang).toBe("zh_CN"),c(n.api_key).toBe("test-key-123")}),o("should handle missing config gracefully",()=>{const o=p(e,".vibecli","config.yaml");c(a(o)).toBe(!1)}),o("should migrate old config with plan field",()=>{const o=p(e,".vibecli");s(o,{recursive:!0});const t=p(o,"config.yaml");g(t,u.dump({lang:"en_US",plan:"some-plan",api_key:"key123"}),"utf-8");const i=u.load(l(t,"utf-8"));c(i.plan).toBe("some-plan"),c(i.lang).toBe("en_US")}),o("should create backup directory on save",()=>{const o=p(e,".vibecli");s(o,{recursive:!0});const t=p(o,"backups");c(a(t)).toBe(!1)})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe as e,it as s,expect as o,beforeEach as t,afterEach as n}from"vitest";import{mkdirSync as r,rmSync as a,readFileSync as l,writeFileSync as i,existsSync as p}from"fs";import{join as c}from"path";import{tmpdir as A}from"os";import{cleanupAnthropicEnvVars as _,cleanupShellRcEnvVars as I,getShellRcFilePath as E}from"../lib/env-cleanup.js";const P=["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","SHELL","VIBECLI_TEST_HOME"];e("env-cleanup",()=>{let h,v;t(()=>{h=c(A(),`vibecli-env-${Date.now()}-${Math.random().toString(36).slice(2)}`),r(h,{recursive:!0}),v=Object.fromEntries(P.map(e=>[e,process.env[e]])),process.env.VIBECLI_TEST_HOME=h,process.env.SHELL="/bin/bash",delete process.env.ANTHROPIC_API_KEY,delete process.env.ANTHROPIC_BASE_URL}),n(()=>{for(const e of P)void 0!==v[e]?process.env[e]=v[e]:delete process.env[e];try{a(h,{recursive:!0,force:!0})}catch{}}),e("getShellRcFilePath",()=>{s.skipIf("win32"===process.platform)("maps common shells to their rc files",()=>{process.env.SHELL="/bin/bash",o(E()).toBe(c(h,".bashrc")),process.env.SHELL="/usr/bin/zsh",o(E()).toBe(c(h,".zshrc")),process.env.SHELL="/usr/bin/fish",o(E()).toBe(c(h,".config","fish","config.fish")),process.env.SHELL="/bin/dash",o(E()).toBe(c(h,".profile"))})}),e("cleanupAnthropicEnvVars",()=>{s("returns empty and touches nothing when the vars are absent",()=>{const e=c(h,".bashrc");i(e,"export ANTHROPIC_API_KEY=sk-stale\n","utf-8"),o(_()).toEqual([]),o(l(e,"utf-8")).toContain("ANTHROPIC_API_KEY")}),s("clears both vars from process.env and reports them",()=>{process.env.ANTHROPIC_API_KEY="sk-leak",process.env.ANTHROPIC_BASE_URL="https://leak.example.com";const e=_();o(e.sort()).toEqual(["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL"]),o(process.env.ANTHROPIC_API_KEY).toBeUndefined(),o(process.env.ANTHROPIC_BASE_URL).toBeUndefined()}),s("reports only the var that was actually set",()=>{process.env.ANTHROPIC_BASE_URL="https://leak.example.com",o(_()).toEqual(["ANTHROPIC_BASE_URL"]),o(process.env.ANTHROPIC_BASE_URL).toBeUndefined()}),s.skipIf("win32"===process.platform)("strips export lines from the shell rc file but keeps other content",()=>{const e=c(h,".bashrc");i(e,['alias ll="ls -la"',"# Claude Code environment variables","export ANTHROPIC_BASE_URL=https://old.example.com","export ANTHROPIC_API_KEY=sk-old",'export PATH="$PATH:/opt/bin"',""].join("\n"),"utf-8"),process.env.ANTHROPIC_API_KEY="sk-leak",_();const s=l(e,"utf-8");o(s).not.toContain("ANTHROPIC_BASE_URL"),o(s).not.toContain("ANTHROPIC_API_KEY"),o(s).not.toContain("Claude Code environment variables"),o(s).toContain('alias ll="ls -la"'),o(s).toContain('export PATH="$PATH:/opt/bin"')}),s("survives a missing rc file",()=>{process.env.ANTHROPIC_API_KEY="sk-leak",o(p(c(h,".bashrc"))).toBe(!1),o(_()).toEqual(["ANTHROPIC_API_KEY"]),o(process.env.ANTHROPIC_API_KEY).toBeUndefined()})}),e("cleanupShellRcEnvVars",()=>{s.skipIf("win32"===process.platform)("returns false when nothing changes",()=>{i(c(h,".bashrc"),'alias ll="ls -la"\n',"utf-8"),o(I()).toBe(!1)}),s.skipIf("win32"===process.platform)("returns true when export lines were removed",()=>{i(c(h,".bashrc"),"export ANTHROPIC_API_KEY=sk-old\n","utf-8"),o(I()).toBe(!0)})})});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-cleanup.test.js","sourceRoot":"","sources":["../../src/__tests__/env-cleanup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as t,it as o,expect as e,beforeEach as s,afterEach as n,vi as a}from"vitest";import{mkdirSync as
|
|
1
|
+
import{describe as t,it as o,expect as e,beforeEach as s,afterEach as n,vi as a}from"vitest";import{mkdirSync as i,rmSync as r,writeFileSync as c}from"fs";import{join as m}from"path";import{tmpdir as p}from"os";function l(){const t={payload:null},o=a.spyOn(process.stdout,"write").mockImplementation(o=>{const e="string"==typeof o?o:Buffer.from(o).toString("utf-8");try{t.payload=JSON.parse(e)}catch{}return!0});return{captured:t,restore:()=>o.mockRestore()}}t("extra commands (logs / completion / update / bench)",()=>{let u,d;s(()=>{u=m(p(),`vibecli-extra-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(u,{recursive:!0}),d=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=u,a.resetModules()}),n(()=>{void 0!==d?process.env.VIBECLI_TEST_HOME=d:delete process.env.VIBECLI_TEST_HOME;try{r(u,{recursive:!0,force:!0})}catch{}a.restoreAllMocks()}),t("completionCommand",()=>{o("emits a script for a supported shell in JSON mode",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{captured:o,restore:s}=l(),{completionCommand:n}=await import("../commands/completion.js");await n(["zsh"]),s(),t.resetRuntimeOptions(),e(o.payload).toEqual(e.objectContaining({shell:"zsh"})),e(typeof o.payload.script).toBe("string"),e(o.payload.script).toContain("compdef")}),o("reports unsupported_shell for an unknown shell in JSON mode",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{captured:o,restore:s}=l(),{completionCommand:n}=await import("../commands/completion.js");await n(["powershell"]),s(),t.resetRuntimeOptions(),e(o.payload).toEqual(e.objectContaining({ok:!1,error:"unsupported_shell"}))})}),t("updateCommand",()=>{o("reports up_to_date when local matches latest",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const o=a.fn().mockResolvedValue({ok:!0,status:200,json:async()=>({version:"1.2.3"})}),{captured:s,restore:n}=l(),{updateCommand:i}=await import("../commands/update.js");await i({fetchFn:o,localVersion:"1.2.3"}),n(),t.resetRuntimeOptions(),e(s.payload).toEqual({current:"1.2.3",latest:"1.2.3",up_to_date:!0,error:null}),e(o).toHaveBeenCalledTimes(1)}),o("flags update available when remote is newer",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const o=a.fn().mockResolvedValue({ok:!0,status:200,json:async()=>({version:"2.0.0"})}),{captured:s,restore:n}=l(),{updateCommand:i}=await import("../commands/update.js");await i({fetchFn:o,localVersion:"1.0.0"}),n(),t.resetRuntimeOptions(),e(s.payload).toEqual(e.objectContaining({current:"1.0.0",latest:"2.0.0",up_to_date:!1,error:null}))}),o("compareSemver respects pre-release precedence (release > pre-release)",async()=>{const{compareSemver:t}=await import("../commands/update.js");e(t("1.0.0","1.0.0-alpha")).toBeGreaterThan(0),e(t("1.0.0-alpha","1.0.0")).toBeLessThan(0),e(t("1.0.1","1.0.0-zzz")).toBeGreaterThan(0),e(t("1.0.0-1","1.0.0-alpha")).toBeLessThan(0),e(t("1.0.0-alpha","1.0.0-beta")).toBeLessThan(0),e(t("1.0.0-10","1.0.0-2")).toBeGreaterThan(0),e(t("1.0.0-alpha","1.0.0-alpha.1")).toBeLessThan(0)}),o("records the error string when fetch fails",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const o=a.fn().mockRejectedValue(new Error("network down")),{captured:s,restore:n}=l(),{updateCommand:i}=await import("../commands/update.js");await i({fetchFn:o,localVersion:"1.0.0"}),n(),t.resetRuntimeOptions(),e(s.payload).toEqual(e.objectContaining({current:"1.0.0",latest:null,up_to_date:null,error:"network down"}))})}),t("benchCommand",()=>{o("returns missing_api_key in JSON mode when no key configured",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{captured:o,restore:s}=l(),{benchCommand:n}=await import("../commands/bench.js");await n([]),s(),t.resetRuntimeOptions(),e(o.payload).toEqual({ok:!1,error:"missing_api_key"})}),o("aggregates timing stats from a mocked endpoint",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0}),(await import("../lib/config.js")).configManager.setApiKey("sk-bench-test");const o=a.fn().mockResolvedValue({ok:!0,status:200,json:async()=>({})}),{captured:s,restore:n}=l(),{benchCommand:i}=await import("../commands/bench.js");await i([],{samples:3,fetchFn:o}),n(),t.resetRuntimeOptions(),e(s.payload).toEqual(e.objectContaining({ok:!0,samples:3,completed:3,errors:0})),e(o).toHaveBeenCalledTimes(3);const[r,c]=o.mock.calls[0];e(String(r)).toMatch(/\/v1\/models$/),e(c.headers.Authorization).toBe("Bearer sk-bench-test")}),o("counts non-2xx responses as errors",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0}),(await import("../lib/config.js")).configManager.setApiKey("sk-bench-test");const o=a.fn().mockResolvedValue({ok:!1,status:500,json:async()=>({})}),{captured:s,restore:n}=l(),{benchCommand:i}=await import("../commands/bench.js");await i([],{samples:2,fetchFn:o}),n(),t.resetRuntimeOptions(),e(s.payload).toEqual(e.objectContaining({ok:!1,samples:2,completed:0,errors:2}))})}),t("logsCommand",()=>{o("returns log_dir in JSON mode for the path action",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{captured:o,restore:s}=l(),{logsCommand:n}=await import("../commands/logs.js");await n(["path"]),s(),t.resetRuntimeOptions(),e(o.payload).toEqual(e.objectContaining({log_dir:e.any(String)}))}),o("lists log files with size and mtime in JSON mode",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{logger:o}=await import("../utils/logger.js"),s=o.getLogDir();i(s,{recursive:!0});const n=m(s,"2026-04-27.log");c(n,"hello world\n","utf-8");const{captured:a,restore:p}=l(),{logsCommand:u}=await import("../commands/logs.js");await u(["list"]),p(),t.resetRuntimeOptions();const d=a.payload;e(d.log_dir).toBe(s),e(Array.isArray(d.files)).toBe(!0);const g=d.files.find(t=>"2026-04-27.log"===t.name);e(g).toBeTruthy(),e(g?.size).toBeGreaterThan(0);try{r(n,{force:!0})}catch{}}),o("returns no_log_file error when tail finds nothing",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{logger:o}=await import("../utils/logger.js"),s=o.getLogDir();try{const t=await import("fs");if(t.existsSync(s))for(const o of t.readdirSync(s))if(/^\d{4}-\d{2}-\d{2}\.log$/.test(o))try{t.unlinkSync(m(s,o))}catch{}}catch{}const{captured:n,restore:a}=l(),{logsCommand:i}=await import("../commands/logs.js");await i(["tail"]),a(),t.resetRuntimeOptions(),e(n.payload).toEqual({ok:!1,error:"no_log_file"})}),o("preserves UTF-8 codepoint boundary when truncating large multibyte log",async()=>{const t=await import("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const{logger:o}=await import("../utils/logger.js"),s=o.getLogDir();i(s,{recursive:!0});const n=m(s,"2026-04-27.log"),a="中".repeat(8e3);c(n,a,"utf-8");const{captured:p,restore:u}=l(),{logsCommand:d}=await import("../commands/logs.js");await d(["tail","2026-04-27.log"]),u(),t.resetRuntimeOptions();const g=p.payload;e(g.content).toBeTruthy(),e(g.content.charCodeAt(0)).not.toBe(65533),e(/^中+$/.test(g.content)).toBe(!0);try{r(n,{force:!0})}catch{}})})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as t,beforeEach as n,afterEach as
|
|
1
|
+
import{describe as e,it as o,expect as t,beforeEach as n,afterEach as s}from"vitest";import{I18n as a}from"../lib/i18n.js";e("I18n",()=>{const c=a.getInstance();let l;n(()=>{l=c.getLocale()}),s(()=>{c.setLocale(l)}),e("getAvailableLocales",()=>{o("contains both en_US and zh_CN",()=>{const e=c.getAvailableLocales();t(e).toContain("en_US"),t(e).toContain("zh_CN")})}),e("translate",()=>{o("translates a known key in en_US",()=>{c.setLocale("en_US"),t(c.t("cli.error_general")).toBe("Error:")}),o("translates a known key in zh_CN",()=>{c.setLocale("zh_CN"),t(c.t("cli.error_general")).toBe("错误:")}),o("returns the key when not found in any locale",()=>{c.setLocale("en_US"),t(c.t("does.not.exist")).toBe("does.not.exist")}),o("interpolates {{params}}",()=>{c.setLocale("en_US");const e=c.t("cli.error_unknown",{command:"foo"});t(e).toContain("foo")}),o("keeps placeholder when param missing",()=>{c.setLocale("en_US");const e=c.t("cli.error_unknown",{});t(e).toContain("{{command}}")}),o("falls back to en_US when key missing in current locale",()=>{c.setLocale("zh_CN"),t(c.t("does.not.exist.either")).toBe("does.not.exist.either")})}),e("setLocale",()=>{o("changes the active locale",()=>{c.setLocale("en_US"),t(c.getLocale()).toBe("en_US"),c.setLocale("zh_CN"),t(c.getLocale()).toBe("zh_CN")}),o("ignores unsupported locales",()=>{c.setLocale("en_US"),c.setLocale("xx_YY"),t(c.getLocale()).toBe("en_US")})}),e("loadFromConfig",()=>{o("updates locale when supported",()=>{c.loadFromConfig("zh_CN"),t(c.getLocale()).toBe("zh_CN")}),o("ignores unsupported locale silently",()=>{c.setLocale("en_US"),c.loadFromConfig("non_existing"),t(c.getLocale()).toBe("en_US")})})}),e("detectSystemLang",()=>{const e=["LC_ALL","LC_MESSAGES","LANG","LANGUAGE"];let a;n(()=>{a=Object.fromEntries(e.map(e=>[e,process.env[e]]));for(const o of e)delete process.env[o]}),s(()=>{for(const o of e)void 0!==a[o]?process.env[o]=a[o]:delete process.env[o]}),o("returns zh_CN for Chinese POSIX locales",async()=>{const{detectSystemLang:e}=await import("../lib/i18n.js");process.env.LANG="zh_CN.UTF-8",t(e()).toBe("zh_CN"),process.env.LANG="zh_TW.Big5",t(e()).toBe("zh_CN"),delete process.env.LANG,process.env.LANGUAGE="zh_CN:en",t(e()).toBe("zh_CN")}),o("LC_ALL wins over LANG",async()=>{const{detectSystemLang:e}=await import("../lib/i18n.js");process.env.LC_ALL="zh_CN.UTF-8",process.env.LANG="en_US.UTF-8",t(e()).toBe("zh_CN")}),o("returns en_US for non-Chinese locales",async()=>{const{detectSystemLang:e}=await import("../lib/i18n.js");process.env.LANG="en_US.UTF-8",t(e()).toBe("en_US"),process.env.LANG="ja_JP.UTF-8",t(e()).toBe("en_US"),process.env.LANG="C.UTF-8",t(e()).toBe("en_US")})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/__tests__/i18n.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/__tests__/i18n.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as t,afterEach as s}from"vitest";import{getDefaultModels as r,getPresets as
|
|
1
|
+
import{describe as e,it as o,expect as t,afterEach as s}from"vitest";import{getDefaultModels as r,getPresets as l,resolvePreset as n,reloadRegistry as d,getToolDefaultModel as a,getDefaultToolModel as m}from"../lib/model-registry.js";e("ModelRegistry",()=>{s(()=>{d()}),o("should return default models",()=>{const e=r();t(e).toHaveProperty("haiku"),t(e).toHaveProperty("sonnet"),t(e).toHaveProperty("opus"),t(e).toHaveProperty("reasoning"),t(typeof e.haiku).toBe("string"),t(typeof e.sonnet).toBe("string")}),o("should return presets array",()=>{const e=l();t(Array.isArray(e)).toBe(!0),t(e.length).toBeGreaterThan(0)}),o("every preset resolves to the 4 canonical model slots",()=>{for(const e of l()){const o=n(e);t(o.haiku&&o.sonnet&&o.opus&&o.reasoning).toBeTruthy()}}),o("should resolve single-model preset correctly",()=>{const e=n({name:"Test",model:"test-model"});t(e.haiku).toBe("test-model"),t(e.sonnet).toBe("test-model"),t(e.opus).toBe("test-model"),t(e.reasoning).toBe("test-model")}),o("should resolve multi-model preset correctly",()=>{const e=n({name:"Test",models:{haiku:"h-model",sonnet:"s-model",opus:"o-model",reasoning:"r-model"}});t(e.haiku).toBe("h-model"),t(e.sonnet).toBe("s-model"),t(e.opus).toBe("o-model"),t(e.reasoning).toBe("r-model")}),o("resolves per-tool default models",()=>{t(a("claude-code")).toBe(""),t(a("codex")).toBe("gpt-5.6-sol"),t(a("hermes")).toBe("gpt-5.5"),t(a("does-not-exist")).toBe(m())}),o("should return copies, not references",()=>{const e=r(),o=r();t(e).not.toBe(o),t(e).toEqual(o)})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/model-registry.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/model-registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as i,beforeEach as t,afterEach as n,vi as r}from"vitest";import{mkdirSync as a,rmSync as p,existsSync as s,readFileSync as d}from"fs";import{join as v}from"path";import{tmpdir as f}from"os";const l=v(f(),`
|
|
1
|
+
import{describe as e,it as o,expect as i,beforeEach as t,afterEach as n,vi as r}from"vitest";import{mkdirSync as a,rmSync as p,existsSync as s,readFileSync as d}from"fs";import{join as v}from"path";import{tmpdir as f}from"os";const l=v(f(),`vibecli-oc-${Date.now()}-${Math.random().toString(36).slice(2)}`);r.mock("os",async()=>({...await r.importActual("os"),homedir:()=>l})),e("OpenCodeManager",()=>{let e;t(async()=>{a(l,{recursive:!0}),({openCodeManager:e}=await import("../lib/opencode-manager.js"))}),n(()=>{try{p(l,{recursive:!0,force:!0})}catch{}}),o("returns empty config when file missing",()=>{i(e.getConfig()).toEqual({})}),o("persists and reads config",()=>{e.saveConfig({model:"foo/bar"});const o=v(l,".config","opencode","opencode.json");i(s(o)).toBe(!0);const t=JSON.parse(d(o,"utf-8"));i(t.model).toBe("foo/bar")}),o("loadPrivateConfig sets provider and model fields",()=>{e.loadPrivateConfig("sk-x",{haiku:"h",sonnet:"s",opus:"o",reasoning:"r"});const o=e.getConfig();i(o.provider?.["private-newapi"]?.options?.apiKey).toBe("sk-x"),i(o.model).toBe("private-newapi/o"),i(o.small_model).toBe("private-newapi/h"),i(o.$schema).toBe("https://opencode.ai/config.json")}),o("loadPrivateConfig preserves other providers",()=>{e.saveConfig({provider:{other:{options:{apiKey:"keep"}}}}),e.loadPrivateConfig("sk-x",{haiku:"h",sonnet:"s",opus:"o",reasoning:"r"});const o=e.getConfig();i(o.provider?.other?.options?.apiKey).toBe("keep"),i(o.provider?.["private-newapi"]).toBeDefined()}),o("unloadPrivateConfig removes only the private-newapi keys",()=>{e.saveConfig({provider:{"private-newapi":{options:{apiKey:"x"}},other:{options:{apiKey:"keep"}}},model:"private-newapi/o",small_model:"private-newapi/h"}),e.unloadPrivateConfig();const o=e.getConfig();i(o.provider?.["private-newapi"]).toBeUndefined(),i(o.provider?.other?.options?.apiKey).toBe("keep"),i(o.model).toBeUndefined(),i(o.small_model).toBeUndefined()}),o("unloadPrivateConfig drops provider field entirely when empty",()=>{e.saveConfig({provider:{"private-newapi":{options:{apiKey:"x"}}},model:"private-newapi/o"}),e.unloadPrivateConfig();const o=e.getConfig();i(o.provider).toBeUndefined(),i(o.model).toBeUndefined()}),o("detectCurrentConfig returns null without provider",()=>{i(e.detectCurrentConfig().apiKey).toBeNull()}),o("detectCurrentConfig returns key when private-newapi present",()=>{e.saveConfig({provider:{"private-newapi":{options:{apiKey:"sk-detected"}}}}),i(e.detectCurrentConfig().apiKey).toBe("sk-detected")})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as t,it as o,expect as e,beforeEach as n,afterEach as a,vi as r}from"vitest";import{mkdirSync as i,rmSync as s}from"fs";import{join as c}from"path";import{tmpdir as p}from"os";async function m(t){return r.resetModules(),await import(t)}t("runtime options & JSON command shapes",()=>{let t,l;n(()=>{t=c(p(),`
|
|
1
|
+
import{describe as t,it as o,expect as e,beforeEach as n,afterEach as a,vi as r}from"vitest";import{mkdirSync as i,rmSync as s}from"fs";import{join as c}from"path";import{tmpdir as p}from"os";async function m(t){return r.resetModules(),await import(t)}t("runtime options & JSON command shapes",()=>{let t,l;n(()=>{t=c(p(),`vibecli-runtime-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(t,{recursive:!0}),l=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=t}),a(()=>{void 0!==l?process.env.VIBECLI_TEST_HOME=l:delete process.env.VIBECLI_TEST_HOME;try{s(t,{recursive:!0,force:!0})}catch{}r.restoreAllMocks()}),o("detects NO_COLOR env preference",async()=>{const t=await m("../lib/runtime-options.js");e(t.detectColorPreferenceFromEnv({NO_COLOR:"1"})).toBe(!1),e(t.detectColorPreferenceFromEnv({NO_COLOR:"0"})).toBe(!0),e(t.detectColorPreferenceFromEnv({})).toBe(!0)}),o("langCommand --json emits structured locale info",async()=>{const t=await m("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const o={payload:null},n=r.spyOn(process.stdout,"write").mockImplementation(t=>{const e="string"==typeof t?t:Buffer.from(t).toString("utf-8");try{o.payload=JSON.parse(e)}catch{}return!0}),a=await import("../commands/lang.js");await a.langCommand(["show"]),n.mockRestore(),t.resetRuntimeOptions(),e(o.payload).toBeTruthy(),e(o.payload.current).toBeDefined(),e(Array.isArray(o.payload.available)).toBe(!0)}),o("authCommand non-interactive without token reports token_required JSON",async()=>{const t=await m("../lib/runtime-options.js");t.setRuntimeOptions({json:!0,nonInteractive:!0});const o={payload:null},n=r.spyOn(process.stdout,"write").mockImplementation(t=>{const e="string"==typeof t?t:Buffer.from(t).toString("utf-8");try{o.payload=JSON.parse(e)}catch{}return!0}),a=await import("../commands/auth.js");await a.authCommand([]),n.mockRestore(),t.resetRuntimeOptions(),e(o.payload).toEqual(e.objectContaining({ok:!1,error:"token_required"}))}),o("statusCommand --json includes profile metadata",async()=>{const t=await m("../lib/runtime-options.js");t.setRuntimeOptions({json:!0});const o={payload:null},n=r.spyOn(process.stdout,"write").mockImplementation(t=>{const e="string"==typeof t?t:Buffer.from(t).toString("utf-8");try{o.payload=JSON.parse(e)}catch{}return!0}),a=await import("../commands/status.js");await a.statusCommand(),n.mockRestore(),t.resetRuntimeOptions(),e(o.payload).toBeTruthy(),e(o.payload.active_profile).toBeDefined(),e(Array.isArray(o.payload.profiles)).toBe(!0)}),o("configCommand profile list runs in non-interactive JSON-friendly mode",async()=>{const t=await m("../lib/runtime-options.js");t.setRuntimeOptions({nonInteractive:!0});try{const t=await import("../commands/config.js");await t.configCommand(["profile","list"])}finally{t.resetRuntimeOptions()}}),o("dry-run prevents profile deletion and emits dry_run JSON payload",async()=>{const t=await m("../lib/runtime-options.js");t.setRuntimeOptions({json:!0,dryRun:!0,nonInteractive:!0});const o={payload:null},n=r.spyOn(process.stdout,"write").mockImplementation(t=>{const e="string"==typeof t?t:Buffer.from(t).toString("utf-8");try{o.payload=JSON.parse(e)}catch{}return!0});try{const t=await import("../lib/config.js");t.configManager.createProfile("to-be-kept");const n=t.configManager.listProfiles();e(n).toContain("to-be-kept");const a=await import("../commands/config.js");await a.configCommand(["profile","delete","to-be-kept"]);const r=t.configManager.listProfiles();e(r).toContain("to-be-kept"),e(o.payload).toEqual(e.objectContaining({dry_run:!0,payload:e.objectContaining({action:"profile_delete",name:"to-be-kept"})}))}finally{n.mockRestore(),t.resetRuntimeOptions()}}),o("dry-run prevents backup restore and emits dry_run JSON payload",async()=>{const t=await m("../lib/runtime-options.js"),o=await import("../lib/config.js");o.configManager.setApiKey("key-original");const n=o.configManager.createBackup();o.configManager.setApiKey("key-mutated");const a=n.split(/[/\\]/).pop();t.setRuntimeOptions({json:!0,dryRun:!0,nonInteractive:!0});const i={payload:null},s=r.spyOn(process.stdout,"write").mockImplementation(t=>{const o="string"==typeof t?t:Buffer.from(t).toString("utf-8");try{i.payload=JSON.parse(o)}catch{}return!0});try{const t=await import("../commands/config.js");await t.configCommand(["backup","restore",a]),e(o.configManager.getApiKey()).toBe("key-mutated"),e(i.payload).toEqual(e.objectContaining({dry_run:!0,payload:e.objectContaining({action:"backup_restore",name:a})}))}finally{s.mockRestore(),t.resetRuntimeOptions()}})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as t,expect as r,beforeEach as s,afterEach as o,vi as i}from"vitest";import{mkdirSync as a,rmSync as c,existsSync as n,statSync as l}from"fs";import{join as p}from"path";import{tmpdir as f}from"os";e("SecretStore",()=>{let e,y,u;s(async()=>{e=p(f(),`
|
|
1
|
+
import{describe as e,it as t,expect as r,beforeEach as s,afterEach as o,vi as i}from"vitest";import{mkdirSync as a,rmSync as c,existsSync as n,statSync as l}from"fs";import{join as p}from"path";import{tmpdir as f}from"os";e("SecretStore",()=>{let e,y,u;s(async()=>{e=p(f(),`vibecli-secret-${Date.now()}-${Math.random().toString(36).slice(2)}`),a(e,{recursive:!0}),y=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e,i.resetModules(),u=await import("../lib/secret-store.js")}),o(()=>{void 0!==y?process.env.VIBECLI_TEST_HOME=y:delete process.env.VIBECLI_TEST_HOME;try{c(e,{recursive:!0,force:!0})}catch{}}),t("returns undefined when no key has been stored",()=>{r(u.secretStore.getApiKey("default")).toBeUndefined(),r(u.secretStore.listProfilesWithKeys()).toEqual([])}),t("round-trips an api key through encrypt + decrypt",()=>{u.secretStore.setApiKey("default","sk-abc-123"),r(u.secretStore.getApiKey("default")).toBe("sk-abc-123");const t=p(e,".vibecli","secrets.enc");r(n(t)).toBe(!0)}),t("isolates keys per profile",()=>{u.secretStore.setApiKey("default","key-default"),u.secretStore.setApiKey("alt","key-alt"),r(u.secretStore.getApiKey("default")).toBe("key-default"),r(u.secretStore.getApiKey("alt")).toBe("key-alt"),r(u.secretStore.listProfilesWithKeys().sort()).toEqual(["alt","default"])}),t("produces a stable, non-empty fingerprint for stored keys",()=>{r(u.secretStore.fingerprint("default")).toBe(""),u.secretStore.setApiKey("default","sk-fingerprint-test");const e=u.secretStore.fingerprint("default"),t=u.secretStore.fingerprint("default");r(e).toHaveLength(12),r(e).toBe(t)}),t("removes a key on deleteApiKey",()=>{u.secretStore.setApiKey("default","key-default"),u.secretStore.setApiKey("alt","key-alt"),u.secretStore.deleteApiKey("alt"),r(u.secretStore.getApiKey("alt")).toBeUndefined(),r(u.secretStore.getApiKey("default")).toBe("key-default")}),t("does not write a yaml-readable plaintext file",async()=>{u.secretStore.setApiKey("default","sk-very-secret-value");const t=p(e,".vibecli","secrets.enc"),s=l(t);r(s.size).toBeGreaterThan(0);const o=(await import("fs")).readFileSync(t,"utf-8");r(o).not.toContain("sk-very-secret-value");const i=JSON.parse(o);r(i.version).toBe(2),r(typeof i.iv).toBe("string"),r(typeof i.salt).toBe("string"),r(typeof i.auth_tag).toBe("string"),r(typeof i.cipher_text).toBe("string")}),t("migrates inline yaml api_key into encrypted store on first read",async()=>{const t=await import("js-yaml"),s=await import("fs"),o=p(e,".vibecli");a(o,{recursive:!0}),s.writeFileSync(p(o,"config.yaml"),t.dump({active_profile:"default",profiles:{default:{api_key:"sk-inline-legacy",base_url:"https://api.example.com",models:{plan:"a",solve:"b",scaffold:"c"}}},presets:{}}),"utf-8"),i.resetModules();const c=await import("../lib/config.js");r(c.configManager.getApiKey()).toBe("sk-inline-legacy");const n=t.load(s.readFileSync(p(o,"config.yaml"),"utf-8"));r(n.profiles.default.api_key).toBeUndefined();const l=await import("../lib/secret-store.js");r(l.secretStore.getApiKey("default")).toBe("sk-inline-legacy")}),t("persists across fresh module instances (cross-instance round-trip)",async()=>{u.secretStore.setApiKey("default","sk-cross-instance"),r(u.secretStore.getApiKey("default")).toBe("sk-cross-instance"),i.resetModules();const e=await import("../lib/secret-store.js");r(e.secretStore).not.toBe(u.secretStore),r(e.secretStore.getApiKey("default")).toBe("sk-cross-instance")}),t("upgrades a legacy v1 envelope to v2 on first read",async()=>{const t=await import("fs"),s=await import("crypto"),{hostname:o,userInfo:c}=await import("os"),n=s.randomBytes(16),l=s.randomBytes(12),f=`${c().username}:${o()}:vibecli-secret-store`,y=s.scryptSync(f,n,32,{N:16384,maxmem:67108864}),u=s.createCipheriv("aes-256-gcm",y,l),d=Buffer.from(JSON.stringify({api_keys:{default:"sk-legacy-v1"}}),"utf-8"),S=Buffer.concat([u.update(d),u.final()]),g=u.getAuthTag(),m={version:1,iv:l.toString("base64"),salt:n.toString("base64"),auth_tag:g.toString("base64"),cipher_text:S.toString("base64")},v=p(e,".vibecli");a(v,{recursive:!0});const B=p(v,"secrets.enc");t.writeFileSync(B,JSON.stringify(m),"utf-8"),i.resetModules();const k=await import("../lib/secret-store.js");r(k.secretStore.getApiKey("default")).toBe("sk-legacy-v1");const b=JSON.parse(t.readFileSync(B,"utf-8"));r(b.version).toBe(2)}),t("refuses to overwrite an undecryptable envelope on setApiKey",async()=>{const t=await import("fs"),s=p(e,".vibecli");a(s,{recursive:!0});const o={version:2,iv:Buffer.alloc(12,1).toString("base64"),salt:Buffer.alloc(16,2).toString("base64"),auth_tag:Buffer.alloc(16,3).toString("base64"),cipher_text:Buffer.alloc(48,4).toString("base64")};t.writeFileSync(p(s,"secrets.enc"),JSON.stringify(o),"utf-8"),i.resetModules();const c=await import("../lib/secret-store.js");r(c.secretStore.getApiKey("default")).toBeUndefined(),r(c.secretStore.getLastDecryptError()).not.toBeNull(),r(()=>c.secretStore.setApiKey("default","sk-new-key")).toThrow(c.SecretStoreDecryptError);const n=JSON.parse(t.readFileSync(p(s,"secrets.enc"),"utf-8"));r(n.cipher_text).toBe(o.cipher_text),c.secretStore.deleteAll(),c.secretStore.setApiKey("default","sk-new-key"),r(c.secretStore.getApiKey("default")).toBe("sk-new-key")})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe as e,it as o,expect as t,beforeEach as s,afterEach as r,vi as a}from"vitest";import{mkdirSync as i,rmSync as n,readFileSync as
|
|
1
|
+
import{describe as e,it as o,expect as t,beforeEach as s,afterEach as r,vi as a}from"vitest";import{mkdirSync as i,rmSync as n,readFileSync as l,writeFileSync as d,readdirSync as c}from"fs";import{join as p}from"path";import{tmpdir as m}from"os";import*as u from"js-yaml";import*as f from"@iarna/toml";const g={haiku:"h-model",sonnet:"s-model",opus:"o-model",reasoning:"r-model"},v=(e={})=>({apiKey:"sk-test-123",baseUrl:"https://gateway.example.com",models:g,...e});e("tool adapters",()=>{let c,g,h;s(async()=>{c=p(m(),`vibecli-tools-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(c,{recursive:!0}),g=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=c,a.resetModules(),h=await import("../lib/tools/registry.js")}),r(()=>{void 0!==g?process.env.VIBECLI_TEST_HOME=g:delete process.env.VIBECLI_TEST_HOME;try{n(c,{recursive:!0,force:!0})}catch{}}),o("registry exposes the six expected tools",()=>{t(Object.keys(h.TOOL_ADAPTERS).sort()).toEqual(["atomcode","claude-code","codex","hermes","opencode","openclaw"].sort())}),e("codex",()=>{const e=()=>f.parse(l(p(c,".codex","config.toml"),"utf-8"));o("writes a branded provider, primary model and OPENAI_API_KEY auth",()=>{h.getAdapter("codex").loadPrivateConfig(v());const o=e();t(o.model).toBe("o-model"),t(o.model_provider).toBe("custom"),t(o.model_reasoning_effort).toBe("xhigh"),t(o.model_providers.custom.base_url).toBe("https://gateway.example.com/v1"),t(o.model_providers.custom.name).toBe("custom"),t(o.model_providers.custom.wire_api).toBe("responses"),t(o.model_providers.custom.requires_openai_auth).toBe(!0),t(o.features).toEqual({goals:!0,js_repl:!1}),t(JSON.parse(l(p(c,".codex","auth.json"),"utf-8")).OPENAI_API_KEY).toBe("sk-test-123"),t(h.getAdapter("codex").detectCurrentConfig()).toEqual({apiKey:"sk-test-123"})}),o("preserves foreign providers on load and unload",()=>{const o=h.getAdapter("codex");i(p(c,".codex"),{recursive:!0});const s=f.stringify({model_providers:{other:{base_url:"https://other"}}});d(p(c,".codex","config.toml"),s,"utf-8"),o.loadPrivateConfig(v()),t(e().model_providers.other.base_url).toBe("https://other"),o.unloadPrivateConfig();const r=e();t(r.model_providers.custom).toBeUndefined(),t(r.model_providers.other.base_url).toBe("https://other"),t(r.model_provider).toBeUndefined()})}),e("atomcode",()=>{const e=()=>f.parse(l(p(c,".atomcode","config.toml"),"utf-8"));o("writes an openai provider with key and model",()=>{const o=h.getAdapter("atomcode");o.loadPrivateConfig(v());const s=e();t(s.default_provider).toBe("VibeAPI"),t(s.providers.VibeAPI.type).toBe("openai"),t(s.providers.VibeAPI.api_key).toBe("sk-test-123"),t(s.providers.VibeAPI.model).toBe("o-model"),t(s.providers.VibeAPI.base_url).toBe("https://gateway.example.com/v1"),t(o.detectCurrentConfig()).toEqual({apiKey:"sk-test-123"}),o.unloadPrivateConfig(),t(e().providers?.VibeAPI).toBeUndefined()})}),e("openclaw",()=>{const e=()=>JSON.parse(l(p(c,".openclaw","openclaw.json"),"utf-8"));o("writes provider and agents.defaults.model.primary",()=>{const o=h.getAdapter("openclaw");o.loadPrivateConfig(v());const s=e();t(s.models.providers.vibeapi.apiKey).toBe("sk-test-123"),t(s.models.providers.vibeapi.baseUrl).toBe("https://gateway.example.com/v1"),t(s.models.providers.vibeapi.models[0].id).toBe("o-model"),t(s.agents.defaults.model.primary).toBe("vibeapi/o-model"),t(o.detectCurrentConfig()).toEqual({apiKey:"sk-test-123"}),o.unloadPrivateConfig();const r=e();t(r.models.providers.vibeapi).toBeUndefined(),t(r.agents.defaults.model.primary).toBeUndefined()})}),e("hermes",()=>{const e=()=>l(p(c,".hermes",".env"),"utf-8");o("writes config.yaml model block and .env api key",()=>{const o=h.getAdapter("hermes");o.loadPrivateConfig(v());const s=u.load(l(p(c,".hermes","config.yaml"),"utf-8"));t(s.model.provider).toBe("custom"),t(s.model.base_url).toBe("https://gateway.example.com/v1"),t(s.model.default).toBe("o-model"),t(e()).toContain("VIBEAPI_API_KEY=sk-test-123"),t(o.detectCurrentConfig()).toEqual({apiKey:"sk-test-123"}),o.unloadPrivateConfig(),t(e()).not.toContain("sk-test-123")})}),o("withV1 does not double-append a version suffix",()=>{h.getAdapter("codex").loadPrivateConfig(v({baseUrl:"https://gw.example.com/v1"}));const e=f.parse(l(p(c,".codex","config.toml"),"utf-8"));t(e.model_providers.custom.base_url).toBe("https://gw.example.com/v1")})}),e("config backups before write",()=>{let e,u,g,h;const B=(e,o)=>c(e).filter(e=>e.startsWith(`${o}.bak-`));s(async()=>{e=p(m(),`vibecli-bak-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(e,{recursive:!0}),u=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e,a.resetModules(),g=await import("../lib/tools/registry.js"),h=await import("../lib/tools/backup.js")}),r(()=>{void 0!==u?process.env.VIBECLI_TEST_HOME=u:delete process.env.VIBECLI_TEST_HOME;try{n(e,{recursive:!0,force:!0})}catch{}}),o("does not back up on the first write (no original file)",()=>{g.getAdapter("codex").loadPrivateConfig(v()),t(B(p(e,".codex"),"config.toml")).toHaveLength(0)}),o("snapshots the original before overwriting on a second load",()=>{const o=g.getAdapter("codex");o.loadPrivateConfig(v({baseUrl:"https://first.example.com"})),o.loadPrivateConfig(v({baseUrl:"https://second.example.com"}));const s=p(e,".codex"),r=B(s,"config.toml");t(r).toHaveLength(1);const a=f.parse(l(p(s,r[0]),"utf-8"));t(a.model_providers.custom.base_url).toBe("https://first.example.com/v1")}),o("keeps at most 10 backups per file",()=>{const o=p(e,"sample.json");d(o,"v0","utf-8");for(let e=1;e<=15;e++)h.backupBeforeWrite(o),d(o,`v${e}`,"utf-8");t(B(e,"sample.json").length).toBe(h.MAX_TOOL_BACKUPS)}),o("restoreBackup brings back the latest snapshot and snapshots current first (undoable)",()=>{const o=p(e,"cfg.json");d(o,"v1","utf-8"),h.backupBeforeWrite(o),d(o,"v2","utf-8"),h.backupBeforeWrite(o),d(o,"v3","utf-8");const s=h.restoreBackup(o);t(s.restored).toBe(!0),t(l(o,"utf-8")).toBe("v2"),t(s.snapshot).toBeTruthy();const r=h.restoreBackup(o);t(r.restored).toBe(!0),t(l(o,"utf-8")).toBe("v3")}),o("atomicWriteFile creates the dir, writes, and leaves no temp file",()=>{const o=p(e,"nested","deep","out.json");h.atomicWriteFile(o,'{"ok":true}'),t(l(o,"utf-8")).toBe('{"ok":true}');const s=c(p(e,"nested","deep")).filter(e=>e.includes(".tmp-"));t(s).toEqual([])}),o("restoreBackup reports no_backup when there are none",()=>{const o=p(e,"fresh.json");d(o,"only","utf-8");const s=h.restoreBackup(o);t(s.restored).toBe(!1),t(s.reason).toBe("no_backup")}),o("ToolManager.restorePrivateConfig restores a tool config in place",async()=>{const o=g.getAdapter("codex"),{toolManager:s}=await import("../lib/tool-manager.js");o.loadPrivateConfig(v({baseUrl:"https://first.example.com"})),o.loadPrivateConfig(v({baseUrl:"https://second.example.com"}));const r=p(e,".codex","config.toml");t(l(r,"utf-8")).toContain("https://second.example.com/v1");const a=s.restorePrivateConfig("codex");t(a.some(e=>e.result.restored)).toBe(!0),t(l(r,"utf-8")).toContain("https://first.example.com/v1")})}),e("non-Claude tools use their per-tool default model",()=>{let e,d,c,g;const v=()=>({apiKey:"sk-x",baseUrl:"https://gw.example.com",models:{...g}});s(async()=>{e=p(m(),`vibecli-def-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(e,{recursive:!0}),d=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e,a.resetModules(),c=await import("../lib/tools/registry.js"),({DEFAULT_MODELS:g}=await import("../lib/config.js"))}),r(()=>{void 0!==d?process.env.VIBECLI_TEST_HOME=d:delete process.env.VIBECLI_TEST_HOME;try{n(e,{recursive:!0,force:!0})}catch{}}),o("codex uses gpt-5.6-sol when models are default",()=>{c.getAdapter("codex").loadPrivateConfig(v());const o=f.parse(l(p(e,".codex","config.toml"),"utf-8"));t(o.model).toBe("gpt-5.6-sol")}),o("atomcode uses gpt-5.5 when models are default",()=>{c.getAdapter("atomcode").loadPrivateConfig(v());const o=f.parse(l(p(e,".atomcode","config.toml"),"utf-8"));t(o.providers.VibeAPI.model).toBe("gpt-5.5")}),o("openclaw uses gpt-5.5 when models are default",()=>{c.getAdapter("openclaw").loadPrivateConfig(v());const o=JSON.parse(l(p(e,".openclaw","openclaw.json"),"utf-8"));t(o.models.providers.vibeapi.models[0].id).toBe("gpt-5.5"),t(o.agents.defaults.model.primary).toBe("vibeapi/gpt-5.5")}),o("hermes uses gpt-5.5 when models are default",()=>{c.getAdapter("hermes").loadPrivateConfig(v());const o=u.load(l(p(e,".hermes","config.yaml"),"utf-8"));t(o.model.default).toBe("gpt-5.5")}),o("honors a custom model over the per-tool default",()=>{c.getAdapter("codex").loadPrivateConfig({apiKey:"sk-x",baseUrl:"https://gw.example.com",models:{...g,opus:"my-custom-model"}});const o=f.parse(l(p(e,".codex","config.toml"),"utf-8"));t(o.model).toBe("my-custom-model")})}),e("flexible model configuration",()=>{let e,l,d;s(async()=>{e=p(m(),`vibecli-models-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(e,{recursive:!0}),l=process.env.VIBECLI_TEST_HOME,process.env.VIBECLI_TEST_HOME=e,a.resetModules(),d=await import("../lib/config.js")}),r(()=>{void 0!==l?process.env.VIBECLI_TEST_HOME=l:delete process.env.VIBECLI_TEST_HOME;try{n(e,{recursive:!0,force:!0})}catch{}}),o("preserves custom (non-canonical) model slots",()=>{d.configManager.setModels({...g,vision:"vision-model"});const e=d.configManager.getModels();t(e.opus).toBe("o-model"),t(e.vision).toBe("vision-model")}),o("merges per-tool overrides over base models",()=>{d.configManager.setModels(g),d.configManager.setToolModel("codex",{opus:"codex-only-model"}),t(d.configManager.getModelsForTool("codex").opus).toBe("codex-only-model"),t(d.configManager.getModelsForTool("hermes").opus).toBe("o-model"),t(d.configManager.getModels().opus).toBe("o-model")}),o("clears a per-tool override when set to null",()=>{d.configManager.setModels(g),d.configManager.setToolModel("codex",{opus:"x"}),d.configManager.setToolModel("codex",null),t(d.configManager.getModelsForTool("codex").opus).toBe("o-model")})});
|