Review of #1147:
- A failed OCI migration precheck (no version in the remote's AppStream data, polkit refusing
remote-add, offline) now falls back to the bundle update instead of failing it; only errors
once the reinstall starts are reported. The ref must list exactly the selected version.
- `flatpak list` names a named installation `system (<name>)`; the parser keeps `<name>`, and
one packages::flatpak_scope builds the --user/--system/--installation= argument everywhere.
- A repository-managed Flatpak on a pinned or nightly track gets the "update with flatpak"
hint instead of a plain `flatpak update`, and status no longer offers a GitHub version for it.
- The migration refuses while the app runs; the origin check after the reinstall can't be
cancelled; is_flatpark_origin matches only `flatpark`; settings_install keeps its doc; the
no-op oci_migration Cargo features are gone.
Signed bundles (storytold/craft-common-actions#129): a signed bundle's origin has the release
key but no signature lookaside, which `flatpak build-bundle` can't record, so its first update
from the ArtCraft OCI repository fails with "no valid signatures". The updater then sets
--signature-lookaside=https://getartcraft.com/signatures on that origin once and retries;
any other origin or error is left alone.
Add the artcraft-oci remote with --if-not-exists so concurrent migrations
do not fail, let the --reinstall step finish once started because killing
flatpak-spawn does not stop the host transaction, and when the reinstall
fails after removing the ref, point to the .flatpak bundle on the releases
page.
* Add MaterialCraft to the launcher suite
* Stage MaterialCraft integration for its first published release
* Fix MaterialCraft website link and installer icon layout
* Add TextureCraft to the launcher suite
* Fix formatting of TextureCraft release fixture test
* Distinguish TextureCraft details headline from its card
* ci: run the test and web jobs through the shared gate
ci.yml ran its own test (Linux, Windows) and wasm jobs. Both now call craft-common-actions'
gate.yml, as the CI workflow rules ask (storytold/craft-common-actions#118):
- test: `cargo xtask ci` on Linux (fmt, clippy, tests, wasm check); clippy and tests on Windows.
- web: clippy for wasm32 and packaging/web/package.sh with trunk 0.21.14, in its own cache.
The gate saves caches from main only, so pull requests stop writing their own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ci: the test gate installs no cargo tools
Nothing in it runs nextest, and installing it fell back to cargo-binstall on both legs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ci: call the shared gate at main
storytold/craft-common-actions#119 is merged, so main's gate takes an empty packages list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(detect): sort MSI entries without a version last (#936)
msi_installs promised newest first but had the no-version arms swapped,
so an entry without a DisplayVersion came first and .next() took it as
the primary install.
* test(detect): check every arm of newest_first (#936)
The sort in this test never compares None against Some in that order, so flipping that arm still passed.
A dropped connection to Apple's CloudKit ticket lookup (Error 68) failed the release's verify step twice although the DMG was notarized and stapled. package.sh already retries stapler; verify.sh now does the same.
ci.yml still runs its own jobs, and the CI workflow rules (CLAUDE.md, AGENTS.md) keep additions
out of such files: moving the jobs into craft-common-actions is its own task. #1109 added
prefix-key and save-if to both rust-cache steps; this removes them. The dev profile change from
#1109 stays. The cache churn is raised as storytold/craft-common-actions#118.
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
PR runs saved their own Rust caches (up to 1.2 GB per OS, 7.1 GB in all), which only the PR
can read. With the repository over its 10 GB limit they evicted main's, so Windows legs often
found no cache and compiled every dependency (13 min test build). Only main saves now.
The dev profile drops dependency debug info and keeps line tables for workspace crates, as the
other craft apps do, which shortens Windows links and shrinks the cache. The cache prefix moves
to v1 because rust-cache never resaves an existing key.
Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* docs: record the Windows antivirus incident from Update all
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: tighten the incident note's claims and product name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
packages::find tried each bundle id across every record, so a system
io.tangencylabs.solidcraft beat a user ai.storyteller.solidcraft. Packages now say
whether they're a user install; find looks through the user ones first, current id
first within each scope.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1071 moved release checks to twelve minutes and changed this test to match, but detection runs on RESCAN_EVERY in app.rs, a separate timer that stayed at five. The test has failed on main since.
AGENTS.md (and CLAUDE.md where present) gets a CI workflows section: workflows only call
craft-common-actions at @main, with no other jobs; feature and fix PRs don't touch CI and
link or open a craft-common-actions issue (a PR only for a small fix that is safe for
every app and does not increase CI time); legacy jobs
aren't added to and move only as their own task, staying until a shared workflow runs them.