@telepath-computer/stash 0.1.5 → 0.2.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 (47) hide show
  1. package/README.md +23 -3
  2. package/dist/cli-main.d.ts +20 -0
  3. package/dist/cli-main.d.ts.map +1 -0
  4. package/dist/cli-main.js +445 -0
  5. package/dist/cli-main.js.map +1 -0
  6. package/dist/cli.js +1 -167
  7. package/dist/cli.js.map +1 -1
  8. package/dist/daemon.d.ts +42 -0
  9. package/dist/daemon.d.ts.map +1 -0
  10. package/dist/daemon.js +210 -0
  11. package/dist/daemon.js.map +1 -0
  12. package/dist/global-config.d.ts +7 -0
  13. package/dist/global-config.d.ts.map +1 -1
  14. package/dist/global-config.js +62 -2
  15. package/dist/global-config.js.map +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/providers/github-provider.d.ts.map +1 -1
  21. package/dist/providers/github-provider.js +12 -14
  22. package/dist/providers/github-provider.js.map +1 -1
  23. package/dist/service/controller.d.ts +32 -0
  24. package/dist/service/controller.d.ts.map +1 -0
  25. package/dist/service/controller.js +162 -0
  26. package/dist/service/controller.js.map +1 -0
  27. package/dist/service/index.d.ts +16 -0
  28. package/dist/service/index.d.ts.map +1 -0
  29. package/dist/service/index.js +6 -0
  30. package/dist/service/index.js.map +1 -0
  31. package/dist/stash.d.ts.map +1 -1
  32. package/dist/stash.js +6 -7
  33. package/dist/stash.js.map +1 -1
  34. package/dist/types.d.ts +8 -1
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/ui/format.d.ts.map +1 -1
  37. package/dist/ui/format.js +2 -4
  38. package/dist/ui/format.js.map +1 -1
  39. package/dist/ui/watch-renderer.d.ts +16 -0
  40. package/dist/ui/watch-renderer.d.ts.map +1 -0
  41. package/dist/ui/watch-renderer.js +59 -0
  42. package/dist/ui/watch-renderer.js.map +1 -0
  43. package/dist/watch.d.ts +64 -4
  44. package/dist/watch.d.ts.map +1 -1
  45. package/dist/watch.js +253 -214
  46. package/dist/watch.js.map +1 -1
  47. package/package.json +13 -4
package/README.md CHANGED
@@ -11,10 +11,10 @@ npm install -g @telepath-computer/stash
11
11
  Set up GitHub access and connect the current directory:
12
12
 
13
13
  ```bash
14
+ stash background install
14
15
  stash init
15
16
  stash setup github
16
- stash connect github --repo user/repo
17
- stash sync
17
+ stash connect github --repo user/repo --background
18
18
  ```
19
19
 
20
20
  You can initialize a directory explicitly with `stash init`, or let `stash connect` create `.stash/` for you automatically.
@@ -31,22 +31,42 @@ You'll need a GitHub [personal access token](https://github.com/settings/tokens)
31
31
  ## Commands
32
32
 
33
33
  ```bash
34
+ stash background install
35
+ stash background add
34
36
  stash init
35
37
  stash setup github
36
- stash connect github --repo user/repo
38
+ stash connect github --repo user/repo --background
37
39
  stash sync
38
40
  stash watch
41
+ stash background status
39
42
  stash status
40
43
  stash disconnect github
44
+ stash background remove
45
+ stash background uninstall
41
46
  ```
42
47
 
43
48
  `stash watch` keeps the directory in sync continuously. Press `.` to trigger an immediate sync and `q` to quit.
44
49
 
50
+ `stash background install` plus `stash connect --background` gives you boot-time background syncing managed by `launchd` on macOS or `systemd` on Linux.
51
+
45
52
  ## Config
46
53
 
47
54
  - Global config lives at `~/.stash/config.json` or `$XDG_CONFIG_HOME/stash/config.json`.
48
55
  - Per-stash connection config lives at `.stash/config.local.json` inside the synced directory.
49
56
 
57
+ Example global config:
58
+
59
+ ```json
60
+ {
61
+ "providers": {
62
+ "github": { "token": "ghp_..." }
63
+ },
64
+ "background": {
65
+ "stashes": ["/Users/me/notes"]
66
+ }
67
+ }
68
+ ```
69
+
50
70
  ## Docs
51
71
 
52
72
  - `docs/api.md` - developer-facing `Stash` and provider contracts
@@ -0,0 +1,20 @@
1
+ import * as service from "./service/index.ts";
2
+ import type { GlobalConfig } from "./types.ts";
3
+ type CliDependencies = {
4
+ cwd?: () => string;
5
+ readGlobalConfig?: () => Promise<GlobalConfig>;
6
+ writeGlobalConfig?: (config: GlobalConfig) => Promise<void>;
7
+ service?: {
8
+ install: typeof service.install;
9
+ uninstall: typeof service.uninstall;
10
+ status: typeof service.status;
11
+ };
12
+ runDaemon?: () => Promise<void>;
13
+ resolveStashCommand?: () => Promise<string>;
14
+ stdout?: NodeJS.WriteStream;
15
+ stderr?: NodeJS.WriteStream;
16
+ };
17
+ export declare function resolveStashCommand(): Promise<string>;
18
+ export declare function main(argv?: string[], deps?: CliDependencies): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=cli-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAQ9C,OAAO,KAAK,EAAS,YAAY,EAAiB,MAAM,YAAY,CAAC;AAKrE,KAAK,eAAe,GAAG;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC;QAChC,SAAS,EAAE,OAAO,OAAO,CAAC,SAAS,CAAC;QACpC,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,CAAC;KAC/B,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CAC7B,CAAC;AAkCF,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAoB3D;AA0XD,wBAAsB,IAAI,CAAC,IAAI,WAAe,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4IzF"}
@@ -0,0 +1,445 @@
1
+ import { existsSync } from "node:fs";
2
+ import { access, constants, readFile } from "node:fs/promises";
3
+ import { basename, delimiter, join, resolve } from "node:path";
4
+ import { Command, Option } from "commander";
5
+ import { input, password } from "@inquirer/prompts";
6
+ import { addBackgroundStash, getBackgroundStashes, getProviderConfig, readGlobalConfig, removeBackgroundStash, setProviderConfig, writeGlobalConfig, } from "./global-config.js";
7
+ import { runDaemon } from "./daemon.js";
8
+ import * as service from "./service/index.js";
9
+ import { providers } from "./providers/index.js";
10
+ import { Stash } from "./stash.js";
11
+ import { createColors } from "./ui/color.js";
12
+ import { formatTimeAgo } from "./ui/format.js";
13
+ import { LiveLine } from "./ui/live-line.js";
14
+ import { SyncRenderer } from "./ui/sync-renderer.js";
15
+ import { watch as watchStash } from "./watch.js";
16
+ const SERVICE_NAME = "stash-background";
17
+ const SERVICE_DESCRIPTION = "Stash background sync";
18
+ function getProvider(name) {
19
+ const provider = providers[name];
20
+ if (!provider) {
21
+ throw new Error(`Unknown provider: ${name}`);
22
+ }
23
+ return provider;
24
+ }
25
+ async function isExecutable(path) {
26
+ try {
27
+ await access(path, constants.X_OK);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ function writeLine(stream, text) {
35
+ stream.write(`${text}\n`);
36
+ }
37
+ function isUnsupportedPlatformError(error) {
38
+ return error instanceof Error && error.message.includes("not supported on this platform yet");
39
+ }
40
+ export async function resolveStashCommand() {
41
+ const argvPath = process.argv[1];
42
+ if (argvPath && basename(argvPath) === "stash") {
43
+ const candidate = resolve(argvPath);
44
+ if (await isExecutable(candidate)) {
45
+ return candidate;
46
+ }
47
+ }
48
+ for (const pathEntry of (process.env.PATH ?? "").split(delimiter)) {
49
+ if (!pathEntry) {
50
+ continue;
51
+ }
52
+ const candidate = join(pathEntry, "stash");
53
+ if (await isExecutable(candidate)) {
54
+ return candidate;
55
+ }
56
+ }
57
+ throw new Error("Could not find the `stash` binary on PATH");
58
+ }
59
+ async function promptField(field) {
60
+ if (field.secret) {
61
+ return password({ message: field.label });
62
+ }
63
+ return input({ message: field.label });
64
+ }
65
+ async function collectFields(fields, valuesFromCli, current = {}) {
66
+ const values = { ...current };
67
+ for (const field of fields) {
68
+ if (values[field.name]) {
69
+ continue;
70
+ }
71
+ const cliValue = valuesFromCli[field.name];
72
+ if (typeof cliValue === "string") {
73
+ values[field.name] = cliValue;
74
+ continue;
75
+ }
76
+ values[field.name] = await promptField(field);
77
+ }
78
+ return values;
79
+ }
80
+ async function readBackgroundStatus(dir) {
81
+ const statusPath = join(dir, ".stash", "status.json");
82
+ if (!existsSync(statusPath)) {
83
+ return null;
84
+ }
85
+ return JSON.parse(await readFile(statusPath, "utf8"));
86
+ }
87
+ async function warnIfServiceUnavailable(serviceModule, stderr) {
88
+ if (!serviceModule) {
89
+ return;
90
+ }
91
+ try {
92
+ const status = await serviceModule.status({ name: SERVICE_NAME });
93
+ if (!status.installed) {
94
+ writeLine(stderr, "warning: background service is not installed");
95
+ }
96
+ }
97
+ catch (error) {
98
+ if (isUnsupportedPlatformError(error)) {
99
+ writeLine(stderr, "warning: service install is not supported on this platform yet; run `stash background watch` manually");
100
+ return;
101
+ }
102
+ throw error;
103
+ }
104
+ }
105
+ async function runSetup(providerName, valuesFromCli, deps, stdout) {
106
+ const provider = getProvider(providerName);
107
+ let globalConfig = await deps.readGlobalConfig();
108
+ const values = await collectFields(provider.spec.setup, valuesFromCli, getProviderConfig(globalConfig, providerName));
109
+ globalConfig = setProviderConfig(globalConfig, providerName, values);
110
+ await deps.writeGlobalConfig(globalConfig);
111
+ writeLine(stdout, `Configured ${providerName}.`);
112
+ }
113
+ async function runInit(cwd, readConfig, stdout) {
114
+ const dir = cwd();
115
+ const alreadyInitialized = existsSync(join(dir, ".stash"));
116
+ await Stash.init(dir, await readConfig());
117
+ writeLine(stdout, alreadyInitialized ? "Already initialized." : "Initialized stash.");
118
+ }
119
+ async function registerBackgroundStash(dir, readConfig, writeConfig, serviceModule, stderr) {
120
+ const globalConfig = await readConfig();
121
+ const stash = await Stash.load(dir, globalConfig);
122
+ if (Object.keys(stash.connections).length === 0) {
123
+ writeLine(stderr, "warning: this stash won't sync until a provider is connected");
124
+ }
125
+ await writeConfig(addBackgroundStash(globalConfig, dir));
126
+ await warnIfServiceUnavailable(serviceModule, stderr);
127
+ }
128
+ async function runConnect(providerName, valuesFromCli, deps, stdout, stderr) {
129
+ const provider = getProvider(providerName);
130
+ let globalConfig = await deps.readGlobalConfig();
131
+ const setupValues = await collectFields(provider.spec.setup, valuesFromCli, getProviderConfig(globalConfig, providerName));
132
+ globalConfig = setProviderConfig(globalConfig, providerName, setupValues);
133
+ await deps.writeGlobalConfig(globalConfig);
134
+ const dir = deps.cwd();
135
+ const stash = await Stash.init(dir, globalConfig);
136
+ const connectValues = await collectFields(provider.spec.connect, valuesFromCli);
137
+ await stash.connect(providerName, connectValues);
138
+ if (valuesFromCli.background === true) {
139
+ await registerBackgroundStash(dir, deps.readGlobalConfig, deps.writeGlobalConfig, deps.service, stderr);
140
+ }
141
+ writeLine(stdout, `Connected ${providerName}.`);
142
+ }
143
+ async function runDisconnect(providerName, cwd, readConfig, stdout) {
144
+ const stash = await Stash.load(cwd(), await readConfig());
145
+ await stash.disconnect(providerName);
146
+ writeLine(stdout, `Disconnected ${providerName}.`);
147
+ }
148
+ async function runSync(cwd, readConfig) {
149
+ const stash = await Stash.load(cwd(), await readConfig());
150
+ const line = new LiveLine(process.stdout);
151
+ const { green, red } = line.colors;
152
+ const renderer = new SyncRenderer(line);
153
+ const subscription = stash.on("mutation", (mutation) => {
154
+ renderer.onMutation(mutation);
155
+ });
156
+ line.startSpinner("checking...");
157
+ try {
158
+ await stash.sync();
159
+ const summary = renderer.done();
160
+ line.print(summary ? `${green("✓")} synced (${summary})` : `${green("✓")} up to date`);
161
+ }
162
+ catch (error) {
163
+ renderer.error(error);
164
+ line.print(`${red("✗")} sync failed: ${error instanceof Error ? error.message : String(error)}`);
165
+ process.exitCode = 1;
166
+ }
167
+ finally {
168
+ subscription.dispose();
169
+ renderer.dispose();
170
+ line.dispose();
171
+ }
172
+ }
173
+ async function runWatch(cwd, readConfig) {
174
+ const dir = cwd();
175
+ const stash = await Stash.load(dir, await readConfig());
176
+ if (Object.keys(stash.connections).length === 0) {
177
+ throw new Error("no connection configured — run `stash connect <provider>` first");
178
+ }
179
+ await watchStash(stash, { dir, stdin: process.stdin, stdout: process.stdout });
180
+ }
181
+ function formatChangeParts(status) {
182
+ const parts = [];
183
+ if (status.added.length > 0)
184
+ parts.push(`${status.added.length} added`);
185
+ if (status.modified.length > 0)
186
+ parts.push(`${status.modified.length} modified`);
187
+ if (status.deleted.length > 0)
188
+ parts.push(`${status.deleted.length} deleted`);
189
+ return parts;
190
+ }
191
+ async function runStatus(cwd, readConfig, stdout) {
192
+ const { dim, green, yellow } = createColors(stdout);
193
+ const stash = await Stash.load(cwd(), await readConfig());
194
+ const connectionNames = Object.keys(stash.connections);
195
+ if (connectionNames.length === 0) {
196
+ writeLine(stdout, dim("no connections — run `stash connect <provider>` to get started"));
197
+ return;
198
+ }
199
+ const status = stash.status();
200
+ const parts = formatChangeParts(status);
201
+ for (const name of connectionNames) {
202
+ const conn = stash.connections[name];
203
+ const label = conn.repo ?? Object.values(conn).join(", ");
204
+ const dot = parts.length > 0 ? yellow("●") : green("●");
205
+ writeLine(stdout, `${dot} ${name} ${dim(label)}`);
206
+ if (status.lastSync) {
207
+ const ago = formatTimeAgo(status.lastSync);
208
+ if (parts.length > 0) {
209
+ writeLine(stdout, ` ${parts.join(", ")} ${dim("·")} ${dim(`synced ${ago}`)}`);
210
+ }
211
+ else {
212
+ writeLine(stdout, dim(` up to date · synced ${ago}`));
213
+ }
214
+ }
215
+ else if (parts.length > 0) {
216
+ writeLine(stdout, ` ${parts.join(", ")} ${dim("·")} ${dim("never synced")}`);
217
+ }
218
+ else {
219
+ writeLine(stdout, dim(" never synced"));
220
+ }
221
+ }
222
+ }
223
+ async function runBackgroundInstall(serviceModule, resolveCommand, stdout) {
224
+ const command = await resolveCommand();
225
+ await serviceModule.install({
226
+ name: SERVICE_NAME,
227
+ description: SERVICE_DESCRIPTION,
228
+ command,
229
+ args: ["background", "watch"],
230
+ });
231
+ writeLine(stdout, "Installed background service.");
232
+ }
233
+ async function runBackgroundUninstall(serviceModule, stdout) {
234
+ await serviceModule.uninstall({ name: SERVICE_NAME });
235
+ writeLine(stdout, "Uninstalled background service.");
236
+ }
237
+ async function runBackgroundAdd(dirArg, cwd, readConfig, writeConfig, serviceModule, stdout, stderr) {
238
+ const dir = resolve(dirArg ?? cwd());
239
+ await registerBackgroundStash(dir, readConfig, writeConfig, serviceModule, stderr);
240
+ writeLine(stdout, `Registered ${dir} for background sync.`);
241
+ }
242
+ async function runBackgroundRemove(dirArg, cwd, readConfig, writeConfig, stdout) {
243
+ const dir = resolve(dirArg ?? cwd());
244
+ const globalConfig = await readConfig();
245
+ await writeConfig(removeBackgroundStash(globalConfig, dir));
246
+ writeLine(stdout, `Removed ${dir} from background sync.`);
247
+ }
248
+ async function runBackgroundStatus(readConfig, serviceModule, stdout) {
249
+ const { dim, green, red } = createColors(stdout);
250
+ const ora = stdout.isTTY ? (await import("ora")).default : null;
251
+ let serviceRunning = false;
252
+ let serviceMessage = null;
253
+ try {
254
+ const current = await serviceModule.status({ name: SERVICE_NAME });
255
+ if (!current.installed) {
256
+ serviceMessage = dim("service not installed — run `stash background install`");
257
+ }
258
+ else if (current.running) {
259
+ serviceRunning = true;
260
+ }
261
+ else {
262
+ serviceMessage = red("background service is stopped — run `stash background install` to restart");
263
+ }
264
+ }
265
+ catch (error) {
266
+ if (isUnsupportedPlatformError(error)) {
267
+ serviceMessage = dim("service install not supported on this platform — run `stash background watch` manually");
268
+ }
269
+ else {
270
+ throw error;
271
+ }
272
+ }
273
+ const globalConfig = await readConfig();
274
+ const stashes = getBackgroundStashes(globalConfig);
275
+ if (stashes.length === 0) {
276
+ if (serviceMessage) {
277
+ writeLine(stdout, serviceMessage);
278
+ writeLine(stdout, "");
279
+ }
280
+ writeLine(stdout, dim("no stashes registered — run `stash background add` to add one"));
281
+ return;
282
+ }
283
+ for (const dir of stashes) {
284
+ if (!existsSync(dir)) {
285
+ writeLine(stdout, `${red("✗")} ${dir}`);
286
+ writeLine(stdout, dim(" directory not found"));
287
+ continue;
288
+ }
289
+ const status = await readBackgroundStatus(dir);
290
+ if (!status) {
291
+ writeLine(stdout, `${dim("○")} ${dir}`);
292
+ writeLine(stdout, dim(" waiting for first sync"));
293
+ continue;
294
+ }
295
+ if (status.kind === "error") {
296
+ writeLine(stdout, `${red("✗")} ${dir}`);
297
+ const ago = status.lastSync ? formatTimeAgo(new Date(status.lastSync)) : null;
298
+ const errorMsg = status.error ?? "unknown error";
299
+ writeLine(stdout, ago ? ` ${red(errorMsg)} ${dim("·")} ${dim(`synced ${ago}`)}` : ` ${red(errorMsg)}`);
300
+ continue;
301
+ }
302
+ const ago = status.lastSync ? formatTimeAgo(new Date(status.lastSync)) : null;
303
+ if (status.summary) {
304
+ writeLine(stdout, `${green("●")} ${dir}`);
305
+ writeLine(stdout, ` ${status.summary} ${dim("·")} ${dim(`synced ${ago ?? "unknown"}`)}`);
306
+ }
307
+ else {
308
+ writeLine(stdout, `${green("●")} ${dir}`);
309
+ writeLine(stdout, dim(` up to date · synced ${ago ?? "unknown"}`));
310
+ }
311
+ }
312
+ if (serviceRunning) {
313
+ stdout.write("\n");
314
+ if (ora) {
315
+ ora({ text: dim("stash is syncing in the background"), stream: stdout }).start();
316
+ }
317
+ else {
318
+ writeLine(stdout, "stash is syncing in the background");
319
+ }
320
+ }
321
+ else if (serviceMessage) {
322
+ writeLine(stdout, "");
323
+ writeLine(stdout, serviceMessage);
324
+ }
325
+ }
326
+ function addFieldOptions(command, fields) {
327
+ for (const field of fields) {
328
+ command.addOption(new Option(`--${field.name} <value>`, field.label));
329
+ }
330
+ }
331
+ export async function main(argv = process.argv, deps = {}) {
332
+ const cwd = deps.cwd ?? (() => process.cwd());
333
+ const readConfig = deps.readGlobalConfig ?? readGlobalConfig;
334
+ const writeConfig = deps.writeGlobalConfig ?? writeGlobalConfig;
335
+ const serviceModule = deps.service ?? service;
336
+ const runDaemonCommand = deps.runDaemon ?? runDaemon;
337
+ const resolveCommand = deps.resolveStashCommand ?? resolveStashCommand;
338
+ const stdout = deps.stdout ?? process.stdout;
339
+ const stderr = deps.stderr ?? process.stderr;
340
+ const program = new Command()
341
+ .name("stash")
342
+ .description("Conflict-free synced folders")
343
+ .showHelpAfterError()
344
+ .configureOutput({
345
+ writeOut: (text) => {
346
+ stdout.write(text);
347
+ },
348
+ writeErr: (text) => {
349
+ stderr.write(text);
350
+ },
351
+ });
352
+ const setupCommand = program
353
+ .command("setup")
354
+ .description("Configure global provider settings")
355
+ .argument("<provider>", "Provider name")
356
+ .allowUnknownOption(true)
357
+ .action(async (providerName, _opts, command) => {
358
+ await runSetup(providerName, command.opts(), { readGlobalConfig: readConfig, writeGlobalConfig: writeConfig }, stdout);
359
+ });
360
+ const connectCommand = program
361
+ .command("connect")
362
+ .description("Connect this stash to a provider")
363
+ .argument("<provider>", "Provider name")
364
+ .option("--background", "Register this stash for background syncing")
365
+ .allowUnknownOption(true)
366
+ .action(async (providerName, _opts, command) => {
367
+ await runConnect(providerName, command.opts(), {
368
+ cwd,
369
+ readGlobalConfig: readConfig,
370
+ writeGlobalConfig: writeConfig,
371
+ service: serviceModule,
372
+ }, stdout, stderr);
373
+ });
374
+ program
375
+ .command("disconnect")
376
+ .description("Disconnect provider from this stash")
377
+ .argument("<provider>", "Provider name")
378
+ .action(async (providerName) => {
379
+ await runDisconnect(providerName, cwd, readConfig, stdout);
380
+ });
381
+ program
382
+ .command("init")
383
+ .description("Initialize the current directory as a stash")
384
+ .action(() => {
385
+ return runInit(cwd, readConfig, stdout);
386
+ });
387
+ program
388
+ .command("sync")
389
+ .description("Sync local files with connections")
390
+ .action(() => runSync(cwd, readConfig));
391
+ program
392
+ .command("watch")
393
+ .description("Watch and sync continuously")
394
+ .action(() => runWatch(cwd, readConfig));
395
+ program
396
+ .command("status")
397
+ .description("Show local stash status")
398
+ .action(() => runStatus(cwd, readConfig, stdout));
399
+ const backgroundCommand = program.command("background").description("Manage background syncing");
400
+ backgroundCommand
401
+ .command("install")
402
+ .description("Install the background service")
403
+ .action(() => runBackgroundInstall(serviceModule, resolveCommand, stdout));
404
+ backgroundCommand
405
+ .command("uninstall")
406
+ .description("Remove the background service")
407
+ .action(() => runBackgroundUninstall(serviceModule, stdout));
408
+ backgroundCommand
409
+ .command("add")
410
+ .description("Register a stash for background syncing")
411
+ .argument("[dir]", "Stash directory")
412
+ .action((dirArg) => runBackgroundAdd(dirArg, cwd, readConfig, writeConfig, serviceModule, stdout, stderr));
413
+ backgroundCommand
414
+ .command("remove")
415
+ .description("Unregister a stash from background syncing")
416
+ .argument("[dir]", "Stash directory")
417
+ .action((dirArg) => runBackgroundRemove(dirArg, cwd, readConfig, writeConfig, stdout));
418
+ backgroundCommand
419
+ .command("status")
420
+ .description("Show background service and stash status")
421
+ .action(() => runBackgroundStatus(readConfig, serviceModule, stdout));
422
+ backgroundCommand
423
+ .command("watch", { hidden: true })
424
+ .description("Run the background daemon")
425
+ .action(() => runDaemonCommand());
426
+ const commandName = argv[2];
427
+ const providerName = argv[3];
428
+ if (providerName && (commandName === "setup" || commandName === "connect")) {
429
+ const provider = providers[providerName];
430
+ if (provider) {
431
+ if (commandName === "setup") {
432
+ addFieldOptions(setupCommand, provider.spec.setup);
433
+ }
434
+ else {
435
+ addFieldOptions(connectCommand, [...provider.spec.setup, ...provider.spec.connect]);
436
+ }
437
+ }
438
+ }
439
+ if (argv.length <= 2) {
440
+ program.outputHelp();
441
+ return;
442
+ }
443
+ await program.parseAsync(argv);
444
+ }
445
+ //# sourceMappingURL=cli-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"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"}