25 Commits
Author SHA1 Message Date
Tarun Kumar 6ec5337ddb fix(compat): bound macOS alias regex and correct Ghost of Yōtei OS to linux 2026-10-09 19:57:05 +05:30
Tarun Kumar cf44cb845d fix(compat): enforce strict qualification at intake and add resilient status extraction 2026-09-11 16:36:24 +05:30
Tarun Kumar 92c4f8bcd7 fix(compat): harden workflow expressions, auto-merge idempotency, and game alias matching 2026-09-10 16:04:16 +05:30
Tarun Kumar 2a0d46d48d fix(deploy): verify cache ancestry, enforce cross-alias report validation, and harden auto-merge 2026-09-10 15:34:27 +05:30
Tarun Kumar 858c066dd0 fix(compat): harden report PRs, decouple seed drift, and optimize deploys 2026-09-10 15:18:30 +05:30
Tarun Kumar 93a81547f3 feat(compat): add /trusted command, automated PR merging, and decoupled deploy 2026-09-10 14:38:56 +05:30
Tarun f5822a85c6 fix(compat): resolve report anomalies, add Bye Sweet Carole, and harden sync filter (#256) 2026-09-09 01:51:53 +05:30
Tarun 5036979669 feat(updates): add lightweight update metadata feed for launcher auto-update checks (#237)
- Add scripts/lib/updates-feed.mjs to generate /data/updates.json for Qt6 desktop launcher
- Extract short commit SHA, published date, direct asset download URLs, and cleaned changelog
- Integrate with fetch-github-data.mjs with offline and rate-limiting resilience
- Add UpdateFeed and UpdateAsset TypeScript interfaces to src/lib/github.ts
- Add 15 unit tests covering parsing priorities, asset filtering, and fallback behavior
2026-09-04 04:51:17 +05:30
Tarun 30b9d19d9d fix(sync): harden deduplication against older and superseded issues (#236) 2026-09-04 04:40:07 +05:30
Tarun 78f3940b13 feat: add /setstatus command and improve status normalization with regex fallbacks (#137) 2026-08-25 16:05:24 +05:30
Tarun Kumar 229b2b0ef5 fix(sync): require editDate > report.testedDate for updated-existing detection 2026-08-25 00:09:42 +05:30
Tarun Kumar 9a0df59ae8 feat(sync): add upstream edit detection with GraphQL lastEditedAt and updated-existing labeling 2026-08-24 15:09:33 +05:30
Tarun Kumar 1dcda91a36 fix(hardening): fix markdown entity escaping, enrichment starvation, and frontmatter coercion
- Markdown: remove escapeHtml in parseInline to prevent React double-escaping entities in JSX
- Pipeline: prioritize unattempted games over noStore retries in import-games.mjs
- Frontmatter: only coerce known numeric fields (score) to prevent numeric titles/versions from failing string validation
- Workflows: pass step outputs through env in compat-convert.yml to prevent bash script injection
- UI & State: avoid in-place sorting mutation in GamePage and calculate remaining contributors dynamically
- Performance: deduplicate concurrent in-flight fetchContributorCount requests with in-memory caching
- Cleanup: delete unused findGame, timeAgo, and markdownToText dead code
- Security: bump nanoid via npm audit fix
2026-08-18 06:41:12 +05:30
Tarun Kumar 98340a958b fix(audit): resolve security gaps, sitemap canonicalization, and pipeline bugs
- Security: restrict /compat and /set* comment workflows to maintainers (OWNER, MEMBER, COLLABORATOR)
- Sitemap: use siteGameKey for canonical URLs matching internal routes
- Sync: pass GITHUB_TOKEN to upstream fetchCandidates to prevent 60 req/hr rate limiting
- Intake: guard slug derivation against missing title in issue-to-compat.mjs and escape frontmatter strings
- Forms: whitelist known template group headings in parseIssueBody to preserve user markdown headings
- Accuracy: fetch true contributor total from GitHub API pagination headers in RepoStats
- Cleanup: delete unused ReportCard component and rename markdown.tsx to markdown-view.tsx
- Content: fix title and filename typos in The Thing and GTA Vice City reports
2026-08-18 05:22:55 +05:30
Tarun Kumar 6e96441162 refactor(compat): enforce one verified report per (game, OS)
Replace majority-vote aggregation with the single verified report's status:
the intake pipeline now keeps exactly one report per (game, OS), keyed by
title ID so region variants and punctuation-differing titles dedup against
the same report. validate-compat.mjs fails the build on duplicates,
issue-to-compat.mjs retires stale same-(game, OS) reports, and the site and
export aggregations throw instead of silently voting. Retire the duplicate
Demon's Souls and GTA III: DE reports and rebuild compat-index.json.
2026-08-18 02:48:23 +05:30
Tarun Kumar 9d0293619c feat: add /setos /setid /settitle overrides for compat mirrors
Let a maintainer fix fields an issue can't express cleanly (OS that
doesn't normalize, missing/Unknown PPSA serial, wrong title) by
commenting /setos /setid /settitle on the mirror issue. The command
records the value in a ## Overrides section of the mirror body, which
the /compat conversion prefers over parsed fields and which survives
poller refreshes. Failure messages are also posted back on the issue
as comments so the reason is visible without reading the workflow log.
2026-08-17 23:55:31 +05:30
Tarun Kumar 71cb83c9f0 compat: skip mirroring when a report for the same game+OS is as new
Reports are per (game, OS) and record ONE source issue, so converting a
newer upstream issue for the same game overwrote the older one's `> Source:`
marker — the older issue then looked unconverted and got re-mirrored. Compare
dates instead of issue numbers: only mirror an issue when no report for its
(game, OS) is already as new or newer, with an exception for same-run batches
(two or more issues for one game = fresh batch, mirror all).
2026-08-12 22:23:41 +05:30
Tarun Kumar b7ac2a7453 compat: mirror issues + /compat per-game PRs, screenshots on reports
Replace the standing report PR (which piled every converted game into
one branch) with an issue-driven flow: the poller mirrors each
unconverted KytyPS5 game-status issue here as a `compat`-labeled issue,
and commenting /compat converts one mirror into its own per-game report
PR (updated in place on re-runs, mirror closed on success).

Screenshots from the issue now travel with their report: the converter
copies the `<img>` URLs out of the mirrored issue into a `screenshots`
frontmatter array, the game page hotlinks the latest accepted report's
images (nothing is downloaded into the repo), and the validator
requires each to be an http(s) URL on a report with a linked source.
The /getss download flow is removed.

README and the contributing page document the /compat workflow.
2026-08-12 03:42:03 +05:30
Tarun Kumar 83a0e0ffd4 data: split compatibility payload into slim index + per-game detail files
The site no longer ships raw report markdown to every visitor. The site-compat
export now writes a slim tested-games index with precomputed statuses (fetched
by home and the compatibility page), one small detail file per game (fetched
only by game pages), and a committed build-time seed. The client never parses
report markdown or aggregates statuses; the JS parser twin in the export lib is
kept in sync with the TS parser by a parity test. The game page falls back to
the bundle snapshot for 404s and legacy slug links, content-only deploys keep
working via the regenerated overlay, and report-sync PRs now carry a fresh
seed.
2026-08-09 04:12:21 +05:30
Tarun Kumar 424e4acf41 compat: switch to the Game Emulation Status ladder and migrate all reports
Adopt the KytyPS5 Game Emulation Status Report statuses (doesnt-boot →
logo → main-menu → in-game) end to end: the sync workflow now polls
KytyPS5 game-status issues into report PRs instead of mirroring local
issues, and the GUI export maps 1:1 to the new ladder. Every report's
status was re-derived from its source issue (bodies + retest comments)
rather than mechanically mapped from the old 4-tier values; retest-driven
statuses carry an updated build/date and a retest note.
2026-08-09 03:20:20 +05:30
Tarun Kumar 6b2beb4616 compat: 4-tier ladder (nothing → boots → playable → perfect), hide untested games
Reduce the status ladder from 6 tiers to the community 4-tier system with the
new colors/definitions (grey Nothing, red Boots, orange Playable, green
Perfect). Existing reports migrate ingame → playable, and old 6-tier issue
statuses remap on /compat intake. Untested games are hidden from the
compatibility list and game page instead of showing grey.

Also ships the earlier uncommitted pipeline work together so the deploy is
coherent: runtime compat JSON (content-only deploys without rebuilds), split
deploy/CI fast paths, and locally-hosted carousel screenshots.
2026-08-08 15:12:22 +05:30
Tarun Kumar a49d6b441d chore: remove all external-project references, standalone README
Strip every mention of the external reference project from code comments,
scripts and workflows, and rewrite the README as a standalone project doc
(functionality, building, derived data, compatibility database, games
database, automation, deployment) with no outside references except the
KytyPS5 emulator itself.
2026-08-08 01:18:01 +05:30
Tarun Kumar 9bfd744280 data: restore Neptunia ReVerse cover; stale PSN concepts stay retriable
Neptunia ReVerse's US concept (10002152) returns null from the PlayStation
Store, which permanently locked it out of enrichment (noStore + enriched)
— hence the letter avatar next to five real covers. Complete its entry
manually with the working EU concept's metadata (cover, publisher, genres)
and fix the importer so a null concept marks a game noStore but NOT
enriched, so later runs retry it instead of leaving it stuck; mergeExisting
now also preserves manual flags on unenriched entries. Verified via a
simulated upstream refresh that Neptunia's cover survives the merge.
2026-08-08 01:10:39 +05:30
Tarun Kumar 9150fe2ae8 compat: per-OS statuses per game; "Any" shows the best of any test done
Every stored game now has per-OS results instead of one mixed aggregate:
reports carry a required os tag (one report per game+OS), "Any" shows the
best status across the per-OS majorities (playable on Windows + ingame on
macOS → Playable on Any, Playable on Windows, Ingame on macOS), and each
OS filter/stats/game-page slot reflects only that OS's reports. Seed data
is retagged to game-os.md: the 5 screenshot games are Windows (the README
states Windows is the primary, most-tested platform) and Dreaming Sarah is
Linux (PR #146); macOS stays grey until a macOS test is filed. Conversion
workflow now requires --os and names files by game+os so re-running after
verification overwrites that OS's status; the GUI export's top-level status
mirrors the site's best-across-OS rule.
2026-08-08 00:57:13 +05:30
Tarun Kumar ea68df0bb4 Initial site import: KytyPS5 website
Official site for KytyPS5 — React 19 + Vite + TypeScript + Tailwind v4.
Pages: Home, Download, Documentation, FAQ, Contributing, About, 404,
Compatibility with per-game report pages. Includes GitHub data fetching,
the GUI-compatible compatibility JSON export, the issue-template report
pipeline (template + conversion workflow), CI and GitHub Pages deploy.
2026-08-08 00:04:02 +05:30