pushwork 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 (184) hide show
  1. package/README.md +460 -0
  2. package/dist/browser/browser-sync-engine.d.ts +64 -0
  3. package/dist/browser/browser-sync-engine.d.ts.map +1 -0
  4. package/dist/browser/browser-sync-engine.js +303 -0
  5. package/dist/browser/browser-sync-engine.js.map +1 -0
  6. package/dist/browser/filesystem-adapter.d.ts +84 -0
  7. package/dist/browser/filesystem-adapter.d.ts.map +1 -0
  8. package/dist/browser/filesystem-adapter.js +413 -0
  9. package/dist/browser/filesystem-adapter.js.map +1 -0
  10. package/dist/browser/index.d.ts +36 -0
  11. package/dist/browser/index.d.ts.map +1 -0
  12. package/dist/browser/index.js +90 -0
  13. package/dist/browser/index.js.map +1 -0
  14. package/dist/browser/types.d.ts +70 -0
  15. package/dist/browser/types.d.ts.map +1 -0
  16. package/dist/browser/types.js +6 -0
  17. package/dist/browser/types.js.map +1 -0
  18. package/dist/cli/commands.d.ts +71 -0
  19. package/dist/cli/commands.d.ts.map +1 -0
  20. package/dist/cli/commands.js +794 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/index.d.ts +2 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +19 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +199 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/config/index.d.ts +71 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +314 -0
  33. package/dist/config/index.js.map +1 -0
  34. package/dist/core/change-detection.d.ts +78 -0
  35. package/dist/core/change-detection.d.ts.map +1 -0
  36. package/dist/core/change-detection.js +370 -0
  37. package/dist/core/change-detection.js.map +1 -0
  38. package/dist/core/index.d.ts +5 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +22 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/core/isomorphic-snapshot.d.ts +58 -0
  43. package/dist/core/isomorphic-snapshot.d.ts.map +1 -0
  44. package/dist/core/isomorphic-snapshot.js +204 -0
  45. package/dist/core/isomorphic-snapshot.js.map +1 -0
  46. package/dist/core/move-detection.d.ts +72 -0
  47. package/dist/core/move-detection.d.ts.map +1 -0
  48. package/dist/core/move-detection.js +200 -0
  49. package/dist/core/move-detection.js.map +1 -0
  50. package/dist/core/snapshot.d.ts +109 -0
  51. package/dist/core/snapshot.d.ts.map +1 -0
  52. package/dist/core/snapshot.js +263 -0
  53. package/dist/core/snapshot.js.map +1 -0
  54. package/dist/core/sync-engine.d.ts +110 -0
  55. package/dist/core/sync-engine.d.ts.map +1 -0
  56. package/dist/core/sync-engine.js +817 -0
  57. package/dist/core/sync-engine.js.map +1 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +27 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/platform/browser-filesystem.d.ts +26 -0
  63. package/dist/platform/browser-filesystem.d.ts.map +1 -0
  64. package/dist/platform/browser-filesystem.js +91 -0
  65. package/dist/platform/browser-filesystem.js.map +1 -0
  66. package/dist/platform/filesystem.d.ts +29 -0
  67. package/dist/platform/filesystem.d.ts.map +1 -0
  68. package/dist/platform/filesystem.js +65 -0
  69. package/dist/platform/filesystem.js.map +1 -0
  70. package/dist/platform/node-filesystem.d.ts +21 -0
  71. package/dist/platform/node-filesystem.d.ts.map +1 -0
  72. package/dist/platform/node-filesystem.js +93 -0
  73. package/dist/platform/node-filesystem.js.map +1 -0
  74. package/dist/types/config.d.ts +119 -0
  75. package/dist/types/config.d.ts.map +1 -0
  76. package/dist/types/config.js +3 -0
  77. package/dist/types/config.js.map +1 -0
  78. package/dist/types/documents.d.ts +70 -0
  79. package/dist/types/documents.d.ts.map +1 -0
  80. package/dist/types/documents.js +23 -0
  81. package/dist/types/documents.js.map +1 -0
  82. package/dist/types/index.d.ts +4 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +23 -0
  85. package/dist/types/index.js.map +1 -0
  86. package/dist/types/snapshot.d.ts +81 -0
  87. package/dist/types/snapshot.d.ts.map +1 -0
  88. package/dist/types/snapshot.js +17 -0
  89. package/dist/types/snapshot.js.map +1 -0
  90. package/dist/utils/content-similarity.d.ts +53 -0
  91. package/dist/utils/content-similarity.d.ts.map +1 -0
  92. package/dist/utils/content-similarity.js +155 -0
  93. package/dist/utils/content-similarity.js.map +1 -0
  94. package/dist/utils/content.d.ts +5 -0
  95. package/dist/utils/content.d.ts.map +1 -0
  96. package/dist/utils/content.js +30 -0
  97. package/dist/utils/content.js.map +1 -0
  98. package/dist/utils/fs-browser.d.ts +57 -0
  99. package/dist/utils/fs-browser.d.ts.map +1 -0
  100. package/dist/utils/fs-browser.js +311 -0
  101. package/dist/utils/fs-browser.js.map +1 -0
  102. package/dist/utils/fs-node.d.ts +53 -0
  103. package/dist/utils/fs-node.d.ts.map +1 -0
  104. package/dist/utils/fs-node.js +220 -0
  105. package/dist/utils/fs-node.js.map +1 -0
  106. package/dist/utils/fs.d.ts +62 -0
  107. package/dist/utils/fs.d.ts.map +1 -0
  108. package/dist/utils/fs.js +293 -0
  109. package/dist/utils/fs.js.map +1 -0
  110. package/dist/utils/index.d.ts +4 -0
  111. package/dist/utils/index.d.ts.map +1 -0
  112. package/dist/utils/index.js +23 -0
  113. package/dist/utils/index.js.map +1 -0
  114. package/dist/utils/isomorphic.d.ts +29 -0
  115. package/dist/utils/isomorphic.d.ts.map +1 -0
  116. package/dist/utils/isomorphic.js +139 -0
  117. package/dist/utils/isomorphic.js.map +1 -0
  118. package/dist/utils/mime-types.d.ts +13 -0
  119. package/dist/utils/mime-types.d.ts.map +1 -0
  120. package/dist/utils/mime-types.js +240 -0
  121. package/dist/utils/mime-types.js.map +1 -0
  122. package/dist/utils/network-sync.d.ts +12 -0
  123. package/dist/utils/network-sync.d.ts.map +1 -0
  124. package/dist/utils/network-sync.js +149 -0
  125. package/dist/utils/network-sync.js.map +1 -0
  126. package/dist/utils/pure.d.ts +25 -0
  127. package/dist/utils/pure.d.ts.map +1 -0
  128. package/dist/utils/pure.js +112 -0
  129. package/dist/utils/pure.js.map +1 -0
  130. package/dist/utils/repo-factory.d.ts +11 -0
  131. package/dist/utils/repo-factory.d.ts.map +1 -0
  132. package/dist/utils/repo-factory.js +77 -0
  133. package/dist/utils/repo-factory.js.map +1 -0
  134. package/package.json +83 -0
  135. package/src/cli/commands.ts +1053 -0
  136. package/src/cli/index.ts +2 -0
  137. package/src/cli.ts +287 -0
  138. package/src/config/index.ts +334 -0
  139. package/src/core/change-detection.ts +484 -0
  140. package/src/core/index.ts +5 -0
  141. package/src/core/move-detection.ts +269 -0
  142. package/src/core/snapshot.ts +285 -0
  143. package/src/core/sync-engine.ts +1167 -0
  144. package/src/index.ts +14 -0
  145. package/src/types/config.ts +130 -0
  146. package/src/types/documents.ts +72 -0
  147. package/src/types/index.ts +8 -0
  148. package/src/types/snapshot.ts +88 -0
  149. package/src/utils/content-similarity.ts +194 -0
  150. package/src/utils/content.ts +28 -0
  151. package/src/utils/fs.ts +289 -0
  152. package/src/utils/index.ts +8 -0
  153. package/src/utils/mime-types.ts +236 -0
  154. package/src/utils/network-sync.ts +153 -0
  155. package/src/utils/repo-factory.ts +58 -0
  156. package/test/README-TESTING-GAPS.md +174 -0
  157. package/test/integration/README.md +328 -0
  158. package/test/integration/clone-test.sh +310 -0
  159. package/test/integration/conflict-resolution-test.sh +309 -0
  160. package/test/integration/deletion-behavior-test.sh +487 -0
  161. package/test/integration/deletion-sync-test-simple.sh +193 -0
  162. package/test/integration/deletion-sync-test.sh +297 -0
  163. package/test/integration/exclude-patterns.test.ts +152 -0
  164. package/test/integration/full-integration-test.sh +363 -0
  165. package/test/integration/sync-deletion.test.ts +339 -0
  166. package/test/integration/sync-flow.test.ts +309 -0
  167. package/test/run-tests.sh +225 -0
  168. package/test/unit/content-similarity.test.ts +236 -0
  169. package/test/unit/deletion-behavior.test.ts +260 -0
  170. package/test/unit/enhanced-mime-detection.test.ts +266 -0
  171. package/test/unit/snapshot.test.ts +431 -0
  172. package/test/unit/sync-timing.test.ts +178 -0
  173. package/test/unit/utils.test.ts +368 -0
  174. package/tools/browser-sync/README.md +116 -0
  175. package/tools/browser-sync/package.json +44 -0
  176. package/tools/browser-sync/patchwork.json +1 -0
  177. package/tools/browser-sync/pnpm-lock.yaml +4202 -0
  178. package/tools/browser-sync/src/components/BrowserSyncTool.tsx +599 -0
  179. package/tools/browser-sync/src/index.ts +20 -0
  180. package/tools/browser-sync/src/polyfills.ts +31 -0
  181. package/tools/browser-sync/src/styles.css +290 -0
  182. package/tools/browser-sync/src/types.ts +27 -0
  183. package/tools/browser-sync/vite.config.ts +25 -0
  184. package/tsconfig.json +22 -0
@@ -0,0 +1,290 @@
1
+ /* Browser Sync Tool Styles */
2
+ .browser-sync-tool {
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100%;
6
+ background: #ffffff;
7
+ }
8
+
9
+ .browser-sync-header {
10
+ padding: 1rem;
11
+ border-bottom: 1px solid #e5e7eb;
12
+ background: #f9fafb;
13
+ }
14
+
15
+ .browser-sync-title {
16
+ font-size: 1.25rem;
17
+ font-weight: 600;
18
+ color: #111827;
19
+ margin: 0 0 0.5rem 0;
20
+ }
21
+
22
+ .browser-sync-subtitle {
23
+ font-size: 0.875rem;
24
+ color: #6b7280;
25
+ margin: 0;
26
+ }
27
+
28
+ .browser-sync-content {
29
+ flex: 1;
30
+ display: flex;
31
+ flex-direction: column;
32
+ overflow: hidden;
33
+ }
34
+
35
+ .browser-sync-main {
36
+ flex: 1;
37
+ padding: 1rem;
38
+ overflow-y: auto;
39
+ }
40
+
41
+ .status-card {
42
+ background: #ffffff;
43
+ border: 1px solid #e5e7eb;
44
+ border-radius: 0.5rem;
45
+ padding: 1rem;
46
+ margin-bottom: 1rem;
47
+ }
48
+
49
+ .status-header {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: 0.5rem;
53
+ margin-bottom: 0.75rem;
54
+ }
55
+
56
+ .status-title {
57
+ font-weight: 500;
58
+ color: #111827;
59
+ }
60
+
61
+ .status-indicator {
62
+ width: 8px;
63
+ height: 8px;
64
+ border-radius: 50%;
65
+ }
66
+
67
+ .status-indicator.connected {
68
+ background: #10b981;
69
+ }
70
+
71
+ .status-indicator.disconnected {
72
+ background: #ef4444;
73
+ }
74
+
75
+ .status-indicator.pending {
76
+ background: #f59e0b;
77
+ }
78
+
79
+ .button {
80
+ display: inline-flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ padding: 0.5rem 1rem;
84
+ border: 1px solid #d1d5db;
85
+ border-radius: 0.375rem;
86
+ background: #ffffff;
87
+ color: #374151;
88
+ font-size: 0.875rem;
89
+ font-weight: 500;
90
+ cursor: pointer;
91
+ transition: all 0.2s;
92
+ }
93
+
94
+ .button:hover {
95
+ background: #f3f4f6;
96
+ border-color: #9ca3af;
97
+ }
98
+
99
+ .button:disabled {
100
+ opacity: 0.5;
101
+ cursor: not-allowed;
102
+ }
103
+
104
+ .button.primary {
105
+ background: #2563eb;
106
+ border-color: #2563eb;
107
+ color: #ffffff;
108
+ }
109
+
110
+ .button.primary:hover {
111
+ background: #1d4ed8;
112
+ border-color: #1d4ed8;
113
+ }
114
+
115
+ .button.danger {
116
+ background: #dc2626;
117
+ border-color: #dc2626;
118
+ color: #ffffff;
119
+ }
120
+
121
+ .button.danger:hover {
122
+ background: #b91c1c;
123
+ border-color: #b91c1c;
124
+ }
125
+
126
+ .file-list {
127
+ border: 1px solid #e5e7eb;
128
+ border-radius: 0.375rem;
129
+ max-height: 200px;
130
+ overflow-y: auto;
131
+ }
132
+
133
+ .file-item {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: 0.5rem;
137
+ padding: 0.5rem;
138
+ border-bottom: 1px solid #f3f4f6;
139
+ }
140
+
141
+ .file-item:last-child {
142
+ border-bottom: none;
143
+ }
144
+
145
+ .file-icon {
146
+ width: 16px;
147
+ height: 16px;
148
+ color: #6b7280;
149
+ }
150
+
151
+ .file-name {
152
+ flex: 1;
153
+ font-size: 0.875rem;
154
+ color: #374151;
155
+ }
156
+
157
+ .file-size {
158
+ font-size: 0.75rem;
159
+ color: #9ca3af;
160
+ }
161
+
162
+ .empty-state {
163
+ display: flex;
164
+ flex-direction: column;
165
+ align-items: center;
166
+ justify-content: center;
167
+ padding: 3rem 1rem;
168
+ text-align: center;
169
+ color: #6b7280;
170
+ }
171
+
172
+ .empty-state-icon {
173
+ width: 48px;
174
+ height: 48px;
175
+ margin-bottom: 1rem;
176
+ color: #d1d5db;
177
+ }
178
+
179
+ .empty-state-title {
180
+ font-size: 1.125rem;
181
+ font-weight: 500;
182
+ color: #374151;
183
+ margin-bottom: 0.5rem;
184
+ }
185
+
186
+ .empty-state-description {
187
+ font-size: 0.875rem;
188
+ margin-bottom: 1.5rem;
189
+ }
190
+
191
+ .settings-panel {
192
+ border-top: 1px solid #e5e7eb;
193
+ padding: 1rem;
194
+ background: #f9fafb;
195
+ }
196
+
197
+ .settings-row {
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: space-between;
201
+ margin-bottom: 0.75rem;
202
+ }
203
+
204
+ .settings-row:last-child {
205
+ margin-bottom: 0;
206
+ }
207
+
208
+ .settings-label {
209
+ font-size: 0.875rem;
210
+ font-weight: 500;
211
+ color: #374151;
212
+ }
213
+
214
+ .toggle {
215
+ position: relative;
216
+ width: 44px;
217
+ height: 24px;
218
+ }
219
+
220
+ .toggle input {
221
+ opacity: 0;
222
+ width: 0;
223
+ height: 0;
224
+ }
225
+
226
+ .toggle-slider {
227
+ position: absolute;
228
+ cursor: pointer;
229
+ top: 0;
230
+ left: 0;
231
+ right: 0;
232
+ bottom: 0;
233
+ background-color: #d1d5db;
234
+ transition: 0.2s;
235
+ border-radius: 24px;
236
+ }
237
+
238
+ .toggle-slider:before {
239
+ position: absolute;
240
+ content: "";
241
+ height: 18px;
242
+ width: 18px;
243
+ left: 3px;
244
+ bottom: 3px;
245
+ background-color: white;
246
+ transition: 0.2s;
247
+ border-radius: 50%;
248
+ }
249
+
250
+ .toggle input:checked + .toggle-slider {
251
+ background-color: #2563eb;
252
+ }
253
+
254
+ .toggle input:checked + .toggle-slider:before {
255
+ transform: translateX(20px);
256
+ }
257
+
258
+ .sync-progress {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 0.5rem;
262
+ padding: 0.75rem;
263
+ background: #eff6ff;
264
+ border: 1px solid #bfdbfe;
265
+ border-radius: 0.375rem;
266
+ margin-bottom: 1rem;
267
+ }
268
+
269
+ .sync-spinner {
270
+ animation: spin 1s linear infinite;
271
+ }
272
+
273
+ @keyframes spin {
274
+ from {
275
+ transform: rotate(0deg);
276
+ }
277
+ to {
278
+ transform: rotate(360deg);
279
+ }
280
+ }
281
+
282
+ .error-message {
283
+ padding: 0.75rem;
284
+ background: #fef2f2;
285
+ border: 1px solid #fecaca;
286
+ border-radius: 0.375rem;
287
+ color: #b91c1c;
288
+ font-size: 0.875rem;
289
+ margin-bottom: 1rem;
290
+ }
@@ -0,0 +1,27 @@
1
+ import { AutomergeUrl } from "@automerge/automerge-repo";
2
+
3
+ export interface FolderDoc {
4
+ "@patchwork": { type: "folder" };
5
+ docs: Array<{
6
+ name: string;
7
+ type: "file" | "folder";
8
+ url: AutomergeUrl;
9
+ }>;
10
+ }
11
+
12
+ export interface SyncStatus {
13
+ isConnected: boolean;
14
+ hasDirectoryAccess: boolean;
15
+ lastSync: Date | null;
16
+ filesCount: number;
17
+ syncInProgress: boolean;
18
+ error: string | null;
19
+ }
20
+
21
+ export interface SyncSettings {
22
+ autoSync: boolean;
23
+ syncInterval: number; // in seconds
24
+ excludePatterns: string[];
25
+ syncServerUrl: string;
26
+ syncServerStorageId: string;
27
+ }
@@ -0,0 +1,25 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+ import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";
4
+ import topLevelAwait from "vite-plugin-top-level-await";
5
+ import wasm from "vite-plugin-wasm";
6
+
7
+ import { EXTERNAL_DEPENDENCIES } from "@patchwork/sdk/shared-dependencies";
8
+
9
+ export default defineConfig({
10
+ base: "./",
11
+ plugins: [topLevelAwait(), wasm(), react(), cssInjectedByJsPlugin()],
12
+ build: {
13
+ rollupOptions: {
14
+ external: EXTERNAL_DEPENDENCIES,
15
+ input: "./src/index.ts",
16
+ output: {
17
+ format: "es",
18
+ entryFileNames: "[name].js",
19
+ chunkFileNames: "assets/[name]-[hash].js",
20
+ assetFileNames: "assets/[name][extname]",
21
+ },
22
+ preserveEntrySignatures: "strict",
23
+ },
24
+ },
25
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "declaration": true,
13
+ "declarationMap": true,
14
+ "sourceMap": true,
15
+ "resolveJsonModule": true,
16
+ "experimentalDecorators": true,
17
+ "emitDecoratorMetadata": true,
18
+ "types": ["node", "jest"]
19
+ },
20
+ "include": ["src/**/*"],
21
+ "exclude": ["node_modules", "dist", "test"]
22
+ }