ccjk 2.4.4 → 2.6.0
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/dist/chunks/api-providers.mjs +73 -1
- package/dist/chunks/ccjk-config.mjs +13 -77
- package/dist/chunks/ccr.mjs +9 -4
- package/dist/chunks/check-updates.mjs +4 -2
- package/dist/chunks/claude-code-config-manager.mjs +9 -15
- package/dist/chunks/claude-code-incremental-manager.mjs +5 -8
- package/dist/chunks/codex.mjs +10 -569
- package/dist/chunks/config-switch.mjs +7 -5
- package/dist/chunks/config.mjs +573 -0
- package/dist/chunks/config2.mjs +454 -0
- package/dist/chunks/doctor.mjs +89 -1
- package/dist/chunks/features.mjs +13 -10
- package/dist/chunks/index.mjs +10 -1164
- package/dist/chunks/index2.mjs +10 -2
- package/dist/chunks/init.mjs +14 -11
- package/dist/chunks/json-config.mjs +59 -0
- package/dist/chunks/mcp-server.mjs +776 -0
- package/dist/chunks/mcp.mjs +10 -8
- package/dist/chunks/menu.mjs +5 -5
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/permissions.mjs +428 -0
- package/dist/chunks/prompts.mjs +2 -1
- package/dist/chunks/providers.mjs +261 -0
- package/dist/chunks/session.mjs +484 -41
- package/dist/chunks/skills.mjs +553 -0
- package/dist/chunks/stats.mjs +411 -0
- package/dist/chunks/uninstall.mjs +4 -3
- package/dist/chunks/update.mjs +6 -3
- package/dist/chunks/workflows2.mjs +140 -0
- package/dist/cli.mjs +290 -10
- package/dist/i18n/locales/en/hooks.json +47 -0
- package/dist/i18n/locales/en/mcp.json +55 -0
- package/dist/i18n/locales/en/permissions.json +43 -0
- package/dist/i18n/locales/en/registry.json +54 -0
- package/dist/i18n/locales/en/sandbox.json +44 -0
- package/dist/i18n/locales/en/skills.json +89 -129
- package/dist/i18n/locales/en/stats.json +20 -0
- package/dist/i18n/locales/zh-CN/hooks.json +47 -0
- package/dist/i18n/locales/zh-CN/mcp.json +55 -0
- package/dist/i18n/locales/zh-CN/permissions.json +43 -0
- package/dist/i18n/locales/zh-CN/registry.json +54 -0
- package/dist/i18n/locales/zh-CN/sandbox.json +44 -0
- package/dist/i18n/locales/zh-CN/skills.json +88 -128
- package/dist/i18n/locales/zh-CN/stats.json +20 -0
- package/dist/index.mjs +12 -8
- package/dist/shared/ccjk.B-lZxV2u.mjs +1162 -0
- package/dist/shared/{ccjk.CURU8gbR.mjs → ccjk.CUdzQluX.mjs} +1 -1
- package/dist/shared/{ccjk.ByTIGCUC.mjs → ccjk.Dut3wyoP.mjs} +1 -1
- package/dist/shared/ccjk.J8YiPsOw.mjs +259 -0
- package/dist/shared/{ccjk.CGTmRqsu.mjs → ccjk.rLRHmcqD.mjs} +5 -134
- package/dist/shared/{ccjk.QbS8EAOd.mjs → ccjk.uVUeWAt8.mjs} +2 -1
- package/package.json +1 -1
- package/templates/common/skills/code-review.md +343 -0
- package/templates/common/skills/summarize.md +312 -0
- package/templates/common/skills/translate.md +202 -0
package/dist/cli.mjs
CHANGED
|
@@ -63,10 +63,17 @@ const COMMANDS = [
|
|
|
63
63
|
name: "doctor",
|
|
64
64
|
description: "Run environment health check",
|
|
65
65
|
tier: "core",
|
|
66
|
+
options: [
|
|
67
|
+
{ flags: "--check-providers", description: "Check API provider health" },
|
|
68
|
+
{ flags: "--code-type, -T <type>", description: "Code tool type" }
|
|
69
|
+
],
|
|
66
70
|
loader: async () => {
|
|
67
71
|
const { doctor } = await import('./chunks/doctor.mjs');
|
|
68
|
-
return async () => {
|
|
69
|
-
await doctor(
|
|
72
|
+
return async (options) => {
|
|
73
|
+
await doctor({
|
|
74
|
+
checkProviders: options.checkProviders,
|
|
75
|
+
codeType: options.codeType
|
|
76
|
+
});
|
|
70
77
|
};
|
|
71
78
|
}
|
|
72
79
|
},
|
|
@@ -83,6 +90,44 @@ const COMMANDS = [
|
|
|
83
90
|
}
|
|
84
91
|
},
|
|
85
92
|
// ==================== Extended Commands ====================
|
|
93
|
+
{
|
|
94
|
+
name: "serve",
|
|
95
|
+
description: "Start CCJK as MCP server",
|
|
96
|
+
tier: "extended",
|
|
97
|
+
options: [
|
|
98
|
+
{ flags: "--mcp", description: "Enable MCP server mode" },
|
|
99
|
+
{ flags: "--stdio", description: "Use stdio transport (default)" },
|
|
100
|
+
{ flags: "--http", description: "Use HTTP transport" },
|
|
101
|
+
{ flags: "--port <port>", description: "HTTP server port (default: 3000)" },
|
|
102
|
+
{ flags: "--host <host>", description: "HTTP server host (default: localhost)" },
|
|
103
|
+
{ flags: "--debug", description: "Enable debug logging" }
|
|
104
|
+
],
|
|
105
|
+
loader: async () => {
|
|
106
|
+
return async (options) => {
|
|
107
|
+
if (!options.mcp) {
|
|
108
|
+
console.error("Error: --mcp flag is required for serve command");
|
|
109
|
+
console.log("Usage: ccjk serve --mcp [--stdio|--http] [--port 3000]");
|
|
110
|
+
process__default.exit(1);
|
|
111
|
+
}
|
|
112
|
+
const { startMCPServer } = await import('./chunks/mcp-server.mjs');
|
|
113
|
+
const transport = options.http ? "http" : "stdio";
|
|
114
|
+
const port = options.port ? Number.parseInt(options.port, 10) : 3e3;
|
|
115
|
+
const host = options.host || "localhost";
|
|
116
|
+
const debug = options.debug || false;
|
|
117
|
+
console.error(`Starting CCJK MCP Server (${transport} mode)...`);
|
|
118
|
+
await startMCPServer({
|
|
119
|
+
transport,
|
|
120
|
+
port,
|
|
121
|
+
host,
|
|
122
|
+
debug
|
|
123
|
+
});
|
|
124
|
+
if (transport === "http") {
|
|
125
|
+
console.error(`MCP Server running on http://${host}:${port}`);
|
|
126
|
+
console.error("Press Ctrl+C to stop");
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
},
|
|
86
131
|
{
|
|
87
132
|
name: "mcp <action> [...args]",
|
|
88
133
|
description: "MCP Server management",
|
|
@@ -189,11 +234,27 @@ const COMMANDS = [
|
|
|
189
234
|
} else if (options.resume) {
|
|
190
235
|
await resumeInterview();
|
|
191
236
|
} else if (options.depth === "quick") {
|
|
192
|
-
await quickInterview(specFile,
|
|
237
|
+
await quickInterview(specFile, {
|
|
238
|
+
specFile,
|
|
239
|
+
depth: "quick",
|
|
240
|
+
resume: !!options.resume,
|
|
241
|
+
lang: options.lang
|
|
242
|
+
});
|
|
193
243
|
} else if (options.depth === "deep") {
|
|
194
|
-
await deepInterview(specFile,
|
|
244
|
+
await deepInterview(specFile, {
|
|
245
|
+
specFile,
|
|
246
|
+
depth: "deep",
|
|
247
|
+
resume: !!options.resume,
|
|
248
|
+
lang: options.lang
|
|
249
|
+
});
|
|
195
250
|
} else {
|
|
196
|
-
await interview({
|
|
251
|
+
await interview({
|
|
252
|
+
specFile,
|
|
253
|
+
depth: options.depth,
|
|
254
|
+
template: options.template,
|
|
255
|
+
resume: !!options.resume,
|
|
256
|
+
lang: options.lang
|
|
257
|
+
});
|
|
197
258
|
}
|
|
198
259
|
};
|
|
199
260
|
}
|
|
@@ -218,6 +279,68 @@ const COMMANDS = [
|
|
|
218
279
|
};
|
|
219
280
|
}
|
|
220
281
|
},
|
|
282
|
+
{
|
|
283
|
+
name: "config [action] [...args]",
|
|
284
|
+
description: "Manage CCJK configuration",
|
|
285
|
+
tier: "extended",
|
|
286
|
+
options: [
|
|
287
|
+
{ flags: "--format, -f <format>", description: "Output format (table|json|yaml)" },
|
|
288
|
+
{ flags: "--global, -g", description: "Use global config" }
|
|
289
|
+
],
|
|
290
|
+
loader: async () => {
|
|
291
|
+
return async (options, action, args) => {
|
|
292
|
+
const actionStr = action;
|
|
293
|
+
const argsArr = args;
|
|
294
|
+
const configOptions = { global: !!options.global, json: options.format === "json" };
|
|
295
|
+
if (!actionStr || actionStr === "list") {
|
|
296
|
+
const { listConfig } = await import('./chunks/config2.mjs');
|
|
297
|
+
await listConfig(configOptions);
|
|
298
|
+
} else if (actionStr === "get") {
|
|
299
|
+
const { getConfig } = await import('./chunks/config2.mjs');
|
|
300
|
+
await getConfig(argsArr[0] || "", configOptions);
|
|
301
|
+
} else if (actionStr === "set") {
|
|
302
|
+
const { setConfig } = await import('./chunks/config2.mjs');
|
|
303
|
+
await setConfig(argsArr[0] || "", argsArr[1] || "", configOptions);
|
|
304
|
+
} else if (actionStr === "unset") {
|
|
305
|
+
const { unsetConfig } = await import('./chunks/config2.mjs');
|
|
306
|
+
await unsetConfig(argsArr[0] || "", configOptions);
|
|
307
|
+
} else if (actionStr === "reset") {
|
|
308
|
+
const { resetConfig } = await import('./chunks/config2.mjs');
|
|
309
|
+
await resetConfig(configOptions);
|
|
310
|
+
} else if (actionStr === "edit") {
|
|
311
|
+
const { editConfig } = await import('./chunks/config2.mjs');
|
|
312
|
+
await editConfig(configOptions);
|
|
313
|
+
} else if (actionStr === "validate") {
|
|
314
|
+
const { validateConfig } = await import('./chunks/config2.mjs');
|
|
315
|
+
await validateConfig(configOptions);
|
|
316
|
+
} else {
|
|
317
|
+
console.error(`Unknown config action: ${actionStr}`);
|
|
318
|
+
console.log("Available actions: list, get, set, unset, reset, edit, validate");
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: "providers [action] [...args]",
|
|
325
|
+
description: "Manage API providers",
|
|
326
|
+
tier: "extended",
|
|
327
|
+
options: [
|
|
328
|
+
{ flags: "--format, -f <format>", description: "Output format (table|json)" },
|
|
329
|
+
{ flags: "--code-type, -T <type>", description: "Code tool type" },
|
|
330
|
+
{ flags: "--verbose, -v", description: "Verbose output" }
|
|
331
|
+
],
|
|
332
|
+
loader: async () => {
|
|
333
|
+
return async (options, action) => {
|
|
334
|
+
const actionStr = action;
|
|
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
|
+
});
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
},
|
|
221
344
|
{
|
|
222
345
|
name: "ccr",
|
|
223
346
|
description: "Configure Claude Code Router",
|
|
@@ -229,6 +352,95 @@ const COMMANDS = [
|
|
|
229
352
|
};
|
|
230
353
|
}
|
|
231
354
|
},
|
|
355
|
+
{
|
|
356
|
+
name: "permissions [action] [...args]",
|
|
357
|
+
description: "Manage CCJK permissions",
|
|
358
|
+
aliases: ["perm"],
|
|
359
|
+
tier: "extended",
|
|
360
|
+
options: [
|
|
361
|
+
{ flags: "--format, -f <format>", description: "Output format (table|json|list)" },
|
|
362
|
+
{ flags: "--verbose, -v", description: "Verbose output" }
|
|
363
|
+
],
|
|
364
|
+
loader: async () => {
|
|
365
|
+
return async (options, action, args) => {
|
|
366
|
+
const actionStr = action;
|
|
367
|
+
const argsArr = args;
|
|
368
|
+
if (!actionStr || actionStr === "list") {
|
|
369
|
+
const { listPermissions } = await import('./chunks/permissions.mjs');
|
|
370
|
+
await listPermissions(options);
|
|
371
|
+
} else if (actionStr === "check") {
|
|
372
|
+
const { checkPermission } = await import('./chunks/permissions.mjs');
|
|
373
|
+
await checkPermission(argsArr[0] || "", options);
|
|
374
|
+
} else if (actionStr === "grant") {
|
|
375
|
+
const { grantPermission } = await import('./chunks/permissions.mjs');
|
|
376
|
+
await grantPermission(argsArr[0] || "", options);
|
|
377
|
+
} else if (actionStr === "revoke") {
|
|
378
|
+
const { revokePermission } = await import('./chunks/permissions.mjs');
|
|
379
|
+
await revokePermission(argsArr[0] || "", options);
|
|
380
|
+
} else if (actionStr === "reset") {
|
|
381
|
+
const { resetPermissions } = await import('./chunks/permissions.mjs');
|
|
382
|
+
await resetPermissions(options);
|
|
383
|
+
} else if (actionStr === "export") {
|
|
384
|
+
const { exportPermissions } = await import('./chunks/permissions.mjs');
|
|
385
|
+
await exportPermissions(argsArr[0], options);
|
|
386
|
+
} else if (actionStr === "import") {
|
|
387
|
+
const { importPermissions } = await import('./chunks/permissions.mjs');
|
|
388
|
+
await importPermissions(argsArr[0] || "", options);
|
|
389
|
+
} else {
|
|
390
|
+
const { permissionsHelp } = await import('./chunks/permissions.mjs');
|
|
391
|
+
permissionsHelp(options);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
name: "skills [action] [...args]",
|
|
398
|
+
description: "Manage CCJK skills",
|
|
399
|
+
aliases: ["sk"],
|
|
400
|
+
tier: "extended",
|
|
401
|
+
options: [
|
|
402
|
+
{ flags: "--category, -c <category>", description: "Filter by category" },
|
|
403
|
+
{ flags: "--show-disabled", description: "Show disabled skills" },
|
|
404
|
+
{ flags: "--format, -f <format>", description: "Output format (table|json|list)" },
|
|
405
|
+
{ flags: "--batch", description: "Batch create skills" }
|
|
406
|
+
],
|
|
407
|
+
loader: async () => {
|
|
408
|
+
return async (options, action, args) => {
|
|
409
|
+
const { initI18n } = await import('./chunks/index2.mjs');
|
|
410
|
+
await initI18n(options.lang || "zh-CN");
|
|
411
|
+
const actionStr = action;
|
|
412
|
+
const argsArr = args;
|
|
413
|
+
if (!actionStr) {
|
|
414
|
+
const { skillsMenu } = await import('./chunks/skills.mjs');
|
|
415
|
+
await skillsMenu(options);
|
|
416
|
+
} else if (actionStr === "list" || actionStr === "ls") {
|
|
417
|
+
const { listSkills } = await import('./chunks/skills.mjs');
|
|
418
|
+
await listSkills(options);
|
|
419
|
+
} else if (actionStr === "run") {
|
|
420
|
+
const { runSkill } = await import('./chunks/skills.mjs');
|
|
421
|
+
await runSkill(argsArr[0] || "", options);
|
|
422
|
+
} else if (actionStr === "info") {
|
|
423
|
+
const { showSkillInfo } = await import('./chunks/skills.mjs');
|
|
424
|
+
await showSkillInfo(argsArr[0] || "", options);
|
|
425
|
+
} else if (actionStr === "create") {
|
|
426
|
+
const { createSkill } = await import('./chunks/skills.mjs');
|
|
427
|
+
await createSkill(argsArr[0] || "", options);
|
|
428
|
+
} else if (actionStr === "enable") {
|
|
429
|
+
const { enableSkill } = await import('./chunks/skills.mjs');
|
|
430
|
+
await enableSkill(argsArr[0] || "", options);
|
|
431
|
+
} else if (actionStr === "disable") {
|
|
432
|
+
const { disableSkill } = await import('./chunks/skills.mjs');
|
|
433
|
+
await disableSkill(argsArr[0] || "", options);
|
|
434
|
+
} else if (actionStr === "delete" || actionStr === "remove" || actionStr === "rm") {
|
|
435
|
+
const { deleteSkill } = await import('./chunks/skills.mjs');
|
|
436
|
+
await deleteSkill(argsArr[0] || "", options);
|
|
437
|
+
} else {
|
|
438
|
+
const { runSkill } = await import('./chunks/skills.mjs');
|
|
439
|
+
await runSkill(actionStr, options);
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
},
|
|
232
444
|
{
|
|
233
445
|
name: "ccu [...args]",
|
|
234
446
|
description: "Claude Code usage analysis",
|
|
@@ -240,6 +452,37 @@ const COMMANDS = [
|
|
|
240
452
|
};
|
|
241
453
|
}
|
|
242
454
|
},
|
|
455
|
+
{
|
|
456
|
+
name: "stats [action]",
|
|
457
|
+
description: "Usage statistics and analytics",
|
|
458
|
+
tier: "extended",
|
|
459
|
+
options: [
|
|
460
|
+
{ flags: "--period, -p <period>", description: "Time period (1d, 7d, 30d, 90d, all)" },
|
|
461
|
+
{ flags: "--format, -f <format>", description: "Output format (table, json, csv)" },
|
|
462
|
+
{ flags: "--export, -e <file>", description: "Export to file" },
|
|
463
|
+
{ flags: "--provider <provider>", description: "Filter by provider" },
|
|
464
|
+
{ flags: "--days <days>", description: "Days to keep for cleanup action" }
|
|
465
|
+
],
|
|
466
|
+
loader: async () => {
|
|
467
|
+
return async (options, action) => {
|
|
468
|
+
const actionStr = action;
|
|
469
|
+
if (actionStr === "dates") {
|
|
470
|
+
const { listStatsDates } = await import('./chunks/stats.mjs');
|
|
471
|
+
await listStatsDates();
|
|
472
|
+
} else if (actionStr === "storage") {
|
|
473
|
+
const { storageStats } = await import('./chunks/stats.mjs');
|
|
474
|
+
await storageStats();
|
|
475
|
+
} else if (actionStr === "cleanup") {
|
|
476
|
+
const { cleanupStats } = await import('./chunks/stats.mjs');
|
|
477
|
+
const days = options.days ? Number.parseInt(options.days, 10) : 90;
|
|
478
|
+
await cleanupStats(days);
|
|
479
|
+
} else {
|
|
480
|
+
const { stats } = await import('./chunks/stats.mjs');
|
|
481
|
+
await stats(options);
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
},
|
|
243
486
|
{
|
|
244
487
|
name: "uninstall",
|
|
245
488
|
description: "Remove CCJK configurations",
|
|
@@ -317,14 +560,19 @@ const COMMANDS = [
|
|
|
317
560
|
},
|
|
318
561
|
{
|
|
319
562
|
name: "session <action> [id]",
|
|
320
|
-
description: "Manage sessions (save, list, restore, export, cleanup, status)",
|
|
563
|
+
description: "Manage sessions (save, list, restore, export, cleanup, status, create, rename, delete)",
|
|
321
564
|
tier: "extended",
|
|
322
565
|
options: [
|
|
323
566
|
{ flags: "--all, -a", description: "Clean all targets without selection" },
|
|
324
|
-
{ flags: "--force, -f", description: "Force cleanup without confirmation" }
|
|
567
|
+
{ flags: "--force, -f", description: "Force cleanup without confirmation" },
|
|
568
|
+
{ flags: "--name, -n <name>", description: "Session name" },
|
|
569
|
+
{ flags: "--provider, -p <provider>", description: "API provider" },
|
|
570
|
+
{ flags: "--api-key, -k <key>", description: "API key" },
|
|
571
|
+
{ flags: "--resume, -r <session>", description: "Resume session by name or ID" },
|
|
572
|
+
{ flags: "--background, -b", description: "Run in background mode" }
|
|
325
573
|
],
|
|
326
574
|
loader: async () => {
|
|
327
|
-
const { saveSession, listSessions, restoreSession, exportSession, cleanupSession, sessionStatus } = await import('./chunks/session.mjs');
|
|
575
|
+
const { saveSession, listSessions, restoreSession, exportSession, cleanupSession, sessionStatus, createSessionCommand, renameSessionCommand, deleteSessionCommand } = await import('./chunks/session.mjs');
|
|
328
576
|
return async (options, action, id) => {
|
|
329
577
|
const actionStr = action;
|
|
330
578
|
if (actionStr === "save")
|
|
@@ -339,8 +587,14 @@ const COMMANDS = [
|
|
|
339
587
|
await cleanupSession({ all: options.all, force: options.force });
|
|
340
588
|
else if (actionStr === "status")
|
|
341
589
|
await sessionStatus();
|
|
590
|
+
else if (actionStr === "create")
|
|
591
|
+
await createSessionCommand(options);
|
|
592
|
+
else if (actionStr === "rename")
|
|
593
|
+
await renameSessionCommand(id, options);
|
|
594
|
+
else if (actionStr === "delete")
|
|
595
|
+
await deleteSessionCommand(id, options);
|
|
342
596
|
else
|
|
343
|
-
console.error(`Unknown action: ${actionStr}. Use: save, list, restore, export, cleanup, or
|
|
597
|
+
console.error(`Unknown action: ${actionStr}. Use: save, list, restore, export, cleanup, status, create, rename, or delete`);
|
|
344
598
|
};
|
|
345
599
|
}
|
|
346
600
|
},
|
|
@@ -626,6 +880,31 @@ ${chalk.yellow("By Status:")}`);
|
|
|
626
880
|
});
|
|
627
881
|
};
|
|
628
882
|
}
|
|
883
|
+
},
|
|
884
|
+
// ==================== Configuration Management ====================
|
|
885
|
+
{
|
|
886
|
+
name: "config [action] [key] [value]",
|
|
887
|
+
description: "Manage configuration",
|
|
888
|
+
tier: "extended",
|
|
889
|
+
options: [
|
|
890
|
+
{ flags: "--json", description: "Output in JSON format" }
|
|
891
|
+
],
|
|
892
|
+
loader: async () => {
|
|
893
|
+
const { configCommand } = await import('./chunks/config2.mjs');
|
|
894
|
+
return async (options, action, key, value) => {
|
|
895
|
+
const args = [];
|
|
896
|
+
if (key !== void 0)
|
|
897
|
+
args.push(key);
|
|
898
|
+
if (value !== void 0)
|
|
899
|
+
args.push(value);
|
|
900
|
+
await configCommand(action || "list", args, {
|
|
901
|
+
lang: options.lang,
|
|
902
|
+
codeType: options.codeType,
|
|
903
|
+
global: options.global,
|
|
904
|
+
json: options.json
|
|
905
|
+
});
|
|
906
|
+
};
|
|
907
|
+
}
|
|
629
908
|
}
|
|
630
909
|
// context 命令已在上面定义(第 435 行),使用 context-compression/commands/context.ts
|
|
631
910
|
// shell hook 管理功能通过 'ccjk context hook install/uninstall' 子命令访问
|
|
@@ -657,7 +936,7 @@ async function resolveLanguage(options) {
|
|
|
657
936
|
if (envLang)
|
|
658
937
|
return envLang;
|
|
659
938
|
try {
|
|
660
|
-
const { readZcfConfigAsync } = await import('./chunks/ccjk-config.mjs')
|
|
939
|
+
const { readZcfConfigAsync } = await import('./chunks/ccjk-config.mjs');
|
|
661
940
|
const config = await readZcfConfigAsync();
|
|
662
941
|
if (config?.preferredLang)
|
|
663
942
|
return config.preferredLang;
|
|
@@ -881,6 +1160,7 @@ function customizeHelpLazy(_sections, version) {
|
|
|
881
1160
|
body: [
|
|
882
1161
|
` ${cyan("ccjk mcp")} <action> MCP server management`,
|
|
883
1162
|
` ${cyan("ccjk browser")} ${gray("ab")} Agent Browser automation ${green("NEW")}`,
|
|
1163
|
+
` ${cyan("ccjk skills")} ${gray("sk")} Manage CCJK skills ${green("NEW")}`,
|
|
884
1164
|
` ${cyan("ccjk interview")} ${gray("iv")} Interview-driven development`,
|
|
885
1165
|
` ${cyan("ccjk commit")} Smart git commit`,
|
|
886
1166
|
` ${cyan("ccjk config-switch")} ${gray("cs")} Switch configuration`,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "CCJK Hooks Management",
|
|
3
|
+
"globalStatus": "Global Status",
|
|
4
|
+
"configPath": "Config Path",
|
|
5
|
+
"enabled": "Enabled",
|
|
6
|
+
"disabled": "Disabled",
|
|
7
|
+
"noHooksRegistered": "No hooks registered yet.",
|
|
8
|
+
"addHookHint": "Add your first hook with:",
|
|
9
|
+
"description": "Description",
|
|
10
|
+
"timeout": "Timeout",
|
|
11
|
+
"async": "Async",
|
|
12
|
+
"sync": "Sync",
|
|
13
|
+
"legend": "Legend",
|
|
14
|
+
"verboseHint": "Use --verbose for more details",
|
|
15
|
+
"type": {
|
|
16
|
+
"PreRequest": "Pre-Request Hooks",
|
|
17
|
+
"PostResponse": "Post-Response Hooks",
|
|
18
|
+
"ProviderSwitch": "Provider Switch Hooks",
|
|
19
|
+
"Error": "Error Hooks",
|
|
20
|
+
"SessionStart": "Session Start Hooks",
|
|
21
|
+
"SessionEnd": "Session End Hooks"
|
|
22
|
+
},
|
|
23
|
+
"invalidType": "Invalid hook type: {{type}}",
|
|
24
|
+
"validTypes": "Valid types",
|
|
25
|
+
"hookTypes": "Available hook types",
|
|
26
|
+
"addSuccess": "Hook added successfully: {{type}} - {{command}}",
|
|
27
|
+
"addFailed": "Failed to add hook",
|
|
28
|
+
"addUsage": "Usage: ccjk hooks add <type> <command>",
|
|
29
|
+
"addExample": "Example:",
|
|
30
|
+
"removeSuccess": "Hook removed successfully: {{type}} - {{command}}",
|
|
31
|
+
"removeNotFound": "Hook not found: {{type}} - {{command}}",
|
|
32
|
+
"removeUsage": "Usage: ccjk hooks remove <type> <command>",
|
|
33
|
+
"removeExample": "Example:",
|
|
34
|
+
"clearTypeSuccess": "All {{type}} hooks cleared successfully",
|
|
35
|
+
"clearTypeFailed": "Failed to clear {{type}} hooks",
|
|
36
|
+
"clearAllSuccess": "All hooks cleared successfully",
|
|
37
|
+
"clearAllFailed": "Failed to clear all hooks",
|
|
38
|
+
"enableSuccess": "Hooks enabled globally",
|
|
39
|
+
"disableSuccess": "Hooks disabled globally",
|
|
40
|
+
"helpTitle": "CCJK Hooks Commands",
|
|
41
|
+
"helpList": "List all registered hooks",
|
|
42
|
+
"helpAdd": "Add a new hook",
|
|
43
|
+
"helpRemove": "Remove a hook",
|
|
44
|
+
"helpClear": "Clear hooks (all or by type)",
|
|
45
|
+
"helpEnable": "Enable hooks globally",
|
|
46
|
+
"helpDisable": "Disable hooks globally"
|
|
47
|
+
}
|
|
@@ -68,5 +68,60 @@
|
|
|
68
68
|
"restartRequired": "Restart Claude Code for changes to take effect",
|
|
69
69
|
"noServicesInstalled": "No MCP services installed",
|
|
70
70
|
"installedServices": "Installed MCP services ({{tool}})"
|
|
71
|
+
},
|
|
72
|
+
"server": {
|
|
73
|
+
"starting": "Starting CCJK MCP server...",
|
|
74
|
+
"started": "✓ CCJK MCP server started",
|
|
75
|
+
"listening": "Listening on port: {{port}}",
|
|
76
|
+
"stdioMode": "Using stdio transport",
|
|
77
|
+
"httpMode": "Using HTTP transport",
|
|
78
|
+
"error": "MCP server error: {{error}}",
|
|
79
|
+
"invalidTransport": "Invalid transport mode: {{transport}}",
|
|
80
|
+
"portInUse": "Port {{port}} is already in use",
|
|
81
|
+
"initializeFailed": "Failed to initialize MCP server",
|
|
82
|
+
"toolNotFound": "Tool not found: {{name}}",
|
|
83
|
+
"toolExecutionError": "Tool execution error: {{error}}",
|
|
84
|
+
"invalidRequest": "Invalid request format",
|
|
85
|
+
"methodNotSupported": "Method not supported: {{method}}",
|
|
86
|
+
"serverInfo": "CCJK MCP Server v{{version}}",
|
|
87
|
+
"capabilities": "Server capabilities: {{capabilities}}",
|
|
88
|
+
"toolsAvailable": "Available tools: {{count}}",
|
|
89
|
+
"requestReceived": "Request received: {{method}}",
|
|
90
|
+
"responseTime": "Response time: {{time}}ms",
|
|
91
|
+
"debugMode": "Debug mode enabled"
|
|
92
|
+
},
|
|
93
|
+
"tools": {
|
|
94
|
+
"chat": {
|
|
95
|
+
"name": "CCJK Chat",
|
|
96
|
+
"description": "Send messages to Claude via CCJK with custom provider and model selection"
|
|
97
|
+
},
|
|
98
|
+
"providers": {
|
|
99
|
+
"name": "List Providers",
|
|
100
|
+
"description": "List all configured API providers"
|
|
101
|
+
},
|
|
102
|
+
"stats": {
|
|
103
|
+
"name": "Usage Statistics",
|
|
104
|
+
"description": "Get usage statistics (requires CCusage tool)"
|
|
105
|
+
},
|
|
106
|
+
"workflows": {
|
|
107
|
+
"name": "List Workflows",
|
|
108
|
+
"description": "List available workflows"
|
|
109
|
+
},
|
|
110
|
+
"mcpServices": {
|
|
111
|
+
"name": "List MCP Services",
|
|
112
|
+
"description": "List configured MCP services"
|
|
113
|
+
},
|
|
114
|
+
"config": {
|
|
115
|
+
"name": "Configuration Management",
|
|
116
|
+
"description": "Get or set CCJK configuration"
|
|
117
|
+
},
|
|
118
|
+
"init": {
|
|
119
|
+
"name": "Initialize Configuration",
|
|
120
|
+
"description": "Initialize or update Claude Code configuration"
|
|
121
|
+
},
|
|
122
|
+
"doctor": {
|
|
123
|
+
"name": "Health Check",
|
|
124
|
+
"description": "Run health check and diagnostics"
|
|
125
|
+
}
|
|
71
126
|
}
|
|
72
127
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"noRules": "No permission rules configured",
|
|
3
|
+
"currentRules": "Current Permission Rules",
|
|
4
|
+
"allowRules": "Allow Rules",
|
|
5
|
+
"denyRules": "Deny Rules",
|
|
6
|
+
"totalRules": "Total",
|
|
7
|
+
"allow": "allow",
|
|
8
|
+
"deny": "deny",
|
|
9
|
+
"ruleExamples": "Permission Rule Examples",
|
|
10
|
+
"ruleFormat": "Rule Format:",
|
|
11
|
+
"supportedResourceTypes": "Supported Resource Types:",
|
|
12
|
+
"wildcardSupport": "Wildcard Support:",
|
|
13
|
+
"enterRule": "Enter permission rule",
|
|
14
|
+
"invalidRule": "Invalid rule",
|
|
15
|
+
"selectRuleType": "Select rule type",
|
|
16
|
+
"enterDescription": "Enter description (optional)",
|
|
17
|
+
"ruleAdded": "Permission rule added",
|
|
18
|
+
"noRulesToRemove": "No permission rules to remove",
|
|
19
|
+
"selectRuleToRemove": "Select rule to remove",
|
|
20
|
+
"ruleRemoved": "Permission rule removed",
|
|
21
|
+
"rulesRemoved": "rules removed",
|
|
22
|
+
"ruleNotFound": "Rule not found",
|
|
23
|
+
"enterTarget": "Enter target to check (e.g., Provider(302ai):read)",
|
|
24
|
+
"invalidTargetFormat": "Invalid target format",
|
|
25
|
+
"targetFormatExample": "Expected format: Resource:action (e.g., Provider(302ai):read)",
|
|
26
|
+
"permissionCheck": "Permission Check Result",
|
|
27
|
+
"target": "Target",
|
|
28
|
+
"allowed": "ALLOWED",
|
|
29
|
+
"denied": "DENIED",
|
|
30
|
+
"reason": "Reason",
|
|
31
|
+
"matchedRule": "Matched Rule:",
|
|
32
|
+
"confirmClear": "Are you sure you want to clear {{type}} permission rules?",
|
|
33
|
+
"all": "all",
|
|
34
|
+
"rulesCleared": "Permission rules cleared",
|
|
35
|
+
"selectAction": "Select action",
|
|
36
|
+
"listRules": "List all rules",
|
|
37
|
+
"addRule": "Add new rule",
|
|
38
|
+
"removeRule": "Remove rule",
|
|
39
|
+
"checkPermission": "Check permission",
|
|
40
|
+
"clearRules": "Clear rules",
|
|
41
|
+
"showExamples": "Show examples",
|
|
42
|
+
"unknownAction": "Unknown action"
|
|
43
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"enablingTitle": "Enabling Sandbox Mode",
|
|
3
|
+
"enabledSuccess": "Sandbox mode enabled",
|
|
4
|
+
"disabledSuccess": "Sandbox mode disabled",
|
|
5
|
+
"notEnabled": "Sandbox mode is not enabled",
|
|
6
|
+
"statusTitle": "Sandbox Status",
|
|
7
|
+
"menuTitle": "Sandbox Management",
|
|
8
|
+
"isolateRequestsPrompt": "Isolate requests?",
|
|
9
|
+
"maskSensitiveDataPrompt": "Mask sensitive data?",
|
|
10
|
+
"auditLogPrompt": "Enable audit logging?",
|
|
11
|
+
"maxRequestsPrompt": "Maximum requests per minute",
|
|
12
|
+
"invalidNumber": "Please enter a valid number",
|
|
13
|
+
"disableConfirm": "Are you sure you want to disable sandbox mode?",
|
|
14
|
+
"clearConfirm": "Are you sure you want to clear audit logs?",
|
|
15
|
+
"clearedLogs": "Cleared {{count}} log file(s)",
|
|
16
|
+
"status": "Status",
|
|
17
|
+
"enabled": "Enabled",
|
|
18
|
+
"disabled": "Disabled",
|
|
19
|
+
"configuration": "Configuration",
|
|
20
|
+
"isolateRequests": "Request Isolation",
|
|
21
|
+
"maskSensitiveData": "Data Masking",
|
|
22
|
+
"auditLog": "Audit Logging",
|
|
23
|
+
"maxRequests": "Rate Limiting",
|
|
24
|
+
"statistics": "Statistics",
|
|
25
|
+
"totalRequests": "Total Requests",
|
|
26
|
+
"totalResponses": "Total Responses",
|
|
27
|
+
"totalErrors": "Total Errors",
|
|
28
|
+
"rateLimitHits": "Rate Limit Hits",
|
|
29
|
+
"auditLogInfo": "Audit Log Information",
|
|
30
|
+
"totalEntries": "Total Entries",
|
|
31
|
+
"requests": "Requests",
|
|
32
|
+
"responses": "Responses",
|
|
33
|
+
"errors": "Errors",
|
|
34
|
+
"timeRange": "Time Range",
|
|
35
|
+
"auditLogsTitle": "Audit Logs",
|
|
36
|
+
"showing": "Showing",
|
|
37
|
+
"entries": "entries",
|
|
38
|
+
"noAuditLogs": "No audit logs found",
|
|
39
|
+
"enableSandbox": "Enable Sandbox Mode",
|
|
40
|
+
"disableSandbox": "Disable Sandbox Mode",
|
|
41
|
+
"viewStatus": "View Status",
|
|
42
|
+
"viewAuditLogs": "View Audit Logs",
|
|
43
|
+
"clearAuditLogs": "Clear Audit Logs"
|
|
44
|
+
}
|