pushwork 2.0.0-a.sub.0 → 2.0.0-preview

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 (251) hide show
  1. package/dist/branches.d.ts +19 -0
  2. package/dist/branches.d.ts.map +1 -0
  3. package/dist/branches.js +111 -0
  4. package/dist/branches.js.map +1 -0
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +238 -272
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config.d.ts +17 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +84 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/fs-tree.d.ts +6 -0
  14. package/dist/fs-tree.d.ts.map +1 -0
  15. package/dist/fs-tree.js +99 -0
  16. package/dist/fs-tree.js.map +1 -0
  17. package/dist/ignore.d.ts +6 -0
  18. package/dist/ignore.d.ts.map +1 -0
  19. package/dist/ignore.js +74 -0
  20. package/dist/ignore.js.map +1 -0
  21. package/dist/index.d.ts +8 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +34 -4
  24. package/dist/index.js.map +1 -1
  25. package/dist/log.d.ts +3 -0
  26. package/dist/log.d.ts.map +1 -0
  27. package/dist/log.js +14 -0
  28. package/dist/log.js.map +1 -0
  29. package/dist/pushwork.d.ts +115 -0
  30. package/dist/pushwork.d.ts.map +1 -0
  31. package/dist/pushwork.js +918 -0
  32. package/dist/pushwork.js.map +1 -0
  33. package/dist/repo.d.ts +14 -0
  34. package/dist/repo.d.ts.map +1 -0
  35. package/dist/repo.js +60 -0
  36. package/dist/repo.js.map +1 -0
  37. package/dist/shapes/custom.d.ts +3 -0
  38. package/dist/shapes/custom.d.ts.map +1 -0
  39. package/dist/shapes/custom.js +57 -0
  40. package/dist/shapes/custom.js.map +1 -0
  41. package/dist/shapes/file.d.ts +20 -0
  42. package/dist/shapes/file.d.ts.map +1 -0
  43. package/dist/shapes/file.js +140 -0
  44. package/dist/shapes/file.js.map +1 -0
  45. package/dist/shapes/index.d.ts +10 -0
  46. package/dist/shapes/index.d.ts.map +1 -0
  47. package/dist/shapes/index.js +35 -0
  48. package/dist/shapes/index.js.map +1 -0
  49. package/dist/shapes/patchwork-folder.d.ts +3 -0
  50. package/dist/shapes/patchwork-folder.d.ts.map +1 -0
  51. package/dist/shapes/patchwork-folder.js +160 -0
  52. package/dist/shapes/patchwork-folder.js.map +1 -0
  53. package/dist/shapes/types.d.ts +37 -0
  54. package/dist/shapes/types.d.ts.map +1 -0
  55. package/dist/shapes/types.js +52 -0
  56. package/dist/shapes/types.js.map +1 -0
  57. package/dist/shapes/vfs.d.ts +3 -0
  58. package/dist/shapes/vfs.d.ts.map +1 -0
  59. package/dist/shapes/vfs.js +88 -0
  60. package/dist/shapes/vfs.js.map +1 -0
  61. package/dist/stash.d.ts +23 -0
  62. package/dist/stash.d.ts.map +1 -0
  63. package/dist/stash.js +118 -0
  64. package/dist/stash.js.map +1 -0
  65. package/flake.lock +128 -0
  66. package/flake.nix +66 -0
  67. package/package.json +15 -48
  68. package/patches/@automerge__automerge-repo@2.6.0-subduction.15.patch +26 -0
  69. package/pnpm-workspace.yaml +5 -0
  70. package/src/branches.ts +93 -0
  71. package/src/cli.ts +258 -408
  72. package/src/config.ts +64 -0
  73. package/src/fs-tree.ts +70 -0
  74. package/src/ignore.ts +33 -0
  75. package/src/index.ts +38 -4
  76. package/src/log.ts +8 -0
  77. package/src/pushwork.ts +1055 -0
  78. package/src/repo.ts +76 -0
  79. package/src/shapes/custom.ts +29 -0
  80. package/src/shapes/file.ts +115 -0
  81. package/src/shapes/index.ts +19 -0
  82. package/src/shapes/patchwork-folder.ts +156 -0
  83. package/src/shapes/types.ts +79 -0
  84. package/src/shapes/vfs.ts +93 -0
  85. package/src/stash.ts +106 -0
  86. package/test/integration/branches.test.ts +389 -0
  87. package/test/integration/pushwork.test.ts +547 -0
  88. package/test/setup.ts +29 -0
  89. package/test/unit/doc-shape.test.ts +612 -0
  90. package/tsconfig.json +2 -3
  91. package/vitest.config.ts +14 -0
  92. package/ARCHITECTURE-ACCORDING-TO-CLAUDE.md +0 -248
  93. package/CLAUDE.md +0 -141
  94. package/README.md +0 -221
  95. package/babel.config.js +0 -5
  96. package/dist/cli/commands.d.ts +0 -71
  97. package/dist/cli/commands.d.ts.map +0 -1
  98. package/dist/cli/commands.js +0 -794
  99. package/dist/cli/commands.js.map +0 -1
  100. package/dist/cli/index.d.ts +0 -2
  101. package/dist/cli/index.d.ts.map +0 -1
  102. package/dist/cli/index.js +0 -19
  103. package/dist/cli/index.js.map +0 -1
  104. package/dist/commands.d.ts +0 -61
  105. package/dist/commands.d.ts.map +0 -1
  106. package/dist/commands.js +0 -861
  107. package/dist/commands.js.map +0 -1
  108. package/dist/config/index.d.ts +0 -71
  109. package/dist/config/index.d.ts.map +0 -1
  110. package/dist/config/index.js +0 -314
  111. package/dist/config/index.js.map +0 -1
  112. package/dist/core/change-detection.d.ts +0 -80
  113. package/dist/core/change-detection.d.ts.map +0 -1
  114. package/dist/core/change-detection.js +0 -523
  115. package/dist/core/change-detection.js.map +0 -1
  116. package/dist/core/config.d.ts +0 -81
  117. package/dist/core/config.d.ts.map +0 -1
  118. package/dist/core/config.js +0 -258
  119. package/dist/core/config.js.map +0 -1
  120. package/dist/core/index.d.ts +0 -6
  121. package/dist/core/index.d.ts.map +0 -1
  122. package/dist/core/index.js +0 -6
  123. package/dist/core/index.js.map +0 -1
  124. package/dist/core/move-detection.d.ts +0 -34
  125. package/dist/core/move-detection.d.ts.map +0 -1
  126. package/dist/core/move-detection.js +0 -121
  127. package/dist/core/move-detection.js.map +0 -1
  128. package/dist/core/snapshot.d.ts +0 -105
  129. package/dist/core/snapshot.d.ts.map +0 -1
  130. package/dist/core/snapshot.js +0 -217
  131. package/dist/core/snapshot.js.map +0 -1
  132. package/dist/core/sync-engine.d.ts +0 -151
  133. package/dist/core/sync-engine.d.ts.map +0 -1
  134. package/dist/core/sync-engine.js +0 -1346
  135. package/dist/core/sync-engine.js.map +0 -1
  136. package/dist/types/config.d.ts +0 -99
  137. package/dist/types/config.d.ts.map +0 -1
  138. package/dist/types/config.js +0 -5
  139. package/dist/types/config.js.map +0 -1
  140. package/dist/types/documents.d.ts +0 -88
  141. package/dist/types/documents.d.ts.map +0 -1
  142. package/dist/types/documents.js +0 -20
  143. package/dist/types/documents.js.map +0 -1
  144. package/dist/types/index.d.ts +0 -4
  145. package/dist/types/index.d.ts.map +0 -1
  146. package/dist/types/index.js +0 -4
  147. package/dist/types/index.js.map +0 -1
  148. package/dist/types/snapshot.d.ts +0 -64
  149. package/dist/types/snapshot.d.ts.map +0 -1
  150. package/dist/types/snapshot.js +0 -2
  151. package/dist/types/snapshot.js.map +0 -1
  152. package/dist/utils/content-similarity.d.ts +0 -53
  153. package/dist/utils/content-similarity.d.ts.map +0 -1
  154. package/dist/utils/content-similarity.js +0 -155
  155. package/dist/utils/content-similarity.js.map +0 -1
  156. package/dist/utils/content.d.ts +0 -10
  157. package/dist/utils/content.d.ts.map +0 -1
  158. package/dist/utils/content.js +0 -31
  159. package/dist/utils/content.js.map +0 -1
  160. package/dist/utils/directory.d.ts +0 -24
  161. package/dist/utils/directory.d.ts.map +0 -1
  162. package/dist/utils/directory.js +0 -52
  163. package/dist/utils/directory.js.map +0 -1
  164. package/dist/utils/fs.d.ts +0 -74
  165. package/dist/utils/fs.d.ts.map +0 -1
  166. package/dist/utils/fs.js +0 -248
  167. package/dist/utils/fs.js.map +0 -1
  168. package/dist/utils/index.d.ts +0 -5
  169. package/dist/utils/index.d.ts.map +0 -1
  170. package/dist/utils/index.js +0 -5
  171. package/dist/utils/index.js.map +0 -1
  172. package/dist/utils/mime-types.d.ts +0 -13
  173. package/dist/utils/mime-types.d.ts.map +0 -1
  174. package/dist/utils/mime-types.js +0 -209
  175. package/dist/utils/mime-types.js.map +0 -1
  176. package/dist/utils/network-sync.d.ts +0 -36
  177. package/dist/utils/network-sync.d.ts.map +0 -1
  178. package/dist/utils/network-sync.js +0 -250
  179. package/dist/utils/network-sync.js.map +0 -1
  180. package/dist/utils/node-polyfills.d.ts +0 -9
  181. package/dist/utils/node-polyfills.d.ts.map +0 -1
  182. package/dist/utils/node-polyfills.js +0 -9
  183. package/dist/utils/node-polyfills.js.map +0 -1
  184. package/dist/utils/output.d.ts +0 -129
  185. package/dist/utils/output.d.ts.map +0 -1
  186. package/dist/utils/output.js +0 -368
  187. package/dist/utils/output.js.map +0 -1
  188. package/dist/utils/repo-factory.d.ts +0 -13
  189. package/dist/utils/repo-factory.d.ts.map +0 -1
  190. package/dist/utils/repo-factory.js +0 -46
  191. package/dist/utils/repo-factory.js.map +0 -1
  192. package/dist/utils/string-similarity.d.ts +0 -14
  193. package/dist/utils/string-similarity.d.ts.map +0 -1
  194. package/dist/utils/string-similarity.js +0 -39
  195. package/dist/utils/string-similarity.js.map +0 -1
  196. package/dist/utils/text-diff.d.ts +0 -37
  197. package/dist/utils/text-diff.d.ts.map +0 -1
  198. package/dist/utils/text-diff.js +0 -93
  199. package/dist/utils/text-diff.js.map +0 -1
  200. package/dist/utils/trace.d.ts +0 -19
  201. package/dist/utils/trace.d.ts.map +0 -1
  202. package/dist/utils/trace.js +0 -63
  203. package/dist/utils/trace.js.map +0 -1
  204. package/src/commands.ts +0 -1134
  205. package/src/core/change-detection.ts +0 -712
  206. package/src/core/config.ts +0 -313
  207. package/src/core/index.ts +0 -5
  208. package/src/core/move-detection.ts +0 -169
  209. package/src/core/snapshot.ts +0 -275
  210. package/src/core/sync-engine.ts +0 -1758
  211. package/src/types/config.ts +0 -111
  212. package/src/types/documents.ts +0 -91
  213. package/src/types/index.ts +0 -3
  214. package/src/types/snapshot.ts +0 -67
  215. package/src/utils/content.ts +0 -34
  216. package/src/utils/directory.ts +0 -73
  217. package/src/utils/fs.ts +0 -297
  218. package/src/utils/index.ts +0 -4
  219. package/src/utils/mime-types.ts +0 -244
  220. package/src/utils/network-sync.ts +0 -319
  221. package/src/utils/node-polyfills.ts +0 -8
  222. package/src/utils/output.ts +0 -450
  223. package/src/utils/repo-factory.ts +0 -73
  224. package/src/utils/string-similarity.ts +0 -54
  225. package/src/utils/text-diff.ts +0 -101
  226. package/src/utils/trace.ts +0 -70
  227. package/test/integration/README.md +0 -328
  228. package/test/integration/clone-test.sh +0 -310
  229. package/test/integration/conflict-resolution-test.sh +0 -309
  230. package/test/integration/debug-both-nested.sh +0 -74
  231. package/test/integration/debug-concurrent-nested.sh +0 -87
  232. package/test/integration/debug-nested.sh +0 -73
  233. package/test/integration/deletion-behavior-test.sh +0 -487
  234. package/test/integration/deletion-sync-test-simple.sh +0 -193
  235. package/test/integration/deletion-sync-test.sh +0 -297
  236. package/test/integration/exclude-patterns.test.ts +0 -144
  237. package/test/integration/full-integration-test.sh +0 -363
  238. package/test/integration/fuzzer.test.ts +0 -818
  239. package/test/integration/in-memory-sync.test.ts +0 -830
  240. package/test/integration/init-sync.test.ts +0 -89
  241. package/test/integration/manual-sync-test.sh +0 -84
  242. package/test/integration/sync-deletion.test.ts +0 -280
  243. package/test/integration/sync-flow.test.ts +0 -291
  244. package/test/jest.setup.ts +0 -34
  245. package/test/run-tests.sh +0 -225
  246. package/test/unit/deletion-behavior.test.ts +0 -249
  247. package/test/unit/enhanced-mime-detection.test.ts +0 -244
  248. package/test/unit/snapshot.test.ts +0 -404
  249. package/test/unit/sync-convergence.test.ts +0 -298
  250. package/test/unit/sync-timing.test.ts +0 -134
  251. package/test/unit/utils.test.ts +0 -366
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchwork-folder.js","sourceRoot":"","sources":["../../src/shapes/patchwork-folder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { AutomergeUrl, DocHandle, ImmutableString, Repo } from "@automerge/automerge-repo";
2
+ export type VfsNode = {
3
+ kind: "dir";
4
+ entries: Map<string, VfsNode>;
5
+ } | {
6
+ kind: "file";
7
+ url: AutomergeUrl;
8
+ };
9
+ export type UnixFileEntry = {
10
+ "@patchwork": {
11
+ type: "file";
12
+ };
13
+ content: string | Uint8Array | ImmutableString;
14
+ extension: string;
15
+ mimeType: string;
16
+ name: string;
17
+ };
18
+ export interface Shape {
19
+ encode(args: {
20
+ repo: Repo;
21
+ tree: VfsNode;
22
+ previousRoot?: DocHandle<unknown>;
23
+ }): Promise<AutomergeUrl>;
24
+ decode(args: {
25
+ repo: Repo;
26
+ root: DocHandle<unknown>;
27
+ }): Promise<VfsNode>;
28
+ }
29
+ export declare const newDir: () => VfsNode;
30
+ export declare function walkLeaves(node: VfsNode, prefix?: string[]): Generator<{
31
+ path: string[];
32
+ url: AutomergeUrl;
33
+ }>;
34
+ export declare function flattenLeaves(node: VfsNode): Map<string, AutomergeUrl>;
35
+ export declare function ensureDirAt(root: VfsNode, segments: string[]): VfsNode;
36
+ export declare function setFileAt(root: VfsNode, path: string[], url: AutomergeUrl): void;
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shapes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,IAAI,EACJ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,OAAO,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC3B,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,eAAe,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,WAAW,KAAK;IACrB,MAAM,CAAC,IAAI,EAAE;QACZ,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,YAAY,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE;QACZ,IAAI,EAAE,IAAI,CAAC;QACX,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;KACzB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,eAAO,MAAM,MAAM,QAAO,OAAgD,CAAC;AAE3E,wBAAiB,UAAU,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,GAAE,MAAM,EAAO,GACnB,SAAS,CAAC;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,CAAC,CAQlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAItE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAetE;AAED,wBAAgB,SAAS,CACxB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,YAAY,GACf,IAAI,CAKN"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newDir = void 0;
4
+ exports.walkLeaves = walkLeaves;
5
+ exports.flattenLeaves = flattenLeaves;
6
+ exports.ensureDirAt = ensureDirAt;
7
+ exports.setFileAt = setFileAt;
8
+ const newDir = () => ({ kind: "dir", entries: new Map() });
9
+ exports.newDir = newDir;
10
+ function* walkLeaves(node, prefix = []) {
11
+ if (node.kind === "file") {
12
+ yield { path: prefix, url: node.url };
13
+ return;
14
+ }
15
+ for (const [name, child] of node.entries) {
16
+ yield* walkLeaves(child, [...prefix, name]);
17
+ }
18
+ }
19
+ function flattenLeaves(node) {
20
+ const out = new Map();
21
+ for (const { path, url } of walkLeaves(node))
22
+ out.set(path.join("/"), url);
23
+ return out;
24
+ }
25
+ function ensureDirAt(root, segments) {
26
+ if (root.kind !== "dir")
27
+ throw new Error("ensureDirAt: root must be a dir");
28
+ let current = root;
29
+ for (const seg of segments) {
30
+ if (current.kind !== "dir")
31
+ throw new Error(`not a dir: ${seg}`);
32
+ const existing = current.entries.get(seg);
33
+ if (existing && existing.kind === "dir") {
34
+ current = existing;
35
+ }
36
+ else {
37
+ const fresh = (0, exports.newDir)();
38
+ current.entries.set(seg, fresh);
39
+ current = fresh;
40
+ }
41
+ }
42
+ return current;
43
+ }
44
+ function setFileAt(root, path, url) {
45
+ if (path.length === 0)
46
+ throw new Error("setFileAt: empty path");
47
+ const parent = ensureDirAt(root, path.slice(0, -1));
48
+ if (parent.kind !== "dir")
49
+ throw new Error("setFileAt: parent not a dir");
50
+ parent.entries.set(path[path.length - 1], { kind: "file", url });
51
+ }
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shapes/types.ts"],"names":[],"mappings":";;;AAiCA,gCAWC;AAED,sCAIC;AAED,kCAeC;AAED,8BASC;AA/CM,MAAM,MAAM,GAAG,GAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAA9D,QAAA,MAAM,UAAwD;AAE3E,QAAe,CAAC,CAAC,UAAU,CAC1B,IAAa,EACb,SAAmB,EAAE;IAErB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,OAAO;IACR,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,SAAgB,aAAa,CAAC,IAAa;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAgB,WAAW,CAAC,IAAa,EAAE,QAAkB;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAY,IAAI,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzC,OAAO,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,GAAG,IAAA,cAAM,GAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAgB,SAAS,CACxB,IAAa,EACb,IAAc,EACd,GAAiB;IAEjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Shape } from "./types.js";
2
+ export declare const vfsShape: Shape;
3
+ //# sourceMappingURL=vfs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vfs.d.ts","sourceRoot":"","sources":["../../src/shapes/vfs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,KAAK,EAAgB,MAAM,YAAY,CAAC;AAwB7E,eAAO,MAAM,QAAQ,EAAE,KA2CtB,CAAC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.vfsShape = void 0;
4
+ const automerge_repo_1 = require("@automerge/automerge-repo");
5
+ const log_js_1 = require("../log.js");
6
+ const types_js_1 = require("./types.js");
7
+ const dlog = (0, log_js_1.log)("shapes:vfs");
8
+ const META = "@patchwork";
9
+ const isDirectoryDoc = (doc) => {
10
+ if (!doc || typeof doc !== "object")
11
+ return false;
12
+ const meta = doc[META];
13
+ return (!!meta &&
14
+ typeof meta === "object" &&
15
+ meta.type === "directory");
16
+ };
17
+ const RESERVED = new Set([META, "lastSyncAt"]);
18
+ exports.vfsShape = {
19
+ async encode({ repo, tree, previousRoot }) {
20
+ if (tree.kind !== "dir")
21
+ throw new Error("vfs: root must be a dir");
22
+ const flat = (0, types_js_1.flattenLeaves)(tree);
23
+ dlog("encode keys=%d previousRoot=%s", flat.size, previousRoot?.url ?? "<new>");
24
+ const handle = previousRoot ??
25
+ repo.create({ "@patchwork": { type: "directory" } });
26
+ handle.change((d) => {
27
+ if (!d["@patchwork"])
28
+ d["@patchwork"] = { type: "directory" };
29
+ for (const k of Object.keys(d)) {
30
+ if (RESERVED.has(k))
31
+ continue;
32
+ if (!flat.has(k))
33
+ delete d[k];
34
+ }
35
+ for (const [k, url] of flat) {
36
+ d[k] = url;
37
+ }
38
+ });
39
+ dlog("encode complete url=%s", handle.url);
40
+ return handle.url;
41
+ },
42
+ async decode({ root }) {
43
+ const doc = root.doc();
44
+ if (!isDirectoryDoc(doc)) {
45
+ throw new Error(`expected directory doc at ${root.url}`);
46
+ }
47
+ const tree = (0, types_js_1.newDir)();
48
+ let count = 0;
49
+ for (const [key, value] of Object.entries(doc)) {
50
+ if (RESERVED.has(key))
51
+ continue;
52
+ if (typeof value !== "string")
53
+ continue;
54
+ if (!(0, automerge_repo_1.isValidAutomergeUrl)(value))
55
+ continue;
56
+ const segments = key.split("/").filter(Boolean);
57
+ if (segments.length === 0)
58
+ continue;
59
+ setLeaf(tree, segments, value);
60
+ count++;
61
+ }
62
+ dlog("decode url=%s leaves=%d", root.url, count);
63
+ return tree;
64
+ },
65
+ };
66
+ function setLeaf(root, segments, url) {
67
+ if (root.kind !== "dir")
68
+ throw new Error("setLeaf: root must be a dir");
69
+ let cur = root;
70
+ for (let i = 0; i < segments.length - 1; i++) {
71
+ if (cur.kind !== "dir")
72
+ return;
73
+ const name = segments[i];
74
+ const existing = cur.entries.get(name);
75
+ if (existing && existing.kind === "dir") {
76
+ cur = existing;
77
+ }
78
+ else {
79
+ const fresh = (0, types_js_1.newDir)();
80
+ cur.entries.set(name, fresh);
81
+ cur = fresh;
82
+ }
83
+ }
84
+ if (cur.kind !== "dir")
85
+ return;
86
+ cur.entries.set(segments[segments.length - 1], { kind: "file", url });
87
+ }
88
+ //# sourceMappingURL=vfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../src/shapes/vfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type StashKind = "modified" | "added" | "deleted";
2
+ export interface StashEntry {
3
+ path: string;
4
+ kind: StashKind;
5
+ contentBase64?: string;
6
+ }
7
+ export interface Stash {
8
+ id: number;
9
+ name?: string;
10
+ branch: string | null;
11
+ createdAt: number;
12
+ entries: StashEntry[];
13
+ }
14
+ export declare function listStashes(root: string): Promise<Stash[]>;
15
+ export declare function appendStash(root: string, args: {
16
+ name?: string;
17
+ branch: string | null;
18
+ entries: StashEntry[];
19
+ }): Promise<Stash>;
20
+ export declare function takeStash(root: string, selector?: string): Promise<Stash | null>;
21
+ export declare function encodeBytes(bytes: Uint8Array): string;
22
+ export declare function decodeBytes(b64: string): Uint8Array;
23
+ //# sourceMappingURL=stash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stash.d.ts","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;CACtB;AA+BD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAIhE;AAED,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GACnE,OAAO,CAAC,KAAK,CAAC,CAchB;AAED,wBAAsB,SAAS,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAkBvB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAEnD"}
package/dist/stash.js ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listStashes = listStashes;
37
+ exports.appendStash = appendStash;
38
+ exports.takeStash = takeStash;
39
+ exports.encodeBytes = encodeBytes;
40
+ exports.decodeBytes = decodeBytes;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ const log_js_1 = require("./log.js");
44
+ const dlog = (0, log_js_1.log)("stash");
45
+ const SNARF_DIR = path.join(".pushwork", "snarf");
46
+ const SNARF_INDEX = path.join(SNARF_DIR, "index.json");
47
+ async function readStashes(root) {
48
+ try {
49
+ const text = await fs.readFile(path.join(root, SNARF_INDEX), "utf8");
50
+ const parsed = JSON.parse(text);
51
+ if (!Array.isArray(parsed))
52
+ return [];
53
+ return parsed;
54
+ }
55
+ catch (err) {
56
+ if (err.code === "ENOENT")
57
+ return [];
58
+ throw err;
59
+ }
60
+ }
61
+ async function writeStashes(root, stashes) {
62
+ await fs.mkdir(path.join(root, SNARF_DIR), { recursive: true });
63
+ await fs.writeFile(path.join(root, SNARF_INDEX), JSON.stringify(stashes, null, 2) + "\n");
64
+ }
65
+ function nextId(stashes) {
66
+ let max = 0;
67
+ for (const s of stashes)
68
+ if (s.id > max)
69
+ max = s.id;
70
+ return max + 1;
71
+ }
72
+ async function listStashes(root) {
73
+ const stashes = await readStashes(root);
74
+ stashes.sort((a, b) => b.id - a.id); // newest first
75
+ return stashes;
76
+ }
77
+ async function appendStash(root, args) {
78
+ const stashes = await readStashes(root);
79
+ const id = nextId(stashes);
80
+ const stash = {
81
+ id,
82
+ name: args.name,
83
+ branch: args.branch,
84
+ createdAt: Date.now(),
85
+ entries: args.entries,
86
+ };
87
+ stashes.push(stash);
88
+ await writeStashes(root, stashes);
89
+ dlog("appendStash id=%d name=%s entries=%d", id, args.name ?? "(unnamed)", args.entries.length);
90
+ return stash;
91
+ }
92
+ async function takeStash(root, selector) {
93
+ const stashes = await readStashes(root);
94
+ if (stashes.length === 0)
95
+ return null;
96
+ let idx;
97
+ if (!selector) {
98
+ // most recent
99
+ idx = stashes.reduce((best, s, i) => (s.id > stashes[best].id ? i : best), 0);
100
+ }
101
+ else {
102
+ const asInt = Number(selector);
103
+ idx = stashes.findIndex((s) => (!Number.isNaN(asInt) && s.id === asInt) || s.name === selector);
104
+ if (idx < 0)
105
+ return null;
106
+ }
107
+ const [taken] = stashes.splice(idx, 1);
108
+ await writeStashes(root, stashes);
109
+ dlog("takeStash id=%d name=%s", taken.id, taken.name ?? "(unnamed)");
110
+ return taken;
111
+ }
112
+ function encodeBytes(bytes) {
113
+ return Buffer.from(bytes).toString("base64");
114
+ }
115
+ function decodeBytes(b64) {
116
+ return new Uint8Array(Buffer.from(b64, "base64"));
117
+ }
118
+ //# sourceMappingURL=stash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stash.js","sourceRoot":"","sources":["../src/stash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,kCAIC;AAED,kCAiBC;AAED,8BAqBC;AAED,kCAEC;AAED,kCAEC;AAzGD,gDAAkC;AAClC,2CAA6B;AAC7B,qCAA+B;AAE/B,MAAM,IAAI,GAAG,IAAA,YAAG,EAAC,OAAO,CAAC,CAAC;AAkB1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEvD,KAAK,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAgB;IACzD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,SAAS,CACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACvC,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAAgB;IAC/B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC,CAAC,EAAE,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;IACpD,OAAO,GAAG,GAAG,CAAC,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe;IACpD,OAAO,OAAO,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,WAAW,CAChC,IAAY,EACZ,IAAqE;IAErE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAU;QACpB,EAAE;QACF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,SAAS,CAC9B,IAAY,EACZ,QAAiB;IAEjB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,cAAc;QACd,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACP,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC/D,CAAC;QACF,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC;IACrE,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,WAAW,CAAC,KAAiB;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACtC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC"}
package/flake.lock ADDED
@@ -0,0 +1,128 @@
1
+ {
2
+ "nodes": {
3
+ "command-utils": {
4
+ "inputs": {
5
+ "flake-utils": "flake-utils",
6
+ "nixpkgs": "nixpkgs"
7
+ },
8
+ "locked": {
9
+ "lastModified": 1769220798,
10
+ "narHash": "sha256-ulD8bbh5eV4rUH61JC4gS8Ik0R2hBEEyCom3f8w2vXE=",
11
+ "ref": "refs/heads/main",
12
+ "rev": "6c72a70e0241a5af26ba664ab63f3e2d89c45cd0",
13
+ "revCount": 5,
14
+ "type": "git",
15
+ "url": "https://codeberg.org/expede/nix-command-utils"
16
+ },
17
+ "original": {
18
+ "type": "git",
19
+ "url": "https://codeberg.org/expede/nix-command-utils"
20
+ }
21
+ },
22
+ "flake-utils": {
23
+ "inputs": {
24
+ "systems": "systems"
25
+ },
26
+ "locked": {
27
+ "lastModified": 1709126324,
28
+ "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
29
+ "owner": "numtide",
30
+ "repo": "flake-utils",
31
+ "rev": "d465f4819400de7c8d874d50b982301f28a84605",
32
+ "type": "github"
33
+ },
34
+ "original": {
35
+ "id": "flake-utils",
36
+ "type": "indirect"
37
+ }
38
+ },
39
+ "flake-utils_2": {
40
+ "inputs": {
41
+ "systems": "systems_2"
42
+ },
43
+ "locked": {
44
+ "lastModified": 1731533236,
45
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
46
+ "owner": "numtide",
47
+ "repo": "flake-utils",
48
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
49
+ "type": "github"
50
+ },
51
+ "original": {
52
+ "owner": "numtide",
53
+ "repo": "flake-utils",
54
+ "type": "github"
55
+ }
56
+ },
57
+ "nixpkgs": {
58
+ "locked": {
59
+ "lastModified": 1769089682,
60
+ "narHash": "sha256-9yA/LIuAVQq0lXelrZPjLuLVuZdm03p8tfmHhnDIkms=",
61
+ "owner": "NixOS",
62
+ "repo": "nixpkgs",
63
+ "rev": "078d69f03934859a181e81ba987c2bb033eebfc5",
64
+ "type": "github"
65
+ },
66
+ "original": {
67
+ "id": "nixpkgs",
68
+ "ref": "nixos-25.11",
69
+ "type": "indirect"
70
+ }
71
+ },
72
+ "nixpkgs_2": {
73
+ "locked": {
74
+ "lastModified": 1775002709,
75
+ "narHash": "sha256-d3Yx83vSrN+2z/loBh4mJpyRqr9aAJqlke4TkpFmRJA=",
76
+ "owner": "nixos",
77
+ "repo": "nixpkgs",
78
+ "rev": "bcd464ccd2a1a7cd09aa2f8d4ffba83b761b1d0e",
79
+ "type": "github"
80
+ },
81
+ "original": {
82
+ "owner": "nixos",
83
+ "ref": "nixos-25.11",
84
+ "repo": "nixpkgs",
85
+ "type": "github"
86
+ }
87
+ },
88
+ "root": {
89
+ "inputs": {
90
+ "command-utils": "command-utils",
91
+ "flake-utils": "flake-utils_2",
92
+ "nixpkgs": "nixpkgs_2"
93
+ }
94
+ },
95
+ "systems": {
96
+ "locked": {
97
+ "lastModified": 1681028828,
98
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
99
+ "owner": "nix-systems",
100
+ "repo": "default",
101
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
102
+ "type": "github"
103
+ },
104
+ "original": {
105
+ "owner": "nix-systems",
106
+ "repo": "default",
107
+ "type": "github"
108
+ }
109
+ },
110
+ "systems_2": {
111
+ "locked": {
112
+ "lastModified": 1681028828,
113
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
114
+ "owner": "nix-systems",
115
+ "repo": "default",
116
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
117
+ "type": "github"
118
+ },
119
+ "original": {
120
+ "owner": "nix-systems",
121
+ "repo": "default",
122
+ "type": "github"
123
+ }
124
+ }
125
+ },
126
+ "root": "root",
127
+ "version": 7
128
+ }
package/flake.nix ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ description = "Pushwork: Bidirectional directory synchronization using Automerge CRDTs";
3
+
4
+ inputs = {
5
+ command-utils.url = "git+https://codeberg.org/expede/nix-command-utils";
6
+ flake-utils.url = "github:numtide/flake-utils";
7
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
8
+ };
9
+
10
+ outputs = {
11
+ self,
12
+ command-utils,
13
+ flake-utils,
14
+ nixpkgs,
15
+ }:
16
+ flake-utils.lib.eachDefaultSystem (system: let
17
+ pkgs = import nixpkgs {inherit system;};
18
+
19
+ nodejs = pkgs.nodejs_24;
20
+ pnpm-pkg = pkgs.pnpm;
21
+ pnpm' = "${pnpm-pkg}/bin/pnpm";
22
+
23
+ asModule = command-utils.asModule.${system};
24
+ cmd = command-utils.cmd.${system};
25
+ pnpm = command-utils.pnpm.${system};
26
+
27
+ pnpm-cfg = {pnpm = pnpm';};
28
+
29
+ menu =
30
+ command-utils.commands.${system}
31
+ [
32
+ (pnpm.build pnpm-cfg)
33
+ (pnpm.dev pnpm-cfg)
34
+ (pnpm.install pnpm-cfg)
35
+ (pnpm.lint pnpm-cfg)
36
+ (pnpm.test pnpm-cfg)
37
+ (pnpm.typecheck pnpm-cfg)
38
+ (asModule {
39
+ "clean" = cmd "Remove dist and node_modules" "rm -rf dist node_modules";
40
+ "start" = cmd "Run pushwork CLI" "node dist/cli.js \"$@\"";
41
+ "sync" = cmd "Build and run sync" "${pnpm'} build && node dist/cli.js sync \"$@\"";
42
+ "watch" = cmd "Watch, build, and sync loop" "node dist/cli.js watch \"$@\"";
43
+ })
44
+ ];
45
+ in {
46
+ devShells.default = pkgs.mkShell {
47
+ name = "Pushwork Dev Shell";
48
+
49
+ nativeBuildInputs =
50
+ [
51
+ nodejs
52
+ pkgs.nodePackages.vscode-langservers-extracted
53
+ pkgs.typescript
54
+ pkgs.typescript-language-server
55
+ pnpm-pkg
56
+ ]
57
+ ++ menu;
58
+
59
+ shellHook = ''
60
+ menu
61
+ '';
62
+ };
63
+
64
+ formatter = pkgs.alejandra;
65
+ });
66
+ }