@telepath-computer/stash 0.1.4 → 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.
- package/README.md +102 -0
- package/dist/cli-main.d.ts +20 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +445 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/cli.js +1 -158
- 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 +210 -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 +4 -2
- 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.map +1 -1
- package/dist/providers/github-provider.js +16 -17
- package/dist/providers/github-provider.js.map +1 -1
- package/dist/service/controller.d.ts +32 -0
- package/dist/service/controller.d.ts.map +1 -0
- package/dist/service/controller.js +162 -0
- package/dist/service/controller.js.map +1 -0
- package/dist/service/index.d.ts +16 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +6 -0
- package/dist/service/index.js.map +1 -0
- package/dist/stash.d.ts +1 -1
- package/dist/stash.d.ts.map +1 -1
- package/dist/stash.js +10 -8
- 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 +253 -214
- package/dist/watch.js.map +1 -1
- package/package.json +15 -7
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Stash
|
|
2
|
+
|
|
3
|
+
Conflict-free synced folders. Multiple people, agents, and machines can edit the same directory, then converge with a single `stash sync`.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @telepath-computer/stash
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Set up GitHub access and connect the current directory:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
stash background install
|
|
15
|
+
stash init
|
|
16
|
+
stash setup github
|
|
17
|
+
stash connect github --repo user/repo --background
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
You can initialize a directory explicitly with `stash init`, or let `stash connect` create `.stash/` for you automatically.
|
|
21
|
+
|
|
22
|
+
You'll need a GitHub [personal access token](https://github.com/settings/tokens). A classic token needs the `repo` scope. A fine-grained token needs **Contents: Read and write** permission on the target repo.
|
|
23
|
+
|
|
24
|
+
## How It Works
|
|
25
|
+
|
|
26
|
+
- `stash sync` pushes local changes, pulls remote changes, and merges concurrent edits in one operation.
|
|
27
|
+
- Text files are merged automatically. Different-region edits combine cleanly; overlapping edits preserve both sides instead of silently dropping content.
|
|
28
|
+
- Binary files use last-modified-wins.
|
|
29
|
+
- All files in the stash directory are tracked automatically except dotfiles, dot-directories, symlinks, and local-only `.stash/` metadata.
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
stash background install
|
|
35
|
+
stash background add
|
|
36
|
+
stash init
|
|
37
|
+
stash setup github
|
|
38
|
+
stash connect github --repo user/repo --background
|
|
39
|
+
stash sync
|
|
40
|
+
stash watch
|
|
41
|
+
stash background status
|
|
42
|
+
stash status
|
|
43
|
+
stash disconnect github
|
|
44
|
+
stash background remove
|
|
45
|
+
stash background uninstall
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`stash watch` keeps the directory in sync continuously. Press `.` to trigger an immediate sync and `q` to quit.
|
|
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
|
+
|
|
52
|
+
## Config
|
|
53
|
+
|
|
54
|
+
- Global config lives at `~/.stash/config.json` or `$XDG_CONFIG_HOME/stash/config.json`.
|
|
55
|
+
- Per-stash connection config lives at `.stash/config.local.json` inside the synced directory.
|
|
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
|
+
|
|
70
|
+
## Docs
|
|
71
|
+
|
|
72
|
+
- `docs/api.md` - developer-facing `Stash` and provider contracts
|
|
73
|
+
- `docs/architecture.md` - core components and repo boundaries
|
|
74
|
+
- `docs/sync.md` - sync lifecycle, locking, drift, and snapshot semantics
|
|
75
|
+
- `docs/reconciliation.md` - merge and file-resolution rules
|
|
76
|
+
- `docs/cli.md` - user-facing CLI behavior
|
|
77
|
+
- `docs/providers/github.md` - GitHub remote contract
|
|
78
|
+
- `docs/development.md` - local development and testing
|
|
79
|
+
|
|
80
|
+
## FAQ
|
|
81
|
+
|
|
82
|
+
**Will stash delete or overwrite my existing files?**
|
|
83
|
+
|
|
84
|
+
Not blindly. On first sync, local and remote content are reconciled rather than replaced wholesale. The result becomes the baseline for future syncs.
|
|
85
|
+
|
|
86
|
+
**Can I use the same repo with both stash and git?**
|
|
87
|
+
|
|
88
|
+
Yes, but not on the same machine and directory. Stash syncs the working tree directly to `main` through the GitHub API and does not understand local git state.
|
|
89
|
+
|
|
90
|
+
**Does stash use branches or PRs?**
|
|
91
|
+
|
|
92
|
+
No. Stash reads and writes the `main` branch directly.
|
|
93
|
+
|
|
94
|
+
## Development
|
|
95
|
+
|
|
96
|
+
Requires Node.js v22.6+.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm install
|
|
100
|
+
npm link
|
|
101
|
+
npm test
|
|
102
|
+
```
|
|
@@ -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"}
|
package/dist/cli-main.js
ADDED
|
@@ -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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"}
|