pushwork 2.0.0-preview.2 → 2.0.0-preview.3

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 (131) hide show
  1. package/dist/cli/commands.d.ts +71 -0
  2. package/dist/cli/commands.d.ts.map +1 -0
  3. package/dist/cli/commands.js +794 -0
  4. package/dist/cli/commands.js.map +1 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +19 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli.js +54 -108
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands.d.ts +58 -0
  12. package/dist/commands.d.ts.map +1 -0
  13. package/dist/commands.js +975 -0
  14. package/dist/commands.js.map +1 -0
  15. package/dist/config/index.d.ts +71 -0
  16. package/dist/config/index.d.ts.map +1 -0
  17. package/dist/config/index.js +314 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/config.d.ts +1 -2
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +1 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/core/change-detection.d.ts +80 -0
  24. package/dist/core/change-detection.d.ts.map +1 -0
  25. package/dist/core/change-detection.js +560 -0
  26. package/dist/core/change-detection.js.map +1 -0
  27. package/dist/core/config.d.ts +81 -0
  28. package/dist/core/config.d.ts.map +1 -0
  29. package/dist/core/config.js +304 -0
  30. package/dist/core/config.js.map +1 -0
  31. package/dist/core/index.d.ts +6 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +22 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/move-detection.d.ts +34 -0
  36. package/dist/core/move-detection.d.ts.map +1 -0
  37. package/dist/core/move-detection.js +128 -0
  38. package/dist/core/move-detection.js.map +1 -0
  39. package/dist/core/snapshot.d.ts +105 -0
  40. package/dist/core/snapshot.d.ts.map +1 -0
  41. package/dist/core/snapshot.js +254 -0
  42. package/dist/core/snapshot.js.map +1 -0
  43. package/dist/core/sync-engine.d.ts +177 -0
  44. package/dist/core/sync-engine.d.ts.map +1 -0
  45. package/dist/core/sync-engine.js +1471 -0
  46. package/dist/core/sync-engine.js.map +1 -0
  47. package/dist/index.d.ts +2 -4
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -14
  50. package/dist/index.js.map +1 -1
  51. package/dist/pushwork.d.ts +18 -65
  52. package/dist/pushwork.d.ts.map +1 -1
  53. package/dist/pushwork.js +97 -559
  54. package/dist/pushwork.js.map +1 -1
  55. package/dist/snarf.d.ts +21 -0
  56. package/dist/snarf.d.ts.map +1 -0
  57. package/dist/snarf.js +117 -0
  58. package/dist/snarf.js.map +1 -0
  59. package/dist/stash.d.ts +0 -2
  60. package/dist/stash.d.ts.map +1 -1
  61. package/dist/stash.js +0 -1
  62. package/dist/stash.js.map +1 -1
  63. package/dist/types/config.d.ts +102 -0
  64. package/dist/types/config.d.ts.map +1 -0
  65. package/dist/types/config.js +10 -0
  66. package/dist/types/config.js.map +1 -0
  67. package/dist/types/documents.d.ts +88 -0
  68. package/dist/types/documents.d.ts.map +1 -0
  69. package/dist/types/documents.js +23 -0
  70. package/dist/types/documents.js.map +1 -0
  71. package/dist/types/index.d.ts +4 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +20 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/types/snapshot.d.ts +64 -0
  76. package/dist/types/snapshot.d.ts.map +1 -0
  77. package/dist/types/snapshot.js +3 -0
  78. package/dist/types/snapshot.js.map +1 -0
  79. package/dist/utils/content-similarity.d.ts +53 -0
  80. package/dist/utils/content-similarity.d.ts.map +1 -0
  81. package/dist/utils/content-similarity.js +155 -0
  82. package/dist/utils/content-similarity.js.map +1 -0
  83. package/dist/utils/content.d.ts +10 -0
  84. package/dist/utils/content.d.ts.map +1 -0
  85. package/dist/utils/content.js +35 -0
  86. package/dist/utils/content.js.map +1 -0
  87. package/dist/utils/directory.d.ts +24 -0
  88. package/dist/utils/directory.d.ts.map +1 -0
  89. package/dist/utils/directory.js +56 -0
  90. package/dist/utils/directory.js.map +1 -0
  91. package/dist/utils/fs.d.ts +74 -0
  92. package/dist/utils/fs.d.ts.map +1 -0
  93. package/dist/utils/fs.js +298 -0
  94. package/dist/utils/fs.js.map +1 -0
  95. package/dist/utils/index.d.ts +5 -0
  96. package/dist/utils/index.d.ts.map +1 -0
  97. package/dist/utils/index.js +21 -0
  98. package/dist/utils/index.js.map +1 -0
  99. package/dist/utils/mime-types.d.ts +13 -0
  100. package/dist/utils/mime-types.d.ts.map +1 -0
  101. package/dist/utils/mime-types.js +247 -0
  102. package/dist/utils/mime-types.js.map +1 -0
  103. package/dist/utils/network-sync.d.ts +30 -0
  104. package/dist/utils/network-sync.d.ts.map +1 -0
  105. package/dist/utils/network-sync.js +391 -0
  106. package/dist/utils/network-sync.js.map +1 -0
  107. package/dist/utils/node-polyfills.d.ts +9 -0
  108. package/dist/utils/node-polyfills.d.ts.map +1 -0
  109. package/dist/utils/node-polyfills.js +9 -0
  110. package/dist/utils/node-polyfills.js.map +1 -0
  111. package/dist/utils/output.d.ts +129 -0
  112. package/dist/utils/output.d.ts.map +1 -0
  113. package/dist/utils/output.js +375 -0
  114. package/dist/utils/output.js.map +1 -0
  115. package/dist/utils/repo-factory.d.ts +15 -0
  116. package/dist/utils/repo-factory.d.ts.map +1 -0
  117. package/dist/utils/repo-factory.js +156 -0
  118. package/dist/utils/repo-factory.js.map +1 -0
  119. package/dist/utils/string-similarity.d.ts +14 -0
  120. package/dist/utils/string-similarity.d.ts.map +1 -0
  121. package/dist/utils/string-similarity.js +43 -0
  122. package/dist/utils/string-similarity.js.map +1 -0
  123. package/dist/utils/text-diff.d.ts +37 -0
  124. package/dist/utils/text-diff.d.ts.map +1 -0
  125. package/dist/utils/text-diff.js +131 -0
  126. package/dist/utils/text-diff.js.map +1 -0
  127. package/dist/utils/trace.d.ts +19 -0
  128. package/dist/utils/trace.d.ts.map +1 -0
  129. package/dist/utils/trace.js +68 -0
  130. package/dist/utils/trace.js.map +1 -0
  131. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * pvh TODO: the files & directories could be unified into a single map of entries with a type field
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SnapshotManager = void 0;
40
+ const fs = __importStar(require("fs/promises"));
41
+ const path = __importStar(require("path"));
42
+ const utils_1 = require("../utils");
43
+ const output_1 = require("../utils/output");
44
+ /**
45
+ * Manages sync snapshots for local state tracking
46
+ */
47
+ class SnapshotManager {
48
+ constructor(rootPath) {
49
+ this.rootPath = rootPath;
50
+ }
51
+ /**
52
+ * Get path to sync tool directory
53
+ */
54
+ getSyncToolDir() {
55
+ return path.join(this.rootPath, SnapshotManager.SYNC_TOOL_DIR);
56
+ }
57
+ /**
58
+ * Get path to snapshot file
59
+ */
60
+ getSnapshotPath() {
61
+ return path.join(this.getSyncToolDir(), SnapshotManager.SNAPSHOT_FILENAME);
62
+ }
63
+ /**
64
+ * Check if snapshot exists
65
+ */
66
+ async exists() {
67
+ return await (0, utils_1.pathExists)(this.getSnapshotPath());
68
+ }
69
+ /**
70
+ * Load snapshot from disk
71
+ */
72
+ async load() {
73
+ try {
74
+ const snapshotPath = this.getSnapshotPath();
75
+ if (!(await (0, utils_1.pathExists)(snapshotPath))) {
76
+ return null;
77
+ }
78
+ const content = await fs.readFile(snapshotPath, "utf8");
79
+ const serializable = JSON.parse(content);
80
+ return this.deserializeSnapshot(serializable);
81
+ }
82
+ catch (error) {
83
+ output_1.out.taskLine(`Failed to load snapshot: ${error}`);
84
+ return null;
85
+ }
86
+ }
87
+ /**
88
+ * Save snapshot to disk
89
+ */
90
+ async save(snapshot) {
91
+ try {
92
+ await (0, utils_1.ensureDirectoryExists)(this.getSyncToolDir());
93
+ const serializable = this.serializeSnapshot(snapshot);
94
+ const content = JSON.stringify(serializable, null, 2);
95
+ await fs.writeFile(this.getSnapshotPath(), content, "utf8");
96
+ }
97
+ catch (error) {
98
+ throw new Error(`Failed to save snapshot: ${error}`);
99
+ }
100
+ }
101
+ /**
102
+ * Create empty snapshot
103
+ */
104
+ createEmpty() {
105
+ return {
106
+ timestamp: Date.now(),
107
+ rootPath: this.rootPath,
108
+ rootDirectoryUrl: undefined,
109
+ files: new Map(),
110
+ directories: new Map(),
111
+ };
112
+ }
113
+ /**
114
+ * Update file entry in snapshot
115
+ */
116
+ updateFileEntry(snapshot, relativePath, entry) {
117
+ snapshot.files.set(relativePath, entry);
118
+ snapshot.timestamp = Date.now();
119
+ }
120
+ /**
121
+ * Update directory entry in snapshot
122
+ */
123
+ updateDirectoryEntry(snapshot, relativePath, entry) {
124
+ snapshot.directories.set(relativePath, entry);
125
+ snapshot.timestamp = Date.now();
126
+ }
127
+ /**
128
+ * Remove file entry from snapshot
129
+ */
130
+ removeFileEntry(snapshot, relativePath) {
131
+ snapshot.files.delete(relativePath);
132
+ snapshot.timestamp = Date.now();
133
+ }
134
+ /**
135
+ * Remove directory entry from snapshot
136
+ */
137
+ removeDirectoryEntry(snapshot, relativePath) {
138
+ snapshot.directories.delete(relativePath);
139
+ snapshot.timestamp = Date.now();
140
+ }
141
+ /**
142
+ * Get all file paths in snapshot
143
+ */
144
+ getFilePaths(snapshot) {
145
+ return Array.from(snapshot.files.keys());
146
+ }
147
+ /**
148
+ * Get all directory paths in snapshot
149
+ */
150
+ getDirectoryPaths(snapshot) {
151
+ return Array.from(snapshot.directories.keys());
152
+ }
153
+ /**
154
+ * Get file entry by path
155
+ */
156
+ getFileEntry(snapshot, relativePath) {
157
+ return snapshot.files.get(relativePath);
158
+ }
159
+ /**
160
+ * Get directory entry by path
161
+ */
162
+ getDirectoryEntry(snapshot, relativePath) {
163
+ return snapshot.directories.get(relativePath);
164
+ }
165
+ /**
166
+ * Check if path is tracked in snapshot
167
+ */
168
+ isTracked(snapshot, relativePath) {
169
+ return (snapshot.files.has(relativePath) || snapshot.directories.has(relativePath));
170
+ }
171
+ /**
172
+ * Get snapshot statistics
173
+ */
174
+ getStats(snapshot) {
175
+ return {
176
+ files: snapshot.files.size,
177
+ directories: snapshot.directories.size,
178
+ timestamp: new Date(snapshot.timestamp),
179
+ };
180
+ }
181
+ /**
182
+ * Validate snapshot integrity
183
+ */
184
+ validate(snapshot) {
185
+ const errors = [];
186
+ if (!snapshot.timestamp || snapshot.timestamp <= 0) {
187
+ errors.push("Invalid timestamp");
188
+ }
189
+ if (!snapshot.rootPath) {
190
+ errors.push("Missing root path");
191
+ }
192
+ if (!snapshot.files || !snapshot.directories) {
193
+ errors.push("Missing files or directories map");
194
+ }
195
+ // Check for path conflicts (file and directory with same path)
196
+ for (const filePath of snapshot.files.keys()) {
197
+ if (snapshot.directories.has(filePath)) {
198
+ errors.push(`Path conflict: ${filePath} exists as both file and directory`);
199
+ }
200
+ }
201
+ return {
202
+ valid: errors.length === 0,
203
+ errors,
204
+ };
205
+ }
206
+ /**
207
+ * Convert snapshot to serializable format
208
+ */
209
+ serializeSnapshot(snapshot) {
210
+ return {
211
+ timestamp: snapshot.timestamp,
212
+ rootPath: snapshot.rootPath,
213
+ rootDirectoryUrl: snapshot.rootDirectoryUrl,
214
+ files: Array.from(snapshot.files.entries()),
215
+ directories: Array.from(snapshot.directories.entries()),
216
+ };
217
+ }
218
+ /**
219
+ * Convert serializable format back to snapshot
220
+ */
221
+ deserializeSnapshot(serializable) {
222
+ return {
223
+ timestamp: serializable.timestamp,
224
+ rootPath: serializable.rootPath,
225
+ rootDirectoryUrl: serializable.rootDirectoryUrl,
226
+ files: new Map(serializable.files),
227
+ directories: new Map(serializable.directories),
228
+ };
229
+ }
230
+ /**
231
+ * Clear all snapshot data
232
+ */
233
+ clear(snapshot) {
234
+ snapshot.files.clear();
235
+ snapshot.directories.clear();
236
+ snapshot.timestamp = Date.now();
237
+ }
238
+ /**
239
+ * Clone snapshot for safe manipulation
240
+ */
241
+ clone(snapshot) {
242
+ return {
243
+ timestamp: snapshot.timestamp,
244
+ rootPath: snapshot.rootPath,
245
+ rootDirectoryUrl: snapshot.rootDirectoryUrl,
246
+ files: new Map(snapshot.files),
247
+ directories: new Map(snapshot.directories),
248
+ };
249
+ }
250
+ }
251
+ exports.SnapshotManager = SnapshotManager;
252
+ SnapshotManager.SNAPSHOT_FILENAME = "snapshot.json";
253
+ SnapshotManager.SYNC_TOOL_DIR = ".pushwork";
254
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/core/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { AutomergeUrl, Repo } from "@automerge/automerge-repo";
2
+ import { SyncSnapshot, SyncResult, DirectoryDocument, MoveCandidate, DirectoryConfig, DetectedChange } from "../types";
3
+ /**
4
+ * Nuke an artifact directory's docs array and rebuild it from scratch.
5
+ * Entries must be spread into plain objects — pushing Automerge proxy objects
6
+ * back after splicing them out throws "Cannot create a reference to an
7
+ * existing document object".
8
+ */
9
+ export declare function nukeAndRebuildDocs(doc: DirectoryDocument, dirPath: string, newEntries: {
10
+ name: string;
11
+ url: AutomergeUrl;
12
+ }[], updatedEntries: {
13
+ name: string;
14
+ url: AutomergeUrl;
15
+ }[], deletedNames: string[], subdirUpdates: {
16
+ name: string;
17
+ url: AutomergeUrl;
18
+ }[]): void;
19
+ /**
20
+ * Bidirectional sync engine implementing two-phase sync
21
+ */
22
+ export declare class SyncEngine {
23
+ private repo;
24
+ private rootPath;
25
+ private snapshotManager;
26
+ private changeDetector;
27
+ private moveDetector;
28
+ private handlesByPath;
29
+ private config;
30
+ constructor(repo: Repo, rootPath: string, config: DirectoryConfig);
31
+ /**
32
+ * Determine if content should be treated as text for Automerge text operations
33
+ * Note: This method checks the runtime type. File type detection happens
34
+ * during reading with isEnhancedTextFile() which now has better dev file support.
35
+ */
36
+ private isTextContent;
37
+ /**
38
+ * Get a versioned URL from a handle (includes current heads).
39
+ * This ensures clients can fetch the exact version of the document.
40
+ */
41
+ private getVersionedUrl;
42
+ /**
43
+ * Determine if a file path is inside an artifact directory.
44
+ * Artifact files are stored as immutable strings (RawString) and
45
+ * referenced with versioned URLs in directory entries.
46
+ */
47
+ private isArtifactPath;
48
+ /**
49
+ * Get the appropriate URL for a file's directory entry.
50
+ * Artifact paths get versioned URLs (with heads) for exact version fetching.
51
+ * Non-artifact paths get plain URLs for collaborative editing.
52
+ */
53
+ private getEntryUrl;
54
+ /**
55
+ * Get the appropriate URL for a subdirectory's directory entry.
56
+ * Artifact directories get versioned URLs (with heads) so consumers can
57
+ * fetch the exact snapshotted version, matching how artifact files work.
58
+ * Non-artifact directories get plain URLs for collaborative editing.
59
+ */
60
+ private getDirEntryUrl;
61
+ /**
62
+ * Set the root directory URL in the snapshot
63
+ */
64
+ getRootDirectoryUrl(): Promise<AutomergeUrl | undefined>;
65
+ setRootDirectoryUrl(url: AutomergeUrl): Promise<void>;
66
+ /**
67
+ * Reset the snapshot, clearing all tracked files and directories.
68
+ * Preserves the rootDirectoryUrl so sync can still operate.
69
+ * Used by --force to re-sync every file.
70
+ */
71
+ resetSnapshot(): Promise<void>;
72
+ /**
73
+ * Nuclear reset: clear the snapshot AND wipe the root directory document's
74
+ * entries so that every file and subdirectory gets brand-new Automerge
75
+ * documents. The root directory document itself is preserved.
76
+ */
77
+ nuclearReset(): Promise<void>;
78
+ /**
79
+ * Commit local changes only (no network sync)
80
+ */
81
+ commitLocal(): Promise<SyncResult>;
82
+ /**
83
+ * Recreate documents that failed to sync. Creates new Automerge documents
84
+ * with the same content and updates all references (snapshot, parent directory).
85
+ * Returns new handles that should be retried for sync.
86
+ */
87
+ private recreateFailedDocuments;
88
+ /**
89
+ * Run full bidirectional sync
90
+ */
91
+ sync(options?: {
92
+ sub?: boolean;
93
+ }): Promise<SyncResult>;
94
+ /**
95
+ * Phase 1: Push local changes to Automerge documents.
96
+ *
97
+ * Works depth-first: processes the deepest files first, creates/updates all
98
+ * file docs at each level, then batch-updates the parent directory document
99
+ * in a single change. Propagates subdirectory URL updates as we walk up
100
+ * toward the root. This eliminates the need for a separate URL update pass.
101
+ */
102
+ private pushLocalChanges;
103
+ /**
104
+ * Phase 2: Pull remote changes to local filesystem
105
+ */
106
+ private pullRemoteChanges;
107
+ /**
108
+ * Apply remote change to local filesystem
109
+ */
110
+ private applyRemoteChangeToLocal;
111
+ /**
112
+ * Apply move to remote documents
113
+ */
114
+ private applyMoveToRemote;
115
+ /**
116
+ * Create new remote file document
117
+ */
118
+ private createRemoteFile;
119
+ /**
120
+ * Update existing remote file document
121
+ */
122
+ private updateRemoteFile;
123
+ /**
124
+ * Delete remote file document
125
+ */
126
+ private deleteRemoteFile;
127
+ /**
128
+ * Add file entry to appropriate directory document (maintains hierarchy)
129
+ */
130
+ private addFileToDirectory;
131
+ /**
132
+ * Ensure directory document exists for the given path, creating hierarchy as needed
133
+ * First checks for existing shared directories before creating new ones
134
+ */
135
+ private ensureDirectoryDocument;
136
+ /**
137
+ * Remove file entry from directory document
138
+ */
139
+ private removeFileFromDirectory;
140
+ /**
141
+ * Batch-update a directory document in a single change: add new file entries,
142
+ * update URLs for modified files, remove deleted entries, and update
143
+ * subdirectory URLs. This replaces the separate per-file directory mutations
144
+ * and the post-hoc URL update pass.
145
+ */
146
+ private batchUpdateDirectory;
147
+ /**
148
+ * Sort changes by dependency order
149
+ */
150
+ private sortChangesByDependency;
151
+ /**
152
+ * Get sync status
153
+ */
154
+ getStatus(): Promise<{
155
+ snapshot: SyncSnapshot | null;
156
+ hasChanges: boolean;
157
+ changeCount: number;
158
+ lastSync: Date | null;
159
+ }>;
160
+ /**
161
+ * Preview changes without applying them
162
+ */
163
+ previewChanges(): Promise<{
164
+ changes: DetectedChange[];
165
+ moves: MoveCandidate[];
166
+ summary: string;
167
+ }>;
168
+ /**
169
+ * Generate human-readable summary of changes
170
+ */
171
+ private generateChangeSummary;
172
+ /**
173
+ * Update the lastSyncAt timestamp on the root directory document
174
+ */
175
+ private touchRootDirectory;
176
+ }
177
+ //# sourceMappingURL=sync-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"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"}