@xhscopy-ai/cli 0.0.136 → 0.0.138

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.
@@ -10,7 +10,7 @@
10
10
  "claude": [
11
11
  {
12
12
  "description": "100 万上下文 | 高强度推理 | 长时 Agent | SWE-bench Verified 95%",
13
- "group": "grp_pzxnceygmqlp",
13
+ "group": "grp_6eg2dq9ywgrg",
14
14
  "group_name": "",
15
15
  "hidden": false,
16
16
  "id": "claude-fable-5",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  {
21
21
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考常开 | 长时 Agent 与多步研究",
22
- "group": "grp_rld6af0zorqd",
22
+ "group": "grp_6eg2dq9ywgrg",
23
23
  "group_name": "",
24
24
  "hidden": false,
25
25
  "id": "claude-fable-5-1",
@@ -28,7 +28,7 @@
28
28
  },
29
29
  {
30
30
  "description": "轻量档 | 低延迟 | 高频短任务",
31
- "group": "grp_6eg2dq9ywgrg",
31
+ "group": "grp_6co8aqwefsoh",
32
32
  "group_name": "",
33
33
  "hidden": false,
34
34
  "id": "claude-haiku-4-5-20251001",
@@ -46,7 +46,7 @@
46
46
  },
47
47
  {
48
48
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
49
- "group": "grp_rld6af0zorqd",
49
+ "group": "grp_6co8aqwefsoh",
50
50
  "group_name": "",
51
51
  "hidden": false,
52
52
  "id": "claude-opus-4-6",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  {
57
57
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
58
- "group": "grp_6lyxfgbs440g",
58
+ "group": "grp_6eg2dq9ywgrg",
59
59
  "group_name": "",
60
60
  "hidden": false,
61
61
  "id": "claude-opus-4-7",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  {
66
66
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
67
- "group": "grp_6eg2dq9ywgrg",
67
+ "group": "grp_rld6af0zorqd",
68
68
  "group_name": "",
69
69
  "hidden": false,
70
70
  "id": "claude-opus-4-8",
@@ -73,7 +73,7 @@
73
73
  },
74
74
  {
75
75
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考五档 | Agent 编程",
76
- "group": "grp_6lyxfgbs440g",
76
+ "group": "grp_6eg2dq9ywgrg",
77
77
  "group_name": "",
78
78
  "hidden": false,
79
79
  "id": "claude-opus-5",
@@ -82,7 +82,7 @@
82
82
  },
83
83
  {
84
84
  "description": "100 万上下文 | 长时 Agent 编程 | 知识工作",
85
- "group": "grp_irydsgijuckh",
85
+ "group": "grp_6eg2dq9ywgrg",
86
86
  "group_name": "",
87
87
  "hidden": false,
88
88
  "id": "claude-opus-5-5",
@@ -91,7 +91,7 @@
91
91
  },
92
92
  {
93
93
  "description": "100 万上下文 | Agent 编程 | 长上下文不加价",
94
- "group": "grp_6eg2dq9ywgrg",
94
+ "group": "grp_pzxnceygmqlp",
95
95
  "group_name": "",
96
96
  "hidden": false,
97
97
  "id": "claude-sonnet-4-6",
@@ -100,7 +100,7 @@
100
100
  },
101
101
  {
102
102
  "description": "100 万上下文 | Agent 编程 | 工具调用 | 知识工作",
103
- "group": "grp_rld6af0zorqd",
103
+ "group": "grp_6eg2dq9ywgrg",
104
104
  "group_name": "",
105
105
  "hidden": false,
106
106
  "id": "claude-sonnet-5",
@@ -109,7 +109,7 @@
109
109
  },
110
110
  {
111
111
  "description": "100 万上下文 | 12.8 万输出 | Agent 编程 | 知识工作",
112
- "group": "grp_rld6af0zorqd",
112
+ "group": "grp_pzxnceygmqlp",
113
113
  "group_name": "",
114
114
  "hidden": false,
115
115
  "id": "claude-sonnet-5-5",
@@ -118,15 +118,6 @@
118
118
  }
119
119
  ],
120
120
  "codex": [
121
- {
122
- "description": "100 万上下文 | 12.8 万输出 | 复杂专业负载",
123
- "group": "grp_irydsgijuckh",
124
- "group_name": "",
125
- "hidden": false,
126
- "id": "gpt-5.5",
127
- "name": "gpt-5.5",
128
- "recommended": false
129
- },
130
121
  {
131
122
  "description": "105 万上下文 | 12.8 万输出 | 大批量低成本档",
132
123
  "group": "grp_bsbtt432saoq",
@@ -147,7 +138,7 @@
147
138
  },
148
139
  {
149
140
  "description": "105 万上下文 | 12.8 万输出 | 均衡生产档",
150
- "group": "grp_irydsgijuckh",
141
+ "group": "grp_6co8aqwefsoh",
151
142
  "group_name": "",
152
143
  "hidden": false,
153
144
  "id": "gpt-5.6-terra",
@@ -156,7 +147,7 @@
156
147
  },
157
148
  {
158
149
  "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max | 计算机操作 / 编码 / 科学基准接近饱和",
159
- "group": "grp_mb5v069lpnze",
150
+ "group": "grp_irydsgijuckh",
160
151
  "group_name": "",
161
152
  "hidden": false,
162
153
  "id": "gpt-6-astra",
@@ -165,7 +156,7 @@
165
156
  },
166
157
  {
167
158
  "description": "转发至 gpt-6-sol | 实际由 gpt-6-sol 响应 | 105 万上下文 | 12.8 万输出",
168
- "group": "grp_irydsgijuckh",
159
+ "group": "grp_6co8aqwefsoh",
169
160
  "group_name": "",
170
161
  "hidden": false,
171
162
  "id": "gpt-6-luna",
@@ -174,7 +165,7 @@
174
165
  },
175
166
  {
176
167
  "description": "105 万上下文 | 12.8 万输出 | 复杂编程与 Agent 工作流",
177
- "group": "grp_squ2qzjnehps",
168
+ "group": "grp_bsbtt432saoq",
178
169
  "group_name": "",
179
170
  "hidden": false,
180
171
  "id": "gpt-6-sol",
@@ -183,7 +174,7 @@
183
174
  },
184
175
  {
185
176
  "description": "105 万上下文 | 12.8 万输出 | 文字与图像输入 | 工具调用、联网搜索、结构化输出 | 工具调用使用 Responses API",
186
- "group": "grp_squ2qzjnehps",
177
+ "group": "grp_irydsgijuckh",
187
178
  "group_name": "",
188
179
  "hidden": false,
189
180
  "id": "gpt-6.1-sol",
@@ -192,7 +183,7 @@
192
183
  },
193
184
  {
194
185
  "description": "105 万上下文 | 12.8 万输出 | 计算机操作与日常 Agent 任务 | 均衡档",
195
- "group": "grp_mb5v069lpnze",
186
+ "group": "grp_irydsgijuckh",
196
187
  "group_name": "",
197
188
  "hidden": false,
198
189
  "id": "gpt-6.1-terra",
@@ -257,7 +248,7 @@
257
248
  },
258
249
  {
259
250
  "description": "约 208 token/秒 | 高吞吐 | 多语言 | 编码",
260
- "group": "grp_z5khwusxuh2j",
251
+ "group": "grp_3pi5kyqkp51b",
261
252
  "group_name": "",
262
253
  "hidden": false,
263
254
  "id": "gemini-3.6-flash",
@@ -275,7 +266,7 @@
275
266
  },
276
267
  {
277
268
  "description": "推理与编码 | HLE-Verified 54.9% | 长文档工作流",
278
- "group": "grp_3pi5kyqkp51b",
269
+ "group": "grp_z5khwusxuh2j",
279
270
  "group_name": "",
280
271
  "hidden": false,
281
272
  "id": "gemini-3.8-flash",
@@ -304,7 +295,7 @@
304
295
  "grok": [
305
296
  {
306
297
  "description": "50 万上下文 | 1.5 万亿参数 MoE | 编码与 Agent",
307
- "group": "grp_l34dwliv4yas",
298
+ "group": "grp_irydsgijuckh",
308
299
  "group_name": "",
309
300
  "hidden": false,
310
301
  "id": "grok-4.5",
@@ -322,7 +313,7 @@
322
313
  },
323
314
  {
324
315
  "description": "50 万上下文 | 长时 Agent | 编码与视觉项目",
325
- "group": "grp_irydsgijuckh",
316
+ "group": "grp_l34dwliv4yas",
326
317
  "group_name": "",
327
318
  "hidden": false,
328
319
  "id": "grok-4.7",
@@ -10,7 +10,7 @@
10
10
  "claude": [
11
11
  {
12
12
  "description": "100 万上下文 | 高强度推理 | 长时 Agent | SWE-bench Verified 95%",
13
- "group": "grp_pzxnceygmqlp",
13
+ "group": "grp_6eg2dq9ywgrg",
14
14
  "group_name": "",
15
15
  "hidden": false,
16
16
  "id": "claude-fable-5",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  {
21
21
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考常开 | 长时 Agent 与多步研究",
22
- "group": "grp_rld6af0zorqd",
22
+ "group": "grp_6eg2dq9ywgrg",
23
23
  "group_name": "",
24
24
  "hidden": false,
25
25
  "id": "claude-fable-5-1",
@@ -28,7 +28,7 @@
28
28
  },
29
29
  {
30
30
  "description": "轻量档 | 低延迟 | 高频短任务",
31
- "group": "grp_6eg2dq9ywgrg",
31
+ "group": "grp_6co8aqwefsoh",
32
32
  "group_name": "",
33
33
  "hidden": false,
34
34
  "id": "claude-haiku-4-5-20251001",
@@ -46,7 +46,7 @@
46
46
  },
47
47
  {
48
48
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
49
- "group": "grp_rld6af0zorqd",
49
+ "group": "grp_6co8aqwefsoh",
50
50
  "group_name": "",
51
51
  "hidden": false,
52
52
  "id": "claude-opus-4-6",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  {
57
57
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
58
- "group": "grp_6lyxfgbs440g",
58
+ "group": "grp_6eg2dq9ywgrg",
59
59
  "group_name": "",
60
60
  "hidden": false,
61
61
  "id": "claude-opus-4-7",
@@ -64,7 +64,7 @@
64
64
  },
65
65
  {
66
66
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
67
- "group": "grp_6eg2dq9ywgrg",
67
+ "group": "grp_rld6af0zorqd",
68
68
  "group_name": "",
69
69
  "hidden": false,
70
70
  "id": "claude-opus-4-8",
@@ -73,7 +73,7 @@
73
73
  },
74
74
  {
75
75
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考五档 | Agent 编程",
76
- "group": "grp_6lyxfgbs440g",
76
+ "group": "grp_6eg2dq9ywgrg",
77
77
  "group_name": "",
78
78
  "hidden": false,
79
79
  "id": "claude-opus-5",
@@ -82,7 +82,7 @@
82
82
  },
83
83
  {
84
84
  "description": "100 万上下文 | 长时 Agent 编程 | 知识工作",
85
- "group": "grp_irydsgijuckh",
85
+ "group": "grp_6eg2dq9ywgrg",
86
86
  "group_name": "",
87
87
  "hidden": false,
88
88
  "id": "claude-opus-5-5",
@@ -91,7 +91,7 @@
91
91
  },
92
92
  {
93
93
  "description": "100 万上下文 | Agent 编程 | 长上下文不加价",
94
- "group": "grp_6eg2dq9ywgrg",
94
+ "group": "grp_pzxnceygmqlp",
95
95
  "group_name": "",
96
96
  "hidden": false,
97
97
  "id": "claude-sonnet-4-6",
@@ -100,7 +100,7 @@
100
100
  },
101
101
  {
102
102
  "description": "100 万上下文 | Agent 编程 | 工具调用 | 知识工作",
103
- "group": "grp_rld6af0zorqd",
103
+ "group": "grp_6eg2dq9ywgrg",
104
104
  "group_name": "",
105
105
  "hidden": false,
106
106
  "id": "claude-sonnet-5",
@@ -109,7 +109,7 @@
109
109
  },
110
110
  {
111
111
  "description": "100 万上下文 | 12.8 万输出 | Agent 编程 | 知识工作",
112
- "group": "grp_rld6af0zorqd",
112
+ "group": "grp_pzxnceygmqlp",
113
113
  "group_name": "",
114
114
  "hidden": false,
115
115
  "id": "claude-sonnet-5-5",
@@ -118,15 +118,6 @@
118
118
  }
119
119
  ],
120
120
  "codex": [
121
- {
122
- "description": "100 万上下文 | 12.8 万输出 | 复杂专业负载",
123
- "group": "grp_irydsgijuckh",
124
- "group_name": "",
125
- "hidden": false,
126
- "id": "gpt-5.5",
127
- "name": "gpt-5.5",
128
- "recommended": false
129
- },
130
121
  {
131
122
  "description": "105 万上下文 | 12.8 万输出 | 大批量低成本档",
132
123
  "group": "grp_bsbtt432saoq",
@@ -147,7 +138,7 @@
147
138
  },
148
139
  {
149
140
  "description": "105 万上下文 | 12.8 万输出 | 均衡生产档",
150
- "group": "grp_irydsgijuckh",
141
+ "group": "grp_6co8aqwefsoh",
151
142
  "group_name": "",
152
143
  "hidden": false,
153
144
  "id": "gpt-5.6-terra",
@@ -156,7 +147,7 @@
156
147
  },
157
148
  {
158
149
  "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max | 计算机操作 / 编码 / 科学基准接近饱和",
159
- "group": "grp_mb5v069lpnze",
150
+ "group": "grp_irydsgijuckh",
160
151
  "group_name": "",
161
152
  "hidden": false,
162
153
  "id": "gpt-6-astra",
@@ -165,7 +156,7 @@
165
156
  },
166
157
  {
167
158
  "description": "转发至 gpt-6-sol | 实际由 gpt-6-sol 响应 | 105 万上下文 | 12.8 万输出",
168
- "group": "grp_irydsgijuckh",
159
+ "group": "grp_6co8aqwefsoh",
169
160
  "group_name": "",
170
161
  "hidden": false,
171
162
  "id": "gpt-6-luna",
@@ -174,7 +165,7 @@
174
165
  },
175
166
  {
176
167
  "description": "105 万上下文 | 12.8 万输出 | 复杂编程与 Agent 工作流",
177
- "group": "grp_squ2qzjnehps",
168
+ "group": "grp_bsbtt432saoq",
178
169
  "group_name": "",
179
170
  "hidden": false,
180
171
  "id": "gpt-6-sol",
@@ -183,7 +174,7 @@
183
174
  },
184
175
  {
185
176
  "description": "105 万上下文 | 12.8 万输出 | 文字与图像输入 | 工具调用、联网搜索、结构化输出 | 工具调用使用 Responses API",
186
- "group": "grp_squ2qzjnehps",
177
+ "group": "grp_irydsgijuckh",
187
178
  "group_name": "",
188
179
  "hidden": false,
189
180
  "id": "gpt-6.1-sol",
@@ -192,7 +183,7 @@
192
183
  },
193
184
  {
194
185
  "description": "105 万上下文 | 12.8 万输出 | 计算机操作与日常 Agent 任务 | 均衡档",
195
- "group": "grp_mb5v069lpnze",
186
+ "group": "grp_irydsgijuckh",
196
187
  "group_name": "",
197
188
  "hidden": false,
198
189
  "id": "gpt-6.1-terra",
@@ -257,7 +248,7 @@
257
248
  },
258
249
  {
259
250
  "description": "约 208 token/秒 | 高吞吐 | 多语言 | 编码",
260
- "group": "grp_z5khwusxuh2j",
251
+ "group": "grp_3pi5kyqkp51b",
261
252
  "group_name": "",
262
253
  "hidden": false,
263
254
  "id": "gemini-3.6-flash",
@@ -275,7 +266,7 @@
275
266
  },
276
267
  {
277
268
  "description": "推理与编码 | HLE-Verified 54.9% | 长文档工作流",
278
- "group": "grp_3pi5kyqkp51b",
269
+ "group": "grp_z5khwusxuh2j",
279
270
  "group_name": "",
280
271
  "hidden": false,
281
272
  "id": "gemini-3.8-flash",
@@ -304,7 +295,7 @@
304
295
  "grok": [
305
296
  {
306
297
  "description": "50 万上下文 | 1.5 万亿参数 MoE | 编码与 Agent",
307
- "group": "grp_l34dwliv4yas",
298
+ "group": "grp_irydsgijuckh",
308
299
  "group_name": "",
309
300
  "hidden": false,
310
301
  "id": "grok-4.5",
@@ -322,7 +313,7 @@
322
313
  },
323
314
  {
324
315
  "description": "50 万上下文 | 长时 Agent | 编码与视觉项目",
325
- "group": "grp_irydsgijuckh",
316
+ "group": "grp_l34dwliv4yas",
326
317
  "group_name": "",
327
318
  "hidden": false,
328
319
  "id": "grok-4.7",
@@ -1 +1 @@
1
- import{chmodSync as e,existsSync as t,mkdirSync as r,readFileSync as n,renameSync as o,writeFileSync as s}from"fs";import{homedir as a}from"os";import{dirname as l,join as i,sep as u}from"path";import{spawnSync as c}from"child_process";import p from"chalk";import{checkForUpdate as d,compareSemver as m,readLocalPackage as f,UPDATE_SOURCES as _}from"../commands/update.js";import{i18n as h}from"./i18n.js";import{isColorEnabled as g}from"./runtime-options.js";import{logger as x}from"../utils/logger.js";import{isHelpRequest as v}from"./cli-help.js";import{brand as y,brandEnvName as S}from"./brand.js";export const UPDATE_CHECK_INTERVAL_MS=216e5;export const INSTALL_RETRY_INTERVAL_MS=36e5;export const INSTALL_TIMEOUT_MS=45e3;function k(e,t){return g()?e(t):t}export function resolveUpdateCachePath(e=process.env){const t=e[S("CONFIG_DIR")]?.trim();if(t)return i(t,"update-state.json");const r=e[S("TEST_HOME")]?.trim();return i(r||a(),y().configDirName,"update-state.json")}export function isGlobalPackageInstall(e){return e.split(u).includes("node_modules")}export function isNpxExecution(e=process.env){return"exec"===e.npm_command||"npx"===e.npm_lifecycle_event}export function isPnpmGlobalInstall(e){return e.includes(`${u}.pnpm${u}`)||e.includes(`${u}pnpm${u}global${u}`)}export function resolveNpmGlobalPrefix(e){const t=`${u}node_modules${u}`,r=e.indexOf(t);if(r<0)return null;const n=e.slice(0,r);return n.endsWith(`${u}lib`)?l(n):n}export function shouldSkipStartupUpdate(e,t=process.env){return"1"===t[S("SKIP_AUTO_UPDATE")]||"1"===t[S("DISABLE_AUTO_UPDATE")]||(!(!["--json","--non-interactive","--dry-run","--help","-h","--version","-v"].some(t=>e.includes(t))&&!v(e))||e.includes("update")||e.includes("completion"))}function A(t,n,a,i,u){try{r(l(t),{recursive:!0,mode:448});const c=`${t}.tmp-${process.pid}`,p={package_name:n,checked_at:a,latest:i.latest,source:i.source,registry:i.registry,errors:i.errors,...void 0===u?{}:{install_attempted_at:u,install_attempted_version:i.latest||void 0}};s(c,JSON.stringify(p),{encoding:"utf-8",mode:384}),o(c,t),e(t,384)}catch(e){x.warn("Failed to persist update check cache:",e)}}export function windowsShellCommand(e,t){return[e,...t.map(e=>`"${e}"`)].join(" ")}const P=(e,t)=>{const r={stdio:"inherit",timeout:45e3,killSignal:"SIGTERM"};return"win32"===process.platform?c(windowsShellCommand(e,t),{...r,shell:!0}):c(e,t,r)},$=(e,t)=>c(process.execPath,[process.argv[1],...e],{stdio:"inherit",env:t});export async function runStartupUpdate(e,r={}){const o=r.env||process.env,s=r.localPackage||f(),a=r.globalInstall??isGlobalPackageInstall(s.root),l=r.npx??isNpxExecution(o);if(!a||l||shouldSkipStartupUpdate(e,o))return{status:"skipped",handled:!1,source:null};const i=r.now??Date.now(),u=r.cachePath||resolveUpdateCachePath(o),c=function(e,r,o){try{if(!t(e))return null;const s=JSON.parse(n(e,"utf-8"));if(s.package_name!==r.name||!Number.isFinite(s.checked_at))return null;const a=s.latest?216e5:6e5;return o-s.checked_at>=a?null:{result:{current:r.version,latest:s.latest,up_to_date:s.latest?m(r.version,s.latest)>=0:null,source:s.source,registry:s.registry,errors:Array.isArray(s.errors)?s.errors:[],error:s.latest?null:(s.errors||[]).map(e=>`${e.source}: ${e.error}`).join("; ")||"unknown"},installAttemptedAt:s.latest&&s.install_attempted_version===s.latest&&Number.isFinite(s.install_attempted_at)?s.install_attempted_at:null}}catch{return null}}(u,s,i);let g=c?.result,x=c?.installAttemptedAt||null;if(g||(g=await d({localPackage:s,fetchFn:r.fetchFn}),A(u,s.name,i,g),x=null),!g.latest)return{status:"unavailable",handled:!1,source:null};if(g.up_to_date)return{status:"current",handled:!1,source:g.source};if(null!==x&&i-x<36e5)return{status:"update_failed",handled:!1,source:g.source};const v=r.output||console.log,y=r.errorOutput||console.error,T=r.installRunner||P,b=isPnpmGlobalInstall(s.root),w=b?"win32"===process.platform?"pnpm.cmd":"pnpm":"win32"===process.platform?"npm.cmd":"npm",I=b?null:resolveNpmGlobalPrefix(s.root);v(k(p.cyan,h.t("update.auto_installing",{version:g.latest})));let E=null,N="unknown";for(const e of _.map(e=>e.registry)){const t=T(w,b?["add","--global",`${s.name}@${g.latest}`,"--registry",e]:["install","--global",...I?["--prefix",I]:[],`${s.name}@${g.latest}`,"--registry",e,"--no-audit","--no-fund","--fetch-timeout=15000","--fetch-retries=1","--fetch-retry-mintimeout=1000","--fetch-retry-maxtimeout=3000"]);if(0===t.status){E=e;break}N=t.error?.message||`exit ${t.status??"unknown"}`}if(!E)return A(u,s.name,i,g,i),y(k(p.yellow,h.t("update.auto_failed",{error:N}))),{status:"update_failed",handled:!1,source:g.source};v(k(p.green,h.t("update.auto_installed",{version:g.latest})));const U=(r.reexecRunner||$)(e,{...o,[S("SKIP_AUTO_UPDATE")]:"1"});return U.error?(y(k(p.yellow,h.t("update.reexec_failed",{error:U.error.message}))),{status:"update_failed",handled:!1,source:g.source}):(process.exitCode=U.status??1,{status:"reexecuted",handled:!0,source:g.source})}
1
+ import{chmodSync as e,existsSync as t,mkdirSync as r,readFileSync as n,renameSync as o,writeFileSync as s}from"fs";import{homedir as a}from"os";import{dirname as l,join as i,sep as u}from"path";import{spawnSync as c}from"child_process";import p from"chalk";import{checkForUpdate as d,readLocalPackage as m,UPDATE_SOURCES as f}from"../commands/update.js";import{i18n as _}from"./i18n.js";import{isColorEnabled as h}from"./runtime-options.js";import{logger as g}from"../utils/logger.js";import{isHelpRequest as x}from"./cli-help.js";import{brand as v,brandEnvName as y}from"./brand.js";export const INSTALL_RETRY_INTERVAL_MS=36e5;export const INSTALL_TIMEOUT_MS=45e3;function k(e,t){return h()?e(t):t}export function resolveUpdateCachePath(e=process.env){const t=e[y("CONFIG_DIR")]?.trim();if(t)return i(t,"update-state.json");const r=e[y("TEST_HOME")]?.trim();return i(r||a(),v().configDirName,"update-state.json")}export function isGlobalPackageInstall(e){return e.split(u).includes("node_modules")}export function isNpxExecution(e=process.env){return"exec"===e.npm_command||"npx"===e.npm_lifecycle_event}export function isPnpmGlobalInstall(e){return e.includes(`${u}.pnpm${u}`)||e.includes(`${u}pnpm${u}global${u}`)}export function resolveNpmGlobalPrefix(e){const t=`${u}node_modules${u}`,r=e.indexOf(t);if(r<0)return null;const n=e.slice(0,r);return n.endsWith(`${u}lib`)?l(n):n}export function shouldSkipStartupUpdate(e,t=process.env){return"1"===t[y("SKIP_AUTO_UPDATE")]||"1"===t[y("DISABLE_AUTO_UPDATE")]||(!(!["--json","--non-interactive","--dry-run","--help","-h","--version","-v"].some(t=>e.includes(t))&&!x(e))||e.includes("update")||e.includes("completion"))}function S(t,n,a,i,u){try{r(l(t),{recursive:!0,mode:448});const c=`${t}.tmp-${process.pid}`,p={package_name:n,checked_at:a,latest:i.latest,source:i.source,registry:i.registry,errors:i.errors,...void 0===u?{}:{install_attempted_at:u,install_attempted_version:i.latest||void 0}};s(c,JSON.stringify(p),{encoding:"utf-8",mode:384}),o(c,t),e(t,384)}catch(e){g.warn("Failed to persist update check cache:",e)}}export function windowsShellCommand(e,t){return[e,...t.map(e=>`"${e}"`)].join(" ")}const $=(e,t)=>{const r={stdio:"inherit",timeout:45e3,killSignal:"SIGTERM"};return"win32"===process.platform?c(windowsShellCommand(e,t),{...r,shell:!0}):c(e,t,r)},P=(e,t)=>c(process.execPath,[process.argv[1],...e],{stdio:"inherit",env:t});export async function runStartupUpdate(e,r={}){const o=r.env||process.env,s=r.localPackage||m(),a=r.globalInstall??isGlobalPackageInstall(s.root),l=r.npx??isNpxExecution(o);if(!a||l||shouldSkipStartupUpdate(e,o))return{status:"skipped",handled:!1,source:null};const i=r.now??Date.now(),u=r.cachePath||resolveUpdateCachePath(o),c=function(e,r){try{if(!t(e))return null;const o=JSON.parse(n(e,"utf-8"));return o.package_name===r.name&&Number.isFinite(o.checked_at)?o:null}catch{return null}}(u,s);let h=function(e,t,r){if(!e||e.latest||r-e.checked_at>=6e5)return null;const n=Array.isArray(e.errors)?e.errors:[];return{current:t.version,latest:null,up_to_date:null,source:e.source,registry:e.registry,errors:n,error:n.map(e=>`${e.source}: ${e.error}`).join("; ")||"unknown"}}(c,s,i),g=null;if(h||(h=await d({localPackage:s,fetchFn:r.fetchFn}),h.latest&&c?.install_attempted_version===h.latest&&Number.isFinite(c.install_attempted_at)&&(g=c.install_attempted_at),S(u,s.name,i,h,g??void 0)),!h.latest)return{status:"unavailable",handled:!1,source:null};if(h.up_to_date)return{status:"current",handled:!1,source:h.source};if(null!==g&&i-g<36e5)return{status:"update_failed",handled:!1,source:h.source};const x=r.output||console.log,v=r.errorOutput||console.error,b=r.installRunner||$,w=isPnpmGlobalInstall(s.root),I=w?"win32"===process.platform?"pnpm.cmd":"pnpm":"win32"===process.platform?"npm.cmd":"npm",T=w?null:resolveNpmGlobalPrefix(s.root);x(k(p.cyan,_.t("update.auto_installing",{version:h.latest})));let N=null,A="unknown";for(const e of f.map(e=>e.registry)){const t=b(I,w?["add","--global",`${s.name}@${h.latest}`,"--registry",e]:["install","--global",...T?["--prefix",T]:[],`${s.name}@${h.latest}`,"--registry",e,"--no-audit","--no-fund","--fetch-timeout=15000","--fetch-retries=1","--fetch-retry-mintimeout=1000","--fetch-retry-maxtimeout=3000"]);if(0===t.status){N=e;break}A=t.error?.message||`exit ${t.status??"unknown"}`}if(!N)return S(u,s.name,i,h,i),v(k(p.yellow,_.t("update.auto_failed",{error:A}))),{status:"update_failed",handled:!1,source:h.source};x(k(p.green,_.t("update.auto_installed",{version:h.latest})));const E=(r.reexecRunner||P)(e,{...o,[y("SKIP_AUTO_UPDATE")]:"1"});return E.error?(v(k(p.yellow,_.t("update.reexec_failed",{error:E.error.message}))),{status:"update_failed",handled:!1,source:h.source}):(process.exitCode=E.status??1,{status:"reexecuted",handled:!0,source:h.source})}
@@ -1 +1 @@
1
- import{spawnSync as t}from"child_process";import{existsSync as o,mkdtempSync as e,readFileSync as n,realpathSync as s,rmSync as r,statSync as i,writeFileSync as c}from"fs";import{tmpdir as l}from"os";import{delimiter as a,dirname as u,isAbsolute as d,join as p}from"path";import*as f from"@iarna/toml";import{fileURLToPath as m}from"url";import{logger as _}from"../../utils/logger.js";import{getCodexRules as x,compareVersions as g}from"../model-registry.js";import{autoCompactTokens as w,modelBlurb as h,prettyModelName as y}from"../gateway-models.js";import{codexHome as b,toolHome as C}from"./types.js";import{brandEnv as v,CLI_NAME as M,PROVIDER_KEY as A}from"../brand.js";const j=u(m(import.meta.url));export const CODEX_CATALOG_FILE=`${A}-model-catalog.json`;export const codexCatalogPath=()=>p(b(),CODEX_CATALOG_FILE);function O(){const t=v("CODEX_BIN");if(void 0!==t)return t.trim()?[t.trim()]:[];const o=["codex"];if("win32"===process.platform){const t=process.env.LOCALAPPDATA||p(C(),"AppData","Local");o.push(p(t,"Programs","OpenAI","Codex","bin","codex.exe"))}else o.push(p(C(),".local","bin","codex"));if("darwin"===process.platform)for(const t of["/Applications",p(C(),"Applications")])o.push(p(t,"ChatGPT.app/Contents/Resources/codex-cli/bin/codex")),o.push(p(t,"Codex.app/Contents/Resources/codex"));return o}function $(t){return!!t&&"object"==typeof t&&!Array.isArray(t)}function E(t){try{const o=JSON.parse(t),e=$(o)&&Array.isArray(o.models)?o.models.filter($):[];return e.length>0?e:null}catch{return null}}function k(o,e,n){const s={encoding:"utf-8",timeout:2e4,maxBuffer:67108864,windowsHide:!0,stdio:["ignore","pipe","pipe"],...n?{env:n}:{}};return"win32"!==process.platform||"codex"!==o&&!/\.cmd$/i.test(o)?t(o,e,s):t(["codex"===o?"codex":`"${o}"`,...e].join(" "),{...s,shell:!0})}function P(t){const o=k(t,["debug","models","--bundled"]);if(0===o.status&&o.stdout){const t=E(o.stdout);if(t)return t}return(o.error||0!==o.status)&&_.logError("loadBundledCodexModels",o.error??new Error(`${t} exited ${o.status}`)),null}export function loadBundledCodexModels(t){if(t)return P(t);for(const t of O()){if("codex"!==t&&!o(t))continue;const e=P(t);if(e)return e}return null}function B(t){try{return i(t).isFile()}catch{return!1}}export function installedCodexBinaries(){const t=[],o=O();if(o.includes("codex")){const o="win32"===process.platform?["codex.exe","codex.cmd"]:["codex"];for(const e of(process.env.PATH??"").split(a))if(e&&d(e))for(const n of o)t.push(p(e,n))}t.push(...o.filter(t=>"codex"!==t));const e=new Set,n=[];for(const o of t){if(!B(o))continue;let t=o;try{t=s(o)}catch{}const r="win32"===process.platform?t.toLowerCase():t;e.has(r)||(e.add(r),n.push(o))}return n}export function codexBinaryVersion(t){const o=`${k(t,["--version"]).stdout??""}`.match(/(\d+)\.(\d+)\.(\d+)/);return o?o[0]:null}export function catalogRejections(t,o=installedCodexBinaries()){if(0===o.length)return[];const n=e(p(l(),`${M}-codex-`)),s=[];try{c(p(n,"config.toml"),f.stringify({model_catalog_json:t}));for(const t of o){const o=k(t,["debug","models"],{...process.env,CODEX_HOME:n});if(0===o.status)continue;const e=`${o.stderr??""}\n${o.stdout??""}`,r=e.split(/\r?\n/).find(t=>t.includes("model_catalog_json"));r?s.push({bin:t,version:codexBinaryVersion(t),error:r.trim()}):_.logError("catalogRejections",o.error??new Error(`${t} exited ${o.status}: ${e.trim().slice(0,500)}`))}}finally{r(n,{recursive:!0,force:!0})}return s}export function loadPreviousCodexModels(){const t=L()?.filter(t=>!S(t));return t&&t.length>0?t:null}export function previousGatewayModelIds(){return(L()??[]).filter(S).map(t=>String(t.slug))}function L(){return o(codexCatalogPath())?E(n(codexCatalogPath(),"utf-8")):null}function S(t){return"number"==typeof t.priority&&t.priority>=1e3}let T=null;function D(){if(null!==T)return T;const t=[p(j,"..","..","..","codex-base-instructions.md"),p(j,"..","..","codex-base-instructions.md"),p(j,"codex-base-instructions.md")],e=t.find(t=>o(t));if(!e)throw new Error(`codex-base-instructions.md not found, searched: ${t.join(", ")}`);return T=n(e,"utf-8"),T}function F(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:void 0}function I(t,o,e,n){const s=e?t:Math.min(t,o);return{window:s,compact:w(s,n)}}function W(t,o,e,n){const{standardContextWindow:s}=x();let r=F(t.contextWindow)??s;n&&t.id.startsWith("claude-")&&(r=n.has(t.id)?Math.max(r,1e6):Math.min(r,2e5));const{window:i,compact:c}=I(r,s,e,F(t.autoCompactTokens));return{slug:t.id,display_name:t.name||y(t.id),description:h(t.description,{millionContext:i>=1e6})??null,supported_reasoning_levels:[],shell_type:"unified_exec",visibility:"list",supported_in_api:!0,priority:o,additional_speed_tiers:[],service_tiers:[],availability_nux:null,upgrade:null,model_messages:{instructions_template:D()},base_instructions:D(),supports_reasoning_summaries:!0,supports_parallel_tool_calls:!1,prefer_websockets:!1,include_skills_usage_instructions:!1,include_plugin_usage_instructions:!1,include_apps_usage_instructions:!1,default_reasoning_summary:"auto",support_verbosity:!1,default_verbosity:null,apply_patch_tool_type:null,web_search_tool_type:"text",truncation_policy:{mode:"bytes",limit:1e4},supports_image_detail_original:!1,context_window:i,max_context_window:i,auto_compact_token_limit:c,effective_context_window_percent:95,experimental_supported_tools:[],input_modalities:["text","image"],supports_search_tool:!1,supports_experimental_context:!1,use_responses_lite:!1,supports_reasoning_effort_updates:!1,node_repl_auto_review_required:!1,node_repl_disabled:!1}}const G={supports_parallel_tool_calls:!0,supports_reasoning_summaries:!0};export function fillFromOlderEntries(t,o){const e=new Map(o.map(t=>[t.slug,t])),n=new Map;for(const t of o)for(const[o,e]of Object.entries(t))n.has(o)||n.set(o,e);return t.map(t=>{const o=e.get(t.slug),s={...t};for(const[t,e]of n)t in s||(s[t]=o&&t in o?o[t]:e);return s})}function R(t,o,e){if("list"!==(t=function(t){const o=Object.keys(G).filter(o=>!(o in t));return 0===o.length?t:{...t,...Object.fromEntries(o.map(t=>[t,G[t]]))}}(t)).visibility)return t;const n=F(t.context_window);if(!n)return t;const s=F(t.max_context_window)??n,r=e?Math.min(F(o?.contextWindow)??s,s):n,{window:i,compact:c}=I(r,n,!0,F(o?.autoCompactTokens));return{...t,context_window:i,auto_compact_token_limit:c}}export function buildCodexCatalog(t){const{bundled:o,specs:e,oneMillion:n,selectedModel:s}=t,r=t.claudeOneMillion?new Set(t.claudeOneMillion):void 0,i=t.keyModels?new Set(t.keyModels):null,c=new Set(t.gatewayAvailable),l=t=>!i||i.has(t)||t===s,a=t=>c.has(t)||t===s,u=new Map(e.map(t=>[t.id,t])),d=[],p=new Set;for(const t of o){const o="string"==typeof t.slug?t.slug:"";o&&!p.has(o)&&("list"!==t.visibility||l(o))&&(p.add(o),d.push(R(t,u.get(o),n)))}const f=[...e];s&&!u.has(s)&&f.push({id:s});const m=function(t){const o=new Map;for(const e of t){const t=/^claude-([a-z]+)-(.+)$/.exec(e);if(!t)continue;const n=t[2].split("-").filter(t=>/^\d{1,2}$/.test(t)).join("."),s=o.get(t[1]);(!s||g(n,s.version)>0)&&o.set(t[1],{id:e,version:n})}return new Set([...o.values()].map(t=>t.id))}(f.map(t=>t.id).filter(a));for(const t of f)!p.has(t.id)&&a(t.id)&&(t.id.startsWith("claude-")&&!m.has(t.id)&&t.id!==s||(p.add(t.id),d.push(W(t,1e3+d.length,n,r))));return{models:d}}
1
+ import{spawnSync as t}from"child_process";import{existsSync as o,mkdtempSync as e,readFileSync as n,realpathSync as i,rmSync as r,statSync as s,writeFileSync as c}from"fs";import{tmpdir as l}from"os";import{delimiter as u,dirname as a,isAbsolute as d,join as p}from"path";import*as f from"@iarna/toml";import{fileURLToPath as m}from"url";import{logger as _}from"../../utils/logger.js";import{getCodexRules as x,compareVersions as g}from"../model-registry.js";import{autoCompactTokens as h,modelBlurb as w,prettyModelName as y}from"../gateway-models.js";import{codexHome as b,toolHome as v}from"./types.js";import{brandEnv as C,CLI_NAME as M,PROVIDER_KEY as j}from"../brand.js";const A=a(m(import.meta.url));export const CODEX_CATALOG_FILE=`${j}-model-catalog.json`;export const codexCatalogPath=()=>p(b(),CODEX_CATALOG_FILE);function O(){const t=C("CODEX_BIN");if(void 0!==t)return t.trim()?[t.trim()]:[];const o=["codex"];if("win32"===process.platform){const t=process.env.LOCALAPPDATA||p(v(),"AppData","Local");o.push(p(t,"Programs","OpenAI","Codex","bin","codex.exe"))}else o.push(p(v(),".local","bin","codex"));if("darwin"===process.platform)for(const t of["/Applications",p(v(),"Applications")])o.push(p(t,"ChatGPT.app/Contents/Resources/codex-cli/bin/codex")),o.push(p(t,"Codex.app/Contents/Resources/codex"));return o}function E(t){return!!t&&"object"==typeof t&&!Array.isArray(t)}function $(t){try{const o=JSON.parse(t),e=E(o)&&Array.isArray(o.models)?o.models.filter(E):[];return e.length>0?e:null}catch{return null}}function k(o,e,n){const i={encoding:"utf-8",timeout:2e4,maxBuffer:67108864,windowsHide:!0,stdio:["ignore","pipe","pipe"],...n?{env:n}:{}};return"win32"!==process.platform||"codex"!==o&&!/\.cmd$/i.test(o)?t(o,e,i):t(["codex"===o?"codex":`"${o}"`,...e].join(" "),{...i,shell:!0})}function P(t){const o=k(t,["debug","models","--bundled"]);if(0===o.status&&o.stdout){const t=$(o.stdout);if(t)return t}return(o.error||0!==o.status)&&_.logError("loadBundledCodexModels",o.error??new Error(`${t} exited ${o.status}`)),null}export function loadBundledCodexModels(t){if(t)return P(t);for(const t of O()){if("codex"!==t&&!o(t))continue;const e=P(t);if(e)return e}return null}function B(t){try{return s(t).isFile()}catch{return!1}}export function installedCodexBinaries(){const t=[],o=O();if(o.includes("codex")){const o="win32"===process.platform?["codex.exe","codex.cmd"]:["codex"];for(const e of(process.env.PATH??"").split(u))if(e&&d(e))for(const n of o)t.push(p(e,n))}t.push(...o.filter(t=>"codex"!==t));const e=new Set,n=[];for(const o of t){if(!B(o))continue;let t=o;try{t=i(o)}catch{}const r="win32"===process.platform?t.toLowerCase():t;e.has(r)||(e.add(r),n.push(o))}return n}export function codexBinaryVersion(t){const o=`${k(t,["--version"]).stdout??""}`.match(/(\d+)\.(\d+)\.(\d+)/);return o?o[0]:null}export function catalogRejections(t,o=installedCodexBinaries()){if(0===o.length)return[];const n=e(p(l(),`${M}-codex-`)),i=[];try{c(p(n,"config.toml"),f.stringify({model_catalog_json:t}));for(const t of o){const o=k(t,["debug","models"],{...process.env,CODEX_HOME:n});if(0===o.status)continue;const e=`${o.stderr??""}\n${o.stdout??""}`,r=e.split(/\r?\n/).find(t=>t.includes("model_catalog_json"));r?i.push({bin:t,version:codexBinaryVersion(t),error:r.trim()}):_.logError("catalogRejections",o.error??new Error(`${t} exited ${o.status}: ${e.trim().slice(0,500)}`))}}finally{r(n,{recursive:!0,force:!0})}return i}export function loadPreviousCodexModels(){const t=L()?.filter(t=>!S(t));return t&&t.length>0?t:null}export function previousGatewayModelIds(){return(L()??[]).filter(S).map(t=>String(t.slug))}function L(){return o(codexCatalogPath())?$(n(codexCatalogPath(),"utf-8")):null}function S(t){return"number"==typeof t.priority&&t.priority>=1e3}let T=null;function W(){if(null!==T)return T;const t=[p(A,"..","..","..","codex-base-instructions.md"),p(A,"..","..","codex-base-instructions.md"),p(A,"codex-base-instructions.md")],e=t.find(t=>o(t));if(!e)throw new Error(`codex-base-instructions.md not found, searched: ${t.join(", ")}`);return T=n(e,"utf-8"),T}function D(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:void 0}function F(t,o,e,n){const i=e?t:Math.min(t,o);return{window:i,compact:h(i,n)}}function I(t,o,e,n){const{standardContextWindow:i}=x();let r=D(t.contextWindow)??i;n&&t.id.startsWith("claude-")&&(r=n.has(t.id)?Math.max(r,1e6):Math.min(r,2e5));const{window:s,compact:c}=F(r,i,e,D(t.autoCompactTokens));return{slug:t.id,display_name:t.name||y(t.id),description:w(t.description,{millionContext:s>=1e6})??null,supported_reasoning_levels:[],shell_type:"unified_exec",visibility:"list",supported_in_api:!0,priority:o,additional_speed_tiers:[],service_tiers:[],availability_nux:null,upgrade:null,model_messages:{instructions_template:W()},base_instructions:W(),supports_reasoning_summaries:!0,supports_parallel_tool_calls:!1,prefer_websockets:!1,include_skills_usage_instructions:!1,include_plugin_usage_instructions:!1,include_apps_usage_instructions:!1,default_reasoning_summary:"auto",support_verbosity:!1,default_verbosity:null,apply_patch_tool_type:null,web_search_tool_type:"text",truncation_policy:{mode:"bytes",limit:1e4},supports_image_detail_original:!1,context_window:s,max_context_window:s,auto_compact_token_limit:c,effective_context_window_percent:95,experimental_supported_tools:[],input_modalities:["text","image"],supports_search_tool:!1,supports_experimental_context:!1,use_responses_lite:!1,supports_reasoning_effort_updates:!1,node_repl_auto_review_required:!1,node_repl_disabled:!1}}const G={supports_parallel_tool_calls:!0,supports_reasoning_summaries:!0};export function fillFromOlderEntries(t,o){const e=new Map(o.map(t=>[t.slug,t])),n=new Map;for(const t of o)for(const[o,e]of Object.entries(t))n.has(o)||n.set(o,e);return t.map(t=>{const o=e.get(t.slug),i={...t};for(const[t,e]of n)t in i||(i[t]=o&&t in o?o[t]:e);return i})}function R(t,o,e){if("list"!==(t=function(t){const o=Object.keys(G).filter(o=>!(o in t));return 0===o.length?t:{...t,...Object.fromEntries(o.map(t=>[t,G[t]]))}}(t)).visibility)return t;const n=D(t.context_window);if(!n)return t;const i=D(t.max_context_window)??n,r=e?Math.min(D(o?.contextWindow)??i,i):n,{window:s,compact:c}=F(r,n,!0,D(o?.autoCompactTokens));return{...t,context_window:s,auto_compact_token_limit:c}}function X(t,o){if(!t.startsWith("gpt-"))return;let e,n=4;for(const i of o){const o="string"==typeof i.slug?i.slug:"";if(!o.startsWith("gpt-")||"list"!==i.visibility)continue;let r=0;for(;r<o.length&&o[r]===t[r];)r++;r>n&&(e=i,n=r)}return e}function H(t,o,e,n){return R({...t,...Object.fromEntries(["slug","display_name","description","priority"].map(t=>[t,o[t]])),upgrade:null,availability_nux:null},e,n)}export function buildCodexCatalog(t){const{bundled:o,specs:e,oneMillion:n,selectedModel:i}=t,r=t.claudeOneMillion?new Set(t.claudeOneMillion):void 0,s=t.keyModels?new Set(t.keyModels):null,c=new Set(t.gatewayAvailable),l=t=>!s||s.has(t)||t===i,u=t=>c.has(t)||t===i,a=new Map(e.map(t=>[t.id,t])),d=[],p=new Set;for(const t of o){const o="string"==typeof t.slug?t.slug:"";o&&!p.has(o)&&("list"!==t.visibility||l(o))&&(p.add(o),d.push(R(t,a.get(o),n)))}const f=[...e];i&&!a.has(i)&&f.push({id:i});const m=function(t){const o=new Map;for(const e of t){const t=/^claude-([a-z]+)-(.+)$/.exec(e);if(!t)continue;const n=t[2].split("-").filter(t=>/^\d{1,2}$/.test(t)).join("."),i=o.get(t[1]);(!i||g(n,i.version)>0)&&o.set(t[1],{id:e,version:n})}return new Set([...o.values()].map(t=>t.id))}(f.map(t=>t.id).filter(u));for(const t of f){if(p.has(t.id)||!u(t.id))continue;if(t.id.startsWith("claude-")&&!m.has(t.id)&&t.id!==i)continue;p.add(t.id);const e=I(t,1e3+d.length,n,r),s=X(t.id,o);d.push(s?H(s,e,t,n):e)}return{models:d}}
@@ -874,7 +874,7 @@
874
874
  },
875
875
  "update": {
876
876
  "summary": "Check for a newer {{product}}",
877
- "description": "Checks {{updateSources}} in turn and prints the install command when a newer version exists.\nA global install also checks at startup (every 6 hours) and, when there is a newer version, installs it and reruns the command.",
877
+ "description": "Checks {{updateSources}} in turn and prints the install command when a newer version exists.\nA global install also checks at every start and, when there is a newer version, installs it and reruns the command.",
878
878
  "ex": {
879
879
  "check": "Check for a new version",
880
880
  "json": "Print JSON"
@@ -874,7 +874,7 @@
874
874
  },
875
875
  "update": {
876
876
  "summary": "检查 {{product}} 是否有新版本",
877
- "description": "依次查询这些来源:{{updateSources}}。有新版本时给出安装命令。\n全局安装的 {{product}} 启动时也会检查(每 6 小时一次),有新版本时自动安装并重新运行当前命令。",
877
+ "description": "依次查询这些来源:{{updateSources}}。有新版本时给出安装命令。\n全局安装的 {{product}} 每次启动时也会检查,有新版本时自动安装并重新运行当前命令。",
878
878
  "ex": {
879
879
  "check": "检查新版本",
880
880
  "json": "输出 JSON"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xhscopy-ai/cli",
3
- "version": "0.0.136",
3
+ "version": "0.0.138",
4
4
  "description": "Configure Claude Code, Codex, Grok Build and other coding tools for Xhscopy AI with one command",
5
5
  "main": "dist/index.js",
6
6
  "bin": {