@tinyrack/devsync 1.1.0 → 1.2.2

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 (216) 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/sync.d.ts +96 -0
  55. package/dist/config/sync.d.ts.map +1 -0
  56. package/dist/config/sync.js +412 -0
  57. package/dist/config/sync.js.map +1 -0
  58. package/dist/config/xdg.d.ts +11 -0
  59. package/dist/config/xdg.d.ts.map +1 -0
  60. package/dist/config/xdg.js +79 -0
  61. package/dist/config/xdg.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/{src/index.ts → dist/index.js} +1 -1
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/file-mode.d.ts +3 -0
  67. package/dist/lib/file-mode.d.ts.map +1 -0
  68. package/dist/lib/file-mode.js +7 -0
  69. package/dist/lib/file-mode.js.map +1 -0
  70. package/dist/lib/output.d.ts +31 -0
  71. package/dist/lib/output.d.ts.map +1 -0
  72. package/dist/lib/output.js +198 -0
  73. package/dist/lib/output.js.map +1 -0
  74. package/dist/lib/path.d.ts +5 -0
  75. package/dist/lib/path.d.ts.map +1 -0
  76. package/dist/lib/path.js +25 -0
  77. package/dist/lib/path.js.map +1 -0
  78. package/dist/lib/string.d.ts +2 -0
  79. package/dist/lib/string.d.ts.map +1 -0
  80. package/dist/lib/string.js +4 -0
  81. package/dist/lib/string.js.map +1 -0
  82. package/dist/lib/validation.d.ts +3 -0
  83. package/dist/lib/validation.d.ts.map +1 -0
  84. package/dist/lib/validation.js +9 -0
  85. package/dist/lib/validation.js.map +1 -0
  86. package/dist/services/add.d.ts +20 -0
  87. package/dist/services/add.d.ts.map +1 -0
  88. package/dist/services/add.js +161 -0
  89. package/dist/services/add.js.map +1 -0
  90. package/dist/services/config-file.d.ts +30 -0
  91. package/dist/services/config-file.d.ts.map +1 -0
  92. package/dist/services/config-file.js +34 -0
  93. package/dist/services/config-file.js.map +1 -0
  94. package/dist/services/crypto.d.ts +9 -0
  95. package/dist/services/crypto.d.ts.map +1 -0
  96. package/dist/services/crypto.js +75 -0
  97. package/dist/services/crypto.js.map +1 -0
  98. package/dist/services/doctor.d.ts +16 -0
  99. package/dist/services/doctor.d.ts.map +1 -0
  100. package/dist/services/doctor.js +84 -0
  101. package/dist/services/doctor.js.map +1 -0
  102. package/dist/services/error.d.ts +14 -0
  103. package/dist/services/error.d.ts.map +1 -0
  104. package/dist/services/error.js +38 -0
  105. package/dist/services/error.js.map +1 -0
  106. package/dist/services/filesystem.d.ts +15 -0
  107. package/dist/services/filesystem.d.ts.map +1 -0
  108. package/dist/services/filesystem.js +113 -0
  109. package/dist/services/filesystem.js.map +1 -0
  110. package/dist/services/forget.d.ts +14 -0
  111. package/dist/services/forget.d.ts.map +1 -0
  112. package/dist/services/forget.js +124 -0
  113. package/dist/services/forget.js.map +1 -0
  114. package/dist/services/git.d.ts +10 -0
  115. package/dist/services/git.d.ts.map +1 -0
  116. package/dist/services/git.js +57 -0
  117. package/dist/services/git.js.map +1 -0
  118. package/dist/services/init.d.ts +19 -0
  119. package/dist/services/init.d.ts.map +1 -0
  120. package/dist/services/init.js +203 -0
  121. package/dist/services/init.js.map +1 -0
  122. package/dist/services/local-materialization.d.ts +28 -0
  123. package/dist/services/local-materialization.d.ts.map +1 -0
  124. package/dist/services/local-materialization.js +262 -0
  125. package/dist/services/local-materialization.js.map +1 -0
  126. package/dist/services/local-snapshot.d.ts +25 -0
  127. package/dist/services/local-snapshot.d.ts.map +1 -0
  128. package/dist/services/local-snapshot.js +93 -0
  129. package/dist/services/local-snapshot.js.map +1 -0
  130. package/dist/services/machine.d.ts +40 -0
  131. package/dist/services/machine.d.ts.map +1 -0
  132. package/dist/services/machine.js +113 -0
  133. package/dist/services/machine.js.map +1 -0
  134. package/dist/services/paths.d.ts +12 -0
  135. package/dist/services/paths.d.ts.map +1 -0
  136. package/dist/services/paths.js +71 -0
  137. package/dist/services/paths.js.map +1 -0
  138. package/dist/services/pull.d.ts +28 -0
  139. package/dist/services/pull.d.ts.map +1 -0
  140. package/dist/services/pull.js +67 -0
  141. package/dist/services/pull.js.map +1 -0
  142. package/dist/services/push.d.ts +35 -0
  143. package/dist/services/push.d.ts.map +1 -0
  144. package/dist/services/push.js +96 -0
  145. package/dist/services/push.js.map +1 -0
  146. package/dist/services/repo-artifacts.d.ts +52 -0
  147. package/dist/services/repo-artifacts.d.ts.map +1 -0
  148. package/dist/services/repo-artifacts.js +251 -0
  149. package/dist/services/repo-artifacts.js.map +1 -0
  150. package/dist/services/repo-snapshot.d.ts +6 -0
  151. package/dist/services/repo-snapshot.d.ts.map +1 -0
  152. package/dist/services/repo-snapshot.js +163 -0
  153. package/dist/services/repo-snapshot.js.map +1 -0
  154. package/dist/services/runtime.d.ts +40 -0
  155. package/dist/services/runtime.d.ts.map +1 -0
  156. package/dist/services/runtime.js +71 -0
  157. package/dist/services/runtime.js.map +1 -0
  158. package/dist/services/set.d.ts +38 -0
  159. package/dist/services/set.d.ts.map +1 -0
  160. package/dist/services/set.js +184 -0
  161. package/dist/services/set.js.map +1 -0
  162. package/dist/services/status.d.ts +30 -0
  163. package/dist/services/status.d.ts.map +1 -0
  164. package/dist/services/status.js +35 -0
  165. package/dist/services/status.js.map +1 -0
  166. package/package.json +15 -7
  167. package/src/cli/commands/add.ts +0 -40
  168. package/src/cli/commands/cd.ts +0 -80
  169. package/src/cli/commands/doctor.ts +0 -20
  170. package/src/cli/commands/forget.ts +0 -32
  171. package/src/cli/commands/index.ts +0 -23
  172. package/src/cli/commands/init.ts +0 -43
  173. package/src/cli/commands/list.ts +0 -17
  174. package/src/cli/commands/pull.ts +0 -31
  175. package/src/cli/commands/push.ts +0 -31
  176. package/src/cli/commands/set.ts +0 -47
  177. package/src/cli/commands/status.ts +0 -18
  178. package/src/cli/sync-output.test.ts +0 -173
  179. package/src/cli/sync-output.ts +0 -200
  180. package/src/config/sync.test.ts +0 -609
  181. package/src/config/sync.ts +0 -572
  182. package/src/config/xdg.ts +0 -138
  183. package/src/lib/string.test.ts +0 -13
  184. package/src/lib/string.ts +0 -3
  185. package/src/lib/validation.test.ts +0 -32
  186. package/src/lib/validation.ts +0 -11
  187. package/src/services/add.ts +0 -178
  188. package/src/services/config-file.test.ts +0 -161
  189. package/src/services/config-file.ts +0 -101
  190. package/src/services/crypto.test.ts +0 -132
  191. package/src/services/crypto.ts +0 -83
  192. package/src/services/doctor.ts +0 -142
  193. package/src/services/error.ts +0 -6
  194. package/src/services/filesystem.test.ts +0 -171
  195. package/src/services/filesystem.ts +0 -183
  196. package/src/services/forget.ts +0 -261
  197. package/src/services/git.test.ts +0 -83
  198. package/src/services/git.ts +0 -74
  199. package/src/services/init.test.ts +0 -109
  200. package/src/services/init.ts +0 -244
  201. package/src/services/list.ts +0 -63
  202. package/src/services/local-materialization.ts +0 -421
  203. package/src/services/local-snapshot.ts +0 -173
  204. package/src/services/paths.test.ts +0 -74
  205. package/src/services/paths.ts +0 -98
  206. package/src/services/pull.ts +0 -144
  207. package/src/services/push.ts +0 -168
  208. package/src/services/repo-artifacts.ts +0 -262
  209. package/src/services/repo-snapshot.ts +0 -197
  210. package/src/services/runtime.ts +0 -57
  211. package/src/services/set.ts +0 -383
  212. package/src/services/status.ts +0 -57
  213. package/src/services/sync.dry-run.test.ts +0 -179
  214. package/src/services/sync.runtime.test.ts +0 -756
  215. package/src/services/sync.service.test.ts +0 -1169
  216. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -0,0 +1,96 @@
1
+ import { z } from "zod";
2
+ export declare const syncConfigFileName = "manifest.json";
3
+ export declare const syncSecretArtifactSuffix = ".devsync.secret";
4
+ declare const syncEntryKinds: readonly ["file", "directory"];
5
+ export declare const syncModes: readonly ["normal", "secret", "ignore"];
6
+ declare const syncConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
7
+ version: z.ZodLiteral<5>;
8
+ entries: z.ZodArray<z.ZodObject<{
9
+ kind: z.ZodEnum<{
10
+ file: "file";
11
+ directory: "directory";
12
+ }>;
13
+ localPath: z.ZodString;
14
+ machines: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ mode: z.ZodOptional<z.ZodEnum<{
16
+ normal: "normal";
17
+ secret: "secret";
18
+ ignore: "ignore";
19
+ }>>;
20
+ }, z.core.$strict>>;
21
+ }, z.core.$strict>, z.ZodObject<{
22
+ version: z.ZodLiteral<6>;
23
+ age: z.ZodObject<{
24
+ identityFile: z.ZodString;
25
+ recipients: z.ZodArray<z.ZodString>;
26
+ }, z.core.$strict>;
27
+ entries: z.ZodArray<z.ZodObject<{
28
+ kind: z.ZodEnum<{
29
+ file: "file";
30
+ directory: "directory";
31
+ }>;
32
+ localPath: z.ZodString;
33
+ machines: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
+ mode: z.ZodOptional<z.ZodEnum<{
35
+ normal: "normal";
36
+ secret: "secret";
37
+ ignore: "ignore";
38
+ }>>;
39
+ }, z.core.$strict>>;
40
+ }, z.core.$strict>]>;
41
+ export type SyncConfigEntryKind = (typeof syncEntryKinds)[number];
42
+ export type SyncMode = (typeof syncModes)[number];
43
+ export type SyncConfig = z.infer<typeof syncConfigSchema>;
44
+ export type ResolvedSyncConfigEntry = Readonly<{
45
+ configuredLocalPath: string;
46
+ kind: SyncConfigEntryKind;
47
+ localPath: string;
48
+ machines: readonly string[];
49
+ machinesExplicit: boolean;
50
+ mode: SyncMode;
51
+ modeExplicit: boolean;
52
+ name: string;
53
+ repoPath: string;
54
+ }>;
55
+ export type ResolvedSyncConfigAge = Readonly<{
56
+ identityFile: string;
57
+ recipients: readonly string[];
58
+ }>;
59
+ export type ResolvedSyncConfig = Readonly<{
60
+ age?: ResolvedSyncConfigAge;
61
+ entries: readonly ResolvedSyncConfigEntry[];
62
+ version: 5 | 6;
63
+ }>;
64
+ export declare const syncDefaultMachine = "default";
65
+ export declare const normalizeSyncRepoPath: (value: string) => string;
66
+ export declare const normalizeSyncMachineName: (value: string, description?: string) => string;
67
+ export declare const hasReservedSyncArtifactSuffixSegment: (value: string) => boolean;
68
+ export declare const findOwningSyncEntry: (config: Pick<ResolvedSyncConfig, "entries">, repoPath: string) => ResolvedSyncConfigEntry | undefined;
69
+ export declare const resolveEntryRelativeRepoPath: (entry: Pick<ResolvedSyncConfigEntry, "kind" | "repoPath">, repoPath: string) => string | undefined;
70
+ export declare const deriveRepoPathFromLocalPath: (localPath: string, environment: NodeJS.ProcessEnv) => string;
71
+ export declare const validateResolvedSyncConfigEntries: (entries: readonly ResolvedSyncConfigEntry[]) => void;
72
+ export declare const parseSyncConfig: (input: unknown, environment?: NodeJS.ProcessEnv) => ResolvedSyncConfig;
73
+ export declare const createInitialSyncConfig: (age: {
74
+ identityFile: string;
75
+ recipients: string[];
76
+ }) => SyncConfig;
77
+ export declare const formatSyncConfig: (config: SyncConfig) => string;
78
+ export declare const resolveSyncConfigPath: (environment?: NodeJS.ProcessEnv) => string;
79
+ export declare const resolveSyncConfigFilePath: (syncDirectory?: string) => string;
80
+ export declare const resolveSyncArtifactsDirectoryPath: (syncDirectory: string) => string;
81
+ export declare const readSyncConfig: (syncDirectory?: string, environment?: NodeJS.ProcessEnv) => Promise<Readonly<{
82
+ age?: ResolvedSyncConfigAge;
83
+ entries: readonly ResolvedSyncConfigEntry[];
84
+ version: 5 | 6;
85
+ }>>;
86
+ export declare const resolveSyncRule: (config: ResolvedSyncConfig, repoPath: string, activeMachine?: string) => {
87
+ mode: SyncMode;
88
+ machine: string;
89
+ } | undefined;
90
+ export declare const resolveSyncMode: (config: ResolvedSyncConfig, repoPath: string, activeMachine?: string) => SyncMode | undefined;
91
+ export declare const isIgnoredSyncPath: (config: ResolvedSyncConfig, repoPath: string) => boolean;
92
+ export declare const isSecretSyncPath: (config: ResolvedSyncConfig, repoPath: string) => boolean;
93
+ export declare const resolveManagedSyncMode: (config: ResolvedSyncConfig, repoPath: string, activeMachine?: string, context?: string) => "normal" | "secret" | "ignore";
94
+ export declare const collectAllMachineNames: (entries: readonly ResolvedSyncConfigEntry[]) => string[];
95
+ export {};
96
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/config/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,412 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { isAbsolute, join, posix, relative, sep } from "node:path";
3
+ import { z } from "zod";
4
+ import { resolveDevsyncSyncDirectory, resolveHomeConfiguredAbsolutePath, resolveHomeDirectory, } from "#app/config/xdg.js";
5
+ import { doPathsOverlap } from "#app/lib/path.js";
6
+ import { ensureTrailingNewline } from "#app/lib/string.js";
7
+ import { formatInputIssues } from "#app/lib/validation.js";
8
+ import { DevsyncError } from "#app/services/error.js";
9
+ export const syncConfigFileName = "manifest.json";
10
+ export const syncSecretArtifactSuffix = ".devsync.secret";
11
+ const syncEntryKinds = ["file", "directory"];
12
+ export const syncModes = ["normal", "secret", "ignore"];
13
+ const requiredTrimmedStringSchema = z
14
+ .string()
15
+ .trim()
16
+ .min(1, "Value must not be empty.");
17
+ const syncMachineNameArraySchema = z
18
+ .array(requiredTrimmedStringSchema)
19
+ .min(1, "At least one machine must be specified.");
20
+ const syncConfigEntrySchema = z
21
+ .object({
22
+ kind: z.enum(syncEntryKinds),
23
+ localPath: requiredTrimmedStringSchema,
24
+ machines: syncMachineNameArraySchema.optional(),
25
+ mode: z.enum(syncModes).optional(),
26
+ })
27
+ .strict();
28
+ const syncConfigAgeSchema = z
29
+ .object({
30
+ identityFile: requiredTrimmedStringSchema,
31
+ recipients: z
32
+ .array(requiredTrimmedStringSchema)
33
+ .min(1, "At least one age recipient is required."),
34
+ })
35
+ .strict();
36
+ const syncConfigSchemaV5 = z
37
+ .object({
38
+ version: z.literal(5),
39
+ entries: z.array(syncConfigEntrySchema),
40
+ })
41
+ .strict();
42
+ const syncConfigSchemaV6 = z
43
+ .object({
44
+ version: z.literal(6),
45
+ age: syncConfigAgeSchema,
46
+ entries: z.array(syncConfigEntrySchema),
47
+ })
48
+ .strict();
49
+ const syncConfigSchema = z.union([syncConfigSchemaV5, syncConfigSchemaV6]);
50
+ export const syncDefaultMachine = "default";
51
+ export const normalizeSyncRepoPath = (value) => {
52
+ const normalizedValue = posix.normalize(value.replaceAll("\\", "/"));
53
+ if (normalizedValue === "" ||
54
+ normalizedValue === "." ||
55
+ normalizedValue.startsWith("../") ||
56
+ normalizedValue.includes("/../") ||
57
+ normalizedValue.startsWith("/")) {
58
+ throw new DevsyncError("Repository path must be a relative POSIX path inside the repository root.", {
59
+ code: "INVALID_REPO_PATH",
60
+ details: [`Repository path: ${value}`],
61
+ hint: "Use a relative path like '.config/tool/settings.json' without '..' segments.",
62
+ });
63
+ }
64
+ if (hasReservedSyncArtifactSuffixSegment(normalizedValue)) {
65
+ throw new DevsyncError(`Repository path must not use the reserved suffix ${syncSecretArtifactSuffix}.`, {
66
+ code: "RESERVED_SECRET_SUFFIX",
67
+ details: [`Repository path: ${value}`],
68
+ hint: "Rename the path so no segment ends with the secret artifact suffix.",
69
+ });
70
+ }
71
+ return normalizedValue;
72
+ };
73
+ export const normalizeSyncMachineName = (value, description = "Machine name") => {
74
+ const normalizedValue = value.trim();
75
+ if (normalizedValue.length === 0) {
76
+ throw new DevsyncError(`${description} must not be empty.`, {
77
+ code: "INVALID_MACHINE_NAME",
78
+ details: [`${description}: ${value}`],
79
+ hint: "Use a short machine name like 'work' or 'personal'.",
80
+ });
81
+ }
82
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(normalizedValue)) {
83
+ throw new DevsyncError(`${description} contains unsupported characters.`, {
84
+ code: "INVALID_MACHINE_NAME",
85
+ details: [`${description}: ${value}`],
86
+ hint: "Use letters, numbers, dots, underscores, or hyphens, and start with a letter or number.",
87
+ });
88
+ }
89
+ if (normalizedValue.startsWith(".")) {
90
+ throw new DevsyncError(`${description} must not start with '.'.`, {
91
+ code: "INVALID_MACHINE_NAME",
92
+ details: [`${description}: ${value}`],
93
+ hint: "Use a plain name like 'work' instead of hidden-path style names.",
94
+ });
95
+ }
96
+ if (normalizedValue === "." || normalizedValue === "..") {
97
+ throw new DevsyncError(`${description} is invalid.`, {
98
+ code: "INVALID_MACHINE_NAME",
99
+ details: [`${description}: ${value}`],
100
+ });
101
+ }
102
+ return normalizedValue;
103
+ };
104
+ export const hasReservedSyncArtifactSuffixSegment = (value) => {
105
+ return value
106
+ .replaceAll("\\", "/")
107
+ .split("/")
108
+ .some((segment) => segment.endsWith(syncSecretArtifactSuffix));
109
+ };
110
+ const matchesEntryPath = (entry, repoPath) => {
111
+ return (entry.repoPath === repoPath ||
112
+ (entry.kind === "directory" && repoPath.startsWith(`${entry.repoPath}/`)));
113
+ };
114
+ export const findOwningSyncEntry = (config, repoPath) => {
115
+ let best;
116
+ for (const entry of config.entries) {
117
+ if (matchesEntryPath(entry, repoPath) &&
118
+ (best === undefined || entry.repoPath.length > best.repoPath.length)) {
119
+ best = entry;
120
+ }
121
+ }
122
+ return best;
123
+ };
124
+ export const resolveEntryRelativeRepoPath = (entry, repoPath) => {
125
+ if (entry.kind === "file") {
126
+ return repoPath === entry.repoPath ? "" : undefined;
127
+ }
128
+ if (repoPath === entry.repoPath) {
129
+ return "";
130
+ }
131
+ if (!repoPath.startsWith(`${entry.repoPath}/`)) {
132
+ return undefined;
133
+ }
134
+ return repoPath.slice(entry.repoPath.length + 1);
135
+ };
136
+ const resolveSyncEntryLocalPath = (value, environment) => {
137
+ const homeDirectory = resolveHomeDirectory(environment);
138
+ let resolvedLocalPath;
139
+ try {
140
+ resolvedLocalPath = resolveHomeConfiguredAbsolutePath(value, environment);
141
+ }
142
+ catch (error) {
143
+ throw new DevsyncError(error instanceof Error
144
+ ? error.message
145
+ : `Invalid sync entry local path: ${value}`);
146
+ }
147
+ const relativePath = relative(homeDirectory, resolvedLocalPath);
148
+ if (relativePath === "") {
149
+ throw new DevsyncError("Sync entry local path cannot be the home directory itself.", {
150
+ code: "ENTRY_ROOT_DISALLOWED",
151
+ details: [
152
+ `Configured path: ${value}`,
153
+ `Home directory: ${homeDirectory}`,
154
+ ],
155
+ hint: "Track a file or subdirectory inside HOME instead.",
156
+ });
157
+ }
158
+ if (isAbsolute(relativePath) ||
159
+ relativePath.startsWith("..") ||
160
+ relativePath === "..") {
161
+ throw new DevsyncError("Sync entry local path must stay inside HOME.", {
162
+ code: "ENTRY_OUTSIDE_HOME",
163
+ details: [
164
+ `Configured path: ${value}`,
165
+ `Home directory: ${homeDirectory}`,
166
+ ],
167
+ hint: "Use a path under HOME, such as '~/...'.",
168
+ });
169
+ }
170
+ return resolvedLocalPath;
171
+ };
172
+ export const deriveRepoPathFromLocalPath = (localPath, environment) => {
173
+ const homeDirectory = resolveHomeDirectory(environment);
174
+ const resolvedLocalPath = resolveSyncEntryLocalPath(localPath, environment);
175
+ const relativePath = relative(homeDirectory, resolvedLocalPath);
176
+ return normalizeSyncRepoPath(relativePath.replaceAll("\\", "/"));
177
+ };
178
+ const validatePathOverlaps = (entries, property, description) => {
179
+ for (let index = 0; index < entries.length; index += 1) {
180
+ const currentEntry = entries[index];
181
+ if (currentEntry === undefined) {
182
+ continue;
183
+ }
184
+ for (let otherIndex = index + 1; otherIndex < entries.length; otherIndex += 1) {
185
+ const otherEntry = entries[otherIndex];
186
+ if (otherEntry === undefined) {
187
+ continue;
188
+ }
189
+ const currentValue = currentEntry[property];
190
+ const otherValue = otherEntry[property];
191
+ if (currentValue === otherValue) {
192
+ throw new DevsyncError(`Duplicate ${description.toLowerCase()} paths in manifest.json.`, {
193
+ code: "DUPLICATE_PATHS",
194
+ details: [
195
+ `${currentEntry.name}: ${currentValue}`,
196
+ `${otherEntry.name}: ${otherValue}`,
197
+ ],
198
+ hint: "Remove the duplicate entry from manifest.json.",
199
+ });
200
+ }
201
+ const isParentChild = currentValue.startsWith(`${otherValue}/`) ||
202
+ currentValue.startsWith(`${otherValue}${sep}`) ||
203
+ otherValue.startsWith(`${currentValue}/`) ||
204
+ otherValue.startsWith(`${currentValue}${sep}`);
205
+ if (isParentChild) {
206
+ continue;
207
+ }
208
+ const overlaps = property === "repoPath"
209
+ ? false
210
+ : doPathsOverlap(currentValue, otherValue);
211
+ if (overlaps) {
212
+ throw new DevsyncError(`${description} paths must not overlap in manifest.json.`, {
213
+ code: "OVERLAPPING_PATHS",
214
+ details: [
215
+ `${currentEntry.name}: ${currentValue}`,
216
+ `${otherEntry.name}: ${otherValue}`,
217
+ ],
218
+ hint: "Split overlapping entries so each tracked root owns a distinct path.",
219
+ });
220
+ }
221
+ }
222
+ }
223
+ };
224
+ export const validateResolvedSyncConfigEntries = (entries) => {
225
+ validatePathOverlaps(entries, "repoPath", "Repository");
226
+ validatePathOverlaps(entries, "localPath", "Local");
227
+ };
228
+ const buildNormalizedMachines = (entry) => {
229
+ if (entry.machines === undefined || entry.machines.length === 0) {
230
+ return [];
231
+ }
232
+ for (const machine of entry.machines) {
233
+ normalizeSyncMachineName(machine);
234
+ }
235
+ return entry.machines;
236
+ };
237
+ const findNearestParentEntry = (entries, childRepoPath) => {
238
+ let best;
239
+ for (const entry of entries.values()) {
240
+ if (entry.kind === "directory" &&
241
+ childRepoPath !== entry.repoPath &&
242
+ childRepoPath.startsWith(`${entry.repoPath}/`) &&
243
+ (best === undefined || entry.repoPath.length > best.repoPath.length)) {
244
+ best = entry;
245
+ }
246
+ }
247
+ return best;
248
+ };
249
+ const applyEntryInheritance = (entries) => {
250
+ const sorted = [...entries].sort((a, b) => a.repoPath.length - b.repoPath.length);
251
+ const resolved = new Map();
252
+ for (const entry of sorted) {
253
+ const parent = findNearestParentEntry(resolved, entry.repoPath);
254
+ const inheritedMode = !entry.modeExplicit && parent !== undefined ? parent.mode : entry.mode;
255
+ const inheritedMachines = !entry.machinesExplicit && parent !== undefined
256
+ ? parent.machines
257
+ : entry.machines;
258
+ resolved.set(entry.repoPath, {
259
+ ...entry,
260
+ machines: inheritedMachines,
261
+ mode: inheritedMode,
262
+ });
263
+ }
264
+ return entries.map((e) => {
265
+ const entry = resolved.get(e.repoPath);
266
+ if (entry === undefined) {
267
+ throw new Error(`Missing resolved entry for ${e.repoPath}`);
268
+ }
269
+ return entry;
270
+ });
271
+ };
272
+ export const parseSyncConfig = (input, environment = process.env) => {
273
+ const result = syncConfigSchema.safeParse(input);
274
+ if (!result.success) {
275
+ throw new DevsyncError("Sync configuration is invalid.", {
276
+ code: "CONFIG_VALIDATION_FAILED",
277
+ details: formatInputIssues(result.error.issues).split("\n"),
278
+ hint: "Fix the invalid fields in manifest.json, then run the command again.",
279
+ });
280
+ }
281
+ const rawEntries = result.data.entries.map((entry) => {
282
+ const resolvedLocalPath = resolveSyncEntryLocalPath(entry.localPath, environment);
283
+ const repoPath = deriveRepoPathFromLocalPath(entry.localPath, environment);
284
+ const machines = buildNormalizedMachines(entry);
285
+ const mode = entry.mode ?? "normal";
286
+ return {
287
+ configuredLocalPath: entry.localPath,
288
+ kind: entry.kind,
289
+ localPath: resolvedLocalPath,
290
+ machines,
291
+ machinesExplicit: entry.machines !== undefined,
292
+ mode,
293
+ modeExplicit: entry.mode !== undefined,
294
+ name: repoPath,
295
+ repoPath,
296
+ };
297
+ });
298
+ validateResolvedSyncConfigEntries(rawEntries);
299
+ const entries = applyEntryInheritance(rawEntries);
300
+ const age = result.data.version === 6
301
+ ? {
302
+ identityFile: result.data.age.identityFile,
303
+ recipients: [...new Set(result.data.age.recipients)],
304
+ }
305
+ : undefined;
306
+ return {
307
+ ...(age === undefined ? {} : { age }),
308
+ entries,
309
+ version: result.data.version,
310
+ };
311
+ };
312
+ export const createInitialSyncConfig = (age) => {
313
+ return {
314
+ version: 6,
315
+ age,
316
+ entries: [],
317
+ };
318
+ };
319
+ export const formatSyncConfig = (config) => {
320
+ return ensureTrailingNewline(JSON.stringify(config, null, 2));
321
+ };
322
+ export const resolveSyncConfigPath = (environment = process.env) => {
323
+ return posix.join(resolveDevsyncSyncDirectory(environment).replaceAll("\\", "/"), syncConfigFileName);
324
+ };
325
+ export const resolveSyncConfigFilePath = (syncDirectory = resolveDevsyncSyncDirectory()) => {
326
+ return join(syncDirectory, syncConfigFileName);
327
+ };
328
+ export const resolveSyncArtifactsDirectoryPath = (syncDirectory) => {
329
+ return syncDirectory;
330
+ };
331
+ export const readSyncConfig = async (syncDirectory = resolveDevsyncSyncDirectory(), environment = process.env) => {
332
+ try {
333
+ const contents = await readFile(resolveSyncConfigFilePath(syncDirectory), "utf8");
334
+ return parseSyncConfig(JSON.parse(contents), environment);
335
+ }
336
+ catch (error) {
337
+ if (error instanceof DevsyncError) {
338
+ throw error;
339
+ }
340
+ if (error instanceof SyntaxError) {
341
+ throw new DevsyncError("Sync configuration is not valid JSON.", {
342
+ code: "CONFIG_INVALID_JSON",
343
+ details: [
344
+ `Config file: ${resolveSyncConfigFilePath(syncDirectory)}`,
345
+ error.message,
346
+ ],
347
+ hint: "Fix the JSON syntax in manifest.json, then run the command again.",
348
+ });
349
+ }
350
+ throw new DevsyncError("Failed to read sync configuration.", {
351
+ code: "CONFIG_READ_FAILED",
352
+ details: [
353
+ `Config file: ${resolveSyncConfigFilePath(syncDirectory)}`,
354
+ ...(error instanceof Error ? [error.message] : []),
355
+ ],
356
+ hint: "Run 'devsync init' if the sync repository has not been initialized yet.",
357
+ });
358
+ }
359
+ };
360
+ const resolveMachineForEntry = (entry, activeMachine) => {
361
+ if (entry.machines.length === 0) {
362
+ return syncDefaultMachine;
363
+ }
364
+ const effective = activeMachine !== undefined && activeMachine !== syncDefaultMachine
365
+ ? activeMachine
366
+ : syncDefaultMachine;
367
+ return entry.machines.includes(effective) ? effective : undefined;
368
+ };
369
+ export const resolveSyncRule = (config, repoPath, activeMachine) => {
370
+ const entry = findOwningSyncEntry(config, repoPath);
371
+ if (entry === undefined) {
372
+ return undefined;
373
+ }
374
+ const machine = resolveMachineForEntry(entry, activeMachine);
375
+ if (machine === undefined) {
376
+ return undefined;
377
+ }
378
+ return { mode: entry.mode, machine };
379
+ };
380
+ export const resolveSyncMode = (config, repoPath, activeMachine) => {
381
+ return resolveSyncRule(config, repoPath, activeMachine)?.mode;
382
+ };
383
+ export const isIgnoredSyncPath = (config, repoPath) => {
384
+ return resolveSyncMode(config, repoPath) === "ignore";
385
+ };
386
+ export const isSecretSyncPath = (config, repoPath) => {
387
+ return resolveSyncMode(config, repoPath) === "secret";
388
+ };
389
+ export const resolveManagedSyncMode = (config, repoPath, activeMachine, context) => {
390
+ const mode = resolveSyncMode(config, repoPath, activeMachine);
391
+ if (mode === undefined) {
392
+ throw new DevsyncError("Repository path is not managed by the current sync configuration.", {
393
+ code: "UNMANAGED_SYNC_PATH",
394
+ details: [
395
+ `Repository path: ${repoPath}`,
396
+ ...(context === undefined ? [] : [`Context: ${context}`]),
397
+ ],
398
+ hint: "Add the parent path to devsync, or remove stray artifacts from the sync repository.",
399
+ });
400
+ }
401
+ return mode;
402
+ };
403
+ export const collectAllMachineNames = (entries) => {
404
+ const machines = new Set();
405
+ for (const entry of entries) {
406
+ for (const machine of entry.machines) {
407
+ machines.add(machine);
408
+ }
409
+ }
410
+ return [...machines].sort((left, right) => left.localeCompare(right));
411
+ };
412
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/config/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const resolveHomeDirectory: (environment?: NodeJS.ProcessEnv) => string;
2
+ export declare const resolveXdgConfigHome: (environment?: NodeJS.ProcessEnv) => string;
3
+ export declare const resolveDevsyncConfigDirectory: (environment?: NodeJS.ProcessEnv) => string;
4
+ export declare const resolveDevsyncGlobalConfigFilePath: (environment?: NodeJS.ProcessEnv) => string;
5
+ export declare const resolveDevsyncSyncDirectory: (environment?: NodeJS.ProcessEnv) => string;
6
+ export declare const resolveDevsyncAgeDirectory: (environment?: NodeJS.ProcessEnv) => string;
7
+ export declare const expandHomePath: (value: string, environment?: NodeJS.ProcessEnv) => string;
8
+ export declare const expandConfiguredPath: (value: string, environment?: NodeJS.ProcessEnv) => string;
9
+ export declare const resolveConfiguredAbsolutePath: (value: string, environment?: NodeJS.ProcessEnv) => string;
10
+ export declare const resolveHomeConfiguredAbsolutePath: (value: string, environment?: NodeJS.ProcessEnv) => string;
11
+ //# sourceMappingURL=xdg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg.d.ts","sourceRoot":"","sources":["../../src/config/xdg.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,oBAAoB,GAC/B,cAAa,MAAM,CAAC,UAAwB,WAS7C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,cAAa,MAAM,CAAC,UAAwB,WAY7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,cAAa,MAAM,CAAC,UAAwB,WAG7C,CAAC;AAEF,eAAO,MAAM,kCAAkC,GAC7C,cAAa,MAAM,CAAC,UAAwB,WAG7C,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,cAAa,MAAM,CAAC,UAAwB,WAG7C,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,cAAa,MAAM,CAAC,UAAwB,WAG7C,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,cAAa,MAAM,CAAC,UAAwB,WAc7C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,EACb,cAAa,MAAM,CAAC,UAAwB,WAqB7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,cAAa,MAAM,CAAC,UAAwB,WAW7C,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,OAAO,MAAM,EACb,cAAa,MAAM,CAAC,UAAwB,WAW7C,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { homedir } from "node:os";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ const readTrimmedEnvironmentValue = (environment, key) => {
4
+ const value = environment[key];
5
+ if (value === undefined) {
6
+ return undefined;
7
+ }
8
+ const trimmedValue = value.trim();
9
+ return trimmedValue === "" ? undefined : trimmedValue;
10
+ };
11
+ const bracedXdgConfigHomeToken = "$" + "{XDG_CONFIG_HOME}";
12
+ const bracedXdgConfigHomePrefix = `${bracedXdgConfigHomeToken}/`;
13
+ export const resolveHomeDirectory = (environment = process.env) => {
14
+ const configuredValue = readTrimmedEnvironmentValue(environment, "HOME");
15
+ if (configuredValue !== undefined) {
16
+ return resolve(configuredValue);
17
+ }
18
+ return resolve(homedir());
19
+ };
20
+ export const resolveXdgConfigHome = (environment = process.env) => {
21
+ const configuredValue = readTrimmedEnvironmentValue(environment, "XDG_CONFIG_HOME");
22
+ if (configuredValue !== undefined) {
23
+ return resolve(configuredValue);
24
+ }
25
+ return resolve(resolveHomeDirectory(environment), ".config");
26
+ };
27
+ export const resolveDevsyncConfigDirectory = (environment = process.env) => {
28
+ return resolve(resolveXdgConfigHome(environment), "devsync");
29
+ };
30
+ export const resolveDevsyncGlobalConfigFilePath = (environment = process.env) => {
31
+ return resolve(resolveDevsyncConfigDirectory(environment), "settings.json");
32
+ };
33
+ export const resolveDevsyncSyncDirectory = (environment = process.env) => {
34
+ return resolve(resolveDevsyncConfigDirectory(environment), "sync");
35
+ };
36
+ export const resolveDevsyncAgeDirectory = (environment = process.env) => {
37
+ return resolve(resolveDevsyncConfigDirectory(environment), "age");
38
+ };
39
+ export const expandHomePath = (value, environment = process.env) => {
40
+ let expandedValue = value.trim();
41
+ if (expandedValue === "~") {
42
+ expandedValue = resolveHomeDirectory(environment);
43
+ }
44
+ else if (expandedValue.startsWith("~/")) {
45
+ expandedValue = resolve(resolveHomeDirectory(environment), expandedValue.slice(2));
46
+ }
47
+ return expandedValue;
48
+ };
49
+ export const expandConfiguredPath = (value, environment = process.env) => {
50
+ let expandedValue = expandHomePath(value, environment);
51
+ if (expandedValue === "$XDG_CONFIG_HOME") {
52
+ expandedValue = resolveXdgConfigHome(environment);
53
+ }
54
+ else if (expandedValue.startsWith("$XDG_CONFIG_HOME/")) {
55
+ expandedValue = resolve(resolveXdgConfigHome(environment), expandedValue.slice("$XDG_CONFIG_HOME/".length));
56
+ }
57
+ else if (expandedValue === bracedXdgConfigHomeToken) {
58
+ expandedValue = resolveXdgConfigHome(environment);
59
+ }
60
+ else if (expandedValue.startsWith(bracedXdgConfigHomePrefix)) {
61
+ expandedValue = resolve(resolveXdgConfigHome(environment), expandedValue.slice(bracedXdgConfigHomePrefix.length));
62
+ }
63
+ return expandedValue;
64
+ };
65
+ export const resolveConfiguredAbsolutePath = (value, environment = process.env) => {
66
+ const expandedValue = expandConfiguredPath(value, environment);
67
+ if (!isAbsolute(expandedValue)) {
68
+ throw new Error(`Configured path must be absolute or start with ~ or $XDG_CONFIG_HOME: ${value}`);
69
+ }
70
+ return resolve(expandedValue);
71
+ };
72
+ export const resolveHomeConfiguredAbsolutePath = (value, environment = process.env) => {
73
+ const expandedValue = expandHomePath(value, environment);
74
+ if (!isAbsolute(expandedValue)) {
75
+ throw new Error(`Configured path must be absolute or start with ~: ${value}`);
76
+ }
77
+ return resolve(expandedValue);
78
+ };
79
+ //# sourceMappingURL=xdg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg.js","sourceRoot":"","sources":["../../src/config/xdg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}