@telepath-computer/stash 0.1.5 → 0.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.
- package/README.md +23 -3
- package/dist/cli-main.d.ts +22 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +443 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.js +1 -167
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +42 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +215 -0
- package/dist/daemon.js.map +1 -0
- package/dist/global-config.d.ts +7 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +62 -2
- package/dist/global-config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/github-provider.d.ts +1 -0
- package/dist/providers/github-provider.d.ts.map +1 -1
- package/dist/providers/github-provider.js +31 -15
- package/dist/providers/github-provider.js.map +1 -1
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js +6 -7
- package/dist/stash.js.map +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +2 -4
- package/dist/ui/format.js.map +1 -1
- package/dist/ui/watch-renderer.d.ts +16 -0
- package/dist/ui/watch-renderer.d.ts.map +1 -0
- package/dist/ui/watch-renderer.js +59 -0
- package/dist/ui/watch-renderer.js.map +1 -0
- package/dist/watch.d.ts +64 -4
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +259 -214
- package/dist/watch.js.map +1 -1
- 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,22 @@
|
|
|
1
|
+
import type { GlobalConfig } from "./types.ts";
|
|
2
|
+
type ServiceHandle = {
|
|
3
|
+
install(): Promise<void>;
|
|
4
|
+
uninstall(): Promise<void>;
|
|
5
|
+
status(): Promise<{
|
|
6
|
+
installed: boolean;
|
|
7
|
+
running: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
type CliDependencies = {
|
|
11
|
+
cwd?: () => string;
|
|
12
|
+
readGlobalConfig?: () => Promise<GlobalConfig>;
|
|
13
|
+
writeGlobalConfig?: (config: GlobalConfig) => Promise<void>;
|
|
14
|
+
service?: ServiceHandle;
|
|
15
|
+
runDaemon?: () => Promise<void>;
|
|
16
|
+
stdout?: NodeJS.WriteStream;
|
|
17
|
+
stderr?: NodeJS.WriteStream;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveStashCommand(): Promise<string>;
|
|
20
|
+
export declare function main(argv?: string[], deps?: CliDependencies): Promise<void>;
|
|
21
|
+
export {};
|
|
22
|
+
//# 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":"AAuBA,OAAO,KAAK,EAAS,YAAY,EAAiB,MAAM,YAAY,CAAC;AAKrE,KAAK,aAAa,GAAG;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7D,CAAC;AAEF,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,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,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;AAoXD,wBAAsB,IAAI,CAAC,IAAI,WAAe,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+IzF"}
|
package/dist/cli-main.js
ADDED
|
@@ -0,0 +1,443 @@
|
|
|
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 { Daemon, UnsupportedPlatformError } from "@rupertsworld/daemon";
|
|
5
|
+
import { Command, Option } from "commander";
|
|
6
|
+
import { input, password } from "@inquirer/prompts";
|
|
7
|
+
import { addBackgroundStash, getBackgroundStashes, getProviderConfig, readGlobalConfig, removeBackgroundStash, setProviderConfig, writeGlobalConfig, } from "./global-config.js";
|
|
8
|
+
import { runDaemon } from "./daemon.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 UnsupportedPlatformError;
|
|
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(serviceHandle, stderr) {
|
|
88
|
+
if (!serviceHandle) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const status = await serviceHandle.status();
|
|
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, serviceHandle, 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(serviceHandle, 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(serviceHandle, stdout) {
|
|
224
|
+
await serviceHandle.install();
|
|
225
|
+
writeLine(stdout, "Installed background service.");
|
|
226
|
+
}
|
|
227
|
+
async function runBackgroundUninstall(serviceHandle, stdout) {
|
|
228
|
+
await serviceHandle.uninstall();
|
|
229
|
+
writeLine(stdout, "Uninstalled background service.");
|
|
230
|
+
}
|
|
231
|
+
async function runBackgroundAdd(dirArg, cwd, readConfig, writeConfig, serviceHandle, stdout, stderr) {
|
|
232
|
+
const dir = resolve(dirArg ?? cwd());
|
|
233
|
+
await registerBackgroundStash(dir, readConfig, writeConfig, serviceHandle, stderr);
|
|
234
|
+
writeLine(stdout, `Registered ${dir} for background sync.`);
|
|
235
|
+
}
|
|
236
|
+
async function runBackgroundRemove(dirArg, cwd, readConfig, writeConfig, stdout) {
|
|
237
|
+
const dir = resolve(dirArg ?? cwd());
|
|
238
|
+
const globalConfig = await readConfig();
|
|
239
|
+
await writeConfig(removeBackgroundStash(globalConfig, dir));
|
|
240
|
+
writeLine(stdout, `Removed ${dir} from background sync.`);
|
|
241
|
+
}
|
|
242
|
+
async function runBackgroundStatus(readConfig, serviceHandle, stdout) {
|
|
243
|
+
const { dim, green, red } = createColors(stdout);
|
|
244
|
+
let serviceRunning = false;
|
|
245
|
+
let serviceMessage = null;
|
|
246
|
+
try {
|
|
247
|
+
const current = await serviceHandle.status();
|
|
248
|
+
if (!current.installed) {
|
|
249
|
+
serviceMessage = dim("service not installed — run `stash background install`");
|
|
250
|
+
}
|
|
251
|
+
else if (current.running) {
|
|
252
|
+
serviceRunning = true;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
serviceMessage = red("background service is stopped — run `stash background install` to restart");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (isUnsupportedPlatformError(error)) {
|
|
260
|
+
serviceMessage = dim("service install not supported on this platform — run `stash background watch` manually");
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const globalConfig = await readConfig();
|
|
267
|
+
const stashes = getBackgroundStashes(globalConfig);
|
|
268
|
+
if (serviceRunning) {
|
|
269
|
+
writeLine(stdout, dim("stash is syncing in the background"));
|
|
270
|
+
}
|
|
271
|
+
else if (serviceMessage) {
|
|
272
|
+
writeLine(stdout, serviceMessage);
|
|
273
|
+
}
|
|
274
|
+
if (stashes.length === 0) {
|
|
275
|
+
writeLine(stdout, dim("\nno stashes registered — run `stash background add` to add one"));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
writeLine(stdout, "");
|
|
279
|
+
for (const dir of stashes) {
|
|
280
|
+
if (!existsSync(dir)) {
|
|
281
|
+
writeLine(stdout, `${red("✗")} ${dir}`);
|
|
282
|
+
writeLine(stdout, dim(" directory not found"));
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
const status = await readBackgroundStatus(dir);
|
|
286
|
+
if (!status) {
|
|
287
|
+
writeLine(stdout, `${dim("○")} ${dir}`);
|
|
288
|
+
writeLine(stdout, dim(" waiting for first sync"));
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
if (status.kind === "error") {
|
|
292
|
+
writeLine(stdout, `${red("✗")} ${dir}`);
|
|
293
|
+
const ago = status.lastSync ? formatTimeAgo(new Date(status.lastSync)) : null;
|
|
294
|
+
const errorMsg = status.error ?? "unknown error";
|
|
295
|
+
writeLine(stdout, ago ? ` ${red(errorMsg)} ${dim("·")} ${dim(`synced ${ago}`)}` : ` ${red(errorMsg)}`);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const ago = status.lastSync ? formatTimeAgo(new Date(status.lastSync)) : null;
|
|
299
|
+
if (status.summary) {
|
|
300
|
+
writeLine(stdout, `${green("●")} ${dir}`);
|
|
301
|
+
writeLine(stdout, ` ${status.summary} ${dim("·")} ${dim(`synced ${ago ?? "unknown"}`)}`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
writeLine(stdout, `${green("●")} ${dir}`);
|
|
305
|
+
writeLine(stdout, dim(` up to date · synced ${ago ?? "unknown"}`));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function addFieldOptions(command, fields) {
|
|
310
|
+
for (const field of fields) {
|
|
311
|
+
command.addOption(new Option(`--${field.name} <value>`, field.label));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async function createDefaultService() {
|
|
315
|
+
const command = await resolveStashCommand();
|
|
316
|
+
return new Daemon({
|
|
317
|
+
name: SERVICE_NAME,
|
|
318
|
+
description: SERVICE_DESCRIPTION,
|
|
319
|
+
command,
|
|
320
|
+
args: ["background", "watch"],
|
|
321
|
+
env: process.env.PATH ? { PATH: process.env.PATH } : undefined,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
export async function main(argv = process.argv, deps = {}) {
|
|
325
|
+
const cwd = deps.cwd ?? (() => process.cwd());
|
|
326
|
+
const readConfig = deps.readGlobalConfig ?? readGlobalConfig;
|
|
327
|
+
const writeConfig = deps.writeGlobalConfig ?? writeGlobalConfig;
|
|
328
|
+
const serviceHandle = deps.service;
|
|
329
|
+
const getService = async () => serviceHandle ?? (await createDefaultService());
|
|
330
|
+
const runDaemonCommand = deps.runDaemon ?? runDaemon;
|
|
331
|
+
const stdout = deps.stdout ?? process.stdout;
|
|
332
|
+
const stderr = deps.stderr ?? process.stderr;
|
|
333
|
+
const program = new Command()
|
|
334
|
+
.name("stash")
|
|
335
|
+
.description("Conflict-free synced folders")
|
|
336
|
+
.showHelpAfterError()
|
|
337
|
+
.configureOutput({
|
|
338
|
+
writeOut: (text) => {
|
|
339
|
+
stdout.write(text);
|
|
340
|
+
},
|
|
341
|
+
writeErr: (text) => {
|
|
342
|
+
stderr.write(text);
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
const setupCommand = program
|
|
346
|
+
.command("setup")
|
|
347
|
+
.description("Configure global provider settings")
|
|
348
|
+
.argument("<provider>", "Provider name")
|
|
349
|
+
.allowUnknownOption(true)
|
|
350
|
+
.action(async (providerName, _opts, command) => {
|
|
351
|
+
await runSetup(providerName, command.opts(), { readGlobalConfig: readConfig, writeGlobalConfig: writeConfig }, stdout);
|
|
352
|
+
});
|
|
353
|
+
const connectCommand = program
|
|
354
|
+
.command("connect")
|
|
355
|
+
.description("Connect this stash to a provider")
|
|
356
|
+
.argument("<provider>", "Provider name")
|
|
357
|
+
.option("--background", "Register this stash for background syncing")
|
|
358
|
+
.allowUnknownOption(true)
|
|
359
|
+
.action(async (providerName, _opts, command) => {
|
|
360
|
+
const opts = command.opts();
|
|
361
|
+
const svc = opts.background === true ? await getService() : undefined;
|
|
362
|
+
await runConnect(providerName, opts, {
|
|
363
|
+
cwd,
|
|
364
|
+
readGlobalConfig: readConfig,
|
|
365
|
+
writeGlobalConfig: writeConfig,
|
|
366
|
+
service: svc,
|
|
367
|
+
}, stdout, stderr);
|
|
368
|
+
});
|
|
369
|
+
program
|
|
370
|
+
.command("disconnect")
|
|
371
|
+
.description("Disconnect provider from this stash")
|
|
372
|
+
.argument("<provider>", "Provider name")
|
|
373
|
+
.action(async (providerName) => {
|
|
374
|
+
await runDisconnect(providerName, cwd, readConfig, stdout);
|
|
375
|
+
});
|
|
376
|
+
program
|
|
377
|
+
.command("init")
|
|
378
|
+
.description("Initialize the current directory as a stash")
|
|
379
|
+
.action(() => {
|
|
380
|
+
return runInit(cwd, readConfig, stdout);
|
|
381
|
+
});
|
|
382
|
+
program
|
|
383
|
+
.command("sync")
|
|
384
|
+
.description("Sync local files with connections")
|
|
385
|
+
.action(() => runSync(cwd, readConfig));
|
|
386
|
+
program
|
|
387
|
+
.command("watch")
|
|
388
|
+
.description("Watch and sync continuously")
|
|
389
|
+
.action(() => runWatch(cwd, readConfig));
|
|
390
|
+
program
|
|
391
|
+
.command("status")
|
|
392
|
+
.description("Show local stash status")
|
|
393
|
+
.action(() => runStatus(cwd, readConfig, stdout));
|
|
394
|
+
const backgroundCommand = program.command("background").description("Manage background syncing");
|
|
395
|
+
backgroundCommand
|
|
396
|
+
.command("install")
|
|
397
|
+
.description("Install the background service")
|
|
398
|
+
.action(async () => runBackgroundInstall(await getService(), stdout));
|
|
399
|
+
backgroundCommand
|
|
400
|
+
.command("uninstall")
|
|
401
|
+
.description("Remove the background service")
|
|
402
|
+
.action(async () => runBackgroundUninstall(await getService(), stdout));
|
|
403
|
+
backgroundCommand
|
|
404
|
+
.command("add")
|
|
405
|
+
.description("Register a stash for background syncing")
|
|
406
|
+
.argument("[dir]", "Stash directory")
|
|
407
|
+
.action(async (dirArg) => {
|
|
408
|
+
const svc = await getService().catch(() => undefined);
|
|
409
|
+
await runBackgroundAdd(dirArg, cwd, readConfig, writeConfig, svc, stdout, stderr);
|
|
410
|
+
});
|
|
411
|
+
backgroundCommand
|
|
412
|
+
.command("remove")
|
|
413
|
+
.description("Unregister a stash from background syncing")
|
|
414
|
+
.argument("[dir]", "Stash directory")
|
|
415
|
+
.action((dirArg) => runBackgroundRemove(dirArg, cwd, readConfig, writeConfig, stdout));
|
|
416
|
+
backgroundCommand
|
|
417
|
+
.command("status")
|
|
418
|
+
.description("Show background service and stash status")
|
|
419
|
+
.action(async () => runBackgroundStatus(readConfig, await getService(), stdout));
|
|
420
|
+
backgroundCommand
|
|
421
|
+
.command("watch", { hidden: true })
|
|
422
|
+
.description("Run the background daemon")
|
|
423
|
+
.action(() => runDaemonCommand());
|
|
424
|
+
const commandName = argv[2];
|
|
425
|
+
const providerName = argv[3];
|
|
426
|
+
if (providerName && (commandName === "setup" || commandName === "connect")) {
|
|
427
|
+
const provider = providers[providerName];
|
|
428
|
+
if (provider) {
|
|
429
|
+
if (commandName === "setup") {
|
|
430
|
+
addFieldOptions(setupCommand, provider.spec.setup);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
addFieldOptions(connectCommand, [...provider.spec.setup, ...provider.spec.connect]);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (argv.length <= 2) {
|
|
438
|
+
program.outputHelp();
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
await program.parseAsync(argv);
|
|
442
|
+
}
|
|
443
|
+
//# 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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"}
|