ccjk 2.2.2 → 2.2.5
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/auto-updater.mjs +37 -3
- package/dist/chunks/ccjk-config.mjs +77 -13
- package/dist/chunks/ccr.mjs +8 -11
- package/dist/chunks/ccu.mjs +4 -4
- package/dist/chunks/check-updates.mjs +5 -8
- package/dist/chunks/claude-code-config-manager.mjs +8 -11
- package/dist/chunks/claude-code-incremental-manager.mjs +4 -7
- package/dist/chunks/codex.mjs +496 -17
- package/dist/chunks/commands.mjs +392 -89
- package/dist/chunks/commands2.mjs +109 -0
- package/dist/chunks/config-consolidator.mjs +2 -2
- package/dist/chunks/config-switch.mjs +5 -8
- package/dist/chunks/doctor.mjs +6 -6
- package/dist/chunks/features.mjs +654 -35
- package/dist/chunks/help.mjs +339 -0
- package/dist/chunks/index.mjs +323 -10
- package/dist/chunks/index2.mjs +3 -3
- package/dist/chunks/index3.mjs +1171 -0
- package/dist/chunks/init.mjs +22 -25
- package/dist/chunks/installer.mjs +178 -0
- package/dist/chunks/interview.mjs +6 -6
- package/dist/chunks/mcp-performance.mjs +82 -2
- package/dist/chunks/mcp.mjs +500 -0
- package/dist/chunks/menu.mjs +10 -10
- package/dist/chunks/notification.mjs +5 -5
- package/dist/chunks/onboarding.mjs +6 -6
- package/dist/chunks/package.mjs +1 -1
- package/dist/chunks/platform.mjs +10 -10
- package/dist/chunks/prompts.mjs +7 -8
- package/dist/chunks/session.mjs +2 -2
- package/dist/chunks/skills-sync.mjs +2 -2
- package/dist/chunks/uninstall.mjs +4 -5
- package/dist/chunks/update.mjs +5 -8
- package/dist/chunks/upgrade-manager.mjs +2 -2
- package/dist/{shared/ccjk.Cy-RH2qV.mjs → chunks/version-checker.mjs} +373 -30
- package/dist/cli.mjs +293 -53
- package/dist/i18n/locales/en/agentBrowser.json +79 -0
- package/dist/i18n/locales/en/mcp.json +2 -4
- package/dist/i18n/locales/en/updater.json +5 -2
- package/dist/i18n/locales/zh/agentBrowser.json +79 -0
- package/dist/i18n/locales/zh-CN/common.json +1 -1
- package/dist/i18n/locales/zh-CN/mcp.json +2 -4
- package/dist/i18n/locales/zh-CN/updater.json +5 -2
- package/dist/index.d.mts +8 -584
- package/dist/index.d.ts +8 -584
- package/dist/index.mjs +10 -14
- package/dist/shared/{ccjk.DJM5aVQJ.mjs → ccjk.ByTIGCUC.mjs} +3 -3
- package/dist/shared/{ccjk.qYAnUMuy.mjs → ccjk.CGTmRqsu.mjs} +2 -3
- package/dist/shared/{ccjk.CUdzQluX.mjs → ccjk.CURU8gbR.mjs} +1 -1
- package/dist/{chunks/mcp-market.mjs → shared/ccjk.D-RZS4E2.mjs} +6 -65
- package/dist/shared/{ccjk.B7169qud.mjs → ccjk.tB4-Y4Qb.mjs} +3 -3
- package/package.json +4 -1
- package/templates/common/skills/en/agent-browser.md +258 -0
- package/templates/common/skills/zh-CN/agent-browser.md +260 -0
- package/dist/chunks/claude-config.mjs +0 -228
- package/dist/chunks/features2.mjs +0 -661
- package/dist/chunks/json-config.mjs +0 -59
- package/dist/chunks/mcp-doctor.mjs +0 -160
- package/dist/chunks/mcp-profile.mjs +0 -220
- package/dist/chunks/mcp-release.mjs +0 -138
- package/dist/chunks/shencha.mjs +0 -320
- package/dist/chunks/tools.mjs +0 -169
- package/dist/shared/ccjk.COdsoe-Y.mjs +0 -64
- package/dist/shared/ccjk.DwDtZ5cK.mjs +0 -266
- package/dist/shared/ccjk.n_AtlHzB.mjs +0 -186
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import process__default from 'node:process';
|
|
3
3
|
|
|
4
4
|
const COMMANDS = [
|
|
5
5
|
// ==================== Core Commands ====================
|
|
@@ -70,6 +70,18 @@ const COMMANDS = [
|
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
+
{
|
|
74
|
+
name: "help [topic]",
|
|
75
|
+
description: "Show help and quick reference",
|
|
76
|
+
aliases: ["h", "?"],
|
|
77
|
+
tier: "core",
|
|
78
|
+
loader: async () => {
|
|
79
|
+
const { help } = await import('./chunks/help.mjs');
|
|
80
|
+
return async (_options, topic) => {
|
|
81
|
+
await help(topic);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
},
|
|
73
85
|
// ==================== Extended Commands ====================
|
|
74
86
|
{
|
|
75
87
|
name: "mcp <action> [...args]",
|
|
@@ -83,18 +95,77 @@ const COMMANDS = [
|
|
|
83
95
|
return async (options, action, args) => {
|
|
84
96
|
const actionStr = action;
|
|
85
97
|
const argsArr = args;
|
|
86
|
-
if (actionStr === "
|
|
87
|
-
const {
|
|
88
|
-
await
|
|
98
|
+
if (actionStr === "status" || !actionStr) {
|
|
99
|
+
const { mcpStatus } = await import('./chunks/mcp.mjs');
|
|
100
|
+
await mcpStatus(options);
|
|
89
101
|
} else if (actionStr === "doctor") {
|
|
90
|
-
const { mcpDoctor } = await import('./chunks/mcp
|
|
102
|
+
const { mcpDoctor } = await import('./chunks/mcp.mjs');
|
|
91
103
|
await mcpDoctor(options);
|
|
104
|
+
} else if (actionStr === "profile") {
|
|
105
|
+
const { listProfiles, useProfile } = await import('./chunks/mcp.mjs');
|
|
106
|
+
if (!argsArr[0] || argsArr[0] === "list") {
|
|
107
|
+
await listProfiles(options);
|
|
108
|
+
} else {
|
|
109
|
+
await useProfile(argsArr[0], options);
|
|
110
|
+
}
|
|
92
111
|
} else if (actionStr === "release") {
|
|
93
|
-
const { mcpRelease } = await import('./chunks/mcp
|
|
112
|
+
const { mcpRelease } = await import('./chunks/mcp.mjs');
|
|
94
113
|
await mcpRelease(options);
|
|
114
|
+
} else if (actionStr === "help") {
|
|
115
|
+
const { mcpHelp } = await import('./chunks/mcp.mjs');
|
|
116
|
+
mcpHelp(options);
|
|
117
|
+
} else if (actionStr === "list") {
|
|
118
|
+
const { mcpList } = await import('./chunks/mcp.mjs');
|
|
119
|
+
await mcpList(options);
|
|
120
|
+
} else if (actionStr === "search") {
|
|
121
|
+
const { mcpSearch } = await import('./chunks/mcp.mjs');
|
|
122
|
+
await mcpSearch(argsArr[0] || "", options);
|
|
123
|
+
} else if (actionStr === "install") {
|
|
124
|
+
const { mcpInstall } = await import('./chunks/mcp.mjs');
|
|
125
|
+
await mcpInstall(argsArr[0] || "", options);
|
|
126
|
+
} else if (actionStr === "uninstall") {
|
|
127
|
+
const { mcpUninstall } = await import('./chunks/mcp.mjs');
|
|
128
|
+
await mcpUninstall(argsArr[0] || "", options);
|
|
95
129
|
} else {
|
|
96
|
-
const {
|
|
97
|
-
|
|
130
|
+
const { mcpHelp } = await import('./chunks/mcp.mjs');
|
|
131
|
+
mcpHelp(options);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "browser <action> [...args]",
|
|
138
|
+
description: "Agent Browser management",
|
|
139
|
+
aliases: ["ab"],
|
|
140
|
+
tier: "extended",
|
|
141
|
+
options: [
|
|
142
|
+
{ flags: "--verbose, -v", description: "Verbose output" }
|
|
143
|
+
],
|
|
144
|
+
loader: async () => {
|
|
145
|
+
return async (options, action, args) => {
|
|
146
|
+
const actionStr = action;
|
|
147
|
+
const argsArr = args;
|
|
148
|
+
if (actionStr === "install") {
|
|
149
|
+
const { installAgentBrowser } = await import('./chunks/installer.mjs');
|
|
150
|
+
await installAgentBrowser(options);
|
|
151
|
+
} else if (actionStr === "uninstall") {
|
|
152
|
+
const { uninstallAgentBrowser } = await import('./chunks/installer.mjs');
|
|
153
|
+
await uninstallAgentBrowser(options);
|
|
154
|
+
} else if (actionStr === "status") {
|
|
155
|
+
const { agentBrowserStatus } = await import('./chunks/commands.mjs');
|
|
156
|
+
await agentBrowserStatus(options);
|
|
157
|
+
} else if (actionStr === "start") {
|
|
158
|
+
const { startBrowserSession } = await import('./chunks/commands.mjs');
|
|
159
|
+
await startBrowserSession(argsArr[0], options);
|
|
160
|
+
} else if (actionStr === "stop") {
|
|
161
|
+
const { stopBrowserSession } = await import('./chunks/commands.mjs');
|
|
162
|
+
await stopBrowserSession(options);
|
|
163
|
+
} else if (actionStr === "config") {
|
|
164
|
+
const { configureBrowser } = await import('./chunks/commands.mjs');
|
|
165
|
+
await configureBrowser(options);
|
|
166
|
+
} else {
|
|
167
|
+
const { agentBrowserHelp } = await import('./chunks/commands.mjs');
|
|
168
|
+
agentBrowserHelp(options);
|
|
98
169
|
}
|
|
99
170
|
};
|
|
100
171
|
}
|
|
@@ -306,52 +377,218 @@ const COMMANDS = [
|
|
|
306
377
|
};
|
|
307
378
|
}
|
|
308
379
|
},
|
|
309
|
-
// ====================
|
|
380
|
+
// ==================== Postmortem System ====================
|
|
310
381
|
{
|
|
311
|
-
name: "
|
|
312
|
-
description:
|
|
313
|
-
|
|
314
|
-
|
|
382
|
+
name: "postmortem <action> [...args]",
|
|
383
|
+
description: "\u{1F52C} Postmortem Intelligence - Learn from historical bugs",
|
|
384
|
+
aliases: ["pm"],
|
|
385
|
+
tier: "extended",
|
|
386
|
+
options: [
|
|
387
|
+
{ flags: "--severity <level>", description: "Filter by severity (critical/high/medium/low)" },
|
|
388
|
+
{ flags: "--category <cat>", description: "Filter by category" },
|
|
389
|
+
{ flags: "--status <status>", description: "Filter by status" },
|
|
390
|
+
{ flags: "--staged", description: "Check staged files only" },
|
|
391
|
+
{ flags: "--ci", description: "CI mode, exit with error on issues" },
|
|
392
|
+
{ flags: "--since <tag>", description: "Start version/commit" },
|
|
393
|
+
{ flags: "--until <tag>", description: "End version/commit" },
|
|
394
|
+
{ flags: "--version <ver>", description: "Associated version" }
|
|
395
|
+
],
|
|
315
396
|
loader: async () => {
|
|
316
|
-
|
|
317
|
-
return async (options, action) => {
|
|
318
|
-
console.warn('\n\u26A0\uFE0F shencha \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u5C06\u5728\u4E0B\u4E2A\u7248\u672C\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 "ccjk doctor" \u66FF\u4EE3\u3002\n');
|
|
397
|
+
return async (options, action, args) => {
|
|
319
398
|
const actionStr = action;
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
await
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
399
|
+
const argsArr = args || [];
|
|
400
|
+
const { getPostmortemManager } = await import('./chunks/index3.mjs');
|
|
401
|
+
const manager = getPostmortemManager(process__default.cwd());
|
|
402
|
+
if (actionStr === "init") {
|
|
403
|
+
const ora = (await import('ora')).default;
|
|
404
|
+
const chalk = (await import('chalk')).default;
|
|
405
|
+
const spinner = ora("Analyzing historical fix commits...").start();
|
|
406
|
+
try {
|
|
407
|
+
const result = await manager.init();
|
|
408
|
+
spinner.succeed(chalk.green("Postmortem system initialized"));
|
|
409
|
+
console.log(`
|
|
410
|
+
${chalk.yellow("Reports generated:")} ${result.created}`);
|
|
411
|
+
console.log(` ${chalk.yellow("Directory:")} ${result.directory}
|
|
412
|
+
`);
|
|
413
|
+
} catch (error) {
|
|
414
|
+
spinner.fail(chalk.red("Initialization failed"));
|
|
415
|
+
console.error(error);
|
|
416
|
+
}
|
|
417
|
+
} else if (actionStr === "generate" || actionStr === "gen") {
|
|
418
|
+
const ora = (await import('ora')).default;
|
|
419
|
+
const chalk = (await import('chalk')).default;
|
|
420
|
+
const spinner = ora("Analyzing commits...").start();
|
|
421
|
+
try {
|
|
422
|
+
if (options.version) {
|
|
423
|
+
const summary = await manager.generateReleaseSummary({
|
|
424
|
+
version: options.version,
|
|
425
|
+
since: options.since,
|
|
426
|
+
until: options.until
|
|
427
|
+
});
|
|
428
|
+
spinner.succeed(chalk.green("Release summary generated"));
|
|
429
|
+
console.log(`
|
|
430
|
+
${chalk.yellow("Version:")} ${summary.version}`);
|
|
431
|
+
console.log(` ${chalk.yellow("Fix commits:")} ${summary.fixCommitCount}`);
|
|
432
|
+
console.log(` ${chalk.yellow("New postmortems:")} ${summary.newPostmortems.length}
|
|
433
|
+
`);
|
|
434
|
+
} else {
|
|
435
|
+
const result = await manager.init();
|
|
436
|
+
spinner.succeed(chalk.green("Postmortem generation complete"));
|
|
437
|
+
console.log(`
|
|
438
|
+
${chalk.yellow("Reports:")} ${result.created}
|
|
439
|
+
`);
|
|
440
|
+
}
|
|
441
|
+
} catch (error) {
|
|
442
|
+
spinner.fail(chalk.red("Generation failed"));
|
|
443
|
+
console.error(error);
|
|
444
|
+
}
|
|
445
|
+
} else if (actionStr === "list" || actionStr === "ls") {
|
|
446
|
+
const chalk = (await import('chalk')).default;
|
|
447
|
+
let reports = manager.listReports();
|
|
448
|
+
if (options.severity)
|
|
449
|
+
reports = reports.filter((r) => r.severity === options.severity);
|
|
450
|
+
if (options.category)
|
|
451
|
+
reports = reports.filter((r) => r.category === options.category);
|
|
452
|
+
if (options.status)
|
|
453
|
+
reports = reports.filter((r) => r.status === options.status);
|
|
454
|
+
if (reports.length === 0) {
|
|
455
|
+
console.log(chalk.yellow("\nNo postmortem reports found"));
|
|
456
|
+
console.log(chalk.gray('Run "ccjk postmortem init" to initialize\n'));
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
const severityEmoji = { critical: "\u{1F534}", high: "\u{1F7E0}", medium: "\u{1F7E1}", low: "\u{1F7E2}" };
|
|
460
|
+
console.log(chalk.cyan.bold("\n\u{1F4CB} Postmortem Reports"));
|
|
461
|
+
console.log(chalk.gray("\u2500".repeat(50)));
|
|
462
|
+
for (const r of reports) {
|
|
463
|
+
console.log(`
|
|
464
|
+
${severityEmoji[r.severity] || "\u26AA"} ${chalk.bold(r.id)}: ${r.title}`);
|
|
465
|
+
console.log(` ${chalk.gray("Category:")} ${r.category} ${chalk.gray("Status:")} ${r.status}`);
|
|
466
|
+
}
|
|
467
|
+
console.log(chalk.gray(`
|
|
468
|
+
\u2500 Total: ${reports.length} reports \u2500
|
|
469
|
+
`));
|
|
470
|
+
} else if (actionStr === "show") {
|
|
471
|
+
const chalk = (await import('chalk')).default;
|
|
472
|
+
const id = argsArr[0];
|
|
473
|
+
if (!id) {
|
|
474
|
+
console.log(chalk.red("Please specify a postmortem ID"));
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const report = manager.getReport(id);
|
|
478
|
+
if (!report) {
|
|
479
|
+
console.log(chalk.red(`Postmortem not found: ${id}`));
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
console.log(chalk.cyan.bold(`
|
|
483
|
+
\u2550\u2550\u2550 ${report.id}: ${report.title} \u2550\u2550\u2550
|
|
484
|
+
`));
|
|
485
|
+
console.log(`${chalk.yellow("Severity:")} ${report.severity.toUpperCase()}`);
|
|
486
|
+
console.log(`${chalk.yellow("Category:")} ${report.category}`);
|
|
487
|
+
console.log(`${chalk.yellow("Status:")} ${report.status}`);
|
|
488
|
+
console.log(`
|
|
489
|
+
${chalk.cyan("Description:")}
|
|
490
|
+
${report.description}`);
|
|
491
|
+
console.log(`
|
|
492
|
+
${chalk.cyan("Root Cause:")}
|
|
493
|
+
${report.rootCause.map((c) => ` \u2022 ${c}`).join("\n")}`);
|
|
494
|
+
console.log(`
|
|
495
|
+
${chalk.cyan("Prevention:")}
|
|
496
|
+
${report.preventionMeasures.map((m) => ` \u2022 ${m}`).join("\n")}`);
|
|
497
|
+
console.log(`
|
|
498
|
+
${chalk.cyan("AI Directives:")}
|
|
499
|
+
${report.aiDirectives.map((d) => ` \u2022 ${d}`).join("\n")}
|
|
500
|
+
`);
|
|
501
|
+
} else if (actionStr === "check") {
|
|
502
|
+
const ora = (await import('ora')).default;
|
|
503
|
+
const chalk = (await import('chalk')).default;
|
|
504
|
+
const spinner = ora("Checking code...").start();
|
|
505
|
+
try {
|
|
506
|
+
const result = await manager.checkCode({
|
|
507
|
+
staged: options.staged,
|
|
508
|
+
files: argsArr.length > 0 ? argsArr : void 0
|
|
509
|
+
});
|
|
510
|
+
spinner.stop();
|
|
511
|
+
console.log(chalk.cyan.bold("\n\u{1F50D} Postmortem Code Check"));
|
|
512
|
+
console.log(chalk.gray("\u2500".repeat(40)));
|
|
513
|
+
console.log(` Files checked: ${result.filesChecked}`);
|
|
514
|
+
console.log(` Issues found: ${result.issuesFound.length}`);
|
|
515
|
+
console.log(`
|
|
516
|
+
\u{1F534} Critical: ${result.summary.critical}`);
|
|
517
|
+
console.log(` \u{1F7E0} High: ${result.summary.high}`);
|
|
518
|
+
console.log(` \u{1F7E1} Medium: ${result.summary.medium}`);
|
|
519
|
+
console.log(` \u{1F7E2} Low: ${result.summary.low}`);
|
|
520
|
+
if (result.issuesFound.length > 0) {
|
|
521
|
+
console.log(chalk.yellow("\n\u26A0\uFE0F Issues:"));
|
|
522
|
+
for (const issue of result.issuesFound.slice(0, 10)) {
|
|
523
|
+
console.log(`
|
|
524
|
+
${issue.file}:${issue.line}`);
|
|
525
|
+
console.log(` ${issue.message}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
console.log(result.passed ? chalk.green("\n\u2705 Check passed\n") : chalk.red("\n\u274C Check failed\n"));
|
|
529
|
+
if (!result.passed && options.ci)
|
|
530
|
+
process__default.exit(1);
|
|
531
|
+
} catch (error) {
|
|
532
|
+
spinner.fail(chalk.red("Check failed"));
|
|
533
|
+
console.error(error);
|
|
534
|
+
}
|
|
535
|
+
} else if (actionStr === "sync") {
|
|
536
|
+
const ora = (await import('ora')).default;
|
|
537
|
+
const chalk = (await import('chalk')).default;
|
|
538
|
+
const spinner = ora("Syncing to CLAUDE.md...").start();
|
|
539
|
+
try {
|
|
540
|
+
const result = await manager.syncToClaudeMd();
|
|
541
|
+
spinner.succeed(chalk.green("Sync complete"));
|
|
542
|
+
console.log(`
|
|
543
|
+
${chalk.yellow("Synced:")} ${result.synced} items`);
|
|
544
|
+
console.log(` ${chalk.yellow("File:")} ${result.claudeMdPath}
|
|
545
|
+
`);
|
|
546
|
+
} catch (error) {
|
|
547
|
+
spinner.fail(chalk.red("Sync failed"));
|
|
548
|
+
console.error(error);
|
|
549
|
+
}
|
|
550
|
+
} else if (actionStr === "stats") {
|
|
551
|
+
const chalk = (await import('chalk')).default;
|
|
552
|
+
const index = manager.loadIndex();
|
|
553
|
+
if (!index) {
|
|
554
|
+
console.log(chalk.yellow("\nNo statistics available"));
|
|
555
|
+
console.log(chalk.gray('Run "ccjk postmortem init" to initialize\n'));
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
console.log(chalk.cyan.bold("\n\u{1F4CA} Postmortem Statistics"));
|
|
559
|
+
console.log(chalk.gray("\u2500".repeat(40)));
|
|
560
|
+
console.log(`
|
|
561
|
+
${chalk.yellow("Total:")} ${index.stats.total} reports`);
|
|
562
|
+
console.log(`
|
|
563
|
+
${chalk.yellow("By Severity:")}`);
|
|
564
|
+
console.log(` \u{1F534} Critical: ${index.stats.bySeverity.critical}`);
|
|
565
|
+
console.log(` \u{1F7E0} High: ${index.stats.bySeverity.high}`);
|
|
566
|
+
console.log(` \u{1F7E1} Medium: ${index.stats.bySeverity.medium}`);
|
|
567
|
+
console.log(` \u{1F7E2} Low: ${index.stats.bySeverity.low}`);
|
|
568
|
+
console.log(`
|
|
569
|
+
${chalk.yellow("By Status:")}`);
|
|
570
|
+
console.log(` \u26A1 Active: ${index.stats.byStatus.active}`);
|
|
571
|
+
console.log(` \u2705 Resolved: ${index.stats.byStatus.resolved}`);
|
|
572
|
+
console.log(` \u{1F440} Monitoring: ${index.stats.byStatus.monitoring}`);
|
|
573
|
+
console.log(` \u{1F4E6} Archived: ${index.stats.byStatus.archived}
|
|
574
|
+
`);
|
|
575
|
+
} else {
|
|
576
|
+
console.log("\n\u{1F52C} Postmortem Commands:");
|
|
577
|
+
console.log(" ccjk postmortem init - Initialize system");
|
|
578
|
+
console.log(" ccjk postmortem generate - Generate from commits");
|
|
579
|
+
console.log(" ccjk postmortem list - List all reports");
|
|
580
|
+
console.log(" ccjk postmortem show <id> - Show report details");
|
|
581
|
+
console.log(" ccjk postmortem check - Check code for issues");
|
|
582
|
+
console.log(" ccjk postmortem sync - Sync to CLAUDE.md");
|
|
583
|
+
console.log(" ccjk postmortem stats - Show statistics\n");
|
|
584
|
+
}
|
|
352
585
|
};
|
|
353
586
|
}
|
|
354
587
|
}
|
|
588
|
+
// Deprecated commands removed in v2.x cleanup
|
|
589
|
+
// - shencha: replaced by 'ccjk doctor'
|
|
590
|
+
// - features: replaced by 'ccjk' menu
|
|
591
|
+
// - tools: replaced by 'ccjk' menu
|
|
355
592
|
];
|
|
356
593
|
let i18nInitialized = false;
|
|
357
594
|
let currentLang = "en";
|
|
@@ -368,7 +605,7 @@ async function initI18nLazy(lang) {
|
|
|
368
605
|
currentLang = lang || "en";
|
|
369
606
|
}
|
|
370
607
|
async function resolveLanguage(options) {
|
|
371
|
-
const envLang =
|
|
608
|
+
const envLang = process__default.env.CCJK_LANG;
|
|
372
609
|
if (options?.allLang)
|
|
373
610
|
return options.allLang;
|
|
374
611
|
if (options?.lang)
|
|
@@ -376,7 +613,7 @@ async function resolveLanguage(options) {
|
|
|
376
613
|
if (envLang)
|
|
377
614
|
return envLang;
|
|
378
615
|
try {
|
|
379
|
-
const { readZcfConfigAsync } = await import('./chunks/ccjk-config.mjs');
|
|
616
|
+
const { readZcfConfigAsync } = await import('./chunks/ccjk-config.mjs').then(function (n) { return n.h; });
|
|
380
617
|
const config = await readZcfConfigAsync();
|
|
381
618
|
if (config?.preferredLang)
|
|
382
619
|
return config.preferredLang;
|
|
@@ -399,7 +636,7 @@ function extractLanguageOptions(options) {
|
|
|
399
636
|
};
|
|
400
637
|
}
|
|
401
638
|
async function setupCommandsLazy(cli) {
|
|
402
|
-
const envLang =
|
|
639
|
+
const envLang = process__default.env.CCJK_LANG;
|
|
403
640
|
if (envLang) {
|
|
404
641
|
await initI18nLazy(envLang);
|
|
405
642
|
}
|
|
@@ -585,16 +822,19 @@ function customizeHelpLazy(_sections, version) {
|
|
|
585
822
|
` ${cyan("ccjk")} Interactive menu ${green("(default)")}`,
|
|
586
823
|
` ${cyan("ccjk init")} ${gray("i")} Initialize configuration`,
|
|
587
824
|
` ${cyan("ccjk update")} ${gray("u")} Update prompts & workflows`,
|
|
588
|
-
` ${cyan("ccjk doctor")} Health check & diagnostics
|
|
825
|
+
` ${cyan("ccjk doctor")} Health check & diagnostics`,
|
|
826
|
+
` ${cyan("ccjk help")} ${gray("h")} Help center & quick reference ${green("NEW")}`
|
|
589
827
|
].join("\n")
|
|
590
828
|
});
|
|
591
829
|
newSections.push({
|
|
592
830
|
title: yellow("\u{1F6E0}\uFE0F Development"),
|
|
593
831
|
body: [
|
|
594
832
|
` ${cyan("ccjk mcp")} <action> MCP server management`,
|
|
833
|
+
` ${cyan("ccjk browser")} ${gray("ab")} Agent Browser automation ${green("NEW")}`,
|
|
595
834
|
` ${cyan("ccjk interview")} ${gray("iv")} Interview-driven development`,
|
|
596
835
|
` ${cyan("ccjk commit")} Smart git commit`,
|
|
597
|
-
` ${cyan("ccjk config-switch")} ${gray("cs")} Switch configuration
|
|
836
|
+
` ${cyan("ccjk config-switch")} ${gray("cs")} Switch configuration`,
|
|
837
|
+
` ${cyan("ccjk postmortem")} ${gray("pm")} Postmortem intelligence`
|
|
598
838
|
].join("\n")
|
|
599
839
|
});
|
|
600
840
|
newSections.push({
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"menuTitle": "🌐 Agent Browser - AI Browser Automation",
|
|
3
|
+
"menuOptions": {
|
|
4
|
+
"install": "Install agent-browser",
|
|
5
|
+
"status": "Check status",
|
|
6
|
+
"update": "Update to latest",
|
|
7
|
+
"sessions": "Manage sessions",
|
|
8
|
+
"quickTest": "Quick test",
|
|
9
|
+
"uninstall": "Uninstall",
|
|
10
|
+
"back": "Back"
|
|
11
|
+
},
|
|
12
|
+
"menuDescriptions": {
|
|
13
|
+
"install": "Install agent-browser CLI and Chromium",
|
|
14
|
+
"status": "Show installation and session status",
|
|
15
|
+
"update": "Update agent-browser to latest version",
|
|
16
|
+
"sessions": "List and manage browser sessions",
|
|
17
|
+
"quickTest": "Open a test page to verify installation",
|
|
18
|
+
"uninstall": "Remove agent-browser from system"
|
|
19
|
+
},
|
|
20
|
+
"installing": "Installing agent-browser...",
|
|
21
|
+
"installSuccess": "agent-browser installed successfully!",
|
|
22
|
+
"installFailed": "Failed to install agent-browser",
|
|
23
|
+
"installingBrowser": "Installing Chromium browser...",
|
|
24
|
+
"browserInstallSuccess": "Chromium browser installed successfully!",
|
|
25
|
+
"browserInstallFailed": "Failed to install Chromium browser",
|
|
26
|
+
"alreadyInstalled": "agent-browser is already installed (v{{version}})",
|
|
27
|
+
"notInstalled": "agent-browser is not installed",
|
|
28
|
+
"browserNotInstalled": "Chromium browser is not installed",
|
|
29
|
+
"installHint": "Run 'ccjk agent-browser' to install",
|
|
30
|
+
"browserInstallHint": "Run 'ccjk agent-browser' and select 'Install' to set up browser",
|
|
31
|
+
"updating": "Updating agent-browser from v{{from}} to v{{to}}...",
|
|
32
|
+
"updateSuccess": "Updated to v{{version}} successfully!",
|
|
33
|
+
"updateFailed": "Failed to update agent-browser",
|
|
34
|
+
"updateAvailable": "Update available: v{{version}}",
|
|
35
|
+
"upToDate": "agent-browser is up to date (v{{version}})",
|
|
36
|
+
"uninstalling": "Uninstalling agent-browser...",
|
|
37
|
+
"uninstallSuccess": "agent-browser uninstalled successfully!",
|
|
38
|
+
"uninstallFailed": "Failed to uninstall agent-browser",
|
|
39
|
+
"status": {
|
|
40
|
+
"title": "Agent Browser Status",
|
|
41
|
+
"installed": "Installed",
|
|
42
|
+
"notInstalled": "Not Installed",
|
|
43
|
+
"version": "Version",
|
|
44
|
+
"browser": "Browser",
|
|
45
|
+
"browserReady": "Ready",
|
|
46
|
+
"browserMissing": "Not installed",
|
|
47
|
+
"sessions": "Active Sessions"
|
|
48
|
+
},
|
|
49
|
+
"sessions": {
|
|
50
|
+
"title": "Browser Sessions",
|
|
51
|
+
"noSessions": "No active sessions",
|
|
52
|
+
"active": "active",
|
|
53
|
+
"closeAll": "Close all sessions",
|
|
54
|
+
"closed": "Closed {{count}} session(s)",
|
|
55
|
+
"closeFailed": "Failed to close {{count}} session(s)"
|
|
56
|
+
},
|
|
57
|
+
"quickTest": {
|
|
58
|
+
"running": "Running quick test...",
|
|
59
|
+
"opening": "Opening test page...",
|
|
60
|
+
"success": "Quick test passed! Browser automation is working.",
|
|
61
|
+
"failed": "Quick test failed"
|
|
62
|
+
},
|
|
63
|
+
"recommend": {
|
|
64
|
+
"title": "🌐 Recommended: Install Agent Browser",
|
|
65
|
+
"description": "agent-browser is a headless browser automation CLI optimized for AI agents.",
|
|
66
|
+
"features": [
|
|
67
|
+
"Fast Rust-based CLI for browser automation",
|
|
68
|
+
"Session isolation for multi-agent operations",
|
|
69
|
+
"Accessibility snapshots optimized for AI",
|
|
70
|
+
"Works with Claude Code for web tasks"
|
|
71
|
+
],
|
|
72
|
+
"prompt": "Would you like to install agent-browser?",
|
|
73
|
+
"skipHint": "You can install it later with 'ccjk agent-browser'"
|
|
74
|
+
},
|
|
75
|
+
"skill": {
|
|
76
|
+
"installed": "Agent Browser skill is ready",
|
|
77
|
+
"notInstalled": "Install agent-browser to enable browser automation skill"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
"services.spec-workflow.name": "Spec Workflow",
|
|
14
14
|
"services.serena.name": "Serena Assistant",
|
|
15
15
|
"services.serena.description": "Semantic code retrieval and editing akin to an IDE; extracts symbol-level entities and leverages relations to greatly improve token efficiency with coding agents",
|
|
16
|
-
"services.
|
|
17
|
-
"services.
|
|
18
|
-
"services.puppeteer.name": "Puppeteer Browser Automation",
|
|
19
|
-
"services.puppeteer.description": "Browser automation using Puppeteer for web scraping and testing",
|
|
16
|
+
"services.agent-browser.description": "Anthropic official browser automation for web interaction and testing",
|
|
17
|
+
"services.agent-browser.name": "Agent Browser",
|
|
20
18
|
"services.filesystem.name": "Filesystem Operations",
|
|
21
19
|
"services.filesystem.description": "Read, write, and manage files and directories on the local filesystem",
|
|
22
20
|
"services.memory.name": "Knowledge Graph Memory",
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"cometixLineNotInstalled": "CCometixLine is not installed",
|
|
13
13
|
"cometixLineUpToDate": "CCometixLine is up to date (v{version})",
|
|
14
14
|
"confirmUpdate": "Update {tool} to latest version?",
|
|
15
|
-
"installationBroken": "Installation broken (command failed),
|
|
15
|
+
"installationBroken": "Installation broken (command failed), attempting repair...",
|
|
16
|
+
"installationRepaired": "Installation repaired successfully!",
|
|
17
|
+
"symlinkFixed": "Symlink fixed",
|
|
16
18
|
"currentVersion": "Current version: v{version}",
|
|
17
19
|
"errorCheckingUpdates": "Error checking updates:",
|
|
18
20
|
"failed": "failed",
|
|
@@ -22,5 +24,6 @@
|
|
|
22
24
|
"updateSkipped": "Update skipped",
|
|
23
25
|
"updateSuccess": "{tool} updated successfully!",
|
|
24
26
|
"updateSummary": "Update Summary",
|
|
25
|
-
"updating": "Updating {tool}..."
|
|
27
|
+
"updating": "Updating {tool}...",
|
|
28
|
+
"curlReinstallRequired": "Cannot auto-update curl-installed Claude Code. Please run manually: curl -fsSL https://claude.ai/install.sh | sh"
|
|
26
29
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"menuTitle": "🌐 Agent Browser - AI 浏览器自动化",
|
|
3
|
+
"menuOptions": {
|
|
4
|
+
"install": "安装 agent-browser",
|
|
5
|
+
"status": "查看状态",
|
|
6
|
+
"update": "更新到最新版",
|
|
7
|
+
"sessions": "管理会话",
|
|
8
|
+
"quickTest": "快速测试",
|
|
9
|
+
"uninstall": "卸载",
|
|
10
|
+
"back": "返回"
|
|
11
|
+
},
|
|
12
|
+
"menuDescriptions": {
|
|
13
|
+
"install": "安装 agent-browser CLI 和 Chromium 浏览器",
|
|
14
|
+
"status": "显示安装状态和会话信息",
|
|
15
|
+
"update": "更新 agent-browser 到最新版本",
|
|
16
|
+
"sessions": "列出和管理浏览器会话",
|
|
17
|
+
"quickTest": "打开测试页面验证安装",
|
|
18
|
+
"uninstall": "从系统中移除 agent-browser"
|
|
19
|
+
},
|
|
20
|
+
"installing": "正在安装 agent-browser...",
|
|
21
|
+
"installSuccess": "agent-browser 安装成功!",
|
|
22
|
+
"installFailed": "安装 agent-browser 失败",
|
|
23
|
+
"installingBrowser": "正在安装 Chromium 浏览器...",
|
|
24
|
+
"browserInstallSuccess": "Chromium 浏览器安装成功!",
|
|
25
|
+
"browserInstallFailed": "安装 Chromium 浏览器失败",
|
|
26
|
+
"alreadyInstalled": "agent-browser 已安装 (v{{version}})",
|
|
27
|
+
"notInstalled": "agent-browser 未安装",
|
|
28
|
+
"browserNotInstalled": "Chromium 浏览器未安装",
|
|
29
|
+
"installHint": "运行 'ccjk agent-browser' 进行安装",
|
|
30
|
+
"browserInstallHint": "运行 'ccjk agent-browser' 并选择 '安装' 来设置浏览器",
|
|
31
|
+
"updating": "正在从 v{{from}} 更新到 v{{to}}...",
|
|
32
|
+
"updateSuccess": "已成功更新到 v{{version}}!",
|
|
33
|
+
"updateFailed": "更新 agent-browser 失败",
|
|
34
|
+
"updateAvailable": "有可用更新: v{{version}}",
|
|
35
|
+
"upToDate": "agent-browser 已是最新版本 (v{{version}})",
|
|
36
|
+
"uninstalling": "正在卸载 agent-browser...",
|
|
37
|
+
"uninstallSuccess": "agent-browser 卸载成功!",
|
|
38
|
+
"uninstallFailed": "卸载 agent-browser 失败",
|
|
39
|
+
"status": {
|
|
40
|
+
"title": "Agent Browser 状态",
|
|
41
|
+
"installed": "已安装",
|
|
42
|
+
"notInstalled": "未安装",
|
|
43
|
+
"version": "版本",
|
|
44
|
+
"browser": "浏览器",
|
|
45
|
+
"browserReady": "就绪",
|
|
46
|
+
"browserMissing": "未安装",
|
|
47
|
+
"sessions": "活跃会话"
|
|
48
|
+
},
|
|
49
|
+
"sessions": {
|
|
50
|
+
"title": "浏览器会话",
|
|
51
|
+
"noSessions": "没有活跃会话",
|
|
52
|
+
"active": "活跃",
|
|
53
|
+
"closeAll": "关闭所有会话",
|
|
54
|
+
"closed": "已关闭 {{count}} 个会话",
|
|
55
|
+
"closeFailed": "关闭 {{count}} 个会话失败"
|
|
56
|
+
},
|
|
57
|
+
"quickTest": {
|
|
58
|
+
"running": "正在运行快速测试...",
|
|
59
|
+
"opening": "正在打开测试页面...",
|
|
60
|
+
"success": "快速测试通过!浏览器自动化工作正常。",
|
|
61
|
+
"failed": "快速测试失败"
|
|
62
|
+
},
|
|
63
|
+
"recommend": {
|
|
64
|
+
"title": "🌐 推荐安装: Agent Browser",
|
|
65
|
+
"description": "agent-browser 是专为 AI Agent 优化的无头浏览器自动化 CLI 工具。",
|
|
66
|
+
"features": [
|
|
67
|
+
"基于 Rust 的快速浏览器自动化 CLI",
|
|
68
|
+
"会话隔离支持多 Agent 并发操作",
|
|
69
|
+
"为 AI 优化的可访问性快照",
|
|
70
|
+
"与 Claude Code 配合完成网页任务"
|
|
71
|
+
],
|
|
72
|
+
"prompt": "是否要安装 agent-browser?",
|
|
73
|
+
"skipHint": "稍后可以通过 'ccjk agent-browser' 安装"
|
|
74
|
+
},
|
|
75
|
+
"skill": {
|
|
76
|
+
"installed": "Agent Browser 技能已就绪",
|
|
77
|
+
"notInstalled": "安装 agent-browser 以启用浏览器自动化技能"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
"services.spec-workflow.name": "Spec 工作流",
|
|
14
14
|
"services.serena.name": "Serena 助手",
|
|
15
15
|
"services.serena.description": "提供类似 IDE 的语义代码检索与编辑,支持符号级实体提取与关系结构利用;与现有编码代理配合可显著提升标记效率",
|
|
16
|
-
"services.
|
|
17
|
-
"services.
|
|
18
|
-
"services.puppeteer.name": "Puppeteer 浏览器自动化",
|
|
19
|
-
"services.puppeteer.description": "使用 Puppeteer 进行浏览器自动化,支持网页抓取和测试",
|
|
16
|
+
"services.agent-browser.description": "Anthropic 官方浏览器自动化,用于网页交互和测试",
|
|
17
|
+
"services.agent-browser.name": "Agent Browser 浏览器自动化",
|
|
20
18
|
"services.filesystem.name": "文件系统操作",
|
|
21
19
|
"services.filesystem.description": "读取、写入和管理本地文件系统中的文件和目录",
|
|
22
20
|
"services.memory.name": "知识图谱记忆",
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"cometixLineNotInstalled": "CCometixLine 未安装",
|
|
13
13
|
"cometixLineUpToDate": "CCometixLine 已是最新版本 (v{version})",
|
|
14
14
|
"confirmUpdate": "将 {tool} 更新到最新版本?",
|
|
15
|
-
"installationBroken": "检测到安装损坏 (命令无法执行)
|
|
15
|
+
"installationBroken": "检测到安装损坏 (命令无法执行),正在尝试修复...",
|
|
16
|
+
"installationRepaired": "安装已成功修复!",
|
|
17
|
+
"symlinkFixed": "符号链接已修复",
|
|
16
18
|
"currentVersion": "当前版本: v{version}",
|
|
17
19
|
"errorCheckingUpdates": "检查更新时出错:",
|
|
18
20
|
"failed": "失败",
|
|
@@ -22,5 +24,6 @@
|
|
|
22
24
|
"updateSkipped": "跳过更新",
|
|
23
25
|
"updateSuccess": "{tool} 更新成功!",
|
|
24
26
|
"updateSummary": "更新摘要",
|
|
25
|
-
"updating": "正在更新 {tool}..."
|
|
27
|
+
"updating": "正在更新 {tool}...",
|
|
28
|
+
"curlReinstallRequired": "无法自动更新 curl 安装的 Claude Code。请手动运行: curl -fsSL https://claude.ai/install.sh | sh"
|
|
26
29
|
}
|