@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
@@ -1,200 +0,0 @@
1
- import { ensureTrailingNewline } from "#app/lib/string.ts";
2
- import type { SyncAddResult } from "#app/services/add.ts";
3
- import type { SyncDoctorResult } from "#app/services/doctor.ts";
4
- import type { SyncForgetResult } from "#app/services/forget.ts";
5
- import type { SyncInitResult } from "#app/services/init.ts";
6
- import type { SyncListResult } from "#app/services/list.ts";
7
- import type { SyncPullResult } from "#app/services/pull.ts";
8
- import type { SyncPushResult } from "#app/services/push.ts";
9
- import type { SyncSetResult } from "#app/services/set.ts";
10
- import type { SyncStatusResult } from "#app/services/status.ts";
11
-
12
- export const formatSyncInitResult = (result: SyncInitResult) => {
13
- const lines = [
14
- result.alreadyInitialized
15
- ? "Sync directory already initialized."
16
- : "Initialized sync directory.",
17
- `Sync directory: ${result.syncDirectory}`,
18
- `Config file: ${result.configPath}`,
19
- `Age identity file: ${result.identityFile}`,
20
- (() => {
21
- switch (result.gitAction) {
22
- case "cloned":
23
- return `Git repository: cloned from ${result.gitSource}`;
24
- case "initialized":
25
- return "Git repository: initialized new repository";
26
- default:
27
- return "Git repository: using existing repository";
28
- }
29
- })(),
30
- ...(result.generatedIdentity
31
- ? ["Age bootstrap: generated a new local identity."]
32
- : []),
33
- `Summary: ${result.recipientCount} recipients, ${result.entryCount} entries, ${result.ruleCount} rules.`,
34
- ];
35
-
36
- return ensureTrailingNewline(lines.join("\n"));
37
- };
38
-
39
- export const formatSyncAddResult = (result: SyncAddResult) => {
40
- const lines = [
41
- result.alreadyTracked
42
- ? "Sync target already tracked."
43
- : "Added sync target.",
44
- `Sync directory: ${result.syncDirectory}`,
45
- `Config file: ${result.configPath}`,
46
- `Local path: ${result.localPath}`,
47
- `Repository path: ${result.repoPath}`,
48
- `Kind: ${result.kind}`,
49
- `Mode: ${result.mode}`,
50
- ];
51
-
52
- return ensureTrailingNewline(lines.join("\n"));
53
- };
54
-
55
- export const formatSyncForgetResult = (result: SyncForgetResult) => {
56
- const lines = [
57
- "Forgot sync target.",
58
- `Sync directory: ${result.syncDirectory}`,
59
- `Config file: ${result.configPath}`,
60
- `Local path: ${result.localPath}`,
61
- `Repository path: ${result.repoPath}`,
62
- `Removed repo artifacts: ${result.plainArtifactCount} plain, ${result.secretArtifactCount} secret.`,
63
- ];
64
-
65
- return ensureTrailingNewline(lines.join("\n"));
66
- };
67
-
68
- const formatSetScope = (scope: SyncSetResult["scope"]) => {
69
- switch (scope) {
70
- case "default":
71
- return "entry default";
72
- case "subtree":
73
- return "subtree rule";
74
- default:
75
- return "exact rule";
76
- }
77
- };
78
-
79
- export const formatSyncSetResult = (result: SyncSetResult) => {
80
- const lines = [
81
- result.action === "unchanged"
82
- ? "Sync mode unchanged."
83
- : "Updated sync mode.",
84
- `Sync directory: ${result.syncDirectory}`,
85
- `Config file: ${result.configPath}`,
86
- `Owning entry: ${result.entryRepoPath}`,
87
- `Target repository path: ${result.repoPath}`,
88
- `Mode: ${result.mode}`,
89
- `Scope: ${formatSetScope(result.scope)}`,
90
- `Action: ${result.action}`,
91
- ];
92
-
93
- return ensureTrailingNewline(lines.join("\n"));
94
- };
95
-
96
- export const formatSyncPushResult = (result: SyncPushResult) => {
97
- const lines = result.dryRun
98
- ? [
99
- "Dry run for sync push.",
100
- `Sync directory: ${result.syncDirectory}`,
101
- `Config file: ${result.configPath}`,
102
- `Summary: ${result.plainFileCount} plain files, ${result.encryptedFileCount} encrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedArtifactCount} stale repository artifacts would be removed.`,
103
- "No filesystem changes were made.",
104
- ]
105
- : [
106
- "Synchronized local config into the sync repository.",
107
- `Sync directory: ${result.syncDirectory}`,
108
- `Config file: ${result.configPath}`,
109
- `Summary: ${result.plainFileCount} plain files, ${result.encryptedFileCount} encrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedArtifactCount} stale repository artifacts removed.`,
110
- ];
111
-
112
- return ensureTrailingNewline(lines.join("\n"));
113
- };
114
-
115
- export const formatSyncPullResult = (result: SyncPullResult) => {
116
- const lines = result.dryRun
117
- ? [
118
- "Dry run for sync pull.",
119
- `Sync directory: ${result.syncDirectory}`,
120
- `Config file: ${result.configPath}`,
121
- `Summary: ${result.plainFileCount} plain files, ${result.decryptedFileCount} decrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedLocalCount} local paths would be removed.`,
122
- "No filesystem changes were made.",
123
- ]
124
- : [
125
- "Applied sync repository to local config.",
126
- `Sync directory: ${result.syncDirectory}`,
127
- `Config file: ${result.configPath}`,
128
- `Summary: ${result.plainFileCount} plain files, ${result.decryptedFileCount} decrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedLocalCount} local paths removed.`,
129
- ];
130
-
131
- return ensureTrailingNewline(lines.join("\n"));
132
- };
133
-
134
- export const formatSyncListResult = (result: SyncListResult) => {
135
- const lines = [
136
- "Tracked sync configuration.",
137
- `Sync directory: ${result.syncDirectory}`,
138
- `Config file: ${result.configPath}`,
139
- `Summary: ${result.recipientCount} recipients, ${result.entries.length} entries, ${result.ruleCount} rules.`,
140
- ...(result.entries.length === 0
141
- ? ["Entries: none"]
142
- : result.entries.flatMap((entry) => {
143
- return [
144
- `- ${entry.repoPath} [${entry.kind}, ${entry.mode}] -> ${entry.localPath}`,
145
- ...(entry.overrides.length === 0
146
- ? []
147
- : entry.overrides.map((override) => {
148
- return ` override ${override.selector}: ${override.mode}`;
149
- })),
150
- ];
151
- })),
152
- ];
153
-
154
- return ensureTrailingNewline(lines.join("\n"));
155
- };
156
-
157
- export const formatSyncStatusResult = (result: SyncStatusResult) => {
158
- const lines = [
159
- "Sync status overview.",
160
- `Sync directory: ${result.syncDirectory}`,
161
- `Config file: ${result.configPath}`,
162
- `Summary: ${result.recipientCount} recipients, ${result.entryCount} entries, ${result.ruleCount} rules.`,
163
- `Push plan: ${result.push.plainFileCount} plain files, ${result.push.encryptedFileCount} encrypted files, ${result.push.symlinkCount} symlinks, ${result.push.directoryCount} directory roots, ${result.push.deletedArtifactCount} stale repository artifacts.`,
164
- ...(result.push.preview.length === 0
165
- ? ["Push preview: no tracked paths"]
166
- : [`Push preview: ${result.push.preview.join(", ")}`]),
167
- `Pull plan: ${result.pull.plainFileCount} plain files, ${result.pull.decryptedFileCount} decrypted files, ${result.pull.symlinkCount} symlinks, ${result.pull.directoryCount} directory roots, ${result.pull.deletedLocalCount} local paths.`,
168
- ...(result.pull.preview.length === 0
169
- ? ["Pull preview: no tracked paths"]
170
- : [`Pull preview: ${result.pull.preview.join(", ")}`]),
171
- ];
172
-
173
- return ensureTrailingNewline(lines.join("\n"));
174
- };
175
-
176
- export const formatSyncDoctorResult = (result: SyncDoctorResult) => {
177
- const counts = result.checks.reduce(
178
- (accumulator, check) => {
179
- accumulator[check.level] += 1;
180
-
181
- return accumulator;
182
- },
183
- {
184
- fail: 0,
185
- ok: 0,
186
- warn: 0,
187
- },
188
- );
189
- const lines = [
190
- result.hasFailures ? "Sync doctor found issues." : "Sync doctor passed.",
191
- `Sync directory: ${result.syncDirectory}`,
192
- `Config file: ${result.configPath}`,
193
- `Summary: ${counts.ok} ok, ${counts.warn} warnings, ${counts.fail} failures.`,
194
- ...result.checks.map((check) => {
195
- return `[${check.level.toUpperCase()}] ${check.name}: ${check.detail}`;
196
- }),
197
- ];
198
-
199
- return ensureTrailingNewline(lines.join("\n"));
200
- };