Skip to content

Final preparations for Release v1.8 - #109

Merged
rejas merged 12 commits into
developfrom
1_8
Jul 21, 2026
Merged

Final preparations for Release v1.8#109
rejas merged 12 commits into
developfrom
1_8

Conversation

@rejas

@rejas rejas commented Jul 21, 2026

Copy link
Copy Markdown
Owner

see #108

rejas and others added 12 commits January 3, 2026 08:49
* Bump @eslint/js from 9.39.1 to 9.39.2

Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.39.1 to 9.39.2.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/commits/v9.39.2/packages/js)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump prettier from 3.7.3 to 3.7.4

Bumps [prettier](https://github.com/prettier/prettier) from 3.7.3 to 3.7.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.7.3...3.7.4)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.7.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump cspell from 9.3.2 to 9.4.0

Bumps [cspell](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell) from 9.3.2 to 9.4.0.
- [Release notes](https://github.com/streetsidesoftware/cspell/releases)
- [Changelog](https://github.com/streetsidesoftware/cspell/blob/main/packages/cspell/CHANGELOG.md)
- [Commits](https://github.com/streetsidesoftware/cspell/commits/v9.4.0/packages/cspell)

---
updated-dependencies:
- dependency-name: cspell
  dependency-version: 9.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump eslint from 9.39.1 to 9.39.2

Bumps [eslint](https://github.com/eslint/eslint) from 9.39.1 to 9.39.2.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v9.39.1...v9.39.2)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump globals

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: veeck <gitkraken@veeck.de>
* Bump cspell from 9.4.0 to 9.6.2

Bumps [cspell](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell) from 9.4.0 to 9.6.2.
- [Release notes](https://github.com/streetsidesoftware/cspell/releases)
- [Changelog](https://github.com/streetsidesoftware/cspell/blob/main/packages/cspell/CHANGELOG.md)
- [Commits](https://github.com/streetsidesoftware/cspell/commits/v9.6.2/packages/cspell)

---
updated-dependencies:
- dependency-name: cspell
  dependency-version: 9.6.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump prettier from 3.7.4 to 3.8.1

Bumps [prettier](https://github.com/prettier/prettier) from 3.7.4 to 3.8.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.7.4...3.8.1)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.8.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump globals from 17.0.0 to 17.3.0

Bumps [globals](https://github.com/sindresorhus/globals) from 17.0.0 to 17.3.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](sindresorhus/globals@v17.0.0...v17.3.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-version: 17.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump @eslint/json from 0.14.0 to 1.0.0

Bumps [@eslint/json](https://github.com/eslint/json) from 0.14.0 to 1.0.0.
- [Release notes](https://github.com/eslint/json/releases)
- [Changelog](https://github.com/eslint/json/blob/main/CHANGELOG.md)
- [Commits](eslint/json@json-v0.14.0...json-v1.0.0)

---
updated-dependencies:
- dependency-name: "@eslint/json"
  dependency-version: 1.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps  and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together.

Updates `minimatch` from 3.1.2 to 3.1.5
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](isaacs/minimatch@v3.1.2...v3.1.5)

Updates `minimatch` from 10.0.3 to 10.2.4
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](isaacs/minimatch@v3.1.2...v3.1.5)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 10.2.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Addresses the Copilot review on #108.

initMonitor rejected an unknown platform, but getCommandScript fell back to x11
and nothing else checked, so the rejection only stopped the initial activation.
Every later ACTIVATE_MONITOR and DEACTIVATE_MONITOR still ran the x11 script.
Confirmed by test: configuring platform "wayland" and letting the timeout
elapse executed monitor-commands-x11.sh off on a machine the user never said
was x11.

Both toggles now refuse and log when no valid platform was accepted, and the
x11 fallback is gone rather than left as an unreachable default.

The stale platform case from the same review is deliberately left as is. The
node helper is shared by every instance of this module, so clearing a platform
that was already accepted would let a typo in a second instance break a first
one that is working. A test now pins that.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses the second round of Copilot review on #108.

A score of zero means not a single pixel exceeded pixelDiffThreshold, but
hasMotion used score >= scoreThreshold, so at scoreThreshold 0 a completely
still frame reported motion. The monitor would then never power off. This only
became reachable once an explicit zero started being honoured, so it arrived
with that fix rather than before it. Both the hasMotion flag and the motionBox
guard now go through one meetsScoreThreshold helper that also requires a
non-zero score, so the two rules cannot drift apart again.

The exec failure handlers read error.stderr, which is only populated when a
script actually ran and failed. A failure to spawn logged "error activating
monitor: undefined", which says nothing useful in a deployment. They now fall
back to the error message.

The child_process.exec stub called back with a single object rather than
Node's (error, stdout, stderr). The promisified result happened to come out the
same shape, so nothing was broken, but only by accident. It now uses the real
callback signature and carries the promisify.custom symbol the way exec does.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses the third round of Copilot review on #108.

The monitor scripts were run through exec with the script path interpolated
into a shell string. A module directory containing a space would split the
path and the command would fail. Switched to execFile, which takes the
arguments as a list, so no shell parses the path at all. The mock follows the
real execFile signature and now also records the raw argument list, so a test
can assert the path stays a single argument.

package.json declares no engines range while the toolchain does. The strictest
requirements are lint-staged at >=22.22.1 and eslint, which does not support
node 23, so the intersection is ^22.22.1 || >=24. Checked that CI's 22.23.1
satisfies it and that 22.18.0 and 23.x do not, which is the point: contributors
now get a clear npm error instead of a confusing failure part way through a
lint-staged run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses the fourth round of Copilot review on #108.

describeError still documented itself in terms of exec. Swept the rest of the
same staleness while there: the mock's option was still called exec although it
now stubs execFile, which would have been the next comment of the same kind.
Renamed it to run and updated the surrounding docs. Comments only, no
behaviour change, and the suite is unchanged at 61 passing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses the fifth round of Copilot review on #108.

These tests reached for setScoreThreshold(0) because init used to read the
option with a || default, so a zero passed there became 16. That stopped being
true once init switched to ??, which makes both the comment and the workaround
wrong. They now pass scoreThreshold: 0 straight to init, which is also how a
user would configure it.

The setter path stays covered by its own tests in
diff-cam-engine-options.test.js, so nothing is lost. Tests only, still 61
passing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses the sixth round of Copilot review on #108.

start() registers a canplay listener and only startComplete() removed it, so
stopping between start() and the stream becoming ready left the listener in
place. The browser then delivered canplay anyway, startComplete() ran, and the
capture interval began ticking against a camera whose tracks stop() had just
released. Confirmed by test before fixing.

stop() now removes the listener, clears the interval handle, drops the stream
reference and nulls srcObject. Releasing the stream also means start() after
stop() throws rather than appearing to succeed with dead tracks, which is the
honest outcome, a stopped engine has to go back through init.

Not reachable from the module today, which never calls stop(), but stop() is
part of the engine's public surface and releasing the tracks without detaching
the listener made the inconsistency worse rather than better.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A hostile review pass over the whole release diff turned up seven issues that
six rounds of automated review had missed.

pixelDiffThreshold of 0 made a still scene score the entire frame. The same ??
change that made an explicit zero reachable for scoreThreshold made it
reachable here too, but nothing downstream was checked: pixelDiff >= 0 is true
for every pixel, so the score could never be zero and the "a score of zero is
never motion" guard could never fire. The normalisation also divided by zero
and wrote NaN across the motion canvas. An unchanged pixel is now never
significant, mirroring the score rule, and the divisor falls back to one.

The test that was supposed to cover that option asserted the broken behaviour
as correct, so it is replaced by one that counts only changed pixels plus one
that pins a still frame at zero.

Monitor commands ran concurrently. The scripts are idempotent but not instant,
so a slow off could land after a later on and leave the screen dark, and the
module never retries because it has already recorded the monitor as awake.
They are queued now, so the last requested state wins.

Refusing to toggle without a valid platform resolved rather than rejected, so
the helper logged that the monitor had been activated directly after logging
that it could not be. It throws now and the existing catch handlers report it.

The powered off percentage was computed before the current stretch was booked,
so it read zero for as long as the monitor was off and reported the previous
total at the moment of waking, which is the one moment it is logged.

Also: the release shipped no changelog entry at all, the README described a
score that can no longer occur, the engine mock's removeEventListener ignored
the handler argument so a test could pass while removing the wrong listener,
jpegQuality had no coverage at all, one toggling test only asserted the mock,
and two files declared the same describe block.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@rejas
rejas merged commit 09c2fae into develop Jul 21, 2026
2 checks passed
@rejas
rejas deleted the 1_8 branch July 21, 2026 17:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant