Commit Graph
3289 Commits
Author SHA1 Message Date
Douglas Eichelberger c84b9a7b97 Add brew deadcode command backed by Spoom
Adds a `brew deadcode` dev-cmd that finds and removes dead code identified
by Spoom, excluding test code so that definitions referenced only by their
specs are also treated as dead. Definitions documented with `# @api public`
or `# @api internal`, or defined with an `override` signature, are always
kept, since Spoom cannot see their dynamic, subclass or cross-tap (e.g.
homebrew-core) callers.

Removes the dead code it identified, restoring false positives (dynamically
dispatched diagnostic checks and cask stanza classes, TestRunnerFormula
platform predicates, livecheck skip conditions, TopologicalHash tsort
methods and YARD docstring plugin methods). homebrew-core-used helpers such
as kernel_major_version, deny_network_access!, require_root and
detected_python_shebang are restored and annotated `# @api internal`.
Test-only cache resets are relocated into the specs that need them.
2026-07-29 22:00:27 -07:00
Mike McQuaidandGitHub 3550b83dee Merge pull request #23347 from Homebrew/document-install-step-interpolation
Document install step interpolation
2026-07-29 17:18:43 +00:00
Mike McQuaidandGitHub 182da7accd Merge pull request #23190 from Homebrew/install-step-15-clang-system-config
Add Clang system config action (15/24)
2026-07-29 17:04:35 +00:00
Mike McQuaid 095b9cef75 Document install step interpolation
- Distinguish Ruby interpolation from install-time tokens that survive
  JSON serialisation.
- Keep token-producing compatibility helpers valid while rejecting
  arbitrary interpolation.
- Emit explicit install-time tokens from formula autocorrections.
2026-07-29 17:59:20 +01:00
Mike McQuaidandGitHub 5a2627ba02 Merge pull request #23201 from Homebrew/install-step-14-glibc-runtime
Add glibc runtime action (14/24)
2026-07-29 16:37:47 +00:00
Patrick Linnane 1ba167eab7 docs: update Vale styles
Signed-off-by: Patrick Linnane <patrick@linnane.io>
2026-07-29 09:13:27 -07:00
Mike McQuaid 63f2dd43d0 Enforce responsible AI contribution policy
- Keep commit history tied to accountable human contributors
- Ensure reviewers engage directly with responsible contributors
2026-07-29 09:53:23 +01:00
AltCode bcf3453b4b docs: Format artifacts stanza table 2026-07-28 20:58:59 +02:00
AltCode 45bde7e52d docs: Add on_<system> stanzas to stanza order
Also adds missing info for conditional statements section
2026-07-28 20:55:34 +02:00
Mike McQuaid 0ac0cf43cb Prepare complete DSL stanza ordering
Recent formula and cask DSLs need consistent ordering registrations, but
Cask ordering cannot be enforced until the tap has been migrated.

- register new Cask artifact and conditional stanzas in their intended order
- allow both completion layouts while retaining group boundaries
- leave formula component ordering to `ComponentsOrder`
- document the intended Cask stanza order before enforcing it
2026-07-28 14:34:06 +01:00
Mike McQuaid eee8d944c0 Reduce vendored gem dependencies
- Replace `addressable` and `public_suffix` with Ruby's `URI` while
  retaining brewed-curl host detection.
- Inline JWS decoding and scoped warning filtering.
- Keep Base64 only as ruby-prof's on-demand transitive dependency.
- Remove unused Redcarpet and the largely unmaintained Pry backend.
- Defer heavy runtime gems until their functionality is needed.
- Resolve lazy type dependencies before Sorbet runtime checks.

Hyperfine (`--warmup 10 --runs 30`, repeated in both orders):

- `HOMEBREW_NO_AUTO_UPDATE=1 brew info --json=v2 jq`:
  528.9 ms ± 21.1 ms on `origin/main` and 512.6 ms ± 16.2 ms
  here, a 3% speedup.
2026-07-27 21:06:20 +01:00
hyuraku 51c13f17a3 docs/Cask-Cookbook: fix links to renamed casks
The `r` and `wireshark` casks were renamed to `r-app` and
`wireshark-app` in Homebrew/homebrew-cask d20f5f8baba
("Differentiate lesser used casks from formulae"), so the
`on_<system>` example links in this section now 404.
2026-07-27 18:24:04 +09:00
Mike McQuaid b312752fc0 Add Clang system config action
Four LLVM and Clang formulae share macOS target configuration generation
for the active SDK and kernel versions.

- skip non-macOS installs and generated native configurations
- select the current or versioned Command Line Tools SDK
- emit compatible arm64, aarch64 and x86_64 target files
2026-07-27 08:09:53 +01:00
Mike McQuaidandGitHub 48f5f3f30e Merge pull request #23200 from Homebrew/install-step-13-gzipped-executables
Add gzipped executable action (13/24)
2026-07-27 01:00:20 +00:00
Mike McQuaidandGitHub 33bf599d66 Merge pull request #23316 from Homebrew/service-block-method-docs
Document service block methods and tidy Homebrew::Services
2026-07-26 19:38:11 +00:00
Douglas Eichelberger 29cb5e338a Document service block methods as public API
Annotate every method in the Formula Cookbook's "Service block methods"
table as `@api public` in `Service`, with documentation matching the
cookbook's descriptions, and add the missing `stop_timeout` row to the table.

Enforce a 1:1 correspondence between the table and the `service.rb`
annotations in the `Homebrew/PublicApiCookbook` cop, backed by a new
`SERVICE_COOKBOOK_METHODS` list, so the two cannot drift.

Claude-Session: https://claude.ai/code/session_011BgWRBydtdkvt8ocqH4nj9
2026-07-26 12:16:42 -07:00
Mike McQuaid 70b0685f27 Update package manager slogan 2026-07-26 19:48:28 +01:00
Mike McQuaid d39b823008 Add glibc runtime action
Three glibc-family formulae share locale generation and timezone-link
setup with different rules for the legacy variants.

- derive requested locales while always providing the UTF-8 default
- invoke the installed `localedef` with normalised charmaps
- preserve host timezone links when their sources exist
2026-07-26 18:13:19 +01:00
Mike McQuaid a959228644 Add gzipped executable action
Several binary formulae ship a gzipped executable that needs the same
guarded post-install expansion and mode handling.

- resolve serialised source and destination path bases
- skip absent payloads and replace stale expanded sources
- install each executable with an explicit literal permission mode
2026-07-26 18:13:04 +01:00
Mike McQuaidandGitHub f7c846c323 Merge pull request #23186 from Homebrew/install-step-09-commands
Add constrained install commands (9/24)
2026-07-26 16:05:44 +00:00
Mike McQuaidandGitHub 0f9e1bd695 Merge pull request #23308 from Homebrew/declare-cask-command-wrapper-names
Declare cask command wrapper names
2026-07-26 15:33:17 +00:00
Mike McQuaidandGitHub 40801e75de Merge pull request #23185 from Homebrew/install-step-08-formula-permissions
Allow formula permission steps (8/24)
2026-07-26 15:31:37 +00:00
Mike McQuaid 6ae6def23a Add GCC runtime install action
Eight GCC formulae share the same Linux runtime-link and specs
generation algorithm after installation.

- probe the active GCC and glibc runtime locations
- generate family-appropriate library, linker and header search paths
- keep the repeated algorithm behind one literal formula step
2026-07-26 15:33:29 +01:00
Mike McQuaid 46b43d57d0 Add scoped install step warnings
Some formula hooks only warn when a persistent path needs user attention
and do not need arbitrary post-install code.

- add a literal warning step shared with cask flight phases
- compose warnings with path guards instead of embedded conditions
- expand fixed context tokens in warning messages
2026-07-26 14:24:32 +01:00
Mike McQuaid 2c2089fc74 Add process termination steps
Flight hooks repeatedly stop applications or helpers before mutating
their installed state.

- select processes by exact name or full command line
- serialise attempts, privilege and required-success policies
- preserve fixed user notices and final failure warnings
2026-07-26 14:24:22 +01:00
Mike McQuaid cf5bc21c6b Add constrained install commands
Many remaining hooks invoke one packaged or system executable and do not
need a Ruby block or shell command string.

- serialise literal arguments, environments, streams and directories
- resolve path bases, templates and guards through shared contexts
- make privilege, output and required-success policies explicit
- migrate GIO callers while retaining the shipped compatibility DSL
2026-07-26 14:23:59 +01:00
Mike McQuaid c33846e9da Declare cask command wrapper names
Command wrapper callers should declare the command users receive rather
than an implementation-specific staged script filename.

- treat the positional argument as the linked command name
- keep generated wrapper paths internal to the artifact
- reject names containing path components
- document command wrappers as the shim-script replacement
2026-07-26 13:24:58 +01:00
Mike McQuaid bff3871202 Add homepage browser check DSL
- Avoid false homepage audits when sites block automated requests
- Resume automated checks one year after a human browser check
- Do not suppress audits for future browser-check dates
- Reject browser-check metadata without a homepage URL
- Document the marker in the formula and cask cookbooks
2026-07-26 13:04:23 +01:00
Mike McQuaid 677dad25a5 Allow formula permission steps
Three core formulae adjust modes on persistent paths after installation
but do not need ownership changes or arbitrary Ruby.

- admit the existing `set_permissions` step in formula blocks
- keep `set_ownership` limited to cask blocks
- document and audit the formula capability explicitly
2026-07-25 20:07:02 +01:00
Mike McQuaid 033640ab69 Simplify cask command wrappers
Most command wrappers only execute one binary with optional fixed
arguments or environment variables. Repeating their complete shell
content makes casks harder to audit and maintain.

- generate wrappers from `executable`, `args` and `env` options
- infer the linked target by removing the `.wrapper.sh` suffix
- retain `content` for wrappers which need custom shell logic
2026-07-25 11:18:27 +01:00
dependabot[bot]andPatrick Linnane ec24a8d965 build(deps): bump the bundler group across 2 directories with 15 updates
Bumps the bundler group with 6 updates in the /Library/Homebrew directory:

| Package | From | To |
| --- | --- | --- |
| [yard](https://github.com/lsegal/yard) | `0.9.44` | `0.9.45` |
| [rubocop-sorbet](https://github.com/shopify/rubocop-sorbet) | `0.13.0` | `0.13.2` |
| [test-prof](https://github.com/test-prof/test-prof) | `1.6.1` | `1.6.2` |
| [simplecov](https://github.com/simplecov-ruby/simplecov) | `0.22.0` | `1.0.1` |
| [sorbet-static-and-runtime](https://github.com/sorbet/sorbet) | `0.6.13333` | `0.6.13342` |
| [spoom](https://github.com/Shopify/spoom) | `1.8.3` | `1.8.4` |

Bumps the bundler group with 4 updates in the /docs directory: [yard](https://github.com/lsegal/yard), [sorbet-runtime](https://github.com/sorbet/sorbet), [erb](https://github.com/ruby/erb) and [io-event](https://github.com/socketry/io-event).


Updates `yard` from 0.9.44 to 0.9.45
- [Release notes](https://github.com/lsegal/yard/releases)
- [Changelog](https://github.com/lsegal/yard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lsegal/yard/compare/v0.9.44...v0.9.45)

Updates `rubocop-sorbet` from 0.13.0 to 0.13.2
- [Release notes](https://github.com/shopify/rubocop-sorbet/releases)
- [Commits](https://github.com/shopify/rubocop-sorbet/compare/v0.13.0...v0.13.2)

Updates `test-prof` from 1.6.1 to 1.6.2
- [Release notes](https://github.com/test-prof/test-prof/releases)
- [Changelog](https://github.com/test-prof/test-prof/blob/master/CHANGELOG.md)
- [Commits](https://github.com/test-prof/test-prof/compare/v1.6.1...v1.6.2)

Updates `simplecov` from 0.22.0 to 1.0.1
- [Release notes](https://github.com/simplecov-ruby/simplecov/releases)
- [Changelog](https://github.com/simplecov-ruby/simplecov/blob/main/CHANGELOG.md)
- [Commits](https://github.com/simplecov-ruby/simplecov/compare/v0.22.0...v1.0.1)

Updates `simplecov-cobertura` from 3.2.0 to 4.0.0
- [Release notes](https://github.com/jessebs/simplecov-cobertura/releases)
- [Commits](https://github.com/jessebs/simplecov-cobertura/compare/v3.2.0...v4.0.0)

Updates `sorbet-static-and-runtime` from 0.6.13333 to 0.6.13342
- [Release notes](https://github.com/sorbet/sorbet/releases)
- [Commits](https://github.com/sorbet/sorbet/commits)

Updates `spoom` from 1.8.3 to 1.8.4
- [Release notes](https://github.com/Shopify/spoom/releases)
- [Commits](https://github.com/Shopify/spoom/compare/v1.8.3...v1.8.4)

Updates `sorbet-runtime` from 0.6.13333 to 0.6.13342
- [Release notes](https://github.com/sorbet/sorbet/releases)
- [Commits](https://github.com/sorbet/sorbet/commits)

Updates `json` from 2.20.0 to 2.21.1
- [Release notes](https://github.com/ruby/json/releases)
- [Changelog](https://github.com/ruby/json/blob/master/CHANGES.md)
- [Commits](https://github.com/ruby/json/compare/v2.20.0...v2.21.1)

Updates `parser` from 3.3.11.1 to 3.3.12.0
- [Changelog](https://github.com/whitequark/parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/whitequark/parser/compare/v3.3.11.1...v3.3.12.0)

Updates `rbi` from 0.3.16 to 0.4.0
- [Release notes](https://github.com/Shopify/rbi/releases)
- [Commits](https://github.com/Shopify/rbi/compare/v0.3.16...v0.4.0)

Updates `sorbet` from 0.6.13333 to 0.6.13342
- [Release notes](https://github.com/sorbet/sorbet/releases)
- [Commits](https://github.com/sorbet/sorbet/commits)

Updates `sorbet-static` from 0.6.13333 to 0.6.13342
- [Release notes](https://github.com/sorbet/sorbet/releases)
- [Commits](https://github.com/sorbet/sorbet/commits)

Updates `yard` from 0.9.44 to 0.9.45
- [Release notes](https://github.com/lsegal/yard/releases)
- [Changelog](https://github.com/lsegal/yard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lsegal/yard/compare/v0.9.44...v0.9.45)

Updates `sorbet-runtime` from 0.6.13333 to 0.6.13359
- [Release notes](https://github.com/sorbet/sorbet/releases)
- [Commits](https://github.com/sorbet/sorbet/commits)

Updates `erb` from 6.0.4 to 6.0.6
- [Release notes](https://github.com/ruby/erb/releases)
- [Changelog](https://github.com/ruby/erb/blob/master/NEWS.md)
- [Commits](https://github.com/ruby/erb/compare/v6.0.4...v6.0.6)

Updates `io-event` from 1.19.1 to 1.19.3
- [Release notes](https://github.com/socketry/io-event/releases)
- [Changelog](https://github.com/socketry/io-event/blob/main/releases.md)
- [Commits](https://github.com/socketry/io-event/compare/v1.19.1...v1.19.3)

---
updated-dependencies:
- dependency-name: yard
  dependency-version: 0.9.45
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: rubocop-sorbet
  dependency-version: 0.13.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: test-prof
  dependency-version: 1.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: simplecov
  dependency-version: 1.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: bundler
- dependency-name: simplecov-cobertura
  dependency-version: 4.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: bundler
- dependency-name: sorbet-static-and-runtime
  dependency-version: 0.6.13342
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: spoom
  dependency-version: 1.8.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: sorbet-runtime
  dependency-version: 0.6.13342
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: json
  dependency-version: 2.21.1
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: bundler
- dependency-name: parser
  dependency-version: 3.3.12.0
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: rbi
  dependency-version: 0.4.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: bundler
- dependency-name: sorbet
  dependency-version: 0.6.13342
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: sorbet-static
  dependency-version: 0.6.13342
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: yard
  dependency-version: 0.9.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: sorbet-runtime
  dependency-version: 0.6.13359
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: erb
  dependency-version: 6.0.6
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
- dependency-name: io-event
  dependency-version: 1.19.3
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-24 13:51:50 -07:00
Mike McQuaidandGitHub 189ff17566 Merge pull request #23290 from Homebrew/env-config-analytics-defaults
Sample only user-set env config in analytics
2026-07-24 19:01:27 +00:00
Mike McQuaid 5da7b049b0 Sample only user-set env config in analytics
- The formulae.brew.sh env-config table was hard to interpret: unset
  and explicitly-set-to-default runs were merged as "default events",
  nothing showed what a variable's default was and variables brew
  exports itself (`HOMEBREW_UPDATE_TO_TAG` in `cmd/update.sh`,
  `HOMEBREW_EDITOR`/`HOMEBREW_DISPLAY` etc. copied from the user
  environment in `bin/brew`) dominated the chart as fake user
  configuration.
- Record `HOMEBREW_USER_SET_VARS` at `bin/brew` startup, after
  `brew.env` files load but before any exports, so sampling and
  `brew config` can tell deliberate configuration apart; sub-brews
  inherit the list.
- Replace the `env_config_non_default` tag with a single
  `env_config_state` tag (`unset`/`default`/`non_default`) computed
  from user-set values only.
- Compute previously `default_text`-only defaults so explicitly-set
  default values are ignored everywhere: `HOMEBREW_AUTO_UPDATE_SECS`
  (mirroring `brew.sh`), `HOMEBREW_FORBID_PACKAGES_FROM_PATHS` (now
  `boolean: :set`, matching its accessor), `HOMEBREW_PIP_INDEX_URL`
  and `HOMEBREW_SSH_CONFIG_PATH`; generated accessors and
  `non_default_variable?` call callable defaults and treat blank
  booleans as unset like their accessors.
- `brew config` now only prints user-set non-default variables and
  `Resource#determine_url_mirrors` only rewrites PyPI URLs for
  non-default `$HOMEBREW_PIP_INDEX_URL` values.
- Sanitise `formula-analytics` results: only current variables and
  valid states are accepted and the query requires the new tag,
  which drops the contaminated data already collected.
- Stop excluding CI events from `command_run_options`: CI users are
  normal users so CI-only usage should stay visible.
- Output `non_default_count`, `set_default_count`, `unset_count` and
  `default_value` per variable in JSON, using the human
  `default_text` summary for varying defaults via
  `EnvConfig.default_description`, now shared with the manpage.
2026-07-24 19:40:08 +01:00
Mike McQuaid 37ec3dcf0c Block releases on open release blockers
- Labelling any open Homebrew/brew issue or pull request with
  `release blocker` now stops `brew release` and the `release.yml`
  `workflow_dispatch` run before a release is created.
- `major/minor release blocker` only blocks releases whose version
  ends in `.0`.
- Checking in the workflow as well as the command means releases
  triggered directly from the GitHub UI are also blocked.
2026-07-24 19:20:36 +01:00
BrewTestBot 3729d9bd34 Update manpage and completions.
Autogenerated by the [sponsors-maintainers-man-completions](https://github.com/Homebrew/brew/blob/HEAD/.github/workflows/sponsors-maintainers-man-completions.yml) workflow.
2026-07-24 07:28:12 +00:00
Mike McQuaid a3fc881347 Remove cask verified parameter
- stop auditing and documenting the ineffective parameter
- retain it as an optional no-op for existing casks

Fixes #23250
2026-07-23 14:51:31 +01:00
2b2bcf5135 docs: adjust minor nit
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-23 08:37:48 +08:00
Bevan Kay 99c3fdae04 docs: implementlists for readability 2026-07-23 10:20:25 +10:00
Patrick LinnaneandGitHub c71ea950d2 Merge pull request #23262 from Homebrew/deprecate_disable-add-formula-unreachable-reason
DeprecateDisable: add formula unreachable reason
2026-07-22 05:18:04 +00:00
Sam Ford 24a607e224 DeprecateDisable: add formula unreachable reason
Casks have a `DeprecateDisable` `unreachable` reason that we use when
a website is unreachable (e.g., anti-bot protections make the asset
inaccessible). Formulae have similar reasons like `repo_archived`
but none of the existing reasons account for the situation where a
project is supported and maintained but it's not possible to reach the
server outside of a browser to download release assets. This adds the
`unreachable` reason to the `FORMULA_DEPRECATE_DISABLE_REASONS` hash,
so we can use it in formulae as well.
2026-07-21 21:37:34 -04:00
Mike McQuaidandGitHub 7c2bb3b297 Merge pull request #23184 from Homebrew/install-step-07-cask-generated-scripts
Add generated cask scripts (7/24)
2026-07-22 00:53:53 +00:00
Mike McQuaidandGitHub 68ba2752ee Merge pull request #23183 from Homebrew/install-step-06-cask-command-wrappers
Add cask command wrappers (6/24)
2026-07-21 17:10:01 +00:00
Mike McQuaidandGitHub 122fe213d2 Merge pull request #23244 from Homebrew/mirror-bottle-metadata
Handle missing bottle mirror metadata
2026-07-21 17:08:53 +00:00
Mike McQuaid eeaae4a0dc Add generated cask scripts
Some cask flight hooks only materialise a fixed helper before another
artifact or install step consumes it.

- write literal executable content as a serialisable cask artifact
- restrict generated paths to the staged cask and reject traversal
- order generated scripts before dependent installer artifacts
2026-07-21 14:03:53 +01:00
Mike McQuaid fe832ecb9b Add cask command wrappers
Many cask flight hooks only write a fixed launcher and link it into the
configured binary directory.

- generate executable wrapper content as a first-class cask artifact
- reuse binary linking, collision and uninstall behaviour
- serialise the stanza so cask JSON preserves its definition
2026-07-21 14:03:49 +01:00
Mike McQuaid 068c5e2f7b Handle missing bottle mirror metadata
- Fetch manifests from custom bottle domains before falling back to GHCR.
- Preserve full relocation and its once-per-invocation guidance when
  usable metadata is still unavailable.
- Keep `HOMEBREW_BOTTLE_DOMAIN` supported while documenting
  `HOMEBREW_ARTIFACT_DOMAIN` as the preferred transparent proxy.

Fixes #12759
Fixes #23218
Closes #23237
2026-07-21 11:57:59 +01:00
BrewTestBot 56dfdc06db Update maintainers.
Autogenerated by the [sponsors-maintainers-man-completions](https://github.com/Homebrew/brew/blob/HEAD/.github/workflows/sponsors-maintainers-man-completions.yml) workflow.
2026-07-21 10:37:27 +00:00
BrewTestBot 642e312bcf Update maintainers.
Autogenerated by the [sponsors-maintainers-man-completions](https://github.com/Homebrew/brew/blob/HEAD/.github/workflows/sponsors-maintainers-man-completions.yml) workflow.
2026-07-21 10:16:59 +00:00
Mike McQuaidandGitHub a11234a9e6 Merge pull request #23233 from Homebrew/docs-style-guardrails
docs: enforce sentence-case headings and codify prose conventions
2026-07-21 07:06:42 +00:00
Patrick Linnane d4700a3469 Add appimage to cask stanza order
Signed-off-by: Patrick Linnane <patrick@linnane.io>
2026-07-20 14:06:34 -07:00