365 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 61f54f2739 Release 0.11.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.11.1
2026-10-31 01:53:58 -04:00
Dylan M. Taylor f3ac5c265d Revert "feat(install): one permission prompt for an Update all of all-users apps on Windows (#974)" (#1077)
This reverts commit b827fed74a.
2026-10-31 01:31:34 -04:00
Dylan M. Taylor e13bc89e89 Merge pull request #1074 from aiongg/docs-tidy
docs: tidy AGENTS.md, CI comment and attribution
2026-10-31 01:07:01 -04:00
aiongg ff8f098743 docs: tidy AGENTS.md, CI comment and attribution 2026-10-31 04:17:26 +00:00
Brandon ThomasandClaude Opus 5.5 a5ef79f379 Release 0.11.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.11.0
2026-10-30 23:26:28 -04:00
Dylan M. Taylor 5cd3bacdbe Merge pull request #1072 from VoiceLessQ/fix/main-ci-tests
test: fix the two tests failing on main (#1071, #974)
2026-10-30 23:22:20 -04:00
Dylan M. Taylor 21615e80fc Merge branch 'main' into fix/main-ci-tests 2026-10-30 23:22:00 -04:00
Dylan M. Taylor dce0a77083 Merge pull request #924 from SusieeTheLinuxUser/fix/881-flatpak-user-over-system
Detection: a user Flatpak install is read before a system one (#881)
2026-10-30 23:17:43 -04:00
Dylan M. Taylor 0032247ecc Merge pull request #1073 from storytold/feat/integrate-flatpak-system-update-406
fix(update): integrate system Flatpak self-update (#406)
2026-10-30 23:17:01 -04:00
Dylan M. Taylor 367c35981b test(ui): keep app detection cadence separate 2026-10-30 23:09:52 -04:00
SusieeTheFemboyandClaude Opus 5.5 677b9047ed Detection: a user Flatpak wins over a system one under any app id
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>
2026-10-31 04:04:02 +01:00
SusieeTheFemboy 55842dd91a Merge remote-tracking branch 'origin/main' into fix/881-flatpak-user-over-system 2026-10-31 04:00:55 +01:00
Dylan M. Taylor 8b9dc209dc fix(update): pin merged Flatpak self-update support 2026-10-30 22:58:06 -04:00
Dylan M. Taylor 93de4a9008 fix(update): use system Flatpak bundle self-update 2026-10-30 22:50:36 -04:00
VoiceLessQ 1f5aed9f66 test(native): a shared call only counts on Linux and Windows
failed_in_shared_call is false on other systems, but the test from #974 expected true everywhere, so the FreeBSD x86_64 job has failed since.
2026-10-31 00:35:26 -02:00
VoiceLessQ c5586148e3 test(ui): the installed-apps rescan still waits five minutes
#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.
2026-10-31 00:35:26 -02:00
Dylan M. Taylor f74bb9d1a6 AGENTS.md: CI workflows only call craft-common-actions at @main
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.
2026-10-30 22:15:19 -04:00
VoiceLessQ ae5ac6aef7 fix(native): cap a GitHub rate-limit wait at one hour (#782)
An absurd x-ratelimit-reset or retry-after stopped the API until restart
and went to the footer as it came. GitHub's quota refills within the hour.
2026-10-30 22:14:18 -04:00
VoiceLessQ 829e2c49c8 fix(logging): never open a log path that's already there (#782)
The mode only applies to a new file, so a path recreated between rotation
and the open would keep its owner's permissions. create_new refuses it.
2026-10-30 22:13:54 -04:00
VoiceLessQ e673dab14f fix(logging): only the user can read the log file (#782)
The log names the user's folders, so create it with mode 0600 on Unix.
Logs from older runs keep their mode until they rotate out.
2026-10-30 22:13:54 -04:00
Dylan M. Taylor 7da8ef2dec fix(ui): reduce automatic release polling 2026-10-30 22:13:36 -04:00
VoiceLessQ 02a99f01a1 fix(ui): find the host's CJK fonts inside the Flatpak sandbox (#620)
Flatpak mounts the host's /usr/share/fonts at /run/host/fonts and
/usr/local/share/fonts at /run/host/local-fonts (add_font_path_args in
flatpak's common/flatpak-run.c). The sandbox's own /usr/share/fonts holds
only the runtime's fonts, so the Flatpak launcher found no Chinese or
Japanese font and fell back to English.

Each system candidate is now followed by its /run/host path, for the same
family. User fonts need no twin, since both manifests grant
--filesystem=home. PhotoCraft fixed the same lookup in
storytold/photocraft#1204.
2026-10-30 22:02:02 -04:00
JeremyandClaude Opus 5.5 73a824c4dc feat(versions): go back to an older version of a launcher-installed AppImage
An AppImage the launcher installed is renamed into place whole, and the old file is removed
only after that, the same as an update. Going back to a version chosen by name now takes
that route too (Downgrade::KeepOldCopy), with no older package fetched first. It needs the
launcher's own record of an AppImage: a user's own AppImage, an unrecorded one and the
tarball install (whose bin and share swap one at a time) are still refused.

Not run on a real Linux desktop; the linux module only compiles there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 22:01:23 -04:00
VoiceLessQ 014422ad15 fix(packaging): declare the launcher's real window class in its .desktop file (#1026)
The window sets its app id (Wayland) and WM_CLASS (X11) to
ai.storyteller.artcraft-launcher, but the entry said
StartupWMClass=artcraft-launcher. Desktops that find the entry by its
file name were fine; an entry under another name (AppImageLauncher,
Gear Lever, a hand-made one) never matched, so the dock showed a
generic icon and the launcher could not be pinned.
2026-10-30 22:00:18 -04:00
VoiceLessQ d95ae4b5be fix(install): name the code in the pkexec 127 error
127 also covers other pkexec errors and a wrapped installer exiting 127, so
say which code came back and list the likely causes instead of naming one.
2026-10-30 21:58:07 -04:00
VoiceLessQ cbc6fe60d9 fix(install): stop reading pkexec exit 127 as a cancel (#737)
pkexec exits 126 when the prompt is dismissed. 127 is its default code and
also covers not authorized and no authentication agent, so a desktop with no
polkit agent ended an install as a quiet "Install cancelled" with no prompt.
2026-10-30 21:58:07 -04:00
VoiceLessQ 361e3e82f4 fix(http): read long release lists up to a 16 MiB cap (#1021)
get_api shared the 4 MiB limit for small answers, and SolidCraft's list of 67
releases is 5.4 to 6.5 MB. The request failed every time, so Choose version
showed an error and no versions. Other small requests keep 4 MiB.
2026-10-30 21:57:43 -04:00
VoiceLessQ e1ada85d02 test(ui): compare the table date with its whole width
The check for more than 110 px passed at any column from 111 to 129 px, where
the date is still cut. Lay out the same text and require its full width.
2026-10-30 21:55:09 -04:00
VoiceLessQ c911793006 fix(ui): widen the table's released column so dates show whole (#1038, #754)
Dates ran to 130 px in Brazilian Portuguese and 108 px in Chinese and
Japanese, past the 104 px column, and were cut with an ellipsis. The
column is now 132 px; Author gives up 16 px ("Tangency Labs" still fits)
and the app column 12 px.
2026-10-30 21:55:09 -04:00
SusieeTheFemboy 4cea3dea9f Merge remote-tracking branch 'origin/main' into fix/881-flatpak-user-over-system
# Conflicts:
#	crates/native/src/detect.rs
2026-10-31 02:34:54 +01:00
Dylan M. Taylor effb212ae5 Merge pull request #1053 from Jeremy8776/feat/version-pins
feat(versions): apps respect the version the launcher keeps them on
2026-10-30 20:55:24 -04:00
skylar taylor-barrick 0c8f9c08f8 Merge pull request #1058 from benandez/fix/solidcraft-macos-team
fix(macos): install SolidCraft, checked against its own developer's signature
2026-10-30 17:31:56 -06:00
skylar fc6708641f fix(macos): reject missing teams outside test builds 2026-10-30 17:19:24 -06:00
skylar 2f5a86aa8d fix(macos): verify staged app trust before replacement 2026-10-30 16:49:35 -06:00
JeremyandClaude Opus 5.5 2738185596 feat(versions): the shared version folder exists before any app starts
Flatpak mounts an app's read-only grant for ArtCraft/versions only when the
folder exists as the app starts. The launcher now makes it on start, and its
Flatpak grants xdg-data/ArtCraft/versions with :create, which also covers an
XDG_DATA_HOME outside home, where --filesystem=home does not reach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 22:08:38 +00:00
JeremyandClaude Opus 5.5 b1d557a173 build(deps): craft-update with the version-choice file in a host folder
craft-update 9817c81 moves versions.json to ArtCraft/versions under the host's
per-user data folder, resolved from inside the Flatpak too, so a Flatpak
launcher writes where host apps and granted Flatpak apps read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 21:56:42 +00:00
Martin BallandClaude Opus 5.5 627598eb7d fix(macos): install SolidCraft, checked against its own developer's signature
SolidCraft's macOS build has been Developer ID signed and notarized since 0.27 (its README),
but the launcher still treated it as unsigned (`installs_on_mac: false`), so on a Mac it
offered the update and then said no macOS version was available.

`installs_on_mac` becomes `mac_team`: the Apple team whose signature the build must carry.
Official apps keep ArtCraft's (DJ6XS33FX8); SolidCraft gets its own (G5QA5U5X2S, read from
the signature on its 0.27.1 macOS CLI). `None` still means the launcher installs no DMG, and
an install that reaches the DMG path without a team is now refused, not left unchecked.

Not run on a real Mac: the macos module only compiles there, and the DMG's own signature
still needs `codesign -dv` on a Mac to confirm the team matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 15:37:08 +00:00
JeremyandClaude Opus 5.5 1167239dfe feat(versions): every app the launcher opens is told where the version choices are
Only tarball apps on Linux were given CRAFT_VERSIONS_FILE. Now every launch
route passes it: Windows (exe and MSI) and AppImages through the process
environment, Flatpak apps through `flatpak run --env=`, and anything the
Flatpak launcher starts on the host through `flatpak-spawn --env=`. macOS
apps open through Launch Services with the real home, so they find the file
at its default path; `open` is left unchanged since not every macOS version
takes an environment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:00:55 +00:00
JeremyandClaude Opus 5.5 54bbc2ab9e feat(versions): tell the apps which version the launcher keeps them on
A version chosen in the launcher lived only in its own settings, so an app's
own update check (craft-update's Updater) still offered the latest release on
every start, and accepting it undid the downgrade.

The backend now writes craft_update::pins' shared file on every Configure:
each app's track from the settings, stable ones removed, entries a newer
launcher wrote kept. The first Configure after an upgrade moves choices saved
earlier. A tarball app on Linux, whose data folder points into its own home,
is told the real file through CRAFT_VERSIONS_FILE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:00:54 +00:00
JeremyandClaude Opus 5.5 b43955db51 build(deps): craft-update with the shared version-choice file
Pins craft-update to storytold/craft-libs#449 (0ada678) for craft_update::pins.
Bump to the merged commit once that PR lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:00:54 +00:00
Dylan M. Taylor 3fad1d643f deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to their latest versions (#1036)
- `rustls-webpki`: 0.103.15 → 0.103.16
- `zip`: 8.6.0, 9.1.0 → 9.1.3

Requirement `zip` 8 → 9. The portable-ZIP check now treats an entry name that doesn't decode as unsafe, like one with `\\` or `:`. That code is Windows-only and wasn't compiled here (Linux); Windows CI is the check.
2026-10-29 22:21:27 -04:00
aiongg 8ffceca5f0 Merge pull request #1015 from Jeremy8776/feat/macos-downgrade
feat(versions): go back to an older version on macOS
2026-10-29 16:46:33 -04:00
JeremyandClaude Opus 5.5 e60a042b48 feat(versions): go back to an older version of a macOS app, keeping the old copy aside
A Mac update already moves the installed .app aside, renames the new bundle in and moves
the old one back if that fails. Going back to a version chosen by name now uses the same
swap for a DMG over a Mac app install, so no older package has to be found and fetched
first. Downgrade becomes an enum: Reinstall (the Windows Installer route, unchanged) and
KeepOldCopy (macOS). Each is let through only for the install it can undo; anything else
is still refused before anything is downloaded.

Not run on a real Mac: the macos module only compiles there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 20:28:23 +00:00
skylar taylor-barrick c1d0d881a3 Release 0.10.0 v0.10.0 2026-10-29 13:26:57 -06:00
skylar taylor-barrick 570e101341 Add version selection and Windows downgrade recovery (#1007) 2026-10-29 13:25:43 -06:00
skylar taylor-barrick 73cd75f310 Fix RISC-V glibc requirements in Linux packages (#1010) 2026-10-29 13:25:39 -06:00
JeremyandClaude Opus 5.5 e77c72aff5 fix(versions): no separate-prompt fallback for an all-users downgrade; one queue turn per downgrade
Two review findings, both ways for the 'app left uninstalled' trap to come back:
- If the one-prompt elevated session could not start, an all-users downgrade fell back to a
  prompt per step. It now stops before anything is removed and says nothing was changed.
- The step-by-step route (per-user copies) took a separate installer-queue turn per step, so
  another queued install, or a cancel while waiting, could stop the put-back after the copy
  was removed. Remove, install and put-back now run in one turn, with nothing to wait on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 18:25:48 +00:00
skylar taylor-barrick 8165feb8e0 test(packaging): explain metadata assertion failures 2026-10-29 12:24:50 -06:00
skylar taylor-barrick 323c8760a3 fix(packaging): declare the build target glibc floor 2026-10-29 12:22:41 -06:00
JeremyandClaude Opus 5.5 a7491e9d15 fix(versions): put the previous version back when removing a second registration fails
An app can be registered more than once (per-user and all-users). If removing one succeeded
and the next failed, both downgrade routes stopped there, said nothing had changed, and never
put the previous version back. Now a removal that fails after another succeeded reinstalls
the previous version, in the elevated script and the step-by-step route, and says so with
outcomes of its own. A first removal that fails still changes nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 18:13:10 +00:00