scenri 0.3.5 → 0.4.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/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.1](https://github.com/tonygorb/Scenri/compare/v0.4.0...v0.4.1) (2026-08-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * a clicked update check answers even when automatic checks are off ([a17b8e8](https://github.com/tonygorb/Scenri/commit/a17b8e83c3f006ff518a34412e918099271f27cf))
9
+ * dispatch launch from the module's own path, not argv ([46cd5ea](https://github.com/tonygorb/Scenri/commit/46cd5ea9679ee1261eea25b215590bcdf6027a67))
10
+ * make the local update experience actually deliver updates ([8c5aa0a](https://github.com/tonygorb/Scenri/commit/8c5aa0aa454c4713eb90e1f27bc70867ef93129f))
11
+ * stage a discovered update in the background, ready to restart ([449b9ad](https://github.com/tonygorb/Scenri/commit/449b9ad7c775dd4a4269d1cb41a50be9d83adbe2))
12
+ * update UI narrates the whole arc and never answers with silence ([f964213](https://github.com/tonygorb/Scenri/commit/f964213e03668c200c55dd4bc73350021165bbbe))
13
+
14
+ ## [0.4.0](https://github.com/tonygorb/Scenri/compare/v0.3.5...v0.4.0) (2026-08-23)
15
+
16
+
17
+ ### Features
18
+
19
+ * expand a shot into a new shape instead of replacing it ([3570fde](https://github.com/tonygorb/Scenri/commit/3570fde2f9b700e485e3ef0c567caabcbd597bda))
20
+ * expand a shot into a new shape, and make the edit path first class ([9af4bad](https://github.com/tonygorb/Scenri/commit/9af4bad4283ee41b79f366a030b61ce4d81184e9))
21
+ * keep the rest of the photograph when one thing was asked to change ([4cbbaf7](https://github.com/tonygorb/Scenri/commit/4cbbaf7e7448766dc090c3d6bbca578ffa586c10))
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * apply EXIF orientation when an upload is stored ([752c4e2](https://github.com/tonygorb/Scenri/commit/752c4e20696334db15b341c26fa1f3b66378ab52))
27
+ * give a shot card one bottom row and one keeper mark ([f21b1b6](https://github.com/tonygorb/Scenri/commit/f21b1b6ab933417d41399965239cdc819894aa5d))
28
+ * hold the shot's real shape while it renders, and reveal it when it decodes ([e814fb6](https://github.com/tonygorb/Scenri/commit/e814fb6bd0947003e5b338c08c67e4f891d0ed69))
29
+ * keep presenter capture clothing out of the campaign frame ([c6e8c5e](https://github.com/tonygorb/Scenri/commit/c6e8c5ea3295c0cf32bde30e13f612a854a624cf))
30
+ * keep the archive button out of a phone tile's fact row ([6de9560](https://github.com/tonygorb/Scenri/commit/6de95604b7780d64753977446e4892ac1da20092))
31
+ * keep the variants that succeeded when one of them fails ([a72ae69](https://github.com/tonygorb/Scenri/commit/a72ae69b777c4d2e20fd88a6c24fc3aefd696e59))
32
+ * make a refinement keep the shot it is refining ([ae9f752](https://github.com/tonygorb/Scenri/commit/ae9f7526550e141d0557225f1de9fb861643cd5e))
33
+ * stop stretching the takes rail under the shot stage ([669e54c](https://github.com/tonygorb/Scenri/commit/669e54c167a74eff173231d84561a6ac2175a141))
34
+ * stop the resolution setting promising pixels an engine only requests ([beba2c1](https://github.com/tonygorb/Scenri/commit/beba2c156673ae1681e2b7bc502bceb1cf57404a))
35
+
3
36
  ## [0.3.5](https://github.com/tonygorb/Scenri/compare/v0.3.4...v0.3.5) (2026-08-20)
4
37
 
5
38
 
package/README.md CHANGED
@@ -95,7 +95,7 @@ pnpm dev # starts the server on 127.0.0.1:4747
95
95
  - **Iteration is the product.** A version tree, not a prompt box. Branch, compare, keep the winners.
96
96
  - **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.
97
97
  - **Your AI, your cost.** Bring your own Codex CLI session or an API key. Experiments cost raw API price, or nothing at all on a local session. No credits that burn on a miss.
98
- - **Local first, and it means it.** No account, no telemetry, no upload. The server binds to your machine only. Scenri makes exactly two requests on its own behalf: a daily version-number check against npm so updates can announce themselves, and a one-time download of the library imagery archive, cached locally forever after. Nothing about you or your work is ever sent, 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)).
98
+ - **Local first, and it means it.** No account, no telemetry, no upload. The server binds to your machine only. Scenri makes exactly two requests on its own behalf: a daily version-number check against npm 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 a one-time download of the library imagery archive, cached locally forever after. Nothing about you or your work is ever sent, 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)).
99
99
 
100
100
  ## Engines
101
101
 
@@ -61,6 +61,7 @@ function createUpdateChecker(deps) {
61
61
  };
62
62
  let inflight = null;
63
63
  let lastForceAt = 0;
64
+ let onResultFn = null;
64
65
  const enabled = () => env.SCENRI_NO_UPDATE_CHECK !== "1" && deps.store.getSetting("update.enabled") !== "false";
65
66
  async function fetchLatest() {
66
67
  if (!deps.store.getSetting("update.disclosed")) {
@@ -71,10 +72,12 @@ function createUpdateChecker(deps) {
71
72
  if (res.error) return { ...cached(), error: res.error };
72
73
  deps.store.setSetting("update.latest", res.latest ?? "");
73
74
  deps.store.setSetting("update.checkedAt", String(now()));
74
- return cached();
75
+ const result = cached();
76
+ onResultFn?.(result);
77
+ return result;
75
78
  }
76
79
  async function check(force = false) {
77
- if (!enabled()) return cached();
80
+ if (!enabled() && !force) return cached();
78
81
  if (inflight) return inflight;
79
82
  const prior = cached();
80
83
  const fresh = prior.checkedAt !== null && now() - prior.checkedAt < CACHE_MS;
@@ -93,7 +96,14 @@ function createUpdateChecker(deps) {
93
96
  setTimeout(() => void check(), 1e4).unref();
94
97
  setInterval(() => void check(), CACHE_MS).unref();
95
98
  }
96
- return { enabled, check, schedule };
99
+ return {
100
+ enabled,
101
+ check,
102
+ schedule,
103
+ onResult: (fn) => {
104
+ onResultFn = fn;
105
+ }
106
+ };
97
107
  }
98
108
  function findNpm(opts = {}) {
99
109
  const env = opts.env ?? process.env;
@@ -220,5 +230,5 @@ async function stageVersion(deps) {
220
230
  }
221
231
 
222
232
  export { classify, createUpdateChecker, fetchDistTagLatest, findNpm, stageVersion };
223
- //# sourceMappingURL=chunk-3W2RHBZC.js.map
224
- //# sourceMappingURL=chunk-3W2RHBZC.js.map
233
+ //# sourceMappingURL=chunk-WIIQZN3K.js.map
234
+ //# sourceMappingURL=chunk-WIIQZN3K.js.map
@@ -1,4 +1,4 @@
1
- import { stageVersion, fetchDistTagLatest, findNpm } from './chunk-3W2RHBZC.js';
1
+ import { stageVersion, fetchDistTagLatest, findNpm } from './chunk-WIIQZN3K.js';
2
2
  import { readMeta } from './chunk-Y3ZPBPLP.js';
3
3
  import { defaultHome, newestStaged, compareSemver } from './chunk-4MAFHYAD.js';
4
4
 
@@ -63,5 +63,5 @@ async function runUpdateCommand(opts) {
63
63
  }
64
64
 
65
65
  export { runUpdateCommand };
66
- //# sourceMappingURL=cli-HF5KPURA.js.map
67
- //# sourceMappingURL=cli-HF5KPURA.js.map
66
+ //# sourceMappingURL=cli-PBDPZQ4G.js.map
67
+ //# sourceMappingURL=cli-PBDPZQ4G.js.map
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { bootErrorLines } from './chunk-WGIZJXNE.js';
3
+ import { fileURLToPath } from 'url';
3
4
 
4
5
  // src/args.ts
5
6
  function parseArgs(argv) {
@@ -41,6 +42,11 @@ SCENRI_CONTENT_URL.
41
42
  `;
42
43
  }
43
44
 
45
+ // src/builtEntry.ts
46
+ function isBuiltEntry(entryPath) {
47
+ return /[\\/]dist[\\/]/.test(entryPath);
48
+ }
49
+
44
50
  // src/index.ts
45
51
  var command = parseArgs(process.argv.slice(2));
46
52
  try {
@@ -64,13 +70,13 @@ try {
64
70
  await (await import('./serve.js')).serve();
65
71
  break;
66
72
  case "update": {
67
- const { runUpdateCommand } = await import('./cli-HF5KPURA.js');
73
+ const { runUpdateCommand } = await import('./cli-PBDPZQ4G.js');
68
74
  process.exit(await runUpdateCommand(command));
69
75
  break;
70
76
  }
71
77
  case "launch": {
72
- const ownEntry = process.argv[1] ?? "";
73
- if (!/[\\/]dist[\\/]/.test(ownEntry)) {
78
+ const ownEntry = fileURLToPath(import.meta.url);
79
+ if (!isBuiltEntry(ownEntry)) {
74
80
  await (await import('./serve.js')).serve();
75
81
  break;
76
82
  }