feat: add Homebrew formula and update workflow for automatic formula …#818
feat: add Homebrew formula and update workflow for automatic formula …#818gjkim42 merged 1 commit intokelos-dev:mainfrom
Conversation
There was a problem hiding this comment.
2 issues found across 4 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="hack/update-homebrew-formula.sh">
<violation number="1" location="hack/update-homebrew-formula.sh:15">
P2: The script downloads a release asset named `checksums.txt` but then reads `/tmp/kelos-checksums.txt`. Since the checksums file generated by the release process is `checksums.txt`, the parsing loop will fail when the file isn’t renamed. This will abort the formula update.</violation>
</file>
<file name=".github/workflows/release.yaml">
<violation number="1" location=".github/workflows/release.yaml:99">
P2: Release workflow pushes from a detached HEAD on tag builds; `git push` will fail or not update main, so the Homebrew formula update won’t land.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
There was a problem hiding this comment.
1 issue found across 2 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name=".github/workflows/release.yaml">
<violation number="1" location=".github/workflows/release.yaml:99">
P1: Tag-triggered workflow may fail to push formula updates because `git push origin main` requires a local `main` ref that is not guaranteed in tag checkout context.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
b347492 to
5e57e3d
Compare
|
I fixed a conflict and squashed the commits. Ready to review |
|
Alright, fixed verify issues and amended the the commit. NOW it is ready for review and merge. Beware that this PR needs to be merged before so the tap repo is as expected: kelos-dev/homebrew-tap#1 Additionally you need to set up a PAT that is allowed to make changes to the tap repo and give it to the kelos repo as a TAP_GITHUB_TOKEN secret: It would be more elegant if we would use goreleaser but that would require more work because it would interfer with your existing build and release notes automation. I therfor decided to not go that way. Hope to be able to install and especially update (that's the bigger value) kelos with homebrew soon. |
|
/kelos review |
|
🤖 Kelos Task Status Task |
gjkim42
left a comment
There was a problem hiding this comment.
can we update the release note?
It's mixed up with cubic's comment.
There was a problem hiding this comment.
🤖 Kelos Reviewer Agent @gjkim42
Review Summary
Verdict: REQUEST CHANGES
Scope: Adds Homebrew formula, release workflow integration, and update script for automatic tap updates on release.
Findings
Correctness
- README.md:146 —
brew tapcommand points to a nonexistent repo.brew tap kelos-dev/kelosresolves togithub.com/kelos-dev/homebrew-kelos, which does not exist. The actual tap repo iskelos-dev/homebrew-tap, so the correct command isbrew tap kelos-dev/tap. This would cause the documented installation instructions to fail for every user. - Formula/kelos.rb:35 — Dead variable
binary_name. The variablebinary_name = "kelos-#{OS.kernel_name.downcase}-#{Hardware::CPU.arch}"is computed but never referenced. The next line usesDir.glob("kelos-*").firstinstead. Remove the unused variable or use it.
Workflow
- .github/workflows/release.yaml:14–15 — Unnecessary bot guard. The
if: github.actor != 'kelos-dev[bot]'condition on the release job can never trigger because the bot only pushes tokelos-dev/homebrew-tap(a different repo), not tokelos-dev/kelos. It won't prevent any real double-build scenario. Not harmful, but misleading — consider removing it or adding a comment explaining the intended future scenario. - .github/workflows/release.yaml — Formula updated before release is published. The release is created with
--draft, and the formula update runs in the same job immediately after. This means the formula (with real checksums and version) is pushed to the tap repo while the release is still a draft. During this window,brew install keloswould fail with a 404 because draft release assets aren't publicly downloadable. Consider either: (a) moving the formula update to a separate workflow triggered byrelease: published, or (b) publishing the release before updating the formula.
Code Quality
- Formula/kelos.rb:6 — Version will include
vprefix. TheVERSIONstep outputsv1.2.3, so the formula will haveversion "v1.2.3". Homebrew convention is bare version numbers (1.2.3). Consider stripping the prefix in the formula (version "1.2.3") and adjusting the URL to...download/v#{version}/.... This avoids potential issues with Homebrew's version comparison logic.
Suggestions
- The formula test (
assert !output.empty?) is weak — considerassert_match "kelos", outputor matching the version string for a more meaningful check. - Consider adding
trap 'rm -f /tmp/checksums.txt' EXITat the top ofhack/update-homebrew-formula.shto clean up the downloaded checksums file.
/kelos needs-input
|
/kelos review |
|
🤖 Kelos Task Status Task |
There was a problem hiding this comment.
🤖 Kelos Reviewer Agent @gjkim42
Review Summary
Verdict: REQUEST CHANGES
Scope: Adds Homebrew formula template, release-triggered tap update workflow, and update script for automatic formula maintenance.
Findings
Security
.github/workflows/update-homebrew-formula.yaml:28— Shell injection viagithub.event.release.tag_name. The tag name is interpolated directly into therun:string before bash processes it. If a tag contained shell metacharacters, arbitrary commands would execute. The same issue exists in the commit message on line 35. Fix: pass via environment variable instead:While exploitability is limited to repo writers, this workflow has- name: Update Homebrew formula env: GH_TOKEN: ${{ github.token }} TAG_NAME: ${{ github.event.release.tag_name }} run: bash hack/update-homebrew-formula.sh "$TAG_NAME" homebrew-tap - name: Commit and push Homebrew formula update working-directory: homebrew-tap env: TAG_NAME: ${{ github.event.release.tag_name }} run: | git config user.name "kelos-dev[bot]" git config user.email "kelos-dev@users.noreply.github.com" git add Formula/kelos.rb git commit -m "chore: update Homebrew formula for ${TAG_NAME}" || true git push
TAP_GITHUB_TOKENaccess, so a crafted tag could compromise the tap repo. Defense in depth.
Correctness
.github/workflows/release.yaml:78— Removing--draftchanges existing release behavior. This PR removes--draftfromgh release create, which means releases are now published immediately instead of being created as drafts for maintainer review. This is needed for the Homebrew workflow (on: release: published) to auto-trigger, but it's a meaningful change to the release process that isn't called out in the PR description. The maintainer should explicitly acknowledge this trade-off. Alternative: keep--draftand have maintainers manually publish (which still triggers the Homebrew workflow), or add a separate publish step.
Conventions
- PR description — The release note block is not properly closed and mixes with the cubic auto-generated summary. The maintainer flagged this in comments as well.
Suggestions
- The formula test (
assert_match "kelos", output) is fine but could be made more specific by matching the version string pattern (e.g.,assert_match(/\d+\.\d+\.\d+/, output)) to also catch broken version injection. - Consider adding a
--failor retry to thegit pushin the tap update workflow, to surface transient failures clearly in the workflow log.
/kelos needs-input
| - name: Update Homebrew formula | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: bash hack/update-homebrew-formula.sh "${{ github.event.release.tag_name }}" homebrew-tap |
There was a problem hiding this comment.
Security: github.event.release.tag_name is directly interpolated into the shell command via ${{ }}. Pass it via an env: variable (TAG_NAME: ${{ github.event.release.tag_name }}) and reference "$TAG_NAME" in the run: block to prevent potential shell injection. Same issue on line 35 in the commit message.
.github/workflows/release.yaml
Outdated
| VERSION: ${{ steps.version.outputs.version }} | ||
| run: | | ||
| gh release create "$VERSION" --verify-tag --draft --title "$VERSION" --notes-file /tmp/release-notes.md || true | ||
| gh release create "$VERSION" --verify-tag --title "$VERSION" --notes-file /tmp/release-notes.md || true |
There was a problem hiding this comment.
Note: This PR removes --draft from gh release create. This auto-publishes releases instead of leaving them as drafts, which is a behavioral change to the existing release process. Please confirm this is intentional — the Homebrew workflow also works if you keep --draft and manually publish.
There was a problem hiding this comment.
I brought back the old behaviour in e4ddf89
ee22714 to
e4ddf89
Compare
|
/kelos review |
|
/kelos review |
|
🤖 Kelos Task Status Task |
README.md
Outdated
| brew tap kelos-dev/tap | ||
| brew install kelos | ||
|
|
||
| # Or install from source |
There was a problem hiding this comment.
| # Or install from source | |
| # Or install from script |
and can we reverse the order?
There was a problem hiding this comment.
@gjkim42 I Reversed sequence of install souces in readme and corrected the comments. I also put in the other suggestions of kelos-bot.
There was a problem hiding this comment.
🤖 Kelos Reviewer Agent @gjkim42
Review Summary
Verdict: APPROVE
Scope: Adds Homebrew formula template, a dedicated release-triggered workflow for automatic tap updates, and an update script that injects checksums and version into the formula.
Findings
All previously blocking issues have been resolved in this revision:
- Shell injection:
github.event.release.tag_nameis now passed viaenv:rather than inline interpolation — addressed in.github/workflows/update-homebrew-formula.yaml:27-28 - Dead variable (
binary_name): removed - Wrong tap repo in README: corrected to
brew tap kelos-dev/tap - Version
vprefix: properly stripped viaBARE_VERSION="${VERSION#v}"inhack/update-homebrew-formula.sh:55 - Checksums file naming: consistent (
/tmp/checksums.txtthroughout) - Separate workflow design:
update-homebrew-formula.yamltriggers onrelease: published, decoupling from the draft release flow inrelease.yaml
Correctness
- The checksums parsing in
hack/update-homebrew-formula.shcorrectly matches thesha256sum kelos-*format generated by therelease-binariesMakefile target (Makefile:128). - The formula URL uses
v#{version}to reconstruct the download path after thevprefix is stripped from the version field — this is correct. - The workflow is idempotent: re-running for the same release produces an identical formula,
git commit || truehandles the no-op, andgit pushis harmless.
Conventions
- PR description: The
release-noteblock is not properly closed (missing closing triple-backtick), and cubic's auto-generated summary is mixed in. The maintainer flagged this already — please clean up before merge.
Suggestions
README.md:149— The label# Or install from sourceis slightly misleading for the curl|bash script, which downloads pre-built binaries. Consider# Or use the install scriptto avoid confusion with the actual source install (go install) in the collapsible section below.hack/update-homebrew-formula.sh— Thesed -iflag behaves differently on macOS (requires backup suffix). Since this only runs in CI on ubuntu, it's fine, but a comment noting "requires GNU sed" would help anyone trying to run it locally.Formula/kelos.rb:38— The testassert_match "kelos", outputcould be more specific, e.g.,assert_match(/\d+\.\d+\.\d+/, output)to verify version injection worked correctly.
/kelos needs-input
What type of PR is this?
/kind feature
What this PR does / why we need it:
Adds Homebrew installation support for Kelos, allowing users to install and manage Kelos via:
This improves the installation experience and makes Kelos discoverable through a widely-used package manager.
This PR includes:
The formula is automatically updated with correct checksums and version on every release, requiring no manual intervention.
Which issue(s) this PR is related to:
Fixes #817
Special notes for your reviewer:
if: github.actor != 'kelos-dev[bot]')update-homebrew-formula.shscript handles downloading checksums from the GitHub release and updating the formulaDoes this PR introduce a user-facing change?
Yes - a new installation method.
Summary by cubic
Adds Homebrew support so users can install
keloswithbrew tap kelos-dev/tap && brew install kelos. The formula auto-updates on new releases and supports macOS (Intel/ARM) and Linux (AMD64/ARM64).Formula/kelos.rbwith per-OS/arch URLs; version and SHAs filled at release; includes akelos versiontest; README updated with brew install steps.kelos-dev/homebrew-tap: copies the formula, runshack/update-homebrew-formula.sh <tag>, then commits and pushes. The script downloadschecksums.txt, verifies required arches, strips the leadingv, and updates version/SHAs.Written for commit f1c9737. Summary will update on new commits.