Repository navigation
Conversation
main only moves through a PR in this repo, and the last implement run committed straight to it because the skill says to commit to the current branch.
typescript-eslint declares typescript <6.1.0 and this repo is on 7.0.2, so the type-aware check runs on oxlint, which parses with its own engine. The baseline is 48 floating promises and 29 any at this commit. Closes #104
Every site is fire-and-forget by design: event handlers, repaints, probe chains that already handle their own failures, and the video/screensaver transitions that count their own retries. The void marker makes that intent explicit so the linter keeps surfacing the accidental ones. Closes #105
The two declared untyped boundaries (LunaResponse, RawApp) keep any behind a one-line disable with its reason; every other site gets a real type, a generic deepMerge matching config.ts, or the new errorMessage helper instead of reaching into an unknown catch binding. Config's deepMerge signature is now the one profiles.ts uses too. The three type-aware rules that only ride along with type-aware mode (unbound-method, no-base-to-string, no-redundant-type-constituents) are off in the config, so the 31 findings they carry stay out of scope as the spec says. Closes #106
knip is configured with the repo's real entry points (boot.ts, the manual scripts, the tests) instead of guessing, which is why its zero-config output called boot.ts and both manual scripts dead. The 48 unused exports and types are un-exported where their module still uses them and deleted where nothing does; getBuiltinImageUrl, getBuiltinTrackUrl, resolveBuiltinTrack, ForegroundInfo and BRAND_SHELL_PATH were referenced nowhere at all. npm run lint now runs oxlint and knip, and npm run precommit chains typecheck, lint and test. Closes #107
The hook lives in .githooks and installs itself through an npm prepare script, so a fresh clone gets it on npm install without husky. It runs the same precommit script CI runs, and skips with a note before node_modules exists because oxlint --type-aware cannot find its tsgolint binary without it. test.yml also stops running the suite twice per branch push: push is now limited to main, and pull_request still covers every branch. Closes #108
Restores BRAND_SHELL_PATH: scripts/generate-brand.ts requires it through a cast, so neither tsc nor knip saw the deletion, and npm run brand was broken. It carries @public for the same reason manifestFileName does. errorName/errorMessage now read name and message off any object: webOS rejects video.play() and autoplay with a DOMException, which is not an Error on older firmware, so instanceof checks would have misread an AbortError as a decode failure. Nine sites where a rejection leaves a visibly broken screen (screensaver content, refreshAll after a settings save, the settings app lists, the all-apps grid) now catch with a reason instead of sitting behind a bare void. CI runs npm run precommit, so the local and CI command cannot drift, and the prepare script no longer overwrites a hooksPath the developer set by hand.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A lint guardrail for the defect classes
tscand the tests can't see: floating promises,anyat the untrusted boundaries, and dead exports. Formatting stays out — it catches nothing and rewrites all 140 files.oxlint rather than ESLint because
typescript-eslintdeclarestypescript <6.1.0and this repo is on 7.0.2; oxlint parses with its own engine and reads types throughoxlint-tsgolint. Knip rather than a hand-rolled scan because it resolves the import graph and finds the 48 symbols nothing outside their module touches.Floating promises are resolved by triage, not suppression:
voidwhere the callee handles its own failure,.catchwith a reason where a rejection leaves a visibly broken screen.Evidence
npx oxlint src/ts test scripts→ 77 findings, exit 1.After: the same command is silent, and
npm run lint(oxlint + knip) exits 0.No screenshot: the behaviour changes are error paths and hooks, not pixels.
Merge Danger
Door: two-way.
Every change is reversible by dropping the two new devDependencies and the config. The 48 floating-promise markers and the 9 new
.catchhandlers change failure handling, not the success path; the deleted symbols were referenced nowhere, and one of them (BRAND_SHELL_PATH) was restored after review when it turned out a build script reaches it through a cast.Blast Radius: developer workflow.
The pre-commit hook now runs typecheck, lint and tests on every commit — around ten seconds, and it blocks the commit on failure until
--no-verify. A fresh clone picks it up onnpm install. If avoidsite turns out to reject on real hardware it surfaces as an unhandled rejection, the same as today.