ccjk 15.5.0 → 15.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -86
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/menu.js +7 -3
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/version.js +211 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/core/tools.js +6 -0
- package/dist/core/tools.js.map +1 -1
- package/dist/core/versions.js +110 -0
- package/dist/core/versions.js.map +1 -0
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ccjk
|
|
2
2
|
|
|
3
|
-
> Clavue / Claude Code
|
|
3
|
+
> Clavue / Claude Code / Codex 的本地配置 CLI。一条命令搞定 API、Profile、权限、MCP、状态栏、版本管理。
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/ccjk)
|
|
6
6
|
[](./LICENSE)
|
|
@@ -12,44 +12,90 @@
|
|
|
12
12
|
npm install -g ccjk
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
升级:`npm install -g ccjk@latest`
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
ccjk
|
|
23
|
-
ccjk
|
|
24
|
-
ccjk
|
|
25
|
-
ccjk
|
|
26
|
-
|
|
17
|
+
## ccjk 能干什么
|
|
18
|
+
|
|
19
|
+
| 场景 | 命令 |
|
|
20
|
+
|---|---|
|
|
21
|
+
| 第一次配 API key | `ccjk init` |
|
|
22
|
+
| 多个 API key 之间切换(GLM/Kimi/Anthropic/...) | `ccjk use` |
|
|
23
|
+
| 不想每次都点确认权限 | `ccjk perms standard` |
|
|
24
|
+
| 看不到当前模型/用量 | `ccjk statusline-install` |
|
|
25
|
+
| settings.json 出问题 | `ccjk doctor --fix` |
|
|
26
|
+
| 装 MCP 服务(context7、serena、playwright...) | `ccjk mcp` |
|
|
27
|
+
| 看哪个工具该升级了 | `ccjk tools --check-updates` |
|
|
28
|
+
| 写入出错想还原 | `ccjk rollback` |
|
|
29
|
+
| 跨机器迁移配置 | `ccjk profile export` / `import` |
|
|
30
|
+
| 不想记命令 | `ccjk`(交互菜单) |
|
|
27
31
|
|
|
28
32
|
## 命令一览
|
|
29
33
|
|
|
34
|
+
### 配置 API(init / use / profile)
|
|
35
|
+
|
|
30
36
|
| 命令 | 用途 |
|
|
31
37
|
|---|---|
|
|
32
|
-
| `ccjk` |
|
|
33
|
-
| `ccjk
|
|
34
|
-
| `ccjk
|
|
35
|
-
| `ccjk profile
|
|
36
|
-
| `ccjk profile
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
| `ccjk init` | 配 API:写 `~/.claude/settings.json` 的 env,并自动保存为 profile |
|
|
39
|
+
| `ccjk use [name]` | 一键切换 profile(不带参=交互选) |
|
|
40
|
+
| `ccjk profile ls` / `show` / `rm` | profile 列表 / 详情 / 删除 |
|
|
41
|
+
| `ccjk profile export` | 导出 profile 为 JSON 包(迁移 / 团队共享) |
|
|
42
|
+
| `ccjk profile import <file>` | 从 JSON 包导入 profile |
|
|
43
|
+
|
|
44
|
+
### 权限档位(perms)
|
|
45
|
+
|
|
46
|
+
| 命令 | 用途 |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `ccjk perms [tier]` | 一键设权限档位(`safe` / `standard` / `yolo`),同步 3 个工具 |
|
|
39
49
|
| `ccjk perms-show` | 查看三个工具当前的权限状态 |
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
|
|
51
|
+
### MCP 服务
|
|
52
|
+
|
|
53
|
+
| 命令 | 用途 |
|
|
54
|
+
|---|---|
|
|
42
55
|
| `ccjk mcp` | 选装预设 MCP 服务(交互勾选) |
|
|
43
56
|
| `ccjk mcp-ls` | 列出已安装的 MCP |
|
|
44
|
-
| `ccjk mcp-add
|
|
57
|
+
| `ccjk mcp-add <name>` | 添加自定义 MCP 服务 |
|
|
45
58
|
| `ccjk mcp-rm [name]` | 卸载 MCP 服务 |
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
|
|
60
|
+
### 状态栏(statusline)
|
|
61
|
+
|
|
62
|
+
| 命令 | 用途 |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `ccjk statusline-install` | 安装状态栏,显示模型 / 目录 / context 用量 / 今日调用 / 速率 |
|
|
65
|
+
| `ccjk statusline-uninstall` | 卸载状态栏 |
|
|
66
|
+
|
|
67
|
+
### 体检 / 还原
|
|
68
|
+
|
|
69
|
+
| 命令 | 用途 |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `ccjk doctor` | 检查 settings.json 的常见配置问题 |
|
|
72
|
+
| `ccjk doctor --fix` | 自动修可修的问题(修改前备份) |
|
|
73
|
+
| `ccjk rollback` | 从备份还原 settings.json / config.toml |
|
|
74
|
+
|
|
75
|
+
### 工具版本管理
|
|
76
|
+
|
|
77
|
+
| 命令 | 用途 |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `ccjk tools` | 查看 Clavue / Claude Code / Codex 本地版本 |
|
|
80
|
+
| `ccjk tools --check-updates` | 加查 npm latest,标记 outdated |
|
|
81
|
+
| `ccjk install [tool]` | 安装代码工具(`--all` 装全部缺失的) |
|
|
82
|
+
| `ccjk update [tool]` | 升级代码工具到最新版(`--all` 全部 outdated) |
|
|
83
|
+
|
|
84
|
+
### 其他
|
|
85
|
+
|
|
86
|
+
| 命令 | 用途 |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `ccjk` | 交互菜单(默认) |
|
|
49
89
|
| `ccjk detect` | 列出已安装的代码工具 |
|
|
50
90
|
| `ccjk git-install` | 安装 `/ccjk:git-commit` 等 slash 命令模板 |
|
|
51
91
|
|
|
52
|
-
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 详解
|
|
95
|
+
|
|
96
|
+
### Profile:多 API 切换
|
|
97
|
+
|
|
98
|
+
`ccjk init` 配完 API 默认会问"保存为 profile?"。之后 `ccjk use` 可以在多个 profile 之间一键切换:
|
|
53
99
|
|
|
54
100
|
```bash
|
|
55
101
|
ccjk init -t clavue -p glm --api-key sk-xxx --profile work -y
|
|
@@ -67,12 +113,12 @@ Profile 存储在 `~/.ccjk/profiles/<name>.json`,当前激活的记录在 `~/.
|
|
|
67
113
|
#### 导出 / 导入:跨机器迁移
|
|
68
114
|
|
|
69
115
|
```bash
|
|
70
|
-
ccjk profile export
|
|
71
|
-
ccjk profile export -n work free -o team.json -y
|
|
72
|
-
ccjk profile export --redact -o template.json -y
|
|
116
|
+
ccjk profile export # 交互勾选
|
|
117
|
+
ccjk profile export -n work free -o team.json -y # 直接导出 work + free
|
|
118
|
+
ccjk profile export --redact -o template.json -y # 抹去 API key("模板")
|
|
73
119
|
|
|
74
120
|
# 在另一台机器
|
|
75
|
-
ccjk profile import team.json
|
|
121
|
+
ccjk profile import team.json # 同名时交互问跳过/覆盖/重命名
|
|
76
122
|
ccjk profile import team.json --conflict skip -y # 全部 skip 已有的
|
|
77
123
|
```
|
|
78
124
|
|
|
@@ -82,37 +128,50 @@ ccjk profile import team.json --conflict skip -y # 全部 skip 已有的
|
|
|
82
128
|
|
|
83
129
|
一条命令把 Clavue / Claude Code / Codex 的权限同步到同一档位,减少每次操作都要点确认的烦躁。
|
|
84
130
|
|
|
85
|
-
| 档位 | 适合 | Claude/Clavue | Codex |
|
|
131
|
+
| 档位 | 适合 | Claude / Clavue | Codex |
|
|
86
132
|
|---|---|---|---|
|
|
87
133
|
| `safe` | 浏览代码、新手 | 仅放行只读(Read/Grep/...) | `approval_policy=untrusted`, `sandbox_mode=read-only` |
|
|
88
134
|
| `standard`(推荐) | 日常开发 | + git/npm/pnpm/python/ls/cat 等高频命令 | `approval_policy=on-failure`, `sandbox_mode=workspace-write` |
|
|
89
135
|
| `yolo` | 可信项目放飞 | `Bash(*)` + `allowUnsandboxedCommands=true` | `approval_policy=never`, `sandbox_mode=workspace-write` |
|
|
90
136
|
|
|
91
|
-
不论哪一档,都强制写入 `deny`:`rm -rf /`、`git push --force`、`npm publish`、`sudo` 等不可逆 /
|
|
137
|
+
不论哪一档,都强制写入 `deny`:`rm -rf /`、`git push --force`、`npm publish`、`sudo` 等不可逆 / 高危命令。
|
|
92
138
|
|
|
93
139
|
```bash
|
|
94
|
-
ccjk perms
|
|
95
|
-
ccjk perms standard
|
|
96
|
-
ccjk perms safe --tools clavue,claude-code
|
|
97
|
-
ccjk perms yolo --reset
|
|
98
|
-
ccjk perms-show
|
|
140
|
+
ccjk perms # 交互选档位(推荐)
|
|
141
|
+
ccjk perms standard # 直接应用 standard 到全部 3 个工具
|
|
142
|
+
ccjk perms safe --tools clavue,claude-code # 只作用于这两个
|
|
143
|
+
ccjk perms yolo --reset # --reset 会清空原 allow 后再写
|
|
144
|
+
ccjk perms-show # 看三个工具当前各是哪档
|
|
99
145
|
```
|
|
100
146
|
|
|
101
147
|
合并策略:
|
|
102
148
|
- `allow`:默认 append + dedupe,保护用户自定义白名单。`--reset` 强制覆盖。
|
|
103
149
|
- `deny`:始终覆盖,确保危险命令一定被拦。
|
|
104
150
|
|
|
105
|
-
###
|
|
151
|
+
### Statusline:底部状态栏
|
|
152
|
+
|
|
153
|
+
显示模型、当前目录、context 用量、今日 API 调用次数、tokens 速率。
|
|
106
154
|
|
|
107
155
|
```bash
|
|
108
|
-
ccjk
|
|
109
|
-
ccjk
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
156
|
+
ccjk statusline-install # 写入 settings.statusLine(重启 Claude Code 生效)
|
|
157
|
+
ccjk statusline-uninstall # 卸载
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
效果(一行):
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
Sonnet 4.5 1M │ 📁 ccjk │ ⚡ 4.5% 45.0k │ 12 calls · 1.5k tok/m
|
|
114
164
|
```
|
|
115
165
|
|
|
166
|
+
字段含义:
|
|
167
|
+
- `Sonnet 4.5 1M` — 模型名 + context window 大小(1M / 200k)
|
|
168
|
+
- `📁 ccjk` — 当前工作目录的 basename(home 显示为 `~`)
|
|
169
|
+
- `⚡ 4.5% 45.0k` — context 已用百分比 + 当前 token 数
|
|
170
|
+
- `12 calls` — 今日总 API 调用数(聚合所有 transcripts)
|
|
171
|
+
- `1.5k tok/m` 或 `80 tok/s` — 今日产出速率(output tokens / 活跃秒数)
|
|
172
|
+
|
|
173
|
+
实现:扫 `~/.claude/projects/*/*.jsonl` 当天 mtime 文件,读 `message.usage` 聚合。错误一律 swallow,不会让 Claude Code UI 报红。
|
|
174
|
+
|
|
116
175
|
### Doctor:体检 + 自动修复
|
|
117
176
|
|
|
118
177
|
```bash
|
|
@@ -121,12 +180,17 @@ ccjk doctor --fix # 自动修可修的(修改前备份)
|
|
|
121
180
|
ccjk doctor --fix -y # 跳过确认
|
|
122
181
|
```
|
|
123
182
|
|
|
124
|
-
|
|
125
|
-
|
|
183
|
+
| 规则 | 严重度 | 自动修 | 说明 |
|
|
184
|
+
|---|---|---|---|
|
|
185
|
+
| `model-overrides-env` | error | ✓ | 顶层 `settings.model` 会覆盖 `env.ANTHROPIC_MODEL` |
|
|
186
|
+
| `duplicate-auth` | warn | ✓ | 同时存在 `API_KEY` 和 `AUTH_TOKEN`(保留 AUTH_TOKEN,删 API_KEY) |
|
|
187
|
+
| `missing-credentials` | error | ✗ | 设了 `BASE_URL` 但缺凭证 → 跑 `ccjk init` |
|
|
188
|
+
| `invalid-base-url` | error | ✗ | URL 格式不合法 → 跑 `ccjk init` |
|
|
189
|
+
| `hook-bloat` | warn | ✗ | 单个 hook 注册超过 5 个处理器(人工审查) |
|
|
126
190
|
|
|
127
191
|
### Rollback:从备份还原
|
|
128
192
|
|
|
129
|
-
每次 `init` / `mcp` / `perms` / `doctor --fix` 写入前都会自动备份到
|
|
193
|
+
每次 `init` / `mcp` / `perms` / `doctor --fix` / `mcp-add/rm` / `statusline-install` 写入前都会自动备份到 `<file>.bak-<ISO时间戳>`。
|
|
130
194
|
|
|
131
195
|
```bash
|
|
132
196
|
ccjk rollback # 列所有备份,按时间倒序
|
|
@@ -135,74 +199,88 @@ ccjk rollback -t clavue # 只看一个工具的备份
|
|
|
135
199
|
|
|
136
200
|
还原前会再备份一份当前状态,所以**还原本身也可还原**。
|
|
137
201
|
|
|
138
|
-
###
|
|
202
|
+
### Tools / Install / Update:版本管理
|
|
139
203
|
|
|
140
|
-
|
|
204
|
+
三个开发工具的本地版本、npm 最新版、安装、升级——都在 ccjk 里。
|
|
141
205
|
|
|
142
206
|
```bash
|
|
143
|
-
ccjk
|
|
144
|
-
ccjk
|
|
207
|
+
ccjk tools # 看本地版本
|
|
208
|
+
ccjk tools --check-updates # 加查 npm latest
|
|
209
|
+
|
|
210
|
+
ccjk install # 交互选要装的工具
|
|
211
|
+
ccjk install codex # 直接装 Codex
|
|
212
|
+
ccjk install --all # 装全部缺失的
|
|
213
|
+
|
|
214
|
+
ccjk update # 交互选 outdated 的工具
|
|
215
|
+
ccjk update claude-code # 直接升级 Claude Code
|
|
216
|
+
ccjk update --all # 升级所有 outdated
|
|
217
|
+
ccjk update --dry-run # 只显示命令不执行
|
|
145
218
|
```
|
|
146
219
|
|
|
147
|
-
|
|
220
|
+
输出示例:
|
|
148
221
|
|
|
149
222
|
```
|
|
150
|
-
|
|
223
|
+
Clavue 8.9.2 (latest)
|
|
224
|
+
Claude Code 2.1.138 (latest)
|
|
225
|
+
Codex 0.128.0 → 0.130.0 可升级
|
|
151
226
|
```
|
|
152
227
|
|
|
153
|
-
|
|
154
|
-
- `Sonnet 4.5 1M` — 模型名 + context window 大小(1M / 200k)
|
|
155
|
-
- `📁 ccjk` — 当前工作目录的 basename(home 显示为 `~`)
|
|
156
|
-
- `⚡ 4.5% 45.0k` — context 已用百分比 + 当前 token 数
|
|
157
|
-
- `12 calls` — 今日总 API 调用数(聚合所有 transcripts)
|
|
158
|
-
- `1.5k tok/m` 或 `80 tok/s` — 今日产出速率(output tokens / 跨度秒数)
|
|
228
|
+
实现是 `npm install -g <pkg>` / `npm install -g <pkg>@<latest>`,命令完整列出后等用户确认。npm 因权限失败时会输出建议的 `sudo` 命令让用户自己跑,不假装成功。
|
|
159
229
|
|
|
160
|
-
|
|
230
|
+
### 非交互模式
|
|
161
231
|
|
|
162
|
-
|
|
232
|
+
适合脚本 / CI / 装机:
|
|
163
233
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
234
|
+
```bash
|
|
235
|
+
ccjk init -t clavue -p glm --api-key sk-xxx --profile work -y
|
|
236
|
+
ccjk perms standard -y
|
|
237
|
+
ccjk mcp -s context7 serena -y
|
|
238
|
+
ccjk mcp-add my-server --command npx --args "-y @scope/pkg" -y
|
|
239
|
+
ccjk doctor --fix -y
|
|
240
|
+
ccjk statusline-install -y
|
|
241
|
+
ccjk update --all -y
|
|
242
|
+
ccjk git-install --scope user -y
|
|
243
|
+
```
|
|
171
244
|
|
|
172
|
-
|
|
245
|
+
---
|
|
173
246
|
|
|
174
|
-
##
|
|
247
|
+
## 支持的工具
|
|
175
248
|
|
|
176
|
-
|
|
|
249
|
+
| 工具 | 配置目标 | 范围 |
|
|
177
250
|
|---|---|---|
|
|
178
|
-
|
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
|
|
182
|
-
|
|
251
|
+
| Clavue | `~/.claude/settings.json` | API / Profile / Perms / MCP / Statusline / Doctor / Rollback |
|
|
252
|
+
| Claude Code | `~/.claude/settings.json` | API / Profile / Perms / MCP / Statusline / Doctor / Rollback |
|
|
253
|
+
| Codex | `~/.codex/config.toml` | Perms / Detect / Install / Update(API 配置请直接编辑 config.toml) |
|
|
254
|
+
|
|
255
|
+
### 内置 API Provider
|
|
256
|
+
|
|
257
|
+
`glm` / `kimi` / `minimax` / `anthropic` / `custom`
|
|
183
258
|
|
|
184
259
|
## 设计原则
|
|
185
260
|
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
-
|
|
261
|
+
- **配置工具就是配置工具**。不做 brain、orchestrator、sandbox、dashboard 这类东西。
|
|
262
|
+
- **不主动写代码**。不写 `~/.claude/CLAUDE.md`,不装 hooks,不开后台进程。
|
|
263
|
+
- **可还原**。所有写入前都备份;`ccjk rollback` 能找回任何旧版本。
|
|
264
|
+
- **可重复**。所有交互式命令都有非交互参数(`-y`、`--profile`、`--tools`、`--services`...),适合脚本。
|
|
265
|
+
- **不偷跑命令**。`install` / `update` 会显示完整命令并等用户确认。
|
|
189
266
|
|
|
190
267
|
## 从 v14 升级
|
|
191
268
|
|
|
192
|
-
v15
|
|
269
|
+
v15 是从零重写的精简版本,命令集和行为都和 v14.x 不兼容:
|
|
193
270
|
|
|
194
|
-
- v14 的子命令(brain/sandbox/teleport/cloud-sync 等)在 v15
|
|
195
|
-
- v14 在 `~/.claude/CLAUDE.md`
|
|
196
|
-
- 如果你只用 v14 的 init/mcp/doctor/git
|
|
271
|
+
- v14 的子命令(brain/sandbox/teleport/cloud-sync 等)在 v15 **不存在**。
|
|
272
|
+
- v14 在 `~/.claude/CLAUDE.md` 注入的 "Smart Assistant Mode" 在 v15 **不会再写入**。如需手动清理旧版残留,删除该文件中相关段落即可。
|
|
273
|
+
- 如果你只用 v14 的 init/mcp/doctor/git 等核心功能,直接 `npm install -g ccjk@latest` 升级即可。
|
|
197
274
|
- 需要 v14 的扩展能力,请固定旧版本:`npm install -g ccjk@14`。
|
|
198
275
|
|
|
199
276
|
## 开发
|
|
200
277
|
|
|
201
278
|
```bash
|
|
202
279
|
pnpm install
|
|
203
|
-
pnpm typecheck
|
|
204
|
-
pnpm test
|
|
205
|
-
pnpm
|
|
280
|
+
pnpm typecheck # TypeScript 检查
|
|
281
|
+
pnpm test # 跑全部测试(>100 测试)
|
|
282
|
+
pnpm lint # ESLint
|
|
283
|
+
pnpm build # tsc 出 dist/
|
|
206
284
|
```
|
|
207
285
|
|
|
208
286
|
## 许可
|
package/dist/cli.js
CHANGED
|
@@ -15,6 +15,7 @@ import { profileExportCommand, profileImportCommand } from './commands/profile-p
|
|
|
15
15
|
import { permsCommand, permsShowCommand } from './commands/perms.js';
|
|
16
16
|
import { rollbackCommand } from './commands/rollback.js';
|
|
17
17
|
import { statusLineCommand, statusLineInstallCommand, statusLineUninstallCommand, } from './commands/statusline.js';
|
|
18
|
+
import { installCommand, updateCommand, versionCommand } from './commands/version.js';
|
|
18
19
|
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
|
|
19
20
|
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
20
21
|
const program = new Command();
|
|
@@ -144,6 +145,25 @@ program
|
|
|
144
145
|
.command('detect')
|
|
145
146
|
.description('检测已安装的代码工具')
|
|
146
147
|
.action(detectCommand);
|
|
148
|
+
program
|
|
149
|
+
.command('tools')
|
|
150
|
+
.description('查看 Clavue / Claude Code / Codex 的本地版本(加 --check-updates 查最新)')
|
|
151
|
+
.option('--check-updates', '查询 npm 上的最新版本')
|
|
152
|
+
.action((opts) => versionCommand(opts));
|
|
153
|
+
program
|
|
154
|
+
.command('install [tool]')
|
|
155
|
+
.description('安装代码工具(不带参=交互选择)')
|
|
156
|
+
.option('--all', '装全部缺失的工具')
|
|
157
|
+
.option('--dry-run', '只显示命令不执行')
|
|
158
|
+
.option('-y, --yes', '跳过确认')
|
|
159
|
+
.action((tool, opts) => installCommand(tool, opts));
|
|
160
|
+
program
|
|
161
|
+
.command('update [tool]')
|
|
162
|
+
.description('升级代码工具到最新版(不带参=交互选 outdated)')
|
|
163
|
+
.option('--all', '更新全部 outdated 工具')
|
|
164
|
+
.option('--dry-run', '只显示命令不执行')
|
|
165
|
+
.option('-y, --yes', '跳过确认')
|
|
166
|
+
.action((tool, opts) => updateCommand(tool, opts));
|
|
147
167
|
program
|
|
148
168
|
.command('git-install')
|
|
149
169
|
.description('安装 git slash 命令模板到 Claude Code/Clavue')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/menu.js
CHANGED
|
@@ -9,6 +9,7 @@ import { profileUseCommand } from './profile.js';
|
|
|
9
9
|
import { permsCommand } from './perms.js';
|
|
10
10
|
import { rollbackCommand } from './rollback.js';
|
|
11
11
|
import { statusLineInstallCommand } from './statusline.js';
|
|
12
|
+
import { installCommand, updateCommand, versionCommand } from './version.js';
|
|
12
13
|
import { listProfiles, readState } from '../core/profiles.js';
|
|
13
14
|
const ITEMS = [
|
|
14
15
|
{ key: '1', label: '配置 API(init)', run: () => initCommand() },
|
|
@@ -18,8 +19,11 @@ const ITEMS = [
|
|
|
18
19
|
{ key: '5', label: '配置 MCP 服务', run: () => mcpCommand() },
|
|
19
20
|
{ key: '6', label: '体检(doctor)', run: () => doctorCommand() },
|
|
20
21
|
{ key: '7', label: '从备份还原(rollback)', run: () => rollbackCommand() },
|
|
21
|
-
{ key: '8', label: '
|
|
22
|
-
{ key: '9', label: '
|
|
22
|
+
{ key: '8', label: '查看工具版本 / 检查更新', run: () => versionCommand({ checkUpdates: true }) },
|
|
23
|
+
{ key: '9', label: '安装代码工具(Clavue/Claude Code/Codex)', run: () => installCommand(undefined) },
|
|
24
|
+
{ key: '0', label: '更新代码工具到最新版', run: () => updateCommand(undefined) },
|
|
25
|
+
{ key: 'g', label: '安装 Git 命令模板', run: () => gitInstallCommand() },
|
|
26
|
+
{ key: 'd', label: '检测已安装的工具', run: async () => detectCommand() },
|
|
23
27
|
];
|
|
24
28
|
export async function menuCommand() {
|
|
25
29
|
console.log(ansis.bold('\nccjk - Clavue/Claude Code 配置助手\n'));
|
|
@@ -37,7 +41,7 @@ export async function menuCommand() {
|
|
|
37
41
|
type: 'input',
|
|
38
42
|
name: 'choice',
|
|
39
43
|
message: '\n选择',
|
|
40
|
-
validate: (v) => /^[
|
|
44
|
+
validate: (v) => /^([0-9]|[gdq])$/.test(v.trim()) || '输入有效的选项',
|
|
41
45
|
}]);
|
|
42
46
|
if (choice.trim() === 'q')
|
|
43
47
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/commands/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import ansis from 'ansis';
|
|
4
|
+
import { TOOLS } from '../core/tools.js';
|
|
5
|
+
import { getAllVersions, getInstalledVersion } from '../core/versions.js';
|
|
6
|
+
export async function versionCommand(opts = {}) {
|
|
7
|
+
console.log(ansis.bold('\n工具版本:\n'));
|
|
8
|
+
if (opts.checkUpdates) {
|
|
9
|
+
console.log(ansis.dim(' 正在查询 npm registry...\n'));
|
|
10
|
+
}
|
|
11
|
+
const versions = getAllVersions(opts.checkUpdates ?? false);
|
|
12
|
+
for (const v of versions) {
|
|
13
|
+
const name = ansis.bold(v.meta.displayName.padEnd(14));
|
|
14
|
+
const localStr = v.installed
|
|
15
|
+
? (v.local ? ansis.green(v.local) : ansis.yellow('已装(版本未知)'))
|
|
16
|
+
: ansis.gray('未安装');
|
|
17
|
+
let suffix = '';
|
|
18
|
+
if (v.installed && v.latest) {
|
|
19
|
+
if (v.outdated) {
|
|
20
|
+
suffix = ` ${ansis.yellow(`→ ${v.latest} 可升级`)}`;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
suffix = ` ${ansis.dim(`(latest)`)}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (!v.installed && v.latest) {
|
|
27
|
+
suffix = ` ${ansis.dim(`latest: ${v.latest}`)}`;
|
|
28
|
+
}
|
|
29
|
+
console.log(` ${name} ${localStr}${suffix}`);
|
|
30
|
+
}
|
|
31
|
+
if (!opts.checkUpdates) {
|
|
32
|
+
console.log(ansis.dim('\n 加 --check-updates 查询最新版本\n'));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const outdated = versions.filter(v => v.outdated);
|
|
36
|
+
const missing = versions.filter(v => !v.installed);
|
|
37
|
+
console.log();
|
|
38
|
+
if (outdated.length > 0) {
|
|
39
|
+
console.log(ansis.yellow(` ${outdated.length} 个工具有新版本 — 运行 \`ccjk update\``));
|
|
40
|
+
}
|
|
41
|
+
if (missing.length > 0) {
|
|
42
|
+
console.log(ansis.dim(` ${missing.length} 个工具未安装 — 运行 \`ccjk install\``));
|
|
43
|
+
}
|
|
44
|
+
if (outdated.length === 0 && missing.length === 0) {
|
|
45
|
+
console.log(ansis.green(' ✓ 全部最新'));
|
|
46
|
+
}
|
|
47
|
+
console.log();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function installCommand(toolArg, opts = {}) {
|
|
51
|
+
const targets = await resolveInstallTargets(toolArg, opts);
|
|
52
|
+
if (targets.length === 0) {
|
|
53
|
+
console.log(ansis.gray('\n没有要安装的工具。\n'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const cmds = targets.map(t => `npm install -g ${TOOLS[t].npmPackage}`);
|
|
57
|
+
console.log(ansis.bold('\n将要执行的命令:\n'));
|
|
58
|
+
for (const c of cmds)
|
|
59
|
+
console.log(` ${ansis.cyan(c)}`);
|
|
60
|
+
console.log();
|
|
61
|
+
if (opts.dryRun) {
|
|
62
|
+
console.log(ansis.dim('(--dry-run 仅展示,不执行)\n'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!opts.yes) {
|
|
66
|
+
const { ok } = await inquirer.prompt([{
|
|
67
|
+
type: 'confirm',
|
|
68
|
+
name: 'ok',
|
|
69
|
+
message: `确认执行${targets.length > 1 ? `(${targets.length} 个)` : ''}?需要联网,可能需要 sudo`,
|
|
70
|
+
default: true,
|
|
71
|
+
}]);
|
|
72
|
+
if (!ok) {
|
|
73
|
+
console.log(ansis.gray('已取消。\n'));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await runNpmCommands(targets.map(t => ({ tool: t, args: ['install', '-g', TOOLS[t].npmPackage] })));
|
|
78
|
+
}
|
|
79
|
+
async function resolveInstallTargets(toolArg, opts) {
|
|
80
|
+
if (opts.all) {
|
|
81
|
+
return Object.keys(TOOLS).filter(t => !getInstalledVersion(t).installed);
|
|
82
|
+
}
|
|
83
|
+
if (toolArg) {
|
|
84
|
+
if (!(toolArg in TOOLS)) {
|
|
85
|
+
throw new Error(`未知工具 "${toolArg}"。可选: ${Object.keys(TOOLS).join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
return [toolArg];
|
|
88
|
+
}
|
|
89
|
+
// 交互选择
|
|
90
|
+
const versions = getAllVersions(false);
|
|
91
|
+
const choices = versions.map(v => ({
|
|
92
|
+
name: `${v.meta.displayName.padEnd(14)} ${v.installed ? ansis.green(`已装 ${v.local ?? ''}`) : ansis.gray('未安装')}`,
|
|
93
|
+
value: v.tool,
|
|
94
|
+
checked: !v.installed,
|
|
95
|
+
}));
|
|
96
|
+
const { tools } = await inquirer.prompt([{
|
|
97
|
+
type: 'checkbox',
|
|
98
|
+
name: 'tools',
|
|
99
|
+
message: '选择要安装的工具(已安装的会被覆盖为最新版)',
|
|
100
|
+
choices,
|
|
101
|
+
}]);
|
|
102
|
+
return tools;
|
|
103
|
+
}
|
|
104
|
+
export async function updateCommand(toolArg, opts = {}) {
|
|
105
|
+
const targets = await resolveUpdateTargets(toolArg, opts);
|
|
106
|
+
if (targets.length === 0) {
|
|
107
|
+
console.log(ansis.green('\n✓ 没有需要更新的工具。\n'));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(ansis.bold('\n将要更新:\n'));
|
|
111
|
+
for (const v of targets) {
|
|
112
|
+
const arrow = v.local ? `${ansis.dim(v.local)} → ${ansis.green(v.latest)}` : ansis.green(v.latest);
|
|
113
|
+
console.log(` ${v.meta.displayName.padEnd(14)} ${arrow}`);
|
|
114
|
+
}
|
|
115
|
+
console.log();
|
|
116
|
+
const cmds = targets.map(v => `npm install -g ${v.meta.npmPackage}@${v.latest}`);
|
|
117
|
+
console.log(ansis.bold('命令:'));
|
|
118
|
+
for (const c of cmds)
|
|
119
|
+
console.log(` ${ansis.cyan(c)}`);
|
|
120
|
+
console.log();
|
|
121
|
+
if (opts.dryRun) {
|
|
122
|
+
console.log(ansis.dim('(--dry-run 仅展示)\n'));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (!opts.yes) {
|
|
126
|
+
const { ok } = await inquirer.prompt([{
|
|
127
|
+
type: 'confirm', name: 'ok', message: '确认更新?', default: true,
|
|
128
|
+
}]);
|
|
129
|
+
if (!ok) {
|
|
130
|
+
console.log(ansis.gray('已取消。\n'));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
await runNpmCommands(targets.map(v => ({
|
|
135
|
+
tool: v.tool,
|
|
136
|
+
args: ['install', '-g', `${v.meta.npmPackage}@${v.latest}`],
|
|
137
|
+
})));
|
|
138
|
+
}
|
|
139
|
+
async function resolveUpdateTargets(toolArg, opts) {
|
|
140
|
+
console.log(ansis.dim('\n正在查询最新版本...'));
|
|
141
|
+
const versions = getAllVersions(true);
|
|
142
|
+
if (opts.all) {
|
|
143
|
+
return versions.filter(v => v.installed && v.outdated);
|
|
144
|
+
}
|
|
145
|
+
if (toolArg) {
|
|
146
|
+
if (!(toolArg in TOOLS)) {
|
|
147
|
+
throw new Error(`未知工具 "${toolArg}"`);
|
|
148
|
+
}
|
|
149
|
+
const v = versions.find(x => x.tool === toolArg);
|
|
150
|
+
if (!v.installed) {
|
|
151
|
+
throw new Error(`${v.meta.displayName} 未安装,请先 \`ccjk install ${toolArg}\``);
|
|
152
|
+
}
|
|
153
|
+
if (!v.latest) {
|
|
154
|
+
throw new Error(`无法获取 ${v.meta.displayName} 的最新版本(npm registry 不可达?)`);
|
|
155
|
+
}
|
|
156
|
+
if (!v.outdated) {
|
|
157
|
+
console.log(ansis.green(`\n✓ ${v.meta.displayName} 已是最新(${v.local})\n`));
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
return [v];
|
|
161
|
+
}
|
|
162
|
+
// 交互:列所有 outdated
|
|
163
|
+
const outdated = versions.filter(v => v.installed && v.outdated);
|
|
164
|
+
if (outdated.length === 0)
|
|
165
|
+
return [];
|
|
166
|
+
const { tools } = await inquirer.prompt([{
|
|
167
|
+
type: 'checkbox',
|
|
168
|
+
name: 'tools',
|
|
169
|
+
message: '选择要更新的工具',
|
|
170
|
+
choices: outdated.map(v => ({
|
|
171
|
+
name: `${v.meta.displayName.padEnd(14)} ${ansis.dim(v.local ?? '')} → ${ansis.green(v.latest)}`,
|
|
172
|
+
value: v.tool,
|
|
173
|
+
checked: true,
|
|
174
|
+
})),
|
|
175
|
+
}]);
|
|
176
|
+
return outdated.filter(v => tools.includes(v.tool));
|
|
177
|
+
}
|
|
178
|
+
async function runNpmCommands(jobs) {
|
|
179
|
+
const failures = [];
|
|
180
|
+
let success = 0;
|
|
181
|
+
for (const job of jobs) {
|
|
182
|
+
const cmd = `npm ${job.args.join(' ')}`;
|
|
183
|
+
console.log(ansis.bold(`\n→ ${TOOLS[job.tool].displayName}: ${ansis.cyan(cmd)}`));
|
|
184
|
+
const result = spawnSync('npm', job.args, { stdio: 'inherit' });
|
|
185
|
+
if (result.status === 0) {
|
|
186
|
+
success++;
|
|
187
|
+
const v = getInstalledVersion(job.tool);
|
|
188
|
+
console.log(ansis.green(` ✔ 完成${v.version ? ` (${v.version})` : ''}`));
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const reason = result.error
|
|
192
|
+
? result.error.message
|
|
193
|
+
: `npm 退出码 ${result.status ?? 'null'}`;
|
|
194
|
+
failures.push({ tool: job.tool, cmd, reason });
|
|
195
|
+
console.log(ansis.red(` ✗ 失败: ${reason}`));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
console.log();
|
|
199
|
+
console.log(ansis.green(`✓ 成功 ${success} / ${jobs.length}`));
|
|
200
|
+
if (failures.length > 0) {
|
|
201
|
+
console.log(ansis.red(`✗ 失败 ${failures.length}:`));
|
|
202
|
+
for (const f of failures) {
|
|
203
|
+
console.log(` ${TOOLS[f.tool].displayName}: ${f.reason}`);
|
|
204
|
+
console.log(ansis.dim(` 可手动执行: ${f.cmd}`));
|
|
205
|
+
console.log(ansis.dim(` 或权限问题尝试: sudo ${f.cmd}`));
|
|
206
|
+
}
|
|
207
|
+
process.exitCode = 1;
|
|
208
|
+
}
|
|
209
|
+
console.log();
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tools.js
CHANGED
|
@@ -5,6 +5,8 @@ export const TOOLS = {
|
|
|
5
5
|
homepage: 'https://www.clavue.com',
|
|
6
6
|
configDir: '~/.claude',
|
|
7
7
|
settingsFile: '~/.claude/settings.json',
|
|
8
|
+
binName: 'clavue',
|
|
9
|
+
npmPackage: 'clavue',
|
|
8
10
|
installHint: 'npm install -g clavue',
|
|
9
11
|
},
|
|
10
12
|
'claude-code': {
|
|
@@ -13,6 +15,8 @@ export const TOOLS = {
|
|
|
13
15
|
homepage: 'https://claude.com/claude-code',
|
|
14
16
|
configDir: '~/.claude',
|
|
15
17
|
settingsFile: '~/.claude/settings.json',
|
|
18
|
+
binName: 'claude',
|
|
19
|
+
npmPackage: '@anthropic-ai/claude-code',
|
|
16
20
|
installHint: 'npm install -g @anthropic-ai/claude-code',
|
|
17
21
|
},
|
|
18
22
|
'codex': {
|
|
@@ -21,6 +25,8 @@ export const TOOLS = {
|
|
|
21
25
|
homepage: 'https://github.com/openai/codex',
|
|
22
26
|
configDir: '~/.codex',
|
|
23
27
|
settingsFile: '~/.codex/config.toml',
|
|
28
|
+
binName: 'codex',
|
|
29
|
+
npmPackage: '@openai/codex',
|
|
24
30
|
installHint: 'npm install -g @openai/codex',
|
|
25
31
|
},
|
|
26
32
|
};
|
package/dist/core/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/core/tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/core/tools.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,KAAK,GAAmC;IACnD,QAAQ,EAAE;QACR,EAAE,EAAE,QAAQ;QACZ,WAAW,EAAE,QAAQ;QACrB,QAAQ,EAAE,wBAAwB;QAClC,SAAS,EAAE,WAAW;QACtB,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,uBAAuB;KACrC;IACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,aAAa;QAC1B,QAAQ,EAAE,gCAAgC;QAC1C,SAAS,EAAE,WAAW;QACtB,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,2BAA2B;QACvC,WAAW,EAAE,0CAA0C;KACxD;IACD,OAAO,EAAE;QACP,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,OAAO;QACpB,QAAQ,EAAE,iCAAiC;QAC3C,SAAS,EAAE,UAAU;QACrB,YAAY,EAAE,sBAAsB;QACpC,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,8BAA8B;KAC5C;CACF,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { TOOLS } from './tools.js';
|
|
3
|
+
/** 探测某个工具本地是否安装、版本号多少。不发网络。 */
|
|
4
|
+
export function getInstalledVersion(tool) {
|
|
5
|
+
const meta = TOOLS[tool];
|
|
6
|
+
// 先 which 一下,没装就不调 --version 避免冗长报错
|
|
7
|
+
if (!isOnPath(meta.binName))
|
|
8
|
+
return { installed: false };
|
|
9
|
+
try {
|
|
10
|
+
const raw = execSync(`${meta.binName} --version`, {
|
|
11
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
12
|
+
timeout: 5000,
|
|
13
|
+
encoding: 'utf-8',
|
|
14
|
+
});
|
|
15
|
+
const v = extractVersion(raw);
|
|
16
|
+
return v ? { installed: true, version: v } : { installed: true };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { installed: true };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 从 npm registry 查 latest 版本。会发网络请求(`npm view <pkg> version`)。
|
|
24
|
+
* 失败返回 undefined(不抛错),让上层决定是否提示用户。
|
|
25
|
+
*/
|
|
26
|
+
export function getLatestVersion(tool) {
|
|
27
|
+
const meta = TOOLS[tool];
|
|
28
|
+
try {
|
|
29
|
+
const raw = execSync(`npm view ${meta.npmPackage} version`, {
|
|
30
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
31
|
+
timeout: 10_000,
|
|
32
|
+
encoding: 'utf-8',
|
|
33
|
+
});
|
|
34
|
+
const v = raw.trim();
|
|
35
|
+
return /^\d+\.\d+\.\d+/.test(v) ? v : undefined;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 同时查所有工具状态。checkUpdates=true 会发网络。
|
|
43
|
+
* 串行查 npm 而不是并发,因为 npm view 各自启子进程,并发反而更慢且占资源。
|
|
44
|
+
*/
|
|
45
|
+
export function getAllVersions(checkUpdates = false) {
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const tool of Object.keys(TOOLS)) {
|
|
48
|
+
const meta = TOOLS[tool];
|
|
49
|
+
const local = getInstalledVersion(tool);
|
|
50
|
+
const info = { tool, meta, installed: local.installed };
|
|
51
|
+
if (local.version)
|
|
52
|
+
info.local = local.version;
|
|
53
|
+
if (checkUpdates) {
|
|
54
|
+
const latest = getLatestVersion(tool);
|
|
55
|
+
if (latest) {
|
|
56
|
+
info.latest = latest;
|
|
57
|
+
if (info.local)
|
|
58
|
+
info.outdated = compareVersion(info.local, latest) < 0;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
out.push(info);
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 比较两个 semver 字符串。
|
|
67
|
+
* -1 = a < b
|
|
68
|
+
* 0 = a == b
|
|
69
|
+
* 1 = a > b
|
|
70
|
+
* 不支持 prerelease(1.2.3-beta),prerelease 部分会被忽略。
|
|
71
|
+
* 这里足够用——三个工具发布的都是稳定版。
|
|
72
|
+
*/
|
|
73
|
+
export function compareVersion(a, b) {
|
|
74
|
+
const pa = parseVersion(a);
|
|
75
|
+
const pb = parseVersion(b);
|
|
76
|
+
for (let i = 0; i < 3; i++) {
|
|
77
|
+
if (pa[i] < pb[i])
|
|
78
|
+
return -1;
|
|
79
|
+
if (pa[i] > pb[i])
|
|
80
|
+
return 1;
|
|
81
|
+
}
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
function parseVersion(v) {
|
|
85
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
|
|
86
|
+
if (!m)
|
|
87
|
+
return [0, 0, 0];
|
|
88
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 从 `<bin> --version` 输出里抠版本号。
|
|
92
|
+
* 不同工具输出格式不一:
|
|
93
|
+
* "1.2.3"
|
|
94
|
+
* "clavue 1.2.3"
|
|
95
|
+
* "Claude Code v2.1.90 (...)"
|
|
96
|
+
*/
|
|
97
|
+
export function extractVersion(raw) {
|
|
98
|
+
const m = /(\d+\.\d+\.\d+)/.exec(raw);
|
|
99
|
+
return m ? m[1] : undefined;
|
|
100
|
+
}
|
|
101
|
+
function isOnPath(bin) {
|
|
102
|
+
try {
|
|
103
|
+
execSync(`command -v ${bin}`, { stdio: 'ignore' });
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/core/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAenC,+BAA+B;AAC/B,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,oCAAoC;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YAChD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,CAAC;QACL,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,IAAI,CAAC,UAAU,UAAU,EAAE;YAC1D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,YAAY,GAAG,KAAK;IACjD,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAe,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACrE,IAAI,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9C,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,MAAM,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccjk",
|
|
3
|
-
"version": "15.
|
|
4
|
-
"description": "Clavue / Claude Code
|
|
3
|
+
"version": "15.6.1",
|
|
4
|
+
"description": "Clavue / Claude Code / Codex 的本地配置 CLI — profile 切换、权限档位、状态栏、MCP、版本管理,一条命令搞定。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"ccjk": "./dist/cli.js"
|
|
@@ -31,7 +31,10 @@
|
|
|
31
31
|
"anthropic",
|
|
32
32
|
"ai-coding",
|
|
33
33
|
"developer-tools",
|
|
34
|
-
"config"
|
|
34
|
+
"config",
|
|
35
|
+
"profile",
|
|
36
|
+
"statusline",
|
|
37
|
+
"permissions"
|
|
35
38
|
],
|
|
36
39
|
"author": {
|
|
37
40
|
"name": "CCJK Team",
|