wangchuan 2.4.0 → 2.5.1
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/README.md +20 -2
- package/dist/bin/wangchuan.d.ts +2 -2
- package/dist/bin/wangchuan.js +32 -24
- package/dist/bin/wangchuan.js.map +1 -1
- package/dist/src/commands/diff.d.ts +1 -1
- package/dist/src/commands/diff.d.ts.map +1 -1
- package/dist/src/commands/diff.js +13 -12
- package/dist/src/commands/diff.js.map +1 -1
- package/dist/src/commands/dump.d.ts +1 -1
- package/dist/src/commands/dump.d.ts.map +1 -1
- package/dist/src/commands/dump.js +12 -9
- package/dist/src/commands/dump.js.map +1 -1
- package/dist/src/commands/init.d.ts +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +23 -22
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/lang.d.ts +7 -0
- package/dist/src/commands/lang.d.ts.map +1 -0
- package/dist/src/commands/lang.js +19 -0
- package/dist/src/commands/lang.js.map +1 -0
- package/dist/src/commands/list.d.ts +1 -1
- package/dist/src/commands/list.d.ts.map +1 -1
- package/dist/src/commands/list.js +10 -8
- package/dist/src/commands/list.js.map +1 -1
- package/dist/src/commands/pull.d.ts +1 -1
- package/dist/src/commands/pull.d.ts.map +1 -1
- package/dist/src/commands/pull.js +21 -16
- package/dist/src/commands/pull.js.map +1 -1
- package/dist/src/commands/push.d.ts +1 -1
- package/dist/src/commands/push.d.ts.map +1 -1
- package/dist/src/commands/push.js +29 -24
- package/dist/src/commands/push.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +26 -25
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +3 -2
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/migrate.d.ts +12 -12
- package/dist/src/core/migrate.d.ts.map +1 -1
- package/dist/src/core/migrate.js +39 -42
- package/dist/src/core/migrate.js.map +1 -1
- package/dist/src/core/sync.d.ts.map +1 -1
- package/dist/src/core/sync.js +11 -10
- package/dist/src/core/sync.js.map +1 -1
- package/dist/src/i18n.d.ts +22 -0
- package/dist/src/i18n.d.ts.map +1 -0
- package/dist/src/i18n.js +223 -0
- package/dist/src/i18n.js.map +1 -0
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/prompt.d.ts +1 -1
- package/dist/src/utils/prompt.d.ts.map +1 -1
- package/dist/src/utils/prompt.js +6 -5
- package/dist/src/utils/prompt.js.map +1 -1
- package/dist/src/utils/validator.d.ts +1 -1
- package/dist/src/utils/validator.d.ts.map +1 -1
- package/dist/src/utils/validator.js +3 -2
- package/dist/src/utils/validator.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +5 -0
- package/skill/wangchuan-skill.sh +2 -2
package/README.md
CHANGED
|
@@ -23,9 +23,11 @@ AI memory sync system — encrypted backup and cross-environment migration for O
|
|
|
23
23
|
| `diff` | 逐文件显示本地与仓库的行级差异(自动解密)/ Show line-level diff per file (auto-decrypt) |
|
|
24
24
|
| `list` | 列出所有托管文件,显示本地/仓库存在状态 / List all managed files with local/repo presence |
|
|
25
25
|
| `dump` | 生成明文快照到临时目录,方便检查同步内容 / Generate plaintext snapshot to temp dir for inspection |
|
|
26
|
+
| `lang` | 切换 CLI 显示语言(zh/en)/ Switch CLI display language (zh/en) |
|
|
26
27
|
|
|
27
28
|
- **AES-256-GCM** 加密:密钥本地存储,永不提交 Git / Encryption: keys stored locally, never committed to Git
|
|
28
29
|
- 全局 `--agent` 过滤:只操作指定智能体 / Global `--agent` filter: operate on a single agent only
|
|
30
|
+
- **多语言 / i18n**:`wangchuan lang zh|en` 切换 CLI 显示语言,支持环境变量 `WANGCHUAN_LANG` 覆盖 / `wangchuan lang zh|en` to switch CLI language, `WANGCHUAN_LANG` env override
|
|
29
31
|
- **细粒度同步 / Fine-grained sync**:JSON 字段级提取(如 `.claude.json` 只同步 `mcpServers`) / JSON field-level extraction (e.g. only sync `mcpServers` from `.claude.json`)
|
|
30
32
|
- **跨 agent 共享 / Cross-agent sharing**:Skills 和 MCP 配置自动在所有 agent 间分发 / Skills and MCP configs auto-distributed across all agents
|
|
31
33
|
- **删除传播 / Delete propagation**:所有 agent 都删除的 skill/MCP → 自动从 repo 清理 / Items deleted from all agents are pruned from repo
|
|
@@ -84,7 +86,21 @@ wangchuan pull
|
|
|
84
86
|
wangchuan status
|
|
85
87
|
```
|
|
86
88
|
|
|
87
|
-
### 5.
|
|
89
|
+
### 5. 切换显示语言 / Switch display language
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
wangchuan lang # 查看当前语言 / Show current language
|
|
93
|
+
wangchuan lang en # 切换到英文 / Switch to English
|
|
94
|
+
wangchuan lang zh # 切换到中文 / Switch to Chinese
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
也可通过环境变量覆盖 / Or override via env var:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
WANGCHUAN_LANG=en wangchuan status
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 6. 只操作指定智能体 / Filter by agent
|
|
88
104
|
|
|
89
105
|
```bash
|
|
90
106
|
wangchuan push --agent openclaw -m "更新 OpenClaw 记忆"
|
|
@@ -239,12 +255,14 @@ wangchuan/
|
|
|
239
255
|
│ │ ├── status.ts 状态命令 / status command
|
|
240
256
|
│ │ ├── diff.ts 差异命令 / diff command
|
|
241
257
|
│ │ ├── list.ts 清单命令 / list command (shared/agents grouping)
|
|
242
|
-
│ │
|
|
258
|
+
│ │ ├── dump.ts 明文快照 / dump command (plaintext snapshot)
|
|
259
|
+
│ │ └── lang.ts 语言切换 / lang command (i18n switching)
|
|
243
260
|
│ ├── utils/
|
|
244
261
|
│ │ ├── logger.ts 日志工具 / Logger
|
|
245
262
|
│ │ ├── validator.ts 参数校验 / Validator
|
|
246
263
|
│ │ ├── linediff.ts LCS 行级差异算法 / LCS line diff
|
|
247
264
|
│ │ └── prompt.ts 交互式冲突提示 / Interactive conflict prompt
|
|
265
|
+
│ ├── i18n.ts 国际化消息字典 / i18n message dictionary & t() helper
|
|
248
266
|
│ └── types.ts 全局类型定义 / Global type definitions
|
|
249
267
|
├── skill/
|
|
250
268
|
│ ├── SKILL.md OpenClaw Skill 说明 / OpenClaw Skill doc
|
package/dist/bin/wangchuan.d.ts
CHANGED
package/dist/bin/wangchuan.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* wangchuan.ts — CLI entry
|
|
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(
|
|
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('
|
|
29
|
-
.version('2.
|
|
29
|
+
.description(t('cli.description'))
|
|
30
|
+
.version('2.5.1');
|
|
30
31
|
// ── init ────────────────────────────────────────────────────────
|
|
31
32
|
program
|
|
32
33
|
.command('init')
|
|
33
|
-
.description('
|
|
34
|
-
.requiredOption('-r, --repo <url>', '
|
|
35
|
-
.option('-k, --key <master-key>', '
|
|
36
|
-
.option('--force', '
|
|
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('
|
|
44
|
-
.option('-a, --agent <name>', '
|
|
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('
|
|
52
|
-
.option('-m, --message <msg>', '
|
|
53
|
-
.option('-a, --agent <name>', '
|
|
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('
|
|
61
|
-
.option('-a, --agent <name>', '
|
|
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('
|
|
69
|
-
.option('-a, --agent <name>', '
|
|
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('
|
|
77
|
-
.option('-a, --agent <name>', '
|
|
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('
|
|
85
|
-
.option('-a, --agent <name>', '
|
|
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
|
-
// ──
|
|
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":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAQ,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAS,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"wangchuan.js","sourceRoot":"","sources":["../../bin/wangchuan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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
|
|
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('
|
|
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(
|
|
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('
|
|
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('
|
|
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('
|
|
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('
|
|
72
|
-
console.log(chalk.gray('
|
|
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('
|
|
93
|
+
logger.ok(t('diff.noDiff'));
|
|
93
94
|
}
|
|
94
95
|
else {
|
|
95
|
-
logger.info(
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAe,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAO,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAW,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAS,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAY,uBAAuB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAe,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAU,sBAAsB,CAAC;AAEpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,KAAyB,EAAE;IAC9D,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dump.d.ts","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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
|
|
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('
|
|
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(
|
|
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('
|
|
53
|
+
labels.push(chalk.gray(t('dump.srcEncrypted')));
|
|
53
54
|
if (entry.jsonExtract)
|
|
54
|
-
labels.push(chalk.blue('
|
|
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(`
|
|
60
|
-
console.log(chalk.bold(`
|
|
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(`
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAQ,IAAI,CAAC;AACtB,OAAO,EAAE,MAAQ,IAAI,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAe,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAO,oBAAoB,CAAC;AACrD,OAAO,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,MAAY,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAY,uBAAuB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAe,oBAAoB,CAAC;AACrD,OAAO,KAAK,MAAoB,OAAO,CAAC;AAGxC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,KAAmB,EAAE;IACxD,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"dump.js","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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
|
|
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('
|
|
14
|
+
logger.banner(t('init.banner'));
|
|
14
15
|
if (!validator.isGitUrl(repo)) {
|
|
15
|
-
throw new Error(
|
|
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(
|
|
20
|
-
logger.info('
|
|
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('
|
|
24
|
+
// ── Write config ────────────────────────────────────────────────
|
|
25
|
+
let spinner = ora(t('init.writingConfig')).start();
|
|
25
26
|
const cfg = await config.initialize(repo);
|
|
26
|
-
spinner.succeed(
|
|
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(
|
|
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(
|
|
36
|
+
logger.ok(t('init.keyImported', { path: cfg.keyPath }));
|
|
36
37
|
}
|
|
37
38
|
else if (!cryptoEngine.hasKey(cfg.keyPath)) {
|
|
38
|
-
spinner = ora('
|
|
39
|
+
spinner = ora(t('init.generatingKey')).start();
|
|
39
40
|
cryptoEngine.generateKey(cfg.keyPath);
|
|
40
|
-
spinner.succeed(
|
|
41
|
+
spinner.succeed(t('init.keyGenerated', { path: cfg.keyPath }));
|
|
41
42
|
}
|
|
42
43
|
else {
|
|
43
|
-
logger.info(
|
|
44
|
+
logger.info(t('init.keyExists', { path: cfg.keyPath }));
|
|
44
45
|
}
|
|
45
|
-
// ── Clone/fetch repo
|
|
46
|
-
spinner = ora(
|
|
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(
|
|
50
|
+
spinner.succeed(t('init.repoReady', { path: cfg.localRepoPath }));
|
|
50
51
|
}
|
|
51
52
|
catch (err) {
|
|
52
|
-
spinner.fail('
|
|
53
|
-
throw new Error(
|
|
53
|
+
spinner.fail(t('init.cloneFailed'));
|
|
54
|
+
throw new Error(t('init.gitFailed', { error: err.message }));
|
|
54
55
|
}
|
|
55
|
-
logger.ok('\
|
|
56
|
-
logger.step(
|
|
57
|
-
logger.step(
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAY,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAS,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAS,uBAAuB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAY,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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"}
|