wangchuan 1.0.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 (73) hide show
  1. package/.wangchuan/config.example.json +43 -0
  2. package/README.md +210 -0
  3. package/dist/bin/wangchuan.d.ts +9 -0
  4. package/dist/bin/wangchuan.d.ts.map +1 -0
  5. package/dist/bin/wangchuan.js +93 -0
  6. package/dist/bin/wangchuan.js.map +1 -0
  7. package/dist/src/commands/diff.d.ts +9 -0
  8. package/dist/src/commands/diff.d.ts.map +1 -0
  9. package/dist/src/commands/diff.js +96 -0
  10. package/dist/src/commands/diff.js.map +1 -0
  11. package/dist/src/commands/init.d.ts +6 -0
  12. package/dist/src/commands/init.d.ts.map +1 -0
  13. package/dist/src/commands/init.js +49 -0
  14. package/dist/src/commands/init.js.map +1 -0
  15. package/dist/src/commands/list.d.ts +9 -0
  16. package/dist/src/commands/list.d.ts.map +1 -0
  17. package/dist/src/commands/list.js +45 -0
  18. package/dist/src/commands/list.js.map +1 -0
  19. package/dist/src/commands/pull.d.ts +6 -0
  20. package/dist/src/commands/pull.d.ts.map +1 -0
  21. package/dist/src/commands/pull.js +53 -0
  22. package/dist/src/commands/pull.js.map +1 -0
  23. package/dist/src/commands/push.d.ts +9 -0
  24. package/dist/src/commands/push.d.ts.map +1 -0
  25. package/dist/src/commands/push.js +72 -0
  26. package/dist/src/commands/push.js.map +1 -0
  27. package/dist/src/commands/status.d.ts +6 -0
  28. package/dist/src/commands/status.d.ts.map +1 -0
  29. package/dist/src/commands/status.js +86 -0
  30. package/dist/src/commands/status.js.map +1 -0
  31. package/dist/src/core/config.d.ts +27 -0
  32. package/dist/src/core/config.d.ts.map +1 -0
  33. package/dist/src/core/config.js +110 -0
  34. package/dist/src/core/config.js.map +1 -0
  35. package/dist/src/core/crypto.d.ts +24 -0
  36. package/dist/src/core/crypto.d.ts.map +1 -0
  37. package/dist/src/core/crypto.js +89 -0
  38. package/dist/src/core/crypto.js.map +1 -0
  39. package/dist/src/core/git.d.ts +18 -0
  40. package/dist/src/core/git.d.ts.map +1 -0
  41. package/dist/src/core/git.js +79 -0
  42. package/dist/src/core/git.js.map +1 -0
  43. package/dist/src/core/sync.d.ts +27 -0
  44. package/dist/src/core/sync.d.ts.map +1 -0
  45. package/dist/src/core/sync.js +253 -0
  46. package/dist/src/core/sync.js.map +1 -0
  47. package/dist/src/types.d.ts +95 -0
  48. package/dist/src/types.d.ts.map +1 -0
  49. package/dist/src/types.js +5 -0
  50. package/dist/src/types.js.map +1 -0
  51. package/dist/src/utils/linediff.d.ts +22 -0
  52. package/dist/src/utils/linediff.d.ts.map +1 -0
  53. package/dist/src/utils/linediff.js +80 -0
  54. package/dist/src/utils/linediff.js.map +1 -0
  55. package/dist/src/utils/logger.d.ts +13 -0
  56. package/dist/src/utils/logger.d.ts.map +1 -0
  57. package/dist/src/utils/logger.js +34 -0
  58. package/dist/src/utils/logger.js.map +1 -0
  59. package/dist/src/utils/prompt.d.ts +14 -0
  60. package/dist/src/utils/prompt.d.ts.map +1 -0
  61. package/dist/src/utils/prompt.js +37 -0
  62. package/dist/src/utils/prompt.js.map +1 -0
  63. package/dist/src/utils/validator.d.ts +17 -0
  64. package/dist/src/utils/validator.d.ts.map +1 -0
  65. package/dist/src/utils/validator.js +33 -0
  66. package/dist/src/utils/validator.js.map +1 -0
  67. package/dist/test/crypto.test.d.ts +5 -0
  68. package/dist/test/crypto.test.d.ts.map +1 -0
  69. package/dist/test/crypto.test.js +93 -0
  70. package/dist/test/crypto.test.js.map +1 -0
  71. package/package.json +56 -0
  72. package/skill/SKILL.md +67 -0
  73. package/skill/wangchuan-skill.sh +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/core/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * sync.ts — 同步引擎核心
3
+ *
4
+ * 三个方向:
5
+ * stageToRepo 工作区 → 本地仓库目录(推送前准备)
6
+ * restoreFromRepo 本地仓库目录 → 工作区(拉取后还原)
7
+ * diff 对比两侧,返回差异摘要
8
+ *
9
+ * 所有方法支持可选的 agent 过滤参数,只操作指定智能体的文件。
10
+ */
11
+ import type { WangchuanConfig, FileEntry, StageResult, RestoreResult, DiffResult, AgentName } from '../types.js';
12
+ export declare function expandHome(p: string): string;
13
+ /**
14
+ * 构建需要同步的文件条目列表(所有同步方向的单一事实来源)。
15
+ *
16
+ * @param repoDirBase 传入本地仓库根目录时,syncDirs 从仓库侧枚举(pull 方向)
17
+ * @param agent 只返回指定智能体的条目,undefined 表示全部
18
+ */
19
+ export declare function buildFileEntries(cfg: WangchuanConfig, repoDirBase?: string, agent?: AgentName): FileEntry[];
20
+ export declare const syncEngine: {
21
+ readonly expandHome: typeof expandHome;
22
+ readonly buildFileEntries: typeof buildFileEntries;
23
+ readonly stageToRepo: (cfg: WangchuanConfig, agent?: AgentName) => Promise<StageResult>;
24
+ readonly restoreFromRepo: (cfg: WangchuanConfig, agent?: AgentName) => Promise<RestoreResult>;
25
+ readonly diff: (cfg: WangchuanConfig, agent?: AgentName) => Promise<DiffResult>;
26
+ };
27
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/core/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5C;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,SAAS,GAChB,SAAS,EAAE,CAuEb;AAED,eAAO,MAAM,UAAU;;;gCAIE,eAAe,UAAU,SAAS,KAAG,OAAO,CAAC,WAAW,CAAC;oCAgCrD,eAAe,UAAU,SAAS,KAAG,OAAO,CAAC,aAAa,CAAC;yBAyEtE,eAAe,UAAU,SAAS,KAAG,OAAO,CAAC,UAAU,CAAC;CAgChE,CAAC"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * sync.ts — 同步引擎核心
3
+ *
4
+ * 三个方向:
5
+ * stageToRepo 工作区 → 本地仓库目录(推送前准备)
6
+ * restoreFromRepo 本地仓库目录 → 工作区(拉取后还原)
7
+ * diff 对比两侧,返回差异摘要
8
+ *
9
+ * 所有方法支持可选的 agent 过滤参数,只操作指定智能体的文件。
10
+ */
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import os from 'os';
14
+ import { cryptoEngine } from './crypto.js';
15
+ import { validator } from '../utils/validator.js';
16
+ import { logger } from '../utils/logger.js';
17
+ import { askConflict } from '../utils/prompt.js';
18
+ export function expandHome(p) {
19
+ if (p.startsWith('~'))
20
+ return path.join(os.homedir(), p.slice(1));
21
+ return p;
22
+ }
23
+ function walkDir(dirAbs) {
24
+ const results = [];
25
+ if (!fs.existsSync(dirAbs))
26
+ return results;
27
+ function walk(subPath) {
28
+ const full = path.join(dirAbs, subPath);
29
+ if (fs.statSync(full).isDirectory()) {
30
+ fs.readdirSync(full).forEach(f => walk(path.join(subPath, f)));
31
+ }
32
+ else {
33
+ results.push(subPath);
34
+ }
35
+ }
36
+ fs.readdirSync(dirAbs).forEach(f => walk(f));
37
+ return results;
38
+ }
39
+ /**
40
+ * 构建需要同步的文件条目列表(所有同步方向的单一事实来源)。
41
+ *
42
+ * @param repoDirBase 传入本地仓库根目录时,syncDirs 从仓库侧枚举(pull 方向)
43
+ * @param agent 只返回指定智能体的条目,undefined 表示全部
44
+ */
45
+ export function buildFileEntries(cfg, repoDirBase, agent) {
46
+ const entries = [];
47
+ const profile = cfg.profiles.default;
48
+ // ── OpenClaw ────────────────────────────────────────────────
49
+ if (profile.openclaw.enabled && (!agent || agent === 'openclaw')) {
50
+ const wsPath = expandHome(profile.openclaw.workspacePath);
51
+ for (const item of profile.openclaw.syncFiles) {
52
+ const suffix = item.encrypt ? '.enc' : '';
53
+ entries.push({
54
+ srcAbs: path.join(wsPath, item.src),
55
+ repoRel: path.join('openclaw', item.src + suffix),
56
+ plainRel: path.join('openclaw', item.src),
57
+ encrypt: item.encrypt,
58
+ agentName: 'openclaw',
59
+ });
60
+ }
61
+ for (const dir of profile.openclaw.syncDirs) {
62
+ const scanBase = repoDirBase
63
+ ? path.join(repoDirBase, 'openclaw', dir.src)
64
+ : path.join(wsPath, dir.src);
65
+ if (!fs.existsSync(scanBase))
66
+ continue;
67
+ for (const relFile of walkDir(scanBase)) {
68
+ const suffix = dir.encrypt ? '.enc' : '';
69
+ const plainFile = relFile.endsWith('.enc') ? relFile.slice(0, -4) : relFile;
70
+ entries.push({
71
+ srcAbs: path.join(wsPath, dir.src, plainFile),
72
+ repoRel: path.join('openclaw', dir.src, plainFile + suffix),
73
+ plainRel: path.join('openclaw', dir.src, plainFile),
74
+ encrypt: dir.encrypt,
75
+ agentName: 'openclaw',
76
+ });
77
+ }
78
+ }
79
+ }
80
+ // ── Claude ──────────────────────────────────────────────────
81
+ if (profile.claude.enabled && (!agent || agent === 'claude')) {
82
+ const wsPath = expandHome(profile.claude.workspacePath);
83
+ for (const item of profile.claude.syncFiles) {
84
+ const suffix = item.encrypt ? '.enc' : '';
85
+ entries.push({
86
+ srcAbs: path.join(wsPath, item.src),
87
+ repoRel: path.join('claude', item.src + suffix),
88
+ plainRel: path.join('claude', item.src),
89
+ encrypt: item.encrypt,
90
+ agentName: 'claude',
91
+ });
92
+ }
93
+ }
94
+ // ── Gemini ──────────────────────────────────────────────────
95
+ if (profile.gemini.enabled && (!agent || agent === 'gemini')) {
96
+ const wsPath = expandHome(profile.gemini.workspacePath);
97
+ for (const item of profile.gemini.syncFiles) {
98
+ const suffix = item.encrypt ? '.enc' : '';
99
+ entries.push({
100
+ srcAbs: path.join(wsPath, item.src),
101
+ repoRel: path.join('gemini', item.src + suffix),
102
+ plainRel: path.join('gemini', item.src),
103
+ encrypt: item.encrypt,
104
+ agentName: 'gemini',
105
+ });
106
+ }
107
+ }
108
+ return entries;
109
+ }
110
+ export const syncEngine = {
111
+ expandHome,
112
+ buildFileEntries,
113
+ async stageToRepo(cfg, agent) {
114
+ const repoPath = expandHome(cfg.localRepoPath);
115
+ const keyPath = expandHome(cfg.keyPath);
116
+ const entries = buildFileEntries(cfg, undefined, agent);
117
+ const result = { synced: [], skipped: [], encrypted: [] };
118
+ for (const entry of entries) {
119
+ if (!fs.existsSync(entry.srcAbs)) {
120
+ logger.debug(`跳过(不存在): ${entry.srcAbs}`);
121
+ result.skipped.push(entry.srcAbs);
122
+ continue;
123
+ }
124
+ if (!entry.encrypt) {
125
+ const content = fs.readFileSync(entry.srcAbs, 'utf-8');
126
+ if (validator.containsSensitiveData(content)) {
127
+ logger.warn(`⚠ 检测到疑似明文敏感信息: ${entry.srcAbs}`);
128
+ logger.warn(` 建议在配置中将该文件标记为 encrypt:true`);
129
+ }
130
+ }
131
+ const destAbs = path.join(repoPath, entry.repoRel);
132
+ fs.mkdirSync(path.dirname(destAbs), { recursive: true });
133
+ if (entry.encrypt) {
134
+ cryptoEngine.encryptFile(entry.srcAbs, destAbs, keyPath);
135
+ result.encrypted.push(entry.repoRel);
136
+ }
137
+ else {
138
+ fs.copyFileSync(entry.srcAbs, destAbs);
139
+ }
140
+ result.synced.push(entry.repoRel);
141
+ }
142
+ return result;
143
+ },
144
+ async restoreFromRepo(cfg, agent) {
145
+ const repoPath = expandHome(cfg.localRepoPath);
146
+ const keyPath = expandHome(cfg.keyPath);
147
+ const entries = buildFileEntries(cfg, repoPath, agent);
148
+ const result = { synced: [], skipped: [], decrypted: [], conflicts: [] };
149
+ // 批量决策:overwrite_all / skip_all
150
+ let batchDecision;
151
+ for (const entry of entries) {
152
+ const srcRepo = path.join(repoPath, entry.repoRel);
153
+ if (!fs.existsSync(srcRepo)) {
154
+ logger.debug(`跳过(仓库中不存在): ${entry.repoRel}`);
155
+ result.skipped.push(entry.repoRel);
156
+ continue;
157
+ }
158
+ // ── 冲突检测 ─────────────────────────────────────────────
159
+ if (fs.existsSync(entry.srcAbs)) {
160
+ let isDiff = false;
161
+ const localBuf = fs.readFileSync(entry.srcAbs);
162
+ if (entry.encrypt) {
163
+ try {
164
+ const decrypted = cryptoEngine.decryptString(fs.readFileSync(srcRepo, 'utf-8').trim(), keyPath);
165
+ isDiff = localBuf.toString('utf-8') !== decrypted;
166
+ }
167
+ catch {
168
+ isDiff = true;
169
+ }
170
+ }
171
+ else {
172
+ isDiff = !localBuf.equals(fs.readFileSync(srcRepo));
173
+ }
174
+ if (isDiff) {
175
+ result.conflicts.push(entry.repoRel);
176
+ // 已有批量决策则直接应用
177
+ if (batchDecision === 'skip_all') {
178
+ logger.info(` ↷ 跳过(保留本地): ${entry.repoRel}`);
179
+ result.skipped.push(entry.repoRel);
180
+ continue;
181
+ }
182
+ if (batchDecision === 'overwrite_all') {
183
+ // 继续走下方写入逻辑
184
+ }
185
+ else {
186
+ // 无批量决策,询问用户
187
+ const ans = await askConflict(entry.repoRel);
188
+ if (ans === 'skip' || ans === 'skip_all') {
189
+ if (ans === 'skip_all')
190
+ batchDecision = 'skip_all';
191
+ logger.info(` ↷ 跳过(保留本地): ${entry.repoRel}`);
192
+ result.skipped.push(entry.repoRel);
193
+ continue;
194
+ }
195
+ if (ans === 'overwrite_all')
196
+ batchDecision = 'overwrite_all';
197
+ // ans === 'overwrite' 或 'overwrite_all':继续走下方写入逻辑
198
+ }
199
+ }
200
+ }
201
+ // ── 写入文件 ──────────────────────────────────────────────
202
+ fs.mkdirSync(path.dirname(entry.srcAbs), { recursive: true });
203
+ if (entry.encrypt) {
204
+ cryptoEngine.decryptFile(srcRepo, entry.srcAbs, keyPath);
205
+ result.decrypted.push(entry.repoRel);
206
+ }
207
+ else {
208
+ fs.copyFileSync(srcRepo, entry.srcAbs);
209
+ }
210
+ result.synced.push(entry.srcAbs);
211
+ }
212
+ return result;
213
+ },
214
+ async diff(cfg, agent) {
215
+ const repoPath = expandHome(cfg.localRepoPath);
216
+ const keyPath = expandHome(cfg.keyPath);
217
+ const entries = buildFileEntries(cfg, undefined, agent);
218
+ const diff = { added: [], modified: [], missing: [] };
219
+ for (const entry of entries) {
220
+ const srcExists = fs.existsSync(entry.srcAbs);
221
+ const repoExists = fs.existsSync(path.join(repoPath, entry.repoRel));
222
+ if (!srcExists && !repoExists)
223
+ continue;
224
+ if (srcExists && !repoExists) {
225
+ diff.added.push(entry.repoRel);
226
+ continue;
227
+ }
228
+ if (!srcExists && repoExists) {
229
+ diff.missing.push(entry.repoRel);
230
+ continue;
231
+ }
232
+ const srcBuf = fs.readFileSync(entry.srcAbs);
233
+ const repoBuf = fs.readFileSync(path.join(repoPath, entry.repoRel));
234
+ if (entry.encrypt) {
235
+ try {
236
+ const decrypted = cryptoEngine.decryptString(repoBuf.toString('utf-8').trim(), keyPath);
237
+ if (srcBuf.toString('utf-8') !== decrypted) {
238
+ diff.modified.push(entry.repoRel);
239
+ }
240
+ }
241
+ catch {
242
+ diff.modified.push(entry.repoRel);
243
+ }
244
+ }
245
+ else {
246
+ if (!srcBuf.equals(repoBuf))
247
+ diff.modified.push(entry.repoRel);
248
+ }
249
+ }
250
+ return diff;
251
+ },
252
+ };
253
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/core/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * types.ts — 项目全局类型定义
3
+ */
4
+ export interface SyncFileEntry {
5
+ readonly src: string;
6
+ readonly encrypt: boolean;
7
+ }
8
+ export interface SyncDirEntry {
9
+ readonly src: string;
10
+ readonly encrypt: boolean;
11
+ }
12
+ export interface OpenclawProfile {
13
+ readonly enabled: boolean;
14
+ readonly workspacePath: string;
15
+ readonly syncFiles: readonly SyncFileEntry[];
16
+ readonly syncDirs: readonly SyncDirEntry[];
17
+ }
18
+ export interface ClaudeProfile {
19
+ readonly enabled: boolean;
20
+ /** 配置文件根目录,默认 ~/.claude */
21
+ readonly workspacePath: string;
22
+ readonly syncFiles: readonly SyncFileEntry[];
23
+ }
24
+ export interface GeminiProfile {
25
+ readonly enabled: boolean;
26
+ /** 配置文件根目录,默认 ~/.gemini */
27
+ readonly workspacePath: string;
28
+ readonly syncFiles: readonly SyncFileEntry[];
29
+ }
30
+ export interface AgentProfiles {
31
+ readonly openclaw: OpenclawProfile;
32
+ readonly claude: ClaudeProfile;
33
+ readonly gemini: GeminiProfile;
34
+ }
35
+ export interface WangchuanConfig {
36
+ readonly repo: string;
37
+ readonly branch: string;
38
+ readonly localRepoPath: string;
39
+ readonly keyPath: string;
40
+ readonly hostname: string;
41
+ readonly profiles: {
42
+ readonly default: AgentProfiles;
43
+ };
44
+ }
45
+ /** 支持过滤的智能体名称 */
46
+ export type AgentName = 'openclaw' | 'claude' | 'gemini';
47
+ /** 所有支持 --agent 过滤的命令共用此 mixin */
48
+ export interface AgentOptions {
49
+ readonly agent?: AgentName;
50
+ }
51
+ export interface FileEntry {
52
+ readonly srcAbs: string;
53
+ readonly repoRel: string;
54
+ readonly plainRel: string;
55
+ readonly encrypt: boolean;
56
+ /** 所属智能体,用于 --agent 过滤 */
57
+ readonly agentName: AgentName;
58
+ }
59
+ export interface StageResult {
60
+ readonly synced: string[];
61
+ readonly skipped: string[];
62
+ readonly encrypted: string[];
63
+ }
64
+ export interface RestoreResult {
65
+ readonly synced: string[];
66
+ readonly skipped: string[];
67
+ readonly decrypted: string[];
68
+ readonly conflicts: string[];
69
+ }
70
+ export interface DiffResult {
71
+ readonly added: string[];
72
+ readonly modified: string[];
73
+ readonly missing: string[];
74
+ }
75
+ export interface CommitResult {
76
+ readonly committed: boolean;
77
+ readonly pushed: boolean;
78
+ readonly sha?: string;
79
+ }
80
+ export interface InitOptions {
81
+ readonly repo: string;
82
+ readonly force?: boolean;
83
+ }
84
+ export interface PushOptions extends AgentOptions {
85
+ readonly message?: string;
86
+ }
87
+ export interface PullOptions extends AgentOptions {
88
+ }
89
+ export interface StatusOptions extends AgentOptions {
90
+ }
91
+ export interface DiffCommandOptions extends AgentOptions {
92
+ }
93
+ export interface ListOptions extends AgentOptions {
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * types.ts — 项目全局类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * linediff.ts — 行级 unified diff 工具(无外部依赖)
3
+ *
4
+ * 实现最长公共子序列(LCS)算法,输出人类可读的 unified diff 格式。
5
+ */
6
+ export interface DiffLine {
7
+ readonly type: 'context' | 'added' | 'removed';
8
+ readonly content: string;
9
+ }
10
+ export interface FileDiff {
11
+ readonly repoRel: string;
12
+ readonly isEncrypted: boolean;
13
+ readonly lines: readonly DiffLine[];
14
+ /** 两侧完全相同 */
15
+ readonly unchanged: boolean;
16
+ }
17
+ /**
18
+ * 对两段文本进行行级 diff,返回 DiffLine 列表。
19
+ * context 参数控制保留多少行上下文(默认 3 行)。
20
+ */
21
+ export declare function diffText(before: string, after: string, context?: number): DiffLine[];
22
+ //# sourceMappingURL=linediff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linediff.d.ts","sourceRoot":"","sources":["../../../src/utils/linediff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,aAAa;IACb,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AA+CD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,QAAQ,EAAE,CA+B/E"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * linediff.ts — 行级 unified diff 工具(无外部依赖)
3
+ *
4
+ * 实现最长公共子序列(LCS)算法,输出人类可读的 unified diff 格式。
5
+ */
6
+ /** 计算两个字符串数组的 LCS 回溯表 */
7
+ function buildLcsTable(a, b) {
8
+ const m = a.length;
9
+ const n = b.length;
10
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
11
+ for (let i = 1; i <= m; i++) {
12
+ for (let j = 1; j <= n; j++) {
13
+ dp[i][j] = a[i - 1] === b[j - 1]
14
+ ? (dp[i - 1][j - 1] + 1)
15
+ : Math.max(dp[i - 1][j], dp[i][j - 1]);
16
+ }
17
+ }
18
+ return dp;
19
+ }
20
+ /** 从 LCS 回溯表生成 diff 行列表 */
21
+ function traceback(dp, a, b, i, j, out) {
22
+ if (i === 0 && j === 0)
23
+ return;
24
+ if (i === 0) {
25
+ traceback(dp, a, b, 0, j - 1, out);
26
+ out.push({ type: 'added', content: b[j - 1] });
27
+ }
28
+ else if (j === 0) {
29
+ traceback(dp, a, b, i - 1, 0, out);
30
+ out.push({ type: 'removed', content: a[i - 1] });
31
+ }
32
+ else if (a[i - 1] === b[j - 1]) {
33
+ traceback(dp, a, b, i - 1, j - 1, out);
34
+ out.push({ type: 'context', content: a[i - 1] });
35
+ }
36
+ else if (dp[i - 1][j] >= dp[i][j - 1]) {
37
+ traceback(dp, a, b, i - 1, j, out);
38
+ out.push({ type: 'removed', content: a[i - 1] });
39
+ }
40
+ else {
41
+ traceback(dp, a, b, i, j - 1, out);
42
+ out.push({ type: 'added', content: b[j - 1] });
43
+ }
44
+ }
45
+ /**
46
+ * 对两段文本进行行级 diff,返回 DiffLine 列表。
47
+ * context 参数控制保留多少行上下文(默认 3 行)。
48
+ */
49
+ export function diffText(before, after, context = 3) {
50
+ const a = before.split('\n');
51
+ const b = after.split('\n');
52
+ const dp = buildLcsTable(a, b);
53
+ const all = [];
54
+ traceback(dp, a, b, a.length, b.length, all);
55
+ // 裁剪掉纯 context 区块中间的大段无变化行,只保留 context 行
56
+ const changed = all.map((l, i) => (l.type !== 'context' ? i : -1)).filter(i => i >= 0);
57
+ if (changed.length === 0)
58
+ return []; // 完全相同
59
+ const keepIdx = new Set();
60
+ for (const ci of changed) {
61
+ for (let d = -context; d <= context; d++) {
62
+ const idx = ci + d;
63
+ if (idx >= 0 && idx < all.length)
64
+ keepIdx.add(idx);
65
+ }
66
+ }
67
+ // 插入 "..." 省略标记(用 context 行表示)
68
+ const result = [];
69
+ let prevKept = -1;
70
+ const sorted = [...keepIdx].sort((a, b) => a - b);
71
+ for (const idx of sorted) {
72
+ if (prevKept >= 0 && idx - prevKept > 1) {
73
+ result.push({ type: 'context', content: '...' });
74
+ }
75
+ result.push(all[idx]);
76
+ prevKept = idx;
77
+ }
78
+ return result;
79
+ }
80
+ //# sourceMappingURL=linediff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linediff.js","sourceRoot":"","sources":["../../../src/utils/linediff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * logger.ts — 统一日志输出,支持着色与级别过滤
3
+ */
4
+ export declare const logger: {
5
+ readonly info: (...a: unknown[]) => void;
6
+ readonly ok: (...a: unknown[]) => void;
7
+ readonly warn: (...a: unknown[]) => void;
8
+ readonly error: (...a: unknown[]) => void;
9
+ readonly debug: (...a: unknown[]) => void;
10
+ readonly step: (...a: unknown[]) => void;
11
+ readonly banner: (text: string) => void;
12
+ };
13
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,eAAO,MAAM,MAAM;0BACH,OAAO,EAAE;wBACT,OAAO,EAAE;0BACT,OAAO,EAAE;2BACT,OAAO,EAAE;2BACT,OAAO,EAAE;0BACT,OAAO,EAAE;4BAEV,MAAM,KAAG,IAAI;CAKlB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * logger.ts — 统一日志输出,支持着色与级别过滤
3
+ */
4
+ import chalk from 'chalk';
5
+ const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
6
+ const rawLevel = process.env['WANGCHUAN_LOG_LEVEL'] ?? 'info';
7
+ const currentLevel = LEVELS[rawLevel] ?? LEVELS.info;
8
+ const prefix = {
9
+ info: chalk.cyan('ℹ'),
10
+ ok: chalk.green('✔'),
11
+ warn: chalk.yellow('⚠'),
12
+ error: chalk.red('✖'),
13
+ debug: chalk.gray('·'),
14
+ step: chalk.blue('›'),
15
+ };
16
+ function log(level, symbol, ...args) {
17
+ if (LEVELS[level] < currentLevel)
18
+ return;
19
+ console.log(symbol, ...args);
20
+ }
21
+ export const logger = {
22
+ info: (...a) => log('info', prefix['info'], ...a),
23
+ ok: (...a) => log('info', prefix['ok'], ...a),
24
+ warn: (...a) => log('warn', prefix['warn'], chalk.yellow(String(a[0])), ...a.slice(1)),
25
+ error: (...a) => log('error', prefix['error'], chalk.red(String(a[0])), ...a.slice(1)),
26
+ debug: (...a) => log('debug', prefix['debug'], chalk.gray(String(a[0])), ...a.slice(1)),
27
+ step: (...a) => log('info', prefix['step'], ...a),
28
+ banner(text) {
29
+ console.log();
30
+ console.log(chalk.bold.cyan(` ╔══ ${text} ══╗`));
31
+ console.log();
32
+ },
33
+ };
34
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAElF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC;AAC9D,MAAM,YAAY,GAAW,MAAM,CAAC,QAAoB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;AAEzE,MAAM,MAAM,GAA2B;IACrC,IAAI,EAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACtB,EAAE,EAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACvB,IAAI,EAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACtB,IAAI,EAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;CACvB,CAAC;AAEF,SAAS,GAAG,CAAC,KAAe,EAAE,MAAc,EAAE,GAAG,IAAe;IAC9D,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY;QAAE,OAAO;IACzC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAG,MAAM,CAAC,MAAM,CAAE,EAAG,GAAG,CAAC,CAAC;IAChE,EAAE,EAAK,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAG,MAAM,CAAC,IAAI,CAAE,EAAK,GAAG,CAAC,CAAC;IAChE,IAAI,EAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAG,MAAM,CAAC,MAAM,CAAE,EAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrG,KAAK,EAAE,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAE,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrG,KAAK,EAAE,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAE,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrG,IAAI,EAAG,CAAC,GAAG,CAAY,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAG,MAAM,CAAC,MAAM,CAAE,EAAG,GAAG,CAAC,CAAC;IAEhE,MAAM,CAAC,IAAY;QACjB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;CACO,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * prompt.ts — 交互式用户确认工具
3
+ *
4
+ * 提供单文件冲突提示和批量冲突策略选择,
5
+ * 支持 TTY 交互和 CI 非交互模式(环境变量 WANGCHUAN_NONINTERACTIVE=1)。
6
+ */
7
+ /** pull 时每个冲突文件的处理决策 */
8
+ export type ConflictDecision = 'overwrite' | 'skip' | 'overwrite_all' | 'skip_all';
9
+ /**
10
+ * 询问单个冲突文件的处理方式。
11
+ * 返回 overwrite_all / skip_all 时,调用方应将该策略用于后续所有冲突。
12
+ */
13
+ export declare function askConflict(repoRel: string): Promise<ConflictDecision>;
14
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,wBAAwB;AACxB,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,MAAM,GACN,eAAe,GACf,UAAU,CAAC;AAKf;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2B5E"}