@profullstack/readm3 0.13.0 → 0.14.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 +28 -11
- package/dist/account.d.ts +5 -0
- package/dist/account.d.ts.map +1 -1
- package/dist/account.js +30 -2
- package/dist/account.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -6
- package/dist/cli.js.map +1 -1
- package/dist/cloud-cli.d.ts +1 -1
- package/dist/cloud-cli.d.ts.map +1 -1
- package/dist/cloud-cli.js +35 -13
- package/dist/cloud-cli.js.map +1 -1
- package/dist/cloud-client.d.ts.map +1 -1
- package/dist/cloud-client.js +4 -3
- package/dist/cloud-client.js.map +1 -1
- package/dist/desktop-cli.d.ts +24 -2
- package/dist/desktop-cli.d.ts.map +1 -1
- package/dist/desktop-cli.js +69 -15
- package/dist/desktop-cli.js.map +1 -1
- package/package.json +2 -1
- package/dist/coinpay-login.d.ts +0 -4
- package/dist/coinpay-login.d.ts.map +0 -1
- package/dist/coinpay-login.js +0 -95
- package/dist/coinpay-login.js.map +0 -1
package/README.md
CHANGED
|
@@ -252,8 +252,8 @@ Stale saves are rejected so concurrent edits cannot silently overwrite each othe
|
|
|
252
252
|
Owners can restore prior versions, pin links to a version, and revoke links.
|
|
253
253
|
|
|
254
254
|
```sh
|
|
255
|
-
readm3 login
|
|
256
|
-
readm3 login --
|
|
255
|
+
readm3 login # approve in the browser; over SSH, paste the code it shows
|
|
256
|
+
readm3 login --token-stdin # or a token from /admin → API tokens
|
|
257
257
|
readm3 whoami # the account, and its linked CoinPay account
|
|
258
258
|
readm3 orgs list
|
|
259
259
|
readm3 share README.md --org ORG_ID # view link by default; without --org, your personal workspace
|
|
@@ -427,11 +427,18 @@ Use it the way you use `subl`: the CLI opens files and folders in the app and gi
|
|
|
427
427
|
shell back.
|
|
428
428
|
|
|
429
429
|
```sh
|
|
430
|
-
readm3
|
|
431
|
-
readm3
|
|
430
|
+
readm3 # the desktop editor, as you left it
|
|
431
|
+
readm3 . # this folder in the sidebar, like `subl .`
|
|
432
|
+
readm3 notes.md src/app.ts # as tabs; Ctrl+S saves back to disk
|
|
433
|
+
readm3 tui # the terminal reader instead
|
|
434
|
+
readm3 desktop install # install or update the app
|
|
432
435
|
```
|
|
433
436
|
|
|
434
|
-
`readm3
|
|
437
|
+
Bare `readm3` is the desktop editor when the app is installed and there is a display;
|
|
438
|
+
over SSH to a headless box, without the app, or with any terminal-reader option
|
|
439
|
+
(`--theme`, `-R`, `--print`…) it is the terminal reader, as before. `readm3 desktop`,
|
|
440
|
+
`readm3 --desktop`, `readm3 edit`, `readm3 subl` and `readm3 open` always mean the
|
|
441
|
+
desktop editor. It finds the app on `PATH`
|
|
435
442
|
(`readm3-desktop`, which `install.sh --desktop` adds), then where each platform installs
|
|
436
443
|
it; `READM3_DESKTOP` names the binary yourself. A folder opens with the same rules as
|
|
437
444
|
Open folder (no dot-directories, `node_modules`, build output or binaries; 1,000 files).
|
|
@@ -532,11 +539,21 @@ unlinked on `/account` when it also has an email; an account that signs in only
|
|
|
532
539
|
CoinPay cannot be, since that would lock it out. Links, unlinks, sign-ins and app calls
|
|
533
540
|
are recorded in `identity_events`; identities are in `user_identities`.
|
|
534
541
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
`
|
|
538
|
-
|
|
539
|
-
`
|
|
542
|
+
### CLI sign-in (OAuth 2.1)
|
|
543
|
+
|
|
544
|
+
`readm3 login` signs the CLI in with readm3's own OAuth 2.1 server
|
|
545
|
+
([`@profullstack/auth-system/oauth2`](https://www.npmjs.com/package/@profullstack/auth-system),
|
|
546
|
+
client `readm3-cli`): authorization code + PKCE S256 only, access tokens for an hour,
|
|
547
|
+
refresh tokens that rotate on every use, and a reused refresh token revokes the whole
|
|
548
|
+
sign-in. The browser step is `/oauth/authorize`, which sends a signed-out browser
|
|
549
|
+
through `/account` (email or CoinPay) and then asks to approve. Where the CLI can open a
|
|
550
|
+
browser on the same machine it waits on a loopback redirect (`http://127.0.0.1:PORT/callback`);
|
|
551
|
+
over SSH, or with `--no-browser` / `READM3_NO_BROWSER=1`, it prints the link to open in
|
|
552
|
+
any browser and `/oauth/cli` shows a code to paste back. Tokens are kept in `cloud.json`
|
|
553
|
+
(0600) and refreshed by every command; `readm3 logout` revokes them on the server.
|
|
554
|
+
`readm3 login --coinpay` is the same sign-in. Metadata is at
|
|
555
|
+
`/.well-known/oauth-authorization-server`; tokens at `/oauth/token`, revocation at `/oauth/revoke`.
|
|
556
|
+
`POST /api/v1/coinpay/oauth/cli-exchange` remains for CLI versions before 0.14.0.
|
|
540
557
|
|
|
541
558
|
| Endpoint | Purpose |
|
|
542
559
|
| --- | --- |
|
|
@@ -630,7 +647,7 @@ The CLI, document commands, and MCP use one credential file, `cloud.json`, under
|
|
|
630
647
|
in `/admin` to invalidate remote copies. Tokens can also be created and revoked from the account page.
|
|
631
648
|
|
|
632
649
|
```sh
|
|
633
|
-
readm3 login --token-stdin
|
|
650
|
+
readm3 login # or --token-stdin: paste a token, then Ctrl+D
|
|
634
651
|
readm3 whoami
|
|
635
652
|
readm3 settings --theme nord --flavor github
|
|
636
653
|
readm3 save ./notes # explicitly import and save Markdown
|
package/dist/account.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TokenStore } from "@profullstack/auth-system/cli";
|
|
1
2
|
export interface AccountUser {
|
|
2
3
|
id: string;
|
|
3
4
|
username: string;
|
|
@@ -12,6 +13,10 @@ export interface Credentials {
|
|
|
12
13
|
export declare const configDir: () => string;
|
|
13
14
|
export declare function apiUrl(value?: string): string;
|
|
14
15
|
export declare function writeConfig(name: string, value: unknown, root?: string): void;
|
|
16
|
+
/** cloud.json as auth-system's token store: `token` is the access token, `oauth` holds the refresh state. */
|
|
17
|
+
export declare function oauthStore(root?: string): TokenStore;
|
|
18
|
+
/** `token`, or its refreshed replacement when it is the saved `readm3 login` token and about to expire. */
|
|
19
|
+
export declare function freshToken(token: string | undefined, root?: string): Promise<string | undefined>;
|
|
15
20
|
export declare function storedCredentials(root?: string): Credentials | undefined;
|
|
16
21
|
export declare class ApiError extends Error {
|
|
17
22
|
status: number;
|
package/dist/account.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAElG,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAClF,MAAM,WAAW,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AAClG,eAAO,MAAM,SAAS,cAAmH,CAAC;AAC1I,wBAAgB,MAAM,CAAC,KAAK,SAAgJ,GAAG,MAAM,CAIpL;AACD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,SAAc,QAO3E;AAMD,6GAA6G;AAC7G,wBAAgB,UAAU,CAAC,IAAI,SAAc,GAAG,UAAU,CASzD;AAGD,2GAA2G;AAC3G,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,SAAc,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM3G;AACD,wBAAgB,iBAAiB,CAAC,IAAI,SAAc,GAAG,WAAW,GAAG,SAAS,CAK7E;AACD,qBAAa,QAAS,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAClB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC3E;AACD,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,IAEhE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,EAAE,eAAc,EAAE,OAAO,OAAO,KAAG,OAAO,CAAC,CAAC,CAAC,CAUrH;AACD,wBAAsB,WAAW,CAAC,IAAI,SAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAU1E"}
|
package/dist/account.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { getAccessToken } from "@profullstack/auth-system/cli";
|
|
4
5
|
export const configDir = () => process.env.READM3_CONFIG_DIR || join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "readm3");
|
|
5
6
|
export function apiUrl(value = process.env.READM3_API_URL || (process.env.READM3_URL ? `${process.env.READM3_URL.replace(/\/+$/, "")}/api/v1` : "https://readm3.com/api/v1")) {
|
|
6
7
|
const url = new URL(value);
|
|
@@ -16,6 +17,33 @@ export function writeConfig(name, value, root = configDir()) {
|
|
|
16
17
|
renameSync(temp, path);
|
|
17
18
|
chmodSync(path, 0o600);
|
|
18
19
|
}
|
|
20
|
+
const readSaved = (root) => {
|
|
21
|
+
const path = join(root, "cloud.json");
|
|
22
|
+
return existsSync(path) ? JSON.parse(readFileSync(path, "utf8")) : {};
|
|
23
|
+
};
|
|
24
|
+
/** cloud.json as auth-system's token store: `token` is the access token, `oauth` holds the refresh state. */
|
|
25
|
+
export function oauthStore(root = configDir()) {
|
|
26
|
+
return {
|
|
27
|
+
async load() {
|
|
28
|
+
const saved = readSaved(root);
|
|
29
|
+
return saved.oauth && saved.token ? { ...saved.oauth, access_token: saved.token } : null;
|
|
30
|
+
},
|
|
31
|
+
async save({ access_token, ...oauth }) { writeConfig("cloud.json", { ...readSaved(root), token: access_token, oauth }, root); },
|
|
32
|
+
async clear() { rmSync(join(root, "cloud.json"), { force: true }); },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// One refresh at a time: refresh tokens rotate, and presenting a used one revokes the sign-in.
|
|
36
|
+
let refreshing;
|
|
37
|
+
/** `token`, or its refreshed replacement when it is the saved `readm3 login` token and about to expire. */
|
|
38
|
+
export async function freshToken(token, root = configDir()) {
|
|
39
|
+
if (!token || process.env.READM3_TOKEN)
|
|
40
|
+
return token;
|
|
41
|
+
const saved = readSaved(root);
|
|
42
|
+
if (!saved.oauth || saved.token !== token)
|
|
43
|
+
return token;
|
|
44
|
+
refreshing ??= getAccessToken({ store: oauthStore(root) }).finally(() => { refreshing = undefined; });
|
|
45
|
+
return (await refreshing) ?? token;
|
|
46
|
+
}
|
|
19
47
|
export function storedCredentials(root = configDir()) {
|
|
20
48
|
const path = join(root, "cloud.json");
|
|
21
49
|
if (!existsSync(path))
|
|
@@ -44,7 +72,7 @@ export function accountClient(options) {
|
|
|
44
72
|
}
|
|
45
73
|
export async function credentials(root = configDir()) {
|
|
46
74
|
const saved = storedCredentials(root);
|
|
47
|
-
const token = process.env.READM3_TOKEN || saved?.token;
|
|
75
|
+
const token = process.env.READM3_TOKEN || await freshToken(saved?.token, root);
|
|
48
76
|
if (!token)
|
|
49
77
|
throw new Error("Sign in with `readm3 login` first, or set READM3_TOKEN and READM3_API_URL.");
|
|
50
78
|
// Never send a saved token to a different server because an environment variable changed.
|
package/dist/account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ColorMode } from "./print.ts";
|
|
2
2
|
import { type ViewerOptions } from "./viewer.ts";
|
|
3
|
-
export declare const VERSION = "0.
|
|
3
|
+
export declare const VERSION = "0.14.0";
|
|
4
4
|
/** The help text, exported so a test can hold it to the flags it documents. */
|
|
5
5
|
export declare const USAGE: string;
|
|
6
6
|
export interface ParsedArgs extends ViewerOptions {
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAQA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAItD,eAAO,MAAM,OAAO,WAAW,CAAC;AAEhC,+EAA+E;AAC/E,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAQA,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAItD,eAAO,MAAM,OAAO,WAAW,CAAC;AAEhC,+EAA+E;AAC/E,eAAO,MAAM,KAAK,QA+CH,CAAC;AAEhB,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6GpD;AAED,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDhF"}
|
package/dist/cli.js
CHANGED
|
@@ -9,16 +9,19 @@ import { FLAVORS, isFlavor } from "./flavors.js";
|
|
|
9
9
|
import { printDocument, COLOR_MODES } from "./print.js";
|
|
10
10
|
import { run } from "./viewer.js";
|
|
11
11
|
import { isCloudCommand, cloudMain, CLOUD_USAGE } from "./cloud-cli.js";
|
|
12
|
-
import { isDesktopCommand, desktopMain, DESKTOP_USAGE } from "./desktop-cli.js";
|
|
13
|
-
export const VERSION = "0.
|
|
12
|
+
import { isDesktopCommand, desktopMain, installedDesktop, prefersDesktop, DESKTOP_USAGE } from "./desktop-cli.js";
|
|
13
|
+
export const VERSION = "0.14.0";
|
|
14
14
|
/** The help text, exported so a test can hold it to the flags it documents. */
|
|
15
|
-
export const USAGE = `readm3 — a
|
|
15
|
+
export const USAGE = `readm3 — a plain text editor for Markdown and code
|
|
16
16
|
|
|
17
17
|
Usage
|
|
18
|
-
readm3 [path]
|
|
18
|
+
readm3 [path...] The desktop editor, when it is installed and there is
|
|
19
|
+
a display; otherwise the terminal reader below
|
|
20
|
+
readm3 tui [path] [options] The terminal reader and editor
|
|
21
|
+
readm3 desktop [path...] Always the desktop editor
|
|
19
22
|
|
|
20
23
|
path A directory to browse, or a file to open. Defaults to the
|
|
21
|
-
current directory.
|
|
24
|
+
current directory. Any option below means the terminal reader.
|
|
22
25
|
|
|
23
26
|
Options
|
|
24
27
|
-p, --print Render to stdout and exit, instead of opening the reader.
|
|
@@ -180,10 +183,16 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
180
183
|
await cloudMain(argv);
|
|
181
184
|
return;
|
|
182
185
|
}
|
|
183
|
-
if (isDesktopCommand(argv
|
|
186
|
+
if (isDesktopCommand(argv)) {
|
|
184
187
|
await desktopMain(argv);
|
|
185
188
|
return;
|
|
186
189
|
}
|
|
190
|
+
if (argv[0] === "tui")
|
|
191
|
+
argv = argv.slice(1);
|
|
192
|
+
else if (prefersDesktop(argv, process.platform, process.env) && installedDesktop()) {
|
|
193
|
+
await desktopMain(["edit", ...argv]);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
187
196
|
let args;
|
|
188
197
|
try {
|
|
189
198
|
args = parseArgs(argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,GAAG,EAAsB,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud-cli.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const CLOUD_USAGE = "Shared Markdown\n readm3 login
|
|
1
|
+
export declare const CLOUD_USAGE = "Shared Markdown\n readm3 login Sign in in the browser (email or CoinPay). Over SSH,\n open the printed link anywhere and paste the code back.\n readm3 login --no-browser Always use the copy-and-paste code\n readm3 login --token-stdin Save a personal API token from /admin instead\n readm3 logout Sign out here and end this CLI sign-in\n readm3 share FILE [--org ID] [--role view|edit] [--force]\n readm3 docs list [--org ID] [--search TEXT] [--limit N] [--offset N]\n readm3 docs get ID [--raw]\n readm3 docs create FILE [--org ID] [--title NAME]\n readm3 docs update ID FILE --base VERSION\n readm3 docs delete ID\n readm3 docs history ID\n readm3 docs restore ID --version VERSION --base CURRENT\n readm3 docs share ID [--role view|edit] [--version VERSION]\n readm3 docs revoke ID --share SHARE_ID\n readm3 docs transfer ID --username USERNAME\n readm3 shared get URL [--raw]\n readm3 paste [FILE] [--title NAME] [--expires 1h|1d|7d|30d] [--language ID] [--force]\n Private link, no account; prints the URL.\n Any text: Markdown renders, code is highlighted.\n The language is detected from the name or content.\n readm3 paste get URL [--raw] | delete URL\n readm3 shared update URL FILE --base VERSION\n readm3 orgs list | create --name NAME | update ID --name NAME | delete ID\n readm3 teams list --org ID | create --org ID --name NAME\n readm3 members list --org ID\n readm3 cloud OPERATION --args '{\"key\":\"value\"}'\n readm3 mcp Start the stdio MCP server\n\nWithout --org a document goes to your personal workspace.\nFILE may be - for stdin. --raw prints the source text; other results are JSON.\nREADM3_URL selects a self-hosted server; READM3_TOKEN supplies an API token.\nView links cannot write. Edit links can save versions. Owners administer files.\npaste and share check the file first: a key, token or password stops them unless\n--force is given; an email, IP or home directory is only pointed out.\nUse readm3 cloud for the full API, including team membership and permissions.\n";
|
|
2
2
|
export declare function isCloudCommand(command: string | undefined): boolean;
|
|
3
3
|
export declare function cloudMain(argv: string[]): Promise<void>;
|
|
4
4
|
//# sourceMappingURL=cloud-cli.d.ts.map
|
package/dist/cloud-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-cli.d.ts","sourceRoot":"","sources":["../src/cloud-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cloud-cli.d.ts","sourceRoot":"","sources":["../src/cloud-cli.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,WAAW,6vEAqCvB,CAAC;AAcF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,WAEzD;AACD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAiN7C"}
|
package/dist/cloud-cli.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import { login as oauthLogin, logout as oauthLogout } from "@profullstack/auth-system/cli";
|
|
2
|
+
import { oauthStore } from "./account.js";
|
|
1
3
|
import { pasteLocation } from "./cloud-client.js";
|
|
2
4
|
import { readFileSync } from "node:fs";
|
|
3
5
|
import { basename } from "node:path";
|
|
4
6
|
import { describeSensitive, scanSensitive } from "./sensitive.js";
|
|
5
7
|
import { cloudAction, cloudConfig, cloudRequest, clearCloudConfig, saveCloudConfig, sharedLocation, } from "./cloud-client.js";
|
|
6
8
|
export const CLOUD_USAGE = `Shared Markdown
|
|
7
|
-
readm3 login
|
|
8
|
-
|
|
9
|
-
readm3
|
|
9
|
+
readm3 login Sign in in the browser (email or CoinPay). Over SSH,
|
|
10
|
+
open the printed link anywhere and paste the code back.
|
|
11
|
+
readm3 login --no-browser Always use the copy-and-paste code
|
|
12
|
+
readm3 login --token-stdin Save a personal API token from /admin instead
|
|
13
|
+
readm3 logout Sign out here and end this CLI sign-in
|
|
10
14
|
readm3 share FILE [--org ID] [--role view|edit] [--force]
|
|
11
15
|
readm3 docs list [--org ID] [--search TEXT] [--limit N] [--offset N]
|
|
12
16
|
readm3 docs get ID [--raw]
|
|
@@ -72,7 +76,7 @@ export async function cloudMain(argv) {
|
|
|
72
76
|
const value = argv[i];
|
|
73
77
|
if (value.startsWith("--")) {
|
|
74
78
|
const name = value.slice(2);
|
|
75
|
-
if (["raw", "token-stdin", "json", "coinpay", "force"].includes(name))
|
|
79
|
+
if (["raw", "token-stdin", "json", "coinpay", "no-browser", "force"].includes(name))
|
|
76
80
|
flags[name] = "true";
|
|
77
81
|
else {
|
|
78
82
|
if (!argv[i + 1] || argv[i + 1].startsWith("--"))
|
|
@@ -105,16 +109,30 @@ export async function cloudMain(argv) {
|
|
|
105
109
|
return value;
|
|
106
110
|
};
|
|
107
111
|
if (command === "login") {
|
|
108
|
-
if (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
if (flags["token-stdin"]) {
|
|
113
|
+
const token = readFileSync(0, "utf8").trim();
|
|
114
|
+
if (!token)
|
|
115
|
+
throw new Error("No token supplied.");
|
|
116
|
+
const config = cloudConfig(token);
|
|
117
|
+
const user = await cloudAction("account_me", {}, config);
|
|
118
|
+
saveCloudConfig(config);
|
|
119
|
+
output({ signedIn: true, user });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// OAuth 2.1 (@profullstack/auth-system/cli): a loopback redirect when a browser can
|
|
123
|
+
// open on this machine, otherwise the server shows a code to paste back here.
|
|
124
|
+
// --coinpay is the same sign-in: the browser step offers CoinPay.
|
|
125
|
+
const server = cloudConfig("-");
|
|
126
|
+
const tokens = await oauthLogin({
|
|
127
|
+
issuer: server.url,
|
|
128
|
+
clientId: "readm3-cli",
|
|
129
|
+
manualRedirectUri: `${server.url}/oauth/cli`,
|
|
130
|
+
...(flags["no-browser"] || process.env.READM3_NO_BROWSER ? { manual: true } : {}),
|
|
131
|
+
});
|
|
132
|
+
const config = cloudConfig(tokens.access_token);
|
|
116
133
|
const user = await cloudAction("account_me", {}, config);
|
|
117
134
|
saveCloudConfig(config);
|
|
135
|
+
await oauthStore().save(tokens);
|
|
118
136
|
output({ signedIn: true, user });
|
|
119
137
|
return;
|
|
120
138
|
}
|
|
@@ -150,10 +168,14 @@ export async function cloudMain(argv) {
|
|
|
150
168
|
return;
|
|
151
169
|
}
|
|
152
170
|
if (command === "logout") {
|
|
171
|
+
// A `readm3 login` sign-in is revoked on the server; a pasted /admin token is only forgotten.
|
|
172
|
+
const signedIn = await oauthStore().load();
|
|
173
|
+
if (signedIn)
|
|
174
|
+
await oauthLogout({ store: oauthStore() });
|
|
153
175
|
clearCloudConfig();
|
|
154
176
|
output({
|
|
155
177
|
signedOut: true,
|
|
156
|
-
note: "Revoke the token in /admin to invalidate other copies.",
|
|
178
|
+
...(signedIn ? {} : { note: "Revoke the token in /admin to invalidate other copies." }),
|
|
157
179
|
});
|
|
158
180
|
return;
|
|
159
181
|
}
|
package/dist/cloud-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-cli.js","sourceRoot":"","sources":["../src/cloud-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AACxF,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"cloud-cli.js","sourceRoot":"","sources":["../src/cloud-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,wBAAgB,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB/D;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,QAElD;AACD,wBAAgB,gBAAgB,SAG/B;AACD,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,SAAQ,EACd,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,cAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,wBAAgB,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB/D;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,QAElD;AACD,wBAAgB,gBAAgB,SAG/B;AACD,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,SAAQ,EACd,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,cAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAeZ;AACD,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,MAAM,cAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAMZ;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAMA;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAMA"}
|
package/dist/cloud-client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync, existsSync, unlinkSync, } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { apiUrl, configDir, writeConfig } from "./account.js";
|
|
3
|
+
import { apiUrl, configDir, freshToken, writeConfig } from "./account.js";
|
|
4
4
|
export function cloudConfig(tokenOverride) {
|
|
5
5
|
let saved = {};
|
|
6
6
|
try {
|
|
@@ -27,10 +27,11 @@ export function clearCloudConfig() {
|
|
|
27
27
|
unlinkSync(path);
|
|
28
28
|
}
|
|
29
29
|
export async function cloudRequest(path, method = "GET", body, config = cloudConfig()) {
|
|
30
|
+
const token = await freshToken(config.token);
|
|
30
31
|
const response = await fetch(`${config.api || `${config.url}/api/v1`}/${path}`, {
|
|
31
32
|
method,
|
|
32
33
|
headers: {
|
|
33
|
-
...(
|
|
34
|
+
...(token ? { authorization: `Bearer ${token}` } : {}),
|
|
34
35
|
...(body === undefined ? {} : { "content-type": "application/json" }),
|
|
35
36
|
},
|
|
36
37
|
body: body === undefined ? undefined : JSON.stringify(body),
|
|
@@ -44,7 +45,7 @@ export async function cloudRequest(path, method = "GET", body, config = cloudCon
|
|
|
44
45
|
}
|
|
45
46
|
export async function cloudAction(operation, args = {}, config = cloudConfig()) {
|
|
46
47
|
if (!config.token)
|
|
47
|
-
throw new Error("
|
|
48
|
+
throw new Error("Run readm3 login to sign in (or set READM3_TOKEN).");
|
|
48
49
|
return cloudRequest("actions", "POST", { operation, args }, config);
|
|
49
50
|
}
|
|
50
51
|
export function pasteLocation(value) {
|
package/dist/cloud-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"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"}
|
package/dist/desktop-cli.d.ts
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
|
-
export declare const DESKTOP_USAGE = "Desktop editor\n readm3 edit [PATH...] Open files or folders in the readm3 desktop\n app and return (also: readm3 subl, readm3 open).\n No path opens the editor as you left it.\n READM3_DESKTOP names the app's binary.\n
|
|
2
|
-
export declare const isDesktopCommand: (
|
|
1
|
+
export declare const DESKTOP_USAGE = "Desktop editor\n readm3 edit [PATH...] Open files or folders in the readm3 desktop\n app and return (also: readm3 --desktop,\n readm3 desktop, readm3 subl, readm3 open).\n No path opens the editor as you left it.\n READM3_DESKTOP names the app's binary.\n readm3 desktop install Install or update the desktop app (Linux), or\n print the download for macOS and Windows.\n";
|
|
2
|
+
export declare const isDesktopCommand: (argv: string[]) => boolean;
|
|
3
|
+
/** What a desktop invocation asks for: install the app, show help, or open these paths. */
|
|
4
|
+
export type DesktopRequest = {
|
|
5
|
+
action: "install";
|
|
6
|
+
} | {
|
|
7
|
+
action: "help";
|
|
8
|
+
} | {
|
|
9
|
+
action: "open";
|
|
10
|
+
paths: string[];
|
|
11
|
+
} | {
|
|
12
|
+
action: "error";
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function parseDesktopArgs(argv: string[]): DesktopRequest;
|
|
16
|
+
/** The download for this machine: the release asset for macOS and Windows, the installer on Linux. */
|
|
17
|
+
export declare function desktopDownload(platform: NodeJS.Platform, arch: string): string;
|
|
3
18
|
/** How to start the app: a binary and the arguments that come before the paths. */
|
|
4
19
|
export interface Launch {
|
|
5
20
|
command: string;
|
|
@@ -11,6 +26,13 @@ export interface Launch {
|
|
|
11
26
|
* usual install location. The Flatpak is last, because only `flatpak run` starts it.
|
|
12
27
|
*/
|
|
13
28
|
export declare function desktopCandidates(platform: NodeJS.Platform, env: NodeJS.ProcessEnv, home: string): Launch[];
|
|
29
|
+
/**
|
|
30
|
+
* Bare `readm3 [PATH...]` opens the desktop editor when there is one to open: no switches
|
|
31
|
+
* (they all belong to the terminal reader), a screen to draw on (not an SSH session on a
|
|
32
|
+
* headless box), and the app installed. Otherwise it is the terminal reader, as it was.
|
|
33
|
+
*/
|
|
34
|
+
export declare function prefersDesktop(argv: string[], platform: NodeJS.Platform, env: NodeJS.ProcessEnv): boolean;
|
|
35
|
+
export declare const installedDesktop: () => Launch | undefined;
|
|
14
36
|
export declare function findDesktop(candidates: Launch[], exists?: (path: string) => boolean): Launch | undefined;
|
|
15
37
|
export declare function desktopMain(argv: string[]): Promise<void>;
|
|
16
38
|
//# sourceMappingURL=desktop-cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-cli.d.ts","sourceRoot":"","sources":["../src/desktop-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"desktop-cli.d.ts","sourceRoot":"","sources":["../src/desktop-cli.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa,ymBAQzB,CAAC;AAIF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,YAAuE,CAAC;AAEvH,2FAA2F;AAC3F,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AACrJ,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAQ/D;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED,mFAAmF;AACnF,MAAM,WAAW,MAAM;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CAAE;AAE5D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB3G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAIzG;AACD,eAAO,MAAM,gBAAgB,0BAAiF,CAAC;AAE/G,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAAG,MAAM,GAAG,SAAS,CAEpH;AAiBD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/D"}
|
package/dist/desktop-cli.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `readm3 edit [PATH...]
|
|
3
|
-
* the shell back at once, the way `subl .` does. A
|
|
4
|
-
* window; otherwise one starts.
|
|
2
|
+
* `readm3 edit [PATH...]` (or `readm3 --desktop [PATH...]`): open files and folders in
|
|
3
|
+
* the readm3 desktop editor and give the shell back at once, the way `subl .` does. A
|
|
4
|
+
* running editor takes them into its window; otherwise one starts.
|
|
5
|
+
* `readm3 desktop install` fetches the app.
|
|
5
6
|
*/
|
|
6
7
|
import { spawn } from "node:child_process";
|
|
7
8
|
import { existsSync } from "node:fs";
|
|
@@ -9,14 +10,36 @@ import { homedir } from "node:os";
|
|
|
9
10
|
import { posix, resolve, win32 } from "node:path";
|
|
10
11
|
export const DESKTOP_USAGE = `Desktop editor
|
|
11
12
|
readm3 edit [PATH...] Open files or folders in the readm3 desktop
|
|
12
|
-
app and return (also: readm3
|
|
13
|
+
app and return (also: readm3 --desktop,
|
|
14
|
+
readm3 desktop, readm3 subl, readm3 open).
|
|
13
15
|
No path opens the editor as you left it.
|
|
14
16
|
READM3_DESKTOP names the app's binary.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
readm3 desktop install Install or update the desktop app (Linux), or
|
|
18
|
+
print the download for macOS and Windows.
|
|
17
19
|
`;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
+
const RELEASES = "https://github.com/profullstack/readm3/releases/latest";
|
|
21
|
+
const commands = new Set(["edit", "subl", "open", "desktop"]);
|
|
22
|
+
export const isDesktopCommand = (argv) => (!!argv[0] && commands.has(argv[0])) || argv.includes("--desktop");
|
|
23
|
+
export function parseDesktopArgs(argv) {
|
|
24
|
+
const command = commands.has(argv[0] ?? "") ? argv[0] : undefined;
|
|
25
|
+
const rest = (command ? argv.slice(1) : argv).filter((arg) => arg !== "--desktop");
|
|
26
|
+
if (rest.includes("--help") || rest.includes("-h"))
|
|
27
|
+
return { action: "help" };
|
|
28
|
+
if (command === "desktop" && rest[0] === "install" && rest.length === 1)
|
|
29
|
+
return { action: "install" };
|
|
30
|
+
const option = rest.find((arg) => arg.startsWith("-"));
|
|
31
|
+
if (option)
|
|
32
|
+
return { action: "error", message: `unknown option for ${command ?? "--desktop"}: ${option}` };
|
|
33
|
+
return { action: "open", paths: rest };
|
|
34
|
+
}
|
|
35
|
+
/** The download for this machine: the release asset for macOS and Windows, the installer on Linux. */
|
|
36
|
+
export function desktopDownload(platform, arch) {
|
|
37
|
+
if (platform === "darwin")
|
|
38
|
+
return `${RELEASES}/download/readm3-mac-${arch === "arm64" ? "arm64" : "x64"}.dmg`;
|
|
39
|
+
if (platform === "win32")
|
|
40
|
+
return `${RELEASES}/download/readm3-windows-x64-setup.exe`;
|
|
41
|
+
return "curl -fsSL https://readm3.com/install.sh | sh -s -- --desktop";
|
|
42
|
+
}
|
|
20
43
|
/**
|
|
21
44
|
* Where an installed desktop app lives, most specific first: READM3_DESKTOP, the
|
|
22
45
|
* `readm3-desktop` command (install.sh puts it on PATH), then each platform's
|
|
@@ -54,29 +77,60 @@ export function desktopCandidates(platform, env, home) {
|
|
|
54
77
|
}
|
|
55
78
|
return found;
|
|
56
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Bare `readm3 [PATH...]` opens the desktop editor when there is one to open: no switches
|
|
82
|
+
* (they all belong to the terminal reader), a screen to draw on (not an SSH session on a
|
|
83
|
+
* headless box), and the app installed. Otherwise it is the terminal reader, as it was.
|
|
84
|
+
*/
|
|
85
|
+
export function prefersDesktop(argv, platform, env) {
|
|
86
|
+
if (argv.some((arg) => arg.startsWith("-")))
|
|
87
|
+
return false;
|
|
88
|
+
if (platform === "darwin" || platform === "win32")
|
|
89
|
+
return true;
|
|
90
|
+
return !!(env.DISPLAY || env.WAYLAND_DISPLAY);
|
|
91
|
+
}
|
|
92
|
+
export const installedDesktop = () => findDesktop(desktopCandidates(process.platform, process.env, homedir()));
|
|
57
93
|
export function findDesktop(candidates, exists = existsSync) {
|
|
58
94
|
return candidates.find((launch) => launch.command === "flatpak" || exists(launch.command));
|
|
59
95
|
}
|
|
96
|
+
async function install() {
|
|
97
|
+
const download = desktopDownload(process.platform, process.arch);
|
|
98
|
+
if (process.platform === "darwin" || process.platform === "win32") {
|
|
99
|
+
process.stdout.write(`Download and run the readm3 desktop app for this machine:\n ${download}\n`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// The same installer as the website's: it verifies the release checksum and adds a menu entry.
|
|
103
|
+
const code = await new Promise((done, fail) => {
|
|
104
|
+
const child = spawn("sh", ["-c", download], { stdio: "inherit" });
|
|
105
|
+
child.once("error", fail);
|
|
106
|
+
child.once("exit", done);
|
|
107
|
+
});
|
|
108
|
+
if (code !== 0)
|
|
109
|
+
process.exitCode = code ?? 1;
|
|
110
|
+
}
|
|
60
111
|
export async function desktopMain(argv) {
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
112
|
+
const request = parseDesktopArgs(argv);
|
|
113
|
+
if (request.action === "help") {
|
|
63
114
|
process.stdout.write(DESKTOP_USAGE);
|
|
64
115
|
return;
|
|
65
116
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
117
|
+
if (request.action === "install") {
|
|
118
|
+
await install();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (request.action === "error") {
|
|
122
|
+
process.stderr.write(`readm3: ${request.message}\n\n${DESKTOP_USAGE}`);
|
|
69
123
|
process.exitCode = 2;
|
|
70
124
|
return;
|
|
71
125
|
}
|
|
72
126
|
const launch = findDesktop(desktopCandidates(process.platform, process.env, homedir()));
|
|
73
127
|
if (!launch) {
|
|
74
|
-
process.stderr.write(`readm3: the desktop app is not installed
|
|
128
|
+
process.stderr.write(`readm3: the desktop app is not installed. Install it with:\n readm3 desktop install\n`);
|
|
75
129
|
process.exitCode = 1;
|
|
76
130
|
return;
|
|
77
131
|
}
|
|
78
132
|
// Absolute paths, so a running editor started somewhere else opens the right files.
|
|
79
|
-
const paths =
|
|
133
|
+
const paths = request.paths.map((path) => resolve(path));
|
|
80
134
|
const missing = paths.filter((path) => !existsSync(path));
|
|
81
135
|
if (missing.length) {
|
|
82
136
|
process.stderr.write(`readm3: no such file or directory: ${missing.join(", ")}\n`);
|
package/dist/desktop-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-cli.js","sourceRoot":"","sources":["../src/desktop-cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"desktop-cli.js","sourceRoot":"","sources":["../src/desktop-cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@profullstack/readm3",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Markdown editing and sharing for people and teams. Web/PWA, CLI, API and MCP with version history, view/edit links, and a terminal reader.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
46
|
+
"@profullstack/auth-system": "^0.8.3",
|
|
46
47
|
"@profullstack/footer": "latest",
|
|
47
48
|
"@profullstack/hqtui": "^0.5.0",
|
|
48
49
|
"@profullstack/synconfig": "^0.1.3",
|
package/dist/coinpay-login.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coinpay-login.d.ts","sourceRoot":"","sources":["../src/coinpay-login.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAuBnE,mFAAmF;AACnF,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA2EvE"}
|
package/dist/coinpay-login.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `readm3 login --coinpay`: an OAuth 2.1 authorization code grant with PKCE,
|
|
3
|
-
* started here and finished on a loopback redirect (CoinPay accepts any port on
|
|
4
|
-
* 127.0.0.1). The CLI never sees a client secret: it hands the code and its
|
|
5
|
-
* verifier to readm3, which makes the exchange and answers with an ordinary
|
|
6
|
-
* readm3 API token.
|
|
7
|
-
*/
|
|
8
|
-
import { spawn } from "node:child_process";
|
|
9
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
10
|
-
import { createServer } from "node:http";
|
|
11
|
-
import { cloudRequest } from "./cloud-client.js";
|
|
12
|
-
const WAIT_MS = 5 * 60_000;
|
|
13
|
-
function openBrowser(url) {
|
|
14
|
-
const [command, ...args] = process.platform === "darwin"
|
|
15
|
-
? ["open", url]
|
|
16
|
-
: process.platform === "win32"
|
|
17
|
-
? ["cmd", "/c", "start", "", url]
|
|
18
|
-
: ["xdg-open", url];
|
|
19
|
-
try {
|
|
20
|
-
const child = spawn(command, args, { stdio: "ignore", detached: true });
|
|
21
|
-
child.on("error", () => { });
|
|
22
|
-
child.unref();
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
/* The link is printed; opening it is a convenience. */
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
const page = (message) => `<!doctype html><meta charset="utf-8"><title>readm3</title><p style="font:16px system-ui;margin:3em">${message}</p>`;
|
|
29
|
-
/** Returns a readm3 API token for the CoinPay account the person signs in with. */
|
|
30
|
-
export async function coinpayLogin(config) {
|
|
31
|
-
const anonymous = { ...config, token: undefined };
|
|
32
|
-
const status = await cloudRequest("coinpay/status", "GET", undefined, anonymous);
|
|
33
|
-
if (!status.enabled || !status.clientId || !status.coinpayUrl)
|
|
34
|
-
throw new Error("This readm3 server does not offer Sign in with CoinPay.");
|
|
35
|
-
const verifier = randomBytes(32).toString("base64url");
|
|
36
|
-
const state = randomBytes(24).toString("base64url");
|
|
37
|
-
const server = createServer();
|
|
38
|
-
await new Promise((resolve, reject) => {
|
|
39
|
-
server.once("error", reject);
|
|
40
|
-
server.listen(0, "127.0.0.1", resolve);
|
|
41
|
-
});
|
|
42
|
-
const port = server.address().port;
|
|
43
|
-
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
44
|
-
try {
|
|
45
|
-
const code = await new Promise((resolve, reject) => {
|
|
46
|
-
const timer = setTimeout(() => reject(new Error("Timed out waiting for CoinPay. Run readm3 login --coinpay again.")), WAIT_MS);
|
|
47
|
-
server.on("request", (request, response) => {
|
|
48
|
-
const url = new URL(request.url ?? "/", redirectUri);
|
|
49
|
-
if (url.pathname !== "/callback") {
|
|
50
|
-
response.writeHead(404).end();
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const finish = (ok, message) => {
|
|
54
|
-
response
|
|
55
|
-
.writeHead(ok ? 200 : 400, { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" })
|
|
56
|
-
.end(page(message));
|
|
57
|
-
clearTimeout(timer);
|
|
58
|
-
};
|
|
59
|
-
if (url.searchParams.get("state") !== state) {
|
|
60
|
-
// Not ours: someone else's tab or a stale link. Keep waiting for the real one.
|
|
61
|
-
response.writeHead(400, { "content-type": "text/html; charset=utf-8" }).end(page("This sign-in link does not belong to the waiting readm3 CLI."));
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const error = url.searchParams.get("error");
|
|
65
|
-
const code = url.searchParams.get("code");
|
|
66
|
-
if (error || !code) {
|
|
67
|
-
finish(false, "CoinPay sign-in did not complete. You can close this tab.");
|
|
68
|
-
reject(new Error(`CoinPay sign-in failed: ${url.searchParams.get("error_description") || error || "no code returned"}.`));
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
finish(true, "Signed in to readm3 with CoinPay. You can close this tab and return to the terminal.");
|
|
72
|
-
resolve(code);
|
|
73
|
-
});
|
|
74
|
-
const authorize = `${status.coinpayUrl}/api/oauth/authorize?${new URLSearchParams({
|
|
75
|
-
client_id: status.clientId,
|
|
76
|
-
redirect_uri: redirectUri,
|
|
77
|
-
response_type: "code",
|
|
78
|
-
scope: status.scopes || "openid profile email",
|
|
79
|
-
state,
|
|
80
|
-
code_challenge: createHash("sha256").update(verifier).digest("base64url"),
|
|
81
|
-
code_challenge_method: "S256",
|
|
82
|
-
})}`;
|
|
83
|
-
process.stderr.write(`Sign in with CoinPay in your browser. If it does not open, visit:\n${authorize}\n`);
|
|
84
|
-
if (!process.env.READM3_NO_BROWSER)
|
|
85
|
-
openBrowser(authorize);
|
|
86
|
-
});
|
|
87
|
-
const result = await cloudRequest("coinpay/oauth/cli-exchange", "POST", { code, code_verifier: verifier, redirect_uri: redirectUri }, anonymous);
|
|
88
|
-
return result.token;
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
server.closeAllConnections?.();
|
|
92
|
-
server.close();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=coinpay-login.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coinpay-login.js","sourceRoot":"","sources":["../src/coinpay-login.ts"],"names":[],"mappings":"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"}
|