Skip to content

staging->prod - #73

Merged
eschultz merged 38 commits into
prodfrom
staging
Oct 10, 2026
Merged

eschultz merged 38 commits into
prodfrom
staging

Conversation

@jerodfritz

Copy link
Copy Markdown
Contributor

No description provided.

pshickeydev and others added 30 commits August 17, 2026 12:27
RomM scans, enriches, and plays retro game collections. The script
keeps the ROM library, fetched artwork, and saves on one location so
RomM can link artwork correctly, auto-generates all database and auth
secrets, and pins the PostgreSQL version to protect against accidental
one-way database upgrades. Optional install questions let advanced
users provide metadata-provider API keys and toggle scanning options
while defaults stay one-click friendly; blank optional credentials
resolve to empty strings to match fields left blank in the TrueNAS UI.
…rracker

Three entries declared requirements that did not match what they actually use.
None broke an install — the runtime is lenient about all three — but each one
made the requirements screen lie to the user about what the app needs.

handbrake mounts $LOCATION(Downloads) into the container but never listed
Downloads, so the location was neither shown nor covered by the permission
grant.

paperless-ngx had no specifications block at all, so it advertised no CPU,
disk, or memory needs. It bundles postgres, redis, and an OCR pipeline, so it
now declares 2 cores, roughly 2 GB to install, and 2 GB of RAM — the last one
matters most, since OCR is what actually runs the box out of memory.

warracker listed "documents", which is not a LocationPreferenceId and so could
never resolve. The script never touches Documents; it uses ApplicationsCapacity,
which was undeclared. Replacing the one with the other fixes both halves.

Patch versions bumped so the change shows up in the update plan's changelog.
Correct the declared requirements on handbrake, paperless-ngx, and warracker
Install scripts run on users' machines, and until now nothing checked them.
A script that is merely valid JSON can still misbehave once installed: an
unknown $LOCATION throws during processing, a $QUESTION with no question
behind it resolves to nothing, an icon path that is not in the repo 404s in
the catalog UI. All of that was landing on staging unexamined.

The validator checks JSON parse, the install-script version, the required
script/requirements/app_values blocks, the spec regex, the permission and
location enums, port ranges, metadata assets that must exist inside the repo,
duplicate or malformed question keys, hook shape and duplicate ids, the
ensure_directories_exists owner/snapshot/network_share shapes, unknown or
unbalanced macros, every $LOCATION against the enum, and every $QUESTION
against a declared key. Locations used by a macro but never declared are
warnings rather than errors: they install correctly, they just under-report
what the app needs.

This repository is public and the platform is private, so CI cannot import
the real types. Everything enforced is mirrored in _lib/contract.ts, in one
place, so a drift fix is a single edit rather than a hunt through checks.

The workflow typechecks the tooling before running it. Bun executes
TypeScript by stripping types, so a type error in _lib would never stop the
validator from running — it would just make its verdict untrustworthy.
Validate install scripts on every pull request
Teaches the validator the v6 contract so v6 scripts (hooks with kind/events/conditions/target/surfaces/rerun, and widgets with sizes/slots/conditions/buttons) pass CI when they land. No app scripts included — this is scaffolding only; fileflows and other v6 apps follow as separate PRs.

contract.ts: version 6 added to SUPPORTED_VERSIONS, plus HOOK_KINDS, HOOK_EVENT_SPECS, HOOK_RERUNS, HOOK_SURFACES, HOOK_CONDITION_TYPES/ROLES, HOOK_TARGET_TYPES, SUPPORTED_WIDGETS_SCHEMA, WIDGET_SLOT_TYPES.

validate.ts: v6 hook validation branch (kind, events array, conditions, target, surfaces, rerun, retries), full widget validation (id format, title, refresh floor, script/scriptContent, entrypoint, sizes with slot type/field/count limits, conditions, buttons referencing hook ids), shared checkCondition helper, per-hook question-key scoping for v6 (hooks carry their own inputs independently).

hook_context.ts: updated mirror with ContextMount, target (file-targeted actions), mounts, getInstalledAppUrl, setProgress.
Add install script v6 support to the validator
Completes the v6 scaffolding: _lib/widget_context.ts is the hand-maintained mirror of the platform's WidgetContext (packages/backend/src/interface/widgets.ts) that catalog widget scripts import for typechecking — WidgetContext with host/port/mounts, WidgetFieldValue slot shapes (text/stat/list/image), and WidgetQueryResult. Every v6 app PR with a widget script depends on it.
A validator-green v6 script could still be rejected by the backend's zod: the merged v6 support checked field shapes but not the cross-field rules. Now mirrored from hookDeclarationV6Schema's superRefine: v5-style singular event rejected, rerun required iff user-triggerable, target/optional/userOptional gated to their firing class, version-gated triggers can't share a declaration with userAction, duplicate triggers and both-halves-of-a-ceremony declarations rejected, event objects validated (lifecycle-only, from/to on upgrade events, strict keys), target.accepts extension format, requiresHooks capped at 8 and resolved against declared hook ids, capabilityPresent conditions require a capability, widget sizes.media validated. Also fixes a false positive: widget refresh below 10 is legal (the platform clamps to 10) — now a warning, not an error.

Verified non-vacuous: a synthetic script planting all 16 defects produces exactly 16 errors + 1 warning; the 49 real scripts stay clean.
Complete the v6 scaffolding: widget_context mirror
First v6 install script in the catalog. Includes a "Convert to MP4" file-targeted hook action (H.264 encode via FFmpeg Builder, hardware-first with CPU fail-over, non-destructive — the converted copy lands next to the original) and a "Conversions" widget showing active/queued files with real encoder details harvested from runner logs.
…convert hook, ETA, quoted-path log join, source codec from the probed stream
…-defaults

Password-type credential questions with generate-button defaults + secret length bumps
Parametric requirement specs: GB-multiple conversions, grammar docs, palworld RAM spec
✨ Flagged first-boot-only admin credential questions installonly
Add FileFlows v6 install script
Add Scrutiny disk-health widget on a v6 install script
Add Plex now-playing widget on a v6 install script
Removed "(optional)" from questions.
We now have a red asterisk showing if a question is optional or not

added moby games question

Removed the questions for rescanning library, scheduling library rescans, enabling hasheous, playmatch and howlongtobeat.

this was done to streamline the questions list and make it seem less daunting.

I see no reason not to enable those 3 metadata providers by default. If there is any good reason I am happy to add the questions back.

Same for auto scanning.
Scheduled scanning using cron time seemed complicated for the average user so it was removed.

as this is a postgres app, I have decided not to expose any romm folders as postgres apps tend to not work as intended when users interact with their file directories outside of using the app.
MobiusGT and others added 8 commits September 2, 2026 07:46
Add RomM install script and donetick
update question default for romm (merge to staging)
hexos-test, hexos-test-fail and hexos-test-inline move to the v6 install
script format, copied unchanged from feature/app-actions-widgets. hexos-test
gains the harness actions and widgets the app surface E2E specs run.
Lifecycle hooks parse to the same runnable hooks as before.
Move the hexos-test harness apps to v6 with their actions and widgets
…for Jellyfin (#71)

* Add card sizes for the Plex and FileFlows widgets, with validator and type support for the card size and progress

* Validated widgets against widgetsSchema 3: a widget is the app's card, with its own background and slots

The sizes of widgetsSchema 2 are gone, an image is never a slot (the artwork is the background), and a list slot may say how many rows it shows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Moved the FileFlows and Scrutiny widgets to widgetsSchema 3

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Moved the Plex widget to widgetsSchema 3, with each stream's artwork behind the card

The script fetches each stream's wide artwork once, caps it to the image field's size and keeps it while the stream plays.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Added a now-playing widget to Jellyfin, the same card Plex draws

The setup hook creates the API key the widget reads sessions with; without it the widget asks the user to sign in.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Moved the hexos-test harness widgets to widgetsSchema 3

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@eschultz
eschultz merged commit 7886533 into prod Oct 10, 2026
2 checks passed
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.

7 participants