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.
- package/dist/chunks/claude-code-config-manager.mjs +18 -14
- package/dist/chunks/claude-code-incremental-manager.mjs +5 -3
- package/dist/chunks/codex-config-switch.mjs +4 -4
- package/dist/chunks/codex-provider-manager.mjs +5 -5
- package/dist/chunks/codex-uninstaller.mjs +3 -3
- package/dist/chunks/commands.mjs +2 -2
- package/dist/chunks/features.mjs +43 -31
- package/dist/chunks/simple-config.mjs +818 -582
- package/dist/cli.mjs +426 -20
- package/dist/i18n/locales/en/cli.json +1 -1
- package/dist/i18n/locales/en/common.json +1 -1
- package/dist/i18n/locales/en/configuration.json +17 -17
- package/dist/i18n/locales/en/installation.json +4 -0
- package/dist/i18n/locales/en/menu.json +26 -1
- package/dist/i18n/locales/en/multi-config.json +1 -1
- package/dist/i18n/locales/zh-CN/cli.json +1 -1
- package/dist/i18n/locales/zh-CN/common.json +1 -1
- package/dist/i18n/locales/zh-CN/configuration.json +17 -17
- package/dist/i18n/locales/zh-CN/installation.json +4 -0
- package/dist/i18n/locales/zh-CN/menu.json +26 -1
- package/dist/i18n/locales/zh-CN/multi-config.json +1 -1
- package/dist/index.d.mts +27 -23
- package/dist/index.d.ts +27 -23
- package/dist/index.mjs +2 -2
- package/dist/shared/ccjk.BSLlI-JL.mjs +7 -0
- package/package.json +3 -1
- package/templates/common/output-styles/en/carmack-mode.md +367 -0
- package/templates/common/output-styles/en/dhh-mode.md +251 -0
- package/templates/common/output-styles/en/evan-you-mode.md +525 -0
- package/templates/common/output-styles/en/jobs-mode.md +355 -0
- package/templates/common/output-styles/en/linus-mode.md +121 -0
- package/templates/common/output-styles/en/uncle-bob-mode.md +207 -0
- package/templates/common/output-styles/zh-CN/carmack-mode.md +367 -0
- package/templates/common/output-styles/zh-CN/dhh-mode.md +251 -0
- package/templates/common/output-styles/zh-CN/evan-you-mode.md +525 -0
- package/templates/common/output-styles/zh-CN/jobs-mode.md +355 -0
- package/templates/common/output-styles/zh-CN/linus-mode.md +121 -0
- 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 {
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 === "
|
|
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.
|
|
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
|
|
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")}
|
|
2364
|
-
` ${ansis.green("--default-output-style, -d")} <style> ${i18n.t("cli:help.optionDescriptions.defaultOutputStyle")} (${i18n.t("cli:help.defaults.prefix")}
|
|
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 (
|
|
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": "
|
|
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 '
|
|
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.",
|