wangchuan 1.0.2 → 2.2.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/.wangchuan/config.example.json +44 -19
- package/README.md +145 -91
- package/dist/bin/wangchuan.js +9 -0
- package/dist/bin/wangchuan.js.map +1 -1
- package/dist/src/commands/diff.d.ts.map +1 -1
- package/dist/src/commands/diff.js +3 -1
- package/dist/src/commands/diff.js.map +1 -1
- package/dist/src/commands/dump.d.ts +9 -0
- package/dist/src/commands/dump.d.ts.map +1 -0
- package/dist/src/commands/dump.js +68 -0
- package/dist/src/commands/dump.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 +26 -12
- package/dist/src/commands/list.js.map +1 -1
- package/dist/src/commands/pull.d.ts.map +1 -1
- package/dist/src/commands/pull.js +11 -1
- package/dist/src/commands/pull.js.map +1 -1
- package/dist/src/commands/push.d.ts.map +1 -1
- package/dist/src/commands/push.js +13 -5
- package/dist/src/commands/push.js.map +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +5 -2
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/core/config.d.ts +8 -1
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +54 -15
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/json-field.d.ts +17 -0
- package/dist/src/core/json-field.d.ts.map +1 -0
- package/dist/src/core/json-field.js +21 -0
- package/dist/src/core/json-field.js.map +1 -0
- package/dist/src/core/migrate.d.ts +22 -0
- package/dist/src/core/migrate.d.ts.map +1 -0
- package/dist/src/core/migrate.js +183 -0
- package/dist/src/core/migrate.js.map +1 -0
- package/dist/src/core/sync.d.ts +7 -0
- package/dist/src/core/sync.d.ts.map +1 -1
- package/dist/src/core/sync.js +423 -68
- package/dist/src/core/sync.js.map +1 -1
- package/dist/src/types.d.ts +62 -17
- package/dist/src/types.d.ts.map +1 -1
- package/dist/test/json-field.test.d.ts +5 -0
- package/dist/test/json-field.test.d.ts.map +1 -0
- package/dist/test/json-field.test.js +71 -0
- package/dist/test/json-field.test.js.map +1 -0
- package/dist/test/sync.test.d.ts +13 -0
- package/dist/test/sync.test.d.ts.map +1 -0
- package/dist/test/sync.test.js +477 -0
- package/dist/test/sync.test.js.map +1 -0
- package/package.json +2 -2
- package/skill/SKILL.md +52 -39
|
@@ -1,43 +1,68 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "忘川配置示例 — 复制为 ~/.wangchuan/config.json 并修改",
|
|
3
|
-
"repo": "git@github.com:
|
|
2
|
+
"_comment": "忘川配置示例 v2 — 复制为 ~/.wangchuan/config.json 并修改",
|
|
3
|
+
"repo": "git@github.com:you/your-brain.git",
|
|
4
4
|
"branch": "main",
|
|
5
5
|
"localRepoPath": "~/.wangchuan/repo",
|
|
6
6
|
"keyPath": "~/.wangchuan/master.key",
|
|
7
7
|
"hostname": "",
|
|
8
|
+
"version": 2,
|
|
8
9
|
"profiles": {
|
|
9
10
|
"default": {
|
|
10
11
|
"openclaw": {
|
|
11
12
|
"enabled": true,
|
|
12
13
|
"workspacePath": "~/.openclaw/workspace",
|
|
13
14
|
"syncFiles": [
|
|
14
|
-
{ "src": "MEMORY.md",
|
|
15
|
-
{ "src": "AGENTS.md",
|
|
16
|
-
{ "src": "SOUL.md",
|
|
17
|
-
{ "src": "USER.md", "encrypt": true },
|
|
18
|
-
{ "src": "TOOLS.md", "encrypt": false },
|
|
19
|
-
{ "src": "config/mcporter.json", "encrypt": true }
|
|
20
|
-
],
|
|
21
|
-
"syncDirs": [
|
|
22
|
-
{ "src": "skills/", "encrypt": false }
|
|
15
|
+
{ "src": "MEMORY.md", "encrypt": true },
|
|
16
|
+
{ "src": "AGENTS.md", "encrypt": false },
|
|
17
|
+
{ "src": "SOUL.md", "encrypt": false }
|
|
23
18
|
]
|
|
24
19
|
},
|
|
25
20
|
"claude": {
|
|
26
|
-
"enabled":
|
|
27
|
-
"workspacePath": "~/.claude",
|
|
21
|
+
"enabled": true,
|
|
22
|
+
"workspacePath": "~/.claude-internal",
|
|
28
23
|
"syncFiles": [
|
|
29
|
-
{ "src": ".
|
|
24
|
+
{ "src": "CLAUDE.md", "encrypt": false },
|
|
25
|
+
{ "src": "settings.json", "encrypt": true }
|
|
26
|
+
],
|
|
27
|
+
"jsonFields": [
|
|
28
|
+
{
|
|
29
|
+
"src": ".claude.json",
|
|
30
|
+
"fields": ["mcpServers"],
|
|
31
|
+
"repoName": "mcpServers.json",
|
|
32
|
+
"encrypt": true
|
|
33
|
+
}
|
|
30
34
|
]
|
|
31
35
|
},
|
|
32
36
|
"gemini": {
|
|
33
|
-
"enabled":
|
|
37
|
+
"enabled": true,
|
|
34
38
|
"workspacePath": "~/.gemini",
|
|
35
|
-
"syncFiles": [
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
|
|
39
|
+
"syncFiles": [],
|
|
40
|
+
"jsonFields": [
|
|
41
|
+
{
|
|
42
|
+
"src": "settings.internal.json",
|
|
43
|
+
"fields": ["security", "model"],
|
|
44
|
+
"repoName": "settings-sync.json",
|
|
45
|
+
"encrypt": true
|
|
46
|
+
}
|
|
39
47
|
]
|
|
40
48
|
}
|
|
41
49
|
}
|
|
50
|
+
},
|
|
51
|
+
"shared": {
|
|
52
|
+
"skills": {
|
|
53
|
+
"sources": [
|
|
54
|
+
{ "agent": "claude", "dir": "skills/" },
|
|
55
|
+
{ "agent": "openclaw", "dir": "skills/" }
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"mcp": {
|
|
59
|
+
"sources": [
|
|
60
|
+
{ "agent": "claude", "src": ".claude.json", "field": "mcpServers" },
|
|
61
|
+
{ "agent": "openclaw", "src": "config/mcporter.json", "field": "mcpServers" }
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"syncFiles": [
|
|
65
|
+
{ "src": "memory/SHARED.md", "workspacePath": "~/.openclaw/workspace", "encrypt": true }
|
|
66
|
+
]
|
|
42
67
|
}
|
|
43
68
|
}
|
package/README.md
CHANGED
|
@@ -2,77 +2,89 @@
|
|
|
2
2
|
|
|
3
3
|
> 忘川是中国神话中冥界的遗忘之河,亡魂渡河饮水即忘前世一切记忆。
|
|
4
4
|
> 而 **Wangchuan** 让你的 agent 记忆在环境切换时永不遗失。
|
|
5
|
+
>
|
|
6
|
+
> In Chinese mythology, Wangchuan (忘川) is the River of Oblivion in the underworld — souls crossing it forget all memories of past lives.
|
|
7
|
+
> **Wangchuan** ensures your AI agent memories are never lost across environments.
|
|
5
8
|
|
|
6
9
|
AI 记忆同步系统,支持 OpenClaw / Claude / Gemini 多种智能体记忆的加密备份与跨环境迁移。
|
|
7
10
|
|
|
11
|
+
AI memory sync system — encrypted backup and cross-environment migration for OpenClaw / Claude / Gemini agents.
|
|
12
|
+
|
|
8
13
|
---
|
|
9
14
|
|
|
10
|
-
## 功能特性
|
|
15
|
+
## 功能特性 / Features
|
|
11
16
|
|
|
12
|
-
| 命令 | 描述 |
|
|
17
|
+
| 命令 / Command | 描述 / Description |
|
|
13
18
|
|------|------|
|
|
14
|
-
| `init` | 初始化系统、生成 AES-256-GCM 密钥、克隆私有仓库 |
|
|
15
|
-
| `pull` |
|
|
16
|
-
| `push` | 将本地配置加密推送到私有仓库 |
|
|
17
|
-
| `status` | 查看仓库状态、工作区差异与文件清单 |
|
|
18
|
-
| `diff` |
|
|
19
|
-
| `list` | 列出所有托管文件,显示本地/仓库存在状态 |
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
19
|
+
| `init` | 初始化系统、生成 AES-256-GCM 密钥、克隆私有仓库 / Initialize system, generate AES-256-GCM key, clone private repo |
|
|
20
|
+
| `pull` | 从私有仓库拉取并解密配置,还原到本地工作区 / Pull and decrypt configs from repo, restore to local workspace |
|
|
21
|
+
| `push` | 将本地配置加密推送到私有仓库 / Encrypt and push local configs to repo |
|
|
22
|
+
| `status` | 查看仓库状态、工作区差异与文件清单 / Show repo status, workspace diff and file inventory |
|
|
23
|
+
| `diff` | 逐文件显示本地与仓库的行级差异(自动解密)/ Show line-level diff per file (auto-decrypt) |
|
|
24
|
+
| `list` | 列出所有托管文件,显示本地/仓库存在状态 / List all managed files with local/repo presence |
|
|
25
|
+
| `dump` | 生成明文快照到临时目录,方便检查同步内容 / Generate plaintext snapshot to temp dir for inspection |
|
|
26
|
+
|
|
27
|
+
- **AES-256-GCM** 加密:密钥本地存储,永不提交 Git / Encryption: keys stored locally, never committed to Git
|
|
28
|
+
- 全局 `--agent` 过滤:只操作指定智能体 / Global `--agent` filter: operate on a single agent only
|
|
29
|
+
- **细粒度同步 / Fine-grained sync**:JSON 字段级提取(如 `.claude.json` 只同步 `mcpServers`) / JSON field-level extraction (e.g. only sync `mcpServers` from `.claude.json`)
|
|
30
|
+
- **跨 agent 共享 / Cross-agent sharing**:Skills 和 MCP 配置自动在所有 agent 间分发 / Skills and MCP configs auto-distributed across all agents
|
|
31
|
+
- **删除传播 / Delete propagation**:所有 agent 都删除的 skill/MCP → 自动从 repo 清理 / Items deleted from all agents are pruned from repo
|
|
32
|
+
- **一键还原 / One-click restore**:新服务器 `init + pull` 即可完整恢复所有 agent 配置 / New server `init + pull` fully restores all agent configs
|
|
33
|
+
- 推送前自动扫描明文 token/apiKey / Auto-scan for plaintext tokens before push
|
|
34
|
+
- 拉取时检测本地独有文件,提示同步到云端 / Detect local-only files on pull, prompt to push
|
|
35
|
+
- 拉取冲突时交互式选择:覆盖 / 跳过 / 全部覆盖 / 全部跳过 / Interactive conflict resolution on pull
|
|
36
|
+
- 失败自动回滚,不污染仓库历史 / Auto-rollback on failure, no repo pollution
|
|
37
|
+
- v1→v2 自动迁移,备份 + 锁文件 + 回滚保护 / Auto v1→v2 migration with backup + lock + rollback
|
|
38
|
+
- 支持 OpenClaw Skill 封装,对话直接调用 / OpenClaw Skill wrapper for conversational invocation
|
|
27
39
|
|
|
28
40
|
---
|
|
29
41
|
|
|
30
|
-
## 安装
|
|
42
|
+
## 安装 / Installation
|
|
31
43
|
|
|
32
44
|
```bash
|
|
33
45
|
git clone https://github.com/SUpermin6u/wangchuan.git ~/wangchuan
|
|
34
46
|
cd ~/wangchuan
|
|
35
47
|
npm install
|
|
36
|
-
npm run build # 编译 TypeScript
|
|
37
|
-
npm link # 全局注册 wangchuan
|
|
48
|
+
npm run build # 编译 TypeScript / Compile TypeScript
|
|
49
|
+
npm link # 全局注册 wangchuan 命令(可选)/ Register global command (optional)
|
|
38
50
|
```
|
|
39
51
|
|
|
40
52
|
---
|
|
41
53
|
|
|
42
|
-
## 快速开始
|
|
54
|
+
## 快速开始 / Quick Start
|
|
43
55
|
|
|
44
|
-
### 1. 初始化
|
|
56
|
+
### 1. 初始化 / Initialize
|
|
45
57
|
|
|
46
58
|
```bash
|
|
47
59
|
wangchuan init --repo git@github.com:yourname/your-brain.git
|
|
48
60
|
```
|
|
49
61
|
|
|
50
|
-
|
|
51
|
-
- 生成 `~/.wangchuan/config.json
|
|
52
|
-
- 生成 `~/.wangchuan/master.key
|
|
53
|
-
- 克隆仓库到 `~/.wangchuan/repo`
|
|
62
|
+
执行后 / After running:
|
|
63
|
+
- 生成 `~/.wangchuan/config.json`(系统配置)/ Creates system config
|
|
64
|
+
- 生成 `~/.wangchuan/master.key`(主密钥,**请妥善保管**)/ Creates master key (**keep it safe**)
|
|
65
|
+
- 克隆仓库到 `~/.wangchuan/repo` / Clones repo
|
|
54
66
|
|
|
55
|
-
### 2. 推送本地配置
|
|
67
|
+
### 2. 推送本地配置 / Push local configs
|
|
56
68
|
|
|
57
69
|
```bash
|
|
58
70
|
wangchuan push --message "初始化配置"
|
|
59
71
|
```
|
|
60
72
|
|
|
61
|
-
### 3. 在新环境拉取记忆
|
|
73
|
+
### 3. 在新环境拉取记忆 / Pull memories on a new machine
|
|
62
74
|
|
|
63
75
|
```bash
|
|
64
|
-
# 用 --key
|
|
65
|
-
wangchuan init --repo git@github.com:yourname/your-brain.git --key
|
|
76
|
+
# 用 --key 导入已有密钥 / Import existing key with --key
|
|
77
|
+
wangchuan init --repo git@github.com:yourname/your-brain.git --key /path/to/master.key
|
|
66
78
|
wangchuan pull
|
|
67
79
|
```
|
|
68
80
|
|
|
69
|
-
### 4. 查看同步状态
|
|
81
|
+
### 4. 查看同步状态 / Check sync status
|
|
70
82
|
|
|
71
83
|
```bash
|
|
72
84
|
wangchuan status
|
|
73
85
|
```
|
|
74
86
|
|
|
75
|
-
### 5. 只操作指定智能体
|
|
87
|
+
### 5. 只操作指定智能体 / Filter by agent
|
|
76
88
|
|
|
77
89
|
```bash
|
|
78
90
|
wangchuan push --agent openclaw -m "更新 OpenClaw 记忆"
|
|
@@ -82,72 +94,107 @@ wangchuan diff --agent gemini
|
|
|
82
94
|
|
|
83
95
|
---
|
|
84
96
|
|
|
85
|
-
## 支持同步的配置
|
|
97
|
+
## 支持同步的配置 / Sync Scope
|
|
86
98
|
|
|
87
99
|
每个智能体的 `workspacePath` 均可在 `~/.wangchuan/config.json` 中自定义。
|
|
88
100
|
|
|
89
|
-
|
|
101
|
+
Each agent's `workspacePath` can be customized in `~/.wangchuan/config.json`.
|
|
90
102
|
|
|
91
|
-
|
|
92
|
-
|------|------|
|
|
93
|
-
| `MEMORY.md` | ✔ 加密 |
|
|
94
|
-
| `AGENTS.md` | 明文 |
|
|
95
|
-
| `SOUL.md` | 明文 |
|
|
96
|
-
| `USER.md` | ✔ 加密 |
|
|
97
|
-
| `TOOLS.md` | 明文 |
|
|
98
|
-
| `config/mcporter.json` | ✔ 加密 |
|
|
99
|
-
| `skills/` (目录) | 明文 |
|
|
103
|
+
### Repo 目录结构 / Repo Structure (v2)
|
|
100
104
|
|
|
101
|
-
|
|
105
|
+
```
|
|
106
|
+
repo/
|
|
107
|
+
├── shared/ 跨 agent 共享 / Cross-agent shared
|
|
108
|
+
│ ├── skills/ 所有 agent 的 skills 合并 / Merged skills from all agents
|
|
109
|
+
│ ├── mcp/ 各 agent 的 MCP 配置提取 / Extracted MCP configs
|
|
110
|
+
│ └── memory/SHARED.md.enc 跨 agent 共享记忆 / Shared memory
|
|
111
|
+
├── agents/
|
|
112
|
+
│ ├── openclaw/
|
|
113
|
+
│ │ ├── MEMORY.md.enc 永久记忆(加密)/ Long-term memory (encrypted)
|
|
114
|
+
│ │ ├── AGENTS.md Agent 行为准则 / Agent behavior rules
|
|
115
|
+
│ │ └── SOUL.md Agent 人格设定 / Agent persona
|
|
116
|
+
│ ├── claude/
|
|
117
|
+
│ │ ├── CLAUDE.md 全局指令 / Global instructions
|
|
118
|
+
│ │ ├── settings.json.enc 权限/插件/模型(加密)/ Permissions/plugins/model (encrypted)
|
|
119
|
+
│ │ └── mcpServers.json.enc 从 .claude.json 提取的 mcpServers(加密)/ Extracted from .claude.json (encrypted)
|
|
120
|
+
│ └── gemini/
|
|
121
|
+
│ └── settings-sync.json 从 settings.internal.json 提取的 security+model / Extracted fields
|
|
122
|
+
```
|
|
102
123
|
|
|
103
|
-
###
|
|
124
|
+
### OpenClaw(默认开启 / enabled by default)
|
|
104
125
|
|
|
105
|
-
| 文件 | 加密 |
|
|
106
|
-
|
|
107
|
-
|
|
|
126
|
+
| 文件 / File | 加密 / Enc | 说明 / Description |
|
|
127
|
+
|------|------|------|
|
|
128
|
+
| `MEMORY.md` | ✔ | 永久记忆 / Long-term memory |
|
|
129
|
+
| `AGENTS.md` | ✗ | 行为准则 / Behavior rules |
|
|
130
|
+
| `SOUL.md` | ✗ | 人格设定 / Persona |
|
|
108
131
|
|
|
109
|
-
|
|
132
|
+
默认路径 / Default path:`~/.openclaw/workspace/`
|
|
110
133
|
|
|
111
|
-
###
|
|
134
|
+
### Claude(默认开启 / enabled by default)
|
|
112
135
|
|
|
113
|
-
| 文件 | 加密 |
|
|
114
|
-
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
|
|
|
136
|
+
| 文件 / File | 加密 / Enc | 说明 / Description |
|
|
137
|
+
|------|------|------|
|
|
138
|
+
| `CLAUDE.md` | ✗ | 全局指令 / Global instructions |
|
|
139
|
+
| `settings.json` | ✔ | 权限、插件、模型配置 / Permissions, plugins, model |
|
|
140
|
+
| `.claude.json` → `mcpServers` | ✔ | JSON 字段级提取,仅同步 MCP 配置 / Field-level extraction, MCP config only |
|
|
141
|
+
|
|
142
|
+
默认路径 / Default path:`~/.claude-internal/`
|
|
118
143
|
|
|
119
|
-
|
|
144
|
+
### Gemini(默认开启 / enabled by default)
|
|
145
|
+
|
|
146
|
+
| 文件 / File | 加密 / Enc | 说明 / Description |
|
|
147
|
+
|------|------|------|
|
|
148
|
+
| `settings.internal.json` → `security`, `model` | ✔ | JSON 字段级提取 / Field-level extraction |
|
|
149
|
+
|
|
150
|
+
默认路径 / Default path:`~/.gemini/`
|
|
151
|
+
|
|
152
|
+
### Shared 共享层 / Shared Tier
|
|
153
|
+
|
|
154
|
+
| 内容 / Content | 说明 / Description |
|
|
155
|
+
|------|------|
|
|
156
|
+
| `shared/skills/` | 从 Claude 和 OpenClaw 的 skills 目录汇聚,自动分发 / Merged from all agents, auto-distributed |
|
|
157
|
+
| `shared/mcp/` | 从各 agent 提取 MCP 配置,跨 agent 共享 / Extracted MCP configs, shared across agents |
|
|
158
|
+
| `shared/memory/SHARED.md` | 跨 agent 共享记忆(加密)/ Cross-agent shared memory (encrypted) |
|
|
120
159
|
|
|
121
160
|
---
|
|
122
161
|
|
|
123
|
-
## 配置文件
|
|
162
|
+
## 配置文件 / Configuration
|
|
124
163
|
|
|
125
164
|
配置位于 `~/.wangchuan/config.json`,示例见 [.wangchuan/config.example.json](.wangchuan/config.example.json)。
|
|
126
165
|
|
|
166
|
+
Config at `~/.wangchuan/config.json`, see [.wangchuan/config.example.json](.wangchuan/config.example.json) for example.
|
|
167
|
+
|
|
127
168
|
```jsonc
|
|
128
169
|
{
|
|
129
170
|
"repo": "git@github.com:yourname/your-brain.git",
|
|
130
171
|
"branch": "main",
|
|
131
172
|
"localRepoPath": "~/.wangchuan/repo",
|
|
132
173
|
"keyPath": "~/.wangchuan/master.key",
|
|
174
|
+
"version": 2,
|
|
133
175
|
"profiles": {
|
|
134
176
|
"default": {
|
|
135
177
|
"openclaw": { "enabled": true, "workspacePath": "~/.openclaw/workspace", ... },
|
|
136
|
-
"claude": { "enabled":
|
|
137
|
-
"gemini": { "enabled":
|
|
178
|
+
"claude": { "enabled": true, "workspacePath": "~/.claude-internal", ... },
|
|
179
|
+
"gemini": { "enabled": true, "workspacePath": "~/.gemini", ... }
|
|
138
180
|
}
|
|
181
|
+
},
|
|
182
|
+
"shared": {
|
|
183
|
+
"skills": { "sources": [{ "agent": "claude", "dir": "skills/" }, ...] },
|
|
184
|
+
"mcp": { "sources": [{ "agent": "claude", "src": ".claude.json", "field": "mcpServers" }, ...] },
|
|
185
|
+
"syncFiles": [...]
|
|
139
186
|
}
|
|
140
187
|
}
|
|
141
188
|
```
|
|
142
189
|
|
|
143
190
|
---
|
|
144
191
|
|
|
145
|
-
## 加密说明
|
|
192
|
+
## 加密说明 / Encryption
|
|
146
193
|
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
- **⚠️ master.key
|
|
194
|
+
- 算法 / Algorithm:**AES-256-GCM**(认证加密,防篡改 / Authenticated encryption, tamper-proof)
|
|
195
|
+
- 密钥 / Key:`~/.wangchuan/master.key`(32 字节,十六进制存储 / 32 bytes, hex-encoded)
|
|
196
|
+
- 密文格式 / Ciphertext format:`IV(12B) + AuthTag(16B) + CipherText`,Base64 编码后存储为 `.enc` 文件 / Base64-encoded `.enc` files
|
|
197
|
+
- **⚠️ master.key 丢失将无法解密历史配置,请做好备份 / Losing master.key means losing access to all encrypted history — back it up!**
|
|
151
198
|
|
|
152
199
|
---
|
|
153
200
|
|
|
@@ -155,52 +202,59 @@ wangchuan diff --agent gemini
|
|
|
155
202
|
|
|
156
203
|
将 `skill/` 目录注册为 OpenClaw Skill 后,即可在对话中直接说:
|
|
157
204
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
> "
|
|
161
|
-
> "
|
|
205
|
+
Register the `skill/` directory as an OpenClaw Skill, then invoke via conversation:
|
|
206
|
+
|
|
207
|
+
> "帮我拉取最新的 AI 配置" / "Pull the latest AI configs"
|
|
208
|
+
> "把修改推送一下,备注:更新项目记忆" / "Push changes with note: update project memory"
|
|
209
|
+
> "查看忘川状态" / "Check Wangchuan status"
|
|
210
|
+
> "列出所有托管文件" / "List all managed files"
|
|
162
211
|
|
|
163
212
|
---
|
|
164
213
|
|
|
165
|
-
## 安全规范
|
|
214
|
+
## 安全规范 / Security
|
|
166
215
|
|
|
167
|
-
1. `master.key` 已加入 `.gitignore`,不会意外提交
|
|
168
|
-
2. 推送前自动扫描明文 token(`api_key`, `sk-xxx`, `password`
|
|
169
|
-
3. 若需迁移密钥,用加密方式传输(不要通过明文邮件/IM
|
|
216
|
+
1. `master.key` 已加入 `.gitignore`,不会意外提交 / Added to `.gitignore`, never accidentally committed
|
|
217
|
+
2. 推送前自动扫描明文 token(`api_key`, `sk-xxx`, `password` 等)/ Auto-scan for plaintext tokens before push
|
|
218
|
+
3. 若需迁移密钥,用加密方式传输(不要通过明文邮件/IM)/ Transfer keys via encrypted channels only (never plaintext email/IM)
|
|
170
219
|
|
|
171
220
|
---
|
|
172
221
|
|
|
173
|
-
## 目录结构
|
|
222
|
+
## 目录结构 / Project Structure
|
|
174
223
|
|
|
175
224
|
```
|
|
176
225
|
wangchuan/
|
|
177
|
-
├── bin/wangchuan.ts CLI 入口
|
|
226
|
+
├── bin/wangchuan.ts CLI 入口 / CLI entry
|
|
178
227
|
├── src/
|
|
179
228
|
│ ├── core/
|
|
180
|
-
│ │ ├── sync.ts 同步引擎
|
|
181
|
-
│ │ ├──
|
|
182
|
-
│ │ ├──
|
|
183
|
-
│ │
|
|
229
|
+
│ │ ├── sync.ts 同步引擎 / Sync engine (distribute, prune, 3-way ops)
|
|
230
|
+
│ │ ├── json-field.ts JSON 字段级提取与合并 / JSON field extraction & merge
|
|
231
|
+
│ │ ├── crypto.ts AES-256-GCM 加解密 / AES-256-GCM encrypt/decrypt
|
|
232
|
+
│ │ ├── git.ts simple-git 封装 / simple-git wrapper
|
|
233
|
+
│ │ ├── config.ts 配置管理 / Config management (v2 profiles + shared)
|
|
234
|
+
│ │ └── migrate.ts v1→v2 迁移 / v1→v2 migration (backup + lock + rollback)
|
|
184
235
|
│ ├── commands/
|
|
185
|
-
│ │ ├── init.ts init
|
|
186
|
-
│ │ ├── pull.ts pull
|
|
187
|
-
│ │ ├── push.ts push
|
|
188
|
-
│ │ ├── status.ts status
|
|
189
|
-
│ │ ├── diff.ts diff
|
|
190
|
-
│ │
|
|
236
|
+
│ │ ├── init.ts 初始化命令 / init command
|
|
237
|
+
│ │ ├── pull.ts 拉取命令 / pull command (with localOnly detection)
|
|
238
|
+
│ │ ├── push.ts 推送命令 / push command (with stale file cleanup)
|
|
239
|
+
│ │ ├── status.ts 状态命令 / status command
|
|
240
|
+
│ │ ├── diff.ts 差异命令 / diff command
|
|
241
|
+
│ │ ├── list.ts 清单命令 / list command (shared/agents grouping)
|
|
242
|
+
│ │ └── dump.ts 明文快照 / dump command (plaintext snapshot)
|
|
191
243
|
│ ├── utils/
|
|
192
|
-
│ │ ├── logger.ts 日志工具
|
|
193
|
-
│ │ ├── validator.ts 参数校验
|
|
194
|
-
│ │ ├── linediff.ts LCS 行级差异算法
|
|
195
|
-
│ │ └── prompt.ts 交互式冲突提示
|
|
196
|
-
│ └── types.ts 全局类型定义
|
|
244
|
+
│ │ ├── logger.ts 日志工具 / Logger
|
|
245
|
+
│ │ ├── validator.ts 参数校验 / Validator
|
|
246
|
+
│ │ ├── linediff.ts LCS 行级差异算法 / LCS line diff
|
|
247
|
+
│ │ └── prompt.ts 交互式冲突提示 / Interactive conflict prompt
|
|
248
|
+
│ └── types.ts 全局类型定义 / Global type definitions
|
|
197
249
|
├── skill/
|
|
198
|
-
│ ├── SKILL.md OpenClaw Skill 说明
|
|
199
|
-
│ └── wangchuan-skill.sh Skill 脚本
|
|
250
|
+
│ ├── SKILL.md OpenClaw Skill 说明 / OpenClaw Skill doc
|
|
251
|
+
│ └── wangchuan-skill.sh Skill 脚本 / Skill script
|
|
200
252
|
├── test/
|
|
201
|
-
│
|
|
253
|
+
│ ├── crypto.test.ts 加密模块测试 / Crypto tests
|
|
254
|
+
│ ├── json-field.test.ts JSON 字段提取测试 / JSON field tests
|
|
255
|
+
│ └── sync.test.ts 同步引擎测试(42 用例)/ Sync engine tests (42 cases)
|
|
202
256
|
└── .wangchuan/
|
|
203
|
-
└── config.example.json
|
|
257
|
+
└── config.example.json 配置示例(v2)/ Config example (v2)
|
|
204
258
|
```
|
|
205
259
|
|
|
206
260
|
---
|
package/dist/bin/wangchuan.js
CHANGED
|
@@ -12,6 +12,7 @@ import { cmdPush } from '../src/commands/push.js';
|
|
|
12
12
|
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
|
+
import { cmdDump } from '../src/commands/dump.js';
|
|
15
16
|
import { logger } from '../src/utils/logger.js';
|
|
16
17
|
const AGENT_CHOICES = ['openclaw', 'claude', 'gemini'];
|
|
17
18
|
/** 校验 --agent 值合法性 */
|
|
@@ -77,6 +78,14 @@ program
|
|
|
77
78
|
.action(async (opts) => {
|
|
78
79
|
await run(() => cmdList(opts));
|
|
79
80
|
});
|
|
81
|
+
// ── dump ────────────────────────────────────────────────────────
|
|
82
|
+
program
|
|
83
|
+
.command('dump')
|
|
84
|
+
.description('生成明文快照到临时目录,方便检查同步内容')
|
|
85
|
+
.option('-a, --agent <name>', '只导出指定智能体 (openclaw|claude|gemini)', parseAgent)
|
|
86
|
+
.action(async (opts) => {
|
|
87
|
+
await run(() => cmdDump(opts));
|
|
88
|
+
});
|
|
80
89
|
// ── 错误兜底 ────────────────────────────────────────────────────
|
|
81
90
|
async function run(fn) {
|
|
82
91
|
try {
|
|
@@ -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 +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;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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import { config } from '../core/config.js';
|
|
10
|
+
import { ensureMigrated } from '../core/migrate.js';
|
|
10
11
|
import { syncEngine } from '../core/sync.js';
|
|
11
12
|
import { cryptoEngine } from '../core/crypto.js';
|
|
12
13
|
import { validator } from '../utils/validator.js';
|
|
@@ -15,8 +16,9 @@ import { diffText } from '../utils/linediff.js';
|
|
|
15
16
|
import chalk from 'chalk';
|
|
16
17
|
export async function cmdDiff({ agent } = {}) {
|
|
17
18
|
logger.banner('忘川 · 文件差异');
|
|
18
|
-
|
|
19
|
+
let cfg = config.load();
|
|
19
20
|
validator.requireInit(cfg);
|
|
21
|
+
cfg = ensureMigrated(cfg);
|
|
20
22
|
const repoPath = syncEngine.expandHome(cfg.localRepoPath);
|
|
21
23
|
const keyPath = syncEngine.expandHome(cfg.keyPath);
|
|
22
24
|
const entries = syncEngine.buildFileEntries(cfg, undefined, agent);
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dump.ts — wangchuan dump 命令
|
|
3
|
+
*
|
|
4
|
+
* 在临时目录生成与 repo 完全同构的明文快照,
|
|
5
|
+
* 所有 .enc 加密文件自动解密,方便人工检查同步内容。
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentOptions } from '../types.js';
|
|
8
|
+
export declare function cmdDump({ agent }?: AgentOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=dump.d.ts.map
|
|
@@ -0,0 +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,CAwDzE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dump.ts — wangchuan dump 命令
|
|
3
|
+
*
|
|
4
|
+
* 在临时目录生成与 repo 完全同构的明文快照,
|
|
5
|
+
* 所有 .enc 加密文件自动解密,方便人工检查同步内容。
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { config } from '../core/config.js';
|
|
11
|
+
import { ensureMigrated } from '../core/migrate.js';
|
|
12
|
+
import { expandHome, buildFileEntries } from '../core/sync.js';
|
|
13
|
+
import { jsonField } from '../core/json-field.js';
|
|
14
|
+
import { validator } from '../utils/validator.js';
|
|
15
|
+
import { logger } from '../utils/logger.js';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
export async function cmdDump({ agent } = {}) {
|
|
18
|
+
logger.banner('忘川 · 明文快照');
|
|
19
|
+
let cfg = config.load();
|
|
20
|
+
validator.requireInit(cfg);
|
|
21
|
+
cfg = ensureMigrated(cfg);
|
|
22
|
+
const keyPath = expandHome(cfg.keyPath);
|
|
23
|
+
const entries = buildFileEntries(cfg, undefined, agent);
|
|
24
|
+
// 创建临时目录
|
|
25
|
+
const dumpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wangchuan-dump-'));
|
|
26
|
+
let count = 0;
|
|
27
|
+
let skipped = 0;
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
if (!fs.existsSync(entry.srcAbs)) {
|
|
30
|
+
skipped++;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// 输出路径:用 plainRel(不带 .enc 后缀)
|
|
34
|
+
const destPath = path.join(dumpDir, entry.plainRel);
|
|
35
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
36
|
+
if (entry.jsonExtract) {
|
|
37
|
+
// JSON 字段提取 → 写入提取后的 JSON
|
|
38
|
+
try {
|
|
39
|
+
const fullJson = JSON.parse(fs.readFileSync(entry.srcAbs, 'utf-8'));
|
|
40
|
+
const partial = jsonField.extractFields(fullJson, entry.jsonExtract.fields);
|
|
41
|
+
fs.writeFileSync(destPath, JSON.stringify(partial, null, 2), 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
logger.warn(`跳过 JSON 字段提取(解析失败): ${entry.srcAbs}`);
|
|
45
|
+
skipped++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// 整文件 → 直接复制明文
|
|
51
|
+
fs.copyFileSync(entry.srcAbs, destPath);
|
|
52
|
+
}
|
|
53
|
+
const labels = [];
|
|
54
|
+
if (entry.encrypt)
|
|
55
|
+
labels.push(chalk.gray('[原文件加密]'));
|
|
56
|
+
if (entry.jsonExtract)
|
|
57
|
+
labels.push(chalk.blue('[字段提取]'));
|
|
58
|
+
console.log(` ${chalk.green('✔')} ${entry.plainRel} ${labels.join('')}`);
|
|
59
|
+
count++;
|
|
60
|
+
}
|
|
61
|
+
console.log();
|
|
62
|
+
console.log(chalk.bold(` 输出目录:`) + chalk.cyan(dumpDir));
|
|
63
|
+
console.log(chalk.bold(` 文件数量:`) + `${count} 个文件` + (skipped > 0 ? chalk.gray(` (${skipped} 个跳过)`) : ''));
|
|
64
|
+
console.log();
|
|
65
|
+
console.log(chalk.gray(` 提示:该目录包含明文敏感信息,查看后请及时删除`));
|
|
66
|
+
console.log(chalk.gray(` rm -rf ${dumpDir}`));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=dump.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump.js","sourceRoot":"","sources":["../../../src/commands/dump.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAQH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAUpE,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDxE"}
|