Author SHA1 Message Date
enricobuehler 3e5b1648ae Merge pull request 'Refresh bun.lock onto plugin-kit 0.4.3, so 0.1.2 can actually be released' (#4) from chore/lockfile-kit-0.4.3 into main
CI / build (push) Failing after 11m42s
CI / publish (push) Skipped
2026-08-19 14:16:34 +00:00
enricobuehler ac4426eda6 chore: refresh bun.lock onto plugin-kit 0.4.3, so 0.1.2 can actually be released
CI / build (pull_request) Successful in 19s
CI / publish (pull_request) Skipped
0.1.2 moved the dependency range to `^0.4.2` but the lockfile was never
regenerated: it still carried `^0.4.1` and resolved kit 0.4.1. Both CI jobs run
`bun install --frozen-lockfile`, which fails outright when the lock disagrees
with package.json — so the build gate and the publish job would both have died
on a `v0.1.2` tag.

The lock now resolves 0.4.3. The registry has no 0.4.2 at all: that tag's
publish never landed, and rather than move a pushed tag the kit was cut as
0.4.3, which this range accepts and which carries the same `findLocalArtFile`
cover-art scan 0.1.2 was written against.

Gates on the refreshed tree: typecheck clean, 10/10 tests, biome clean, bundle
builds both entry points.
2026-08-19 16:14:56 +02:00
enricobuehler 88e4cc84ae Merge pull request '0.1.2 on kit 0.4.2 — the cover-art scan a host cannot pick up any other way' (#3) from chore/kit-0.4.2-cover-art-names into main
CI / build (push) Failing after 19s
CI / publish (push) Skipped
Reviewed-on: #3
2026-08-18 20:22:36 +00:00
enricobuehler 50316d3fdf chore: 0.1.2 on kit 0.4.2 — the cover-art scan a host cannot pick up any other way
CI / build (pull_request) Failing after 22s
CI / publish (pull_request) Skipped
plugin-kit 0.4.2 teaches `findLocalArtFile` the names and layouts Steam
actually uses today: `library_capsule.jpg` beside `library_600x900.jpg`,
`header.jpg` beside `library_header.jpg`, and the `<appid>/<name>` layout
that holds 623 of the 779 appids on the reference cache. Measured there,
per-appid art found locally goes portrait 25 -> 328 and header 86 -> 716,
with no appid losing art it already had.

The range moves to ^0.4.2 rather than resting on ^0.4.1 admitting it. A
host's plugins dir has its own bun.lock pinning the NESTED kit copy, so
`bun add @punktfunk/plugin-steam@0.1.2` under the old range is free to
keep the 0.4.1 it already has — which is exactly the state found on the
.41 box, where patching the hoisted kit did nothing because the plugin
resolves its own nested one.

Nothing in this repo's own source changes: the kit is external at build
time, so this is the version bump that lets the fix travel.
2026-08-16 08:46:19 +00:00
enricobuehler 79dd5893ae Merge pull request 'The launcher tiles carry the Steam mark' (#2) from feat/launcher-icon-token into main
CI / build (push) Successful in 26s
CI / publish (push) Successful in 15s
2026-08-12 22:43:12 +00:00
enricobuehler c8031897e4 feat: the launcher tiles carry the Steam mark
CI / build (pull_request) Successful in 54s
CI / publish (pull_request) Skipped
Both tiles this plugin publishes — Big Picture and the desktop client —
now name their brand mark with `icon: "steam"`, so every client draws the
real logo instead of the launcher's name on a flat accent face.

A token, not art, and the distinction is the whole point: a launcher's own
icon is square, every client cover-crops a 2:3 poster, and that crop turns
a mark into a strip — which is why these tiles deliberately shipped no
artwork at all. Naming the mark instead of sending it lets each client draw
the vector it already bundles (punktfunk assets/launcher-icons), letterboxed
at whatever size its tile happens to be and in the tile's own ink. A client
that ships no Steam mark, or one too old to know the field, falls back to
the named accent face — the previous design, unchanged.

Both tiles carry the same token because they open the same client into
different front ends; their titles are what tell them apart.

The dependency moves to plugin-kit ^0.4.1 because it has to.
`ProviderEntry.icon` has existed in the kit's source since punktfunk
f62a48d4, but that commit never bumped the version and the kit had cut
0.4.0 the day before — so the registry's newest kit had no such field, and
this plugin's `tsc --noEmit` gate rejected the property outright. That is
the reason the token's producers never shipped with the token: they could
not be committed against a kit that had nothing to fill.
2026-08-13 00:38:28 +02:00
enricobuehler 5e714e475c Merge pull request 'Drop the @punktfunk/host dependency this plugin never imports' (#1) from chore/drop-spurious-sdk-dep into main
CI / build (push) Successful in 29s
CI / publish (push) Skipped
Reviewed-on: #1
2026-08-08 16:16:48 +00:00
enricobuehler 9358135b54 fix(deps): drop the @punktfunk/host dependency this plugin never imports
CI / build (pull_request) Successful in 16s
CI / publish (pull_request) Skipped
This plugin imports nothing from the SDK — everything it uses comes from
`@punktfunk/plugin-kit`, which already declares `@punktfunk/host` as a
peerDependency. Listing it here as a runtime dependency was redundant, and the
redundancy had a cost.

It is what stops an SDK fix from ever reaching an installed plugin. With the SDK
declared per-plugin, bun honours each plugin's own locked resolution and gives it a
PRIVATE NESTED COPY under `node_modules/@punktfunk/plugin-<x>/node_modules/`, which
then shadows the shared copy at the root of the operator's plugins tree. Measured on
a live host 2026-08-08: publishing `@punktfunk/host@0.1.3` — the release that lets a
library scanner register `category`, so it stays out of the console nav — reached the
tree root and still left five nested 0.1.2 copies, so every plugin kept importing the
old SDK and the fix appeared to do nothing.

Dropping it leaves the kit's peer range as the single source of truth, so there is one
hoisted copy that the host can actually keep current.

Nothing about the runtime changes: bun installs the kit's peer, and the SDK resolves
exactly as before — verified here (host 0.1.3 resolved, typecheck, tests, lint and
build all green).

Version bumped to 0.1.1; publishing is what carries the change to operators.
2026-08-08 14:13:39 +02:00
enricobuehler d24b5bf4a8 chore: plugin-kit 0.3.1
CI / publish (push) Successful in 22s
CI / build (push) Successful in 20s
Matches what the release was verified against. The kit's headline 0.3.1 fix (the
read-only SQLite reader never opening a database on Linux) does not touch this
plugin — Steam's library is VDF text, and nothing here uses the sqlite helper.
The second fix does matter, because it is this plugin's release gate:
`parity --compare` set a non-zero exit code and runPluginCli overwrote it with 0,
so a red parity run always exited 0.

The caret range already allowed 0.3.1; bun.lock pinned 0.3.0 exactly.

Gates: biome clean, tsc clean, 10/10 tests, bundle builds.

Parity against a live host on .21 (Steam installed, 10 appmanifests of which 5
are real games — the rest are tools the kit filters), this plugin unregistered so
the host was still on its built-in scanner:

    scan:   present: 5 games, 1 launcher entries
    parity: OK - 5 entries identical  (+1 expected steam:big-picture tile)
2026-08-08 01:15:54 +02:00
3 changed files with 11 additions and 7 deletions
+3 -4
View File
@@ -5,8 +5,7 @@
"": {
"name": "@punktfunk/plugin-steam",
"dependencies": {
"@punktfunk/host": "^0.1.2",
"@punktfunk/plugin-kit": "^0.3.0",
"@punktfunk/plugin-kit": "^0.4.2",
"effect": "4.0.0-beta.99",
},
"devDependencies": {
@@ -47,9 +46,9 @@
"@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="],
"@punktfunk/host": ["@punktfunk/host@0.1.2", "https://git.unom.io/api/packages/unom/npm/%40punktfunk%2Fhost/-/0.1.2/host-0.1.2.tgz", { "optionalDependencies": { "undici": "^7.0.0" }, "peerDependencies": { "effect": "^4.0.0-beta.98" }, "bin": { "punktfunk-scripting": "dist/runner-cli.js" } }, "sha512-mZXIocLWAeXXl3nU5YmVJp1rp74ZXhphTI67nWnqkqXZTxUsNHE9GG5BQvclI0TCjnVn+bx95zi/3w0kTIMKzw=="],
"@punktfunk/host": ["@punktfunk/host@0.1.3", "https://git.unom.io/api/packages/unom/npm/%40punktfunk%2Fhost/-/0.1.3/host-0.1.3.tgz", { "optionalDependencies": { "undici": "^7.0.0" }, "peerDependencies": { "effect": "^4.0.0-beta.98" }, "bin": { "punktfunk-scripting": "dist/runner-cli.js" } }, "sha512-WpS0a3yavoqDBA3V8xSZW298HRUzF8TFuwSKf3hV1RFHZ2lM6V77E6mFJTej3p+B1wnNWzphtlY+WgcsUx/34A=="],
"@punktfunk/plugin-kit": ["@punktfunk/plugin-kit@0.3.0", "https://git.unom.io/api/packages/unom/npm/%40punktfunk%2Fplugin-kit/-/0.3.0/plugin-kit-0.3.0.tgz", { "peerDependencies": { "@punktfunk/host": "^0.1.2", "effect": "^4.0.0-beta.98", "react": "^19.2.0" }, "optionalPeers": ["react"] }, "sha512-BoDSfQPzzRBDUHB1wq61oOOHNrEJwzDC2Tij2sJQ8cpSlVn+6HmRwdczbrbGaYxKOqatiu0rd2iMn955L8vurw=="],
"@punktfunk/plugin-kit": ["@punktfunk/plugin-kit@0.4.3", "https://git.unom.io/api/packages/unom/npm/%40punktfunk%2Fplugin-kit/-/0.4.3/plugin-kit-0.4.3.tgz", { "peerDependencies": { "@punktfunk/host": "^0.1.3", "effect": "^4.0.0-beta.98", "react": "^19.2.0" }, "optionalPeers": ["react"] }, "sha512-WZGKmkm3qthFGdCQuB9dqh1YpPCJN9SBiWd76FdBS4mp9Uh/rYiT3DSWLXr0hXPYPzX7E1Dt/oD6hd1SemGUSA=="],
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+2 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@punktfunk/plugin-steam",
"version": "0.1.0",
"version": "0.1.2",
"private": false,
"type": "module",
"description": "Punktfunk plugin: adds your installed Steam games and non-Steam shortcuts to the host library, with their art and Big Picture.",
@@ -36,8 +36,7 @@
"check": "bunx biome check ."
},
"dependencies": {
"@punktfunk/host": "^0.1.2",
"@punktfunk/plugin-kit": "^0.3.0",
"@punktfunk/plugin-kit": "^0.4.2",
"effect": "4.0.0-beta.99"
},
"devDependencies": {
+6
View File
@@ -162,6 +162,10 @@ export const installedApps = (
* `steam_ui` is the one launch kind with two values, because Steam genuinely has two UIs. The host
* turns them into `steam -gamepadui` / `steam` (Linux) or the matching `steam://open/…` URI
* (Windows) — the plugin never constructs a command line (D1).
*
* Both carry `icon: "steam"` — the same mark, because they open the same client into different
* front ends; their titles are what tell them apart. The token names a mark each client draws from
* the vector it bundles rather than sending art, which a 2:3 cover-crop would reduce to a strip.
*/
export const launcherEntries = (cfg: Config): ProviderEntry[] => {
const out: ProviderEntry[] = [];
@@ -171,6 +175,7 @@ export const launcherEntries = (cfg: Config): ProviderEntry[] => {
external_id: "big-picture",
title: "Steam Big Picture",
role: "launcher",
icon: "steam",
launch: { kind: "steam_ui", value: "bigpicture" },
platform: "PC",
});
@@ -180,6 +185,7 @@ export const launcherEntries = (cfg: Config): ProviderEntry[] => {
external_id: "desktop",
title: "Steam",
role: "launcher",
icon: "steam",
launch: { kind: "steam_ui", value: "desktop" },
platform: "PC",
});