wangchuan 2.4.0 → 2.5.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 (61) hide show
  1. package/dist/bin/wangchuan.d.ts +2 -2
  2. package/dist/bin/wangchuan.js +32 -24
  3. package/dist/bin/wangchuan.js.map +1 -1
  4. package/dist/src/commands/diff.d.ts +1 -1
  5. package/dist/src/commands/diff.d.ts.map +1 -1
  6. package/dist/src/commands/diff.js +13 -12
  7. package/dist/src/commands/diff.js.map +1 -1
  8. package/dist/src/commands/dump.d.ts +1 -1
  9. package/dist/src/commands/dump.d.ts.map +1 -1
  10. package/dist/src/commands/dump.js +12 -9
  11. package/dist/src/commands/dump.js.map +1 -1
  12. package/dist/src/commands/init.d.ts +1 -1
  13. package/dist/src/commands/init.d.ts.map +1 -1
  14. package/dist/src/commands/init.js +23 -22
  15. package/dist/src/commands/init.js.map +1 -1
  16. package/dist/src/commands/lang.d.ts +7 -0
  17. package/dist/src/commands/lang.d.ts.map +1 -0
  18. package/dist/src/commands/lang.js +19 -0
  19. package/dist/src/commands/lang.js.map +1 -0
  20. package/dist/src/commands/list.d.ts +1 -1
  21. package/dist/src/commands/list.d.ts.map +1 -1
  22. package/dist/src/commands/list.js +10 -8
  23. package/dist/src/commands/list.js.map +1 -1
  24. package/dist/src/commands/pull.d.ts +1 -1
  25. package/dist/src/commands/pull.d.ts.map +1 -1
  26. package/dist/src/commands/pull.js +21 -16
  27. package/dist/src/commands/pull.js.map +1 -1
  28. package/dist/src/commands/push.d.ts +1 -1
  29. package/dist/src/commands/push.d.ts.map +1 -1
  30. package/dist/src/commands/push.js +29 -24
  31. package/dist/src/commands/push.js.map +1 -1
  32. package/dist/src/commands/status.d.ts +1 -1
  33. package/dist/src/commands/status.d.ts.map +1 -1
  34. package/dist/src/commands/status.js +26 -25
  35. package/dist/src/commands/status.js.map +1 -1
  36. package/dist/src/core/config.d.ts.map +1 -1
  37. package/dist/src/core/config.js +3 -2
  38. package/dist/src/core/config.js.map +1 -1
  39. package/dist/src/core/migrate.d.ts +12 -12
  40. package/dist/src/core/migrate.d.ts.map +1 -1
  41. package/dist/src/core/migrate.js +39 -42
  42. package/dist/src/core/migrate.js.map +1 -1
  43. package/dist/src/core/sync.d.ts.map +1 -1
  44. package/dist/src/core/sync.js +11 -10
  45. package/dist/src/core/sync.js.map +1 -1
  46. package/dist/src/i18n.d.ts +22 -0
  47. package/dist/src/i18n.d.ts.map +1 -0
  48. package/dist/src/i18n.js +223 -0
  49. package/dist/src/i18n.js.map +1 -0
  50. package/dist/src/types.d.ts +2 -0
  51. package/dist/src/types.d.ts.map +1 -1
  52. package/dist/src/utils/prompt.d.ts +1 -1
  53. package/dist/src/utils/prompt.d.ts.map +1 -1
  54. package/dist/src/utils/prompt.js +6 -5
  55. package/dist/src/utils/prompt.js.map +1 -1
  56. package/dist/src/utils/validator.d.ts +1 -1
  57. package/dist/src/utils/validator.d.ts.map +1 -1
  58. package/dist/src/utils/validator.js +3 -2
  59. package/dist/src/utils/validator.js.map +1 -1
  60. package/package.json +1 -1
  61. package/skill/wangchuan-skill.sh +2 -2
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * wangchuan.ts — CLI entry / CLI 入口
3
+ * wangchuan.ts — CLI entry
4
4
  *
5
- * Usage / 用法:
5
+ * Usage:
6
6
  * wangchuan <command> [--agent openclaw|claude|gemini] [flags]
7
7
  */
8
8
  export {};
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * wangchuan.ts — CLI entry / CLI 入口
3
+ * wangchuan.ts — CLI entry
4
4
  *
5
- * Usage / 用法:
5
+ * Usage:
6
6
  * wangchuan <command> [--agent openclaw|claude|gemini] [flags]
7
7
  */
8
8
  import { Command } from 'commander';
@@ -13,80 +13,88 @@ import { cmdStatus } from '../src/commands/status.js';
13
13
  import { cmdDiff } from '../src/commands/diff.js';
14
14
  import { cmdList } from '../src/commands/list.js';
15
15
  import { cmdDump } from '../src/commands/dump.js';
16
+ import { cmdLang } from '../src/commands/lang.js';
16
17
  import { logger } from '../src/utils/logger.js';
18
+ import { t } from '../src/i18n.js';
17
19
  const AGENT_CHOICES = ['openclaw', 'claude', 'gemini'];
18
- /** Validate --agent value / 校验 --agent 值合法性 */
19
20
  function parseAgent(val) {
20
21
  if (!AGENT_CHOICES.includes(val)) {
21
- throw new Error(`--agent must be openclaw | claude | gemini, got: ${val} / --agent 必须是 openclaw | claude | gemini,收到: ${val}`);
22
+ throw new Error(t('cli.invalidAgent', { val }));
22
23
  }
23
24
  return val;
24
25
  }
25
26
  const program = new Command();
26
27
  program
27
28
  .name('wangchuan')
28
- .description('Wangchuan · AI Memory Sync System / 忘川 · AI 记忆同步系统')
29
- .version('2.3.1');
29
+ .description(t('cli.description'))
30
+ .version('2.5.0');
30
31
  // ── init ────────────────────────────────────────────────────────
31
32
  program
32
33
  .command('init')
33
- .description('Initialize Wangchuan, configure repo and generate key / 初始化忘川,配置仓库并生成密钥')
34
- .requiredOption('-r, --repo <url>', 'Git repo URL (SSH or HTTPS) / Git 仓库地址')
35
- .option('-k, --key <master-key>', 'Import existing master key (hex string) / 导入已有的主密钥(十六进制字符串)')
36
- .option('--force', 'Force re-init (overwrite existing config) / 强制重新初始化', false)
34
+ .description(t('cli.cmd.init'))
35
+ .requiredOption('-r, --repo <url>', t('cli.cmd.init.repo'))
36
+ .option('-k, --key <master-key>', t('cli.cmd.init.key'))
37
+ .option('--force', t('cli.cmd.init.force'), false)
37
38
  .action(async (opts) => {
38
39
  await run(() => cmdInit(opts));
39
40
  });
40
41
  // ── pull ────────────────────────────────────────────────────────
41
42
  program
42
43
  .command('pull')
43
- .description('Pull and restore configs from remote repo / 从远端仓库拉取并还原配置到本地')
44
- .option('-a, --agent <name>', 'Filter by agent / 只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
44
+ .description(t('cli.cmd.pull'))
45
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
45
46
  .action(async (opts) => {
46
47
  await run(() => cmdPull(opts));
47
48
  });
48
49
  // ── push ────────────────────────────────────────────────────────
49
50
  program
50
51
  .command('push')
51
- .description('Encrypt and push local configs to remote repo / 将本地配置加密后推送到远端仓库')
52
- .option('-m, --message <msg>', 'Custom commit message / 自定义提交信息')
53
- .option('-a, --agent <name>', 'Filter by agent / 只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
52
+ .description(t('cli.cmd.push'))
53
+ .option('-m, --message <msg>', t('cli.cmd.push.msg'))
54
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
54
55
  .action(async (opts) => {
55
56
  await run(() => cmdPush(opts));
56
57
  });
57
58
  // ── status ──────────────────────────────────────────────────────
58
59
  program
59
60
  .command('status')
60
- .description('Show sync status and workspace diff / 查看同步状态和工作区差异')
61
- .option('-a, --agent <name>', 'Filter by agent / 只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
61
+ .description(t('cli.cmd.status'))
62
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
62
63
  .action(async (opts) => {
63
64
  await run(() => cmdStatus(opts));
64
65
  });
65
66
  // ── diff ────────────────────────────────────────────────────────
66
67
  program
67
68
  .command('diff')
68
- .description('Show line-level diff between local and repo / 显示本地与仓库的行级文件差异')
69
- .option('-a, --agent <name>', 'Filter by agent / 只显示指定智能体 (openclaw|claude|gemini)', parseAgent)
69
+ .description(t('cli.cmd.diff'))
70
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
70
71
  .action(async (opts) => {
71
72
  await run(() => cmdDiff(opts));
72
73
  });
73
74
  // ── list ────────────────────────────────────────────────────────
74
75
  program
75
76
  .command('list')
76
- .description('List all managed configs with local/repo status / 列出所有受管配置项及其状态')
77
- .option('-a, --agent <name>', 'Filter by agent / 只列出指定智能体 (openclaw|claude|gemini)', parseAgent)
77
+ .description(t('cli.cmd.list'))
78
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
78
79
  .action(async (opts) => {
79
80
  await run(() => cmdList(opts));
80
81
  });
81
82
  // ── dump ────────────────────────────────────────────────────────
82
83
  program
83
84
  .command('dump')
84
- .description('Generate plaintext snapshot to temp dir / 生成明文快照到临时目录')
85
- .option('-a, --agent <name>', 'Filter by agent / 只导出指定智能体 (openclaw|claude|gemini)', parseAgent)
85
+ .description(t('cli.cmd.dump'))
86
+ .option('-a, --agent <name>', t('cli.cmd.agent'), parseAgent)
86
87
  .action(async (opts) => {
87
88
  await run(() => cmdDump(opts));
88
89
  });
89
- // ── Error handler / 错误兜底 ─────────────────────────────────────
90
+ // ── lang ────────────────────────────────────────────────────────
91
+ program
92
+ .command('lang [language]')
93
+ .description(t('cli.cmd.lang'))
94
+ .action(async (language) => {
95
+ await run(() => cmdLang(language));
96
+ });
97
+ // ── Error handler ───────────────────────────────────────────────
90
98
  async function run(fn) {
91
99
  try {
92
100
  await fn();
@@ -1 +1 @@
1
- {"version":3,"file":"wangchuan.js","sourceRoot":"","sources":["../../bin/wangchuan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wangchuan.js","sourceRoot":"","sources":["../../bin/wangchuan.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * diff.ts — wangchuan diff command / diff 命令
2
+ * diff.ts — wangchuan diff command
3
3
  *
4
4
  * Shows line-level unified diff for each changed file.
5
5
  * Encrypted files are decrypted before comparison.
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF/E"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsF/E"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * diff.ts — wangchuan diff command / diff 命令
2
+ * diff.ts — wangchuan diff command
3
3
  *
4
4
  * Shows line-level unified diff for each changed file.
5
5
  * Encrypted files are decrypted before comparison.
@@ -12,10 +12,11 @@ import { syncEngine } from '../core/sync.js';
12
12
  import { cryptoEngine } from '../core/crypto.js';
13
13
  import { validator } from '../utils/validator.js';
14
14
  import { logger } from '../utils/logger.js';
15
+ import { t } from '../i18n.js';
15
16
  import { diffText } from '../utils/linediff.js';
16
17
  import chalk from 'chalk';
17
18
  export async function cmdDiff({ agent } = {}) {
18
- logger.banner('Wangchuan · Diff / 忘川 · 文件差异');
19
+ logger.banner(t('diff.banner'));
19
20
  let cfg = config.load();
20
21
  validator.requireInit(cfg);
21
22
  cfg = ensureMigrated(cfg);
@@ -23,15 +24,15 @@ export async function cmdDiff({ agent } = {}) {
23
24
  const keyPath = syncEngine.expandHome(cfg.keyPath);
24
25
  const entries = syncEngine.buildFileEntries(cfg, undefined, agent);
25
26
  if (agent)
26
- logger.info(`Filter agent / 过滤智能体: ${chalk.cyan(agent)}\n`);
27
+ logger.info(t('diff.filterAgent', { agent: chalk.cyan(agent) }) + '\n');
27
28
  let totalChanged = 0;
28
29
  for (const entry of entries) {
29
30
  const srcExists = fs.existsSync(entry.srcAbs);
30
31
  const repoAbs = path.join(repoPath, entry.repoRel);
31
32
  const repoExists = fs.existsSync(repoAbs);
32
- // ── Only one side exists / 仅一侧存在 ────────────────────────
33
+ // ── Only one side exists ──────────────────────────────────────
33
34
  if (srcExists && !repoExists) {
34
- console.log(chalk.bold.green(`+++ ${entry.repoRel}`) + chalk.gray(' (new, not in repo / 新增,仓库中不存在)'));
35
+ console.log(chalk.bold.green(`+++ ${entry.repoRel}`) + chalk.gray(' ' + t('diff.newFile')));
35
36
  const lines = fs.readFileSync(entry.srcAbs, 'utf-8').split('\n');
36
37
  lines.forEach(l => console.log(chalk.green(`+ ${l}`)));
37
38
  console.log();
@@ -39,14 +40,14 @@ export async function cmdDiff({ agent } = {}) {
39
40
  continue;
40
41
  }
41
42
  if (!srcExists && repoExists) {
42
- console.log(chalk.bold.red(`--- ${entry.repoRel}`) + chalk.gray(' (missing locally / 本地缺失)'));
43
+ console.log(chalk.bold.red(`--- ${entry.repoRel}`) + chalk.gray(' ' + t('diff.missingFile')));
43
44
  console.log();
44
45
  totalChanged++;
45
46
  continue;
46
47
  }
47
48
  if (!srcExists && !repoExists)
48
49
  continue;
49
- // ── Both sides exist, read content / 两侧均存在 ──────────────
50
+ // ── Both sides exist, read content ────────────────────────────
50
51
  const localText = fs.readFileSync(entry.srcAbs, 'utf-8');
51
52
  let repoText;
52
53
  if (entry.encrypt) {
@@ -54,7 +55,7 @@ export async function cmdDiff({ agent } = {}) {
54
55
  repoText = cryptoEngine.decryptString(fs.readFileSync(repoAbs, 'utf-8').trim(), keyPath);
55
56
  }
56
57
  catch {
57
- console.log(chalk.yellow(`~ ${entry.repoRel}`) + chalk.gray(' [encrypted, cannot decrypt / 加密文件,无法解密比较]'));
58
+ console.log(chalk.yellow(`~ ${entry.repoRel}`) + chalk.gray(' ' + t('diff.cannotDecrypt')));
58
59
  console.log();
59
60
  totalChanged++;
60
61
  continue;
@@ -68,8 +69,8 @@ export async function cmdDiff({ agent } = {}) {
68
69
  continue;
69
70
  const encLabel = entry.encrypt ? chalk.gray(' [enc]') : '';
70
71
  console.log(chalk.bold(`~~~ ${entry.repoRel}`) + encLabel);
71
- console.log(chalk.gray(' --- repo version / 仓库版本'));
72
- console.log(chalk.gray(' +++ local version / 本地版本'));
72
+ console.log(chalk.gray(' ' + t('diff.repoVersion')));
73
+ console.log(chalk.gray(' ' + t('diff.localVersion')));
73
74
  console.log();
74
75
  for (const line of diffLines) {
75
76
  if (line.content === '...') {
@@ -89,10 +90,10 @@ export async function cmdDiff({ agent } = {}) {
89
90
  totalChanged++;
90
91
  }
91
92
  if (totalChanged === 0) {
92
- logger.ok('All files match repo, no diff / 所有文件与仓库一致,无差异');
93
+ logger.ok(t('diff.noDiff'));
93
94
  }
94
95
  else {
95
- logger.info(`${totalChanged} files differ / ${totalChanged} 个文件有差异`);
96
+ logger.info(t('diff.filesDiffer', { count: totalChanged }));
96
97
  }
97
98
  }
98
99
  //# sourceMappingURL=diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * dump.ts — wangchuan dump command / dump 命令
2
+ * dump.ts — wangchuan dump command
3
3
  *
4
4
  * Generates a plaintext snapshot mirroring repo structure in a temp dir.
5
5
  * All .enc files are auto-decrypted for manual inspection.
@@ -1 +1 @@
1
- {"version":3,"file":"dump.d.ts","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAE3D,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDzE"}
1
+ {"version":3,"file":"dump.d.ts","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAE3D,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDzE"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * dump.ts — wangchuan dump command / dump 命令
2
+ * dump.ts — wangchuan dump command
3
3
  *
4
4
  * Generates a plaintext snapshot mirroring repo structure in a temp dir.
5
5
  * All .enc files are auto-decrypted for manual inspection.
@@ -13,15 +13,16 @@ import { expandHome, buildFileEntries } from '../core/sync.js';
13
13
  import { jsonField } from '../core/json-field.js';
14
14
  import { validator } from '../utils/validator.js';
15
15
  import { logger } from '../utils/logger.js';
16
+ import { t } from '../i18n.js';
16
17
  import chalk from 'chalk';
17
18
  export async function cmdDump({ agent } = {}) {
18
- logger.banner('Wangchuan · Dump / 忘川 · 明文快照');
19
+ logger.banner(t('dump.banner'));
19
20
  let cfg = config.load();
20
21
  validator.requireInit(cfg);
21
22
  cfg = ensureMigrated(cfg);
22
23
  const keyPath = expandHome(cfg.keyPath);
23
24
  const entries = buildFileEntries(cfg, undefined, agent);
24
- // Create temp dir / 创建临时目录
25
+ // Create temp dir
25
26
  const dumpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wangchuan-dump-'));
26
27
  let count = 0;
27
28
  let skipped = 0;
@@ -39,7 +40,7 @@ export async function cmdDump({ agent } = {}) {
39
40
  fs.writeFileSync(destPath, JSON.stringify(partial, null, 2), 'utf-8');
40
41
  }
41
42
  catch (err) {
42
- logger.warn(`Skipping JSON extraction (parse error) / 跳过 JSON 字段提取: ${entry.srcAbs}`);
43
+ logger.warn(t('dump.skipJson', { path: entry.srcAbs }));
43
44
  skipped++;
44
45
  continue;
45
46
  }
@@ -49,17 +50,19 @@ export async function cmdDump({ agent } = {}) {
49
50
  }
50
51
  const labels = [];
51
52
  if (entry.encrypt)
52
- labels.push(chalk.gray('[src encrypted/原文件加密]'));
53
+ labels.push(chalk.gray(t('dump.srcEncrypted')));
53
54
  if (entry.jsonExtract)
54
- labels.push(chalk.blue('[field extraction/字段提取]'));
55
+ labels.push(chalk.blue(t('dump.fieldExtraction')));
55
56
  console.log(` ${chalk.green('✔')} ${entry.plainRel} ${labels.join('')}`);
56
57
  count++;
57
58
  }
58
59
  console.log();
59
- console.log(chalk.bold(` Output dir / 输出目录:`) + chalk.cyan(dumpDir));
60
- console.log(chalk.bold(` File count / 文件数量:`) + `${count} files/个文件` + (skipped > 0 ? chalk.gray(` (${skipped} skipped/个跳过)`) : ''));
60
+ console.log(chalk.bold(` ${t('dump.outputDir')}`) + chalk.cyan(dumpDir));
61
+ console.log(chalk.bold(` ${t('dump.fileCount')}`) +
62
+ t('dump.files', { count }) +
63
+ (skipped > 0 ? chalk.gray(` ${t('dump.skippedCount', { count: skipped })}`) : ''));
61
64
  console.log();
62
- console.log(chalk.gray(` Warning: this dir contains plaintext sensitive data, delete after inspection / 提示:含明文敏感信息,查看后请删除`));
65
+ console.log(chalk.gray(` ${t('dump.warning')}`));
63
66
  console.log(chalk.gray(` rm -rf ${dumpDir}`));
64
67
  }
65
68
  //# sourceMappingURL=dump.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dump.js","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dump.js","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * init.ts — wangchuan init command / init 命令
2
+ * init.ts — wangchuan init command
3
3
  */
4
4
  import type { InitOptions, WangchuanConfig } from '../types.js';
5
5
  export declare function cmdInit({ repo, force, key }: InitOptions): Promise<WangchuanConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKhE,wBAAsB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAa,EAAE,GAAG,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAmDjG"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKhE,wBAAsB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAa,EAAE,GAAG,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAmDjG"}
@@ -1,60 +1,61 @@
1
1
  /**
2
- * init.ts — wangchuan init command / init 命令
2
+ * init.ts — wangchuan init command
3
3
  */
4
4
  import { config } from '../core/config.js';
5
5
  import { cryptoEngine } from '../core/crypto.js';
6
6
  import { gitEngine } from '../core/git.js';
7
7
  import { validator } from '../utils/validator.js';
8
8
  import { logger } from '../utils/logger.js';
9
+ import { t } from '../i18n.js';
9
10
  import ora from 'ora';
10
11
  import fs from 'fs';
11
12
  import path from 'path';
12
13
  export async function cmdInit({ repo, force = false, key }) {
13
- logger.banner('Wangchuan Init / 忘川初始化');
14
+ logger.banner(t('init.banner'));
14
15
  if (!validator.isGitUrl(repo)) {
15
- throw new Error(`Invalid Git URL / 无效的 Git 地址: ${repo}`);
16
+ throw new Error(t('init.invalidGitUrl', { repo }));
16
17
  }
17
18
  const existing = config.load();
18
19
  if (existing !== null && !force) {
19
- logger.warn(`Already initialized (repo: ${existing.repo}) / 忘川已初始化`);
20
- logger.info('Use --force to re-initialize / 如需重新初始化,请使用 --force 参数');
20
+ logger.warn(t('init.alreadyInit', { repo: existing.repo }));
21
+ logger.info(t('init.useForce'));
21
22
  return existing;
22
23
  }
23
- // ── Write config / 写配置 ──────────────────────────────────────
24
- let spinner = ora('Writing config … / 写入配置 …').start();
24
+ // ── Write config ────────────────────────────────────────────────
25
+ let spinner = ora(t('init.writingConfig')).start();
25
26
  const cfg = await config.initialize(repo);
26
- spinner.succeed(`Config saved / 配置已写入: ${config.paths.config}`);
27
- // ── Key / 密钥 ──────────────────────────────────────────────────
27
+ spinner.succeed(t('init.configSaved', { path: config.paths.config }));
28
+ // ── Key ─────────────────────────────────────────────────────────
28
29
  if (key) {
29
30
  const hex = key.trim();
30
31
  if (!/^[0-9a-fA-F]{64}$/.test(hex)) {
31
- throw new Error('Invalid key format, expected 64 hex chars (256-bit) / 密钥格式无效');
32
+ throw new Error(t('init.invalidKey'));
32
33
  }
33
34
  fs.mkdirSync(path.dirname(cfg.keyPath), { recursive: true });
34
35
  fs.writeFileSync(cfg.keyPath, hex, 'utf-8');
35
- logger.ok(`Master key imported / 主密钥已导入: ${cfg.keyPath}`);
36
+ logger.ok(t('init.keyImported', { path: cfg.keyPath }));
36
37
  }
37
38
  else if (!cryptoEngine.hasKey(cfg.keyPath)) {
38
- spinner = ora('Generating AES-256-GCM master key … / 生成主密钥 …').start();
39
+ spinner = ora(t('init.generatingKey')).start();
39
40
  cryptoEngine.generateKey(cfg.keyPath);
40
- spinner.succeed(`Master key generated / 主密钥已生成: ${cfg.keyPath}`);
41
+ spinner.succeed(t('init.keyGenerated', { path: cfg.keyPath }));
41
42
  }
42
43
  else {
43
- logger.info(`Master key exists, skipping / 主密钥已存在: ${cfg.keyPath}`);
44
+ logger.info(t('init.keyExists', { path: cfg.keyPath }));
44
45
  }
45
- // ── Clone/fetch repo / 克隆仓库 ────────────────────────────────
46
- spinner = ora(`Cloning repo / 克隆仓库: ${repo} …`).start();
46
+ // ── Clone/fetch repo ────────────────────────────────────────────
47
+ spinner = ora(t('init.cloningRepo', { repo })).start();
47
48
  try {
48
49
  await gitEngine.cloneOrFetch(repo, cfg.localRepoPath, cfg.branch);
49
- spinner.succeed(`Repo ready / 仓库已就绪: ${cfg.localRepoPath}`);
50
+ spinner.succeed(t('init.repoReady', { path: cfg.localRepoPath }));
50
51
  }
51
52
  catch (err) {
52
- spinner.fail('Clone failed / 克隆仓库失败');
53
- throw new Error(`Git operation failed / Git 操作失败: ${err.message}`);
53
+ spinner.fail(t('init.cloneFailed'));
54
+ throw new Error(t('init.gitFailed', { error: err.message }));
54
55
  }
55
- logger.ok('\nWangchuan initialized! / 忘川初始化完成!');
56
- logger.step('Next / 下一步: wangchuan pull (pull remote memories / 同步远端记忆到本地)');
57
- logger.step(' wangchuan push (push local memories / 推送本地记忆到远端)');
56
+ logger.ok('\n' + t('init.complete'));
57
+ logger.step(t('init.nextPull'));
58
+ logger.step(t('init.nextPush'));
58
59
  return cfg;
59
60
  }
60
61
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * lang.ts — wangchuan lang command
3
+ *
4
+ * Display or switch CLI display language.
5
+ */
6
+ export declare function cmdLang(language?: string): Promise<void>;
7
+ //# sourceMappingURL=lang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.d.ts","sourceRoot":"","sources":["../../../src/commands/lang.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9D"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * lang.ts — wangchuan lang command
3
+ *
4
+ * Display or switch CLI display language.
5
+ */
6
+ import { getLang, setLang, t } from '../i18n.js';
7
+ import { logger } from '../utils/logger.js';
8
+ export async function cmdLang(language) {
9
+ if (!language) {
10
+ console.log(t('lang.current', { lang: getLang() }));
11
+ return;
12
+ }
13
+ if (language !== 'zh' && language !== 'en') {
14
+ throw new Error(t('lang.invalid'));
15
+ }
16
+ setLang(language);
17
+ logger.ok(t('lang.switched', { lang: language }));
18
+ }
19
+ //# sourceMappingURL=lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.js","sourceRoot":"","sources":["../../../src/commands/lang.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAiB;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,QAAgB,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * list.ts — wangchuan list command / list 命令
2
+ * list.ts — wangchuan list command
3
3
  *
4
4
  * Lists all managed config files with local/repo presence.
5
5
  * Grouped by agent and shared tier.
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAUpE,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CxE"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAUpE,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDxE"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * list.ts — wangchuan list command / list 命令
2
+ * list.ts — wangchuan list command
3
3
  *
4
4
  * Lists all managed config files with local/repo presence.
5
5
  * Grouped by agent and shared tier.
@@ -10,15 +10,16 @@ import { ensureMigrated } from '../core/migrate.js';
10
10
  import { syncEngine } from '../core/sync.js';
11
11
  import { validator } from '../utils/validator.js';
12
12
  import { logger } from '../utils/logger.js';
13
+ import { t } from '../i18n.js';
13
14
  import chalk from 'chalk';
14
15
  const TIER_LABELS = {
15
16
  openclaw: 'OpenClaw',
16
17
  claude: 'Claude',
17
18
  gemini: 'Gemini',
18
- shared: 'Shared (cross-agent / Agent 共享)',
19
+ shared: '', // filled dynamically via t()
19
20
  };
20
21
  export async function cmdList({ agent } = {}) {
21
- logger.banner('Wangchuan · List / 忘川 · 配置清单');
22
+ logger.banner(t('list.banner'));
22
23
  let cfg = config.load();
23
24
  validator.requireInit(cfg);
24
25
  cfg = ensureMigrated(cfg);
@@ -38,21 +39,22 @@ export async function cmdList({ agent } = {}) {
38
39
  const group = groups.get(tier);
39
40
  if (!group || group.length === 0)
40
41
  continue;
41
- console.log(chalk.bold.cyan(` ▸ ${TIER_LABELS[tier]}`));
42
+ const label = tier === 'shared' ? t('list.tierShared') : TIER_LABELS[tier];
43
+ console.log(chalk.bold.cyan(` ▸ ${label}`));
42
44
  for (const e of group) {
43
45
  const localExists = fs.existsSync(e.srcAbs);
44
46
  const repoExists = fs.existsSync(`${repoPath}/${e.repoRel}`);
45
47
  const localMark = localExists ? chalk.green('✔') : chalk.red('✖');
46
48
  const repoMark = repoExists ? chalk.green('✔') : chalk.gray('·');
47
49
  const encLabel = e.encrypt ? chalk.magenta('[enc]') : ' ';
48
- const jsonLabel = e.jsonExtract ? chalk.yellow('[field/字段]') : ' ';
49
- console.log(` ${localMark} local/本地 ${repoMark} repo/仓库 ${encLabel} ${jsonLabel} ${chalk.white(e.repoRel)}`);
50
+ const jsonLabel = e.jsonExtract ? chalk.yellow(t('list.fieldLabel')) : ' ';
51
+ console.log(` ${localMark} ${t('list.localLabel')} ${repoMark} ${t('list.repoLabel')} ${encLabel} ${jsonLabel} ${chalk.white(e.repoRel)}`);
50
52
  console.log(chalk.gray(` └─ ${e.srcAbs}`));
51
53
  }
52
54
  console.log();
53
55
  totalFiles += group.length;
54
56
  }
55
- console.log(chalk.gray(` ${totalFiles} config files / 共 ${totalFiles} 个配置文件`));
56
- console.log(chalk.gray(` ✔ = exists/存在 · = not in repo/仓库中尚无 [enc] = encrypted/加密 [field/字段] = JSON field extraction/字段提取`));
57
+ console.log(chalk.gray(` ${t('list.totalFiles', { count: totalFiles })}`));
58
+ console.log(chalk.gray(` ${t('list.legend')}`));
57
59
  }
58
60
  //# sourceMappingURL=list.js.map