scenri 0.20.1 → 0.20.3
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/CHANGELOG.md +27 -0
- package/README.md +35 -32
- package/dist/{chunk-YNL3WQOL.js → chunk-2EKTEMJY.js} +10 -7
- package/dist/{chunk-CMLJGPYC.js → chunk-GTDE2BS2.js} +15 -3
- package/dist/{cli-WRNWT6P7.js → cli-PXPCJR7V.js} +3 -3
- package/dist/index.js +4 -4
- package/dist/{offer-W6NJXMWT.js → offer-FT2W2SQ7.js} +4 -4
- package/dist/serve.js +1451 -167
- package/dist/{src-URYJIC5Y.js → src-ZNBCNYVK.js} +3 -3
- package/package.json +1 -1
- package/studio-dist/assets/{index-rUsrfUXL.css → index-BDCs16Y1.css} +1 -1
- package/studio-dist/assets/index-C-ACZ9Pw.js +108 -0
- package/studio-dist/index.html +2 -2
- package/templates/previews/showcase/court-72-checker-sit.jpg +0 -0
- package/templates/showcase/court-72-checker-sit.json +1 -1
- package/studio-dist/assets/index-DluRyMMu.js +0 -108
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.20.3](https://github.com/tonygorb/Scenri/compare/v0.20.2...v0.20.3) (2026-09-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **cli:** a skipped install script says how to allow it and clear npx's copy ([7afece2](https://github.com/tonygorb/Scenri/commit/7afece286e58e61ead28cac5186559781a368096))
|
|
9
|
+
* **cli:** the desktop offer names Settings > Local access ([1ea3992](https://github.com/tonygorb/Scenri/commit/1ea399235c21eb87127605ba834afed607be946e))
|
|
10
|
+
* **content:** the court sneakers tile, redrawn from words that agree with themselves ([1686d0d](https://github.com/tonygorb/Scenri/commit/1686d0df176b8745d0c4e76cfd6b91bc279d5eaf))
|
|
11
|
+
* public pages, films and first-run text describe Scenri as it is ([563f35e](https://github.com/tonygorb/Scenri/commit/563f35eab31f725df25057e6022cb1cf01eecf8f))
|
|
12
|
+
|
|
13
|
+
## [0.20.2](https://github.com/tonygorb/Scenri/compare/v0.20.1...v0.20.2) (2026-09-27)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* a shot that fails out of the poll's sight stops spinning ([4d784c3](https://github.com/tonygorb/Scenri/commit/4d784c30c0d8aeb4f13cabccd90b1c4949c1e285))
|
|
19
|
+
* **cli:** Add to Desktop honours SCENRI_NO_DESKTOP ([b43078f](https://github.com/tonygorb/Scenri/commit/b43078fbe53888321958ad9956ce72fa351f4cf2))
|
|
20
|
+
* **content:** fetch the library by range, Home's pictures first, resumable ([a309a83](https://github.com/tonygorb/Scenri/commit/a309a83bd5fc2ad42f7139f0338b7288ef5e5f33))
|
|
21
|
+
* **content:** one file-by-file install, each file kept the moment its bytes arrive ([4c47a32](https://github.com/tonygorb/Scenri/commit/4c47a320e3cb08276ce79d2bf6d8f0711be02438))
|
|
22
|
+
* **core:** keep every running shot in the activity answer ([fe4b40e](https://github.com/tonygorb/Scenri/commit/fe4b40efb9c749ae99a89c8a21ae56e41cdfe219))
|
|
23
|
+
* **studio:** a wall tile's credits wait with its picture, and the Activity meter is a progressbar ([6bb212f](https://github.com/tonygorb/Scenri/commit/6bb212fae6591cefa20614fc4b47c2c3611c61f5))
|
|
24
|
+
* **studio:** library pictures appear as they land, and the bell counts them ([c14d5db](https://github.com/tonygorb/Scenri/commit/c14d5db05c99507b06d1239980633eb9bedc0a91))
|
|
25
|
+
* **studio:** Shut down closes its tab once Scenri has stopped, or says so ([66a42d9](https://github.com/tonygorb/Scenri/commit/66a42d9ac55d33c27f10acc9b778aa1c4dc38f5c))
|
|
26
|
+
* **studio:** stop the swirl on a shot that ended out of the poll's sight ([48a984a](https://github.com/tonygorb/Scenri/commit/48a984a6937ffa90de6a512d8467ada4501538ed))
|
|
27
|
+
* **studio:** the lifecycle card keeps the page's gutter on a phone, its sentence centred ([5749c3d](https://github.com/tonygorb/Scenri/commit/5749c3de487684b4e8b19cd1c66b2239b1744c29))
|
|
28
|
+
* the first-run library arrives Home first, and Shut down closes its tab ([7e6c0f7](https://github.com/tonygorb/Scenri/commit/7e6c0f7cf96a56a481460bd44d2406a49683ee43))
|
|
29
|
+
|
|
3
30
|
## [0.20.1](https://github.com/tonygorb/Scenri/compare/v0.20.0...v0.20.1) (2026-09-27)
|
|
4
31
|
|
|
5
32
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<br><br>
|
|
8
8
|
|
|
9
9
|
**The open studio for brand-consistent AI visuals.**<br>
|
|
10
|
-
Define a client's brand once. Then
|
|
10
|
+
Define a client's brand once. Then put its products and people into scenes, art-direct each shot in plain words, and refine it step by step. Open source, running entirely on your own machine and your own AI accounts.
|
|
11
11
|
|
|
12
12
|
[](https://github.com/tonygorb/scenri/actions/workflows/ci.yml)
|
|
13
13
|
[](https://www.npmjs.com/package/scenri)
|
|
@@ -21,9 +21,9 @@ npx scenri
|
|
|
21
21
|
|
|
22
22
|
<sub>Needs [Node.js](https://nodejs.org) 22 or newer. New to any of this? The [install guide](https://github.com/tonygorb/scenri/blob/main/docs/INSTALL.md) walks through every step.</sub>
|
|
23
23
|
|
|
24
|
-
<img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/demo.gif" alt="
|
|
24
|
+
<img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/demo.gif" alt="Scenri's Create page: in the composer a dollar sign picks the product Cropped Puffer, an at sign picks the presenter Kwame, a slash picks the Container Blue scene, and a line of written direction follows the three chips. Generate turns a new card into a dithered swirl where the picture is being made, the swirl develops into a man in an orange puffer jacket leaning on a cobalt shipping container, and the shot opens beside the prompt that made it" width="820">
|
|
25
25
|
|
|
26
|
-
<sub>Pick a product, pick a presenter, pick a scene, then write the direction. That is the
|
|
26
|
+
<sub>Pick a product, pick a presenter, pick a scene, then write the direction. That is the prompt.</sub>
|
|
27
27
|
|
|
28
28
|
</div>
|
|
29
29
|
|
|
@@ -33,27 +33,27 @@ npx scenri
|
|
|
33
33
|
|
|
34
34
|
Most AI image tools give you a prompt box and a slot machine. Scenri gives you the part that actually takes the time: **art direction**.
|
|
35
35
|
|
|
36
|
-
Every shot keeps its
|
|
36
|
+
Every shot keeps its history. Open it, say what to change, and each refinement joins a trail under the picture, so the original and every step stay one click apart. Refine any step again, or use **Reuse setup** to start a new shot from the same prompt and chips.
|
|
37
37
|
|
|
38
38
|
It runs as a local server on your own computer. Your brands, your images, and your keys stay on your disk. To use it from a phone or tablet on the same Wi-Fi, open Settings, Local access, and scan the QR code.
|
|
39
39
|
|
|
40
|
-
## What a
|
|
40
|
+
## What a prompt produces
|
|
41
41
|
|
|
42
|
-
The film above ends on the
|
|
42
|
+
The film above ends on one of the examples from the Home wall: the Cropped Puffer product, the presenter Kwame, the Container Blue scene, and a short paragraph of written direction, of which the film types the first line. The chips carry the identity; the words do the art direction. Here are eight more shots from the Home wall, each built the same way from chips and written direction:
|
|
43
43
|
|
|
44
44
|
<!-- One paragraph, no whitespace between the tags: a newline here renders as
|
|
45
45
|
a fixed word-space, and 4 x 24.5% plus three spaces overflows a phone screen
|
|
46
|
-
and wraps 3+1. With zero gaps the rows stay four wide at every width. --><p align="center"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-paper-garden.jpg" title="Collagen in a paper garden" alt="A lilac Tanner Fielding collagen pouch standing among giant cut-paper flowers in coral, yellow and violet" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-foil-jump.jpg" title="Mid-air in the foil tent" alt="A woman in an orange puffer jacket jumping inside a tent of crinkled silver foil" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-ruby-pour.jpg" title="Aperitivo
|
|
46
|
+
and wraps 3+1. With zero gaps the rows stay four wide at every width. --><p align="center"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-paper-garden.jpg" title="Collagen in a paper garden" alt="A lilac Tanner Fielding collagen pouch standing among giant cut-paper flowers in coral, yellow and violet" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-foil-jump.jpg" title="Mid-air in the foil tent" alt="A woman in an orange puffer jacket jumping inside a tent of crinkled silver foil" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-ruby-pour.jpg" title="Aperitivo under a ruby pour" alt="A Fenner Ross aperitivo bottle on a pale pink ledge while a thick ruby syrup pours into a glass of ice beside it and drips over the edge" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-pink-smoke.jpg" title="Gold hoops in pink smoke" alt="A woman in profile with a low bun and a chunky gold hoop earring, wrapped in clouds of pink smoke" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-travertine-chair.jpg" title="Oak lounge chair in travertine light" alt="An oak lounge chair with cream boucle cushions beside a travertine block, window light striping the wall" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-balloon-knot.jpg" title="Headphones in the balloon knot" alt="A man with his eyes closed in pale blue over-ear headphones, sunk in a tangle of pink, orange and blue balloons" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-boulder-runner.jpg" title="Trail shoe on lichened granite" alt="A white and orange trail running shoe resting on lichen-covered granite high above a mountain valley" width="24.5%"><img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/readme-arch-lean.jpg" title="Leaning into the green arch" alt="A woman in cobalt trousers leaning inside a lime green arch on a sky blue set, holding a violet can" width="24.5%"></p>
|
|
47
47
|
|
|
48
|
-
All
|
|
48
|
+
All 110 examples on the Home wall work the same way. Open one and it loads back into the composer as the prompt that made it, ready to change.
|
|
49
49
|
|
|
50
50
|
## What you get out of the box
|
|
51
51
|
|
|
52
|
-
<img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/library.gif" alt="
|
|
52
|
+
<img src="https://raw.githubusercontent.com/tonygorb/scenri/main/docs/media/library.gif" alt="Scenri's Home for a new brand: the four ways to start and the example tabs over the wall of finished shots, a slow scroll down the wall, then the Presenters library and the Scenes library, each opening with its offer to make your own above the catalog" width="820">
|
|
53
53
|
|
|
54
|
-
A library of scenes, presenters and demo products, so the app is useful before you have uploaded anything of your own. Filter by category
|
|
54
|
+
A library of 42 scenes, 19 presenters and 30 demo products, so the app is useful before you have uploaded anything of your own. Filter by category and star what fits the brand. Add your own products from their photos, and make your own presenters and scenes in a short conversation: describe a person or a place, or start from photos, and approve what Scenri draws before it is saved.
|
|
55
55
|
|
|
56
|
-
The brand kit
|
|
56
|
+
The brand kit lives in Settings and is the part that keeps output consistent. Name, mark, palette and rules, set once and carried into every shot that asks for them.
|
|
57
57
|
|
|
58
58
|
## Run it
|
|
59
59
|
|
|
@@ -67,11 +67,11 @@ That is the whole install. npm asks once whether to proceed, downloads the curre
|
|
|
67
67
|
|
|
68
68
|
On Windows, if PowerShell answers `npx.ps1 cannot be loaded because running scripts is disabled on this system`, that is a stock Windows setting, not a fault: type `npx.cmd scenri` instead, or use Command Prompt. Still no administrator required.
|
|
69
69
|
|
|
70
|
-
On macOS and Windows, Scenri then asks once whether to put a **Scenri icon on your desktop**. Say yes and from then on a double-click starts Scenri and opens it in your browser, no terminal needed; the icon works offline and keeps working across updates. Said no? Settings, then
|
|
70
|
+
On macOS and Windows, Scenri then asks once whether to put a **Scenri icon on your desktop**. Say yes and from then on a double-click starts Scenri and opens it in your browser, no terminal needed; the icon works offline and keeps working across updates. Said no? Settings, then Local access, then **Add to desktop**, or `npx scenri desktop` in a terminal. Scenri stays what it is, a local server and your browser: the icon is a launcher, not an app.
|
|
71
71
|
|
|
72
|
-
Generation runs on **Codex CLI**, an official helper from OpenAI that draws on your own ChatGPT plan. No API key to paste, and Scenri never charges you. Each image
|
|
72
|
+
Generation runs on **Codex CLI**, an official helper from OpenAI that draws on your own paid ChatGPT plan (Codex image generation is not part of the Free plan). No API key to paste, and Scenri never charges you. Each image spends some of your plan's Codex usage. You do not have to set it up by hand: if it is missing, Scenri offers to install it and to sign you in, both from the app. No ChatGPT plan? Add your own key from an image provider in Settings instead, see [Engines](#engines).
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
One dependency, `better-sqlite3`, runs an install script that fetches its native binary. The npm that ships with current Node releases (npm 11) runs it without asking. npm 12 blocks dependency install scripts by default, so if `npm --version` prints 12, allow this one once with `npm config set allow-scripts=better-sqlite3 --location=user` before you run `npx scenri`. Something not starting? See [troubleshooting](https://github.com/tonygorb/scenri/blob/main/docs/INSTALL.md#troubleshooting).
|
|
75
75
|
|
|
76
76
|
<details>
|
|
77
77
|
<summary>Run from source</summary>
|
|
@@ -88,35 +88,37 @@ pnpm dev # starts the server on 127.0.0.1:4747
|
|
|
88
88
|
|
|
89
89
|
## First five minutes
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
Scenri offers to walk you through your first shot, one step at a time, and Learn holds the rest. The short version:
|
|
92
|
+
|
|
93
|
+
1. **Paste a website URL.** Scenri reads the public pages and drafts the kit: name, logo, palette. If the site sells things, it offers to add the products too.
|
|
94
|
+
2. **Describe a shot.** In the composer, `$` reaches for a product, `@` for a presenter, `/` for a scene, and `#` for a colour. Everything between them is your own words.
|
|
95
|
+
3. **Generate on Codex CLI.** Runs on your own paid ChatGPT plan, so there is no key and no per-image charge from us.
|
|
96
|
+
4. **Refine it.** Open the shot and say what to change. Each refinement joins the trail under the picture.
|
|
97
|
+
5. **Add your own key** in Settings, Providers to run on OpenRouter, Replicate or fal instead.
|
|
96
98
|
|
|
97
99
|
## Why it is built this way
|
|
98
100
|
|
|
99
|
-
- **Iteration is the product.**
|
|
101
|
+
- **Iteration is the product.** Not a prompt box: every shot keeps its trail of refinements, and the ones you star collect in Keepers.
|
|
100
102
|
- **Your brands are files, not hostages.** `.brand` is an open, documented format under a permissive license. Email one to a client. Any tool can adopt it.
|
|
101
|
-
- **Your AI, your cost.** Bring your own Codex CLI
|
|
102
|
-
- **Local first, and it means it.** No account, no telemetry,
|
|
103
|
+
- **Your AI, your cost.** Bring your own ChatGPT plan through Codex CLI, or an API key. You pay the provider directly, at its own price. Scenri sells no credits and adds no markup.
|
|
104
|
+
- **Local first, and it means it.** No account, no telemetry, nothing uploaded to us. Scenri runs on this computer, and answers other devices on your own network only when they bring its six-digit code (Settings, Local access). It makes exactly two requests on its own behalf: a version-number check against npm every six hours so updates can announce themselves (and, when one is found, the download of that release from npm, staged locally until you choose to restart), and the download of the library imagery archive from GitHub, once for each library version a release pins. Nothing about you or your work is sent in either, and both turn off: in Settings or `SCENRI_NO_UPDATE_CHECK=1` for the first, `SCENRI_NO_CONTENT_FETCH=1` for the second ([how updates work](https://github.com/tonygorb/scenri/blob/main/docs/updates.md), [what goes where](https://github.com/tonygorb/scenri/blob/main/PRIVACY.md)).
|
|
103
105
|
|
|
104
106
|
## Engines
|
|
105
107
|
|
|
106
108
|
| Engine | What it costs you | Needs | Carries a Product or Presenter |
|
|
107
109
|
|---|---|---|---|
|
|
108
|
-
| **Codex CLI** | your ChatGPT plan | a ChatGPT
|
|
109
|
-
| OpenRouter | about $0.04
|
|
110
|
-
| Replicate | about $0.003
|
|
111
|
-
| fal | about $0.
|
|
110
|
+
| **Codex CLI** | your ChatGPT plan's Codex usage | a paid ChatGPT plan; the app installs Codex and signs you in | yes, up to 5 references |
|
|
111
|
+
| OpenRouter | about $0.04 an image | API key | yes, up to 4 references |
|
|
112
|
+
| Replicate | about $0.003 an image | API token | no |
|
|
113
|
+
| fal | about $0.006 an image (fal bills per megapixel) | API key | no |
|
|
112
114
|
|
|
113
115
|
Codex CLI is the default because it needs no key and because it carries the most reference images: a shot that has to keep both a product and a person accurate needs the room.
|
|
114
116
|
|
|
115
|
-
It is not free.
|
|
117
|
+
It is not free. Paid ChatGPT plans include Codex usage, and each image spends some of it: OpenAI says image generation uses it three to five times faster than a plain turn. OpenAI meters that, not Scenri, so spend caps do not apply to this engine.
|
|
116
118
|
|
|
117
|
-
**Without a ChatGPT plan**, use your own provider key. OpenRouter is the one to pick if your shots name a Product or a Presenter. Replicate and fal take no reference images, so Scenri refuses those
|
|
119
|
+
**Without a paid ChatGPT plan**, use your own provider key. OpenRouter is the one to pick if your shots name a Product or a Presenter. Replicate and fal take no reference images, so Scenri refuses those shots on them rather than generating something that only looks right. Edits on Replicate and fal cost more than a new image.
|
|
118
120
|
|
|
119
|
-
Keys are stored in your local library folder, sent only to that provider, and never returned by the API. Set a monthly spend cap per engine in Settings.
|
|
121
|
+
Keys are stored in your local library folder, sent only to that provider, and never returned by the API. Set a monthly spend cap per engine in Settings, Providers.
|
|
120
122
|
|
|
121
123
|
Your Codex session is yours: Scenri runs the official `codex` commands on your machine and never reads, copies or stores the credential. That is also why Scenri never pools user plans: a plan is licensed to the person who pays for it, not to a service reselling it to other people. Any hosted version of Scenri, if one ever exists, would run API-priced engines only.
|
|
122
124
|
|
|
@@ -132,10 +134,11 @@ Your Codex session is yours: Scenri runs the official `codex` commands on your m
|
|
|
132
134
|
| `SCENRI_REGISTRY` | npmjs | registry for the update check and downloads (mirrors, forks, airgaps) |
|
|
133
135
|
| `SCENRI_NO_CONTENT_FETCH` | unset | set to `1` to never download the library imagery archive |
|
|
134
136
|
| `SCENRI_CONTENT_URL` | GitHub releases | where the library archive comes from (mirrors, forks, airgaps) |
|
|
137
|
+
| `SCENRI_CONTENT_PIN` | unset | a pin for a different archive at `SCENRI_CONTENT_URL`, checked file by file ([how](https://github.com/tonygorb/scenri/blob/main/docs/updates.md)) |
|
|
135
138
|
|
|
136
139
|
`OPENROUTER_API_KEY`, `REPLICATE_API_TOKEN` and `FAL_KEY` are read from the environment as an alternative to entering them in Settings.
|
|
137
140
|
|
|
138
|
-
**Phones and tablets.** Scenri also answers on this computer's Wi-Fi or Ethernet address, so a phone on the same network can open it: Settings, Local access shows a QR code. Scenri has no accounts, so every device other than this computer has to bring a six-digit code, which rides inside the QR code and the link; typing the bare address asks for it, wrong guesses
|
|
141
|
+
**Phones and tablets.** Scenri also answers on this computer's Wi-Fi or Ethernet address, so a phone on the same network can open it: Settings, Local access shows a QR code. Scenri has no accounts, so every device other than this computer has to bring a six-digit code, which rides inside the QR code and the link; typing the bare address asks for it, ten wrong guesses from one device lock it out for ten minutes, and **New code** signs every device out. The first time, macOS or Windows may ask whether Node may accept incoming connections: allow it, or phones cannot reach Scenri. Setting `SCENRI_HOST=127.0.0.1` keeps Scenri to this computer alone. Over plain http the code travels unencrypted, like everything else, so treat phone access as convenience on a network you trust.
|
|
139
142
|
|
|
140
143
|
## Layout
|
|
141
144
|
|
|
@@ -145,7 +148,7 @@ Your Codex session is yours: Scenri runs the official `codex` commands on your m
|
|
|
145
148
|
| `packages/brand-spec` | the `.brand` schema, validator, and URL auto-builder |
|
|
146
149
|
| `packages/core` | brands, shot history, the version tree, image store, cost ledger (SQLite) |
|
|
147
150
|
| `packages/catalog` | product catalog import: Shopify, WooCommerce, Webflow, generic |
|
|
148
|
-
| `packages/engines/*` | engine adapters: `codex`, `openrouter`, `replicate`, `fal`, `demo
|
|
151
|
+
| `packages/engines/*` | engine adapters: `codex`, `openrouter`, `replicate`, `fal`, and `demo`, a placeholder used by the tests |
|
|
149
152
|
| `apps/studio` | the React studio the CLI serves |
|
|
150
153
|
|
|
151
154
|
One package publishes to npm: **`scenri`**, the CLI, which bundles everything else. The rest are internal.
|
|
@@ -154,7 +157,7 @@ One package publishes to npm: **`scenri`**, the CLI, which bundles everything el
|
|
|
154
157
|
|
|
155
158
|
Start with [CONTRIBUTING.md](https://github.com/tonygorb/scenri/blob/main/CONTRIBUTING.md). Engine adapters are the friendliest surface: one file, one interface, well covered by tests.
|
|
156
159
|
|
|
157
|
-
Accessibility is tracked in [docs/A11Y-BACKLOG.md](https://github.com/tonygorb/scenri/blob/main/docs/A11Y-BACKLOG.md).
|
|
160
|
+
Accessibility is tracked in [docs/A11Y-BACKLOG.md](https://github.com/tonygorb/scenri/blob/main/docs/A11Y-BACKLOG.md). Biome's recommended accessibility rules run at `error`, so the backlog is currently empty and a new defect fails CI rather than joining a list.
|
|
158
161
|
|
|
159
162
|
Found a security problem? Please report it privately. See [SECURITY.md](https://github.com/tonygorb/scenri/blob/main/SECURITY.md).
|
|
160
163
|
|
|
@@ -1386,12 +1386,15 @@ function createStore(db) {
|
|
|
1386
1386
|
SELECT ${cols} FROM nodes n
|
|
1387
1387
|
WHERE ${inBrand} AND n.kind != 'root' AND n.status = 'running'
|
|
1388
1388
|
UNION ALL
|
|
1389
|
-
SELECT
|
|
1390
|
-
|
|
1391
|
-
AND n.
|
|
1389
|
+
SELECT * FROM (
|
|
1390
|
+
SELECT ${cols} FROM nodes n
|
|
1391
|
+
WHERE ${inBrand} AND n.kind != 'root' AND n.status != 'running'
|
|
1392
|
+
AND n.created_at >= datetime('now', '-2 days')
|
|
1393
|
+
ORDER BY n.created_at DESC, n.id DESC
|
|
1394
|
+
LIMIT @limit
|
|
1395
|
+
)
|
|
1392
1396
|
)
|
|
1393
|
-
ORDER BY created_at DESC, id DESC
|
|
1394
|
-
LIMIT @limit`
|
|
1397
|
+
ORDER BY created_at DESC, id DESC`
|
|
1395
1398
|
).all({ brand: brandId, limit });
|
|
1396
1399
|
return rows.map((r) => ({
|
|
1397
1400
|
...rowToFeedNode(r),
|
|
@@ -2308,5 +2311,5 @@ function createCore(homeDir = defaultHome()) {
|
|
|
2308
2311
|
}
|
|
2309
2312
|
|
|
2310
2313
|
export { ASPECT_TOLERANCE, BUDGET_EXHAUSTED, EDIT_REFERENCE_ROLE_DIRECTIVE, REFERENCE_ROLE_DIRECTIVE, SCHEMA_VERSION, STEM_MIN, SchemaTooNewError, SpendCapError, TRIGRAM_MIN, budgetSize, createCatalogStore, createCore, createStore, defaultHome, fold, ftsMatch, matchesQuery, nameMatches, ratioLabel, searchTerms, shortTermSql, termMatches, uniqueProjectSlug, uniqueSetSlug, uniqueSlug };
|
|
2311
|
-
//# sourceMappingURL=chunk-
|
|
2312
|
-
//# sourceMappingURL=chunk-
|
|
2314
|
+
//# sourceMappingURL=chunk-2EKTEMJY.js.map
|
|
2315
|
+
//# sourceMappingURL=chunk-2EKTEMJY.js.map
|
|
@@ -3,7 +3,8 @@ import { resolve } from 'path';
|
|
|
3
3
|
|
|
4
4
|
// src/bootError.ts
|
|
5
5
|
var INSTALL_GUIDE = "https://github.com/tonygorb/scenri/blob/main/docs/INSTALL.md";
|
|
6
|
-
var NATIVE_MARKERS = ["NODE_MODULE_VERSION", "
|
|
6
|
+
var NATIVE_MARKERS = ["NODE_MODULE_VERSION", "ERR_DLOPEN_FAILED"];
|
|
7
|
+
var NEVER_BUILT = "Could not locate the bindings file";
|
|
7
8
|
function portBusyLines(port) {
|
|
8
9
|
const next = port + 1;
|
|
9
10
|
return [
|
|
@@ -18,6 +19,17 @@ function bootErrorLines(err) {
|
|
|
18
19
|
const first = raw.split("\n")[0];
|
|
19
20
|
const code = err?.code;
|
|
20
21
|
const haystack = `${typeof code === "string" ? code : ""} ${raw}`;
|
|
22
|
+
if (haystack.includes(NEVER_BUILT)) {
|
|
23
|
+
return [
|
|
24
|
+
"Scenri could not start: a native component failed to load.",
|
|
25
|
+
`(${first})`,
|
|
26
|
+
"Its install script did not run: npm 12 skips install scripts until they are allowed.",
|
|
27
|
+
"Fix: allow it once, clear the copy npx kept, then start again:",
|
|
28
|
+
" npm config set allow-scripts=better-sqlite3 --location=user",
|
|
29
|
+
" npm cache npx rm --force",
|
|
30
|
+
" npx scenri"
|
|
31
|
+
];
|
|
32
|
+
}
|
|
21
33
|
if (NATIVE_MARKERS.some((marker) => haystack.includes(marker))) {
|
|
22
34
|
return [
|
|
23
35
|
"Scenri could not start: a native component failed to load.",
|
|
@@ -54,5 +66,5 @@ function anotherScenriLines(port, theirs, ours) {
|
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
export { anotherScenriLines, bootErrorLines, portBusyLines, shouldAdoptRunning };
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-GTDE2BS2.js.map
|
|
70
|
+
//# sourceMappingURL=chunk-GTDE2BS2.js.map
|
|
@@ -480,7 +480,7 @@ async function addOrRepair(ownEntry, say, over) {
|
|
|
480
480
|
}
|
|
481
481
|
async function rememberDecline(home) {
|
|
482
482
|
try {
|
|
483
|
-
const { createCore } = await import('./src-
|
|
483
|
+
const { createCore } = await import('./src-ZNBCNYVK.js');
|
|
484
484
|
const core = createCore(home);
|
|
485
485
|
try {
|
|
486
486
|
core.store.setSetting("desktop.prompt", "declined");
|
|
@@ -547,5 +547,5 @@ function tail(path, bytes = 4096) {
|
|
|
547
547
|
}
|
|
548
548
|
|
|
549
549
|
export { addToDesktop, assetsDirFor, installDeps, runDesktopCommand, runExecFile, runOpenCommand };
|
|
550
|
-
//# sourceMappingURL=cli-
|
|
551
|
-
//# sourceMappingURL=cli-
|
|
550
|
+
//# sourceMappingURL=cli-PXPCJR7V.js.map
|
|
551
|
+
//# sourceMappingURL=cli-PXPCJR7V.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { bootErrorLines } from './chunk-
|
|
2
|
+
import { bootErrorLines } from './chunk-GTDE2BS2.js';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
|
|
5
5
|
// src/args.ts
|
|
@@ -49,7 +49,7 @@ Usage
|
|
|
49
49
|
|
|
50
50
|
Configuration is via environment variables: SCENRI_PORT, SCENRI_HOST,
|
|
51
51
|
SCENRI_HOME, SCENRI_NO_OPEN, SCENRI_NO_UPDATE_CHECK, SCENRI_NO_CONTENT_FETCH,
|
|
52
|
-
SCENRI_CONTENT_URL, SCENRI_NO_DESKTOP.
|
|
52
|
+
SCENRI_CONTENT_URL, SCENRI_CONTENT_PIN, SCENRI_NO_DESKTOP.
|
|
53
53
|
`;
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -86,12 +86,12 @@ try {
|
|
|
86
86
|
break;
|
|
87
87
|
}
|
|
88
88
|
case "desktop": {
|
|
89
|
-
const { runDesktopCommand } = await import('./cli-
|
|
89
|
+
const { runDesktopCommand } = await import('./cli-PXPCJR7V.js');
|
|
90
90
|
process.exit(await runDesktopCommand(command, fileURLToPath(import.meta.url)));
|
|
91
91
|
break;
|
|
92
92
|
}
|
|
93
93
|
case "open": {
|
|
94
|
-
const { runOpenCommand } = await import('./cli-
|
|
94
|
+
const { runOpenCommand } = await import('./cli-PXPCJR7V.js');
|
|
95
95
|
process.exit(await runOpenCommand(fileURLToPath(import.meta.url)));
|
|
96
96
|
break;
|
|
97
97
|
}
|
|
@@ -13,8 +13,8 @@ function shouldOfferDesktop(i) {
|
|
|
13
13
|
return true;
|
|
14
14
|
}
|
|
15
15
|
var OFFER_QUESTION = " Add Scenri to your desktop? Then you can open it without a terminal. [Y/n] ";
|
|
16
|
-
var LATER_LINE = " Not now. Add it later with: npx scenri desktop, or from Settings >
|
|
17
|
-
var STILL_RUNNING_LINE = " Scenri is running anyway. Add the icon later from Settings >
|
|
16
|
+
var LATER_LINE = " Not now. Add it later with: npx scenri desktop, or from Settings > Local access.";
|
|
17
|
+
var STILL_RUNNING_LINE = " Scenri is running anyway. Add the icon later from Settings > Local access.";
|
|
18
18
|
var ASK_TIMEOUT_MS = 12e4;
|
|
19
19
|
function parseOfferAnswer(raw) {
|
|
20
20
|
const answer = raw.trim().toLowerCase();
|
|
@@ -67,5 +67,5 @@ function askOnTerminal(question, timeoutMs = ASK_TIMEOUT_MS, io = {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
export { OFFER_QUESTION, askOnTerminal, offerDesktop, parseOfferAnswer, shouldOfferDesktop };
|
|
70
|
-
//# sourceMappingURL=offer-
|
|
71
|
-
//# sourceMappingURL=offer-
|
|
70
|
+
//# sourceMappingURL=offer-FT2W2SQ7.js.map
|
|
71
|
+
//# sourceMappingURL=offer-FT2W2SQ7.js.map
|