@profullstack/readm3 0.12.0 → 0.13.1

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 CHANGED
@@ -39,7 +39,8 @@ curl -fsSL https://readm3.com/install.sh | sh
39
39
  ```
40
40
 
41
41
  Run it again to update; remove with `sh ~/.local/share/readm3/uninstall.sh`.
42
- Add `--desktop` to install the desktop editor as well (Linux x64; see
42
+ Add `--desktop` to install the desktop editor as well (Linux x64; macOS and Windows
43
+ download it, see
43
44
  [Desktop app](#desktop-app)):
44
45
 
45
46
  ```sh
@@ -405,30 +406,60 @@ coinpayportal.com). Without them the history still works and the paid parts say
405
406
 
406
407
  ### Desktop app
407
408
 
408
- The same editor in its own window, for Linux x64, from the
409
- [latest release](https://github.com/profullstack/readm3/releases/latest):
410
- `readm3-linux-x86_64.AppImage` (`chmod +x`, run it) or `readm3-linux-x86_64.flatpak`
411
- (`flatpak install --user readm3-linux-x86_64.flatpak`), checksums in `SHA256SUMS`.
412
- `install.sh --desktop` installs the AppImage with a menu entry; on a system without
413
- libfuse2 (Ubuntu 26.04 ships only fuse3), it unpacks the app instead, since an AppImage
414
- cannot mount itself there. Running a downloaded AppImage by hand on such a system needs
415
- `--appimage-extract-and-run` or `sudo apt install libfuse2t64`.
409
+ The same editor in its own window, from the
410
+ [latest release](https://github.com/profullstack/readm3/releases/latest), checksums in
411
+ `SHA256SUMS`:
412
+
413
+ - **Linux x64**: `readm3-linux-x86_64.AppImage` (`chmod +x`, run it) or
414
+ `readm3-linux-x86_64.flatpak` (`flatpak install --user readm3-linux-x86_64.flatpak`).
415
+ `install.sh --desktop` installs the AppImage with a menu entry; on a system without
416
+ libfuse2 (Ubuntu 26.04 ships only fuse3), it unpacks the app instead, since an AppImage
417
+ cannot mount itself there. Running a downloaded AppImage by hand on such a system needs
418
+ `--appimage-extract-and-run` or `sudo apt install libfuse2t64`.
419
+ - **macOS** (Apple silicon `readm3-mac-arm64.dmg`, Intel `readm3-mac-x64.dmg`): drag it
420
+ to Applications. It is ad-hoc signed, not notarized, so the first launch needs
421
+ right-click → Open, or `xattr -dr com.apple.quarantine /Applications/readm3.app`.
422
+ - **Windows x64**: `readm3-windows-x64-setup.exe` installs for your user only (no admin);
423
+ it is not code-signed, so SmartScreen asks once (More info → Run anyway). A portable
424
+ `readm3-windows-x64.zip` is there too.
425
+
426
+ Use it the way you use `subl`: the CLI opens files and folders in the app and gives the
427
+ shell back.
416
428
 
417
429
  ```sh
418
- readm3-desktop notes.md src/app.ts # opens them as tabs; Ctrl+S saves back
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
419
435
  ```
420
436
 
421
- Files named on the command line or opened with "Open with" go straight into the
422
- editor, and a second launch hands its files to the window already open. The window
423
- loads readm3.com, so sign-in, sync and sharing work as on the web; a copy of the
424
- editor ships inside the app for a first launch with no connection. The Flatpak keeps
425
- Chromium's sandbox; on Ubuntu 24.04 and newer an AppImage cannot have one (AppArmor
426
- restricts user namespaces and a FUSE mount is `nosuid`), so its launcher starts it
427
- without and says so. Prefer the Flatpak there.
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`
442
+ (`readm3-desktop`, which `install.sh --desktop` adds), then where each platform installs
443
+ it; `READM3_DESKTOP` names the binary yourself. A folder opens with the same rules as
444
+ Open folder (no dot-directories, `node_modules`, build output or binaries; 1,000 files).
445
+ Opening a folder again refreshes the files that match disk instead of adding copies;
446
+ a file you edited and did not save keeps its draft, and the disk version arrives
447
+ beside it. While a file is open, a change on disk (a `git pull`, a build) reloads it,
448
+ or lands in History when you have unsaved edits. There is no `--wait`: a second launch
449
+ hands its files to the window already open and exits, so `readm3 edit` is not a
450
+ `core.editor` for git.
451
+
452
+ Files opened with "Open with" (Finder and Explorer included) go straight into the
453
+ editor. The window loads readm3.com, so sign-in, sync and sharing work as on the web;
454
+ a copy of the editor ships inside the app for a first launch with no connection. The
455
+ Flatpak keeps Chromium's sandbox; on Ubuntu 24.04 and newer an AppImage cannot have one
456
+ (AppArmor restricts user namespaces and a FUSE mount is `nosuid`), so its launcher
457
+ starts it without and says so. Prefer the Flatpak there.
428
458
 
429
459
  The app lives in `desktop/` (Electron). `cd desktop && bun install && node build.mjs`
430
- builds both packages (the Flatpak needs `flatpak-builder` and the Flathub remote);
431
- `.github/workflows/desktop.yml` attaches them to every release.
460
+ builds the packages for the platform it runs on (the Flatpak needs `flatpak-builder`
461
+ and the Flathub remote); `.github/workflows/desktop.yml` builds all three and attaches
462
+ them to every release.
432
463
 
433
464
  ## The website
434
465
 
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.12.0";
3
+ export declare const VERSION = "0.13.1";
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;AAGtD,eAAO,MAAM,OAAO,WAAW,CAAC;AAEhC,+EAA+E;AAC/E,eAAO,MAAM,KAAK,QA2CH,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,CAoDhF"}
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,15 +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
- export const VERSION = "0.12.0";
12
+ import { isDesktopCommand, desktopMain, installedDesktop, prefersDesktop, DESKTOP_USAGE } from "./desktop-cli.js";
13
+ export const VERSION = "0.13.1";
13
14
  /** The help text, exported so a test can hold it to the flags it documents. */
14
- export const USAGE = `readm3 — a terminal markdown reader and editor
15
+ export const USAGE = `readm3 — a plain text editor for Markdown and code
15
16
 
16
17
  Usage
17
- readm3 [path] [options]
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
18
22
 
19
23
  path A directory to browse, or a file to open. Defaults to the
20
- current directory.
24
+ current directory. Any option below means the terminal reader.
21
25
 
22
26
  Options
23
27
  -p, --print Render to stdout and exit, instead of opening the reader.
@@ -54,6 +58,7 @@ Editing
54
58
  ctrl+arrow move by word enter split, continuing a list
55
59
  ctrl+g keys for editing tab indent two spaces
56
60
 
61
+ ${DESKTOP_USAGE}
57
62
  ${CLOUD_USAGE}`;
58
63
  class UsageError extends Error {
59
64
  }
@@ -178,6 +183,16 @@ export async function main(argv = process.argv.slice(2)) {
178
183
  await cloudMain(argv);
179
184
  return;
180
185
  }
186
+ if (isDesktopCommand(argv)) {
187
+ await desktopMain(argv);
188
+ return;
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
+ }
181
196
  let args;
182
197
  try {
183
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;AAExE,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEhC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;8CAayB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;mDAIlC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BnE,WAAW,EAAE,CAAC;AAYhB,MAAM,UAAW,SAAQ,KAAK;CAAG;AAEjC,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,MAAM,GAAe;QACzB,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,KAAK;KAChB,CAAC;IACF,IAAI,MAA0B,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAW,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC;YACV,KAAK,QAAQ;gBACX,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,WAAW;gBACd,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,MAAM,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;oBAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;gBACnG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC;YACV,KAAK,SAAS;gBACZ,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,KAAK,GAAG,IAAI,EAAe,CAAC;gBAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,UAAU,CAAC,2BAA2B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5E,CAAC;gBACD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC;YACV,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAI,UAAU,CAAC,4BAA4B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,KAAsB,CAAC;gBACvC,MAAM;YACR,CAAC;YACD,KAAK,YAAY;gBACf,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,aAAa;gBAChB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,OAAO;gBACV,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,IAAI,CAAC;YACV,KAAK,YAAY;gBACf,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG;oBAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;gBACvF,IAAI,MAAM,KAAK,SAAS;oBAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;gBAC7E,MAAM,GAAG,GAAG,CAAC;gBACb,MAAM;QACV,CAAC;IACH,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,UAAU,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,MAAM,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC/D,IAAI,IAAgB,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,aAAa,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;QAChC,aAAa,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;IAC9B,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,CAAC;IAChC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AACjF,gFAAgF;AAChF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
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;
18
+ /** How to start the app: a binary and the arguments that come before the paths. */
19
+ export interface Launch {
20
+ command: string;
21
+ args: string[];
22
+ }
23
+ /**
24
+ * Where an installed desktop app lives, most specific first: READM3_DESKTOP, the
25
+ * `readm3-desktop` command (install.sh puts it on PATH), then each platform's
26
+ * usual install location. The Flatpak is last, because only `flatpak run` starts it.
27
+ */
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;
36
+ export declare function findDesktop(candidates: Launch[], exists?: (path: string) => boolean): Launch | undefined;
37
+ export declare function desktopMain(argv: string[]): Promise<void>;
38
+ //# sourceMappingURL=desktop-cli.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,146 @@
1
+ /**
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.
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { existsSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { posix, resolve, win32 } from "node:path";
11
+ export const DESKTOP_USAGE = `Desktop editor
12
+ readm3 edit [PATH...] Open files or folders in the readm3 desktop
13
+ app and return (also: readm3 --desktop,
14
+ readm3 desktop, readm3 subl, readm3 open).
15
+ No path opens the editor as you left it.
16
+ READM3_DESKTOP names the app's binary.
17
+ readm3 desktop install Install or update the desktop app (Linux), or
18
+ print the download for macOS and Windows.
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
+ }
43
+ /**
44
+ * Where an installed desktop app lives, most specific first: READM3_DESKTOP, the
45
+ * `readm3-desktop` command (install.sh puts it on PATH), then each platform's
46
+ * usual install location. The Flatpak is last, because only `flatpak run` starts it.
47
+ */
48
+ export function desktopCandidates(platform, env, home) {
49
+ // The platform's own path rules, so the lookup for one platform can be checked on another.
50
+ const { delimiter, join } = platform === "win32" ? win32 : posix;
51
+ const found = [];
52
+ const binary = (command) => found.push({ command, args: [] });
53
+ if (env.READM3_DESKTOP)
54
+ binary(env.READM3_DESKTOP);
55
+ const exe = platform === "win32" ? "readm3-desktop.exe" : "readm3-desktop";
56
+ for (const dir of (env.PATH ?? "").split(delimiter))
57
+ if (dir)
58
+ binary(join(dir, exe));
59
+ if (platform === "darwin") {
60
+ for (const apps of ["/Applications", join(home, "Applications")])
61
+ binary(join(apps, "readm3.app", "Contents", "MacOS", "readm3"));
62
+ }
63
+ else if (platform === "win32") {
64
+ const local = env.LOCALAPPDATA ?? join(home, "AppData", "Local");
65
+ binary(join(local, "Programs", "readm3", exe));
66
+ if (env.ProgramFiles)
67
+ binary(join(env.ProgramFiles, "readm3", exe));
68
+ }
69
+ else {
70
+ const share = join(env.XDG_DATA_HOME ?? join(home, ".local", "share"), "readm3");
71
+ binary(join(share, "desktop", "readm3-desktop"));
72
+ binary(join(share, "readm3.AppImage"));
73
+ for (const root of [join(home, ".local", "share", "flatpak"), "/var/lib/flatpak"]) {
74
+ if (existsSync(join(root, "app", "com.readm3.Editor")))
75
+ found.push({ command: "flatpak", args: ["run", "com.readm3.Editor"] });
76
+ }
77
+ }
78
+ return found;
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()));
93
+ export function findDesktop(candidates, exists = existsSync) {
94
+ return candidates.find((launch) => launch.command === "flatpak" || exists(launch.command));
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
+ }
111
+ export async function desktopMain(argv) {
112
+ const request = parseDesktopArgs(argv);
113
+ if (request.action === "help") {
114
+ process.stdout.write(DESKTOP_USAGE);
115
+ return;
116
+ }
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}`);
123
+ process.exitCode = 2;
124
+ return;
125
+ }
126
+ const launch = findDesktop(desktopCandidates(process.platform, process.env, homedir()));
127
+ if (!launch) {
128
+ process.stderr.write(`readm3: the desktop app is not installed. Install it with:\n readm3 desktop install\n`);
129
+ process.exitCode = 1;
130
+ return;
131
+ }
132
+ // Absolute paths, so a running editor started somewhere else opens the right files.
133
+ const paths = request.paths.map((path) => resolve(path));
134
+ const missing = paths.filter((path) => !existsSync(path));
135
+ if (missing.length) {
136
+ process.stderr.write(`readm3: no such file or directory: ${missing.join(", ")}\n`);
137
+ process.exitCode = 1;
138
+ return;
139
+ }
140
+ await new Promise((done, fail) => {
141
+ const child = spawn(launch.command, [...launch.args, ...paths], { detached: true, stdio: "ignore" });
142
+ child.once("error", fail);
143
+ child.once("spawn", () => { child.unref(); done(); });
144
+ });
145
+ }
146
+ //# sourceMappingURL=desktop-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-cli.js","sourceRoot":"","sources":["../src/desktop-cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;CAQ5B,CAAC;AAEF,MAAM,QAAQ,GAAG,wDAAwD,CAAC;AAC1E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAIvH,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9E,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,OAAO,IAAI,WAAW,KAAK,MAAM,EAAE,EAAE,CAAC;IAC3G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,QAAyB,EAAE,IAAY;IACrE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,GAAG,QAAQ,wBAAwB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IAC9G,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,QAAQ,wCAAwC,CAAC;IACrF,OAAO,+DAA+D,CAAC;AACzE,CAAC;AAKD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE,GAAsB,EAAE,IAAY;IAC/F,2FAA2F;IAC3F,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACtE,IAAI,GAAG,CAAC,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrF,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpI,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,YAAY;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAClF,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,QAAyB,EAAE,GAAsB;IAC9F,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAE/G,MAAM,UAAU,WAAW,CAAC,UAAoB,EAAE,SAAoC,UAAU;IAC9F,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,QAAQ,IAAI,CAAC,CAAC;QACnG,OAAO;IACT,CAAC;IACD,+FAA+F;IAC/F,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAAC,MAAM,OAAO,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,OAAO,aAAa,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC/G,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,oFAAoF;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@profullstack/readm3",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
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",