ccjk 10.1.0 → 10.3.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.
Files changed (115) hide show
  1. package/README.md +28 -0
  2. package/dist/chunks/agent-teams.mjs +1 -1
  3. package/dist/chunks/agent.mjs +1 -1
  4. package/dist/chunks/api-providers.mjs +1 -1
  5. package/dist/chunks/api.mjs +3 -3
  6. package/dist/chunks/auto-bootstrap.mjs +1 -1
  7. package/dist/chunks/auto-updater.mjs +1 -1
  8. package/dist/{shared/ccjk.Br91zBIG.mjs → chunks/banner.mjs} +52 -3
  9. package/dist/chunks/boost.mjs +2 -2
  10. package/dist/chunks/ccjk-agents.mjs +1 -1
  11. package/dist/chunks/ccjk-all.mjs +1 -1
  12. package/dist/chunks/ccjk-config.mjs +1 -1
  13. package/dist/chunks/ccjk-hooks.mjs +1 -1
  14. package/dist/chunks/ccjk-mcp.mjs +2 -2
  15. package/dist/chunks/ccjk-setup.mjs +1 -1
  16. package/dist/chunks/ccjk-skills.mjs +1 -1
  17. package/dist/chunks/ccr.mjs +11 -10
  18. package/dist/chunks/ccu.mjs +1 -1
  19. package/dist/chunks/check-updates.mjs +4 -3
  20. package/dist/chunks/claude-code-config-manager.mjs +8 -7
  21. package/dist/chunks/claude-code-incremental-manager.mjs +3 -2
  22. package/dist/chunks/claude-config.mjs +3 -3
  23. package/dist/chunks/claude-wrapper.mjs +2 -2
  24. package/dist/chunks/codex-config-switch.mjs +3 -2
  25. package/dist/chunks/codex-provider-manager.mjs +3 -2
  26. package/dist/chunks/codex-uninstaller.mjs +2 -2
  27. package/dist/chunks/codex.mjs +5 -5
  28. package/dist/chunks/commands.mjs +88 -391
  29. package/dist/chunks/commands2.mjs +391 -88
  30. package/dist/chunks/completion.mjs +1 -1
  31. package/dist/chunks/config-consolidator.mjs +2 -2
  32. package/dist/chunks/config-switch.mjs +4 -3
  33. package/dist/chunks/config.mjs +6 -98
  34. package/dist/chunks/config2.mjs +411 -400
  35. package/dist/chunks/config3.mjs +401 -410
  36. package/dist/chunks/constants.mjs +1 -1
  37. package/dist/chunks/context.mjs +283 -1
  38. package/dist/chunks/dashboard.mjs +365 -0
  39. package/dist/chunks/doctor.mjs +4 -4
  40. package/dist/chunks/features.mjs +12 -11
  41. package/dist/chunks/fs-operations.mjs +1 -1
  42. package/dist/chunks/health-alerts.mjs +304 -0
  43. package/dist/chunks/health-check.mjs +532 -0
  44. package/dist/chunks/index.mjs +10 -177
  45. package/dist/chunks/index2.mjs +168 -1162
  46. package/dist/chunks/index3.mjs +1076 -910
  47. package/dist/chunks/index4.mjs +947 -137
  48. package/dist/chunks/index5.mjs +167 -635
  49. package/dist/chunks/index6.mjs +663 -0
  50. package/dist/chunks/init.mjs +19 -19
  51. package/dist/chunks/installer.mjs +649 -147
  52. package/dist/chunks/installer2.mjs +147 -649
  53. package/dist/chunks/interview.mjs +2 -2
  54. package/dist/chunks/marketplace.mjs +1 -1
  55. package/dist/chunks/mcp.mjs +5 -4
  56. package/dist/chunks/menu.mjs +22 -9
  57. package/dist/chunks/metrics-display.mjs +152 -0
  58. package/dist/chunks/migrator.mjs +1 -1
  59. package/dist/chunks/monitor.mjs +2 -2
  60. package/dist/chunks/notification.mjs +1 -1
  61. package/dist/chunks/onboarding.mjs +2 -2
  62. package/dist/chunks/package.mjs +1 -1
  63. package/dist/chunks/permission-manager.mjs +2 -2
  64. package/dist/chunks/permissions.mjs +1 -1
  65. package/dist/chunks/persistence-manager.mjs +781 -0
  66. package/dist/chunks/persistence.mjs +667 -0
  67. package/dist/chunks/platform.mjs +1 -1
  68. package/dist/chunks/plugin.mjs +1 -1
  69. package/dist/chunks/prompts.mjs +1 -1
  70. package/dist/chunks/providers.mjs +1 -1
  71. package/dist/chunks/quick-actions.mjs +321 -0
  72. package/dist/chunks/quick-provider.mjs +2 -0
  73. package/dist/chunks/quick-setup.mjs +9 -8
  74. package/dist/chunks/silent-updater.mjs +1 -1
  75. package/dist/chunks/simple-config.mjs +3 -8
  76. package/dist/chunks/skill.mjs +1 -1
  77. package/dist/chunks/skills-sync.mjs +1 -1
  78. package/dist/chunks/skills.mjs +1 -1
  79. package/dist/chunks/slash-commands.mjs +208 -0
  80. package/dist/chunks/smart-defaults.mjs +1 -1
  81. package/dist/chunks/startup.mjs +1 -1
  82. package/dist/chunks/stats.mjs +1 -1
  83. package/dist/chunks/status.mjs +31 -2
  84. package/dist/chunks/team.mjs +1 -1
  85. package/dist/chunks/thinking.mjs +2 -2
  86. package/dist/chunks/uninstall.mjs +5 -5
  87. package/dist/chunks/update.mjs +8 -7
  88. package/dist/chunks/upgrade-manager.mjs +2 -2
  89. package/dist/chunks/version-checker.mjs +3 -3
  90. package/dist/chunks/vim.mjs +1 -1
  91. package/dist/chunks/zero-config.mjs +359 -0
  92. package/dist/cli.mjs +212 -21
  93. package/dist/i18n/locales/en/cli.json +14 -1
  94. package/dist/i18n/locales/en/common.json +27 -0
  95. package/dist/i18n/locales/en/configuration.json +33 -0
  96. package/dist/i18n/locales/en/context.json +54 -1
  97. package/dist/i18n/locales/en/dashboard.json +78 -0
  98. package/dist/i18n/locales/en/persistence.json +127 -0
  99. package/dist/i18n/locales/en/quick-actions.json +78 -0
  100. package/dist/i18n/locales/zh-CN/cli.json +14 -1
  101. package/dist/i18n/locales/zh-CN/common.json +27 -0
  102. package/dist/i18n/locales/zh-CN/configuration.json +33 -0
  103. package/dist/i18n/locales/zh-CN/context.json +54 -1
  104. package/dist/i18n/locales/zh-CN/dashboard.json +78 -0
  105. package/dist/i18n/locales/zh-CN/persistence.json +127 -0
  106. package/dist/i18n/locales/zh-CN/quick-actions.json +78 -0
  107. package/dist/index.mjs +3 -2
  108. package/dist/shared/{ccjk.DE91nClQ.mjs → ccjk.BKoi8-Hy.mjs} +1 -1
  109. package/dist/shared/ccjk.BiCrMV5O.mjs +94 -0
  110. package/dist/shared/{ccjk.Dpw86UX0.mjs → ccjk.CxtuJxaS.mjs} +1 -1
  111. package/dist/shared/{ccjk.ClzTOz9n.mjs → ccjk.DB2UYcq0.mjs} +5 -5
  112. package/dist/shared/{ccjk.CmsW23FN.mjs → ccjk.DVBW2wxp.mjs} +4 -3
  113. package/dist/shared/{ccjk.Bndhan7G.mjs → ccjk.DfwJOEok.mjs} +1 -1
  114. package/dist/shared/{ccjk.DvIrK0wz.mjs → ccjk.DrMygfCF.mjs} +1 -1
  115. package/package.json +19 -19
@@ -4,8 +4,8 @@ import { resolve, dirname, join } from 'node:path';
4
4
  import process__default from 'node:process';
5
5
  import ansis from 'ansis';
6
6
  import inquirer from 'inquirer';
7
- import { i18n } from './index.mjs';
8
- import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DvIrK0wz.mjs';
7
+ import { i18n } from './index2.mjs';
8
+ import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DrMygfCF.mjs';
9
9
  import { randomUUID } from 'node:crypto';
10
10
  import 'node:url';
11
11
  import 'i18next';
@@ -1,5 +1,5 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
2
+ import { i18n } from './index2.mjs';
3
3
  import { createHash } from 'node:crypto';
4
4
  import { existsSync, createWriteStream } from 'node:fs';
5
5
  import { readFile, mkdir, rm } from 'node:fs/promises';
@@ -1,12 +1,12 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
2
+ import { i18n } from './index2.mjs';
3
3
  import 'node:child_process';
4
4
  import 'node:process';
5
5
  import { M as MCP_SERVICE_TIERS, i as isCoreService, g as getServicesByTier, c as checkMcpPerformance, f as formatPerformanceWarning, a as calculateResourceUsage, b as getOptimizationSuggestions, d as getMcpTierConfig } from './mcp-performance.mjs';
6
6
  import { r as readMcpConfig, b as backupMcpConfig, w as writeMcpConfig } from './claude-config.mjs';
7
7
  import inquirer from 'inquirer';
8
8
  import { M as MCP_SERVICE_CONFIGS } from './codex.mjs';
9
- import { d as displayInstalledMcpServices, i as isMcpServiceInstalled, a as installMcpService, u as uninstallMcpService } from '../shared/ccjk.ClzTOz9n.mjs';
9
+ import { d as displayInstalledMcpServices, a as isMcpServiceInstalled, b as installMcpService, u as uninstallMcpService } from '../shared/ccjk.DB2UYcq0.mjs';
10
10
  import { existsSync, unlinkSync, statSync, mkdirSync, readFileSync } from 'node:fs';
11
11
  import { homedir } from 'node:os';
12
12
  import { join } from 'pathe';
@@ -17,6 +17,8 @@ import 'i18next-fs-backend';
17
17
  import './constants.mjs';
18
18
  import './json-config.mjs';
19
19
  import 'dayjs';
20
+ import 'node:crypto';
21
+ import 'node:fs/promises';
20
22
  import './platform.mjs';
21
23
  import 'tinyexec';
22
24
  import 'ora';
@@ -24,13 +26,12 @@ import 'semver';
24
26
  import 'smol-toml';
25
27
  import './ccjk-config.mjs';
26
28
  import './config.mjs';
29
+ import '../shared/ccjk.BiCrMV5O.mjs';
27
30
  import '../shared/ccjk.BFQ7yr5S.mjs';
28
31
  import './prompts.mjs';
29
32
  import './package.mjs';
30
33
  import '../shared/ccjk.DHbrGcgg.mjs';
31
34
  import 'inquirer-toggle';
32
- import 'node:crypto';
33
- import 'node:fs/promises';
34
35
 
35
36
  function getReleasableServices(configuredServices, tier) {
36
37
  return configuredServices.filter((serviceId) => {
@@ -5,17 +5,17 @@ import inquirer from 'inquirer';
5
5
  import { join } from 'pathe';
6
6
  import { M as MCP_SERVICE_CONFIGS } from './codex.mjs';
7
7
  import { CODE_TOOL_BANNERS, CLAUDE_DIR, isCodeToolType, DEFAULT_CODE_TOOL_TYPE } from './constants.mjs';
8
- import { ensureI18nInitialized, i18n } from './index.mjs';
9
- import { d as displayBannerWithInfo } from '../shared/ccjk.Br91zBIG.mjs';
8
+ import { ensureI18nInitialized, i18n } from './index2.mjs';
9
+ import { displayBannerWithInfo } from './banner.mjs';
10
10
  import { updateZcfConfig, readZcfConfig } from './ccjk-config.mjs';
11
11
  import { r as readMcpConfig } from './claude-config.mjs';
12
- import { r as resolveCodeType } from '../shared/ccjk.Dpw86UX0.mjs';
13
- import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DvIrK0wz.mjs';
12
+ import { r as resolveCodeType } from '../shared/ccjk.CxtuJxaS.mjs';
13
+ import { h as handleExitPromptError, a as handleGeneralError } from '../shared/ccjk.DrMygfCF.mjs';
14
14
  import { changeScriptLanguageFeature, configureMcpFeature, configureEnvPermissionFeature, configureAiMemoryFeature, configureDefaultModelFeature, configureApiFeature } from './features.mjs';
15
15
  import { p as promptBoolean } from '../shared/ccjk.DHbrGcgg.mjs';
16
16
  import { homedir } from 'node:os';
17
- import { runCcrStop, runCcrStart, runCcrRestart, runCcrStatus, runCcrUi } from './commands2.mjs';
18
- import { readCcrConfig, configureCcrFeature } from './config3.mjs';
17
+ import { runCcrStop, runCcrStart, runCcrRestart, runCcrStatus, runCcrUi } from './commands.mjs';
18
+ import { readCcrConfig, configureCcrFeature } from './config2.mjs';
19
19
  import { a as isCcrInstalled, b as installCcr, i as init } from './init.mjs';
20
20
  import { ccjkAgents } from './ccjk-agents.mjs';
21
21
  import { ccjkSkills } from './ccjk-skills.mjs';
@@ -363,11 +363,13 @@ async function showSimplifiedMenu() {
363
363
  console.log(` ${ansis.green("5.")} ${isZh ? "\u914D\u7F6E\u9ED8\u8BA4\u6A21\u578B" : "Configure Default Model"} ${ansis.dim(isZh ? "- \u8BBE\u7F6E\u9ED8\u8BA4\u6A21\u578B\uFF08opus/sonnet/sonnet 1m/\u81EA\u5B9A\u4E49\uFF09" : "- Set default model (opus/sonnet/sonnet 1m/custom)")}`);
364
364
  console.log(` ${ansis.green("6.")} ${isZh ? "\u914D\u7F6E Claude \u5168\u5C40\u8BB0\u5FC6" : "Configure Claude Memory"} ${ansis.dim(isZh ? "- \u914D\u7F6E AI \u8F93\u51FA\u8BED\u8A00\u548C\u8F93\u51FA\u98CE\u683C" : "- Configure AI output language and style")}`);
365
365
  console.log(` ${ansis.green("7.")} ${isZh ? "\u5BFC\u5165\u63A8\u8350\u73AF\u5883\u53D8\u91CF\u548C\u6743\u9650\u914D\u7F6E" : "Import Recommended Env & Permissions"} ${ansis.dim(isZh ? "- \u5BFC\u5165\u9690\u79C1\u4FDD\u62A4\u73AF\u5883\u53D8\u91CF\u548C\u7CFB\u7EDF\u6743\u9650\u914D\u7F6E" : "- Import privacy env vars and system permissions")}`);
366
+ console.log(` ${ansis.green("8.")} ${isZh ? "\u96F6\u914D\u7F6E\u6743\u9650\u9884\u8BBE" : "Zero-Config Permission Presets"} ${ansis.dim(isZh ? "- \u4E00\u952E\u5E94\u7528\u6743\u9650\u9884\u8BBE\uFF08\u6700\u5927/\u5F00\u53D1\u8005/\u5B89\u5168\uFF09" : "- One-click permission presets (max/dev/safe)")}`);
366
367
  console.log("");
367
368
  console.log(ansis.dim(` --------- ${isZh ? "\u5176\u4ED6\u5DE5\u5177" : "Other Tools"} ----------`));
368
369
  console.log(` ${ansis.green("K.")} ${isZh ? "Skills \u7BA1\u7406" : "Skills Manager"} ${ansis.dim(isZh ? "- \u5B89\u88C5/\u66F4\u65B0/\u5220\u9664\u5DE5\u4F5C\u6D41\u6280\u80FD" : "- Install/update/remove workflow skills")}`);
369
370
  console.log(` ${ansis.green("M.")} ${isZh ? "MCP \u7BA1\u7406" : "MCP Manager"} ${ansis.dim(isZh ? "- \u914D\u7F6E Model Context Protocol \u670D\u52A1" : "- Configure MCP services")}`);
370
371
  console.log(` ${ansis.green("A.")} ${isZh ? "Agents \u7BA1\u7406" : "Agents Manager"} ${ansis.dim(isZh ? "- \u521B\u5EFA/\u7BA1\u7406 AI \u667A\u80FD\u4F53" : "- Create/manage AI agents")}`);
372
+ console.log(` ${ansis.green("P.")} ${isZh ? "\u6301\u4E45\u5316\u7BA1\u7406" : "Persistence Manager"} ${ansis.dim(isZh ? "- \u7BA1\u7406\u4E0A\u4E0B\u6587\u5B58\u50A8\u548C\u5C42\u7EA7" : "- Manage context storage and tiers")}`);
371
373
  console.log(` ${ansis.green("R.")} ${isZh ? "CCR" : "CCR"} ${ansis.dim(isZh ? "- \u914D\u7F6E Claude Code Router \u4EE5\u4F7F\u7528\u591A\u4E2A AI \u6A21\u578B" : "- Configure Claude Code Router for multiple AI models")}`);
372
374
  console.log("");
373
375
  console.log(ansis.dim(` ------------ CCJK ------------`));
@@ -386,7 +388,7 @@ async function showSimplifiedMenu() {
386
388
  message: isZh ? "\u8BF7\u8F93\u5165\u9009\u9879:" : "Enter option:",
387
389
  validate: (value) => {
388
390
  const normalized2 = normalizeMenuInput(value);
389
- const valid = ["0", "1", "2", "3", "4", "5", "6", "7", "k", "m", "a", "r", "b", "s", "-", "+", "d", "h", "q"];
391
+ const valid = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "k", "m", "a", "p", "r", "b", "s", "-", "+", "d", "h", "q"];
390
392
  return valid.includes(normalized2) || (isZh ? "\u8BF7\u8F93\u5165\u6709\u6548\u9009\u9879" : "Please enter a valid option");
391
393
  }
392
394
  });
@@ -425,6 +427,11 @@ async function showSimplifiedMenu() {
425
427
  await configureEnvPermissionFeature();
426
428
  break;
427
429
  }
430
+ case "8": {
431
+ const { zeroConfig } = await import('./zero-config.mjs');
432
+ await zeroConfig();
433
+ break;
434
+ }
428
435
  // --------- 其他工具 ----------
429
436
  case "k": {
430
437
  await ccjkSkills({});
@@ -438,14 +445,20 @@ async function showSimplifiedMenu() {
438
445
  await ccjkAgents({});
439
446
  break;
440
447
  }
448
+ case "p": {
449
+ const { persistenceManager } = await import('./persistence-manager.mjs');
450
+ await persistenceManager();
451
+ printSeparator();
452
+ return void 0;
453
+ }
441
454
  case "r": {
442
455
  await runCcrMenuFeature();
443
456
  printSeparator();
444
457
  return void 0;
445
458
  }
446
459
  case "b": {
447
- const { statusCommand } = await import('./status.mjs');
448
- await statusCommand();
460
+ const { dashboardCommand } = await import('./dashboard.mjs');
461
+ await dashboardCommand();
449
462
  await inquirer.prompt({ type: "input", name: "_", message: isZh ? "\u6309\u56DE\u8F66\u8FD4\u56DE\u83DC\u5355..." : "Press Enter to return..." });
450
463
  return void 0;
451
464
  }
@@ -0,0 +1,152 @@
1
+ import ansis from 'ansis';
2
+
3
+ function formatTokenCount(tokens) {
4
+ if (tokens >= 1e6) {
5
+ return `${(tokens / 1e6).toFixed(1)}M`;
6
+ }
7
+ if (tokens >= 1e3) {
8
+ return `${(tokens / 1e3).toFixed(1)}K`;
9
+ }
10
+ return tokens.toString();
11
+ }
12
+ function formatCost(cost) {
13
+ if (cost >= 1) {
14
+ return `$${cost.toFixed(2)}`;
15
+ }
16
+ if (cost >= 0.01) {
17
+ return `$${cost.toFixed(3)}`;
18
+ }
19
+ return `$${cost.toFixed(4)}`;
20
+ }
21
+ function formatRatio(ratio) {
22
+ return `${Math.round(ratio * 100)}%`;
23
+ }
24
+ function formatTime(ms) {
25
+ if (ms >= 1e3) {
26
+ return `${(ms / 1e3).toFixed(2)}s`;
27
+ }
28
+ return `${Math.round(ms)}ms`;
29
+ }
30
+ function displayCompressionResult(originalTokens, compressedTokens, compressionRatio, timeTakenMs) {
31
+ const reductionPercent = Math.round(compressionRatio * 100);
32
+ const originalFormatted = formatTokenCount(originalTokens);
33
+ const compressedFormatted = formatTokenCount(compressedTokens);
34
+ console.log(
35
+ ansis.green("\u2705") + " Compressed " + ansis.cyan(originalFormatted) + " tokens \u2192 " + ansis.cyan(compressedFormatted) + " " + ansis.yellow(`(${reductionPercent}% reduction)`) + " " + ansis.gray(`[${formatTime(timeTakenMs)}]`)
36
+ );
37
+ }
38
+ function displayCompressionStats(stats) {
39
+ console.log();
40
+ console.log(ansis.cyan.bold("\u{1F4CA} Compression Statistics"));
41
+ console.log(ansis.gray("\u2500".repeat(60)));
42
+ console.log();
43
+ console.log(ansis.white.bold("Overall:"));
44
+ console.log(` ${ansis.gray("Total Compressions:")} ${ansis.white(stats.totalCompressions.toLocaleString())}`);
45
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.totalTokensSaved))}`);
46
+ console.log(` ${ansis.gray("Avg Compression:")} ${ansis.yellow(formatRatio(stats.averageCompressionRatio))}`);
47
+ console.log(` ${ansis.gray("Avg Time:")} ${ansis.cyan(formatTime(stats.averageTimeTakenMs))}`);
48
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green.bold(formatCost(stats.estimatedCostSavings))}`);
49
+ if (stats.sessionStats && stats.sessionStats.compressions > 0) {
50
+ console.log();
51
+ console.log(ansis.white.bold("Session (24h):"));
52
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.sessionStats.compressions.toLocaleString())}`);
53
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.sessionStats.tokensSaved))}`);
54
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.sessionStats.costSavings))}`);
55
+ }
56
+ if (stats.weeklyStats && stats.weeklyStats.compressions > 0) {
57
+ console.log();
58
+ console.log(ansis.white.bold("Weekly (7d):"));
59
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.weeklyStats.compressions.toLocaleString())}`);
60
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.weeklyStats.tokensSaved))}`);
61
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.weeklyStats.costSavings))}`);
62
+ }
63
+ if (stats.monthlyStats && stats.monthlyStats.compressions > 0) {
64
+ console.log();
65
+ console.log(ansis.white.bold("Monthly (30d):"));
66
+ console.log(` ${ansis.gray("Compressions:")} ${ansis.white(stats.monthlyStats.compressions.toLocaleString())}`);
67
+ console.log(` ${ansis.gray("Tokens Saved:")} ${ansis.green(formatTokenCount(stats.monthlyStats.tokensSaved))}`);
68
+ console.log(` ${ansis.gray("Cost Savings:")} ${ansis.green(formatCost(stats.monthlyStats.costSavings))}`);
69
+ }
70
+ console.log();
71
+ console.log(ansis.gray("\u2500".repeat(60)));
72
+ console.log(ansis.gray("\u{1F4A1} Cost based on $0.015 per 1K tokens (Claude Opus pricing)"));
73
+ console.log();
74
+ }
75
+ function displayCompactCompressionStats(stats) {
76
+ const lines = [];
77
+ lines.push(ansis.cyan.bold("Compression Metrics"));
78
+ lines.push(` ${ansis.gray("Total Saved:")} ${ansis.green(formatTokenCount(stats.totalTokensSaved))} tokens`);
79
+ lines.push(` ${ansis.gray("Avg Reduction:")} ${ansis.yellow(formatRatio(stats.averageCompressionRatio))}`);
80
+ lines.push(` ${ansis.gray("Cost Savings:")} ${ansis.green.bold(formatCost(stats.estimatedCostSavings))}`);
81
+ if (stats.sessionStats && stats.sessionStats.compressions > 0) {
82
+ lines.push(` ${ansis.gray("Session (24h):")} ${ansis.white(stats.sessionStats.compressions)} compressions, ${ansis.green(formatCost(stats.sessionStats.costSavings))} saved`);
83
+ }
84
+ return lines;
85
+ }
86
+ function createCompressionBar(ratio, width = 20) {
87
+ const filled = Math.round(ratio * width);
88
+ const empty = width - filled;
89
+ let bar = "";
90
+ if (ratio >= 0.7) {
91
+ bar = ansis.green("\u2588".repeat(filled));
92
+ } else if (ratio >= 0.4) {
93
+ bar = ansis.yellow("\u2588".repeat(filled));
94
+ } else {
95
+ bar = ansis.red("\u2588".repeat(filled));
96
+ }
97
+ bar += ansis.gray("\u2591".repeat(empty));
98
+ return bar;
99
+ }
100
+ function displayCompressionTable(metrics, limit = 10) {
101
+ if (metrics.length === 0) {
102
+ console.log(ansis.gray("No compression metrics available"));
103
+ return;
104
+ }
105
+ console.log();
106
+ console.log(ansis.cyan.bold("Recent Compressions"));
107
+ console.log(ansis.gray("\u2500".repeat(80)));
108
+ console.log(
109
+ ansis.white.bold("Original".padEnd(12)) + ansis.white.bold("Compressed".padEnd(12)) + ansis.white.bold("Ratio".padEnd(10)) + ansis.white.bold("Time".padEnd(10)) + ansis.white.bold("Strategy".padEnd(15)) + ansis.white.bold("Algorithm")
110
+ );
111
+ console.log(ansis.gray("\u2500".repeat(80)));
112
+ const displayMetrics = metrics.slice(0, limit);
113
+ for (const metric of displayMetrics) {
114
+ const original = formatTokenCount(metric.originalTokens).padEnd(12);
115
+ const compressed = formatTokenCount(metric.compressedTokens).padEnd(12);
116
+ const ratio = formatRatio(metric.compressionRatio).padEnd(10);
117
+ const time = formatTime(metric.timeTakenMs).padEnd(10);
118
+ const strategy = metric.strategy.padEnd(15);
119
+ const algorithm = metric.algorithm;
120
+ console.log(
121
+ ansis.cyan(original) + ansis.green(compressed) + ansis.yellow(ratio) + ansis.gray(time) + ansis.white(strategy) + ansis.gray(algorithm)
122
+ );
123
+ }
124
+ console.log(ansis.gray("\u2500".repeat(80)));
125
+ console.log();
126
+ }
127
+ function formatBytes(bytes) {
128
+ if (bytes >= 1073741824) {
129
+ return `${(bytes / 1073741824).toFixed(2)} GB`;
130
+ }
131
+ if (bytes >= 1048576) {
132
+ return `${(bytes / 1048576).toFixed(2)} MB`;
133
+ }
134
+ if (bytes >= 1024) {
135
+ return `${(bytes / 1024).toFixed(2)} KB`;
136
+ }
137
+ return `${bytes} bytes`;
138
+ }
139
+ const MetricsDisplay = {
140
+ displayCompressionResult,
141
+ displayCompressionStats,
142
+ displayCompactCompressionStats,
143
+ displayCompressionTable,
144
+ createCompressionBar,
145
+ formatTokenCount,
146
+ formatCost,
147
+ formatRatio,
148
+ formatTime,
149
+ formatBytes
150
+ };
151
+
152
+ export { MetricsDisplay, createCompressionBar, displayCompactCompressionStats, displayCompressionResult, displayCompressionStats, displayCompressionTable };
@@ -3,7 +3,7 @@ import { exists } from './fs-operations.mjs';
3
3
  import { readJsonConfig, writeJsonConfig } from './json-config.mjs';
4
4
  import 'node:os';
5
5
  import 'pathe';
6
- import './index.mjs';
6
+ import './index2.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:process';
9
9
  import 'node:url';
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
- import { i18n } from './index.mjs';
3
- import { d as displayBannerWithInfo } from '../shared/ccjk.Br91zBIG.mjs';
2
+ import { i18n } from './index2.mjs';
3
+ import { displayBannerWithInfo } from './banner.mjs';
4
4
  import process__default from 'node:process';
5
5
  import { nanoid } from 'nanoid';
6
6
  import 'node:fs';
@@ -1,6 +1,6 @@
1
1
  import ansis from 'ansis';
2
2
  import inquirer from 'inquirer';
3
- import { i18n } from './index.mjs';
3
+ import { i18n } from './index2.mjs';
4
4
  import * as nodeFs from 'node:fs';
5
5
  import nodeFs__default, { existsSync, readFileSync, mkdirSync, unlinkSync } from 'node:fs';
6
6
  import * as os from 'node:os';
@@ -7,10 +7,10 @@ import ora from 'ora';
7
7
  import { join, basename } from 'pathe';
8
8
  import { CCJK_CONFIG_DIR } from './constants.mjs';
9
9
  import { d as detectProject, g as getProjectSummary, a as generateSuggestions } from '../shared/ccjk.CBhIZiPz.mjs';
10
- import { b as boxify, t as theme, S as STATUS } from '../shared/ccjk.Br91zBIG.mjs';
10
+ import { boxify, COLORS as theme, STATUS } from './banner.mjs';
11
11
  import { writeFileAtomic } from './fs-operations.mjs';
12
12
  import 'node:os';
13
- import './index.mjs';
13
+ import './index2.mjs';
14
14
  import 'node:url';
15
15
  import 'i18next';
16
16
  import 'i18next-fs-backend';
@@ -1,4 +1,4 @@
1
- const version = "10.1.0";
1
+ const version = "10.3.0";
2
2
  const homepage = "https://github.com/miounet11/ccjk";
3
3
 
4
4
  export { homepage, version };
@@ -2,9 +2,9 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import ansis from 'ansis';
3
3
  import { join } from 'pathe';
4
4
  import { SETTINGS_FILE, CCJK_CONFIG_DIR } from './constants.mjs';
5
- import { S as STATUS } from '../shared/ccjk.Br91zBIG.mjs';
5
+ import { STATUS } from './banner.mjs';
6
6
  import 'node:os';
7
- import './index.mjs';
7
+ import './index2.mjs';
8
8
  import 'node:process';
9
9
  import 'node:url';
10
10
  import 'i18next';
@@ -2,7 +2,7 @@ import process__default from 'node:process';
2
2
  import ansis from 'ansis';
3
3
  import inquirer from 'inquirer';
4
4
  import 'tinyexec';
5
- import { i18n } from './index.mjs';
5
+ import { i18n } from './index2.mjs';
6
6
  import { g as getPermissionManager } from '../shared/ccjk.h7_W-wTs.mjs';
7
7
  import 'node:fs';
8
8
  import 'node:url';