ccjk 2.5.0 → 2.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 +48 -0
- package/README.zh-CN.md +48 -0
- package/dist/chunks/claude-wrapper.mjs +3 -0
- package/dist/chunks/config2.mjs +3 -0
- package/dist/chunks/features.mjs +164 -25
- package/dist/chunks/index2.mjs +2 -0
- package/dist/chunks/menu.mjs +13 -17
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/permissions.mjs +61 -53
- package/dist/chunks/session.mjs +4 -4
- package/dist/cli.mjs +15 -41
- package/dist/i18n/locales/en/menu.json +2 -2
- package/dist/i18n/locales/en/registry.json +54 -0
- package/dist/i18n/locales/en/superpowers.json +12 -1
- package/dist/i18n/locales/zh-CN/menu.json +2 -2
- package/dist/i18n/locales/zh-CN/registry.json +54 -0
- package/dist/i18n/locales/zh-CN/superpowers.json +12 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -130,6 +130,41 @@ Every developer using Claude Code faces the same problems:
|
|
|
130
130
|
|
|
131
131
|
## ✨ Killer Features
|
|
132
132
|
|
|
133
|
+
### 🆕 What's New in v2.6.0
|
|
134
|
+
|
|
135
|
+
<table>
|
|
136
|
+
<tr>
|
|
137
|
+
<td width="33%" align="center">
|
|
138
|
+
<h4>🎯 Zero-Config</h4>
|
|
139
|
+
<sub>Auto-detects your project and configures everything. Just run <code>npx ccjk</code> and start coding.</sub>
|
|
140
|
+
</td>
|
|
141
|
+
<td width="33%" align="center">
|
|
142
|
+
<h4>🌐 Smart Registry</h4>
|
|
143
|
+
<sub>Auto-detects China mirrors, caches versions, ensures fastest downloads worldwide.</sub>
|
|
144
|
+
</td>
|
|
145
|
+
<td width="33%" align="center">
|
|
146
|
+
<h4>🔍 Capability Discovery</h4>
|
|
147
|
+
<sub>Scans your project and suggests optimal AI workflows based on your tech stack.</sub>
|
|
148
|
+
</td>
|
|
149
|
+
</tr>
|
|
150
|
+
<tr>
|
|
151
|
+
<td width="33%" align="center">
|
|
152
|
+
<h4>🛡️ Config Guardian</h4>
|
|
153
|
+
<sub>Auto-validates and repairs configurations. Never break your setup again.</sub>
|
|
154
|
+
</td>
|
|
155
|
+
<td width="33%" align="center">
|
|
156
|
+
<h4>🚀 Startup Orchestrator</h4>
|
|
157
|
+
<sub>Modular initialization with hooks. Customize your startup sequence.</sub>
|
|
158
|
+
</td>
|
|
159
|
+
<td width="33%" align="center">
|
|
160
|
+
<h4>🔀 Tool Router</h4>
|
|
161
|
+
<sub>Intelligent conflict resolution and priority management for multiple AI tools.</sub>
|
|
162
|
+
</td>
|
|
163
|
+
</tr>
|
|
164
|
+
</table>
|
|
165
|
+
|
|
166
|
+
<br/>
|
|
167
|
+
|
|
133
168
|
### 🧠 Intelligent Skill System
|
|
134
169
|
|
|
135
170
|
**Your AI assistant that actually remembers and learns.**
|
|
@@ -401,6 +436,17 @@ ccjk interview # Interview-driven development
|
|
|
401
436
|
ccjk mcp <action> # MCP server management
|
|
402
437
|
ccjk browser <action> # Agent Browser automation
|
|
403
438
|
ccjk postmortem <action># Learn from historical bugs
|
|
439
|
+
ccjk skills <action> # Manage AI skills
|
|
440
|
+
ccjk hooks <action> # Configure lifecycle hooks
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Configuration Commands
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
ccjk config <action> # Configuration management
|
|
447
|
+
ccjk providers <action> # API provider management
|
|
448
|
+
ccjk permissions # Permission management
|
|
449
|
+
ccjk sandbox <action> # Sandbox environment control
|
|
404
450
|
```
|
|
405
451
|
|
|
406
452
|
### System Commands
|
|
@@ -410,6 +456,8 @@ ccjk system setup # First-time setup
|
|
|
410
456
|
ccjk system upgrade # Upgrade all components
|
|
411
457
|
ccjk system versions # Check versions
|
|
412
458
|
ccjk check-updates # Check for updates
|
|
459
|
+
ccjk stats # Usage statistics
|
|
460
|
+
ccjk session <action> # Session management
|
|
413
461
|
```
|
|
414
462
|
|
|
415
463
|
<br/>
|
package/README.zh-CN.md
CHANGED
|
@@ -130,6 +130,41 @@ npx ccjk
|
|
|
130
130
|
|
|
131
131
|
## ✨ 核心功能
|
|
132
132
|
|
|
133
|
+
### 🆕 v2.6.0 新功能
|
|
134
|
+
|
|
135
|
+
<table>
|
|
136
|
+
<tr>
|
|
137
|
+
<td width="33%" align="center">
|
|
138
|
+
<h4>🎯 零配置启动</h4>
|
|
139
|
+
<sub>自动检测项目类型并配置一切。只需运行 <code>npx ccjk</code> 即可开始编码。</sub>
|
|
140
|
+
</td>
|
|
141
|
+
<td width="33%" align="center">
|
|
142
|
+
<h4>🌐 智能镜像</h4>
|
|
143
|
+
<sub>自动检测中国镜像,缓存版本信息,确保全球最快下载速度。</sub>
|
|
144
|
+
</td>
|
|
145
|
+
<td width="33%" align="center">
|
|
146
|
+
<h4>🔍 能力发现</h4>
|
|
147
|
+
<sub>扫描项目并根据技术栈推荐最优 AI 工作流。</sub>
|
|
148
|
+
</td>
|
|
149
|
+
</tr>
|
|
150
|
+
<tr>
|
|
151
|
+
<td width="33%" align="center">
|
|
152
|
+
<h4>🛡️ 配置守护</h4>
|
|
153
|
+
<sub>自动验证和修复配置。再也不会搞坏你的设置。</sub>
|
|
154
|
+
</td>
|
|
155
|
+
<td width="33%" align="center">
|
|
156
|
+
<h4>🚀 启动编排器</h4>
|
|
157
|
+
<sub>模块化初始化,支持钩子。自定义你的启动流程。</sub>
|
|
158
|
+
</td>
|
|
159
|
+
<td width="33%" align="center">
|
|
160
|
+
<h4>🔀 工具路由</h4>
|
|
161
|
+
<sub>智能冲突解决和优先级管理,多 AI 工具协同无忧。</sub>
|
|
162
|
+
</td>
|
|
163
|
+
</tr>
|
|
164
|
+
</table>
|
|
165
|
+
|
|
166
|
+
<br/>
|
|
167
|
+
|
|
133
168
|
### 🧠 智能技能系统
|
|
134
169
|
|
|
135
170
|
**真正能记住和学习的 AI 助手。**
|
|
@@ -401,6 +436,17 @@ ccjk interview # 访谈驱动开发
|
|
|
401
436
|
ccjk mcp <action> # MCP 服务器管理
|
|
402
437
|
ccjk browser <action> # Agent Browser 自动化
|
|
403
438
|
ccjk postmortem <action># 从历史 Bug 中学习
|
|
439
|
+
ccjk skills <action> # 管理 AI 技能
|
|
440
|
+
ccjk hooks <action> # 配置生命周期钩子
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 配置命令
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
ccjk config <action> # 配置管理
|
|
447
|
+
ccjk providers <action> # API 提供商管理
|
|
448
|
+
ccjk permissions # 权限管理
|
|
449
|
+
ccjk sandbox <action> # 沙箱环境控制
|
|
404
450
|
```
|
|
405
451
|
|
|
406
452
|
### 系统命令
|
|
@@ -410,6 +456,8 @@ ccjk system setup # 首次配置
|
|
|
410
456
|
ccjk system upgrade # 升级所有组件
|
|
411
457
|
ccjk system versions # 检查版本
|
|
412
458
|
ccjk check-updates # 检查更新
|
|
459
|
+
ccjk stats # 使用统计
|
|
460
|
+
ccjk session <action> # 会话管理
|
|
413
461
|
```
|
|
414
462
|
|
|
415
463
|
<br/>
|
|
@@ -259,6 +259,9 @@ const PASSTHROUGH_ARGS = /* @__PURE__ */ new Set([
|
|
|
259
259
|
function shouldPassthrough(args) {
|
|
260
260
|
if (args.length === 0)
|
|
261
261
|
return false;
|
|
262
|
+
if (args[0]?.startsWith("/")) {
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
262
265
|
return args.some((arg) => PASSTHROUGH_ARGS.has(arg));
|
|
263
266
|
}
|
|
264
267
|
async function claudeWrapper(args, options = {}) {
|
package/dist/chunks/config2.mjs
CHANGED
package/dist/chunks/features.mjs
CHANGED
|
@@ -335,17 +335,34 @@ async function promptCustomModels(defaultPrimaryModel, defaultHaikuModel, defaul
|
|
|
335
335
|
}
|
|
336
336
|
async function configureAiMemoryFeature() {
|
|
337
337
|
ensureI18nInitialized();
|
|
338
|
+
const isZh = i18n.language === "zh-CN";
|
|
338
339
|
const { option } = await inquirer.prompt({
|
|
339
340
|
type: "list",
|
|
340
341
|
name: "option",
|
|
341
|
-
message:
|
|
342
|
+
message: isZh ? "\u9009\u62E9 AI \u8BB0\u5FC6\u7BA1\u7406\u9009\u9879" : "Select AI memory management option",
|
|
342
343
|
choices: addNumbersToChoices([
|
|
343
344
|
{
|
|
344
|
-
name:
|
|
345
|
+
name: isZh ? "\u{1F4C4} \u67E5\u770B\u5168\u5C40 CLAUDE.md\uFF08\u7CFB\u7EDF\u63D0\u793A\uFF09" : "\u{1F4C4} View global CLAUDE.md (system prompt)",
|
|
346
|
+
value: "viewGlobalClaudeMd"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
name: isZh ? "\u{1F4C1} \u67E5\u770B\u9879\u76EE CLAUDE.md" : "\u{1F4C1} View project CLAUDE.md",
|
|
350
|
+
value: "viewProjectClaudeMd"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: isZh ? "\u{1F52C} \u67E5\u770B Postmortem\uFF08\u5386\u53F2 Bug \u7ECF\u9A8C\uFF09" : "\u{1F52C} View Postmortem (bug lessons learned)",
|
|
354
|
+
value: "viewPostmortem"
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: isZh ? "\u270F\uFE0F \u7F16\u8F91\u5168\u5C40 CLAUDE.md" : "\u270F\uFE0F Edit global CLAUDE.md",
|
|
358
|
+
value: "editGlobalClaudeMd"
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: isZh ? "\u{1F310} \u914D\u7F6E AI \u8F93\u51FA\u8BED\u8A00" : "\u{1F310} Configure AI output language",
|
|
345
362
|
value: "language"
|
|
346
363
|
},
|
|
347
364
|
{
|
|
348
|
-
name:
|
|
365
|
+
name: isZh ? "\u{1F3A8} \u914D\u7F6E\u8F93\u51FA\u98CE\u683C" : "\u{1F3A8} Configure output style",
|
|
349
366
|
value: "outputStyle"
|
|
350
367
|
}
|
|
351
368
|
])
|
|
@@ -353,32 +370,154 @@ async function configureAiMemoryFeature() {
|
|
|
353
370
|
if (!option) {
|
|
354
371
|
return;
|
|
355
372
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
373
|
+
const { readFileSync, existsSync, writeFileSync } = await import('node:fs');
|
|
374
|
+
const { homedir } = await import('node:os');
|
|
375
|
+
const { join } = await import('pathe');
|
|
376
|
+
const { execSync } = await import('node:child_process');
|
|
377
|
+
const nodeProcess = await import('node:process');
|
|
378
|
+
const cwd = nodeProcess.default.cwd();
|
|
379
|
+
const globalClaudeMdPath = join(homedir(), ".claude", "CLAUDE.md");
|
|
380
|
+
const projectClaudeMdPath = join(cwd, "CLAUDE.md");
|
|
381
|
+
const localClaudeMdPath = join(cwd, ".claude", "CLAUDE.md");
|
|
382
|
+
switch (option) {
|
|
383
|
+
case "viewGlobalClaudeMd": {
|
|
384
|
+
if (existsSync(globalClaudeMdPath)) {
|
|
385
|
+
console.log(ansis.cyan.bold(`
|
|
386
|
+
\u{1F4C4} ${isZh ? "\u5168\u5C40 CLAUDE.md \u5185\u5BB9" : "Global CLAUDE.md Content"}:`));
|
|
387
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
388
|
+
const content = readFileSync(globalClaudeMdPath, "utf-8");
|
|
389
|
+
console.log(content);
|
|
390
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
391
|
+
console.log(ansis.gray(`${isZh ? "\u8DEF\u5F84" : "Path"}: ${globalClaudeMdPath}`));
|
|
392
|
+
} else {
|
|
393
|
+
console.log(ansis.yellow(`
|
|
394
|
+
\u26A0\uFE0F ${isZh ? "\u5168\u5C40 CLAUDE.md \u4E0D\u5B58\u5728" : "Global CLAUDE.md does not exist"}`));
|
|
395
|
+
console.log(ansis.gray(`${isZh ? "\u9884\u671F\u8DEF\u5F84" : "Expected path"}: ${globalClaudeMdPath}`));
|
|
396
|
+
}
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
case "viewProjectClaudeMd": {
|
|
400
|
+
let foundPath = null;
|
|
401
|
+
if (existsSync(projectClaudeMdPath)) {
|
|
402
|
+
foundPath = projectClaudeMdPath;
|
|
403
|
+
} else if (existsSync(localClaudeMdPath)) {
|
|
404
|
+
foundPath = localClaudeMdPath;
|
|
405
|
+
}
|
|
406
|
+
if (foundPath) {
|
|
407
|
+
console.log(ansis.cyan.bold(`
|
|
408
|
+
\u{1F4C1} ${isZh ? "\u9879\u76EE CLAUDE.md \u5185\u5BB9" : "Project CLAUDE.md Content"}:`));
|
|
409
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
410
|
+
const content = readFileSync(foundPath, "utf-8");
|
|
411
|
+
console.log(content);
|
|
412
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
413
|
+
console.log(ansis.gray(`${isZh ? "\u8DEF\u5F84" : "Path"}: ${foundPath}`));
|
|
414
|
+
} else {
|
|
415
|
+
console.log(ansis.yellow(`
|
|
416
|
+
\u26A0\uFE0F ${isZh ? "\u9879\u76EE CLAUDE.md \u4E0D\u5B58\u5728" : "Project CLAUDE.md does not exist"}`));
|
|
417
|
+
console.log(ansis.gray(`${isZh ? "\u5DF2\u68C0\u67E5\u8DEF\u5F84" : "Checked paths"}:`));
|
|
418
|
+
console.log(ansis.gray(` - ${projectClaudeMdPath}`));
|
|
419
|
+
console.log(ansis.gray(` - ${localClaudeMdPath}`));
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case "viewPostmortem": {
|
|
424
|
+
const postmortemDir = join(cwd, ".postmortem");
|
|
425
|
+
if (existsSync(postmortemDir)) {
|
|
426
|
+
console.log(ansis.cyan.bold(`
|
|
427
|
+
\u{1F52C} ${isZh ? "Postmortem \u62A5\u544A" : "Postmortem Reports"}:`));
|
|
428
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
429
|
+
const { readdirSync } = await import('node:fs');
|
|
430
|
+
const files = readdirSync(postmortemDir).filter((f) => f.endsWith(".md"));
|
|
431
|
+
if (files.length === 0) {
|
|
432
|
+
console.log(ansis.yellow(isZh ? "\u6682\u65E0 Postmortem \u62A5\u544A" : "No postmortem reports yet"));
|
|
433
|
+
} else {
|
|
434
|
+
console.log(ansis.green(`${isZh ? "\u627E\u5230" : "Found"} ${files.length} ${isZh ? "\u4E2A\u62A5\u544A" : "reports"}:
|
|
435
|
+
`));
|
|
436
|
+
const { selectedFile } = await inquirer.prompt({
|
|
437
|
+
type: "list",
|
|
438
|
+
name: "selectedFile",
|
|
439
|
+
message: isZh ? "\u9009\u62E9\u8981\u67E5\u770B\u7684\u62A5\u544A" : "Select a report to view",
|
|
440
|
+
choices: [
|
|
441
|
+
...files.map((f) => ({ name: f, value: f })),
|
|
442
|
+
{ name: isZh ? "\u8FD4\u56DE" : "Back", value: "back" }
|
|
443
|
+
]
|
|
444
|
+
});
|
|
445
|
+
if (selectedFile !== "back") {
|
|
446
|
+
const reportPath = join(postmortemDir, selectedFile);
|
|
447
|
+
const content = readFileSync(reportPath, "utf-8");
|
|
448
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
449
|
+
console.log(content);
|
|
450
|
+
console.log(ansis.dim("\u2500".repeat(60)));
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
console.log(ansis.gray(`
|
|
454
|
+
${isZh ? "\u76EE\u5F55" : "Directory"}: ${postmortemDir}`));
|
|
455
|
+
console.log(ansis.gray(`\u{1F4A1} ${isZh ? "\u8FD0\u884C `ccjk postmortem init` \u4ECE\u5386\u53F2 fix commits \u751F\u6210\u62A5\u544A" : "Run `ccjk postmortem init` to generate reports from fix commits"}`));
|
|
456
|
+
} else {
|
|
457
|
+
console.log(ansis.yellow(`
|
|
458
|
+
\u26A0\uFE0F ${isZh ? "Postmortem \u76EE\u5F55\u4E0D\u5B58\u5728" : "Postmortem directory does not exist"}`));
|
|
459
|
+
console.log(ansis.gray(`\u{1F4A1} ${isZh ? "\u8FD0\u884C `ccjk postmortem init` \u521D\u59CB\u5316 Postmortem \u7CFB\u7EDF" : "Run `ccjk postmortem init` to initialize the Postmortem system"}`));
|
|
460
|
+
}
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
case "editGlobalClaudeMd": {
|
|
464
|
+
const editor = nodeProcess.default.env.EDITOR || nodeProcess.default.env.VISUAL || "vi";
|
|
465
|
+
if (!existsSync(globalClaudeMdPath)) {
|
|
466
|
+
const claudeDir = join(homedir(), ".claude");
|
|
467
|
+
const { mkdirSync } = await import('node:fs');
|
|
468
|
+
if (!existsSync(claudeDir)) {
|
|
469
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
470
|
+
}
|
|
471
|
+
writeFileSync(globalClaudeMdPath, `# Claude Global Memory
|
|
472
|
+
|
|
473
|
+
<!-- Add your global instructions here -->
|
|
474
|
+
`);
|
|
475
|
+
console.log(ansis.green(`\u2705 ${isZh ? "\u5DF2\u521B\u5EFA\u5168\u5C40 CLAUDE.md" : "Created global CLAUDE.md"}`));
|
|
476
|
+
}
|
|
477
|
+
console.log(ansis.cyan(`
|
|
478
|
+
\u{1F4DD} ${isZh ? "\u6B63\u5728\u6253\u5F00\u7F16\u8F91\u5668..." : "Opening editor..."}`));
|
|
479
|
+
console.log(ansis.gray(`${isZh ? "\u7F16\u8F91\u5668" : "Editor"}: ${editor}`));
|
|
480
|
+
console.log(ansis.gray(`${isZh ? "\u6587\u4EF6" : "File"}: ${globalClaudeMdPath}`));
|
|
481
|
+
try {
|
|
482
|
+
execSync(`${editor} "${globalClaudeMdPath}"`, { stdio: "inherit" });
|
|
483
|
+
console.log(ansis.green(`
|
|
484
|
+
\u2705 ${isZh ? "\u7F16\u8F91\u5B8C\u6210" : "Edit complete"}`));
|
|
485
|
+
} catch {
|
|
486
|
+
console.log(ansis.yellow(`
|
|
487
|
+
\u26A0\uFE0F ${isZh ? "\u7F16\u8F91\u5668\u9000\u51FA" : "Editor exited"}`));
|
|
488
|
+
}
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
case "language": {
|
|
492
|
+
const zcfConfig = readZcfConfig();
|
|
493
|
+
const existingLang = zcfConfig?.aiOutputLang;
|
|
494
|
+
if (existingLang) {
|
|
495
|
+
console.log(
|
|
496
|
+
`
|
|
362
497
|
${ansis.blue(`\u2139 ${i18n.t("configuration:existingLanguageConfig") || "Existing AI output language configuration"}`)}`
|
|
363
|
-
|
|
364
|
-
|
|
498
|
+
);
|
|
499
|
+
console.log(ansis.gray(` ${i18n.t("configuration:currentLanguage") || "Current language"}: ${existingLang}
|
|
365
500
|
`));
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
501
|
+
const modify = await promptBoolean({
|
|
502
|
+
message: i18n.t("configuration:modifyLanguage") || "Modify AI output language?",
|
|
503
|
+
defaultValue: false
|
|
504
|
+
});
|
|
505
|
+
if (!modify) {
|
|
506
|
+
console.log(ansis.green(`\u2714 ${i18n.t("configuration:keepLanguage") || "Keeping existing language configuration"}`));
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
373
509
|
}
|
|
510
|
+
const { selectAiOutputLanguage } = await import('./prompts.mjs');
|
|
511
|
+
const aiOutputLang = await selectAiOutputLanguage();
|
|
512
|
+
applyAiLanguageDirective(aiOutputLang);
|
|
513
|
+
updateZcfConfig({ aiOutputLang });
|
|
514
|
+
console.log(ansis.green(`\u2714 ${i18n.t("configuration:aiLanguageConfigured") || "AI output language configured"}`));
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
case "outputStyle": {
|
|
518
|
+
await configureOutputStyle();
|
|
519
|
+
break;
|
|
374
520
|
}
|
|
375
|
-
const { selectAiOutputLanguage } = await import('./prompts.mjs');
|
|
376
|
-
const aiOutputLang = await selectAiOutputLanguage();
|
|
377
|
-
applyAiLanguageDirective(aiOutputLang);
|
|
378
|
-
updateZcfConfig({ aiOutputLang });
|
|
379
|
-
console.log(ansis.green(`\u2714 ${i18n.t("configuration:aiLanguageConfigured") || "AI output language configured"}`));
|
|
380
|
-
} else if (option === "outputStyle") {
|
|
381
|
-
await configureOutputStyle();
|
|
382
521
|
}
|
|
383
522
|
}
|
|
384
523
|
async function changeScriptLanguageFeature(currentLang) {
|
package/dist/chunks/index2.mjs
CHANGED
|
@@ -36,6 +36,8 @@ const NAMESPACES = [
|
|
|
36
36
|
// Permission system for API providers, models, and tools
|
|
37
37
|
"plugins",
|
|
38
38
|
// Cloud plugins management
|
|
39
|
+
"registry",
|
|
40
|
+
// Version checking, China detection, and multiple installations
|
|
39
41
|
"sandbox",
|
|
40
42
|
// Sandbox mode for secure request/response handling
|
|
41
43
|
"shencha",
|
package/dist/chunks/menu.mjs
CHANGED
|
@@ -472,24 +472,20 @@ async function generateContextRules(context, lang) {
|
|
|
472
472
|
`));
|
|
473
473
|
const recommendedIds = getRecommendedRules(context);
|
|
474
474
|
const applicableRules = getApplicableRules(context.type);
|
|
475
|
-
|
|
476
|
-
for (const rule of applicableRules) {
|
|
477
|
-
const isRecommended = recommendedIds.includes(rule.id);
|
|
478
|
-
const icon = isRecommended ? ansis.green("\u2605") : ansis.dim("\u25CB");
|
|
479
|
-
const name = isZh ? rule.nameZh : rule.name;
|
|
480
|
-
const desc = isZh ? rule.descriptionZh : rule.description;
|
|
481
|
-
console.log(` ${icon} ${name} - ${ansis.dim(desc)}`);
|
|
482
|
-
}
|
|
483
|
-
console.log("");
|
|
484
|
-
const { confirm } = await inquirer.prompt([
|
|
475
|
+
const { selectedRules } = await inquirer.prompt([
|
|
485
476
|
{
|
|
486
|
-
type: "
|
|
487
|
-
name: "
|
|
488
|
-
message: isZh ? "\
|
|
489
|
-
|
|
477
|
+
type: "checkbox",
|
|
478
|
+
name: "selectedRules",
|
|
479
|
+
message: isZh ? "\u9009\u62E9\u8981\u5E94\u7528\u7684\u89C4\u5219\uFF08\u63A8\u8350\u89C4\u5219\u5DF2\u9884\u9009\uFF09" : "Select rules to apply (recommended rules pre-selected)",
|
|
480
|
+
choices: applicableRules.map((rule) => ({
|
|
481
|
+
name: `${recommendedIds.includes(rule.id) ? ansis.green("\u2605") : " "} ${isZh ? rule.nameZh : rule.name} - ${ansis.dim(isZh ? rule.descriptionZh : rule.description)}`,
|
|
482
|
+
value: rule.id,
|
|
483
|
+
checked: recommendedIds.includes(rule.id)
|
|
484
|
+
}))
|
|
490
485
|
}
|
|
491
486
|
]);
|
|
492
|
-
if (
|
|
487
|
+
if (selectedRules.length === 0) {
|
|
488
|
+
console.log(ansis.yellow(isZh ? "\u672A\u9009\u62E9\u4EFB\u4F55\u89C4\u5219" : "No rules selected"));
|
|
493
489
|
return;
|
|
494
490
|
}
|
|
495
491
|
const { location } = await inquirer.prompt([
|
|
@@ -548,7 +544,7 @@ async function generateContextRules(context, lang) {
|
|
|
548
544
|
if (overwrite === "merge") {
|
|
549
545
|
const existingContent = readContextFile(targetFile.path);
|
|
550
546
|
if (existingContent) {
|
|
551
|
-
const mergedContent = mergeContextContent(existingContent,
|
|
547
|
+
const mergedContent = mergeContextContent(existingContent, selectedRules, lang);
|
|
552
548
|
const success2 = await writeContextFile(targetFile.path, mergedContent);
|
|
553
549
|
if (success2) {
|
|
554
550
|
console.log(ansis.green(`
|
|
@@ -561,7 +557,7 @@ async function generateContextRules(context, lang) {
|
|
|
561
557
|
}
|
|
562
558
|
}
|
|
563
559
|
}
|
|
564
|
-
const content = generateContextContent(context,
|
|
560
|
+
const content = generateContextContent(context, selectedRules, lang);
|
|
565
561
|
const success = await writeContextFile(targetFile.path, content);
|
|
566
562
|
if (success) {
|
|
567
563
|
console.log(ansis.green(`
|
package/dist/chunks/package.mjs
CHANGED
|
@@ -226,12 +226,19 @@ class PermissionManager {
|
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
|
+
let instance = null;
|
|
230
|
+
function getPermissionManager(configPath) {
|
|
231
|
+
if (!instance) {
|
|
232
|
+
instance = new PermissionManager(configPath);
|
|
233
|
+
}
|
|
234
|
+
return instance;
|
|
235
|
+
}
|
|
229
236
|
|
|
230
|
-
const permissionManager =
|
|
237
|
+
const permissionManager = getPermissionManager();
|
|
231
238
|
async function listPermissions(options) {
|
|
232
239
|
const format = options.format || "table";
|
|
233
240
|
const verbose = options.verbose || false;
|
|
234
|
-
const permissions = permissionManager.
|
|
241
|
+
const permissions = permissionManager.listPermissions();
|
|
235
242
|
if (format === "json") {
|
|
236
243
|
console.log(JSON.stringify(permissions, null, 2));
|
|
237
244
|
return;
|
|
@@ -243,23 +250,23 @@ async function listPermissions(options) {
|
|
|
243
250
|
}
|
|
244
251
|
if (format === "list") {
|
|
245
252
|
for (const perm of permissions) {
|
|
246
|
-
const
|
|
247
|
-
console.log(`${chalk.cyan(perm.
|
|
248
|
-
if (verbose && perm.
|
|
249
|
-
console.log(chalk.gray(`
|
|
253
|
+
const typeColor = getTypeColor(perm.type);
|
|
254
|
+
console.log(`${chalk.cyan(perm.pattern)}: ${typeColor(perm.type)}`);
|
|
255
|
+
if (verbose && perm.description) {
|
|
256
|
+
console.log(chalk.gray(` Description: ${perm.description}`));
|
|
250
257
|
}
|
|
251
258
|
}
|
|
252
259
|
} else {
|
|
253
|
-
console.log(chalk.bold("
|
|
260
|
+
console.log(chalk.bold("Pattern".padEnd(40)) + chalk.bold("Type".padEnd(15)) + chalk.bold("Scope"));
|
|
254
261
|
console.log("\u2500".repeat(70));
|
|
255
262
|
for (const perm of permissions) {
|
|
256
|
-
const
|
|
257
|
-
const
|
|
258
|
-
const
|
|
259
|
-
const
|
|
260
|
-
console.log(`${
|
|
261
|
-
if (verbose && perm.
|
|
262
|
-
console.log(chalk.gray(`
|
|
263
|
+
const typeColor = getTypeColor(perm.type);
|
|
264
|
+
const pattern = perm.pattern.padEnd(40);
|
|
265
|
+
const type = typeColor(perm.type.padEnd(15));
|
|
266
|
+
const scope = perm.scope;
|
|
267
|
+
console.log(`${pattern}${type}${scope}`);
|
|
268
|
+
if (verbose && perm.description) {
|
|
269
|
+
console.log(chalk.gray(` Description: ${perm.description}`));
|
|
263
270
|
}
|
|
264
271
|
}
|
|
265
272
|
}
|
|
@@ -271,24 +278,22 @@ async function checkPermission(resource, options) {
|
|
|
271
278
|
console.log("Usage: ccjk permissions check <resource>");
|
|
272
279
|
process__default.exit(1);
|
|
273
280
|
}
|
|
281
|
+
const action = options.action || "read";
|
|
274
282
|
const verbose = options.verbose || false;
|
|
275
283
|
console.log(chalk.bold(`
|
|
276
284
|
\u{1F50D} Checking permission for: ${chalk.cyan(resource)}
|
|
277
285
|
`));
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
if (hasPermission) {
|
|
286
|
+
const result = permissionManager.checkPermission(action, resource);
|
|
287
|
+
if (result.allowed) {
|
|
281
288
|
console.log(chalk.green("\u2713 Permission granted"));
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
console.log(`
|
|
285
|
-
console.log(`
|
|
286
|
-
if (verbose && permission.metadata) {
|
|
287
|
-
console.log(` Metadata: ${JSON.stringify(permission.metadata, null, 2)}`);
|
|
288
|
-
}
|
|
289
|
+
console.log(` Reason: ${result.reason}`);
|
|
290
|
+
if (verbose && result.matchedRule) {
|
|
291
|
+
console.log(` Matched rule: ${result.matchedRule.pattern}`);
|
|
292
|
+
console.log(` Rule type: ${result.matchedRule.type}`);
|
|
289
293
|
}
|
|
290
294
|
} else {
|
|
291
295
|
console.log(chalk.red("\u2717 Permission denied"));
|
|
296
|
+
console.log(` Reason: ${result.reason}`);
|
|
292
297
|
console.log(chalk.yellow(' Use "ccjk permissions grant" to grant permission'));
|
|
293
298
|
}
|
|
294
299
|
console.log();
|
|
@@ -302,10 +307,13 @@ async function grantPermission(resource, _options) {
|
|
|
302
307
|
console.log(chalk.bold(`
|
|
303
308
|
\u2713 Granting permission for: ${chalk.cyan(resource)}
|
|
304
309
|
`));
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
310
|
+
const permission = {
|
|
311
|
+
type: "allow",
|
|
312
|
+
pattern: resource,
|
|
313
|
+
scope: "global",
|
|
314
|
+
description: "Granted via CLI"
|
|
315
|
+
};
|
|
316
|
+
permissionManager.addPermission(permission);
|
|
309
317
|
console.log(chalk.green("Permission granted successfully!"));
|
|
310
318
|
console.log();
|
|
311
319
|
}
|
|
@@ -318,8 +326,12 @@ async function revokePermission(resource, _options) {
|
|
|
318
326
|
console.log(chalk.bold(`
|
|
319
327
|
\u2717 Revoking permission for: ${chalk.cyan(resource)}
|
|
320
328
|
`));
|
|
321
|
-
|
|
322
|
-
|
|
329
|
+
const removed = permissionManager.removePermission(resource);
|
|
330
|
+
if (removed > 0) {
|
|
331
|
+
console.log(chalk.green(`Permission revoked successfully! (${removed} rule(s) removed)`));
|
|
332
|
+
} else {
|
|
333
|
+
console.log(chalk.yellow("No matching permission found."));
|
|
334
|
+
}
|
|
323
335
|
console.log();
|
|
324
336
|
}
|
|
325
337
|
async function resetPermissions(_options) {
|
|
@@ -337,7 +349,7 @@ async function resetPermissions(_options) {
|
|
|
337
349
|
console.log(chalk.gray("Operation cancelled."));
|
|
338
350
|
return;
|
|
339
351
|
}
|
|
340
|
-
|
|
352
|
+
permissionManager.clearPermissions();
|
|
341
353
|
console.log(chalk.green("All permissions have been reset!"));
|
|
342
354
|
console.log();
|
|
343
355
|
}
|
|
@@ -348,9 +360,10 @@ async function exportPermissions(filePath, _options) {
|
|
|
348
360
|
console.log(chalk.bold(`
|
|
349
361
|
\u{1F4E4} Exporting permissions to: ${chalk.cyan(outputPath)}
|
|
350
362
|
`));
|
|
351
|
-
const permissions = permissionManager.
|
|
363
|
+
const permissions = permissionManager.exportPermissions();
|
|
352
364
|
await fs.writeFile(outputPath, JSON.stringify(permissions, null, 2), "utf-8");
|
|
353
|
-
|
|
365
|
+
const totalCount = permissions.allow.length + permissions.deny.length;
|
|
366
|
+
console.log(chalk.green(`Exported ${totalCount} permissions successfully!`));
|
|
354
367
|
console.log();
|
|
355
368
|
}
|
|
356
369
|
async function importPermissions(filePath, _options) {
|
|
@@ -365,15 +378,13 @@ async function importPermissions(filePath, _options) {
|
|
|
365
378
|
`));
|
|
366
379
|
try {
|
|
367
380
|
const content = await fs.readFile(filePath, "utf-8");
|
|
368
|
-
const
|
|
369
|
-
if (!
|
|
370
|
-
throw new TypeError("Invalid permissions file format");
|
|
371
|
-
}
|
|
372
|
-
await permissionManager.clearAllPermissions();
|
|
373
|
-
for (const perm of permissions) {
|
|
374
|
-
await permissionManager.grantPermission(perm.resource, perm.level, perm.metadata);
|
|
381
|
+
const config = JSON.parse(content);
|
|
382
|
+
if (!config.allow && !config.deny) {
|
|
383
|
+
throw new TypeError("Invalid permissions file format. Expected { allow: [], deny: [] }");
|
|
375
384
|
}
|
|
376
|
-
|
|
385
|
+
permissionManager.importPermissions(config, false);
|
|
386
|
+
const totalCount = (config.allow?.length || 0) + (config.deny?.length || 0);
|
|
387
|
+
console.log(chalk.green(`Imported ${totalCount} permissions successfully!`));
|
|
377
388
|
} catch (error) {
|
|
378
389
|
console.error(chalk.red("Error importing permissions:"), error);
|
|
379
390
|
process__default.exit(1);
|
|
@@ -394,24 +405,21 @@ function permissionsHelp(_options) {
|
|
|
394
405
|
console.log(" import <file> Import permissions from a file\n");
|
|
395
406
|
console.log(chalk.bold("Options:"));
|
|
396
407
|
console.log(" --format, -f Output format (table|json|list)");
|
|
397
|
-
console.log(" --verbose, -v Verbose output
|
|
408
|
+
console.log(" --verbose, -v Verbose output");
|
|
409
|
+
console.log(" --action, -a Action to check (read|write|admin)\n");
|
|
398
410
|
console.log(chalk.bold("Examples:"));
|
|
399
411
|
console.log(" ccjk permissions list");
|
|
400
|
-
console.log(
|
|
401
|
-
console.log(
|
|
412
|
+
console.log(' ccjk permissions check "Provider(302ai):*"');
|
|
413
|
+
console.log(' ccjk permissions grant "Provider(302ai):*"');
|
|
402
414
|
console.log(" ccjk permissions export permissions.json");
|
|
403
415
|
console.log(" ccjk permissions import permissions.json\n");
|
|
404
416
|
}
|
|
405
|
-
function
|
|
406
|
-
switch (
|
|
407
|
-
case "
|
|
408
|
-
return chalk.red;
|
|
409
|
-
case "read":
|
|
410
|
-
return chalk.yellow;
|
|
411
|
-
case "write":
|
|
412
|
-
return chalk.blue;
|
|
413
|
-
case "full":
|
|
417
|
+
function getTypeColor(type) {
|
|
418
|
+
switch (type) {
|
|
419
|
+
case "allow":
|
|
414
420
|
return chalk.green;
|
|
421
|
+
case "deny":
|
|
422
|
+
return chalk.red;
|
|
415
423
|
default:
|
|
416
424
|
return chalk.gray;
|
|
417
425
|
}
|
package/dist/chunks/session.mjs
CHANGED
|
@@ -338,8 +338,8 @@ Create a new session with: ${ansis.cyan("ccjk session create")}`));
|
|
|
338
338
|
}
|
|
339
339
|
console.log(ansis.cyan.bold("\n\u{1F4CB} Saved Sessions:\n"));
|
|
340
340
|
const sortedSessions = [...sessions].sort((a, b) => {
|
|
341
|
-
const aTime = a.
|
|
342
|
-
const bTime = b.
|
|
341
|
+
const aTime = a.lastUsedAt?.getTime() || a.createdAt.getTime();
|
|
342
|
+
const bTime = b.lastUsedAt?.getTime() || b.createdAt.getTime();
|
|
343
343
|
return bTime - aTime;
|
|
344
344
|
});
|
|
345
345
|
for (const session of sortedSessions) {
|
|
@@ -351,8 +351,8 @@ Create a new session with: ${ansis.cyan("ccjk session create")}`));
|
|
|
351
351
|
}
|
|
352
352
|
const createdDate = session.createdAt.toLocaleString();
|
|
353
353
|
console.log(ansis.gray(` Created: ${createdDate}`));
|
|
354
|
-
if (session.
|
|
355
|
-
const accessedDate = session.
|
|
354
|
+
if (session.lastUsedAt) {
|
|
355
|
+
const accessedDate = session.lastUsedAt.toLocaleString();
|
|
356
356
|
console.log(ansis.gray(` Last accessed: ${accessedDate}`));
|
|
357
357
|
}
|
|
358
358
|
if (session.history.length > 0) {
|
package/dist/cli.mjs
CHANGED
|
@@ -326,34 +326,18 @@ const COMMANDS = [
|
|
|
326
326
|
tier: "extended",
|
|
327
327
|
options: [
|
|
328
328
|
{ flags: "--format, -f <format>", description: "Output format (table|json)" },
|
|
329
|
-
{ flags: "--code-type, -T <type>", description: "Code tool type" }
|
|
329
|
+
{ flags: "--code-type, -T <type>", description: "Code tool type" },
|
|
330
|
+
{ flags: "--verbose, -v", description: "Verbose output" }
|
|
330
331
|
],
|
|
331
332
|
loader: async () => {
|
|
332
|
-
return async (options, action
|
|
333
|
+
return async (options, action) => {
|
|
333
334
|
const actionStr = action;
|
|
334
|
-
const
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
await addProvider(options);
|
|
341
|
-
} else if (actionStr === "remove") {
|
|
342
|
-
const { removeProvider } = await import('./chunks/providers.mjs');
|
|
343
|
-
await removeProvider(argsArr[0] || "", options);
|
|
344
|
-
} else if (actionStr === "edit") {
|
|
345
|
-
const { editProvider } = await import('./chunks/providers.mjs');
|
|
346
|
-
await editProvider(argsArr[0] || "", options);
|
|
347
|
-
} else if (actionStr === "test") {
|
|
348
|
-
const { testProvider } = await import('./chunks/providers.mjs');
|
|
349
|
-
await testProvider(argsArr[0] || "", options);
|
|
350
|
-
} else if (actionStr === "health") {
|
|
351
|
-
const { checkProviderHealth } = await import('./chunks/providers.mjs');
|
|
352
|
-
await checkProviderHealth(options);
|
|
353
|
-
} else {
|
|
354
|
-
console.error(`Unknown providers action: ${actionStr}`);
|
|
355
|
-
console.log("Available actions: list, add, remove, edit, test, health");
|
|
356
|
-
}
|
|
335
|
+
const { providersCommand } = await import('./chunks/providers.mjs');
|
|
336
|
+
await providersCommand(actionStr || "list", {
|
|
337
|
+
lang: options.lang,
|
|
338
|
+
codeType: options.codeType,
|
|
339
|
+
verbose: options.verbose
|
|
340
|
+
});
|
|
357
341
|
};
|
|
358
342
|
}
|
|
359
343
|
},
|
|
@@ -897,21 +881,6 @@ ${chalk.yellow("By Status:")}`);
|
|
|
897
881
|
};
|
|
898
882
|
}
|
|
899
883
|
},
|
|
900
|
-
// ==================== API Provider Management ====================
|
|
901
|
-
{
|
|
902
|
-
name: "providers [action]",
|
|
903
|
-
description: "Manage API providers",
|
|
904
|
-
tier: "extended",
|
|
905
|
-
options: [
|
|
906
|
-
{ flags: "--json", description: "Output in JSON format" }
|
|
907
|
-
],
|
|
908
|
-
loader: async () => {
|
|
909
|
-
const { providersCommand } = await import('./chunks/providers.mjs');
|
|
910
|
-
return async (options, action) => {
|
|
911
|
-
await providersCommand(action, options);
|
|
912
|
-
};
|
|
913
|
-
}
|
|
914
|
-
},
|
|
915
884
|
// ==================== Configuration Management ====================
|
|
916
885
|
{
|
|
917
886
|
name: "config [action] [key] [value]",
|
|
@@ -928,7 +897,12 @@ ${chalk.yellow("By Status:")}`);
|
|
|
928
897
|
args.push(key);
|
|
929
898
|
if (value !== void 0)
|
|
930
899
|
args.push(value);
|
|
931
|
-
await configCommand(action, args,
|
|
900
|
+
await configCommand(action || "list", args, {
|
|
901
|
+
lang: options.lang,
|
|
902
|
+
codeType: options.codeType,
|
|
903
|
+
global: options.global,
|
|
904
|
+
json: options.json
|
|
905
|
+
});
|
|
932
906
|
};
|
|
933
907
|
}
|
|
934
908
|
}
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"configCenter.mcpDesc": "Configure MCP services (includes Windows fix)",
|
|
68
68
|
"configCenter.model": "Default Model",
|
|
69
69
|
"configCenter.modelDesc": "Set default model (opus/sonnet/custom)",
|
|
70
|
-
"configCenter.memory": "AI Memory",
|
|
71
|
-
"configCenter.memoryDesc": "
|
|
70
|
+
"configCenter.memory": "AI Memory Management",
|
|
71
|
+
"configCenter.memoryDesc": "View/edit CLAUDE.md, Postmortem and other memory content",
|
|
72
72
|
"configCenter.permission": "Environment Permissions",
|
|
73
73
|
"configCenter.permissionDesc": "Import privacy protection env variables",
|
|
74
74
|
"configCenter.configSwitch": "Config Switch",
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"versionCheck.checking": "Checking version...",
|
|
3
|
+
"versionCheck.usingSource": "Using source: {{source}}",
|
|
4
|
+
"versionCheck.usingMirror": "Using mirror: {{source}}",
|
|
5
|
+
"versionCheck.fallbackToGitHub": "npm source unavailable, using GitHub API",
|
|
6
|
+
"versionCheck.usingCache": "Using cached version info ({{age}} ago)",
|
|
7
|
+
"versionCheck.cacheExpired": "Cache expired, fetching again",
|
|
8
|
+
"versionCheck.networkError": "Network error, please check connection",
|
|
9
|
+
"versionCheck.timeout": "Request timeout, trying next source",
|
|
10
|
+
"versionCheck.success": "Successfully fetched version: {{version}}",
|
|
11
|
+
"versionCheck.failed": "Unable to fetch latest version",
|
|
12
|
+
"chinaDetector.detected": "China user detected, prioritizing domestic mirrors",
|
|
13
|
+
"chinaDetector.envOverride": "Environment variable override: CCJK_CHINA_MODE={{mode}}",
|
|
14
|
+
"chinaDetector.usingDefault": "Using default source order",
|
|
15
|
+
"queryingVersion": "Querying latest version for {{package}}",
|
|
16
|
+
"tryingSource": "Trying registry source: {{source}}",
|
|
17
|
+
"sourceSuccess": "Successfully got version {{version}} from {{source}}",
|
|
18
|
+
"sourceFailed": "Registry source {{source}} failed, trying next",
|
|
19
|
+
"allSourcesFailed": "All registry sources failed for {{package}}",
|
|
20
|
+
"cacheHit": "Using cached version for {{package}}",
|
|
21
|
+
"chinaUserDetected": "China user detected, prioritizing domestic mirrors",
|
|
22
|
+
"globalUserDetected": "Global user detected, prioritizing npm registry",
|
|
23
|
+
"queryFailed": "Query to {{registry}} failed with status {{status}}",
|
|
24
|
+
"timeout": "Query to {{registry}} timed out after {{timeout}}ms",
|
|
25
|
+
"error": "Query to {{registry}} failed: {{error}}",
|
|
26
|
+
"githubNoMapping": "No GitHub repository mapping for package {{package}}",
|
|
27
|
+
"githubQueryFailed": "GitHub API query failed with status {{status}}",
|
|
28
|
+
"githubError": "GitHub API error: {{error}}",
|
|
29
|
+
"registryReachable": "Registry {{source}} is reachable",
|
|
30
|
+
"registryUnreachable": "Registry {{source}} is not reachable",
|
|
31
|
+
"checkingReachability": "Checking registry reachability...",
|
|
32
|
+
"multipleInstallations.detected": "⚠️ Multiple Claude Code installations detected",
|
|
33
|
+
"multipleInstallations.count": "Found {{count}} installations",
|
|
34
|
+
"multipleInstallations.installation": "Installation {{index}}",
|
|
35
|
+
"multipleInstallations.source": "Source: {{source}}",
|
|
36
|
+
"multipleInstallations.path": "Path: {{path}}",
|
|
37
|
+
"multipleInstallations.version": "Version: {{version}}",
|
|
38
|
+
"multipleInstallations.active": "(currently active)",
|
|
39
|
+
"multipleInstallations.inactive": "(inactive)",
|
|
40
|
+
"multipleInstallations.action": "How to proceed?",
|
|
41
|
+
"multipleInstallations.options.cleanup": "Keep recommended version and remove others",
|
|
42
|
+
"multipleInstallations.options.keep": "Keep current state",
|
|
43
|
+
"multipleInstallations.options.details": "View details",
|
|
44
|
+
"multipleInstallations.cleaning": "Cleaning up duplicate installations...",
|
|
45
|
+
"multipleInstallations.cleaned": "Cleanup completed",
|
|
46
|
+
"multipleInstallations.kept": "Keeping existing installations unchanged",
|
|
47
|
+
"multipleInstallations.recommendation": "Recommended: Keep {{source}} installation",
|
|
48
|
+
"sources.npm": "npm official registry",
|
|
49
|
+
"sources.taobao": "Taobao mirror",
|
|
50
|
+
"sources.huawei": "Huawei Cloud mirror",
|
|
51
|
+
"sources.github": "GitHub API",
|
|
52
|
+
"sources.homebrew-cask": "Homebrew Cask",
|
|
53
|
+
"sources.curl": "Official script installation"
|
|
54
|
+
}
|
|
@@ -26,8 +26,15 @@
|
|
|
26
26
|
"status.path": "Path: {path}",
|
|
27
27
|
"menu.title": "Superpowers Management",
|
|
28
28
|
"menu.install": "Install Superpowers",
|
|
29
|
+
"menu.installDesc": "Install the Superpowers skill system",
|
|
29
30
|
"menu.uninstall": "Uninstall Superpowers",
|
|
31
|
+
"menu.uninstallDesc": "Remove Superpowers from your system",
|
|
30
32
|
"menu.update": "Update Superpowers",
|
|
33
|
+
"menu.updateDesc": "Update to the latest version",
|
|
34
|
+
"menu.checkStatus": "Check Status",
|
|
35
|
+
"menu.checkStatusDesc": "View installation status and version",
|
|
36
|
+
"menu.viewSkills": "View Available Skills",
|
|
37
|
+
"menu.viewSkillsDesc": "Browse all available skills",
|
|
31
38
|
"menu.status": "Check Status",
|
|
32
39
|
"menu.skills": "View Available Skills",
|
|
33
40
|
"menu.back": "Back to Main Menu",
|
|
@@ -102,5 +109,9 @@
|
|
|
102
109
|
"prompts.confirmUpdate": "This will update Superpowers to the latest version. Continue?",
|
|
103
110
|
"prompts.selectInstallMethod": "Select installation method:",
|
|
104
111
|
"prompts.installMethods.marketplace": "Via Claude Code Marketplace (recommended)",
|
|
105
|
-
"prompts.installMethods.git": "Via Git Clone"
|
|
112
|
+
"prompts.installMethods.git": "Via Git Clone",
|
|
113
|
+
"install.selectMethod": "Select installation method:",
|
|
114
|
+
"install.methodNpm": "Via npm (recommended)",
|
|
115
|
+
"install.methodGit": "Via Git clone",
|
|
116
|
+
"uninstall.confirm": "Are you sure you want to uninstall Superpowers?"
|
|
106
117
|
}
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"configCenter.mcpDesc": "配置 MCP 服务(含 Windows 修复)",
|
|
68
68
|
"configCenter.model": "默认模型",
|
|
69
69
|
"configCenter.modelDesc": "设置默认模型(opus/sonnet/自定义)",
|
|
70
|
-
"configCenter.memory": "AI
|
|
71
|
-
"configCenter.memoryDesc": "
|
|
70
|
+
"configCenter.memory": "AI 记忆管理",
|
|
71
|
+
"configCenter.memoryDesc": "查看/编辑 CLAUDE.md、Postmortem 等记忆内容",
|
|
72
72
|
"configCenter.permission": "环境权限",
|
|
73
73
|
"configCenter.permissionDesc": "导入隐私保护环境变量配置",
|
|
74
74
|
"configCenter.configSwitch": "配置切换",
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"versionCheck.checking": "正在检查版本...",
|
|
3
|
+
"versionCheck.usingSource": "使用源: {{source}}",
|
|
4
|
+
"versionCheck.usingMirror": "使用镜像源: {{source}}",
|
|
5
|
+
"versionCheck.fallbackToGitHub": "npm 源不可用,使用 GitHub API",
|
|
6
|
+
"versionCheck.usingCache": "使用缓存版本信息 ({{age}}前)",
|
|
7
|
+
"versionCheck.cacheExpired": "缓存已过期,重新获取",
|
|
8
|
+
"versionCheck.networkError": "网络错误,请检查连接",
|
|
9
|
+
"versionCheck.timeout": "请求超时,尝试下一个源",
|
|
10
|
+
"versionCheck.success": "成功获取版本: {{version}}",
|
|
11
|
+
"versionCheck.failed": "无法获取最新版本",
|
|
12
|
+
"chinaDetector.detected": "检测到中国用户,优先使用国内镜像",
|
|
13
|
+
"chinaDetector.envOverride": "环境变量覆盖: CCJK_CHINA_MODE={{mode}}",
|
|
14
|
+
"chinaDetector.usingDefault": "使用默认源顺序",
|
|
15
|
+
"queryingVersion": "正在查询 {{package}} 的最新版本",
|
|
16
|
+
"tryingSource": "正在尝试镜像源: {{source}}",
|
|
17
|
+
"sourceSuccess": "成功从 {{source}} 获取版本 {{version}}",
|
|
18
|
+
"sourceFailed": "镜像源 {{source}} 失败,尝试下一个",
|
|
19
|
+
"allSourcesFailed": "所有镜像源均无法获取 {{package}} 的版本",
|
|
20
|
+
"cacheHit": "使用 {{package}} 的缓存版本",
|
|
21
|
+
"chinaUserDetected": "检测到中国用户,优先使用国内镜像",
|
|
22
|
+
"globalUserDetected": "检测到海外用户,优先使用 npm 官方源",
|
|
23
|
+
"queryFailed": "查询 {{registry}} 失败,状态码 {{status}}",
|
|
24
|
+
"timeout": "查询 {{registry}} 超时 ({{timeout}}ms)",
|
|
25
|
+
"error": "查询 {{registry}} 出错: {{error}}",
|
|
26
|
+
"githubNoMapping": "包 {{package}} 没有对应的 GitHub 仓库映射",
|
|
27
|
+
"githubQueryFailed": "GitHub API 查询失败,状态码 {{status}}",
|
|
28
|
+
"githubError": "GitHub API 错误: {{error}}",
|
|
29
|
+
"registryReachable": "镜像源 {{source}} 可访问",
|
|
30
|
+
"registryUnreachable": "镜像源 {{source}} 不可访问",
|
|
31
|
+
"checkingReachability": "正在检查镜像源可用性...",
|
|
32
|
+
"multipleInstallations.detected": "⚠️ 检测到多个 Claude Code 安装",
|
|
33
|
+
"multipleInstallations.count": "发现 {{count}} 个安装",
|
|
34
|
+
"multipleInstallations.installation": "安装 {{index}}",
|
|
35
|
+
"multipleInstallations.source": "来源: {{source}}",
|
|
36
|
+
"multipleInstallations.path": "路径: {{path}}",
|
|
37
|
+
"multipleInstallations.version": "版本: {{version}}",
|
|
38
|
+
"multipleInstallations.active": "(当前活跃)",
|
|
39
|
+
"multipleInstallations.inactive": "(未激活)",
|
|
40
|
+
"multipleInstallations.action": "如何处理?",
|
|
41
|
+
"multipleInstallations.options.cleanup": "保留推荐版本并移除其他",
|
|
42
|
+
"multipleInstallations.options.keep": "保持现状",
|
|
43
|
+
"multipleInstallations.options.details": "查看详细信息",
|
|
44
|
+
"multipleInstallations.cleaning": "正在清理重复安装...",
|
|
45
|
+
"multipleInstallations.cleaned": "已清理完成",
|
|
46
|
+
"multipleInstallations.kept": "保持现有安装不变",
|
|
47
|
+
"multipleInstallations.recommendation": "推荐: 保留 {{source}} 安装",
|
|
48
|
+
"sources.npm": "npm 官方源",
|
|
49
|
+
"sources.taobao": "淘宝镜像",
|
|
50
|
+
"sources.huawei": "华为云镜像",
|
|
51
|
+
"sources.github": "GitHub API",
|
|
52
|
+
"sources.homebrew-cask": "Homebrew Cask",
|
|
53
|
+
"sources.curl": "官方脚本安装"
|
|
54
|
+
}
|
|
@@ -26,8 +26,15 @@
|
|
|
26
26
|
"status.path": "路径: {path}",
|
|
27
27
|
"menu.title": "Superpowers 管理",
|
|
28
28
|
"menu.install": "安装 Superpowers",
|
|
29
|
+
"menu.installDesc": "安装 Superpowers 技能系统",
|
|
29
30
|
"menu.uninstall": "卸载 Superpowers",
|
|
31
|
+
"menu.uninstallDesc": "从系统中移除 Superpowers",
|
|
30
32
|
"menu.update": "更新 Superpowers",
|
|
33
|
+
"menu.updateDesc": "更新到最新版本",
|
|
34
|
+
"menu.checkStatus": "检查状态",
|
|
35
|
+
"menu.checkStatusDesc": "查看安装状态和版本",
|
|
36
|
+
"menu.viewSkills": "查看可用技能",
|
|
37
|
+
"menu.viewSkillsDesc": "浏览所有可用技能",
|
|
31
38
|
"menu.status": "检查状态",
|
|
32
39
|
"menu.skills": "查看可用技能",
|
|
33
40
|
"menu.back": "返回主菜单",
|
|
@@ -102,5 +109,9 @@
|
|
|
102
109
|
"prompts.confirmUpdate": "即将更新 Superpowers 到最新版本,是否继续?",
|
|
103
110
|
"prompts.selectInstallMethod": "选择安装方式:",
|
|
104
111
|
"prompts.installMethods.marketplace": "通过 Claude Code 市场安装(推荐)",
|
|
105
|
-
"prompts.installMethods.git": "通过 Git 克隆安装"
|
|
112
|
+
"prompts.installMethods.git": "通过 Git 克隆安装",
|
|
113
|
+
"install.selectMethod": "选择安装方式:",
|
|
114
|
+
"install.methodNpm": "通过 npm 安装(推荐)",
|
|
115
|
+
"install.methodGit": "通过 Git 克隆安装",
|
|
116
|
+
"uninstall.confirm": "确定要卸载 Superpowers 吗?"
|
|
106
117
|
}
|
package/package.json
CHANGED