Skip to content

feat(brew): trust the hashicorp and twilio taps, swap cursor for ghostty - #38

Open
Defilan wants to merge 3 commits into
mainfrom
CPM/remove-cursor-trust-taps-ghostty
Open

Defilan wants to merge 3 commits into
mainfrom
CPM/remove-cursor-trust-taps-ghostty

Conversation

@Defilan

@Defilan Defilan commented Nov 6, 2026

Copy link
Copy Markdown
Owner

What

Three changes to the package lists the playbook installs:

  • cursor is no longer installed. It is dropped from the developer (Option 2) and home (Option 3) cask lists. Nothing uninstalls an existing copy; the role only installs.
  • The hashicorp/tap and twilio/brew taps are trusted before formulae load. Homebrew 6.0.0 introduced tap trust, and an untrusted third-party tap refuses to load: before this branch, brew info twilio reported "Refusing to load formula twilio/brew/twilio from untrusted tap".
  • ghostty is added to the Option 2 and Option 3 cask lists.

Why

twilio is installed from twilio/brew, and the tap is tapped but untrusted, which is the case the new trust step fixes. cursor comes out and ghostty goes in on the two profiles Chris asked for.

How

Commit What it changes
5c018bf feat(brew): stop installing cursor, trust the hashicorp and twilio taps, add ghostty vars/main.yml: adds _shared_trusted_taps (hashicorp/tap, twilio/brew), attaches it as trusted_taps to developer and home, swaps cursor for ghostty in both cask lists. tasks/darwin.yml: a "Trust non-official Homebrew taps" task looping over trusted_taps with trust: true. requirements.yml: collection floor >=8.0.0 to >=13.3.0, the version that added the module's trust option. README.md and the role README restate the taps and put the casks in a per-profile table. tests/assert-package-lists.yml: assertions on the trust lists, the cask swaps, the lightweight profile, and the shared formula list.
e23def2 test(brew): pin the darwin trust task and the full formula list The tests read tasks/darwin.yml and tasks/main.yml, so deleting the trust task, dropping its loop or flipping trust fails them. Formula parity becomes the full list comparison. tasks/darwin.yml changes from a whole-list name to name: "{{ item }}" with a loop.
bacfea9 test(brew): assert the trust task guard and restate the cask table Asserts the trust task's when: trusted_taps is defined guard, one assertion per property, and moves ghostty into the README's Developer row.

Design notes, from the commit ledgers:

  • trusted_taps is separate from homebrew_taps so that trusting is limited to the two taps asked for. aws/tap stays tapped and untrusted, which blocks nothing: awscli and aws-sam-cli come from core.
  • The lightweight profile has no homebrew_taps, so it gets no trusted_taps and the trust task skips. Its casks are unchanged.
  • ghostty is a plain list entry like every other cask, not a separate step.

Verification

ansible-playbook tests/assert-package-lists.yml from defilan-osconfig passes (9 tasks, 0 failed). On origin/main the same file fails on the trust lists, on ghostty and cursor, and on the darwin trust task. ansible-playbook playbook.yml --syntax-check passes, yamllint with the CI rule set passes, and ansible-lint on the changed directories reports 0 failures. Falsification: removing each property (the trust list, ghostty, the task, its loop, its trust, its when, the import) turns the file red.

A real -e config=developer run on Chris's Mac installed the ghostty cask and brew trust --json=v1 listed hashicorp/tap and twilio/brew. The cursor removal only shows on a machine that does not already have it, so it was not observed here.

Not done, and open for a follow-up:

  • requirements.yml now requires ansible-core 2.18, because community.general 13.3.0 declares requires_ansible: '>=2.18.0'. The role README still says Ansible >= 2.14 and meta/main.yml still sets min_ansible_version: "2.14".
  • install.sh never runs ansible-galaxy collection install -r defilan-osconfig/requirements.yml. Ansible 14.0.0 bundles community.general 13.0.1, which has no trust option; 14.3.0 is the first release carrying 13.3.0. brew install ansible takes the latest today, so the normal path works.
  • No CI job runs tests/assert-package-lists.yml or lints defilan-osconfig/tests/.

AI assistance

Assisted-by: DeepSeek-V4.1-Flash-1017-heretic (served on a 3xGB10 cluster via LLMKube; roles: code, tests and commit messages, executing review: base-vs-head probes and mutation checks)
Assisted-by: qwen38-flash-next (served on an AMD Strix Halo; roles: read-only review)
Verified by the author: read diffs and supervised build

Checklist

  • Tests added or updated (the diff touches defilan-osconfig/tests/assert-package-lists.yml)
  • ansible-playbook tests/assert-package-lists.yml passes
  • Lint passes (yamllint with the CI rule set and ansible-lint on the changed directories)
  • Commits follow conventional commits
  • Every commit is signed off (git commit -s)
  • AI assistance disclosed above
  • Docs updated (README.md, defilan-osconfig/roles/defilan-osconfig/README.md)

…ps, add ghostty

Adds a trusted_taps list to the developer and home profiles and a task that
runs `brew tap --trust` style trust through community.general.homebrew_tap,
because Homebrew 6.0.0 requires a non-official tap to be trusted before its
formulae load. Drops the cursor cask from both profiles and adds the ghostty
cask to them. Nothing uninstalls an existing Cursor.app; the role only
installs.

Decisions:
- cursor stop being installable: changed, removed from developer and home cask lists, issue, tests/assert-package-lists.yml (casks tag)
- existing Cursor.app removal: unchanged, the role has no removal task, base tasks/darwin.yml is install-only, tests/assert-package-lists.yml
- taps trusted: hashicorp/tap and twilio/brew only, issue plus vars/main.yml taps list, tests/assert-package-lists.yml (taps tag)
- aws/tap trusted: unchanged, not trusted, issue names two taps, tests/assert-package-lists.yml
- lightweight taps and trust: unchanged, no taps so no trust task, base vars/main.yml lightweight map, tests/assert-package-lists.yml
- profiles getting ghostty: developer and home only, issue plus install.sh option mapping, tests/assert-package-lists.yml (casks tag)
- ghostty form: plain cask list entry like the other casks, plan answer from Chris, tests/assert-package-lists.yml
- twilio and hashicorp formulae: unchanged, vars/main.yml, tests/assert-package-lists.yml (parity tag)
Behavior changes only for: macOS developer and home runs (cursor no longer installed, ghostty installed, hashicorp/tap and twilio/brew trusted).
Files in scope: defilan-osconfig/roles/defilan-osconfig/vars/main.yml, defilan-osconfig/roles/defilan-osconfig/tasks/darwin.yml, defilan-osconfig/requirements.yml, README.md, defilan-osconfig/roles/defilan-osconfig/README.md, defilan-osconfig/tests/assert-package-lists.yml

Signed-off-by: Christopher Maher <chris@mahercode.io>
The vars-only assertions stayed green when the darwin trust task was
deleted, its loop removed, or trust flipped to false, and the shared
formula parity check asserted three memberships instead of the list.
This reads the darwin and main task files and asserts there is exactly
one trust task, imported from main.yml, looping per tap with trust true,
and compares the full shared formula list.

Review round 1.
Settled: declined the qwen nit to add tests/ and the assert playbook to
.github/workflows/shell_lint.yml, because the plan's Files in scope omit
workflow files and the plan records that gap as a note; the test is
manual and run from defilan-osconfig. The Ubuntu dry-run jobs already
exercise the changed tasks. Evidence: plan Files in scope line, plan
Consumers note on the CI dry run.

Signed-off-by: Christopher Maher <chris@mahercode.io>
The trust-task play did not read the task's when guard, so deleting the
guard (which breaks a default lightweight macOS run) left the file green.
It now asserts the guard, and the three-tap loop is one assertion per
property so each failure names the property. The README table moves
ghostty into the Developer row instead of claiming it for every profile.

Review round 2.
Settled: the round-1 Settled claim "The Ubuntu dry-run jobs already
exercise the changed tasks" was false, since main.yml imports darwin.yml
only when os_family is Darwin and the macOS dry run is
continue-on-error. Replaced, not relied on. Evidence: tasks/main.yml
macOS import guard, .github/workflows/shell_lint.yml macOS job.
Declined [earlier]-tagged nit on the trust task name over-promising
(aws/tap non-official but not trusted): the name matches the task's
effect on the two taps it lists, and the plan's Comments asked for it.

Signed-off-by: Christopher Maher <chris@mahercode.io>
@sonarqubecloud

sonarqubecloud Bot commented Nov 6, 2026

Copy link
Copy Markdown

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