You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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().
omarchy-aquarium — it compiles, and is its own slice.
🛠️ 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.
Step 6: Commit: feat(pkg): publish an installable package on release.
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.
Step 1: Write the failing drift test over install.sh's destinations.
Step 2: Run → FAIL.
Step 3: Write the PKGBUILD; build and tar -tf it. Decide where the shell plugins belong system-wide and say so in a comment.
Step 4: Copy package.yml; assert release-only.
Step 5: Re-run → PASS.
Step 6: Commit: 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; test tests/test_pkgbuild.sh.
Interfaces:pkgname=aikit sourced from the release tarball; pkgver() removed; check() and aikit.install kept.
Step 1: Write the failing test — assert pkgname is aikit, source is the tarball, and no pkgver() remains.
Step 2: Run → FAIL.
Step 3: Convert it. Retire the -git variant rather than leaving both.
Step 4: Build locally; confirm check() still runs bin/aikit-selftest.
Step 5: Copy package.yml; assert release-only.
Step 6: Re-run → PASS.
Step 7: Commit: 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; test tests/test_pkgbuild.sh.
Interfaces:arch=('any'); CLI, plugin, units. Voices and models excluded; jarvis.install names the setup step.
Step 1: Write the failing test — assert no voice or model file appears in package(), and that the post-install note names the setup step.
Step 2: Run → FAIL.
Step 3: Write the PKGBUILD and jarvis.install; build and tar -tf; confirm the package is small and network-free.
Step 4: Copy package.yml; assert release-only.
Step 5: Re-run → PASS.
Step 6: Commit: feat(pkg): publish an installable package on release.
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) <noreply@anthropic.com>.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.