wangchuan 5.3.0 → 5.6.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 (75) hide show
  1. package/.wangchuan/config.example.json +1 -1
  2. package/README.md +46 -10
  3. package/README.zh-CN.md +46 -10
  4. package/dist/bin/wangchuan.js +1 -1
  5. package/dist/src/agents/claude.d.ts.map +1 -1
  6. package/dist/src/agents/claude.js +5 -0
  7. package/dist/src/agents/claude.js.map +1 -1
  8. package/dist/src/agents/codebuddy.d.ts.map +1 -1
  9. package/dist/src/agents/codebuddy.js +2 -1
  10. package/dist/src/agents/codebuddy.js.map +1 -1
  11. package/dist/src/agents/codex.d.ts.map +1 -1
  12. package/dist/src/agents/codex.js +5 -0
  13. package/dist/src/agents/codex.js.map +1 -1
  14. package/dist/src/agents/cursor.d.ts.map +1 -1
  15. package/dist/src/agents/cursor.js +4 -1
  16. package/dist/src/agents/cursor.js.map +1 -1
  17. package/dist/src/agents/gemini.d.ts.map +1 -1
  18. package/dist/src/agents/gemini.js +4 -0
  19. package/dist/src/agents/gemini.js.map +1 -1
  20. package/dist/src/agents/workbuddy.d.ts.map +1 -1
  21. package/dist/src/agents/workbuddy.js +6 -1
  22. package/dist/src/agents/workbuddy.js.map +1 -1
  23. package/dist/src/commands/env.js +4 -0
  24. package/dist/src/commands/env.js.map +1 -1
  25. package/dist/src/commands/init.d.ts.map +1 -1
  26. package/dist/src/commands/init.js +67 -22
  27. package/dist/src/commands/init.js.map +1 -1
  28. package/dist/src/commands/snapshot.d.ts.map +1 -1
  29. package/dist/src/commands/snapshot.js +7 -1
  30. package/dist/src/commands/snapshot.js.map +1 -1
  31. package/dist/src/commands/watch.js +1 -1
  32. package/dist/src/commands/watch.js.map +1 -1
  33. package/dist/src/core/config.js +1 -1
  34. package/dist/src/core/config.js.map +1 -1
  35. package/dist/src/core/crypto.d.ts.map +1 -1
  36. package/dist/src/core/crypto.js +3 -2
  37. package/dist/src/core/crypto.js.map +1 -1
  38. package/dist/src/core/migrate.d.ts.map +1 -1
  39. package/dist/src/core/migrate.js +69 -8
  40. package/dist/src/core/migrate.js.map +1 -1
  41. package/dist/src/core/sync-restore.d.ts +19 -0
  42. package/dist/src/core/sync-restore.d.ts.map +1 -0
  43. package/dist/src/core/sync-restore.js +339 -0
  44. package/dist/src/core/sync-restore.js.map +1 -0
  45. package/dist/src/core/sync-shared.d.ts +30 -0
  46. package/dist/src/core/sync-shared.d.ts.map +1 -0
  47. package/dist/src/core/sync-shared.js +397 -0
  48. package/dist/src/core/sync-shared.js.map +1 -0
  49. package/dist/src/core/sync-stage.d.ts +57 -0
  50. package/dist/src/core/sync-stage.d.ts.map +1 -0
  51. package/dist/src/core/sync-stage.js +429 -0
  52. package/dist/src/core/sync-stage.js.map +1 -0
  53. package/dist/src/core/sync.d.ts +22 -46
  54. package/dist/src/core/sync.d.ts.map +1 -1
  55. package/dist/src/core/sync.js +64 -1267
  56. package/dist/src/core/sync.js.map +1 -1
  57. package/dist/src/i18n.d.ts.map +1 -1
  58. package/dist/src/i18n.js +31 -2
  59. package/dist/src/i18n.js.map +1 -1
  60. package/dist/test/crypto.test.js +2 -2
  61. package/dist/test/crypto.test.js.map +1 -1
  62. package/dist/test/git.test.d.ts +5 -0
  63. package/dist/test/git.test.d.ts.map +1 -0
  64. package/dist/test/git.test.js +90 -0
  65. package/dist/test/git.test.js.map +1 -0
  66. package/dist/test/migrate.test.d.ts +9 -0
  67. package/dist/test/migrate.test.d.ts.map +1 -0
  68. package/dist/test/migrate.test.js +133 -0
  69. package/dist/test/migrate.test.js.map +1 -0
  70. package/dist/test/sync-lock.test.d.ts +5 -0
  71. package/dist/test/sync-lock.test.d.ts.map +1 -0
  72. package/dist/test/sync-lock.test.js +94 -0
  73. package/dist/test/sync-lock.test.js.map +1 -0
  74. package/package.json +2 -2
  75. package/skill/SKILL.md +81 -9
@@ -0,0 +1,397 @@
1
+ /**
2
+ * sync-shared.ts — Cross-agent sharing distribution logic
3
+ *
4
+ * Handles distribution of skills, MCP configs, and custom agents between agents.
5
+ * Manages pending distributions and deletions for user confirmation.
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import os from 'os';
10
+ import { expandHome, walkDir } from './sync.js';
11
+ import { logger } from '../utils/logger.js';
12
+ import { t } from '../i18n.js';
13
+ const PENDING_DELETIONS_PATH = path.join(os.homedir(), '.wangchuan', 'pending-deletions.json');
14
+ const PENDING_DISTRIBUTIONS_PATH = path.join(os.homedir(), '.wangchuan', 'pending-distributions.json');
15
+ // ── Pending deletions ──────────────────────────────────────────────
16
+ /** Save pending deletions for later user confirmation */
17
+ export function savePendingDeletions(files) {
18
+ const existing = loadPendingDeletions();
19
+ const merged = [...new Set([...existing, ...files])];
20
+ fs.mkdirSync(path.dirname(PENDING_DELETIONS_PATH), { recursive: true });
21
+ fs.writeFileSync(PENDING_DELETIONS_PATH, JSON.stringify(merged, null, 2), 'utf-8');
22
+ }
23
+ /** Load pending deletions */
24
+ export function loadPendingDeletions() {
25
+ try {
26
+ if (!fs.existsSync(PENDING_DELETIONS_PATH))
27
+ return [];
28
+ return JSON.parse(fs.readFileSync(PENDING_DELETIONS_PATH, 'utf-8'));
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ }
34
+ /** Clear pending deletions after confirmation */
35
+ export function clearPendingDeletions() {
36
+ try {
37
+ if (fs.existsSync(PENDING_DELETIONS_PATH))
38
+ fs.unlinkSync(PENDING_DELETIONS_PATH);
39
+ }
40
+ catch { /* */ }
41
+ }
42
+ // ── Pending distributions ──────────────────────────────────────────
43
+ /** Merge pending distribution items with same kind/action/relFile by combining targetAgents */
44
+ function mergePendingItems(items) {
45
+ const map = new Map();
46
+ for (const item of items) {
47
+ const key = `${item.kind}:${item.action}:${item.relFile}:${item.sourceAgent}`;
48
+ const existing = map.get(key);
49
+ if (existing) {
50
+ for (const t of item.targetAgents) {
51
+ if (!existing.targetAgents.includes(t))
52
+ existing.targetAgents.push(t);
53
+ }
54
+ }
55
+ else {
56
+ map.set(key, { ...item, targetAgents: [...item.targetAgents] });
57
+ }
58
+ }
59
+ return [...map.values()];
60
+ }
61
+ /** Save pending distributions for user confirmation */
62
+ function savePendingDistributions(items) {
63
+ fs.mkdirSync(path.dirname(PENDING_DISTRIBUTIONS_PATH), { recursive: true });
64
+ fs.writeFileSync(PENDING_DISTRIBUTIONS_PATH, JSON.stringify(items, null, 2), 'utf-8');
65
+ }
66
+ /** Load pending distributions */
67
+ export function loadPendingDistributions() {
68
+ try {
69
+ if (!fs.existsSync(PENDING_DISTRIBUTIONS_PATH))
70
+ return [];
71
+ return JSON.parse(fs.readFileSync(PENDING_DISTRIBUTIONS_PATH, 'utf-8'));
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ }
77
+ /** Clear pending distributions after processing */
78
+ export function clearPendingDistributions() {
79
+ try {
80
+ if (fs.existsSync(PENDING_DISTRIBUTIONS_PATH))
81
+ fs.unlinkSync(PENDING_DISTRIBUTIONS_PATH);
82
+ }
83
+ catch { /* */ }
84
+ }
85
+ // ── Shared distribution logic ──────────────────────────────────────
86
+ /**
87
+ * Aggregate resources (skills or custom agents) from multiple agent sources.
88
+ * Returns a merged map (relPath → absPath of newest version) and an ownership map (relPath → set of agents).
89
+ */
90
+ function aggregateResources(sources, profiles) {
91
+ const perAgent = new Map();
92
+ for (const source of sources) {
93
+ const p = profiles[source.agent];
94
+ if (!p?.enabled)
95
+ continue;
96
+ const dir = path.join(expandHome(p.workspacePath), source.dir);
97
+ const files = new Map();
98
+ if (fs.existsSync(dir)) {
99
+ for (const relFile of walkDir(dir)) {
100
+ if (path.basename(relFile).startsWith('.'))
101
+ continue;
102
+ files.set(relFile, path.join(dir, relFile));
103
+ }
104
+ }
105
+ perAgent.set(source.agent, files);
106
+ }
107
+ const allFiles = new Map();
108
+ const allMtimes = new Map();
109
+ const allOwner = new Map();
110
+ for (const [agentName, files] of perAgent) {
111
+ for (const [rel, abs] of files) {
112
+ try {
113
+ const mtime = fs.statSync(abs).mtimeMs;
114
+ if (!allFiles.has(rel) || mtime > allMtimes.get(rel)) {
115
+ allFiles.set(rel, abs);
116
+ allMtimes.set(rel, mtime);
117
+ allOwner.set(rel, agentName);
118
+ }
119
+ }
120
+ catch {
121
+ if (!allFiles.has(rel)) {
122
+ allFiles.set(rel, abs);
123
+ allOwner.set(rel, agentName);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ const agentHas = new Map();
129
+ for (const [agentName, files] of perAgent) {
130
+ for (const rel of files.keys()) {
131
+ if (!agentHas.has(rel))
132
+ agentHas.set(rel, new Set());
133
+ agentHas.get(rel).add(agentName);
134
+ }
135
+ }
136
+ const allSourceAgents = sources
137
+ .map(s => s.agent)
138
+ .filter(a => {
139
+ const p = profiles[a];
140
+ return p?.enabled === true;
141
+ });
142
+ return { allFiles, allOwner, agentHas, allSourceAgents, perAgent };
143
+ }
144
+ /**
145
+ * Detect pending distributions for a resource type (skills or agents).
146
+ * Returns pending items without executing them.
147
+ */
148
+ function detectResourceDistributions(kind, sources, profiles) {
149
+ const { allFiles, allOwner, agentHas, allSourceAgents, perAgent: _perAgent } = aggregateResources(sources, profiles);
150
+ const items = [];
151
+ for (const [relFile, srcAbs] of allFiles) {
152
+ const owners = agentHas.get(relFile) ?? new Set();
153
+ const sourceAgent = allOwner.get(relFile) ?? '';
154
+ for (const targetAgent of allSourceAgents) {
155
+ if (targetAgent === sourceAgent)
156
+ continue;
157
+ const targetHasIt = owners.has(targetAgent);
158
+ const targetDir = path.join(expandHome(profiles[targetAgent].workspacePath), sources.find(s => s.agent === targetAgent).dir);
159
+ const targetPath = path.join(targetDir, relFile);
160
+ if (!targetHasIt) {
161
+ if (owners.size === 1) {
162
+ items.push({ kind, action: 'add', relFile, sourceAgent, targetAgents: [targetAgent], sourceAbs: srcAbs });
163
+ }
164
+ }
165
+ else {
166
+ if (path.resolve(targetPath) === path.resolve(srcAbs))
167
+ continue;
168
+ try {
169
+ if (fs.readFileSync(targetPath).equals(fs.readFileSync(srcAbs)))
170
+ continue;
171
+ }
172
+ catch { /* fall through */ }
173
+ items.push({ kind, action: 'update', relFile, sourceAgent, targetAgents: [targetAgent], sourceAbs: srcAbs });
174
+ }
175
+ }
176
+ }
177
+ // Detect delete cases
178
+ for (const [relFile, owners] of agentHas) {
179
+ const missingFrom = allSourceAgents.filter(a => !owners.has(a));
180
+ if (missingFrom.length > 0 && owners.size > 1) {
181
+ const srcAgent = [...owners][0];
182
+ const srcAbs = allFiles.get(relFile) ?? '';
183
+ for (const target of missingFrom) {
184
+ items.push({ kind, action: 'delete', relFile, sourceAgent: srcAgent, targetAgents: [target], sourceAbs: srcAbs });
185
+ }
186
+ }
187
+ }
188
+ return items;
189
+ }
190
+ /**
191
+ * Distribute shared content (skills, MCP configs, custom agents) to each agent's local directory.
192
+ * Skills and custom agents: collect pending distributions for user confirmation (no files written).
193
+ * MCP configs: distributed automatically (low-risk config merges).
194
+ * Called before push to prepare cross-agent sharing.
195
+ */
196
+ export function distributeShared(cfg) {
197
+ const shared = cfg.shared;
198
+ if (!shared)
199
+ return;
200
+ const profiles = cfg.profiles.default;
201
+ const pendingItems = [];
202
+ // ── Skills: collect pending distributions (no file writes) ──────
203
+ pendingItems.push(...detectResourceDistributions('skill', shared.skills.sources, profiles));
204
+ // ── Distribute MCP configs: automatic (unchanged) ──────────────
205
+ const mergedMcp = {};
206
+ const mcpMtimes = {};
207
+ for (const source of shared.mcp.sources) {
208
+ const p = profiles[source.agent];
209
+ if (!p.enabled)
210
+ continue;
211
+ const srcPath = path.join(expandHome(p.workspacePath), source.src);
212
+ if (!fs.existsSync(srcPath))
213
+ continue;
214
+ try {
215
+ const mtime = fs.statSync(srcPath).mtimeMs;
216
+ const json = JSON.parse(fs.readFileSync(srcPath, 'utf-8'));
217
+ const mcpField = json[source.field];
218
+ if (mcpField && typeof mcpField === 'object') {
219
+ for (const [key, val] of Object.entries(mcpField)) {
220
+ if (!(key in mergedMcp) || mtime > (mcpMtimes[key] ?? 0)) {
221
+ mergedMcp[key] = val;
222
+ mcpMtimes[key] = mtime;
223
+ }
224
+ }
225
+ }
226
+ }
227
+ catch { /* ignore parse failures */ }
228
+ }
229
+ if (Object.keys(mergedMcp).length > 0) {
230
+ for (const source of shared.mcp.sources) {
231
+ const p = profiles[source.agent];
232
+ if (!p.enabled)
233
+ continue;
234
+ const srcPath = path.join(expandHome(p.workspacePath), source.src);
235
+ try {
236
+ let json = {};
237
+ if (fs.existsSync(srcPath)) {
238
+ json = JSON.parse(fs.readFileSync(srcPath, 'utf-8'));
239
+ }
240
+ const currentMcp = (json[source.field] ?? {});
241
+ let changed = false;
242
+ for (const [key, val] of Object.entries(mergedMcp)) {
243
+ if (!(key in currentMcp)) {
244
+ currentMcp[key] = val;
245
+ changed = true;
246
+ }
247
+ else if (JSON.stringify(currentMcp[key]) !== JSON.stringify(val)) {
248
+ currentMcp[key] = val;
249
+ changed = true;
250
+ }
251
+ }
252
+ if (changed) {
253
+ json[source.field] = currentMcp;
254
+ fs.mkdirSync(path.dirname(srcPath), { recursive: true });
255
+ fs.writeFileSync(srcPath, JSON.stringify(json, null, 2), 'utf-8');
256
+ logger.debug(` ${t('sync.distributeMcp', { agent: source.agent })}`);
257
+ }
258
+ }
259
+ catch { /* ignore */ }
260
+ }
261
+ }
262
+ // ── Custom agents: collect pending distributions (no file writes) ──
263
+ if (shared.agents && shared.agents.sources.length > 0) {
264
+ pendingItems.push(...detectResourceDistributions('agent', shared.agents.sources, profiles));
265
+ }
266
+ // ── Write pending distributions if any ──────────────────────────
267
+ if (pendingItems.length > 0) {
268
+ const merged = mergePendingItems(pendingItems);
269
+ savePendingDistributions(merged);
270
+ }
271
+ }
272
+ /**
273
+ * Process pending distributions interactively.
274
+ * Groups by relFile, prompts user for each, executes the chosen actions.
275
+ */
276
+ export async function processPendingDistributions(cfg) {
277
+ const pending = loadPendingDistributions();
278
+ if (pending.length === 0)
279
+ return;
280
+ const shared = cfg.shared;
281
+ if (!shared) {
282
+ clearPendingDistributions();
283
+ return;
284
+ }
285
+ // Group by kind + relFile
286
+ const grouped = new Map();
287
+ for (const item of pending) {
288
+ const key = `${item.kind}:${item.relFile}`;
289
+ if (!grouped.has(key))
290
+ grouped.set(key, []);
291
+ grouped.get(key).push(item);
292
+ }
293
+ logger.info(t('sync.pendingDistributions', { count: pending.length }));
294
+ const rl = await import('readline');
295
+ for (const [, items] of grouped) {
296
+ const first = items[0];
297
+ const allTargets = [...new Set(items.flatMap(i => [...i.targetAgents]))];
298
+ console.log();
299
+ logger.info(t('sync.distItem', {
300
+ kind: first.kind,
301
+ action: first.action,
302
+ file: first.relFile,
303
+ source: first.sourceAgent,
304
+ }));
305
+ logger.info(t('sync.distPrompt'));
306
+ const choices = [];
307
+ choices.push(`[0] ${t('sync.distAll')} (${allTargets.join(', ')})`);
308
+ for (let i = 0; i < allTargets.length; i++) {
309
+ choices.push(`[${i + 1}] ${allTargets[i]}`);
310
+ }
311
+ choices.push(`[${allTargets.length + 1}] ${t('sync.distNone')}`);
312
+ for (const c of choices)
313
+ console.log(` ${c}`);
314
+ const iface = rl.createInterface({ input: process.stdin, output: process.stdout });
315
+ const answer = await new Promise(resolve => {
316
+ iface.question(t('sync.distInputPrompt'), (ans) => { iface.close(); resolve(ans.trim()); });
317
+ });
318
+ const indices = answer.split(/[,\s]+/).map(s => parseInt(s, 10)).filter(n => !isNaN(n));
319
+ let selectedAgents = [];
320
+ if (indices.includes(0)) {
321
+ selectedAgents = [...allTargets];
322
+ }
323
+ else if (indices.includes(allTargets.length + 1)) {
324
+ selectedAgents = [];
325
+ }
326
+ else {
327
+ selectedAgents = indices
328
+ .filter(i => i > 0 && i <= allTargets.length)
329
+ .map(i => allTargets[i - 1])
330
+ .filter((a) => a !== undefined);
331
+ }
332
+ for (const targetAgent of selectedAgents) {
333
+ for (const item of items) {
334
+ if (!item.targetAgents.includes(targetAgent))
335
+ continue;
336
+ executeDistribution(item, targetAgent, cfg);
337
+ }
338
+ }
339
+ if (selectedAgents.length === 0) {
340
+ logger.info(t('sync.distSkipped'));
341
+ }
342
+ }
343
+ clearPendingDistributions();
344
+ }
345
+ /** Execute a single distribution action for a target agent */
346
+ function executeDistribution(item, targetAgent, cfg) {
347
+ const profiles = cfg.profiles.default;
348
+ const shared = cfg.shared;
349
+ if (!shared)
350
+ return;
351
+ const p = profiles[targetAgent];
352
+ if (!p)
353
+ return;
354
+ let targetDir;
355
+ if (item.kind === 'skill') {
356
+ const source = shared.skills.sources.find(s => s.agent === targetAgent);
357
+ if (!source)
358
+ return;
359
+ targetDir = path.join(expandHome(p.workspacePath), source.dir);
360
+ }
361
+ else {
362
+ const source = shared.agents?.sources.find(s => s.agent === targetAgent);
363
+ if (!source)
364
+ return;
365
+ targetDir = path.join(expandHome(p.workspacePath), source.dir);
366
+ }
367
+ const targetPath = path.join(targetDir, item.relFile);
368
+ if (item.action === 'delete') {
369
+ if (fs.existsSync(targetPath)) {
370
+ fs.unlinkSync(targetPath);
371
+ let dir = path.dirname(targetPath);
372
+ while (dir !== targetDir && dir.startsWith(targetDir)) {
373
+ try {
374
+ const remaining = fs.readdirSync(dir);
375
+ if (remaining.length === 0) {
376
+ fs.rmdirSync(dir);
377
+ dir = path.dirname(dir);
378
+ }
379
+ else
380
+ break;
381
+ }
382
+ catch {
383
+ break;
384
+ }
385
+ }
386
+ logger.ok(` ${t('sync.distApplied', { action: 'delete', file: item.relFile, agent: targetAgent })}`);
387
+ }
388
+ }
389
+ else {
390
+ if (!fs.existsSync(item.sourceAbs))
391
+ return;
392
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
393
+ fs.copyFileSync(item.sourceAbs, targetPath);
394
+ logger.ok(` ${t('sync.distApplied', { action: item.action, file: item.relFile, agent: targetAgent })}`);
395
+ }
396
+ }
397
+ //# sourceMappingURL=sync-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-shared.js","sourceRoot":"","sources":["../../../src/core/sync-shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * sync-stage.ts — Push direction: workspace → local repo directory
3
+ *
4
+ * Handles file staging, encryption change detection, integrity checksums,
5
+ * key fingerprint validation, sync metadata, and stale file detection.
6
+ */
7
+ import type { WangchuanConfig, FileEntry, StageResult, AgentName, FilterOptions } from '../types.js';
8
+ export interface SyncMeta {
9
+ readonly lastSyncAt: string;
10
+ readonly hostname: string;
11
+ readonly environment: string;
12
+ }
13
+ export declare function writeSyncMeta(repoPath: string, cfg: WangchuanConfig): void;
14
+ export declare function readSyncMeta(repoPath: string): SyncMeta | null;
15
+ export interface IntegrityManifest {
16
+ readonly generatedAt: string;
17
+ readonly checksums: Record<string, string>;
18
+ readonly plaintextHashes?: Record<string, string>;
19
+ }
20
+ /** Write integrity.json to repo root after staging */
21
+ export declare function writeIntegrity(repoPath: string, syncedFiles: readonly string[], plaintextHashes?: ReadonlyMap<string, string>): void;
22
+ /** Verify integrity.json checksums against repo files, return mismatched file list */
23
+ export declare function verifyIntegrity(repoPath: string): string[];
24
+ /** Read stored plaintext hashes from integrity.json (for fast change detection) */
25
+ export declare function readPlaintextHashes(repoPath: string): Map<string, string>;
26
+ /** Write the local key's SHA-256 fingerprint to the repo */
27
+ export declare function writeKeyFingerprint(repoPath: string, keyPath: string): void;
28
+ /** Verify the local key matches the fingerprint stored in the repo */
29
+ export declare function verifyKeyFingerprint(repoPath: string, keyPath: string): void;
30
+ /**
31
+ * Detect stale files in repo (present in repo but absent from current entries).
32
+ * Returns the list of stale repoRel paths WITHOUT deleting them.
33
+ */
34
+ export declare function detectStaleFiles(repoPath: string, entries: FileEntry[]): string[];
35
+ /**
36
+ * Actually delete stale files from repo (after user confirmation).
37
+ */
38
+ export declare function deleteStaleFiles(repoPath: string, staleFiles: string[]): void;
39
+ /** Log a colorized progress line for stage/restore operations */
40
+ export declare function logProgress(index: number, total: number, tag: 'enc' | 'field' | 'decrypted' | 'copy', filePath: string): void;
41
+ /** Check if a file's content matches a buffer (byte-equal for <64KB, SHA-256 for larger) */
42
+ export declare function contentUnchanged(existingPath: string, newContent: Buffer): boolean;
43
+ /**
44
+ * Check if an encrypted file's plaintext matches new plaintext content.
45
+ * Uses stored plaintext hashes for fast comparison (no decryption needed).
46
+ * Falls back to decrypt-compare when hashes are unavailable (backward compat).
47
+ */
48
+ export declare function encryptedPlaintextUnchanged(existingEncPath: string, newPlaintext: Buffer, keyPath: string, repoRel?: string, storedHashes?: ReadonlyMap<string, string>): boolean;
49
+ /** Load stage progress from previous interrupted push */
50
+ export declare function loadStageProgress(): Set<string>;
51
+ /** Clear stage progress on successful completion */
52
+ export declare function clearStageProgress(): void;
53
+ /**
54
+ * Push: distribute shared content to all agents, then collect files to repo.
55
+ */
56
+ export declare function stageToRepo(cfg: WangchuanConfig, agent?: AgentName | string, filter?: FilterOptions): Promise<StageResult>;
57
+ //# sourceMappingURL=sync-stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-stage.d.ts","sourceRoot":"","sources":["../../../src/core/sync-stage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,WAAW,EACX,SAAS,EACT,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAW1E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D;AAMD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AAQD,sDAAsD;AACtD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5C,IAAI,CAqBN;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B1D;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CASzE;AAWD,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAW3E;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAiB5E;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAiBjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAoB7E;AAID,iEAAiE;AACjE,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,EAC3C,QAAQ,EAAE,MAAM,GACf,IAAI,CAUN;AAID,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAQlF;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,OAAO,CAkBT;AAWD,yDAAyD;AACzD,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,CAAC,CAQ/C;AAeD,oDAAoD;AACpD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAID;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,EACpB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,EAC1B,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,CAAC,CA6JtB"}