@tinyrack/devsync 1.0.3 → 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 (210) hide show
  1. package/README.md +248 -56
  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/forget.ts +0 -32
  170. package/src/cli/commands/index.ts +0 -17
  171. package/src/cli/commands/init.ts +0 -43
  172. package/src/cli/commands/pull.ts +0 -31
  173. package/src/cli/commands/push.ts +0 -31
  174. package/src/cli/commands/set.ts +0 -47
  175. package/src/cli/sync-output.test.ts +0 -105
  176. package/src/cli/sync-output.ts +0 -129
  177. package/src/config/sync.test.ts +0 -609
  178. package/src/config/sync.ts +0 -572
  179. package/src/config/xdg.ts +0 -138
  180. package/src/lib/string.test.ts +0 -13
  181. package/src/lib/string.ts +0 -3
  182. package/src/lib/validation.test.ts +0 -32
  183. package/src/lib/validation.ts +0 -11
  184. package/src/services/add.ts +0 -178
  185. package/src/services/config-file.test.ts +0 -161
  186. package/src/services/config-file.ts +0 -101
  187. package/src/services/crypto.test.ts +0 -132
  188. package/src/services/crypto.ts +0 -83
  189. package/src/services/error.ts +0 -6
  190. package/src/services/filesystem.test.ts +0 -171
  191. package/src/services/filesystem.ts +0 -183
  192. package/src/services/forget.ts +0 -261
  193. package/src/services/git.test.ts +0 -83
  194. package/src/services/git.ts +0 -74
  195. package/src/services/init.test.ts +0 -109
  196. package/src/services/init.ts +0 -244
  197. package/src/services/local-materialization.ts +0 -421
  198. package/src/services/local-snapshot.ts +0 -173
  199. package/src/services/paths.test.ts +0 -74
  200. package/src/services/paths.ts +0 -98
  201. package/src/services/pull.ts +0 -75
  202. package/src/services/push.ts +0 -121
  203. package/src/services/repo-artifacts.ts +0 -262
  204. package/src/services/repo-snapshot.ts +0 -197
  205. package/src/services/runtime.ts +0 -57
  206. package/src/services/set.ts +0 -383
  207. package/src/services/sync.dry-run.test.ts +0 -179
  208. package/src/services/sync.runtime.test.ts +0 -756
  209. package/src/services/sync.service.test.ts +0 -1025
  210. package/src/test/helpers/sync-fixture.ts +0 -47
@@ -1,47 +0,0 @@
1
- import { Args, Command, Flags } from "@oclif/core";
2
-
3
- import { formatSyncSetResult } from "#app/cli/sync-output.ts";
4
- import { createSyncContext } from "#app/services/runtime.ts";
5
- import { setSyncTargetMode } from "#app/services/set.ts";
6
-
7
- export default class SyncSet extends Command {
8
- public static override summary =
9
- "Set sync mode for a tracked directory root, child file, or child subtree";
10
-
11
- public static override args = {
12
- state: Args.string({
13
- description: "Mode to apply: normal, secret, or ignore",
14
- options: ["normal", "secret", "ignore"],
15
- required: true,
16
- }),
17
- target: Args.string({
18
- description:
19
- "Tracked local path (including cwd-relative) or repository path inside a tracked directory",
20
- required: true,
21
- }),
22
- };
23
-
24
- public static override flags = {
25
- recursive: Flags.boolean({
26
- default: false,
27
- description:
28
- "Apply the mode to a directory subtree or update a tracked directory root default",
29
- }),
30
- };
31
-
32
- public override async run(): Promise<void> {
33
- const { args, flags } = await this.parse(SyncSet);
34
- const output = formatSyncSetResult(
35
- await setSyncTargetMode(
36
- {
37
- recursive: flags.recursive,
38
- state: args.state as "ignore" | "normal" | "secret",
39
- target: args.target,
40
- },
41
- createSyncContext(),
42
- ),
43
- );
44
-
45
- process.stdout.write(output);
46
- }
47
- }
@@ -1,105 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
-
3
- import {
4
- formatSyncAddResult,
5
- formatSyncForgetResult,
6
- formatSyncInitResult,
7
- formatSyncPullResult,
8
- formatSyncPushResult,
9
- formatSyncSetResult,
10
- } from "#app/cli/sync-output.ts";
11
-
12
- describe("sync output formatting", () => {
13
- it("formats init results for cloned repositories", () => {
14
- expect(
15
- formatSyncInitResult({
16
- alreadyInitialized: false,
17
- configPath: "/tmp/sync/config.json",
18
- entryCount: 2,
19
- generatedIdentity: true,
20
- gitAction: "cloned",
21
- gitSource: "/tmp/remote",
22
- identityFile: "/tmp/xdg/devsync/age/keys.txt",
23
- recipientCount: 3,
24
- ruleCount: 4,
25
- syncDirectory: "/tmp/sync",
26
- }),
27
- ).toBe(
28
- [
29
- "Initialized sync directory.",
30
- "Sync directory: /tmp/sync",
31
- "Config file: /tmp/sync/config.json",
32
- "Age identity file: /tmp/xdg/devsync/age/keys.txt",
33
- "Git repository: cloned from /tmp/remote",
34
- "Age bootstrap: generated a new local identity.",
35
- "Summary: 3 recipients, 2 entries, 4 rules.",
36
- "",
37
- ].join("\n"),
38
- );
39
- });
40
-
41
- it("formats add, forget, and set results", () => {
42
- expect(
43
- formatSyncAddResult({
44
- alreadyTracked: false,
45
- configPath: "/tmp/sync/config.json",
46
- kind: "file",
47
- localPath: "/tmp/home/.zshrc",
48
- mode: "secret",
49
- repoPath: ".zshrc",
50
- syncDirectory: "/tmp/sync",
51
- }),
52
- ).toContain("Added sync target.\n");
53
- expect(
54
- formatSyncForgetResult({
55
- configPath: "/tmp/sync/config.json",
56
- localPath: "/tmp/home/.zshrc",
57
- plainArtifactCount: 1,
58
- repoPath: ".zshrc",
59
- secretArtifactCount: 2,
60
- syncDirectory: "/tmp/sync",
61
- }),
62
- ).toContain("Removed repo artifacts: 1 plain, 2 secret.\n");
63
- expect(
64
- formatSyncSetResult({
65
- action: "updated",
66
- configPath: "/tmp/sync/config.json",
67
- entryRepoPath: "bundle",
68
- localPath: "/tmp/home/bundle/private.json",
69
- mode: "ignore",
70
- repoPath: "bundle/private.json",
71
- scope: "exact",
72
- syncDirectory: "/tmp/sync",
73
- }),
74
- ).toContain("Scope: exact rule\nAction: updated\n");
75
- });
76
-
77
- it("formats push and pull dry-run summaries", () => {
78
- expect(
79
- formatSyncPushResult({
80
- configPath: "/tmp/sync/config.json",
81
- deletedArtifactCount: 4,
82
- directoryCount: 1,
83
- dryRun: true,
84
- encryptedFileCount: 2,
85
- plainFileCount: 3,
86
- symlinkCount: 1,
87
- syncDirectory: "/tmp/sync",
88
- }),
89
- ).toContain("No filesystem changes were made.\n");
90
- expect(
91
- formatSyncPullResult({
92
- configPath: "/tmp/sync/config.json",
93
- decryptedFileCount: 2,
94
- deletedLocalCount: 5,
95
- directoryCount: 1,
96
- dryRun: true,
97
- plainFileCount: 3,
98
- symlinkCount: 1,
99
- syncDirectory: "/tmp/sync",
100
- }),
101
- ).toContain(
102
- "local paths would be removed.\nNo filesystem changes were made.\n",
103
- );
104
- });
105
- });
@@ -1,129 +0,0 @@
1
- import { ensureTrailingNewline } from "#app/lib/string.ts";
2
- import type { SyncAddResult } from "#app/services/add.ts";
3
- import type { SyncForgetResult } from "#app/services/forget.ts";
4
- import type { SyncInitResult } from "#app/services/init.ts";
5
- import type { SyncPullResult } from "#app/services/pull.ts";
6
- import type { SyncPushResult } from "#app/services/push.ts";
7
- import type { SyncSetResult } from "#app/services/set.ts";
8
-
9
- export const formatSyncInitResult = (result: SyncInitResult) => {
10
- const lines = [
11
- result.alreadyInitialized
12
- ? "Sync directory already initialized."
13
- : "Initialized sync directory.",
14
- `Sync directory: ${result.syncDirectory}`,
15
- `Config file: ${result.configPath}`,
16
- `Age identity file: ${result.identityFile}`,
17
- (() => {
18
- switch (result.gitAction) {
19
- case "cloned":
20
- return `Git repository: cloned from ${result.gitSource}`;
21
- case "initialized":
22
- return "Git repository: initialized new repository";
23
- default:
24
- return "Git repository: using existing repository";
25
- }
26
- })(),
27
- ...(result.generatedIdentity
28
- ? ["Age bootstrap: generated a new local identity."]
29
- : []),
30
- `Summary: ${result.recipientCount} recipients, ${result.entryCount} entries, ${result.ruleCount} rules.`,
31
- ];
32
-
33
- return ensureTrailingNewline(lines.join("\n"));
34
- };
35
-
36
- export const formatSyncAddResult = (result: SyncAddResult) => {
37
- const lines = [
38
- result.alreadyTracked
39
- ? "Sync target already tracked."
40
- : "Added sync target.",
41
- `Sync directory: ${result.syncDirectory}`,
42
- `Config file: ${result.configPath}`,
43
- `Local path: ${result.localPath}`,
44
- `Repository path: ${result.repoPath}`,
45
- `Kind: ${result.kind}`,
46
- `Mode: ${result.mode}`,
47
- ];
48
-
49
- return ensureTrailingNewline(lines.join("\n"));
50
- };
51
-
52
- export const formatSyncForgetResult = (result: SyncForgetResult) => {
53
- const lines = [
54
- "Forgot sync target.",
55
- `Sync directory: ${result.syncDirectory}`,
56
- `Config file: ${result.configPath}`,
57
- `Local path: ${result.localPath}`,
58
- `Repository path: ${result.repoPath}`,
59
- `Removed repo artifacts: ${result.plainArtifactCount} plain, ${result.secretArtifactCount} secret.`,
60
- ];
61
-
62
- return ensureTrailingNewline(lines.join("\n"));
63
- };
64
-
65
- const formatSetScope = (scope: SyncSetResult["scope"]) => {
66
- switch (scope) {
67
- case "default":
68
- return "entry default";
69
- case "subtree":
70
- return "subtree rule";
71
- default:
72
- return "exact rule";
73
- }
74
- };
75
-
76
- export const formatSyncSetResult = (result: SyncSetResult) => {
77
- const lines = [
78
- result.action === "unchanged"
79
- ? "Sync mode unchanged."
80
- : "Updated sync mode.",
81
- `Sync directory: ${result.syncDirectory}`,
82
- `Config file: ${result.configPath}`,
83
- `Owning entry: ${result.entryRepoPath}`,
84
- `Target repository path: ${result.repoPath}`,
85
- `Mode: ${result.mode}`,
86
- `Scope: ${formatSetScope(result.scope)}`,
87
- `Action: ${result.action}`,
88
- ];
89
-
90
- return ensureTrailingNewline(lines.join("\n"));
91
- };
92
-
93
- export const formatSyncPushResult = (result: SyncPushResult) => {
94
- const lines = result.dryRun
95
- ? [
96
- "Dry run for sync push.",
97
- `Sync directory: ${result.syncDirectory}`,
98
- `Config file: ${result.configPath}`,
99
- `Summary: ${result.plainFileCount} plain files, ${result.encryptedFileCount} encrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedArtifactCount} stale repository artifacts would be removed.`,
100
- "No filesystem changes were made.",
101
- ]
102
- : [
103
- "Synchronized local config into the sync repository.",
104
- `Sync directory: ${result.syncDirectory}`,
105
- `Config file: ${result.configPath}`,
106
- `Summary: ${result.plainFileCount} plain files, ${result.encryptedFileCount} encrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedArtifactCount} stale repository artifacts removed.`,
107
- ];
108
-
109
- return ensureTrailingNewline(lines.join("\n"));
110
- };
111
-
112
- export const formatSyncPullResult = (result: SyncPullResult) => {
113
- const lines = result.dryRun
114
- ? [
115
- "Dry run for sync pull.",
116
- `Sync directory: ${result.syncDirectory}`,
117
- `Config file: ${result.configPath}`,
118
- `Summary: ${result.plainFileCount} plain files, ${result.decryptedFileCount} decrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedLocalCount} local paths would be removed.`,
119
- "No filesystem changes were made.",
120
- ]
121
- : [
122
- "Applied sync repository to local config.",
123
- `Sync directory: ${result.syncDirectory}`,
124
- `Config file: ${result.configPath}`,
125
- `Summary: ${result.plainFileCount} plain files, ${result.decryptedFileCount} decrypted files, ${result.symlinkCount} symlinks, ${result.directoryCount} directory roots, ${result.deletedLocalCount} local paths removed.`,
126
- ];
127
-
128
- return ensureTrailingNewline(lines.join("\n"));
129
- };