ccjk 16.0.1 → 16.0.3

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 (38) hide show
  1. package/dist/chunks/claude-code-config-manager.mjs +18 -14
  2. package/dist/chunks/claude-code-incremental-manager.mjs +5 -3
  3. package/dist/chunks/codex-config-switch.mjs +4 -4
  4. package/dist/chunks/codex-provider-manager.mjs +5 -5
  5. package/dist/chunks/codex-uninstaller.mjs +3 -3
  6. package/dist/chunks/commands.mjs +2 -2
  7. package/dist/chunks/features.mjs +43 -31
  8. package/dist/chunks/simple-config.mjs +818 -582
  9. package/dist/cli.mjs +426 -20
  10. package/dist/i18n/locales/en/cli.json +1 -1
  11. package/dist/i18n/locales/en/common.json +1 -1
  12. package/dist/i18n/locales/en/configuration.json +17 -17
  13. package/dist/i18n/locales/en/installation.json +4 -0
  14. package/dist/i18n/locales/en/menu.json +26 -1
  15. package/dist/i18n/locales/en/multi-config.json +1 -1
  16. package/dist/i18n/locales/zh-CN/cli.json +1 -1
  17. package/dist/i18n/locales/zh-CN/common.json +1 -1
  18. package/dist/i18n/locales/zh-CN/configuration.json +17 -17
  19. package/dist/i18n/locales/zh-CN/installation.json +4 -0
  20. package/dist/i18n/locales/zh-CN/menu.json +26 -1
  21. package/dist/i18n/locales/zh-CN/multi-config.json +1 -1
  22. package/dist/index.d.mts +27 -23
  23. package/dist/index.d.ts +27 -23
  24. package/dist/index.mjs +2 -2
  25. package/dist/shared/ccjk.BSLlI-JL.mjs +7 -0
  26. package/package.json +3 -1
  27. package/templates/common/output-styles/en/carmack-mode.md +367 -0
  28. package/templates/common/output-styles/en/dhh-mode.md +251 -0
  29. package/templates/common/output-styles/en/evan-you-mode.md +525 -0
  30. package/templates/common/output-styles/en/jobs-mode.md +355 -0
  31. package/templates/common/output-styles/en/linus-mode.md +121 -0
  32. package/templates/common/output-styles/en/uncle-bob-mode.md +207 -0
  33. package/templates/common/output-styles/zh-CN/carmack-mode.md +367 -0
  34. package/templates/common/output-styles/zh-CN/dhh-mode.md +251 -0
  35. package/templates/common/output-styles/zh-CN/evan-you-mode.md +525 -0
  36. package/templates/common/output-styles/zh-CN/jobs-mode.md +355 -0
  37. package/templates/common/output-styles/zh-CN/linus-mode.md +121 -0
  38. package/templates/common/output-styles/zh-CN/uncle-bob-mode.md +207 -0
package/dist/cli.mjs CHANGED
@@ -1,29 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import cac from 'cac';
3
3
  import ansis from 'ansis';
4
- import { an as ensureI18nInitialized, ao as i18n, aQ as readCcrConfig, aL as isCcrInstalled, aM as installCcr, aR as configureCcrFeature, ar as promptBoolean, aS as handleExitPromptError, aT as handleGeneralError, aU as COMETIX_COMMAND_NAME, aV as COMETIX_COMMANDS, aW as installCometixLine, ap as addNumbersToChoices, aX as checkAndUpdateTools, aY as runCodexUpdate, aZ as resolveCodeType$1, aw as readJsonConfig, a_ as writeJsonConfig, c as CCJK_CONFIG_FILE, aG as readCcjkConfig, D as DEFAULT_CODE_TOOL_TYPE, $ as isCodeToolType, a$ as displayBanner, aE as updateCcjkConfig, b0 as version, b1 as resolveAiOutputLanguage, b2 as updatePromptOnly, b3 as selectAndInstallWorkflows, b4 as checkClaudeCodeVersionAndPrompt, ac as resolveCodeToolType$1, h as CLAVUE_SETTINGS_FILE, ag as settingsFileForTool, b5 as displayBannerWithInfo, o as CODE_TOOL_BANNERS, b6 as runCodexUninstall, b7 as configureCodexMcp, b8 as configureCodexApi, b9 as runCodexWorkflowImportWithLanguageSelection, ba as runCodexFullInit, X as init, bb as switchCodexProvider, bc as listCodexProviders, aB as readCodexConfig, bd as switchToOfficialLogin, be as switchToProvider, bf as readCcjkConfigAsync, bg as initI18n, bh as selectScriptLanguage, aF as changeLanguage } from './chunks/simple-config.mjs';
5
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { aq as ensureI18nInitialized, as as i18n, aX as readCcrConfig, aS as isCcrInstalled, aT as installCcr, aY as configureCcrFeature, av as promptBoolean, aZ as handleExitPromptError, a_ as handleGeneralError, a$ as COMETIX_COMMAND_NAME, b0 as COMETIX_COMMANDS, b1 as installCometixLine, at as addNumbersToChoices, b2 as checkAndUpdateTools, b3 as runCodexUpdate, b4 as resolveCodeType$1, aB as readJsonConfig, b5 as writeJsonConfig, c as CCJK_CONFIG_FILE, aM as readCcjkConfig, D as DEFAULT_CODE_TOOL_TYPE, a2 as isCodeToolType, b6 as displayBanner, aK as updateCcjkConfig, b7 as version, b8 as resolveAiOutputLanguage, aO as isClaudeFamilyCodeTool, b9 as updatePromptOnly, ba as selectAndInstallWorkflows, bb as checkClaudeCodeVersionAndPrompt, af as resolveCodeToolType$1, v as activeSettingsFile, C as CCJK_CONFIG_DIR, aL as changeLanguage, u as SUPPORTED_LANGS, L as LANG_LABELS, bc as STARTUP_CODE_TOOL_CHOICES, bd as displayBannerWithInfo, q as CODE_TOOL_BANNERS, _ as init, be as runCodexUninstall, bf as configureCodexMcp, bg as configureCodexApi, bh as runCodexWorkflowImportWithLanguageSelection, bi as runCodexFullInit, bj as switchCodexProvider, bk as listCodexProviders, aH as readCodexConfig, bl as switchToOfficialLogin, bm as switchToProvider, bn as readCcjkConfigAsync, bo as initI18n, bp as selectScriptLanguage } from './chunks/simple-config.mjs';
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
6
  import { homedir } from 'node:os';
7
7
  import inquirer from 'inquirer';
8
8
  import { join } from 'pathe';
9
9
  import { runCcrStop, runCcrStart, runCcrRestart, runCcrStatus, runCcrUi } from './chunks/commands.mjs';
10
- import { changeScriptLanguageFeature, configureCodexAiMemoryFeature, configureCodexDefaultModelFeature, configureEnvPermissionFeature, configureAiMemoryFeature, configureDefaultModelFeature, configureMcpFeature, configureApiFeature } from './chunks/features.mjs';
10
+ import { changeScriptLanguageFeature, configureEnvPermissionFeature, configureAiMemoryFeature, configureDefaultModelFeature, configureMcpFeature, configureApiFeature, configureCodexAiMemoryFeature, configureCodexDefaultModelFeature } from './chunks/features.mjs';
11
11
  import process$1 from 'node:process';
12
12
  import { x, exec as exec$1 } from 'tinyexec';
13
13
  import { exec, spawn, execSync, spawnSync } from 'node:child_process';
14
14
  import { promisify } from 'node:util';
15
15
  import { pathExists } from 'fs-extra';
16
16
  import { m as moveToTrash } from './shared/ccjk.DGjQxTq_.mjs';
17
+ import { g as getClaudeFamilyRuntimeLabel } from './shared/ccjk.BSLlI-JL.mjs';
17
18
  import { ClaudeCodeConfigManager } from './chunks/claude-code-config-manager.mjs';
18
19
  import 'dayjs';
19
20
  import 'node:url';
20
- import '@rainbowatcher/toml-edit-js';
21
21
  import 'inquirer-toggle';
22
22
  import 'ora';
23
23
  import 'semver';
24
24
  import 'node:fs/promises';
25
25
  import 'i18next';
26
26
  import 'i18next-fs-backend';
27
+ import '@rainbowatcher/toml-edit-js';
27
28
  import 'trash';
28
29
 
29
30
  function isCcrConfigured() {
@@ -687,7 +688,7 @@ class CcjkUninstaller {
687
688
  result.removed.push(".claude.json (includes MCP configuration)");
688
689
  }
689
690
  try {
690
- const { uninstallCodeTool } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bs; });
691
+ const { uninstallCodeTool } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bA; });
691
692
  const success = await uninstallCodeTool("claude-code");
692
693
  if (success) {
693
694
  result.removed.push("@anthropic-ai/claude-code");
@@ -923,7 +924,7 @@ async function uninstall(options = {}) {
923
924
  }
924
925
  const uninstaller = new CcjkUninstaller(options.lang || "en");
925
926
  if (codeType === "codex") {
926
- const { runCodexUninstall } = await import('./chunks/simple-config.mjs').then(function (n) { return n.br; });
927
+ const { runCodexUninstall } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bz; });
927
928
  await runCodexUninstall();
928
929
  return;
929
930
  }
@@ -1193,7 +1194,7 @@ async function update(options = {}) {
1193
1194
  }
1194
1195
  return;
1195
1196
  }
1196
- const { resolveTemplateLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bo; });
1197
+ const { resolveTemplateLanguage } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bw; });
1197
1198
  const configLang = await resolveTemplateLanguage(
1198
1199
  options.configLang,
1199
1200
  // Command line option
@@ -1202,12 +1203,15 @@ async function update(options = {}) {
1202
1203
  // Non-interactive mode flag
1203
1204
  );
1204
1205
  const aiOutputLang = await resolveAiOutputLanguage(i18n.language, options.aiOutputLang, ccjkConfig, options.skipPrompt);
1206
+ const runtimeLabel = isClaudeFamilyCodeTool(codeToolType) ? getClaudeFamilyRuntimeLabel(codeToolType) : "Claude Code";
1205
1207
  console.log(ansis.cyan(`
1206
- ${i18n.t("configuration:updatingPrompts")}
1208
+ ${i18n.t("configuration:updatingPrompts", { runtime: runtimeLabel })}
1207
1209
  `));
1208
1210
  await updatePromptOnly(aiOutputLang);
1209
- await selectAndInstallWorkflows(configLang);
1210
- await checkClaudeCodeVersionAndPrompt(false);
1211
+ await selectAndInstallWorkflows(configLang, void 0, { codeToolType: isClaudeFamilyCodeTool(codeToolType) ? codeToolType : "claude-code" });
1212
+ if (codeToolType === "claude-code") {
1213
+ await checkClaudeCodeVersionAndPrompt(false);
1214
+ }
1211
1215
  updateCcjkConfig({
1212
1216
  version,
1213
1217
  templateLang: configLang,
@@ -1596,7 +1600,7 @@ async function probeCommand(opts = {}) {
1596
1600
  }
1597
1601
  function readActiveApiCreds() {
1598
1602
  const tool = readCcjkConfig()?.codeToolType ?? "clavue";
1599
- const file = tool === "clavue" ? CLAVUE_SETTINGS_FILE : settingsFileForTool(tool === "codex" ? "claude-code" : tool);
1603
+ const file = activeSettingsFile(tool === "codex" || tool === "grok" ? "claude-code" : tool);
1600
1604
  const settings = readJsonConfig(file) || {};
1601
1605
  const env = settings.env || {};
1602
1606
  return {
@@ -1632,10 +1636,173 @@ async function runProbe(baseUrl, apiKey, authToken) {
1632
1636
  }
1633
1637
  }
1634
1638
 
1639
+ const ONBOARDING_STATE_FILE = join(CCJK_CONFIG_DIR, "onboarding.json");
1640
+ const LANGUAGE_SELECTION_MESSAGES = {
1641
+ selectLanguage: "Select CCJK display language / \u9009\u62E9 CCJK \u663E\u793A\u8BED\u8A00"
1642
+ };
1643
+ const TOOL_LABELS = {
1644
+ "clavue": { en: "Clavue", zh: "Clavue" },
1645
+ "claude-code": { en: "Claude Code", zh: "Claude Code" },
1646
+ "codex": { en: "Codex", zh: "Codex" },
1647
+ "grok": { en: "Grok CLI", zh: "Grok CLI" }
1648
+ };
1649
+ function isSupportedLang(value) {
1650
+ return SUPPORTED_LANGS.includes(value);
1651
+ }
1652
+ function isPrimaryOnboardingTool(value) {
1653
+ return STARTUP_CODE_TOOL_CHOICES.includes(value);
1654
+ }
1655
+ function resolveOnboardingCodeTool(value) {
1656
+ if (isPrimaryOnboardingTool(value)) {
1657
+ return value;
1658
+ }
1659
+ return "clavue";
1660
+ }
1661
+ function getToolLabel(tool, lang) {
1662
+ return lang === "zh-CN" ? TOOL_LABELS[tool].zh : TOOL_LABELS[tool].en;
1663
+ }
1664
+ function getLanguageLabel(lang) {
1665
+ return LANG_LABELS[lang];
1666
+ }
1667
+ function readSavedLanguage() {
1668
+ const savedConfig = readCcjkConfig();
1669
+ return isSupportedLang(savedConfig?.preferredLang) ? savedConfig.preferredLang : null;
1670
+ }
1671
+ async function ensureOnboardingLanguageSelection(force = false) {
1672
+ const savedConfig = readCcjkConfig();
1673
+ const savedLanguage = readSavedLanguage();
1674
+ const defaultLanguage = savedLanguage || "zh-CN";
1675
+ if (savedLanguage && !force) {
1676
+ await changeLanguage(savedLanguage);
1677
+ return savedLanguage;
1678
+ }
1679
+ const { lang } = await inquirer.prompt({
1680
+ type: "list",
1681
+ name: "lang",
1682
+ message: LANGUAGE_SELECTION_MESSAGES.selectLanguage,
1683
+ choices: addNumbersToChoices(SUPPORTED_LANGS.map((language) => ({
1684
+ name: LANG_LABELS[language],
1685
+ value: language
1686
+ }))),
1687
+ default: SUPPORTED_LANGS.indexOf(defaultLanguage)
1688
+ });
1689
+ const selectedLanguage = isSupportedLang(lang) ? lang : defaultLanguage;
1690
+ updateCcjkConfig({
1691
+ version,
1692
+ preferredLang: selectedLanguage,
1693
+ templateLang: savedConfig?.templateLang || selectedLanguage
1694
+ });
1695
+ await changeLanguage(selectedLanguage);
1696
+ return selectedLanguage;
1697
+ }
1698
+ async function selectOnboardingCodeTool(lang, options = {}) {
1699
+ const savedConfig = readCcjkConfig();
1700
+ const preferredTool = resolveOnboardingCodeTool(options.preferredCodeTool);
1701
+ const defaultTool = resolveOnboardingCodeTool(savedConfig?.codeToolType || preferredTool);
1702
+ if (options.preferredCodeTool && isPrimaryOnboardingTool(options.preferredCodeTool)) {
1703
+ updateCcjkConfig({
1704
+ version,
1705
+ codeToolType: options.preferredCodeTool
1706
+ });
1707
+ return options.preferredCodeTool;
1708
+ }
1709
+ const isZh = lang === "zh-CN";
1710
+ const { tool } = await inquirer.prompt({
1711
+ type: "list",
1712
+ name: "tool",
1713
+ message: isZh ? "\u9009\u62E9\u4EE3\u7801\u5DE5\u5177" : "Choose your code tool",
1714
+ choices: addNumbersToChoices([
1715
+ {
1716
+ name: `${getToolLabel("clavue", lang)} - ${isZh ? "Clavue \u63A7\u5236\u4E2D\u5FC3\uFF08\u9ED8\u8BA4\u63A8\u8350\uFF09" : "Clavue control center (recommended)"}`,
1717
+ value: "clavue"
1718
+ },
1719
+ {
1720
+ name: `${getToolLabel("claude-code", lang)} - ${isZh ? "Claude Code \u63A7\u5236\u4E2D\u5FC3" : "Claude Code control center"}`,
1721
+ value: "claude-code"
1722
+ },
1723
+ {
1724
+ name: `${getToolLabel("codex", lang)} - ${isZh ? "Codex \u63A7\u5236\u4E2D\u5FC3" : "Codex control center"}`,
1725
+ value: "codex"
1726
+ },
1727
+ {
1728
+ name: `${getToolLabel("grok", lang)} - ${isZh ? "Grok CLI \u72B6\u6001 / \u914D\u7F6E / \u542F\u52A8" : "Grok CLI status, config, and launch"}`,
1729
+ value: "grok"
1730
+ }
1731
+ ]),
1732
+ default: STARTUP_CODE_TOOL_CHOICES.indexOf(defaultTool)
1733
+ });
1734
+ const selectedTool = resolveOnboardingCodeTool(tool);
1735
+ updateCcjkConfig({
1736
+ version,
1737
+ codeToolType: selectedTool
1738
+ });
1739
+ return selectedTool;
1740
+ }
1741
+ function readOnboardingState() {
1742
+ try {
1743
+ if (!existsSync(ONBOARDING_STATE_FILE))
1744
+ return null;
1745
+ return JSON.parse(readFileSync(ONBOARDING_STATE_FILE, "utf-8"));
1746
+ } catch {
1747
+ return null;
1748
+ }
1749
+ }
1750
+ function writeOnboardingState(state) {
1751
+ try {
1752
+ if (!existsSync(CCJK_CONFIG_DIR)) {
1753
+ mkdirSync(CCJK_CONFIG_DIR, { recursive: true });
1754
+ }
1755
+ writeFileSync(ONBOARDING_STATE_FILE, JSON.stringify(state, null, 2));
1756
+ } catch {
1757
+ }
1758
+ }
1759
+ function isOnboardingCompleted() {
1760
+ const state = readOnboardingState();
1761
+ return state?.completed === true;
1762
+ }
1763
+ async function runOnboardingWizard(options = {}) {
1764
+ if (isOnboardingCompleted() && !options.reset) {
1765
+ const saved = readCcjkConfig();
1766
+ if (saved?.preferredLang) {
1767
+ await changeLanguage(saved.preferredLang);
1768
+ }
1769
+ return;
1770
+ }
1771
+ if (options.reset) {
1772
+ writeOnboardingState({ completed: false, completedAt: "", completedSteps: [] });
1773
+ }
1774
+ const selectedLanguage = await ensureOnboardingLanguageSelection(options.reset === true);
1775
+ const isZh = selectedLanguage === "zh-CN";
1776
+ console.log("");
1777
+ console.log(ansis.bold.yellow(isZh ? "\u{1F389} \u6B22\u8FCE\u4F7F\u7528 CCJK\uFF01" : "\u{1F389} Welcome to CCJK!"));
1778
+ console.log(ansis.dim(isZh ? " \u5148\u9009\u62E9\u663E\u793A\u8BED\u8A00\uFF0C\u518D\u9009\u62E9\u4EE3\u7801\u5DE5\u5177\uFF0C\u7136\u540E\u8FDB\u5165\u5BF9\u5E94\u63A7\u5236\u4E2D\u5FC3\u3002" : " Select display language first, then your code tool, then enter the control center."));
1779
+ console.log("");
1780
+ console.log(ansis.bold(`${isZh ? "\u6B65\u9AA4 1/2" : "Step 1/2"}: ${isZh ? "\u663E\u793A\u8BED\u8A00" : "Display language"}`));
1781
+ console.log(ansis.green(` \u2714 ${getLanguageLabel(selectedLanguage)}`));
1782
+ console.log("");
1783
+ console.log(ansis.bold(`${isZh ? "\u6B65\u9AA4 2/2" : "Step 2/2"}: ${isZh ? "\u4EE3\u7801\u5DE5\u5177" : "Code tool"}`));
1784
+ const selectedTool = await selectOnboardingCodeTool(selectedLanguage, options);
1785
+ console.log(ansis.green(` \u2714 ${getToolLabel(selectedTool, selectedLanguage)}`));
1786
+ console.log("");
1787
+ writeOnboardingState({
1788
+ completed: true,
1789
+ completedAt: (/* @__PURE__ */ new Date()).toISOString(),
1790
+ completedSteps: [1, 2],
1791
+ version
1792
+ });
1793
+ console.log(
1794
+ ansis.bold.green(
1795
+ isZh ? `\u2705 \u6B63\u5728\u8FDB\u5165 ${getToolLabel(selectedTool, selectedLanguage)} \u63A7\u5236\u4E2D\u5FC3...` : `\u2705 Loading ${getToolLabel(selectedTool, selectedLanguage)} control center...`
1796
+ )
1797
+ );
1798
+ console.log("");
1799
+ }
1800
+
1635
1801
  const CODE_TOOL_LABELS = {
1636
1802
  "clavue": "Clavue",
1637
1803
  "claude-code": "Claude Code",
1638
- "codex": "Codex"
1804
+ "codex": "Codex",
1805
+ "grok": "Grok CLI"
1639
1806
  };
1640
1807
  function getCurrentCodeTool() {
1641
1808
  const config = readCcjkConfig();
@@ -1719,6 +1886,141 @@ function printCcjkSection(options) {
1719
1886
  console.log(` ${ansis.red("Q.")} ${ansis.red(i18n.t("menu:menuOptions.exit"))}`);
1720
1887
  console.log("");
1721
1888
  }
1889
+ async function showClavueMenu() {
1890
+ console.log(ansis.cyan(i18n.t("menu:selectFunction")));
1891
+ console.log(" -------- Clavue --------");
1892
+ console.log(
1893
+ ` ${ansis.cyan("1.")} ${i18n.t("menu:menuOptions.clavueFullInit")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueFullInit")}`)}`
1894
+ );
1895
+ console.log(
1896
+ ` ${ansis.cyan("2.")} ${i18n.t("menu:menuOptions.clavueUpdateWorkflow")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueUpdateWorkflow")}`)}`
1897
+ );
1898
+ console.log(
1899
+ ` ${ansis.cyan("3.")} ${i18n.t("menu:menuOptions.clavueConfigureApi")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueConfigureApi")}`)}`
1900
+ );
1901
+ console.log(
1902
+ ` ${ansis.cyan("4.")} ${i18n.t("menu:menuOptions.clavueConfigureMcp")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueConfigureMcp")}`)}`
1903
+ );
1904
+ console.log(
1905
+ ` ${ansis.cyan("5.")} ${i18n.t("menu:menuOptions.clavueConfigureModel")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueConfigureModel")}`)}`
1906
+ );
1907
+ console.log(
1908
+ ` ${ansis.cyan("6.")} ${i18n.t("menu:menuOptions.clavueConfigureAiMemory")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueConfigureAiMemory")}`)}`
1909
+ );
1910
+ console.log(
1911
+ ` ${ansis.cyan("7.")} ${i18n.t("menu:menuOptions.clavueConfigureEnvPermission")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueConfigureEnvPermission")}`)}`
1912
+ );
1913
+ console.log(
1914
+ ` ${ansis.cyan("8.")} ${i18n.t("menu:menuOptions.clavueStatus")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.clavueStatus")}`)}`
1915
+ );
1916
+ console.log("");
1917
+ printOtherToolsSection();
1918
+ printCcjkSection({
1919
+ uninstallOption: i18n.t("menu:menuOptions.clavueUninstall"),
1920
+ uninstallDescription: i18n.t("menu:menuDescriptions.clavueUninstall"),
1921
+ updateOption: i18n.t("menu:menuOptions.clavueCheckUpdates"),
1922
+ updateDescription: i18n.t("menu:menuDescriptions.clavueCheckUpdates")
1923
+ });
1924
+ const { choice } = await inquirer.prompt({
1925
+ type: "input",
1926
+ name: "choice",
1927
+ message: i18n.t("common:enterChoice"),
1928
+ validate: (value) => {
1929
+ const valid = ["1", "2", "3", "4", "5", "6", "7", "8", "r", "R", "u", "U", "l", "L", "p", "P", "g", "G", "x", "X", "0", "-", "+", "s", "S", "q", "Q"];
1930
+ return valid.includes(value) || i18n.t("common:invalidChoice");
1931
+ }
1932
+ });
1933
+ if (!choice) {
1934
+ console.log(ansis.yellow(i18n.t("common:cancelled")));
1935
+ return "exit";
1936
+ }
1937
+ const normalized = choice.toLowerCase();
1938
+ switch (normalized) {
1939
+ case "1":
1940
+ await init({ skipBanner: true, codeType: "clavue" });
1941
+ break;
1942
+ case "2":
1943
+ await update({ skipBanner: true, codeType: "clavue" });
1944
+ break;
1945
+ case "3":
1946
+ await configureApiFeature();
1947
+ break;
1948
+ case "4":
1949
+ await configureMcpFeature();
1950
+ break;
1951
+ case "5":
1952
+ await configureDefaultModelFeature();
1953
+ break;
1954
+ case "6":
1955
+ await configureAiMemoryFeature();
1956
+ break;
1957
+ case "7":
1958
+ await configureEnvPermissionFeature();
1959
+ break;
1960
+ case "8":
1961
+ case "p":
1962
+ await probeCommand();
1963
+ printSeparator();
1964
+ return void 0;
1965
+ case "r":
1966
+ await runCcrMenuFeature();
1967
+ printSeparator();
1968
+ return void 0;
1969
+ case "u":
1970
+ await runCcusageFeature();
1971
+ printSeparator();
1972
+ return void 0;
1973
+ case "l":
1974
+ await runCometixMenuFeature();
1975
+ printSeparator();
1976
+ return void 0;
1977
+ case "g":
1978
+ await grokCommand();
1979
+ printSeparator();
1980
+ return void 0;
1981
+ case "x":
1982
+ await reasonixCommand();
1983
+ printSeparator();
1984
+ return void 0;
1985
+ case "0": {
1986
+ const currentLang = i18n.language;
1987
+ await changeScriptLanguageFeature(currentLang);
1988
+ printSeparator();
1989
+ return void 0;
1990
+ }
1991
+ case "-":
1992
+ await uninstall();
1993
+ printSeparator();
1994
+ return void 0;
1995
+ case "+":
1996
+ await checkUpdates();
1997
+ printSeparator();
1998
+ return void 0;
1999
+ case "s": {
2000
+ const switched = await handleCodeToolSwitch("clavue");
2001
+ if (switched) {
2002
+ return "switch";
2003
+ }
2004
+ printSeparator();
2005
+ return void 0;
2006
+ }
2007
+ case "q":
2008
+ console.log(ansis.cyan(i18n.t("common:goodbye")));
2009
+ return "exit";
2010
+ default:
2011
+ return void 0;
2012
+ }
2013
+ printSeparator();
2014
+ const shouldContinue = await promptBoolean({
2015
+ message: i18n.t("common:returnToMenu"),
2016
+ defaultValue: true
2017
+ });
2018
+ if (!shouldContinue) {
2019
+ console.log(ansis.cyan(i18n.t("common:goodbye")));
2020
+ return "exit";
2021
+ }
2022
+ return void 0;
2023
+ }
1722
2024
  async function showClaudeCodeMenu() {
1723
2025
  console.log(ansis.cyan(i18n.t("menu:selectFunction")));
1724
2026
  console.log(" -------- Claude Code --------");
@@ -1950,8 +2252,112 @@ async function showCodexMenu() {
1950
2252
  }
1951
2253
  return void 0;
1952
2254
  }
2255
+ async function showGrokMenu() {
2256
+ console.log(ansis.cyan(i18n.t("menu:selectFunction")));
2257
+ console.log(" -------- Grok CLI --------");
2258
+ console.log(
2259
+ ` ${ansis.cyan("1.")} ${i18n.t("menu:menuOptions.grokInit")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.grokInit")}`)}`
2260
+ );
2261
+ console.log(
2262
+ ` ${ansis.cyan("2.")} ${i18n.t("menu:menuOptions.grokStatus")} ${ansis.gray(`- ${i18n.t("menu:menuDescriptions.grokStatus")}`)}`
2263
+ );
2264
+ console.log("");
2265
+ printOtherToolsSection();
2266
+ printCcjkSection({
2267
+ uninstallOption: i18n.t("menu:menuOptions.uninstall"),
2268
+ uninstallDescription: i18n.t("menu:menuDescriptions.uninstall"),
2269
+ updateOption: i18n.t("menu:menuOptions.checkUpdates"),
2270
+ updateDescription: i18n.t("menu:menuDescriptions.checkUpdates")
2271
+ });
2272
+ const { choice } = await inquirer.prompt({
2273
+ type: "input",
2274
+ name: "choice",
2275
+ message: i18n.t("common:enterChoice"),
2276
+ validate: (value) => {
2277
+ const valid = ["1", "2", "r", "R", "u", "U", "l", "L", "p", "P", "g", "G", "x", "X", "0", "-", "+", "s", "S", "q", "Q"];
2278
+ return valid.includes(value) || i18n.t("common:invalidChoice");
2279
+ }
2280
+ });
2281
+ if (!choice) {
2282
+ console.log(ansis.yellow(i18n.t("common:cancelled")));
2283
+ return "exit";
2284
+ }
2285
+ const normalized = choice.toLowerCase();
2286
+ switch (normalized) {
2287
+ case "1":
2288
+ await init({ skipBanner: true, codeType: "grok" });
2289
+ break;
2290
+ case "2":
2291
+ await grokCommand();
2292
+ break;
2293
+ case "r":
2294
+ await runCcrMenuFeature();
2295
+ printSeparator();
2296
+ return void 0;
2297
+ case "u":
2298
+ await runCcusageFeature();
2299
+ printSeparator();
2300
+ return void 0;
2301
+ case "l":
2302
+ await runCometixMenuFeature();
2303
+ printSeparator();
2304
+ return void 0;
2305
+ case "p":
2306
+ await probeCommand();
2307
+ printSeparator();
2308
+ return void 0;
2309
+ case "g":
2310
+ await grokCommand();
2311
+ printSeparator();
2312
+ return void 0;
2313
+ case "x":
2314
+ await reasonixCommand();
2315
+ printSeparator();
2316
+ return void 0;
2317
+ case "0": {
2318
+ const currentLang = i18n.language;
2319
+ await changeScriptLanguageFeature(currentLang);
2320
+ printSeparator();
2321
+ return void 0;
2322
+ }
2323
+ case "-":
2324
+ await uninstall();
2325
+ printSeparator();
2326
+ return void 0;
2327
+ case "+":
2328
+ await checkUpdates();
2329
+ printSeparator();
2330
+ return void 0;
2331
+ case "s": {
2332
+ const switched = await handleCodeToolSwitch("grok");
2333
+ if (switched) {
2334
+ return "switch";
2335
+ }
2336
+ printSeparator();
2337
+ return void 0;
2338
+ }
2339
+ case "q":
2340
+ console.log(ansis.cyan(i18n.t("common:goodbye")));
2341
+ return "exit";
2342
+ default:
2343
+ return void 0;
2344
+ }
2345
+ printSeparator();
2346
+ const shouldContinue = await promptBoolean({
2347
+ message: i18n.t("common:returnToMenu"),
2348
+ defaultValue: true
2349
+ });
2350
+ if (!shouldContinue) {
2351
+ console.log(ansis.cyan(i18n.t("common:goodbye")));
2352
+ return "exit";
2353
+ }
2354
+ return void 0;
2355
+ }
1953
2356
  async function showMainMenu(options = {}) {
1954
2357
  try {
2358
+ if (!options.skipOnboarding) {
2359
+ await runOnboardingWizard({ preferredCodeTool: options.codeType });
2360
+ }
1955
2361
  if (options.codeType) {
1956
2362
  try {
1957
2363
  const resolvedType = await resolveCodeType$1(options.codeType);
@@ -1969,7 +2375,7 @@ async function showMainMenu(options = {}) {
1969
2375
  while (!exitMenu) {
1970
2376
  const codeTool = getCurrentCodeTool();
1971
2377
  displayBannerWithInfo(CODE_TOOL_BANNERS[codeTool] || "CCJK");
1972
- const result = codeTool === "codex" ? await showCodexMenu() : await showClaudeCodeMenu();
2378
+ const result = codeTool === "clavue" ? await showClavueMenu() : codeTool === "codex" ? await showCodexMenu() : codeTool === "grok" ? await showGrokMenu() : await showClaudeCodeMenu();
1973
2379
  if (result === "exit") {
1974
2380
  exitMenu = true;
1975
2381
  } else if (result === "switch") {
@@ -2053,7 +2459,7 @@ async function listCodexProvidersWithDisplay() {
2053
2459
  console.log(ansis.cyan(i18n.t("codex:currentProvider", { provider: currentProvider })));
2054
2460
  console.log();
2055
2461
  }
2056
- const { listCodexProfileFiles, codexProfileLaunchHint } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bp; });
2462
+ const { listCodexProfileFiles, codexProfileLaunchHint } = await import('./chunks/simple-config.mjs').then(function (n) { return n.bx; });
2057
2463
  const profileFiles = listCodexProfileFiles();
2058
2464
  if (profileFiles.length > 0) {
2059
2465
  console.log(ansis.bold("Codex 0.135+ profiles (.config.toml):"));
@@ -2316,7 +2722,7 @@ function extractLanguageOptions(options) {
2316
2722
  function customizeHelp(sections) {
2317
2723
  sections.unshift({
2318
2724
  title: "",
2319
- body: ansis.cyan.bold(`CCJK - Zero-Config Code Flow v${version}`)
2725
+ body: ansis.cyan.bold(`CCJK v${version}`)
2320
2726
  });
2321
2727
  sections.push({
2322
2728
  title: ansis.yellow(i18n.t("cli:help.commands")),
@@ -2360,8 +2766,8 @@ function customizeHelp(sections) {
2360
2766
  ` ${ansis.green("--config-action, -r")} <action> ${i18n.t("cli:help.optionDescriptions.configHandling")} (${i18n.t("cli:help.defaults.prefix")} backup)`,
2361
2767
  ` ${ansis.green("--mcp-services, -m")} <list> ${i18n.t("cli:help.optionDescriptions.mcpServices")} (${i18n.t("cli:help.defaults.prefix")} all non-key services)`,
2362
2768
  ` ${ansis.green("--workflows, -w")} <list> ${i18n.t("cli:help.optionDescriptions.workflows")} (${i18n.t("cli:help.defaults.prefix")} all workflows)`,
2363
- ` ${ansis.green("--output-styles, -o")} <styles> ${i18n.t("cli:help.optionDescriptions.outputStyles")} (${i18n.t("cli:help.defaults.prefix")} all custom styles)`,
2364
- ` ${ansis.green("--default-output-style, -d")} <style> ${i18n.t("cli:help.optionDescriptions.defaultOutputStyle")} (${i18n.t("cli:help.defaults.prefix")} engineer-professional)`,
2769
+ ` ${ansis.green("--output-styles, -o")} <styles> ${i18n.t("cli:help.optionDescriptions.outputStyles")} (${i18n.t("cli:help.defaults.prefix")} none)`,
2770
+ ` ${ansis.green("--default-output-style, -d")} <style> ${i18n.t("cli:help.optionDescriptions.defaultOutputStyle")} (${i18n.t("cli:help.defaults.prefix")} none)`,
2365
2771
  ` ${ansis.green("--code-type, -T")} <type> ${i18n.t("cli:help.optionDescriptions.codeToolType")} (claude-code, codex, cc=claude-code, cx=codex)`,
2366
2772
  ` ${ansis.green("--install-cometix-line, -x")} <value> ${i18n.t("cli:help.optionDescriptions.installStatuslineTool")} (${i18n.t("cli:help.defaults.prefix")} true)`
2367
2773
  ].join("\n")
@@ -2417,10 +2823,10 @@ async function setupCommands(cli) {
2417
2823
  await initI18n(defaultLang);
2418
2824
  } catch {
2419
2825
  }
2420
- cli.command("", "Show interactive menu (default)").option("--lang, -l <lang>", "CCJK display language (zh-CN, en)").option("--all-lang, -g <lang>", "Set all language parameters to this value").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").option("--force, -f", "Force overwrite existing configuration").option("--code-type, -T <codeType>", "Select code tool type (claude-code, codex, cc, cx)").action(await withLanguageResolution(async (options) => {
2826
+ cli.command("", "Show interactive menu (default)").option("--lang, -l <lang>", "CCJK display language (zh-CN, en)").option("--all-lang, -g <lang>", "Set all language parameters to this value").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").option("--force, -f", "Force overwrite existing configuration").option("--code-type, -T <codeType>", "Select code tool type (clavue, claude-code, codex, grok, cv, cc, cx, gk)").action(await withLanguageResolution(async (options) => {
2421
2827
  await showMainMenu({ codeType: options.codeType });
2422
- }));
2423
- cli.command("init", "Initialize Claude Code configuration").alias("i").option("--lang, -l <lang>", "CCJK display language (zh-CN, en)").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").option("--ai-output-lang, -a <lang>", "AI output language").option("--force, -f", "Force overwrite existing configuration").option("--skip-prompt, -s", "Skip all interactive prompts (non-interactive mode)").option("--config-action, -r <action>", `Config handling (new/backup/merge/docs-only/skip), ${i18n.t("cli:help.defaults.prefix")} backup`).option("--api-type, -t <type>", "API type (auth_token/api_key/ccr_proxy/skip)").option("--api-key, -k <key>", "API key (used for both API key and auth token types)").option("--api-url, -u <url>", "Custom API URL").option("--api-model, -M <model>", "Primary API model (e.g., claude-sonnet-4-5)").option("--api-haiku-model, -H <model>", "Default Haiku model (e.g., claude-haiku-4-5)").option("--api-sonnet-model, -S <model>", "Default Sonnet model (e.g., claude-sonnet-4-5)").option("--api-opus-model, -O <model>", "Default Opus model (e.g., claude-opus-4-5)").option("--provider, -p <provider>", "API provider preset (302ai, glm, minimax, kimi, custom)").option("--mcp-services, -m <services>", `Comma-separated MCP services to install (context7,mcp-deepwiki,Playwright,exa), "skip" to skip all, "all" for all non-key services, ${i18n.t("cli:help.defaults.prefix")} all`).option("--workflows, -w <workflows>", `Comma-separated workflows to install (sixStepsWorkflow,featPlanUx,gitWorkflow,bmadWorkflow), "skip" to skip all, "all" for all workflows, ${i18n.t("cli:help.defaults.prefix")} all`).option("--output-styles, -o <styles>", `Comma-separated output styles (engineer-professional,nekomata-engineer,laowang-engineer,default,explanatory,learning), "skip" to skip all, "all" for all custom styles, ${i18n.t("cli:help.defaults.prefix")} all`).option("--default-output-style, -d <style>", `Default output style, ${i18n.t("cli:help.defaults.prefix")} engineer-professional`).option("--all-lang, -g <lang>", "Set all language parameters to this value").option("--code-type, -T <codeType>", "Select code tool type (claude-code, codex, cc, cx)").option("--install-cometix-line, -x <value>", `Install CCometixLine statusline tool (true/false), ${i18n.t("cli:help.defaults.prefix")} true`).option("--api-configs <configs>", "API configurations as JSON string for multiple profiles").option("--api-configs-file <file>", "Path to JSON file containing API configurations").action(await withLanguageResolution(async (options) => {
2828
+ }, true));
2829
+ cli.command("init", "Initialize Claude Code configuration").alias("i").option("--lang, -l <lang>", "CCJK display language (zh-CN, en)").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").option("--ai-output-lang, -a <lang>", "AI output language").option("--force, -f", "Force overwrite existing configuration").option("--skip-prompt, -s", "Skip all interactive prompts (non-interactive mode)").option("--config-action, -r <action>", `Config handling (new/backup/merge/docs-only/skip), ${i18n.t("cli:help.defaults.prefix")} backup`).option("--api-type, -t <type>", "API type (auth_token/api_key/ccr_proxy/skip)").option("--api-key, -k <key>", "API key (used for both API key and auth token types)").option("--api-url, -u <url>", "Custom API URL").option("--api-model, -M <model>", "Primary API model (e.g., claude-sonnet-4-5)").option("--api-haiku-model, -H <model>", "Default Haiku model (e.g., claude-haiku-4-5)").option("--api-sonnet-model, -S <model>", "Default Sonnet model (e.g., claude-sonnet-4-5)").option("--api-opus-model, -O <model>", "Default Opus model (e.g., claude-opus-4-5)").option("--provider, -p <provider>", "API provider preset (302ai, glm, minimax, kimi, custom)").option("--mcp-services, -m <services>", `Comma-separated MCP services to install (context7,mcp-deepwiki,Playwright,exa), "skip" to skip all, "all" for all non-key services, ${i18n.t("cli:help.defaults.prefix")} all`).option("--workflows, -w <workflows>", `Comma-separated workflows to install (sixStepsWorkflow,featPlanUx,gitWorkflow,bmadWorkflow), "skip" to skip all, "all" for all workflows, ${i18n.t("cli:help.defaults.prefix")} all`).option("--output-styles, -o <styles>", `Comma-separated output styles (linus-mode,uncle-bob-mode,dhh-mode,carmack-mode,jobs-mode,evan-you-mode,default,explanatory,learning), "skip" to skip all, "all" for zcf curated styles, ${i18n.t("cli:help.defaults.prefix")} none`).option("--default-output-style, -d <style>", `Default output style (or "none" to keep original behavior), ${i18n.t("cli:help.defaults.prefix")} none`).option("--all-lang, -g <lang>", "Set all language parameters to this value").option("--code-type, -T <codeType>", "Select code tool type (claude-code, codex, cc, cx)").option("--install-cometix-line, -x <value>", `Install CCometixLine statusline tool (true/false), ${i18n.t("cli:help.defaults.prefix")} true`).option("--api-configs <configs>", "API configurations as JSON string for multiple profiles").option("--api-configs-file <file>", "Path to JSON file containing API configurations").action(await withLanguageResolution(async (options) => {
2424
2830
  await init(options);
2425
2831
  }));
2426
2832
  cli.command("update", "Update Claude Code prompts only").alias("u").option("--lang, -l <lang>", "CCJK display language (zh-CN, en)").option("--all-lang, -g <lang>", "Set all language parameters to this value").option("--config-lang, -c <lang>", "Configuration language (zh-CN, en)").action(await withLanguageResolution(async (options) => {
@@ -46,7 +46,7 @@
46
46
  "help.exampleDescriptions.checkClaudeCode": "Check and update Claude Code tools",
47
47
  "help.exampleDescriptions.checkCodex": "Check and update Codex tools",
48
48
  "help.exampleDescriptions.nonInteractiveModeCicd": "Non-interactive mode (CI/CD)",
49
- "banner.subtitle": "One-click configuration tool for Claude Code",
49
+ "banner.subtitle": "Unified config for 4 tools",
50
50
  "banner.updateSubtitle": "Update configuration for Claude Code",
51
51
  "help.defaults.dailyUsage": "Daily usage (default)",
52
52
  "help.defaults.interactiveUninstall": "Interactive uninstall menu",
@@ -4,7 +4,7 @@
4
4
  "emptyToSkip": " (press Enter with empty content to skip)",
5
5
  "cancelled": "Operation cancelled",
6
6
  "error": "Error",
7
- "complete": "🎉 Setup complete! Use 'claude' command to start.",
7
+ "complete": "🎉 Setup complete! Use '{{runtime}}' command to start.",
8
8
  "none": "None",
9
9
  "enterChoice": "Enter your choice and press enter (case-insensitive)",
10
10
  "invalidChoice": "Invalid choice. Please enter a valid option.",