Part of #14 — Releases publish no installable package, only GitHub's source zip.
Blocked by: Prove the release-package pattern on macarchy-touchbar (#16)
Problem
Four more repos install executables from a git checkout and publish no package: macarchy-core, macos-dynamic-wallpaper, omarchy-aikit and jarvis. Once #C1 has proven the pattern on one repo, this is the mechanical repeat — but mechanical is not trivial: each package() has to mirror that repo's own install.sh, and omarchy-aikit already carries a PKGBUILD that must be converted rather than written.
Proposed solution
The #C1 workflow, copied per repo, with a PKGBUILD written from each install.sh.
| Repo |
what its install.sh lands |
note |
macarchy-core |
~12 scripts, hooks, udev rule, 2 units + timers, shell plugins |
the biggest mapping |
macos-dynamic-wallpaper |
one script, a unit + timer, a theme hook |
smallest |
omarchy-aikit |
bin/*, share/*, omarchy fragments, 2 units |
convert its -git PKGBUILD to tag-based |
jarvis |
CLI, plugin, units, Piper voices, models |
the voices/models are large and fetched — decide ship-vs-depend |
Area
ci
📋 Spec
Goal
Each of the four repos publishes an installable .pkg.tar.zst on release.
Design
One PKGBUILD + one package.yml per repo, both copied from #16's proven pair. The only per-repo work is package() and depends.
omarchy-aikit is the exception worth naming: its existing aikit-git PKGBUILD builds HEAD via git describe. It becomes a tag-based aikit package, keeping its check() (bin/aikit-selftest) and its aikit.install post-install note. Both cannot be provides/conflicts peers by accident — the -git variant is retired, not kept alongside.
jarvis needs a decision this issue must not defer silently: its Piper voices and wake models are large binaries fetched by install.sh. Shipping them makes a fat package; depending on a fetch makes a package that needs the network. Default taken: keep them out of the package and have the post-install note say to run jarvis setup — a voice assistant that cannot reach the network has bigger problems than a missing package.
Acceptance criteria
- Each of the four repos' next release carries exactly one
*.pkg.tar.* asset.
tar -tf on each shows the same destinations that repo's install.sh writes.
omarchy-aikit publishes aikit, not aikit-git, and no release carries both.
jarvis's package installs without network access; its post-install note names the setup step that needs one.
- No repo's
install.sh changed behaviour.
Testing decisions
Seams under test: the built package's file list (tar -tf) and the release's asset list.
Prior art: #16's own PKGBUILD-vs-install.sh test, copied per repo.
A good test here: the same drift test as #C1 — every path install.sh writes has a counterpart in package().
Out of scope
🛠️ Implementation plan
For agentic workers: execute this plan task-by-task with implement-issue (subagent-per-task for broad plans, inline for small ones). Steps use checkbox (- [ ]) syntax for tracking.
Goal: four more repos publish packages, using #16's proven pair.
Architecture: one PKGBUILD + one workflow per repo; each repo's own test suite.
Tech stack: bash, makepkg 7, GitHub Actions, archlinux:base-devel.
Seams under test: the built package's file list (tar -tf) and the release's asset list.
Global constraints
Task 1: macos-dynamic-wallpaper — the smallest mapping first
Files: create PKGBUILD, .github/workflows/package.yml; test tests/test_pkgbuild.py.
Interfaces: arch=('any'); package() lands bin/macos-dynamic-wallpaper, the unit and the timer.
Task 2: macarchy-core — the biggest mapping
Files: create PKGBUILD, .github/workflows/package.yml; test tests/test_pkgbuild.sh.
Interfaces: arch=('any'); scripts to /usr/bin, udev to /usr/lib/udev/rules.d, units to /usr/lib/systemd/user, shell plugins to /usr/share/macarchy-core/shell-plugins.
Task 3: omarchy-aikit — convert the existing -git PKGBUILD
Files: modify PKGBUILD; create .github/workflows/package.yml; test tests/test_pkgbuild.sh.
Interfaces: pkgname=aikit sourced from the release tarball; pkgver() removed; check() and aikit.install kept.
Task 4: jarvis — package the program, not the voices
Files: create PKGBUILD, jarvis.install, .github/workflows/package.yml; test tests/test_pkgbuild.sh.
Interfaces: arch=('any'); CLI, plugin, units. Voices and models excluded; jarvis.install names the setup step.
Part of #14 — Releases publish no installable package, only GitHub's source zip.
Blocked by: Prove the release-package pattern on macarchy-touchbar (#16)
Problem
Four more repos install executables from a git checkout and publish no package:
macarchy-core,macos-dynamic-wallpaper,omarchy-aikitandjarvis. Once #C1 has proven the pattern on one repo, this is the mechanical repeat — but mechanical is not trivial: eachpackage()has to mirror that repo's owninstall.sh, andomarchy-aikitalready carries a PKGBUILD that must be converted rather than written.Proposed solution
The #C1 workflow, copied per repo, with a PKGBUILD written from each
install.sh.install.shlandsmacarchy-coremacos-dynamic-wallpaperomarchy-aikitbin/*,share/*, omarchy fragments, 2 units-gitPKGBUILD to tag-basedjarvisArea
ci
📋 Spec
Goal
Each of the four repos publishes an installable
.pkg.tar.zston release.Design
One
PKGBUILD+ onepackage.ymlper repo, both copied from #16's proven pair. The only per-repo work ispackage()anddepends.omarchy-aikitis the exception worth naming: its existingaikit-gitPKGBUILD builds HEAD viagit describe. It becomes a tag-basedaikitpackage, keeping itscheck()(bin/aikit-selftest) and itsaikit.installpost-install note. Both cannot beprovides/conflictspeers by accident — the-gitvariant is retired, not kept alongside.jarvisneeds a decision this issue must not defer silently: its Piper voices and wake models are large binaries fetched byinstall.sh. Shipping them makes a fat package; depending on a fetch makes a package that needs the network. Default taken: keep them out of the package and have the post-install note say to runjarvis setup— a voice assistant that cannot reach the network has bigger problems than a missing package.Acceptance criteria
*.pkg.tar.*asset.tar -tfon each shows the same destinations that repo'sinstall.shwrites.omarchy-aikitpublishesaikit, notaikit-git, and no release carries both.jarvis's package installs without network access; its post-install note names the setup step that needs one.install.shchanged behaviour.Testing decisions
Seams under test: the built package's file list (
tar -tf) and the release's asset list.Prior art: #16's own PKGBUILD-vs-install.sh test, copied per repo.
A good test here: the same drift test as #C1 — every path
install.shwrites has a counterpart inpackage().Out of scope
apple-glass,apple-glass-light,macarchy-install(see Releases publish no installable package, only GitHub's source zip #14's Out of scope).omarchy-aquarium— it compiles, and is its own slice.🛠️ Implementation plan
Goal: four more repos publish packages, using #16's proven pair.
Architecture: one PKGBUILD + one workflow per repo; each repo's own test suite.
Tech stack: bash,
makepkg7, GitHub Actions,archlinux:base-devel.Seams under test: the built package's file list (
tar -tf) and the release's asset list.Global constraints
package()anddependsare per-repo.PKGEXTorsite-packages.feat.Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>.Task 1: macos-dynamic-wallpaper — the smallest mapping first
Files: create
PKGBUILD,.github/workflows/package.yml; testtests/test_pkgbuild.py.Interfaces:
arch=('any');package()landsbin/macos-dynamic-wallpaper, the unit and the timer.install.sh's destinations).makepkg -f --nodepsandtar -tfthe result.package.yml; assert the trigger is release-only.feat(pkg): publish an installable package on release.Task 2: macarchy-core — the biggest mapping
Files: create
PKGBUILD,.github/workflows/package.yml; testtests/test_pkgbuild.sh.Interfaces:
arch=('any'); scripts to/usr/bin, udev to/usr/lib/udev/rules.d, units to/usr/lib/systemd/user, shell plugins to/usr/share/macarchy-core/shell-plugins.install.sh's destinations.tar -tfit. Decide where the shell plugins belong system-wide and say so in a comment.package.yml; assert release-only.feat(pkg): publish an installable package on release.Task 3: omarchy-aikit — convert the existing -git PKGBUILD
Files: modify
PKGBUILD; create.github/workflows/package.yml; testtests/test_pkgbuild.sh.Interfaces:
pkgname=aikitsourced from the release tarball;pkgver()removed;check()andaikit.installkept.pkgnameisaikit,sourceis the tarball, and nopkgver()remains.-gitvariant rather than leaving both.check()still runsbin/aikit-selftest.package.yml; assert release-only.feat(pkg): publish a tag-based package instead of the -git PKGBUILD.Task 4: jarvis — package the program, not the voices
Files: create
PKGBUILD,jarvis.install,.github/workflows/package.yml; testtests/test_pkgbuild.sh.Interfaces:
arch=('any'); CLI, plugin, units. Voices and models excluded;jarvis.installnames the setup step.package(), and that the post-install note names the setup step.jarvis.install; build andtar -tf; confirm the package is small and network-free.package.yml; assert release-only.feat(pkg): publish an installable package on release.## Decisions so far.