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.
Files changed (65) hide show
  1. package/dist/chunks/auto-updater.mjs +37 -3
  2. package/dist/chunks/ccjk-config.mjs +77 -13
  3. package/dist/chunks/ccr.mjs +8 -11
  4. package/dist/chunks/ccu.mjs +4 -4
  5. package/dist/chunks/check-updates.mjs +5 -8
  6. package/dist/chunks/claude-code-config-manager.mjs +8 -11
  7. package/dist/chunks/claude-code-incremental-manager.mjs +4 -7
  8. package/dist/chunks/codex.mjs +496 -17
  9. package/dist/chunks/commands.mjs +392 -89
  10. package/dist/chunks/commands2.mjs +109 -0
  11. package/dist/chunks/config-consolidator.mjs +2 -2
  12. package/dist/chunks/config-switch.mjs +5 -8
  13. package/dist/chunks/doctor.mjs +6 -6
  14. package/dist/chunks/features.mjs +654 -35
  15. package/dist/chunks/help.mjs +339 -0
  16. package/dist/chunks/index.mjs +323 -10
  17. package/dist/chunks/index2.mjs +3 -3
  18. package/dist/chunks/index3.mjs +1171 -0
  19. package/dist/chunks/init.mjs +22 -25
  20. package/dist/chunks/installer.mjs +178 -0
  21. package/dist/chunks/interview.mjs +6 -6
  22. package/dist/chunks/mcp-performance.mjs +82 -2
  23. package/dist/chunks/mcp.mjs +500 -0
  24. package/dist/chunks/menu.mjs +10 -10
  25. package/dist/chunks/notification.mjs +5 -5
  26. package/dist/chunks/onboarding.mjs +6 -6
  27. package/dist/chunks/package.mjs +1 -1
  28. package/dist/chunks/platform.mjs +10 -10
  29. package/dist/chunks/prompts.mjs +7 -8
  30. package/dist/chunks/session.mjs +2 -2
  31. package/dist/chunks/skills-sync.mjs +2 -2
  32. package/dist/chunks/uninstall.mjs +4 -5
  33. package/dist/chunks/update.mjs +5 -8
  34. package/dist/chunks/upgrade-manager.mjs +2 -2
  35. package/dist/{shared/ccjk.Cy-RH2qV.mjs → chunks/version-checker.mjs} +373 -30
  36. package/dist/cli.mjs +293 -53
  37. package/dist/i18n/locales/en/agentBrowser.json +79 -0
  38. package/dist/i18n/locales/en/mcp.json +2 -4
  39. package/dist/i18n/locales/en/updater.json +5 -2
  40. package/dist/i18n/locales/zh/agentBrowser.json +79 -0
  41. package/dist/i18n/locales/zh-CN/common.json +1 -1
  42. package/dist/i18n/locales/zh-CN/mcp.json +2 -4
  43. package/dist/i18n/locales/zh-CN/updater.json +5 -2
  44. package/dist/index.d.mts +8 -584
  45. package/dist/index.d.ts +8 -584
  46. package/dist/index.mjs +10 -14
  47. package/dist/shared/{ccjk.DJM5aVQJ.mjs → ccjk.ByTIGCUC.mjs} +3 -3
  48. package/dist/shared/{ccjk.qYAnUMuy.mjs → ccjk.CGTmRqsu.mjs} +2 -3
  49. package/dist/shared/{ccjk.CUdzQluX.mjs → ccjk.CURU8gbR.mjs} +1 -1
  50. package/dist/{chunks/mcp-market.mjs → shared/ccjk.D-RZS4E2.mjs} +6 -65
  51. package/dist/shared/{ccjk.B7169qud.mjs → ccjk.tB4-Y4Qb.mjs} +3 -3
  52. package/package.json +4 -1
  53. package/templates/common/skills/en/agent-browser.md +258 -0
  54. package/templates/common/skills/zh-CN/agent-browser.md +260 -0
  55. package/dist/chunks/claude-config.mjs +0 -228
  56. package/dist/chunks/features2.mjs +0 -661
  57. package/dist/chunks/json-config.mjs +0 -59
  58. package/dist/chunks/mcp-doctor.mjs +0 -160
  59. package/dist/chunks/mcp-profile.mjs +0 -220
  60. package/dist/chunks/mcp-release.mjs +0 -138
  61. package/dist/chunks/shencha.mjs +0 -320
  62. package/dist/chunks/tools.mjs +0 -169
  63. package/dist/shared/ccjk.COdsoe-Y.mjs +0 -64
  64. package/dist/shared/ccjk.DwDtZ5cK.mjs +0 -266
  65. 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 process from 'node:process';
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 === "profile") {
87
- const { mcpProfile } = await import('./chunks/mcp-profile.mjs');
88
- await mcpProfile(argsArr[0] || "list", argsArr.slice(1), options);
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-doctor.mjs');
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-release.mjs');
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 { mcpMarket } = await import('./chunks/mcp-market.mjs');
97
- await mcpMarket(actionStr, argsArr, options);
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
- // ==================== Deprecated Commands ====================
380
+ // ==================== Postmortem System ====================
310
381
  {
311
- name: "shencha <action>",
312
- description: '[DEPRECATED] Use "ccjk doctor" instead',
313
- tier: "deprecated",
314
- deprecationMessage: '\u26A0\uFE0F shencha \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 "ccjk doctor" \u66FF\u4EE3',
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
- const { shenchaScan, shenchaReport, shenchaFix } = await import('./chunks/shencha.mjs');
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
- if (actionStr === "scan")
321
- await shenchaScan(options);
322
- else if (actionStr === "report")
323
- await shenchaReport(options);
324
- else if (actionStr === "fix")
325
- await shenchaFix(options);
326
- };
327
- }
328
- },
329
- {
330
- name: "features",
331
- description: '[DEPRECATED] Use "ccjk" menu instead',
332
- tier: "deprecated",
333
- deprecationMessage: '\u26A0\uFE0F features \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 "ccjk" \u4E3B\u83DC\u5355\u66FF\u4EE3',
334
- loader: async () => {
335
- const { showFeatures } = await import('./chunks/features.mjs');
336
- return async () => {
337
- console.warn('\n\u26A0\uFE0F features \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u5C06\u5728\u4E0B\u4E2A\u7248\u672C\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 "ccjk" \u4E3B\u83DC\u5355\u66FF\u4EE3\u3002\n');
338
- await showFeatures();
339
- };
340
- }
341
- },
342
- {
343
- name: "tools [action] [target]",
344
- description: '[DEPRECATED] Use "ccjk" menu instead',
345
- tier: "deprecated",
346
- deprecationMessage: '\u26A0\uFE0F tools \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u4F7F\u7528 "ccjk" \u4E3B\u83DC\u5355\u66FF\u4EE3',
347
- loader: async () => {
348
- const { toolsCommand } = await import('./chunks/tools.mjs');
349
- return async (options, action, target) => {
350
- console.warn('\n\u26A0\uFE0F tools \u547D\u4EE4\u5DF2\u5E9F\u5F03\uFF0C\u5C06\u5728\u4E0B\u4E2A\u7248\u672C\u79FB\u9664\u3002\u8BF7\u4F7F\u7528 "ccjk" \u4E3B\u83DC\u5355\u66FF\u4EE3\u3002\n');
351
- await toolsCommand(action || "list", target, options);
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 = process.env.CCJK_LANG;
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 = process.env.CCJK_LANG;
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.playwright.description": "Direct browser control for automation",
17
- "services.playwright.name": "Playwright Browser Control",
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), reinstalling...",
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
+ }
@@ -8,7 +8,7 @@
8
8
  "none": "无",
9
9
  "enterChoice": "请输入选项,回车确认(不区分大小写)",
10
10
  "invalidChoice": "无效选择。请输入有效选项。",
11
- "goodbye": "👋 感谢使用 JinKu!再见!",
11
+ "goodbye": "👋 感谢使用 CCJK!再见!",
12
12
  "returnToMenu": "返回主菜单?",
13
13
  "back": "返回",
14
14
  "operationFailed": "操作失败",
@@ -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.playwright.description": "直接控制浏览器进行自动化操作",
17
- "services.playwright.name": "Playwright 浏览器控制",
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
  }