Repository navigation
v1.2.5: installers from winget manifests, recommendations, hardening - #1
Merged
Merged
Conversation
Direct catalog installs downloaded a file and executed it with no checks. - Downloads must be HTTPS on every redirect hop (loopback http stays for tests). - The file type comes from magic bytes (PE / MSI); anything else, such as an HTML page served by a broken link, is refused instead of executed. This also fixes Edge, whose fwlink serves an MSI that was saved and run as .exe. - Authenticode is checked with Get-AuthenticodeSignature: the status must be Valid and the signer must match the new `publisher` field, or the entry must be marked `unsigned`. Failures use the new `untrusted` error code and fall back to winget when available. - scripts/fetch-publishers.cjs reads signers from the PE certificate table or the MSI DigitalSignature stream and fills catalog.json (99 publishers, 8 unsigned). - Installer path is quoted and silentArgs are limited to a safe charset before reaching cmd.exe (kept for its UAC elevation and .msi association); MSI reboot-required exit codes 3010/1641 count as success. - Remote catalog JSON is validated and stripped of install fields. - shell:openExternal only accepts http(s) URLs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
…ndations
Links
- catalog.json is curation only: installUrl, fallbacks, silentArgs,
altProvider and the Authenticode publisher fields are gone.
- scripts/refresh-installers.cjs (npm run catalog:installers) builds
data/installers.json from the official winget index on
cdn.winget.microsoft.com (source2.msix -> versionData -> manifest):
installer URL, SHA256, type, silent/custom switches, success codes.
It prefers x64, per-user scope and ru-RU/en-US, and refuses a winget Id
whose package name does not match the catalog app.
- 113 apps download directly and run only after the SHA256 matches; Teams,
ImageGlass and Rufus (MSIX/portable only) go through winget; FileZilla
and RustDesk, absent from winget, are pinned to Chocolatey.
- Fixed winget Ids: hwmonitor pointed at HWiNFO, plus nine stale Ids.
- SHA256 replaces the Authenticode check (signature.ts and
fetch-publishers.cjs removed). Installer switches from manifests may
contain quotes, so the cmd.exe guard now rejects metacharacters and
unbalanced quotes instead of whitelisting characters.
- Removed the leftover debug logger that wrote a log file and posted
events to a localhost ingest endpoint in production builds.
Recommendations
- src/recommend.ts scores catalog apps from installed and starred ones:
stacks in data/related.json and install profiles ("goes with X"),
alternatives demoted once one is owned, category affinity and
editorial picks; cold start shows editor's picks.
- Home gets a "For you" shelf, the Recommended tab is ranked with a
reason per card, and the app modal lists "Often installed together"
and "Alternatives".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
- eslint.config.js had only ignores, and `--ext` is not supported by ESLint 9 flat config, so `npm run lint` checked nothing. Added typescript-eslint, react-hooks and per-folder globals; fixed the ten findings (dead imports and variables, a shadowed `crypto` in smoke.cjs). - Renderer runs with sandbox: true (the preload only needs contextBridge and ipcRenderer). window.open is denied and in-page navigation blocked; http(s) links go to the system browser. - `npm run build` creates dist-electron before copying the Scoop bootstrap script into it, so it works in a fresh clone. - Recommendation reasons get their own one-line row on cards instead of replacing the uppercase category label, which wrapped over 4-5 lines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
- ci.yml: lint, typecheck, catalog checks, unit/integration tests and the main + renderer build on every push to main and every PR. - refresh-installers.yml: weekly (and on demand) runs `npm run catalog:installers` and opens a PR with the new URLs, hashes and switches, so pinned downloads do not go stale between releases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
promo/ holds the 40 s 1080p promo: promo.html (scenes as a pure render(t) function, so frames render deterministically), capture.cjs (real renderer screenshots with window.getbox stubbed from data/*.json), render.cjs (frame-by-frame into ffmpeg) and music.py (synthesised ambient bed). Rendered video, audio and captured frames are gitignored; README lists the steps to rebuild them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
shorts.html: 30 s, 1080x1920, 60 fps, cut to a 128 bpm grid — dialog pile-up hook, logo drop, catalog counter, click-to-install demo, icon storm, recommendations, trust badges, CTA. music-shorts.py synthesises the matching track (filtered intro, riser, drop on bar 3, crashes on the scene hits). render.cjs now takes the page and reads its size, fps and duration from window.FORMAT, so it renders both formats. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
Bump version to 1.2.5 and add CHANGELOG.md covering the installer, recommendation, security and tooling changes since 1.2.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully 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.
Что внутри
Подробности по пунктам — в
CHANGELOG.md.Установка без ручных ссылок
catalog.jsonтеперь только витрина. Способ установки берётся изdata/installers.json, которыйnpm run catalog:installersгенерирует из официального индекса winget (cdn.winget.microsoft.com): URL, SHA256, тип, ключи тихой установки..exe).hwmonitorуказывал на HWiNFO). Генератор сверяет название пакета с каталогом.Рекомендации
src/recommend.ts+data/related.json: полка «Для вас», ранжированная вкладка «Рекомендуем» с причиной на каждой карточке, блоки «Часто ставят вместе» и «Альтернативы» в карточке программы.Безопасность и инструменты
sandbox: true, запрет новых окон и переходов,openExternalоткрывает толькоhttp(s).127.0.0.1:7367.ci.yml) и еженедельное обновлениеinstallers.json(refresh-installers.yml).npm run buildработает в свежем клоне.promo/, готовые видео в git не попадают.Проверка
tsc(main и renderer),verify-catalog,smoke(57),test-download(9),test-resilience,test-app-fullи сборка проходят локально.installers.json: 107 рабочих, 0 битых, 6 не проверить с CI-адреса (SourceForge, Launchpad, hwinfo.com).sandbox: true.После слияния
v1.2.5, на Windows собратьnpm run distи приложитьGetBox-1.2.5-portable.exeк релизу.🤖 Generated with Claude Code
https://claude.ai/code/session_019LtWxNVyWyutDLyX8cWQFC
Generated by Claude Code