Skip to content

CI: build on macos-15, publish a Homebrew formula, read ~/.yaci-cli/devkit.properties - #198

Merged
satran004 merged 3 commits into
mainfrom
ci/macos-15-homebrew-devkit-properties
Oct 14, 2026
Merged

satran004 merged 3 commits into
mainfrom
ci/macos-15-homebrew-devkit-properties

Conversation

@satran004

@satran004 satran004 commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Summary

  • macos-15 runners: release-cli.yml and dev-release-cli.yml now build on macos-15, since macos-14 runners are being retired. It's still Apple Silicon, so the yaci-devkit-macos-arm64 npm package and the macos-ARM64 zip names are unchanged.

  • Dev workflows match release more closely:

    • dev-release.yml uses Earthly v0.8.16, like release.yml. It still only builds the Docker images and doesn't push them.
    • dev-release-cli.yml dry runs the npm publish (npm publish --dry-run, with no id-token permission).
    • dev-release-cli.yml also dry runs the Homebrew install: it installs the formula from that run's zips through a local tap, runs brew test and checks that the installed yaci-devkit answers on port 10000.
  • Homebrew publishing: a new update-homebrew job in release-cli.yml publishes to bloxbean/homebrew-tap, using the org HOMEBREW_TAP_TOKEN. Releases map to formulas the same way npm maps them to dist-tags:

    Version Formula Install
    final yaci-devkit brew install bloxbean/tap/yaci-devkit
    *-beta* yaci-devkit-beta brew install bloxbean/tap/yaci-devkit-beta
    *-preview* not published

    Both formulas install the yaci-devkit command (yaci-devkit up, as with npm). They don't use conflicts_with: Homebrew 7 refuses to load a tap formula the user hasn't installed by name, so the first install would fail. Homebrew's link step already prevents both from owning the command, and it tells the user to run brew unlink. The formula template lives in .github/scripts/homebrew-formula.sh, shared by the release job and the dry run.

  • User overrides in ~/.yaci-cli/devkit.properties:

    • It can hold any key from application.properties, node.properties or download.properties.
    • It overrides the bundled config for the zip, npm and Homebrew installs.
    • Command-line -D options and environment variables still override it.
    • It always lives in the user's home folder, even when yaci.cli.home points elsewhere.
    • It's optional; if the file doesn't exist, nothing changes.
    • Docker isn't affected; it uses its own docker/application.properties.
  • macOS 15 minimum: the binary built on macos-15 requires macOS 15 or later (otool shows minos 15.0). GraalVM uses the build machine's macOS version as the minimum, and we can't vouch for macOS 14 with an older minimum forced in, so macOS 15 is now the stated requirement:

    • the Homebrew formula has depends_on macos: :sequoia, so brew install refuses on older macOS with a clear message
    • start.mjs exits with "Yaci DevKit requires macOS 15 or later" on older macOS (before Darwin 24)
    • the npm and zip docs say "macOS 15 (Arm64) or later"
  • The cost-models path can be overridden (Codex review): the npm launcher (since Fix npm publishing CI and native wallet signing #173) and the Homebrew wrapper passed -Dyaci.cli.plutus-costmodels-path. That outranked devkit.properties and environment variables. They now pass only the bundled config location, -Dyaci.cli.bundled-config-dir, and application.properties uses it as the default: yaci.cli.plutus-costmodels-path=${yaci.cli.bundled-config-dir:./config}. The default is the same as before; only its priority dropped. The zip still uses ./config, and Docker isn't affected.

  • Job names: the buildAndPush jobs in build.yml and dev-release-cli.yml are renamed to build, since they push nothing (Docker images are built without --push; CLI zips become workflow artifacts). release-cli.yml keeps buildAndPush, because that job attaches the zips to the GitHub release. No required status checks depend on the name.

Linux arm64 is deferred until Yaci Store publishes a native arm64 build (#197).

Test plan

  • A locally built native image, using GraalVM 21.0.5 like CI, run through the zip, npm (start.mjs) and Homebrew (local tap) installs. In each, the port the CLI listened on showed which settings file won:

    • with no devkit.properties, the bundled value applies
    • devkit.properties overrides the bundled config
    • -Dserver.port overrides devkit.properties
    • the SERVER_PORT environment variable overrides devkit.properties
  • First-time brew install of yaci-devkit-beta from a clean Homebrew trust state, then brew test and a start check. Installing yaci-devkit on top completes but doesn't link the command; Homebrew suggests brew unlink yaci-devkit-beta.

  • Cost-models path, checked through zip, npm and Homebrew by serving the API under the resolved path (-Dserver.servlet.context-path=${yaci.cli.plutus-costmodels-path}):

    • the default is the bundled config folder (npm, Homebrew)
    • devkit.properties overrides it
    • the YACI_CLI_PLUTUSCOSTMODELSPATH environment variable overrides it

    The previous start.mjs fails the devkit.properties and environment cases with a 404, which confirms the test catches the bug. The server.port override checks were re-run on all three installs and pass.

  • dev-release-cli run on the first commit: everything passed, including the macos-15 build, the npm dry run and the Homebrew dry run (https://github.com/bloxbean/yaci-devkit/actions/runs/38514333485)

  • dev-release-cli run on the latest commit: everything passed, the macOS binary shows minos 15.0, and the Homebrew dry run installed with depends_on macos: :sequoia and the new launcher argument (https://github.com/bloxbean/yaci-devkit/actions/runs/38521679875)

  • update-homebrew against the real tap. It only runs on a release tag, so the first beta release will be its first real run.

🤖 Generated with Claude Code

satran004 and others added 3 commits October 14, 2026 13:00
…s from ~/.yaci-cli/devkit.properties

- CLI release and dev workflows build on macos-15 (macos-14 runners are being retired)
- dev-release-cli dry runs the npm publish and the Homebrew install (local tap from this run's zips,
  brew test, start check); dev-release uses Earthly v0.8.16 like release.yml
- release-cli publishes the formula to bloxbean/homebrew-tap: yaci-devkit for a final release,
  yaci-devkit-beta for a beta, nothing for a preview (same split as the npm dist-tags); both install
  the yaci-devkit command
- ~/.yaci-cli/devkit.properties overrides the bundled application, node and download properties for the
  zip, npm and Homebrew installs; -D options and environment variables still win over it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The npm and Homebrew launchers passed -Dyaci.cli.plutus-costmodels-path, which overrode devkit.properties
  and environment variables. They now pass only the bundled config location (yaci.cli.bundled-config-dir),
  and application.properties uses it as the default for yaci.cli.plutus-costmodels-path
- The macOS binary is built on macos-15 and needs macOS 15 or later: the Homebrew formula depends on
  macOS Sequoia, start.mjs exits with a clear message on older macOS, and the docs say macOS 15

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build.yml and dev-release-cli.yml only build (Docker images without --push, CLI zips as workflow
artifacts). release-cli.yml keeps buildAndPush: that job attaches the zips to the GitHub release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@satran004
satran004 merged commit c042ed0 into main Oct 14, 2026
8 checks passed
@satran004
satran004 deleted the ci/macos-15-homebrew-devkit-properties branch October 14, 2026 09:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant