@tinyrack/devsync 1.1.0 → 1.3.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 (220) hide show
  1. package/README.md +230 -62
  2. package/dist/cli/base-command.d.ts +14 -0
  3. package/dist/cli/base-command.d.ts.map +1 -0
  4. package/dist/cli/base-command.js +22 -0
  5. package/dist/cli/base-command.js.map +1 -0
  6. package/dist/cli/commands/dir.d.ts +8 -0
  7. package/dist/cli/commands/dir.d.ts.map +1 -0
  8. package/dist/cli/commands/dir.js +16 -0
  9. package/dist/cli/commands/dir.js.map +1 -0
  10. package/dist/cli/commands/doctor.d.ts +8 -0
  11. package/dist/cli/commands/doctor.d.ts.map +1 -0
  12. package/dist/cli/commands/doctor.js +18 -0
  13. package/dist/cli/commands/doctor.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +23 -0
  15. package/dist/cli/commands/index.d.ts.map +1 -0
  16. package/dist/cli/commands/index.js +23 -0
  17. package/dist/cli/commands/index.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +15 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +43 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/machine/list.d.ts +7 -0
  23. package/dist/cli/commands/machine/list.d.ts.map +1 -0
  24. package/dist/cli/commands/machine/list.js +12 -0
  25. package/dist/cli/commands/machine/list.js.map +1 -0
  26. package/dist/cli/commands/machine/use.d.ts +11 -0
  27. package/dist/cli/commands/machine/use.d.ts.map +1 -0
  28. package/dist/cli/commands/machine/use.js +28 -0
  29. package/dist/cli/commands/machine/use.js.map +1 -0
  30. package/dist/cli/commands/pull.d.ts +12 -0
  31. package/dist/cli/commands/pull.d.ts.map +1 -0
  32. package/dist/cli/commands/pull.js +34 -0
  33. package/dist/cli/commands/pull.js.map +1 -0
  34. package/dist/cli/commands/push.d.ts +12 -0
  35. package/dist/cli/commands/push.d.ts.map +1 -0
  36. package/dist/cli/commands/push.js +34 -0
  37. package/dist/cli/commands/push.js.map +1 -0
  38. package/dist/cli/commands/status.d.ts +11 -0
  39. package/dist/cli/commands/status.d.ts.map +1 -0
  40. package/dist/cli/commands/status.js +27 -0
  41. package/dist/cli/commands/status.js.map +1 -0
  42. package/dist/cli/commands/track.d.ts +16 -0
  43. package/dist/cli/commands/track.d.ts.map +1 -0
  44. package/dist/cli/commands/track.js +82 -0
  45. package/dist/cli/commands/track.js.map +1 -0
  46. package/dist/cli/commands/untrack.d.ts +11 -0
  47. package/dist/cli/commands/untrack.d.ts.map +1 -0
  48. package/dist/cli/commands/untrack.js +28 -0
  49. package/dist/cli/commands/untrack.js.map +1 -0
  50. package/dist/config/global-config.d.ts +21 -0
  51. package/dist/config/global-config.d.ts.map +1 -0
  52. package/dist/config/global-config.js +106 -0
  53. package/dist/config/global-config.js.map +1 -0
  54. package/dist/config/platform.d.ts +11 -0
  55. package/dist/config/platform.d.ts.map +1 -0
  56. package/dist/config/platform.js +19 -0
  57. package/dist/config/platform.js.map +1 -0
  58. package/dist/config/sync.d.ts +107 -0
  59. package/dist/config/sync.d.ts.map +1 -0
  60. package/dist/config/sync.js +424 -0
  61. package/dist/config/sync.js.map +1 -0
  62. package/dist/config/xdg.d.ts +14 -0
  63. package/dist/config/xdg.d.ts.map +1 -0
  64. package/dist/config/xdg.js +102 -0
  65. package/dist/config/xdg.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/{src/index.ts → dist/index.js} +1 -1
  69. package/dist/index.js.map +1 -0
  70. package/dist/lib/file-mode.d.ts +3 -0
  71. package/dist/lib/file-mode.d.ts.map +1 -0
  72. package/dist/lib/file-mode.js +7 -0
  73. package/dist/lib/file-mode.js.map +1 -0
  74. package/dist/lib/output.d.ts +31 -0
  75. package/dist/lib/output.d.ts.map +1 -0
  76. package/dist/lib/output.js +198 -0
  77. package/dist/lib/output.js.map +1 -0
  78. package/dist/lib/path.d.ts +5 -0
  79. package/dist/lib/path.d.ts.map +1 -0
  80. package/dist/lib/path.js +25 -0
  81. package/dist/lib/path.js.map +1 -0
  82. package/dist/lib/string.d.ts +2 -0
  83. package/dist/lib/string.d.ts.map +1 -0
  84. package/dist/lib/string.js +4 -0
  85. package/dist/lib/string.js.map +1 -0
  86. package/dist/lib/validation.d.ts +3 -0
  87. package/dist/lib/validation.d.ts.map +1 -0
  88. package/dist/lib/validation.js +9 -0
  89. package/dist/lib/validation.js.map +1 -0
  90. package/dist/services/add.d.ts +20 -0
  91. package/dist/services/add.d.ts.map +1 -0
  92. package/dist/services/add.js +161 -0
  93. package/dist/services/add.js.map +1 -0
  94. package/dist/services/config-file.d.ts +45 -0
  95. package/dist/services/config-file.d.ts.map +1 -0
  96. package/dist/services/config-file.js +35 -0
  97. package/dist/services/config-file.js.map +1 -0
  98. package/dist/services/crypto.d.ts +9 -0
  99. package/dist/services/crypto.d.ts.map +1 -0
  100. package/dist/services/crypto.js +75 -0
  101. package/dist/services/crypto.js.map +1 -0
  102. package/dist/services/doctor.d.ts +16 -0
  103. package/dist/services/doctor.d.ts.map +1 -0
  104. package/dist/services/doctor.js +84 -0
  105. package/dist/services/doctor.js.map +1 -0
  106. package/dist/services/error.d.ts +14 -0
  107. package/dist/services/error.d.ts.map +1 -0
  108. package/dist/services/error.js +38 -0
  109. package/dist/services/error.js.map +1 -0
  110. package/dist/services/filesystem.d.ts +15 -0
  111. package/dist/services/filesystem.d.ts.map +1 -0
  112. package/dist/services/filesystem.js +113 -0
  113. package/dist/services/filesystem.js.map +1 -0
  114. package/dist/services/forget.d.ts +14 -0
  115. package/dist/services/forget.d.ts.map +1 -0
  116. package/dist/services/forget.js +124 -0
  117. package/dist/services/forget.js.map +1 -0
  118. package/dist/services/git.d.ts +10 -0
  119. package/dist/services/git.d.ts.map +1 -0
  120. package/dist/services/git.js +57 -0
  121. package/dist/services/git.js.map +1 -0
  122. package/dist/services/init.d.ts +19 -0
  123. package/dist/services/init.d.ts.map +1 -0
  124. package/dist/services/init.js +203 -0
  125. package/dist/services/init.js.map +1 -0
  126. package/dist/services/local-materialization.d.ts +28 -0
  127. package/dist/services/local-materialization.d.ts.map +1 -0
  128. package/dist/services/local-materialization.js +262 -0
  129. package/dist/services/local-materialization.js.map +1 -0
  130. package/dist/services/local-snapshot.d.ts +25 -0
  131. package/dist/services/local-snapshot.d.ts.map +1 -0
  132. package/dist/services/local-snapshot.js +93 -0
  133. package/dist/services/local-snapshot.js.map +1 -0
  134. package/dist/services/machine.d.ts +40 -0
  135. package/dist/services/machine.d.ts.map +1 -0
  136. package/dist/services/machine.js +113 -0
  137. package/dist/services/machine.js.map +1 -0
  138. package/dist/services/paths.d.ts +13 -0
  139. package/dist/services/paths.d.ts.map +1 -0
  140. package/dist/services/paths.js +71 -0
  141. package/dist/services/paths.js.map +1 -0
  142. package/dist/services/pull.d.ts +28 -0
  143. package/dist/services/pull.d.ts.map +1 -0
  144. package/dist/services/pull.js +67 -0
  145. package/dist/services/pull.js.map +1 -0
  146. package/dist/services/push.d.ts +35 -0
  147. package/dist/services/push.d.ts.map +1 -0
  148. package/dist/services/push.js +96 -0
  149. package/dist/services/push.js.map +1 -0
  150. package/dist/services/repo-artifacts.d.ts +52 -0
  151. package/dist/services/repo-artifacts.d.ts.map +1 -0
  152. package/dist/services/repo-artifacts.js +251 -0
  153. package/dist/services/repo-artifacts.js.map +1 -0
  154. package/dist/services/repo-snapshot.d.ts +6 -0
  155. package/dist/services/repo-snapshot.d.ts.map +1 -0
  156. package/dist/services/repo-snapshot.js +163 -0
  157. package/dist/services/repo-snapshot.js.map +1 -0
  158. package/dist/services/runtime.d.ts +40 -0
  159. package/dist/services/runtime.d.ts.map +1 -0
  160. package/dist/services/runtime.js +71 -0
  161. package/dist/services/runtime.js.map +1 -0
  162. package/dist/services/set.d.ts +38 -0
  163. package/dist/services/set.d.ts.map +1 -0
  164. package/dist/services/set.js +184 -0
  165. package/dist/services/set.js.map +1 -0
  166. package/dist/services/status.d.ts +30 -0
  167. package/dist/services/status.d.ts.map +1 -0
  168. package/dist/services/status.js +35 -0
  169. package/dist/services/status.js.map +1 -0
  170. package/package.json +15 -7
  171. package/src/cli/commands/add.ts +0 -40
  172. package/src/cli/commands/cd.ts +0 -80
  173. package/src/cli/commands/doctor.ts +0 -20
  174. package/src/cli/commands/forget.ts +0 -32
  175. package/src/cli/commands/index.ts +0 -23
  176. package/src/cli/commands/init.ts +0 -43
  177. package/src/cli/commands/list.ts +0 -17
  178. package/src/cli/commands/pull.ts +0 -31
  179. package/src/cli/commands/push.ts +0 -31
  180. package/src/cli/commands/set.ts +0 -47
  181. package/src/cli/commands/status.ts +0 -18
  182. package/src/cli/sync-output.test.ts +0 -173
  183. package/src/cli/sync-output.ts +0 -200
  184. package/src/config/sync.test.ts +0 -609
  185. package/src/config/sync.ts +0 -572
  186. package/src/config/xdg.ts +0 -138
  187. package/src/lib/string.test.ts +0 -13
  188. package/src/lib/string.ts +0 -3
  189. package/src/lib/validation.test.ts +0 -32
  190. package/src/lib/validation.ts +0 -11
  191. package/src/services/add.ts +0 -178
  192. package/src/services/config-file.test.ts +0 -161
  193. package/src/services/config-file.ts +0 -101
  194. package/src/services/crypto.test.ts +0 -132
  195. package/src/services/crypto.ts +0 -83
  196. package/src/services/doctor.ts +0 -142
  197. package/src/services/error.ts +0 -6
  198. package/src/services/filesystem.test.ts +0 -171
  199. package/src/services/filesystem.ts +0 -183
  200. package/src/services/forget.ts +0 -261
  201. package/src/services/git.test.ts +0 -83
  202. package/src/services/git.ts +0 -74
  203. package/src/services/init.test.ts +0 -109
  204. package/src/services/init.ts +0 -244
  205. package/src/services/list.ts +0 -63
  206. package/src/services/local-materialization.ts +0 -421
  207. package/src/services/local-snapshot.ts +0 -173
  208. package/src/services/paths.test.ts +0 -74
  209. package/src/services/paths.ts +0 -98
  210. package/src/services/pull.ts +0 -144
  211. package/src/services/push.ts +0 -168
  212. package/src/services/repo-artifacts.ts +0 -262
  213. package/src/services/repo-snapshot.ts +0 -197
  214. package/src/services/runtime.ts +0 -57
  215. package/src/services/set.ts +0 -383
  216. package/src/services/status.ts +0 -57
  217. package/src/services/sync.dry-run.test.ts +0 -179
  218. package/src/services/sync.runtime.test.ts +0 -756
  219. package/src/services/sync.service.test.ts +0 -1169
  220. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IACxC,MAAM,CAAU,OAAO,GAAG,0CAA0C,CAAC;IAErE,MAAM,CAAU,WAAW,GAChC,6PAA6P,CAAC;IAEzP,MAAM,CAAU,QAAQ,GAAG;QAChC,qCAAqC;QACrC,0EAA0E;QAC1E,4GAA4G;KAC7G,CAAC;IAEK,MAAM,CAAU,IAAI,GAAG;QAC5B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEK,MAAM,CAAU,KAAK,GAAG;QAC7B,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,mCAAmC;YAC5C,WAAW,EACT,gJAAgJ;SACnJ,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;YACtB,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,qCAAqC;YAC9C,WAAW,EACT,uIAAuI;YACzI,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,oBAAoB,CACjC,MAAM,cAAc,CAClB;YACE,YAAY,EAAE,KAAK,CAAC,QAAQ;YAC5B,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,EACD,iBAAiB,EAAE,CACpB,CACF,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncMachineList extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/machine/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAuB,OAAO,SAA8C;IAE5E,OAAuB,WAAW,SACgH;IAE5H,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3C"}
@@ -0,0 +1,12 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ import { formatSyncMachineListResult } from "#app/lib/output.js";
3
+ import { listSyncMachines } from "#app/services/machine.js";
4
+ import { createSyncContext } from "#app/services/runtime.js";
5
+ export default class SyncMachineList extends BaseCommand {
6
+ static summary = "Show configured and active sync machines";
7
+ static description = "List the machine names referenced by the current sync configuration and show which machine is active through ~/.config/devsync/settings.json.";
8
+ async run() {
9
+ this.print(formatSyncMachineListResult(await listSyncMachines(createSyncContext())));
10
+ }
11
+ }
12
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/cli/commands/machine/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IAC/C,MAAM,CAAU,OAAO,GAAG,0CAA0C,CAAC;IAErE,MAAM,CAAU,WAAW,GAChC,+IAA+I,CAAC;IAElI,KAAK,CAAC,GAAG;QACvB,IAAI,CAAC,KAAK,CACR,2BAA2B,CAAC,MAAM,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CACzE,CAAC;IACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncMachineUse extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ machine: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/machine/use.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,OAAuB,OAAO,SAA0C;IAExE,OAAuB,WAAW,SACuJ;IAEzL,OAAuB,QAAQ,WAG7B;IAEF,OAAuB,IAAI;;MAKzB;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAU3C"}
@@ -0,0 +1,28 @@
1
+ import { Args } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncMachineUpdateResult } from "#app/lib/output.js";
4
+ import { clearSyncMachines, useSyncMachine } from "#app/services/machine.js";
5
+ import { createSyncContext } from "#app/services/runtime.js";
6
+ export default class SyncMachineUse extends BaseCommand {
7
+ static summary = "Set or clear the active sync machine";
8
+ static description = "Write ~/.config/devsync/settings.json so plain push, pull, status, and doctor commands use the selected machine layer by default. Omit the machine name to clear the active machine.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> work",
11
+ "<%= config.bin %> <%= command.id %>",
12
+ ];
13
+ static args = {
14
+ machine: Args.string({
15
+ description: "Machine name to activate (omit to clear)",
16
+ required: false,
17
+ }),
18
+ };
19
+ async run() {
20
+ const { args } = await this.parse(SyncMachineUse);
21
+ const context = createSyncContext();
22
+ const result = args.machine !== undefined
23
+ ? await useSyncMachine(args.machine, context)
24
+ : await clearSyncMachines(context);
25
+ this.print(formatSyncMachineUpdateResult(result));
26
+ }
27
+ }
28
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../../../src/cli/commands/machine/use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IAC9C,MAAM,CAAU,OAAO,GAAG,sCAAsC,CAAC;IAEjE,MAAM,CAAU,WAAW,GAChC,sLAAsL,CAAC;IAElL,MAAM,CAAU,QAAQ,GAAG;QAChC,0CAA0C;QAC1C,qCAAqC;KACtC,CAAC;IAEK,MAAM,CAAU,IAAI,GAAG;QAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,0CAA0C;YACvD,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,MAAM,MAAM,GACV,IAAI,CAAC,OAAO,KAAK,SAAS;YACxB,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;YAC7C,CAAC,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncPull extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ "dry-run": import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ machine: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAuB,OAAO,SACiC;IAE/D,OAAuB,WAAW,SACyL;IAE3N,OAAuB,QAAQ,WAI7B;IAEF,OAAuB,KAAK;;;MAY1B;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc3C"}
@@ -0,0 +1,34 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncPullResult } from "#app/lib/output.js";
4
+ import { pullSync } from "#app/services/pull.js";
5
+ import { createSyncContext } from "#app/services/runtime.js";
6
+ export default class SyncPull extends BaseCommand {
7
+ static summary = "Apply the git-backed sync repository to local config paths";
8
+ static description = "Read tracked artifacts from the sync repository and materialize them back onto local paths under your home directory. Secret artifacts are decrypted with the configured age identity before they are written locally.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %>",
11
+ "<%= config.bin %> <%= command.id %> --dry-run",
12
+ "<%= config.bin %> <%= command.id %> --machine work",
13
+ ];
14
+ static flags = {
15
+ "dry-run": Flags.boolean({
16
+ default: false,
17
+ summary: "Preview local file updates only",
18
+ description: "Show which local files and directories devsync would create, update, or remove without touching the working machine state.",
19
+ }),
20
+ machine: Flags.string({
21
+ summary: "Use a specific machine layer for this command",
22
+ description: "Override the persisted active machine for this pull operation only.",
23
+ }),
24
+ };
25
+ async run() {
26
+ const { flags } = await this.parse(SyncPull);
27
+ const output = formatSyncPullResult(await pullSync({
28
+ dryRun: flags["dry-run"],
29
+ machine: flags.machine,
30
+ }, createSyncContext()));
31
+ this.print(output);
32
+ }
33
+ }
34
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IACxC,MAAM,CAAU,OAAO,GAC5B,4DAA4D,CAAC;IAExD,MAAM,CAAU,WAAW,GAChC,wNAAwN,CAAC;IAEpN,MAAM,CAAU,QAAQ,GAAG;QAChC,qCAAqC;QACrC,+CAA+C;QAC/C,oDAAoD;KACrD,CAAC;IAEK,MAAM,CAAU,KAAK,GAAG;QAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iCAAiC;YAC1C,WAAW,EACT,4HAA4H;SAC/H,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,+CAA+C;YACxD,WAAW,EACT,qEAAqE;SACxE,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CACjC,MAAM,QAAQ,CACZ;YACE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,EACD,iBAAiB,EAAE,CACpB,CACF,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncPush extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ "dry-run": import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ machine: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ run(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=push.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAuB,OAAO,SAC8B;IAE5D,OAAuB,WAAW,SACkK;IAEpM,OAAuB,QAAQ,WAI7B;IAEF,OAAuB,KAAK;;;MAY1B;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAc3C"}
@@ -0,0 +1,34 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncPushResult } from "#app/lib/output.js";
4
+ import { pushSync } from "#app/services/push.js";
5
+ import { createSyncContext } from "#app/services/runtime.js";
6
+ export default class SyncPush extends BaseCommand {
7
+ static summary = "Mirror local config into the git-backed sync repository";
8
+ static description = "Collect the current state of tracked local files and directories, then update the sync repository artifacts to match. Secret targets are encrypted before they are written into the repository.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %>",
11
+ "<%= config.bin %> <%= command.id %> --dry-run",
12
+ "<%= config.bin %> <%= command.id %> --machine work",
13
+ ];
14
+ static flags = {
15
+ "dry-run": Flags.boolean({
16
+ default: false,
17
+ summary: "Preview repository updates only",
18
+ description: "Show which repository files devsync would create, update, or remove without writing any changes into the sync repository.",
19
+ }),
20
+ machine: Flags.string({
21
+ summary: "Use a specific machine layer for this command",
22
+ description: "Override the persisted active machine for this push operation only.",
23
+ }),
24
+ };
25
+ async run() {
26
+ const { flags } = await this.parse(SyncPush);
27
+ const output = formatSyncPushResult(await pushSync({
28
+ dryRun: flags["dry-run"],
29
+ machine: flags.machine,
30
+ }, createSyncContext()));
31
+ this.print(output);
32
+ }
33
+ }
34
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IACxC,MAAM,CAAU,OAAO,GAC5B,yDAAyD,CAAC;IAErD,MAAM,CAAU,WAAW,GAChC,iMAAiM,CAAC;IAE7L,MAAM,CAAU,QAAQ,GAAG;QAChC,qCAAqC;QACrC,+CAA+C;QAC/C,oDAAoD;KACrD,CAAC;IAEK,MAAM,CAAU,KAAK,GAAG;QAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iCAAiC;YAC1C,WAAW,EACT,2HAA2H;SAC9H,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,+CAA+C;YACxD,WAAW,EACT,qEAAqE;SACxE,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CACjC,MAAM,QAAQ,CACZ;YACE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,EACD,iBAAiB,EAAE,CACpB,CACF,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncStatus extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ machine: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,OAAuB,OAAO,SACqC;IAEnE,OAAuB,WAAW,SAC8H;IAEhK,OAAuB,QAAQ,WAG7B;IAEF,OAAuB,KAAK;;MAM1B;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAU3C"}
@@ -0,0 +1,27 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncStatusResult } from "#app/lib/output.js";
4
+ import { createSyncContext } from "#app/services/runtime.js";
5
+ import { getSyncStatus } from "#app/services/status.js";
6
+ export default class SyncStatus extends BaseCommand {
7
+ static summary = "Show planned push and pull changes for the current sync config";
8
+ static description = "Compare the tracked local files with the sync repository and report what push would write to the repository and what pull would write back to your machine.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %>",
11
+ "<%= config.bin %> <%= command.id %> --machine work",
12
+ ];
13
+ static flags = {
14
+ machine: Flags.string({
15
+ summary: "Use a specific machine layer for this command",
16
+ description: "Override the persisted active machine for this status command only.",
17
+ }),
18
+ };
19
+ async run() {
20
+ const { flags } = await this.parse(SyncStatus);
21
+ const output = formatSyncStatusResult(await getSyncStatus(createSyncContext(), {
22
+ machine: flags.machine,
23
+ }));
24
+ this.print(output);
25
+ }
26
+ }
27
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IAC1C,MAAM,CAAU,OAAO,GAC5B,gEAAgE,CAAC;IAE5D,MAAM,CAAU,WAAW,GAChC,6JAA6J,CAAC;IAEzJ,MAAM,CAAU,QAAQ,GAAG;QAChC,qCAAqC;QACrC,oDAAoD;KACrD,CAAC;IAEK,MAAM,CAAU,KAAK,GAAG;QAC7B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,+CAA+C;YACxD,WAAW,EACT,qEAAqE;SACxE,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CACnC,MAAM,aAAa,CAAC,iBAAiB,EAAE,EAAE;YACvC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncTrack extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static strict: boolean;
7
+ static args: {
8
+ targets: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ machine: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ mode: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/track.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQvD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,OAAuB,OAAO,SACmB;IAEjD,OAAuB,WAAW,SAC+P;IAEjS,OAAuB,QAAQ,WAS7B;IAEF,OAAuB,MAAM,UAAS;IAEtC,OAAuB,IAAI;;MAMzB;IAEF,OAAuB,KAAK;;;MAc1B;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuD3C"}
@@ -0,0 +1,82 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncAddResult, formatSyncSetResult } from "#app/lib/output.js";
4
+ import { trackSyncTarget } from "#app/services/add.js";
5
+ import { DevsyncError } from "#app/services/error.js";
6
+ import { assignSyncMachines } from "#app/services/machine.js";
7
+ import { createSyncContext } from "#app/services/runtime.js";
8
+ import { setSyncTargetMode } from "#app/services/set.js";
9
+ export default class SyncTrack extends BaseCommand {
10
+ static summary = "Track local files or directories for syncing";
11
+ static description = "Register one or more files or directories inside your home directory so devsync can mirror them into the sync repository. If a target is already tracked, its mode is updated. Targets may also be repository paths inside a tracked directory to create child entries with a specific mode.";
12
+ static examples = [
13
+ "<%= config.bin %> <%= command.id %> ~/.gitconfig",
14
+ "<%= config.bin %> <%= command.id %> ~/.gitconfig ~/.zshrc ~/.config/nvim",
15
+ "<%= config.bin %> <%= command.id %> ~/.ssh/config --mode secret",
16
+ "<%= config.bin %> <%= command.id %> ~/.ssh/config --mode secret --machine vivident",
17
+ "<%= config.bin %> <%= command.id %> ~/.gitconfig --machine ''",
18
+ "<%= config.bin %> <%= command.id %> ./.zshrc",
19
+ "<%= config.bin %> <%= command.id %> ~/.config/mytool/cache --mode ignore",
20
+ "<%= config.bin %> <%= command.id %> .config/mytool/token.json --mode secret",
21
+ ];
22
+ static strict = false;
23
+ static args = {
24
+ targets: Args.string({
25
+ description: "Local files or directories under your home directory to track, including cwd-relative paths or repository paths inside tracked directories",
26
+ required: true,
27
+ }),
28
+ };
29
+ static flags = {
30
+ machine: Flags.string({
31
+ multiple: true,
32
+ summary: "Restrict syncing to specific machines",
33
+ description: "Assign one or more machine names to the tracked entries. When set, the entry is only synced on the listed machines.",
34
+ }),
35
+ mode: Flags.string({
36
+ default: "normal",
37
+ options: ["normal", "secret", "ignore"],
38
+ summary: "Sync mode for the tracked targets",
39
+ description: "Set the sync mode. normal keeps plain files in sync, secret encrypts synced artifacts, and ignore skips the target during push and pull.",
40
+ }),
41
+ };
42
+ async run() {
43
+ const { argv, flags } = await this.parse(SyncTrack);
44
+ const targets = argv;
45
+ const mode = flags.mode;
46
+ const machines = flags.machine ?? [];
47
+ if (targets.length === 0) {
48
+ this.error("At least one target path is required.");
49
+ }
50
+ const context = createSyncContext();
51
+ const results = [];
52
+ for (const target of targets) {
53
+ try {
54
+ const result = await trackSyncTarget({
55
+ machines: machines.length > 0 ? machines : undefined,
56
+ mode,
57
+ target,
58
+ }, context);
59
+ results.push(formatSyncAddResult(result));
60
+ }
61
+ catch (error) {
62
+ if (error instanceof DevsyncError &&
63
+ error.code === "TARGET_NOT_FOUND") {
64
+ const setResult = await setSyncTargetMode({
65
+ state: mode,
66
+ target,
67
+ }, context);
68
+ if (machines.length > 0) {
69
+ const isMachineClear = machines.length === 1 && machines[0] === "";
70
+ await assignSyncMachines({ machines: isMachineClear ? [] : machines, target }, context);
71
+ }
72
+ results.push(formatSyncSetResult(setResult));
73
+ }
74
+ else {
75
+ throw error;
76
+ }
77
+ }
78
+ }
79
+ this.print(results.join("\n"));
80
+ }
81
+ }
82
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../../src/cli/commands/track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from "#app/cli/base-command.js";
2
+ export default class SyncUntrack extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ target: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=untrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/untrack.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,OAAuB,OAAO,SAAiC;IAE/D,OAAuB,WAAW,SAC4R;IAE9T,OAAuB,QAAQ,WAI7B;IAEF,OAAuB,IAAI;;MAMzB;IAEoB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAa3C"}
@@ -0,0 +1,28 @@
1
+ import { Args } from "@oclif/core";
2
+ import { BaseCommand } from "#app/cli/base-command.js";
3
+ import { formatSyncForgetResult } from "#app/lib/output.js";
4
+ import { forgetSyncTarget } from "#app/services/forget.js";
5
+ import { createSyncContext } from "#app/services/runtime.js";
6
+ export default class SyncUntrack extends BaseCommand {
7
+ static summary = "Stop tracking a synced path";
8
+ static description = "Remove a tracked root entry or a nested override from devsync configuration. This only updates the sync config; actual file changes happen on the next push or pull. Use a local path to remove the main tracked target, or use a repository-relative child path inside a tracked directory to remove only that override.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> ~/.gitconfig",
11
+ "cd ~/mytool && <%= config.bin %> <%= command.id %> ./settings.json",
12
+ "<%= config.bin %> <%= command.id %> .config/mytool",
13
+ ];
14
+ static args = {
15
+ target: Args.string({
16
+ description: "Tracked local path (including cwd-relative) or repository path to stop tracking",
17
+ required: true,
18
+ }),
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(SyncUntrack);
22
+ const output = formatSyncForgetResult(await forgetSyncTarget({
23
+ target: args.target,
24
+ }, createSyncContext()));
25
+ this.print(output);
26
+ }
27
+ }
28
+ //# sourceMappingURL=untrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack.js","sourceRoot":"","sources":["../../../src/cli/commands/untrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAC3C,MAAM,CAAU,OAAO,GAAG,6BAA6B,CAAC;IAExD,MAAM,CAAU,WAAW,GAChC,2TAA2T,CAAC;IAEvT,MAAM,CAAU,QAAQ,GAAG;QAChC,kDAAkD;QAClD,oEAAoE;QACpE,oDAAoD;KACrD,CAAC;IAEK,MAAM,CAAU,IAAI,GAAG;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EACT,iFAAiF;YACnF,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEc,KAAK,CAAC,GAAG;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CACnC,MAAM,gBAAgB,CACpB;YACE,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EACD,iBAAiB,EAAE,CACpB,CACF,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type GlobalDevsyncConfig = Readonly<{
2
+ activeMachine?: string;
3
+ version: 2 | 3;
4
+ }>;
5
+ export type ActiveMachineSelection = Readonly<{
6
+ machine?: undefined;
7
+ mode: "none";
8
+ } | {
9
+ machine: string;
10
+ mode: "single";
11
+ }>;
12
+ export declare const resolveConfiguredIdentityFile: (value: string, environment: NodeJS.ProcessEnv) => string;
13
+ export declare const parseGlobalDevsyncConfig: (input: unknown) => GlobalDevsyncConfig;
14
+ export declare const formatGlobalDevsyncConfig: (config: GlobalDevsyncConfig) => string;
15
+ export declare const readGlobalDevsyncConfig: (environment?: NodeJS.ProcessEnv) => Promise<Readonly<{
16
+ activeMachine?: string;
17
+ version: 2 | 3;
18
+ }> | undefined>;
19
+ export declare const resolveActiveMachineSelection: (config: GlobalDevsyncConfig | undefined) => ActiveMachineSelection;
20
+ export declare const isMachineActive: (selection: ActiveMachineSelection, machine: string | undefined) => boolean;
21
+ //# sourceMappingURL=global-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CACzC;IACE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,CAAC;CAChB,CACJ,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,aAAa,MAAM,CAAC,UAAU,WAW/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,OAAO,OAAO,KACb,mBAmBF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,QAAQ,mBAAmB,WAEpE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,cAAa,MAAM,CAAC,UAAwB;oBA1D5B,MAAM;aACb,CAAC,GAAG,CAAC;eA6Ff,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,mBAAmB,GAAG,SAAS,KACtC,sBAWF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,WAAW,sBAAsB,EACjC,SAAS,MAAM,GAAG,SAAS,YAW5B,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { z } from "zod";
3
+ import { resolveConfiguredAbsolutePath, resolveDevsyncGlobalConfigFilePath, } from "#app/config/xdg.js";
4
+ import { ensureTrailingNewline } from "#app/lib/string.js";
5
+ import { formatInputIssues } from "#app/lib/validation.js";
6
+ import { DevsyncError } from "#app/services/error.js";
7
+ import { normalizeSyncMachineName } from "./sync.js";
8
+ const optionalTrimmedStringSchema = z.string().trim().min(1).optional();
9
+ const globalConfigSchemaV2 = z
10
+ .object({
11
+ activeMachine: optionalTrimmedStringSchema,
12
+ age: z.unknown().optional(),
13
+ version: z.literal(2),
14
+ })
15
+ .strict();
16
+ const globalConfigSchemaV3 = z
17
+ .object({
18
+ activeMachine: optionalTrimmedStringSchema,
19
+ version: z.literal(3),
20
+ })
21
+ .strict();
22
+ const globalConfigSchema = z.union([
23
+ globalConfigSchemaV2,
24
+ globalConfigSchemaV3,
25
+ ]);
26
+ export const resolveConfiguredIdentityFile = (value, environment) => {
27
+ try {
28
+ return resolveConfiguredAbsolutePath(value, environment);
29
+ }
30
+ catch (error) {
31
+ throw new DevsyncError(error instanceof Error
32
+ ? error.message
33
+ : `Invalid age identity file path: ${value}`);
34
+ }
35
+ };
36
+ export const parseGlobalDevsyncConfig = (input) => {
37
+ const result = globalConfigSchema.safeParse(input);
38
+ if (!result.success) {
39
+ throw new DevsyncError("Global devsync configuration is invalid.", {
40
+ code: "GLOBAL_CONFIG_VALIDATION_FAILED",
41
+ details: formatInputIssues(result.error.issues).split("\n"),
42
+ hint: "Fix ~/.config/devsync/settings.json, then run the command again.",
43
+ });
44
+ }
45
+ return {
46
+ ...(result.data.activeMachine === undefined
47
+ ? {}
48
+ : {
49
+ activeMachine: normalizeSyncMachineName(result.data.activeMachine),
50
+ }),
51
+ version: result.data.version,
52
+ };
53
+ };
54
+ export const formatGlobalDevsyncConfig = (config) => {
55
+ return ensureTrailingNewline(JSON.stringify(config, null, 2));
56
+ };
57
+ export const readGlobalDevsyncConfig = async (environment = process.env) => {
58
+ const filePath = resolveDevsyncGlobalConfigFilePath(environment);
59
+ try {
60
+ const contents = await readFile(filePath, "utf8");
61
+ return parseGlobalDevsyncConfig(JSON.parse(contents));
62
+ }
63
+ catch (error) {
64
+ if (error instanceof DevsyncError) {
65
+ throw error;
66
+ }
67
+ if (error instanceof SyntaxError) {
68
+ throw new DevsyncError("Global devsync configuration is not valid JSON.", {
69
+ code: "GLOBAL_CONFIG_INVALID_JSON",
70
+ details: [`Config file: ${filePath}`, error.message],
71
+ hint: "Fix the JSON syntax in ~/.config/devsync/settings.json, then run the command again.",
72
+ });
73
+ }
74
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
75
+ return undefined;
76
+ }
77
+ throw new DevsyncError("Failed to read global devsync configuration.", {
78
+ code: "GLOBAL_CONFIG_READ_FAILED",
79
+ details: [
80
+ `Config file: ${filePath}`,
81
+ ...(error instanceof Error ? [error.message] : []),
82
+ ],
83
+ });
84
+ }
85
+ };
86
+ export const resolveActiveMachineSelection = (config) => {
87
+ if (config?.activeMachine === undefined) {
88
+ return {
89
+ mode: "none",
90
+ };
91
+ }
92
+ return {
93
+ machine: config.activeMachine,
94
+ mode: "single",
95
+ };
96
+ };
97
+ export const isMachineActive = (selection, machine) => {
98
+ if (machine === undefined) {
99
+ return true;
100
+ }
101
+ if (selection.mode === "none") {
102
+ return false;
103
+ }
104
+ return selection.machine === machine;
105
+ };
106
+ //# sourceMappingURL=global-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config.js","sourceRoot":"","sources":["../../src/config/global-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type PlatformKey = "win" | "mac" | "linux";
2
+ export type ConfiguredLocalPath = Readonly<{
3
+ default: string;
4
+ win?: string;
5
+ mac?: string;
6
+ linux?: string;
7
+ }>;
8
+ export declare const detectCurrentPlatformKey: () => PlatformKey;
9
+ export declare const resolveLocalPathForPlatform: (localPath: ConfiguredLocalPath, platformKey?: PlatformKey) => string;
10
+ export declare const getDefaultLocalPath: (localPath: ConfiguredLocalPath) => string;
11
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/config/platform.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAElD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAAO,WAS3C,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,WAAW,mBAAmB,EAC9B,cAAc,WAAW,KACxB,MAIF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,mBAAmB,KAAG,MAEpE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { platform } from "node:os";
2
+ export const detectCurrentPlatformKey = () => {
3
+ switch (platform()) {
4
+ case "win32":
5
+ return "win";
6
+ case "darwin":
7
+ return "mac";
8
+ default:
9
+ return "linux";
10
+ }
11
+ };
12
+ export const resolveLocalPathForPlatform = (localPath, platformKey) => {
13
+ const key = platformKey ?? detectCurrentPlatformKey();
14
+ return localPath[key] ?? localPath.default;
15
+ };
16
+ export const getDefaultLocalPath = (localPath) => {
17
+ return localPath.default;
18
+ };
19
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/config/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWnC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAgB,EAAE;IACxD,QAAQ,QAAQ,EAAE,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAA8B,EAC9B,WAAyB,EACjB,EAAE;IACV,MAAM,GAAG,GAAG,WAAW,IAAI,wBAAwB,EAAE,CAAC;IAEtD,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAA8B,EAAU,EAAE;IAC5E,OAAO,SAAS,CAAC,OAAO,CAAC;AAC3B,CAAC,CAAC"}