@vibeapi/api-helper 0.0.16 → 0.0.20

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 (117) hide show
  1. package/README.md +267 -0
  2. package/dist/__tests__/api-validator.test.d.ts +1 -0
  3. package/dist/__tests__/api-validator.test.js +1 -0
  4. package/dist/__tests__/api-validator.test.js.map +1 -0
  5. package/dist/__tests__/claude-code-manager.test.d.ts +1 -0
  6. package/dist/__tests__/claude-code-manager.test.js +1 -0
  7. package/dist/__tests__/claude-code-manager.test.js.map +1 -0
  8. package/dist/__tests__/command.test.d.ts +1 -0
  9. package/dist/__tests__/command.test.js +1 -0
  10. package/dist/__tests__/command.test.js.map +1 -0
  11. package/dist/__tests__/commands.test.d.ts +1 -0
  12. package/dist/__tests__/commands.test.js +1 -0
  13. package/dist/__tests__/commands.test.js.map +1 -0
  14. package/dist/__tests__/config-profiles.test.d.ts +1 -0
  15. package/dist/__tests__/config-profiles.test.js +1 -0
  16. package/dist/__tests__/config-profiles.test.js.map +1 -0
  17. package/dist/__tests__/config.test.d.ts +1 -0
  18. package/dist/__tests__/config.test.js +1 -0
  19. package/dist/__tests__/config.test.js.map +1 -0
  20. package/dist/__tests__/extra-commands.test.d.ts +1 -0
  21. package/dist/__tests__/extra-commands.test.js +1 -0
  22. package/dist/__tests__/extra-commands.test.js.map +1 -0
  23. package/dist/__tests__/i18n.test.d.ts +1 -0
  24. package/dist/__tests__/i18n.test.js +1 -0
  25. package/dist/__tests__/i18n.test.js.map +1 -0
  26. package/dist/__tests__/logger.test.d.ts +1 -0
  27. package/dist/__tests__/logger.test.js +1 -0
  28. package/dist/__tests__/logger.test.js.map +1 -0
  29. package/dist/__tests__/model-registry.test.d.ts +1 -0
  30. package/dist/__tests__/model-registry.test.js +1 -0
  31. package/dist/__tests__/model-registry.test.js.map +1 -0
  32. package/dist/__tests__/opencode-manager.test.d.ts +1 -0
  33. package/dist/__tests__/opencode-manager.test.js +1 -0
  34. package/dist/__tests__/opencode-manager.test.js.map +1 -0
  35. package/dist/__tests__/runtime-options.test.d.ts +1 -0
  36. package/dist/__tests__/runtime-options.test.js +1 -0
  37. package/dist/__tests__/runtime-options.test.js.map +1 -0
  38. package/dist/__tests__/secret-store.test.d.ts +1 -0
  39. package/dist/__tests__/secret-store.test.js +1 -0
  40. package/dist/__tests__/secret-store.test.js.map +1 -0
  41. package/dist/__tests__/settings-template.test.d.ts +1 -0
  42. package/dist/__tests__/settings-template.test.js +1 -0
  43. package/dist/__tests__/settings-template.test.js.map +1 -0
  44. package/dist/__tests__/string-width.test.d.ts +1 -0
  45. package/dist/__tests__/string-width.test.js +1 -0
  46. package/dist/__tests__/string-width.test.js.map +1 -0
  47. package/dist/__tests__/tool-manager.test.d.ts +1 -0
  48. package/dist/__tests__/tool-manager.test.js +1 -0
  49. package/dist/__tests__/tool-manager.test.js.map +1 -0
  50. package/dist/__tests__/wizard.test.d.ts +1 -0
  51. package/dist/__tests__/wizard.test.js +1 -0
  52. package/dist/__tests__/wizard.test.js.map +1 -0
  53. package/dist/commands/auth.js +1 -1
  54. package/dist/commands/auth.js.map +1 -1
  55. package/dist/commands/bench.d.ts +6 -0
  56. package/dist/commands/bench.js +1 -0
  57. package/dist/commands/bench.js.map +1 -0
  58. package/dist/commands/completion.d.ts +1 -0
  59. package/dist/commands/completion.js +1 -0
  60. package/dist/commands/completion.js.map +1 -0
  61. package/dist/commands/config.js +1 -1
  62. package/dist/commands/config.js.map +1 -1
  63. package/dist/commands/doctor.js +1 -1
  64. package/dist/commands/doctor.js.map +1 -1
  65. package/dist/commands/index.d.ts +5 -0
  66. package/dist/commands/index.js +1 -1
  67. package/dist/commands/index.js.map +1 -1
  68. package/dist/commands/lang.js +1 -1
  69. package/dist/commands/lang.js.map +1 -1
  70. package/dist/commands/logs.d.ts +1 -0
  71. package/dist/commands/logs.js +1 -0
  72. package/dist/commands/logs.js.map +1 -0
  73. package/dist/commands/status.d.ts +1 -0
  74. package/dist/commands/status.js +1 -0
  75. package/dist/commands/status.js.map +1 -0
  76. package/dist/commands/update.d.ts +7 -0
  77. package/dist/commands/update.js +1 -0
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/lib/api-validator.d.ts +15 -5
  80. package/dist/lib/api-validator.js +1 -1
  81. package/dist/lib/api-validator.js.map +1 -1
  82. package/dist/lib/claude-code-manager.d.ts +1 -0
  83. package/dist/lib/claude-code-manager.js +1 -1
  84. package/dist/lib/claude-code-manager.js.map +1 -1
  85. package/dist/lib/command.d.ts +1 -0
  86. package/dist/lib/command.js +1 -1
  87. package/dist/lib/command.js.map +1 -1
  88. package/dist/lib/config.d.ts +59 -26
  89. package/dist/lib/config.js +1 -1
  90. package/dist/lib/config.js.map +1 -1
  91. package/dist/lib/confirm.d.ts +12 -0
  92. package/dist/lib/confirm.js +1 -0
  93. package/dist/lib/confirm.js.map +1 -0
  94. package/dist/lib/i18n.d.ts +1 -1
  95. package/dist/lib/i18n.js +1 -1
  96. package/dist/lib/i18n.js.map +1 -1
  97. package/dist/lib/opencode-manager.js +1 -1
  98. package/dist/lib/opencode-manager.js.map +1 -1
  99. package/dist/lib/runtime-options.d.ts +17 -0
  100. package/dist/lib/runtime-options.js +1 -0
  101. package/dist/lib/runtime-options.js.map +1 -0
  102. package/dist/lib/secret-store.d.ts +29 -0
  103. package/dist/lib/secret-store.js +1 -0
  104. package/dist/lib/secret-store.js.map +1 -0
  105. package/dist/lib/tool-manager.js +1 -1
  106. package/dist/lib/tool-manager.js.map +1 -1
  107. package/dist/lib/wizard.d.ts +2 -0
  108. package/dist/lib/wizard.js +1 -1
  109. package/dist/lib/wizard.js.map +1 -1
  110. package/dist/locales/en_US.json +104 -3
  111. package/dist/locales/zh_CN.json +104 -3
  112. package/dist/models.json +7 -25
  113. package/dist/utils/logger.d.ts +9 -0
  114. package/dist/utils/logger.js +1 -1
  115. package/dist/utils/logger.js.map +1 -1
  116. package/models.json +7 -25
  117. package/package.json +9 -5
package/README.md ADDED
@@ -0,0 +1,267 @@
1
+ # @vibeapi/api-helper
2
+
3
+ > 跨工具的 AI 编程助手配置管家:一条命令在 Claude Code / OpenCode 之间统一管理 API Key、模型预设和多 Profile 配置。
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@vibeapi/api-helper.svg)](https://www.npmjs.com/package/@vibeapi/api-helper)
6
+ [![Node](https://img.shields.io/node/v/@vibeapi/api-helper.svg)](https://nodejs.org)
7
+
8
+ CLI 名:`chelper`(也可用 `api-helper`)。
9
+
10
+ ---
11
+
12
+ ## 特性
13
+
14
+ - **多 Profile**:work / personal / staging 各自独立的 api_key / base_url / 模型组合
15
+ - **加密密钥存储**:`~/.chelper/secrets.enc`(AES-256-GCM + scrypt,绑定 username:hostname,权限 `0o600`)
16
+ - **预设(Preset)**:保存任意模型组合,一键切换
17
+ - **配置备份**:手动 + 自动滚动备份,附带加密快照,支持还原
18
+ - **多工具集成**:一键把当前 profile 的配置注入 Claude Code / OpenCode
19
+ - **CI 友好**:所有命令支持 `--json` / `--non-interactive` / `--yes` / `--dry-run` / `--no-color`
20
+ - **可观测**:每日轮转日志、`bench` 端点延时基准、`update` npm 版本检查、`doctor` 健康巡检
21
+ - **i18n**:中英双语(`zh_CN` / `en_US`),随系统 locale 自动选择
22
+
23
+ ---
24
+
25
+ ## 安装
26
+
27
+ ```bash
28
+ npm install -g @vibeapi/api-helper
29
+ # 或
30
+ pnpm add -g @vibeapi/api-helper
31
+ ```
32
+
33
+ 需要 **Node.js >= 20**。
34
+
35
+ 验证:
36
+
37
+ ```bash
38
+ chelper --version
39
+ ```
40
+
41
+ ---
42
+
43
+ ## 快速开始
44
+
45
+ ```bash
46
+ # 交互式初始化(语言、API Key、模型预设、目标工具)
47
+ chelper init
48
+
49
+ # 或非交互直接写入
50
+ chelper auth sk-xxx --non-interactive
51
+ chelper config claude-code --non-interactive
52
+ ```
53
+
54
+ 查看当前状态:
55
+
56
+ ```bash
57
+ chelper status
58
+ chelper status --json # 机器可读
59
+ ```
60
+
61
+ ---
62
+
63
+ ## 命令一览
64
+
65
+ ### 认证 / 状态
66
+
67
+ | 命令 | 说明 |
68
+ |---|---|
69
+ | `chelper init` | 首次设置向导(语言、API Key、模型、工具) |
70
+ | `chelper auth <token>` | 设置 API Key 并落到加密存储 |
71
+ | `chelper auth revoke` | 撤销当前 profile 的 key(会同步清理 yaml 与 secrets.enc) |
72
+ | `chelper auth reload <claude\|claude-code\|opencode>` | 把当前 profile 配置重灌进目标工具 |
73
+ | `chelper status` | 显示当前 profile / models / tools / 指纹 |
74
+ | `chelper doctor` | 健康巡检(API Key 有效性、工具安装、配置加载) |
75
+
76
+ ### Profile / Preset / Backup
77
+
78
+ ```bash
79
+ # Profile
80
+ chelper config profile list
81
+ chelper config profile create work
82
+ chelper config profile use work
83
+ chelper config profile delete work # 支持 --dry-run / --yes
84
+
85
+ # Preset(保存当前模型组合,跨 profile 复用)
86
+ chelper config preset list
87
+ chelper config preset save fast
88
+ chelper config preset use fast
89
+ chelper config preset delete fast
90
+
91
+ # Backup(含加密 secrets 快照)
92
+ chelper config backup create initial
93
+ chelper config backup list
94
+ chelper config backup restore <name> # 支持 --dry-run / --yes
95
+ ```
96
+
97
+ ### 工具集成
98
+
99
+ ```bash
100
+ chelper config claude-code
101
+ chelper config opencode
102
+ chelper config claude-code --non-interactive # CI 模式:直接注入当前配置
103
+ ```
104
+
105
+ ### 运维
106
+
107
+ | 命令 | 说明 |
108
+ |---|---|
109
+ | `chelper logs path` | 打印日志目录 |
110
+ | `chelper logs list` | 列出所有日志文件 |
111
+ | `chelper logs tail [file]` | 输出最近内容(默认最新一天,UTF-8 安全截断) |
112
+ | `chelper bench [--samples N]` | API 端点延时基准(命中 `/v1/models`) |
113
+ | `chelper update` | 检查 npm 上是否有新版(语义化比对,支持预发布版本) |
114
+
115
+ ### 开发者
116
+
117
+ ```bash
118
+ chelper completion bash # 输出补全脚本(zsh / fish 同理)
119
+ chelper enter # 交互式主菜单
120
+ ```
121
+
122
+ ---
123
+
124
+ ## 全局旗标
125
+
126
+ | 旗标 | 作用 |
127
+ |---|---|
128
+ | `--base <url>` 或 `--base=<url>` | 临时覆盖 API base URL(不持久化) |
129
+ | `--non-interactive` | 关闭交互提示(CI 模式) |
130
+ | `--json` | 命令输出机器可读 JSON |
131
+ | `--yes` / `-y` | 自动确认带默认动作的提示 |
132
+ | `--dry-run` | 仅预演变更,不写入;输出 `dry_run` 事件 |
133
+ | `--no-color` | 禁用彩色输出(也尊重 `NO_COLOR` / `FORCE_COLOR=0`) |
134
+
135
+ `--dry-run` 已接入:`config profile delete`、`config backup restore`。
136
+
137
+ ---
138
+
139
+ ## 配置位置
140
+
141
+ - **配置文件**:`~/.chelper/config.yaml`
142
+ - **加密密钥**:`~/.chelper/secrets.enc`(AES-256-GCM)
143
+ - **备份**:`~/.chelper/backups/*.yaml` + `*.secrets.enc` 伴随文件
144
+ - **日志**:`~/.chelper/<YYYY-MM-DD>.log`(按天滚动,14 天清理)
145
+
146
+ 可通过环境变量重定向:
147
+
148
+ - `CHELPER_CONFIG_DIR`:完全自定义配置目录
149
+ - `CHELPER_TEST_HOME`:将 `~/.chelper` 视作 `<TEST_HOME>/.chelper`(多用于测试)
150
+ - `NO_COLOR` / `FORCE_COLOR=0`:关闭彩色输出
151
+
152
+ ---
153
+
154
+ ## 配置文件结构
155
+
156
+ ```yaml
157
+ lang: zh_CN
158
+ active_profile: default
159
+ profiles:
160
+ default:
161
+ base_url: https://www.vibeapi.cn
162
+ models:
163
+ haiku: claude-haiku-4-5-20251001
164
+ sonnet: claude-sonnet-4-6
165
+ opus: claude-opus-4-6
166
+ reasoning: claude-opus-4-6
167
+ work:
168
+ base_url: https://api.example.com
169
+ models: { ... }
170
+ presets:
171
+ fast:
172
+ models: { ... }
173
+ updated_at: 2026-04-27T03:00:00.000Z
174
+ ```
175
+
176
+ **API Key 不会以明文落入 yaml**,只通过 `secrets.enc` 加密存储;首次读取到含内联 `api_key` 的旧 yaml 时会自动迁出。
177
+
178
+ ---
179
+
180
+ ## 自动化 / CI
181
+
182
+ 所有命令支持 `--json --non-interactive`,输出便于解析:
183
+
184
+ ```bash
185
+ chelper status --json
186
+ # {
187
+ # "api_key_set": true,
188
+ # "api_key_fingerprint": "a3b1...e4",
189
+ # "base_url": "https://www.vibeapi.cn",
190
+ # "language": "zh_CN",
191
+ # "models": { ... },
192
+ # "tools": [ ... ],
193
+ # "active_profile": "default",
194
+ # "profiles": ["default"],
195
+ # "custom_presets": []
196
+ # }
197
+
198
+ chelper update --json
199
+ # { "current": "0.0.20", "latest": "0.0.21", "up_to_date": false, "error": null }
200
+
201
+ chelper bench --json --samples 5
202
+ # { "ok": true, "samples": 5, "median_ms": 142, "average_ms": 156, ... }
203
+ ```
204
+
205
+ `--dry-run` 与 `--json` 联合使用:
206
+
207
+ ```bash
208
+ chelper config profile delete work --dry-run --json
209
+ # { "dry_run": true, "description": "Would delete profile work",
210
+ # "payload": { "action": "profile_delete", "name": "work" } }
211
+ ```
212
+
213
+ ---
214
+
215
+ ## 安全与密钥管理
216
+
217
+ - API Key 只通过 `secrets.enc`(AES-256-GCM)持久化,绑定 username:hostname seed
218
+ - 主机或用户身份变化(如换机)会触发 `SecretStoreDecryptError`,envelope 不会被悄默丢弃
219
+ - 写路径加锁:检测到不可解密的 envelope 时,`setApiKey` 拒绝覆盖;恢复需通过 `chelper auth revoke`(自动 `deleteAll`)或手动 `rm ~/.chelper/secrets.enc`
220
+ - 备份还原拒绝路径遍历名(`..`、`/`、`\`)
221
+ - `status` 仅显示 12 字符 sha256 指纹,不显示 key 任何部分
222
+
223
+ ---
224
+
225
+ ## 常见问题
226
+
227
+ **Q:换了机器后 `chelper status` 报 `SecretStore decrypt failed - identity drift suspected`?**
228
+ A:旧 envelope 用旧机器的 `username:hostname` 派生密钥,新机器解不出。原 envelope 会被保留以防误删;想从干净状态重新开始:
229
+
230
+ ```bash
231
+ chelper auth revoke # 自动清理失败的 envelope
232
+ chelper auth <token>
233
+ ```
234
+
235
+ 或手动 `rm ~/.chelper/secrets.enc` 后再 `chelper auth`。
236
+
237
+ **Q:CI 里跑 `chelper config claude-code` 卡在交互?**
238
+ A:加 `--non-interactive`:
239
+
240
+ ```bash
241
+ chelper auth $TOKEN --non-interactive
242
+ chelper config claude-code --non-interactive
243
+ ```
244
+
245
+ **Q:怎么备份再换 profile 试错?**
246
+ A:
247
+
248
+ ```bash
249
+ chelper config backup create before-experiment
250
+ # 折腾...
251
+ chelper config backup restore before-experiment-... --yes
252
+ ```
253
+
254
+ ---
255
+
256
+ ## 链接
257
+
258
+ - [CHANGELOG](./CHANGELOG.md) — 版本变更记录
259
+ - [PUBLISH.md](./PUBLISH.md) — 发布流程
260
+ - 主页:<https://www.vibeapi.cn/>
261
+ - 反馈:<https://www.vibeapi.cn/support>
262
+
263
+ ---
264
+
265
+ ## License
266
+
267
+ UNLICENSED — 仅供 VibeAPI 用户使用,详见 [LICENSE](./LICENSE)。
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as o,expect as r,vi as t,afterEach as s}from"vitest";import{validateApiKey as a}from"../lib/api-validator.js";e("API Validator",()=>{const e=globalThis.fetch;s(()=>{globalThis.fetch=e,t.restoreAllMocks()}),o("should return valid for successful response",async()=>{globalThis.fetch=t.fn().mockResolvedValue({ok:!0,status:200,json:()=>Promise.resolve({object:"list",data:[]})});const e=await a("valid-key",{retries:0});r(e.valid).toBe(!0)}),o("should return invalid for 401 response",async()=>{globalThis.fetch=t.fn().mockResolvedValue({ok:!1,status:401,statusText:"Unauthorized"});const e=await a("invalid-key",{retries:0});r(e.valid).toBe(!1),r(e.error).toBe("invalid_api_key")}),o("should return network error for fetch failure",async()=>{globalThis.fetch=t.fn().mockRejectedValue(new Error("fetch failed"));const e=await a("any-key",{retries:0});r(e.valid).toBe(!1),r(e.error).toBe("network_error")}),o("should return network error for timeout",async()=>{const e=new Error("The operation was aborted");e.name="AbortError",globalThis.fetch=t.fn().mockRejectedValue(e);const o=await a("any-key",{retries:0});r(o.valid).toBe(!1),r(o.error).toBe("network_error"),r(o.message).toBe("Request timeout")}),o("should handle non-200 non-401 responses",async()=>{globalThis.fetch=t.fn().mockResolvedValue({ok:!1,status:500,statusText:"Internal Server Error"});const e=await a("any-key",{retries:0});r(e.valid).toBe(!1),r(e.error).toBe("unknown_error")}),o("should retry on network error and eventually succeed",async()=>{const e=t.fn().mockRejectedValueOnce(new Error("connect ETIMEDOUT")).mockRejectedValueOnce(new Error("connect ECONNRESET")).mockResolvedValueOnce({ok:!0,status:200,json:()=>Promise.resolve({object:"list"})}),o=await a("k",{retries:2,backoffMs:0,fetchFn:e,sleepFn:()=>Promise.resolve()});r(o.valid).toBe(!0),r(e).toHaveBeenCalledTimes(3)}),o("should NOT retry on invalid_api_key",async()=>{const e=t.fn().mockResolvedValue({ok:!1,status:401,statusText:"Unauthorized"}),o=await a("k",{retries:5,backoffMs:0,fetchFn:e,sleepFn:()=>Promise.resolve()});r(o.error).toBe("invalid_api_key"),r(e).toHaveBeenCalledTimes(1)})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-validator.test.js","sourceRoot":"","sources":["../../src/__tests__/api-validator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as t,expect as n,beforeEach as o,afterEach as s,vi as r}from"vitest";import{mkdirSync as i,rmSync as a,existsSync as O,readFileSync as g}from"fs";import{join as d}from"path";import{tmpdir as c}from"os";const C=d(c(),`chelper-cc-${Date.now()}-${Math.random().toString(36).slice(2)}`);r.mock("os",async()=>({...await r.importActual("os"),homedir:()=>C})),e("ClaudeCodeManager",()=>{let e;o(async()=>{i(C,{recursive:!0}),({claudeCodeManager:e}=await import("../lib/claude-code-manager.js"))}),s(()=>{try{a(C,{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=d(C,".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_REASONING_MODEL).toBe("r");const o=e.getMCPConfig();n(o.hasCompletedOnboarding).toBe(!0)}),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=d(C,".claude.json");n(O(t)).toBe(!0);const o=JSON.parse(g(t,"utf-8"));n(o.hasCompletedOnboarding).toBe(!0)})});
@@ -0,0 +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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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as o,expect as t,beforeEach as a,afterEach as n,vi as s}from"vitest";import{mkdirSync as m,rmSync as c}from"fs";import{join as r}from"path";import{tmpdir as i}from"os";const p=r(i(),`chelper-cmd-${Date.now()}-${Math.random().toString(36).slice(2)}`);e("Command class",()=>{let e;a(()=>{m(p,{recursive:!0}),e=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=p}),n(()=>{void 0!==e?process.env.CHELPER_TEST_HOME=e:delete process.env.CHELPER_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("chelper")}),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("command --base preflight",()=>{let e;a(()=>{m(p,{recursive:!0}),e=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=p}),n(()=>{void 0!==e?process.env.CHELPER_TEST_HOME=e:delete process.env.CHELPER_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"),a=new o,n=s.spyOn(e,"setBaseUrl");try{await a.execute(["--base","https://example.com","--help"])}catch{}t(n).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"),a=new o,n=s.spyOn(e,"setBaseUrl");try{await a.execute(["--base=https://eq.example.com","--help"])}catch{}t(n).toHaveBeenCalledWith("https://eq.example.com")})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../src/__tests__/command.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +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(),`chelper-handlers-${Date.now()}-${Math.random().toString(36).slice(2)}`);a("command handlers",()=>{let r,c;e(()=>{i(d,{recursive:!0}),r=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=d,c=s.spyOn(console,"log").mockImplementation(()=>{})}),n(()=>{void 0!==r?process.env.CHELPER_TEST_HOME=r:delete process.env.CHELPER_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")})})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.test.js","sourceRoot":"","sources":["../../src/__tests__/commands.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as a,expect as t,beforeEach as o,afterEach as n,vi as r}from"vitest";import{mkdirSync as i,rmSync as s,existsSync as c,readFileSync as g}from"fs";import{join as l}from"path";import{tmpdir as p}from"os";import*as f from"js-yaml";e("ConfigManager profiles & presets & backups",()=>{let e,m,M;o(async()=>{e=l(p(),`chelper-profile-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(e,{recursive:!0}),m=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=e,r.resetModules(),M=await import("../lib/config.js")}),n(()=>{void 0!==m?process.env.CHELPER_TEST_HOME=m:delete process.env.CHELPER_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"),r.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,".chelper");i(a,{recursive:!0}),(await import("fs")).writeFileSync(l(a,"config.yaml"),f.dump({lang:"zh_CN",api_key:"legacy-key",plan:"legacy-plan"}),"utf-8"),r.resetModules();const o=await import("../lib/config.js");t(o.configManager.getApiKey()).toBe("legacy-key");const n=f.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=f.load(g(l(e,".chelper","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=f.load(g(l(e,".chelper","config.yaml"),"utf-8")),r=M.configManager.getActiveProfileName();t(n.profiles?.[r]?.base_url).not.toBe("https://transient.example.com")})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-profiles.test.js","sourceRoot":"","sources":["../../src/__tests__/config-profiles.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as o,expect as t,beforeEach as s,afterEach as c}from"vitest";import{mkdirSync as n,rmSync as r,existsSync as a,readFileSync as l,writeFileSync as i}from"fs";import{join as p}from"path";import{tmpdir as f}from"os";import*as m from"js-yaml";e("ConfigManager",()=>{let e,u;s(()=>{e=p(f(),`chelper-test-${Date.now()}-${Math.random().toString(36).slice(2)}`),n(e,{recursive:!0}),u=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=e}),c(()=>{void 0!==u?process.env.CHELPER_TEST_HOME=u:delete process.env.CHELPER_TEST_HOME;try{r(e,{recursive:!0,force:!0})}catch{}}),o("should detect first run when no config exists",async()=>{const o=p(e,".chelper","config.yaml");t(a(o)).toBe(!1)}),o("should save and load config correctly",async()=>{const o=p(e,".chelper");n(o,{recursive:!0});const s=p(o,"config.yaml"),c=m.dump({lang:"zh_CN",api_key:"test-key-123"});i(s,c,"utf-8");const r=m.load(l(s,"utf-8"));t(r.lang).toBe("zh_CN"),t(r.api_key).toBe("test-key-123")}),o("should handle missing config gracefully",()=>{const o=p(e,".chelper","config.yaml");t(a(o)).toBe(!1)}),o("should migrate old config with plan field",()=>{const o=p(e,".chelper");n(o,{recursive:!0});const s=p(o,"config.yaml");i(s,m.dump({lang:"en_US",plan:"some-plan",api_key:"key123"}),"utf-8");const c=m.load(l(s,"utf-8"));t(c.plan).toBe("some-plan"),t(c.lang).toBe("en_US")}),o("should create backup directory on save",()=>{const o=p(e,".chelper");n(o,{recursive:!0});const s=p(o,"backups");t(a(s)).toBe(!1)})});
@@ -0,0 +1 @@
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 t,it as o,expect as e,beforeEach as s,afterEach as n,vi as a}from"vitest";import{mkdirSync as r,rmSync as i,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(),`chelper-extra-${Date.now()}-${Math.random().toString(36).slice(2)}`),r(u,{recursive:!0}),d=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=u,a.resetModules()}),n(()=>{void 0!==d?process.env.CHELPER_TEST_HOME=d:delete process.env.CHELPER_TEST_HOME;try{i(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:r}=await import("../commands/update.js");await r({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:r}=await import("../commands/update.js");await r({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:r}=await import("../commands/update.js");await r({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:r}=await import("../commands/bench.js");await r([],{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[i,c]=o.mock.calls[0];e(String(i)).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:r}=await import("../commands/bench.js");await r([],{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();r(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{i(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:r}=await import("../commands/logs.js");await r(["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();r(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{i(n,{force:!0})}catch{}})})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extra-commands.test.js","sourceRoot":"","sources":["../../src/__tests__/extra-commands.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as o,expect as t,beforeEach as n,afterEach as a}from"vitest";import{I18n as l}from"../lib/i18n.js";e("I18n",()=>{const s=l.getInstance();let c;n(()=>{c=s.getLocale()}),a(()=>{s.setLocale(c)}),e("getAvailableLocales",()=>{o("contains both en_US and zh_CN",()=>{const e=s.getAvailableLocales();t(e).toContain("en_US"),t(e).toContain("zh_CN")})}),e("translate",()=>{o("translates a known key in en_US",()=>{s.setLocale("en_US"),t(s.t("cli.error_general")).toBe("Error:")}),o("translates a known key in zh_CN",()=>{s.setLocale("zh_CN"),t(s.t("cli.error_general")).toBe("错误:")}),o("returns the key when not found in any locale",()=>{s.setLocale("en_US"),t(s.t("does.not.exist")).toBe("does.not.exist")}),o("interpolates {{params}}",()=>{s.setLocale("en_US");const e=s.t("cli.error_unknown",{command:"foo"});t(e).toContain("foo")}),o("keeps placeholder when param missing",()=>{s.setLocale("en_US");const e=s.t("cli.error_unknown",{});t(e).toContain("{{command}}")}),o("falls back to en_US when key missing in current locale",()=>{s.setLocale("zh_CN"),t(s.t("does.not.exist.either")).toBe("does.not.exist.either")})}),e("setLocale",()=>{o("changes the active locale",()=>{s.setLocale("en_US"),t(s.getLocale()).toBe("en_US"),s.setLocale("zh_CN"),t(s.getLocale()).toBe("zh_CN")}),o("ignores unsupported locales",()=>{s.setLocale("en_US"),s.setLocale("xx_YY"),t(s.getLocale()).toBe("en_US")})}),e("loadFromConfig",()=>{o("updates locale when supported",()=>{s.loadFromConfig("zh_CN"),t(s.getLocale()).toBe("zh_CN")}),o("ignores unsupported locale silently",()=>{s.setLocale("en_US"),s.loadFromConfig("non_existing"),t(s.getLocale()).toBe("en_US")})})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.test.js","sourceRoot":"","sources":["../../src/__tests__/i18n.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as o,it as t,expect as e}from"vitest";import{Logger as n,LogLevel as r,logger as s}from"../utils/logger.js";o("Logger",()=>{t("exports a singleton instance",()=>{e(s).toBe(n.getInstance())}),o("log levels",()=>{t("exposes numeric level constants",()=>{e(r.DEBUG).toBe(0),e(r.INFO).toBe(1),e(r.WARN).toBe(2),e(r.ERROR).toBe(3)})}),o("sanitization",()=>{t("handles sensitive object payloads without throwing",()=>{e(()=>s.warn("payload",{api_key:"sk-shouldNotLeak123456789012345678901234",nested:{Authorization:"Bearer abcdefghijk"}})).not.toThrow()}),t("handles strings containing JWT-like tokens",()=>{e(()=>s.error("jwt","eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWxpY2UifQ.someSig123")).not.toThrow()})}),o("configuration",()=>{t("accepts log level changes",()=>{e(()=>s.setLogLevel(r.ERROR)).not.toThrow(),e(()=>s.setLogLevel(r.INFO)).not.toThrow()}),t("accepts file log level changes",()=>{e(()=>s.setFileLogLevel(r.DEBUG)).not.toThrow(),e(()=>s.setFileLogLevel(r.WARN)).not.toThrow()}),t("accepts retention day updates with valid values",()=>{e(()=>s.setRetentionDays(7)).not.toThrow(),e(()=>s.setRetentionDays(30)).not.toThrow(),e(()=>s.setRetentionDays(-1)).not.toThrow(),e(()=>s.setRetentionDays(NaN)).not.toThrow(),s.setRetentionDays(14)}),t("toggles file logging on/off",()=>{e(()=>s.setFileLoggingEnabled(!1)).not.toThrow(),e(()=>s.setFileLoggingEnabled(!0)).not.toThrow()}),t("exposes log directory path",()=>{e(typeof s.getLogDir()).toBe("string"),e(s.getLogDir().length).toBeGreaterThan(0)})}),o("logError",()=>{t("does not throw on Error instances",()=>{e(()=>s.logError("test-context",new Error("boom"))).not.toThrow()}),t("does not throw on non-Error values",()=>{e(()=>s.logError("test-context","string error")).not.toThrow(),e(()=>s.logError("test-context",42)).not.toThrow(),e(()=>s.logError("test-context",null)).not.toThrow()})})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/__tests__/logger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe as e,it as o,expect as t,afterEach as r}from"vitest";import{getDefaultModels as s,getPresets as n,resolvePreset as l,reloadRegistry as d}from"../lib/model-registry.js";e("ModelRegistry",()=>{r(()=>{d()}),o("should return default models",()=>{const e=s();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=n();t(Array.isArray(e)).toBe(!0),t(e.length).toBeGreaterThan(0)}),o("should have at least one recommended preset",()=>{const e=n().filter(e=>e.recommended);t(e.length).toBeGreaterThan(0)}),o("should resolve single-model preset correctly",()=>{const e=l({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=l({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("should return copies, not references",()=>{const e=s(),o=s();t(e).not.toBe(o),t(e).toEqual(o)})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/model-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +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(),`chelper-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")})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/opencode-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +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(),`chelper-runtime-${Date.now()}-${Math.random().toString(36).slice(2)}`),i(t,{recursive:!0}),l=process.env.CHELPER_TEST_HOME,process.env.CHELPER_TEST_HOME=t}),a(()=>{void 0!==l?process.env.CHELPER_TEST_HOME=l:delete process.env.CHELPER_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()}})});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-options.test.js","sourceRoot":"","sources":["../../src/__tests__/runtime-options.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};