wangchuan 2.3.1 → 2.4.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.
- package/dist/bin/wangchuan.d.ts +2 -2
- package/dist/bin/wangchuan.js +24 -24
- package/dist/bin/wangchuan.js.map +1 -1
- package/dist/src/commands/diff.d.ts +3 -3
- package/dist/src/commands/diff.js +15 -15
- package/dist/src/commands/diff.js.map +1 -1
- package/dist/src/commands/dump.d.ts +3 -3
- package/dist/src/commands/dump.d.ts.map +1 -1
- package/dist/src/commands/dump.js +11 -14
- 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 +22 -23
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/list.d.ts +3 -3
- package/dist/src/commands/list.d.ts.map +1 -1
- package/dist/src/commands/list.js +10 -11
- package/dist/src/commands/list.js.map +1 -1
- package/dist/src/commands/pull.d.ts +1 -1
- package/dist/src/commands/pull.js +17 -17
- package/dist/src/commands/pull.js.map +1 -1
- package/dist/src/commands/push.d.ts +1 -1
- package/dist/src/commands/push.js +20 -20
- package/dist/src/commands/push.js.map +1 -1
- package/dist/src/commands/status.d.ts +1 -1
- package/dist/src/commands/status.js +25 -25
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/core/migrate.js +13 -13
- package/dist/src/core/migrate.js.map +1 -1
- package/dist/src/core/sync.js +10 -10
- package/dist/src/core/sync.js.map +1 -1
- package/dist/src/utils/prompt.d.ts +6 -6
- package/dist/src/utils/prompt.d.ts.map +1 -1
- package/dist/src/utils/prompt.js +10 -11
- package/dist/src/utils/prompt.js.map +1 -1
- package/dist/src/utils/validator.d.ts +3 -4
- package/dist/src/utils/validator.d.ts.map +1 -1
- package/dist/src/utils/validator.js +4 -4
- package/dist/src/utils/validator.js.map +1 -1
- package/package.json +1 -1
- package/skill/wangchuan-skill.sh +14 -13
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 入口
|
|
3
|
+
* wangchuan.ts — CLI entry / CLI 入口
|
|
4
4
|
*
|
|
5
|
-
* 用法:
|
|
5
|
+
* Usage / 用法:
|
|
6
6
|
* wangchuan <command> [--agent openclaw|claude|gemini] [flags]
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from 'commander';
|
|
@@ -15,78 +15,78 @@ import { cmdList } from '../src/commands/list.js';
|
|
|
15
15
|
import { cmdDump } from '../src/commands/dump.js';
|
|
16
16
|
import { logger } from '../src/utils/logger.js';
|
|
17
17
|
const AGENT_CHOICES = ['openclaw', 'claude', 'gemini'];
|
|
18
|
-
/** 校验 --agent 值合法性 */
|
|
18
|
+
/** Validate --agent value / 校验 --agent 值合法性 */
|
|
19
19
|
function parseAgent(val) {
|
|
20
20
|
if (!AGENT_CHOICES.includes(val)) {
|
|
21
|
-
throw new Error(`--agent 必须是 openclaw | claude | gemini,收到: ${val}`);
|
|
21
|
+
throw new Error(`--agent must be openclaw | claude | gemini, got: ${val} / --agent 必须是 openclaw | claude | gemini,收到: ${val}`);
|
|
22
22
|
}
|
|
23
23
|
return val;
|
|
24
24
|
}
|
|
25
25
|
const program = new Command();
|
|
26
26
|
program
|
|
27
27
|
.name('wangchuan')
|
|
28
|
-
.description('忘川 · AI 记忆同步系统')
|
|
29
|
-
.version('
|
|
28
|
+
.description('Wangchuan · AI Memory Sync System / 忘川 · AI 记忆同步系统')
|
|
29
|
+
.version('2.3.1');
|
|
30
30
|
// ── init ────────────────────────────────────────────────────────
|
|
31
31
|
program
|
|
32
32
|
.command('init')
|
|
33
|
-
.description('初始化忘川,配置仓库并生成密钥')
|
|
34
|
-
.requiredOption('-r, --repo <url>', 'Git
|
|
35
|
-
.option('-k, --key <master-key>', '导入已有的主密钥(十六进制字符串)')
|
|
36
|
-
.option('--force', '
|
|
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)
|
|
37
37
|
.action(async (opts) => {
|
|
38
38
|
await run(() => cmdInit(opts));
|
|
39
39
|
});
|
|
40
40
|
// ── pull ────────────────────────────────────────────────────────
|
|
41
41
|
program
|
|
42
42
|
.command('pull')
|
|
43
|
-
.description('
|
|
44
|
-
.option('-a, --agent <name>', '只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
43
|
+
.description('Pull and restore configs from remote repo / 从远端仓库拉取并还原配置到本地')
|
|
44
|
+
.option('-a, --agent <name>', 'Filter by agent / 只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
45
45
|
.action(async (opts) => {
|
|
46
46
|
await run(() => cmdPull(opts));
|
|
47
47
|
});
|
|
48
48
|
// ── push ────────────────────────────────────────────────────────
|
|
49
49
|
program
|
|
50
50
|
.command('push')
|
|
51
|
-
.description('
|
|
52
|
-
.option('-m, --message <msg>', '自定义提交信息')
|
|
53
|
-
.option('-a, --agent <name>', '只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
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)
|
|
54
54
|
.action(async (opts) => {
|
|
55
55
|
await run(() => cmdPush(opts));
|
|
56
56
|
});
|
|
57
57
|
// ── status ──────────────────────────────────────────────────────
|
|
58
58
|
program
|
|
59
59
|
.command('status')
|
|
60
|
-
.description('
|
|
61
|
-
.option('-a, --agent <name>', '只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
60
|
+
.description('Show sync status and workspace diff / 查看同步状态和工作区差异')
|
|
61
|
+
.option('-a, --agent <name>', 'Filter by agent / 只操作指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
62
62
|
.action(async (opts) => {
|
|
63
63
|
await run(() => cmdStatus(opts));
|
|
64
64
|
});
|
|
65
65
|
// ── diff ────────────────────────────────────────────────────────
|
|
66
66
|
program
|
|
67
67
|
.command('diff')
|
|
68
|
-
.description('显示本地与仓库的行级文件差异')
|
|
69
|
-
.option('-a, --agent <name>', '只显示指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
68
|
+
.description('Show line-level diff between local and repo / 显示本地与仓库的行级文件差异')
|
|
69
|
+
.option('-a, --agent <name>', 'Filter by agent / 只显示指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
70
70
|
.action(async (opts) => {
|
|
71
71
|
await run(() => cmdDiff(opts));
|
|
72
72
|
});
|
|
73
73
|
// ── list ────────────────────────────────────────────────────────
|
|
74
74
|
program
|
|
75
75
|
.command('list')
|
|
76
|
-
.description('
|
|
77
|
-
.option('-a, --agent <name>', '只列出指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
76
|
+
.description('List all managed configs with local/repo status / 列出所有受管配置项及其状态')
|
|
77
|
+
.option('-a, --agent <name>', 'Filter by agent / 只列出指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
78
78
|
.action(async (opts) => {
|
|
79
79
|
await run(() => cmdList(opts));
|
|
80
80
|
});
|
|
81
81
|
// ── dump ────────────────────────────────────────────────────────
|
|
82
82
|
program
|
|
83
83
|
.command('dump')
|
|
84
|
-
.description('
|
|
85
|
-
.option('-a, --agent <name>', '只导出指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
84
|
+
.description('Generate plaintext snapshot to temp dir / 生成明文快照到临时目录')
|
|
85
|
+
.option('-a, --agent <name>', 'Filter by agent / 只导出指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
86
86
|
.action(async (opts) => {
|
|
87
87
|
await run(() => cmdDump(opts));
|
|
88
88
|
});
|
|
89
|
-
// ── 错误兜底
|
|
89
|
+
// ── Error handler / 错误兜底 ─────────────────────────────────────
|
|
90
90
|
async function run(fn) {
|
|
91
91
|
try {
|
|
92
92
|
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;AAGnD,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"wangchuan.js","sourceRoot":"","sources":["../../bin/wangchuan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* diff.ts — wangchuan diff 命令
|
|
2
|
+
* diff.ts — wangchuan diff command / diff 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Shows line-level unified diff for each changed file.
|
|
5
|
+
* Encrypted files are decrypted before comparison.
|
|
6
6
|
*/
|
|
7
7
|
import type { DiffCommandOptions } from '../types.js';
|
|
8
8
|
export declare function cmdDiff({ agent }?: DiffCommandOptions): Promise<void>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* diff.ts — wangchuan diff 命令
|
|
2
|
+
* diff.ts — wangchuan diff command / diff 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Shows line-level unified diff for each changed file.
|
|
5
|
+
* Encrypted files are decrypted before comparison.
|
|
6
6
|
*/
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import path from 'path';
|
|
@@ -15,7 +15,7 @@ import { logger } from '../utils/logger.js';
|
|
|
15
15
|
import { diffText } from '../utils/linediff.js';
|
|
16
16
|
import chalk from 'chalk';
|
|
17
17
|
export async function cmdDiff({ agent } = {}) {
|
|
18
|
-
logger.banner('忘川 · 文件差异');
|
|
18
|
+
logger.banner('Wangchuan · Diff / 忘川 · 文件差异');
|
|
19
19
|
let cfg = config.load();
|
|
20
20
|
validator.requireInit(cfg);
|
|
21
21
|
cfg = ensureMigrated(cfg);
|
|
@@ -23,15 +23,15 @@ export async function cmdDiff({ agent } = {}) {
|
|
|
23
23
|
const keyPath = syncEngine.expandHome(cfg.keyPath);
|
|
24
24
|
const entries = syncEngine.buildFileEntries(cfg, undefined, agent);
|
|
25
25
|
if (agent)
|
|
26
|
-
logger.info(
|
|
26
|
+
logger.info(`Filter agent / 过滤智能体: ${chalk.cyan(agent)}\n`);
|
|
27
27
|
let totalChanged = 0;
|
|
28
28
|
for (const entry of entries) {
|
|
29
29
|
const srcExists = fs.existsSync(entry.srcAbs);
|
|
30
30
|
const repoAbs = path.join(repoPath, entry.repoRel);
|
|
31
31
|
const repoExists = fs.existsSync(repoAbs);
|
|
32
|
-
// ── 仅一侧存在
|
|
32
|
+
// ── Only one side exists / 仅一侧存在 ────────────────────────
|
|
33
33
|
if (srcExists && !repoExists) {
|
|
34
|
-
console.log(chalk.bold.green(`+++ ${entry.repoRel}`) + chalk.gray(' (新增,仓库中不存在)'));
|
|
34
|
+
console.log(chalk.bold.green(`+++ ${entry.repoRel}`) + chalk.gray(' (new, not in repo / 新增,仓库中不存在)'));
|
|
35
35
|
const lines = fs.readFileSync(entry.srcAbs, 'utf-8').split('\n');
|
|
36
36
|
lines.forEach(l => console.log(chalk.green(`+ ${l}`)));
|
|
37
37
|
console.log();
|
|
@@ -39,14 +39,14 @@ export async function cmdDiff({ agent } = {}) {
|
|
|
39
39
|
continue;
|
|
40
40
|
}
|
|
41
41
|
if (!srcExists && repoExists) {
|
|
42
|
-
console.log(chalk.bold.red(`--- ${entry.repoRel}`) + chalk.gray(' (本地缺失)'));
|
|
42
|
+
console.log(chalk.bold.red(`--- ${entry.repoRel}`) + chalk.gray(' (missing locally / 本地缺失)'));
|
|
43
43
|
console.log();
|
|
44
44
|
totalChanged++;
|
|
45
45
|
continue;
|
|
46
46
|
}
|
|
47
47
|
if (!srcExists && !repoExists)
|
|
48
48
|
continue;
|
|
49
|
-
// ──
|
|
49
|
+
// ── Both sides exist, read content / 两侧均存在 ──────────────
|
|
50
50
|
const localText = fs.readFileSync(entry.srcAbs, 'utf-8');
|
|
51
51
|
let repoText;
|
|
52
52
|
if (entry.encrypt) {
|
|
@@ -54,7 +54,7 @@ export async function cmdDiff({ agent } = {}) {
|
|
|
54
54
|
repoText = cryptoEngine.decryptString(fs.readFileSync(repoAbs, 'utf-8').trim(), keyPath);
|
|
55
55
|
}
|
|
56
56
|
catch {
|
|
57
|
-
console.log(chalk.yellow(`~ ${entry.repoRel}`) + chalk.gray(' [加密文件,无法解密比较]'));
|
|
57
|
+
console.log(chalk.yellow(`~ ${entry.repoRel}`) + chalk.gray(' [encrypted, cannot decrypt / 加密文件,无法解密比较]'));
|
|
58
58
|
console.log();
|
|
59
59
|
totalChanged++;
|
|
60
60
|
continue;
|
|
@@ -65,11 +65,11 @@ export async function cmdDiff({ agent } = {}) {
|
|
|
65
65
|
}
|
|
66
66
|
const diffLines = diffText(repoText, localText);
|
|
67
67
|
if (diffLines.length === 0)
|
|
68
|
-
continue;
|
|
68
|
+
continue;
|
|
69
69
|
const encLabel = entry.encrypt ? chalk.gray(' [enc]') : '';
|
|
70
70
|
console.log(chalk.bold(`~~~ ${entry.repoRel}`) + encLabel);
|
|
71
|
-
console.log(chalk.gray(' --- 仓库版本'));
|
|
72
|
-
console.log(chalk.gray(' +++ 本地版本'));
|
|
71
|
+
console.log(chalk.gray(' --- repo version / 仓库版本'));
|
|
72
|
+
console.log(chalk.gray(' +++ local version / 本地版本'));
|
|
73
73
|
console.log();
|
|
74
74
|
for (const line of diffLines) {
|
|
75
75
|
if (line.content === '...') {
|
|
@@ -89,10 +89,10 @@ export async function cmdDiff({ agent } = {}) {
|
|
|
89
89
|
totalChanged++;
|
|
90
90
|
}
|
|
91
91
|
if (totalChanged === 0) {
|
|
92
|
-
logger.ok('所有文件与仓库一致,无差异');
|
|
92
|
+
logger.ok('All files match repo, no diff / 所有文件与仓库一致,无差异');
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
|
-
logger.info(
|
|
95
|
+
logger.info(`${totalChanged} files differ / ${totalChanged} 个文件有差异`);
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
//# 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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dump.ts — wangchuan dump 命令
|
|
2
|
+
* dump.ts — wangchuan dump command / dump 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Generates a plaintext snapshot mirroring repo structure in a temp dir.
|
|
5
|
+
* All .enc files are auto-decrypted for manual inspection.
|
|
6
6
|
*/
|
|
7
7
|
import type { AgentOptions } from '../types.js';
|
|
8
8
|
export declare function cmdDump({ agent }?: AgentOptions): Promise<void>;
|
|
@@ -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,
|
|
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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dump.ts — wangchuan dump 命令
|
|
2
|
+
* dump.ts — wangchuan dump command / dump 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Generates a plaintext snapshot mirroring repo structure in a temp dir.
|
|
5
|
+
* All .enc files are auto-decrypted for manual inspection.
|
|
6
6
|
*/
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import os from 'os';
|
|
@@ -15,13 +15,13 @@ import { validator } from '../utils/validator.js';
|
|
|
15
15
|
import { logger } from '../utils/logger.js';
|
|
16
16
|
import chalk from 'chalk';
|
|
17
17
|
export async function cmdDump({ agent } = {}) {
|
|
18
|
-
logger.banner('忘川 · 明文快照');
|
|
18
|
+
logger.banner('Wangchuan · Dump / 忘川 · 明文快照');
|
|
19
19
|
let cfg = config.load();
|
|
20
20
|
validator.requireInit(cfg);
|
|
21
21
|
cfg = ensureMigrated(cfg);
|
|
22
22
|
const keyPath = expandHome(cfg.keyPath);
|
|
23
23
|
const entries = buildFileEntries(cfg, undefined, agent);
|
|
24
|
-
// 创建临时目录
|
|
24
|
+
// Create temp dir / 创建临时目录
|
|
25
25
|
const dumpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wangchuan-dump-'));
|
|
26
26
|
let count = 0;
|
|
27
27
|
let skipped = 0;
|
|
@@ -30,39 +30,36 @@ export async function cmdDump({ agent } = {}) {
|
|
|
30
30
|
skipped++;
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
|
-
// 输出路径:用 plainRel(不带 .enc 后缀)
|
|
34
33
|
const destPath = path.join(dumpDir, entry.plainRel);
|
|
35
34
|
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
36
35
|
if (entry.jsonExtract) {
|
|
37
|
-
// JSON 字段提取 → 写入提取后的 JSON
|
|
38
36
|
try {
|
|
39
37
|
const fullJson = JSON.parse(fs.readFileSync(entry.srcAbs, 'utf-8'));
|
|
40
38
|
const partial = jsonField.extractFields(fullJson, entry.jsonExtract.fields);
|
|
41
39
|
fs.writeFileSync(destPath, JSON.stringify(partial, null, 2), 'utf-8');
|
|
42
40
|
}
|
|
43
41
|
catch (err) {
|
|
44
|
-
logger.warn(
|
|
42
|
+
logger.warn(`Skipping JSON extraction (parse error) / 跳过 JSON 字段提取: ${entry.srcAbs}`);
|
|
45
43
|
skipped++;
|
|
46
44
|
continue;
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
else {
|
|
50
|
-
// 整文件 → 直接复制明文
|
|
51
48
|
fs.copyFileSync(entry.srcAbs, destPath);
|
|
52
49
|
}
|
|
53
50
|
const labels = [];
|
|
54
51
|
if (entry.encrypt)
|
|
55
|
-
labels.push(chalk.gray('[
|
|
52
|
+
labels.push(chalk.gray('[src encrypted/原文件加密]'));
|
|
56
53
|
if (entry.jsonExtract)
|
|
57
|
-
labels.push(chalk.blue('[
|
|
54
|
+
labels.push(chalk.blue('[field extraction/字段提取]'));
|
|
58
55
|
console.log(` ${chalk.green('✔')} ${entry.plainRel} ${labels.join('')}`);
|
|
59
56
|
count++;
|
|
60
57
|
}
|
|
61
58
|
console.log();
|
|
62
|
-
console.log(chalk.bold(` 输出目录:`) + chalk.cyan(dumpDir));
|
|
63
|
-
console.log(chalk.bold(` 文件数量:`) + `${count}
|
|
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/个跳过)`) : ''));
|
|
64
61
|
console.log();
|
|
65
|
-
console.log(chalk.gray(`
|
|
62
|
+
console.log(chalk.gray(` Warning: this dir contains plaintext sensitive data, delete after inspection / 提示:含明文敏感信息,查看后请删除`));
|
|
66
63
|
console.log(chalk.gray(` rm -rf ${dumpDir}`));
|
|
67
64
|
}
|
|
68
65
|
//# 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;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,
|
|
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,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* init.ts — wangchuan init 命令
|
|
2
|
+
* init.ts — wangchuan init command / init 命令
|
|
3
3
|
*/
|
|
4
4
|
import { config } from '../core/config.js';
|
|
5
5
|
import { cryptoEngine } from '../core/crypto.js';
|
|
@@ -10,52 +10,51 @@ import ora from 'ora';
|
|
|
10
10
|
import fs from 'fs';
|
|
11
11
|
import path from 'path';
|
|
12
12
|
export async function cmdInit({ repo, force = false, key }) {
|
|
13
|
-
logger.banner('忘川初始化');
|
|
13
|
+
logger.banner('Wangchuan Init / 忘川初始化');
|
|
14
14
|
if (!validator.isGitUrl(repo)) {
|
|
15
|
-
throw new Error(
|
|
15
|
+
throw new Error(`Invalid Git URL / 无效的 Git 地址: ${repo}`);
|
|
16
16
|
}
|
|
17
17
|
const existing = config.load();
|
|
18
18
|
if (existing !== null && !force) {
|
|
19
|
-
logger.warn(
|
|
20
|
-
logger.info('如需重新初始化,请使用 --force 参数');
|
|
19
|
+
logger.warn(`Already initialized (repo: ${existing.repo}) / 忘川已初始化`);
|
|
20
|
+
logger.info('Use --force to re-initialize / 如需重新初始化,请使用 --force 参数');
|
|
21
21
|
return existing;
|
|
22
22
|
}
|
|
23
|
-
// ── 写配置
|
|
24
|
-
let spinner = ora('写入配置 …').start();
|
|
23
|
+
// ── Write config / 写配置 ──────────────────────────────────────
|
|
24
|
+
let spinner = ora('Writing config … / 写入配置 …').start();
|
|
25
25
|
const cfg = await config.initialize(repo);
|
|
26
|
-
spinner.succeed(
|
|
27
|
-
// ── 密钥 ──────────────────────────────────────────────────
|
|
26
|
+
spinner.succeed(`Config saved / 配置已写入: ${config.paths.config}`);
|
|
27
|
+
// ── Key / 密钥 ──────────────────────────────────────────────────
|
|
28
28
|
if (key) {
|
|
29
|
-
// 直接写入用户传入的密钥字符串
|
|
30
29
|
const hex = key.trim();
|
|
31
30
|
if (!/^[0-9a-fA-F]{64}$/.test(hex)) {
|
|
32
|
-
throw new Error('
|
|
31
|
+
throw new Error('Invalid key format, expected 64 hex chars (256-bit) / 密钥格式无效');
|
|
33
32
|
}
|
|
34
33
|
fs.mkdirSync(path.dirname(cfg.keyPath), { recursive: true });
|
|
35
34
|
fs.writeFileSync(cfg.keyPath, hex, 'utf-8');
|
|
36
|
-
logger.ok(
|
|
35
|
+
logger.ok(`Master key imported / 主密钥已导入: ${cfg.keyPath}`);
|
|
37
36
|
}
|
|
38
37
|
else if (!cryptoEngine.hasKey(cfg.keyPath)) {
|
|
39
|
-
spinner = ora('
|
|
38
|
+
spinner = ora('Generating AES-256-GCM master key … / 生成主密钥 …').start();
|
|
40
39
|
cryptoEngine.generateKey(cfg.keyPath);
|
|
41
|
-
spinner.succeed(
|
|
40
|
+
spinner.succeed(`Master key generated / 主密钥已生成: ${cfg.keyPath}`);
|
|
42
41
|
}
|
|
43
42
|
else {
|
|
44
|
-
logger.info(
|
|
43
|
+
logger.info(`Master key exists, skipping / 主密钥已存在: ${cfg.keyPath}`);
|
|
45
44
|
}
|
|
46
|
-
// ──
|
|
47
|
-
spinner = ora(
|
|
45
|
+
// ── Clone/fetch repo / 克隆仓库 ────────────────────────────────
|
|
46
|
+
spinner = ora(`Cloning repo / 克隆仓库: ${repo} …`).start();
|
|
48
47
|
try {
|
|
49
48
|
await gitEngine.cloneOrFetch(repo, cfg.localRepoPath, cfg.branch);
|
|
50
|
-
spinner.succeed(
|
|
49
|
+
spinner.succeed(`Repo ready / 仓库已就绪: ${cfg.localRepoPath}`);
|
|
51
50
|
}
|
|
52
51
|
catch (err) {
|
|
53
|
-
spinner.fail('克隆仓库失败');
|
|
54
|
-
throw new Error(`Git 操作失败: ${err.message}`);
|
|
52
|
+
spinner.fail('Clone failed / 克隆仓库失败');
|
|
53
|
+
throw new Error(`Git operation failed / Git 操作失败: ${err.message}`);
|
|
55
54
|
}
|
|
56
|
-
logger.ok('\
|
|
57
|
-
logger.step('下一步: wangchuan pull (同步远端记忆到本地)');
|
|
58
|
-
logger.step('
|
|
55
|
+
logger.ok('\nWangchuan initialized! / 忘川初始化完成!');
|
|
56
|
+
logger.step('Next / 下一步: wangchuan pull (pull remote memories / 同步远端记忆到本地)');
|
|
57
|
+
logger.step(' wangchuan push (push local memories / 推送本地记忆到远端)');
|
|
59
58
|
return cfg;
|
|
60
59
|
}
|
|
61
60
|
//# 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;AAElD,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAQ,IAAI,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,EAAe;IACrE,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* list.ts — wangchuan list 命令
|
|
2
|
+
* list.ts — wangchuan list command / list 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Lists all managed config files with local/repo presence.
|
|
5
|
+
* Grouped by agent and shared tier.
|
|
6
6
|
*/
|
|
7
7
|
import type { ListOptions } from '../types.js';
|
|
8
8
|
export declare function cmdList({ agent }?: ListOptions): Promise<void>;
|
|
@@ -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,
|
|
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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* list.ts — wangchuan list 命令
|
|
2
|
+
* list.ts — wangchuan list command / list 命令
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Lists all managed config files with local/repo presence.
|
|
5
|
+
* Grouped by agent and shared tier.
|
|
6
6
|
*/
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import { config } from '../core/config.js';
|
|
@@ -15,16 +15,16 @@ const TIER_LABELS = {
|
|
|
15
15
|
openclaw: 'OpenClaw',
|
|
16
16
|
claude: 'Claude',
|
|
17
17
|
gemini: 'Gemini',
|
|
18
|
-
shared: 'Shared
|
|
18
|
+
shared: 'Shared (cross-agent / 跨 Agent 共享)',
|
|
19
19
|
};
|
|
20
20
|
export async function cmdList({ agent } = {}) {
|
|
21
|
-
logger.banner('忘川 · 配置清单');
|
|
21
|
+
logger.banner('Wangchuan · List / 忘川 · 配置清单');
|
|
22
22
|
let cfg = config.load();
|
|
23
23
|
validator.requireInit(cfg);
|
|
24
24
|
cfg = ensureMigrated(cfg);
|
|
25
25
|
const repoPath = syncEngine.expandHome(cfg.localRepoPath);
|
|
26
26
|
const entries = syncEngine.buildFileEntries(cfg, undefined, agent);
|
|
27
|
-
//
|
|
27
|
+
// Group by agentName
|
|
28
28
|
const groups = new Map();
|
|
29
29
|
for (const e of entries) {
|
|
30
30
|
const tier = e.agentName;
|
|
@@ -33,7 +33,6 @@ export async function cmdList({ agent } = {}) {
|
|
|
33
33
|
groups.get(tier).push(e);
|
|
34
34
|
}
|
|
35
35
|
let totalFiles = 0;
|
|
36
|
-
// 先展示 shared,再展示各 agent
|
|
37
36
|
const order = ['shared', 'openclaw', 'claude', 'gemini'];
|
|
38
37
|
for (const tier of order) {
|
|
39
38
|
const group = groups.get(tier);
|
|
@@ -46,14 +45,14 @@ export async function cmdList({ agent } = {}) {
|
|
|
46
45
|
const localMark = localExists ? chalk.green('✔') : chalk.red('✖');
|
|
47
46
|
const repoMark = repoExists ? chalk.green('✔') : chalk.gray('·');
|
|
48
47
|
const encLabel = e.encrypt ? chalk.magenta('[enc]') : ' ';
|
|
49
|
-
const jsonLabel = e.jsonExtract ? chalk.yellow('[
|
|
50
|
-
console.log(` ${localMark}
|
|
48
|
+
const jsonLabel = e.jsonExtract ? chalk.yellow('[field/字段]') : ' ';
|
|
49
|
+
console.log(` ${localMark} local/本地 ${repoMark} repo/仓库 ${encLabel} ${jsonLabel} ${chalk.white(e.repoRel)}`);
|
|
51
50
|
console.log(chalk.gray(` └─ ${e.srcAbs}`));
|
|
52
51
|
}
|
|
53
52
|
console.log();
|
|
54
53
|
totalFiles += group.length;
|
|
55
54
|
}
|
|
56
|
-
console.log(chalk.gray(` 共 ${totalFiles} 个配置文件`));
|
|
57
|
-
console.log(chalk.gray(` ✔ =
|
|
55
|
+
console.log(chalk.gray(` ${totalFiles} config files / 共 ${totalFiles} 个配置文件`));
|
|
56
|
+
console.log(chalk.gray(` ✔ = exists/存在 · = not in repo/仓库中尚无 [enc] = encrypted/加密 [field/字段] = JSON field extraction/字段提取`));
|
|
58
57
|
}
|
|
59
58
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,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,SAAS,EAAE,MAAY,uBAAuB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAe,oBAAoB,CAAC;AAErD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,GAA6B;IAC5C,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAI,QAAQ;IAClB,MAAM,EAAI,QAAQ;IAClB,MAAM,EAAI,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"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"}
|