An installed title's version line now reads `0.1 → 0.3` where the catalog has moved on, so a card answers both questions somebody brings to it: what is installed, and is there anything better. Which version is installed was already recorded — `state.json` has always carried it — what was missing was anywhere to act on it. The card leads with Play (or Open, for a hosted title) and puts the rest behind a ⋮ button: Upgrade, which fetches whatever the catalog now has, and Uninstall. Upgrade stays visible while disabled rather than appearing and disappearing — a menu whose items come and go makes a person hunt for the one they used last time, and greyed out already says "not now". Playing stays the headline even with an upgrade waiting: the build on the disk still runs, and wanting to play it is not the same as wanting to wait for a download. The menu is a `<details>`, so its open state is the DOM's and the keyboard needs no teaching. Closing it on an outside click is the grid's job, not a card's: cards are rebuilt on every render, so a listener per card would be a listener per render. Package names lose their spaces — `WarpEngineClient-2.3.0-arm64.dmg` — because a space in a release asset is a space in every curl, script and shell command that touches it. Set per target rather than globally: nsis and portable would otherwise resolve to the same .exe name and overwrite each other. `productName` is untouched, so the app is still called WarpEngine Client where a person sees it — in the Dock and in /Applications. Tested on a sandbox store by rewriting one state record to claim an older build, which is what the engine actually compares: the window then offered `Upgrade:on` for that title and `Upgrade:off` for the current one, and pressing it took the record from 0.1 to 0.2 with the old payload removed first. The self-test asserts that pairing on every installed card, because a closed menu photographs identically whether or not its items are right. In Hungarian the catalog refresh and the new Upgrade both wanted "Frissítés"; the refresh is an icon with a tooltip, and a tooltip can afford to say *Katalógus frissítése*. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
85 lines
2.3 KiB
JSON
85 lines
2.3 KiB
JSON
{
|
|
"name": "warp-engine-client",
|
|
"productName": "WarpEngine Client",
|
|
"version": "2.3.0",
|
|
"description": "Graphical client for WarpEngine stores: install a catalog into your own application menu.",
|
|
"license": "MIT",
|
|
"author": "Teletype Games <games@teletype.hu>",
|
|
"homepage": "https://git.teletypegames.org/stores/warp-engine-client",
|
|
"main": "build/main/main.js",
|
|
"engines": {
|
|
"node": ">=22"
|
|
},
|
|
"scripts": {
|
|
"build": "tsc -p tsconfig.build.json && node scripts/build-assets.mjs",
|
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
"lint": "eslint .",
|
|
"lint:fix": "eslint . --fix",
|
|
"start": "npm run build && electron .",
|
|
"smoke": "npm run build && node build/scripts/SmokeTest.js",
|
|
"uitest": "npm run build && electron . --selftest",
|
|
"dist": "npm run build && electron-builder",
|
|
"dist:mac": "npm run build && electron-builder --mac",
|
|
"dist:win": "npm run build && electron-builder --win",
|
|
"dist:linux": "npm run build && electron-builder --linux"
|
|
},
|
|
"devDependencies": {
|
|
"@types/node": "^26.2.0",
|
|
"electron": "^43.4.0",
|
|
"electron-builder": "^26.15.3",
|
|
"esbuild": "^0.28.2",
|
|
"eslint": "^10.8.1",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.67.0"
|
|
},
|
|
"build": {
|
|
"appId": "org.teletypegames.warpstore.gui",
|
|
"productName": "WarpEngine Client",
|
|
"files": [
|
|
"build/**/*",
|
|
"package.json"
|
|
],
|
|
"mac": {
|
|
"category": "public.app-category.games",
|
|
"target": [
|
|
"dmg",
|
|
"zip"
|
|
],
|
|
"artifactName": "WarpEngineClient-${version}-${arch}-mac.${ext}"
|
|
},
|
|
"dmg": {
|
|
"artifactName": "WarpEngineClient-${version}-${arch}.${ext}"
|
|
},
|
|
"win": {
|
|
"target": [
|
|
"nsis",
|
|
"portable"
|
|
]
|
|
},
|
|
"nsis": {
|
|
"artifactName": "WarpEngineClient-Setup-${version}-${arch}.${ext}"
|
|
},
|
|
"portable": {
|
|
"artifactName": "WarpEngineClient-Portable-${version}-${arch}.${ext}"
|
|
},
|
|
"linux": {
|
|
"category": "Game",
|
|
"target": [
|
|
"AppImage",
|
|
"deb"
|
|
]
|
|
},
|
|
"appImage": {
|
|
"artifactName": "WarpEngineClient-${version}-${arch}.${ext}"
|
|
},
|
|
"afterPack": "scripts/after-pack.js"
|
|
},
|
|
"allowScripts": {
|
|
"electron@43.4.0": true,
|
|
"esbuild@0.28.2": true
|
|
},
|
|
"warpEngine": {
|
|
"registryUrl": "https://teletypegames.org/api/stores"
|
|
}
|
|
}
|