Compare commits

...

7 Commits

Author SHA1 Message Date
94556f1fe0 chore(owlry): bump version to 1.0.3 2026-03-28 10:48:55 +01:00
2b98f0651c fix(ui): fall back to Adwaita when system icon theme is broken
If the configured icon theme (e.g. Sweet-Blue) doesn't exist on disk,
GTK falls back to hicolor which has almost no icons. Detect this by
probing for a standard icon, and set Adwaita as the theme — it's
guaranteed to exist as a GTK4 dependency.

This replaces the broken add_search_path("/usr/share/icons/Adwaita")
approach which doesn't work because search paths are scoped to the
active theme name, not the directory name.
2026-03-28 10:48:39 +01:00
75fa770c94 chore: overhaul justfile for current deployment pipeline
Key fixes:
- aur-update-pkg uses correct per-crate tag URLs ({crate}-v{version})
- tag-crate creates per-crate tags instead of generic v{version}
- aur-stage handles embedded .git dirs in AUR subdirectories
- aur-commit stages all AUR files with .git workaround
- release-crate does full pipeline: bump → push → tag → AUR update → publish
- Removed stale release-core recipe that used wrong tag format
2026-03-28 10:31:32 +01:00
c6ba91f06d fix(aur): restrict owlry-core check() to unit tests
The integration test (server_test) loads native plugins which segfault
in the clean makepkg build environment. Use --lib to run only unit tests.
2026-03-28 10:06:07 +01:00
235103e854 fix(aur): correct b2sums for owlry and owlry-core tarballs 2026-03-28 09:54:12 +01:00
8ccaaf28c8 docs: update README for client/daemon package split
- Separate package tables for core, plugins, and meta bundles
- Add owlry-plugin-converter to plugin list and meta-essentials
- Fix build instructions: plugins are in owlry-plugins repo
- Update plugin count to 14
- Remove dead link to gitignored CLAUDE.md
2026-03-28 09:51:29 +01:00
cfd143fe4a chore: track AUR package files (PKGBUILD, .SRCINFO)
The aur/ directory was entirely gitignored, preventing PKGBUILD and
.SRCINFO files from being tracked. Fix .gitignore to only ignore
build artifacts and nested .git dirs, matching the owlry-plugins
repo convention.
2026-03-28 09:34:21 +01:00
22 changed files with 729 additions and 362 deletions

4
.gitignore vendored
View File

@@ -4,6 +4,7 @@ CLAUDE.md
media.md
# AUR packages (each is its own git repo for aur.archlinux.org)
# Track PKGBUILD and .SRCINFO, ignore build artifacts and sub-repo .git
aur/*/.git/
aur/*/pkg/
aur/*/src/
@@ -11,6 +12,3 @@ aur/*/*.tar.zst
aur/*/*.tar.gz
aur/*/*.tar.xz
aur/*/*.pkg.tar.*
# Keep PKGBUILD and .SRCINFO tracked
.SRCINFO
aur/

2
Cargo.lock generated
View File

@@ -2536,7 +2536,7 @@ dependencies = [
[[package]]
name = "owlry"
version = "1.0.2"
version = "1.0.3"
dependencies = [
"chrono",
"clap",

View File

@@ -13,7 +13,7 @@ A lightweight, owl-themed application launcher for Wayland, built with GTK4 and
- **Client/daemon architecture** — Instant window appearance, providers stay loaded in memory
- **Modular plugin architecture** — Install only what you need
- **Fuzzy search with tags** — Fast matching across names, descriptions, and category tags
- **13 native plugins** — Calculator, clipboard, emoji, weather, media, and more
- **14 native plugins** — Calculator, clipboard, emoji, weather, media, and more
- **Widget providers** — Weather, media controls, and pomodoro timer at the top of results
- **Config profiles** — Named mode presets for different workflows
- **Filter prefixes** — Scope searches with `:app`, `:cmd`, `:tag:development`, etc.
@@ -35,7 +35,7 @@ yay -S owlry
yay -S owlry-plugin-calculator owlry-plugin-weather
# Or install bundles:
yay -S owlry-meta-essentials # calculator, system, ssh, scripts, bookmarks
yay -S owlry-meta-essentials # calculator, converter, system, ssh, scripts, bookmarks
yay -S owlry-meta-widgets # weather, media, pomodoro
yay -S owlry-meta-tools # clipboard, emoji, websearch, filesearch, systemd
yay -S owlry-meta-full # everything
@@ -47,22 +47,42 @@ yay -S owlry-rune # Rune runtime
### Available Packages
**Core packages** (this repo):
| Package | Description |
|---------|-------------|
| `owlry` | GTK4 UI client |
| `owlry-core` | Headless daemon (plugin host, IPC server) |
| `owlry-lua` | Lua 5.4 script runtime for user plugins |
| `owlry-rune` | Rune script runtime for user plugins |
**Plugin packages** ([owlry-plugins](https://somegit.dev/Owlibou/owlry-plugins) repo):
| Package | Description |
|---------|-------------|
| `owlry` | Core: UI client (`owlry`) and daemon (`owlry-core`) |
| `owlry-plugin-calculator` | Math expressions (`= 5+3`) |
| `owlry-plugin-system` | Shutdown, reboot, suspend, lock |
| `owlry-plugin-ssh` | SSH hosts from `~/.ssh/config` |
| `owlry-plugin-clipboard` | History via cliphist |
| `owlry-plugin-emoji` | 400+ searchable emoji |
| `owlry-plugin-scripts` | User scripts |
| `owlry-plugin-bookmarks` | Firefox, Chrome, Brave, Edge bookmarks |
| `owlry-plugin-websearch` | Web search (`? query`) |
| `owlry-plugin-calculator` | Math expressions (`= 5+3`) |
| `owlry-plugin-clipboard` | History via cliphist |
| `owlry-plugin-converter` | Unit and currency conversion |
| `owlry-plugin-emoji` | 400+ searchable emoji |
| `owlry-plugin-filesearch` | File search (`/ filename`) |
| `owlry-plugin-systemd` | User services with actions |
| `owlry-plugin-weather` | Weather widget |
| `owlry-plugin-media` | MPRIS media controls |
| `owlry-plugin-pomodoro` | Pomodoro timer widget |
| `owlry-plugin-scripts` | User scripts |
| `owlry-plugin-ssh` | SSH hosts from `~/.ssh/config` |
| `owlry-plugin-system` | Shutdown, reboot, suspend, lock |
| `owlry-plugin-systemd` | User services with actions |
| `owlry-plugin-weather` | Weather widget |
| `owlry-plugin-websearch` | Web search (`? query`) |
**Meta bundles:**
| Package | Includes |
|---------|----------|
| `owlry-meta-essentials` | bookmarks, calculator, converter, scripts, ssh, system |
| `owlry-meta-tools` | clipboard, emoji, filesearch, systemd, websearch |
| `owlry-meta-widgets` | media, pomodoro, weather |
| `owlry-meta-full` | All plugins + runtimes |
### Build from Source
@@ -83,22 +103,29 @@ sudo dnf install gtk4-devel gtk4-layer-shell-devel
git clone https://somegit.dev/Owlibou/owlry.git
cd owlry
# Build core only (daemon + UI)
# Build daemon + UI
cargo build --release -p owlry -p owlry-core
# Build specific plugin
cargo build --release -p owlry-plugin-calculator
# Build runtimes (for user plugins)
cargo build --release -p owlry-lua -p owlry-rune
# Build everything
# Build everything in this workspace
cargo build --release --workspace
```
**Plugins** are in a [separate repo](https://somegit.dev/Owlibou/owlry-plugins):
```bash
git clone https://somegit.dev/Owlibou/owlry-plugins.git
cd owlry-plugins
cargo build --release -p owlry-plugin-calculator # or any plugin
```
**Install locally:**
```bash
just install-local
```
This installs both binaries, all plugins, runtimes, and the systemd service files.
This installs the UI, daemon, runtimes, and systemd service files.
## Getting Started
@@ -457,8 +484,6 @@ owlry-core (daemon) owlry (GTK4 UI client)
The daemon keeps providers and plugins loaded in memory, so the UI appears instantly when launched. The UI client is a thin GTK4 layer that sends queries and receives results over the socket.
For detailed architecture information, see [CLAUDE.md](CLAUDE.md).
## License
GNU General Public License v3.0 — see [LICENSE](LICENSE).

13
aur/owlry-core/.SRCINFO Normal file
View File

@@ -0,0 +1,13 @@
pkgbase = owlry-core
pkgdesc = Core daemon for the Owlry application launcher — manages plugins, providers, and search
pkgver = 1.1.1
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = x86_64
license = GPL-3.0-or-later
makedepends = cargo
depends = gcc-libs
source = owlry-core-1.1.1.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-core-v1.1.1.tar.gz
b2sums = 2924468a55fa62979b324c0c48cff2fa13e348f1d21a6ca5e19596bfbeb88fc932b285586275b219bcd75cacc72c1d1d9fecfe13c90dcbc4b258a193bcda1047
pkgname = owlry-core

41
aur/owlry-core/PKGBUILD Normal file
View File

@@ -0,0 +1,41 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-core
pkgver=1.1.1
pkgrel=1
pkgdesc='Core daemon for the Owlry application launcher — manages plugins, providers, and search'
arch=('x86_64')
url='https://somegit.dev/Owlibou/owlry'
license=('GPL-3.0-or-later')
depends=('gcc-libs')
makedepends=('cargo')
source=("$pkgname-$pkgver.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-core-v$pkgver.tar.gz")
b2sums=('2924468a55fa62979b324c0c48cff2fa13e348f1d21a6ca5e19596bfbeb88fc932b285586275b219bcd75cacc72c1d1d9fecfe13c90dcbc4b258a193bcda1047')
prepare() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}
build() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo build -p owlry-core --frozen --release
}
check() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo test -p owlry-core --frozen --lib
}
package() {
cd "owlry"
install -Dm755 "target/release/owlry-core" "$pkgdir/usr/bin/owlry-core"
install -Dm644 "systemd/owlry-core.service" "$pkgdir/usr/lib/systemd/user/owlry-core.service"
install -Dm644 "systemd/owlry-core.socket" "$pkgdir/usr/lib/systemd/user/owlry-core.socket"
install -dm755 "$pkgdir/usr/lib/owlry/plugins"
install -dm755 "$pkgdir/usr/lib/owlry/runtimes"
}

13
aur/owlry-lua/.SRCINFO Normal file
View File

@@ -0,0 +1,13 @@
pkgbase = owlry-lua
pkgdesc = Lua scripting runtime for Owlry — enables user-created Lua plugins
pkgver = 1.1.0
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = x86_64
license = GPL-3.0-or-later
makedepends = cargo
depends = owlry-core
source = owlry-lua-1.1.0.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-lua-v1.1.0.tar.gz
b2sums = d4b200446a31301b1240fd8eede6e10764d7bbc551f2e5549bfdbdcc0fa4a717677c3c2c69778d2dfa336711ac5b74d4987e46082ea589fed961c9d2ff95af76
pkgname = owlry-lua

40
aur/owlry-lua/PKGBUILD Normal file
View File

@@ -0,0 +1,40 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-lua
pkgver=1.1.0
pkgrel=1
pkgdesc="Lua scripting runtime for Owlry — enables user-created Lua plugins"
arch=('x86_64')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=('owlry-core')
makedepends=('cargo')
source=("$pkgname-$pkgver.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-lua-v$pkgver.tar.gz")
b2sums=('d4b200446a31301b1240fd8eede6e10764d7bbc551f2e5549bfdbdcc0fa4a717677c3c2c69778d2dfa336711ac5b74d4987e46082ea589fed961c9d2ff95af76')
_cratename=owlry-lua
prepare() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}
build() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo build -p $_cratename --frozen --release
}
check() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo test -p $_cratename --frozen --release
}
package() {
cd "owlry"
install -Dm755 "target/release/lib${_cratename//-/_}.so" \
"$pkgdir/usr/lib/owlry/runtimes/liblua.so"
}

View File

@@ -0,0 +1,19 @@
pkgbase = owlry-meta-essentials
pkgdesc = Essential plugin bundle for Owlry (calculator, converter, system, ssh, scripts, bookmarks)
pkgver = 1.0.0
pkgrel = 2
url = https://somegit.dev/Owlibou/owlry
arch = any
license = GPL-3.0-or-later
depends = owlry
depends = owlry-core
depends = owlry-plugin-bookmarks
depends = owlry-plugin-calculator
depends = owlry-plugin-converter
depends = owlry-plugin-scripts
depends = owlry-plugin-ssh
depends = owlry-plugin-system
conflicts = owlry-essentials
replaces = owlry-essentials
pkgname = owlry-meta-essentials

View File

@@ -0,0 +1,20 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-meta-essentials
pkgver=1.0.0
pkgrel=2
pkgdesc="Essential plugin bundle for Owlry (calculator, converter, system, ssh, scripts, bookmarks)"
arch=('any')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=(
'owlry'
'owlry-core'
'owlry-plugin-bookmarks'
'owlry-plugin-calculator'
'owlry-plugin-converter'
'owlry-plugin-scripts'
'owlry-plugin-ssh'
'owlry-plugin-system'
)
replaces=('owlry-essentials')
conflicts=('owlry-essentials')

View File

@@ -0,0 +1,29 @@
pkgbase = owlry-meta-full
pkgdesc = Complete Owlry installation with all official plugins and runtimes
pkgver = 1.0.0
pkgrel = 2
url = https://somegit.dev/Owlibou/owlry
arch = any
license = GPL-3.0-or-later
depends = owlry
depends = owlry-core
depends = owlry-plugin-bookmarks
depends = owlry-plugin-calculator
depends = owlry-plugin-converter
depends = owlry-plugin-scripts
depends = owlry-plugin-ssh
depends = owlry-plugin-system
depends = owlry-plugin-clipboard
depends = owlry-plugin-emoji
depends = owlry-plugin-filesearch
depends = owlry-plugin-systemd
depends = owlry-plugin-websearch
depends = owlry-plugin-media
depends = owlry-plugin-pomodoro
depends = owlry-plugin-weather
optdepends = owlry-lua: Lua runtime for custom user plugins
optdepends = owlry-rune: Rune runtime for custom user plugins
conflicts = owlry-full
replaces = owlry-full
pkgname = owlry-meta-full

View File

@@ -0,0 +1,35 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-meta-full
pkgver=1.0.0
pkgrel=2
pkgdesc="Complete Owlry installation with all official plugins and runtimes"
arch=('any')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=(
'owlry'
'owlry-core'
# Essential plugins
'owlry-plugin-bookmarks'
'owlry-plugin-calculator'
'owlry-plugin-converter'
'owlry-plugin-scripts'
'owlry-plugin-ssh'
'owlry-plugin-system'
# Tool plugins
'owlry-plugin-clipboard'
'owlry-plugin-emoji'
'owlry-plugin-filesearch'
'owlry-plugin-systemd'
'owlry-plugin-websearch'
# Widget plugins
'owlry-plugin-media'
'owlry-plugin-pomodoro'
'owlry-plugin-weather'
)
optdepends=(
'owlry-lua: Lua runtime for custom user plugins'
'owlry-rune: Rune runtime for custom user plugins'
)
replaces=('owlry-full')
conflicts=('owlry-full')

View File

@@ -0,0 +1,18 @@
pkgbase = owlry-meta-tools
pkgdesc = Tool plugin bundle for Owlry (clipboard, emoji, web search, file search, systemd)
pkgver = 1.0.0
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = any
license = GPL-3.0-or-later
depends = owlry
depends = owlry-core
depends = owlry-plugin-clipboard
depends = owlry-plugin-emoji
depends = owlry-plugin-filesearch
depends = owlry-plugin-systemd
depends = owlry-plugin-websearch
conflicts = owlry-tools
replaces = owlry-tools
pkgname = owlry-meta-tools

View File

@@ -0,0 +1,19 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-meta-tools
pkgver=1.0.0
pkgrel=1
pkgdesc="Tool plugin bundle for Owlry (clipboard, emoji, web search, file search, systemd)"
arch=('any')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=(
'owlry'
'owlry-core'
'owlry-plugin-clipboard'
'owlry-plugin-emoji'
'owlry-plugin-filesearch'
'owlry-plugin-systemd'
'owlry-plugin-websearch'
)
replaces=('owlry-tools')
conflicts=('owlry-tools')

View File

@@ -0,0 +1,16 @@
pkgbase = owlry-meta-widgets
pkgdesc = Widget plugin bundle for Owlry (weather, media controls, pomodoro timer)
pkgver = 1.0.0
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = any
license = GPL-3.0-or-later
depends = owlry
depends = owlry-core
depends = owlry-plugin-media
depends = owlry-plugin-pomodoro
depends = owlry-plugin-weather
conflicts = owlry-widgets
replaces = owlry-widgets
pkgname = owlry-meta-widgets

View File

@@ -0,0 +1,17 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-meta-widgets
pkgver=1.0.0
pkgrel=1
pkgdesc="Widget plugin bundle for Owlry (weather, media controls, pomodoro timer)"
arch=('any')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=(
'owlry'
'owlry-core'
'owlry-plugin-media'
'owlry-plugin-pomodoro'
'owlry-plugin-weather'
)
replaces=('owlry-widgets')
conflicts=('owlry-widgets')

13
aur/owlry-rune/.SRCINFO Normal file
View File

@@ -0,0 +1,13 @@
pkgbase = owlry-rune
pkgdesc = Rune scripting runtime for Owlry — enables user-created Rune plugins
pkgver = 1.1.0
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = x86_64
license = GPL-3.0-or-later
makedepends = cargo
depends = owlry-core
source = owlry-rune-1.1.0.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-rune-v1.1.0.tar.gz
b2sums = d4b200446a31301b1240fd8eede6e10764d7bbc551f2e5549bfdbdcc0fa4a717677c3c2c69778d2dfa336711ac5b74d4987e46082ea589fed961c9d2ff95af76
pkgname = owlry-rune

40
aur/owlry-rune/PKGBUILD Normal file
View File

@@ -0,0 +1,40 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry-rune
pkgver=1.1.0
pkgrel=1
pkgdesc="Rune scripting runtime for Owlry — enables user-created Rune plugins"
arch=('x86_64')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=('owlry-core')
makedepends=('cargo')
source=("$pkgname-$pkgver.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-rune-v$pkgver.tar.gz")
b2sums=('d4b200446a31301b1240fd8eede6e10764d7bbc551f2e5549bfdbdcc0fa4a717677c3c2c69778d2dfa336711ac5b74d4987e46082ea589fed961c9d2ff95af76')
_cratename=owlry-rune
prepare() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}
build() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo build -p $_cratename --frozen --release
}
check() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo test -p $_cratename --frozen --release
}
package() {
cd "owlry"
install -Dm755 "target/release/lib${_cratename//-/_}.so" \
"$pkgdir/usr/lib/owlry/runtimes/librune.so"
}

34
aur/owlry/.SRCINFO Normal file
View File

@@ -0,0 +1,34 @@
pkgbase = owlry
pkgdesc = Lightweight Wayland application launcher with plugin support
pkgver = 1.0.2
pkgrel = 1
url = https://somegit.dev/Owlibou/owlry
arch = x86_64
license = GPL-3.0-or-later
makedepends = cargo
depends = owlry-core
depends = gcc-libs
depends = gtk4
depends = gtk4-layer-shell
optdepends = cliphist: clipboard provider support
optdepends = wl-clipboard: clipboard and emoji copy support
optdepends = fd: fast file search
optdepends = owlry-plugin-calculator: calculator provider
optdepends = owlry-plugin-clipboard: clipboard provider
optdepends = owlry-plugin-emoji: emoji picker
optdepends = owlry-plugin-bookmarks: browser bookmarks
optdepends = owlry-plugin-ssh: SSH host launcher
optdepends = owlry-plugin-scripts: custom scripts provider
optdepends = owlry-plugin-system: system actions (shutdown, reboot, etc.)
optdepends = owlry-plugin-websearch: web search provider
optdepends = owlry-plugin-filesearch: file search provider
optdepends = owlry-plugin-systemd: systemd service management
optdepends = owlry-plugin-weather: weather widget
optdepends = owlry-plugin-media: media player controls
optdepends = owlry-plugin-pomodoro: pomodoro timer widget
optdepends = owlry-lua: Lua runtime for user plugins
optdepends = owlry-rune: Rune runtime for user plugins
source = owlry-1.0.2.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-v1.0.2.tar.gz
b2sums = 2924468a55fa62979b324c0c48cff2fa13e348f1d21a6ca5e19596bfbeb88fc932b285586275b219bcd75cacc72c1d1d9fecfe13c90dcbc4b258a193bcda1047
pkgname = owlry

76
aur/owlry/PKGBUILD Normal file
View File

@@ -0,0 +1,76 @@
# Maintainer: vikingowl <christian@nachtigall.dev>
pkgname=owlry
pkgver=1.0.2
pkgrel=1
pkgdesc="Lightweight Wayland application launcher with plugin support"
arch=('x86_64')
url="https://somegit.dev/Owlibou/owlry"
license=('GPL-3.0-or-later')
depends=('owlry-core' 'gcc-libs' 'gtk4' 'gtk4-layer-shell')
makedepends=('cargo')
optdepends=(
'cliphist: clipboard provider support'
'wl-clipboard: clipboard and emoji copy support'
'fd: fast file search'
'owlry-plugin-calculator: calculator provider'
'owlry-plugin-clipboard: clipboard provider'
'owlry-plugin-emoji: emoji picker'
'owlry-plugin-bookmarks: browser bookmarks'
'owlry-plugin-ssh: SSH host launcher'
'owlry-plugin-scripts: custom scripts provider'
'owlry-plugin-system: system actions (shutdown, reboot, etc.)'
'owlry-plugin-websearch: web search provider'
'owlry-plugin-filesearch: file search provider'
'owlry-plugin-systemd: systemd service management'
'owlry-plugin-weather: weather widget'
'owlry-plugin-media: media player controls'
'owlry-plugin-pomodoro: pomodoro timer widget'
'owlry-lua: Lua runtime for user plugins'
'owlry-rune: Rune runtime for user plugins'
)
source=("$pkgname-$pkgver.tar.gz::https://somegit.dev/Owlibou/owlry/archive/owlry-v$pkgver.tar.gz")
b2sums=('2924468a55fa62979b324c0c48cff2fa13e348f1d21a6ca5e19596bfbeb88fc932b285586275b219bcd75cacc72c1d1d9fecfe13c90dcbc4b258a193bcda1047')
prepare() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}
build() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
# Build only the core binary without embedded Lua (Lua runtime is separate package)
cargo build -p owlry --frozen --release --no-default-features
}
check() {
cd "owlry"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo test -p owlry --frozen --no-default-features
}
package() {
cd "owlry"
# Core binary
install -Dm755 "target/release/$pkgname" "$pkgdir/usr/bin/$pkgname"
# Documentation
install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md"
# Example configuration files
install -Dm644 data/config.example.toml "$pkgdir/usr/share/doc/$pkgname/config.example.toml"
install -Dm644 data/style.example.css "$pkgdir/usr/share/doc/$pkgname/style.example.css"
install -Dm755 data/scripts/example.sh "$pkgdir/usr/share/doc/$pkgname/scripts/example.sh"
# Install themes
install -d "$pkgdir/usr/share/$pkgname/themes"
install -Dm644 data/themes/*.css "$pkgdir/usr/share/$pkgname/themes/"
# Example plugins (for user plugin development)
install -d "$pkgdir/usr/share/$pkgname/examples/plugins"
cp -r examples/plugins/* "$pkgdir/usr/share/$pkgname/examples/plugins/"
}

View File

@@ -1,6 +1,6 @@
[package]
name = "owlry"
version = "1.0.2"
version = "1.0.3"
edition = "2024"
rust-version = "1.90"
description = "A lightweight, owl-themed application launcher for Wayland"

View File

@@ -185,16 +185,19 @@ impl OwlryApp {
}
fn setup_icon_theme() {
// Ensure we have icon fallbacks for weather/media icons
// These may not exist in all icon themes
if let Some(display) = gtk4::gdk::Display::default() {
let icon_theme = gtk4::IconTheme::for_display(&display);
// Add Adwaita as fallback search path (has weather and media icons)
icon_theme.add_search_path("/usr/share/icons/Adwaita");
icon_theme.add_search_path("/usr/share/icons/breeze");
debug!("Icon theme search paths configured with Adwaita/breeze fallbacks");
// If the system icon theme can't resolve standard icons (e.g., the
// configured theme doesn't exist on disk), fall back to Adwaita
// which is guaranteed to be installed as a GTK4 dependency.
if !icon_theme.has_icon("edit-find-symbolic") {
debug!(
"System icon theme '{}' cannot resolve standard icons, falling back to Adwaita",
icon_theme.theme_name()
);
icon_theme.set_theme_name(Some("Adwaita"));
}
}
}

560
justfile
View File

@@ -1,65 +1,57 @@
# Owlry build and release automation
# Default recipe
default:
@just --list
# Build debug (all workspace members)
# === Build ===
build:
cargo build --workspace
# Build UI binary only
build-ui:
cargo build -p owlry
# Build core daemon only
build-daemon:
cargo build -p owlry-core
# Build core daemon release
release-daemon:
cargo build -p owlry-core --release
# Run core daemon
run-daemon *ARGS:
cargo run -p owlry-core -- {{ARGS}}
# Build release
release:
cargo build --workspace --release
# Run in debug mode
release-daemon:
cargo build -p owlry-core --release
# === Run ===
run *ARGS:
cargo run -p owlry -- {{ARGS}}
# Run tests
run-daemon *ARGS:
cargo run -p owlry-core -- {{ARGS}}
# === Quality ===
test:
cargo test --workspace
# Check code
check:
cargo check --workspace
cargo clippy --workspace
# Format code
fmt:
cargo fmt --all
# Clean build artifacts
clean:
cargo clean
# Install locally (core + runtimes)
# === Install ===
install-local:
#!/usr/bin/env bash
set -euo pipefail
echo "Building release..."
# Build UI without embedded Lua (smaller binary)
cargo build -p owlry --release --no-default-features
# Build core daemon
cargo build -p owlry-core --release
# Build runtimes
cargo build -p owlry-lua -p owlry-rune --release
echo "Creating directories..."
@@ -71,55 +63,21 @@ install-local:
sudo install -Dm755 target/release/owlry-core /usr/bin/owlry-core
echo "Installing runtimes..."
if [ -f "target/release/libowlry_lua.so" ]; then
sudo install -Dm755 target/release/libowlry_lua.so /usr/lib/owlry/runtimes/liblua.so
echo " → liblua.so"
fi
if [ -f "target/release/libowlry_rune.so" ]; then
sudo install -Dm755 target/release/libowlry_rune.so /usr/lib/owlry/runtimes/librune.so
echo " → librune.so"
fi
[ -f target/release/libowlry_lua.so ] && sudo install -Dm755 target/release/libowlry_lua.so /usr/lib/owlry/runtimes/liblua.so
[ -f target/release/libowlry_rune.so ] && sudo install -Dm755 target/release/libowlry_rune.so /usr/lib/owlry/runtimes/librune.so
echo "Installing systemd service files..."
if [ -f "systemd/owlry-core.service" ]; then
sudo install -Dm644 systemd/owlry-core.service /usr/lib/systemd/user/owlry-core.service
echo " → owlry-core.service"
fi
if [ -f "systemd/owlry-core.socket" ]; then
sudo install -Dm644 systemd/owlry-core.socket /usr/lib/systemd/user/owlry-core.socket
echo " → owlry-core.socket"
fi
[ -f systemd/owlry-core.service ] && sudo install -Dm644 systemd/owlry-core.service /usr/lib/systemd/user/owlry-core.service
[ -f systemd/owlry-core.socket ] && sudo install -Dm644 systemd/owlry-core.socket /usr/lib/systemd/user/owlry-core.socket
echo ""
echo "Installation complete!"
echo " - /usr/bin/owlry (UI)"
echo " - /usr/bin/owlry-core (daemon)"
echo " - $(ls /usr/lib/owlry/runtimes/*.so 2>/dev/null | wc -l) runtimes"
echo " - systemd: owlry-core.service, owlry-core.socket"
echo ""
echo "To start the daemon:"
echo " systemctl --user enable --now owlry-core.service"
echo " OR add 'exec-once = owlry-core' to your compositor config"
echo ""
echo "Note: Install plugins separately from the owlry-plugins repo."
echo "Done. Start daemon: systemctl --user enable --now owlry-core.service"
# === Release Management ===
# === Version Management ===
# AUR package directories (relative to project root)
aur_core_dir := "aur/owlry"
# Get current version from core crate
version := `grep '^version' crates/owlry/Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/'`
# Show current version
show-version:
@echo "Current version: {{version}}"
# Show all crate versions
show-versions:
#!/usr/bin/env bash
echo "=== Crate Versions ==="
for toml in Cargo.toml crates/*/Cargo.toml; do
for toml in crates/*/Cargo.toml; do
name=$(grep '^name' "$toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
ver=$(grep '^version' "$toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
printf " %-30s %s\n" "$name" "$ver"
@@ -129,20 +87,16 @@ show-versions:
crate-version crate:
@grep '^version' crates/{{crate}}/Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/'
# Bump a specific crate version (usage: just bump-crate owlry-core 0.2.0)
# Bump a single crate version, update Cargo.lock, commit
bump-crate crate new_version:
#!/usr/bin/env bash
set -euo pipefail
toml="crates/{{crate}}/Cargo.toml"
if [ ! -f "$toml" ]; then
echo "Error: $toml not found"
exit 1
fi
[ -f "$toml" ] || { echo "Error: $toml not found"; exit 1; }
old=$(grep '^version' "$toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
if [ "$old" = "{{new_version}}" ]; then
echo "{{crate}} is already at {{new_version}}, skipping"
exit 0
fi
[ "$old" = "{{new_version}}" ] && { echo "{{crate}} already at {{new_version}}"; exit 0; }
echo "Bumping {{crate}} from $old to {{new_version}}"
sed -i 's/^version = ".*"/version = "{{new_version}}"/' "$toml"
cargo check -p {{crate}}
@@ -150,7 +104,208 @@ bump-crate crate new_version:
git commit -m "chore({{crate}}): bump version to {{new_version}}"
echo "{{crate}} bumped to {{new_version}}"
# Bump meta-packages (no crate, just AUR version)
# Bump all crates to same version
bump-all new_version:
#!/usr/bin/env bash
set -euo pipefail
for toml in crates/*/Cargo.toml; do
crate=$(basename $(dirname "$toml"))
old=$(grep '^version' "$toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
[ "$old" = "{{new_version}}" ] && continue
echo "Bumping $crate from $old to {{new_version}}"
sed -i 's/^version = ".*"/version = "{{new_version}}"/' "$toml"
done
cargo check --workspace
git add crates/*/Cargo.toml Cargo.lock
git commit -m "chore: bump all crates to {{new_version}}"
echo "All crates bumped to {{new_version}}"
# Bump core UI only
bump new_version:
just bump-crate owlry {{new_version}}
# === Tagging ===
# Tag a specific crate (format: {crate}-v{version})
tag-crate crate:
#!/usr/bin/env bash
set -euo pipefail
ver=$(grep '^version' "crates/{{crate}}/Cargo.toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
tag="{{crate}}-v$ver"
if git rev-parse "$tag" >/dev/null 2>&1; then
echo "Tag $tag already exists"
exit 0
fi
git tag -a "$tag" -m "{{crate}} v$ver"
echo "Created tag $tag"
# Push all local tags
push-tags:
git push --tags
# === AUR Package Management ===
# Stage AUR files into the main repo git index.
# AUR subdirs have their own .git (for aur.archlinux.org), which makes
# git treat them as embedded repos. Temporarily hide .git to stage files.
aur-stage pkg:
#!/usr/bin/env bash
set -euo pipefail
dir="aur/{{pkg}}"
[ -d "$dir" ] || { echo "Error: $dir not found"; exit 1; }
if [ -d "$dir/.git" ]; then
mv "$dir/.git" "$dir/.git.bak"
git add "$dir/PKGBUILD" "$dir/.SRCINFO" "$dir"/*.install 2>/dev/null || true
mv "$dir/.git.bak" "$dir/.git"
else
git add "$dir/PKGBUILD" "$dir/.SRCINFO" "$dir"/*.install 2>/dev/null || true
fi
# Update a specific AUR package PKGBUILD with correct version + checksum
aur-update-pkg pkg:
#!/usr/bin/env bash
set -euo pipefail
aur_dir="aur/{{pkg}}"
[ -d "$aur_dir" ] || { echo "Error: $aur_dir not found"; exit 1; }
# Determine version
case "{{pkg}}" in
owlry-meta-*)
ver=$(grep '^pkgver=' "$aur_dir/PKGBUILD" | sed 's/pkgver=//')
echo "Meta-package {{pkg}} at $ver (bump pkgrel manually if needed)"
(cd "$aur_dir" && makepkg --printsrcinfo > .SRCINFO)
exit 0
;;
*)
crate_dir="crates/{{pkg}}"
[ -d "$crate_dir" ] || { echo "Error: $crate_dir not found"; exit 1; }
ver=$(grep '^version' "$crate_dir/Cargo.toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
;;
esac
tag="{{pkg}}-v$ver"
url="https://somegit.dev/Owlibou/owlry/archive/$tag.tar.gz"
echo "Updating {{pkg}} to $ver (tag: $tag)"
sed -i "s/^pkgver=.*/pkgver=$ver/" "$aur_dir/PKGBUILD"
sed -i 's/^pkgrel=.*/pkgrel=1/' "$aur_dir/PKGBUILD"
# Update checksum from the tagged tarball
if grep -q "^source=" "$aur_dir/PKGBUILD"; then
echo "Downloading tarball and computing checksum..."
hash=$(curl -sL "$url" | b2sum | cut -d' ' -f1)
if [ -z "$hash" ] || [ ${#hash} -lt 64 ]; then
echo "Error: failed to download or hash $url"
exit 1
fi
sed -i "s|^b2sums=.*|b2sums=('$hash')|" "$aur_dir/PKGBUILD"
fi
(cd "$aur_dir" && makepkg --printsrcinfo > .SRCINFO)
echo "{{pkg}} PKGBUILD updated to $ver"
# Shortcut: update core UI AUR package
aur-update:
just aur-update-pkg owlry
# Publish a specific AUR package to aur.archlinux.org
aur-publish-pkg pkg:
#!/usr/bin/env bash
set -euo pipefail
aur_dir="aur/{{pkg}}"
[ -d "$aur_dir/.git" ] || { echo "Error: $aur_dir has no AUR git repo"; exit 1; }
cd "$aur_dir"
ver=$(grep '^pkgver=' PKGBUILD | sed 's/pkgver=//')
git add PKGBUILD .SRCINFO *.install 2>/dev/null || true
git commit -m "Update to v$ver" || { echo "Nothing to commit"; exit 0; }
git push origin master
echo "{{pkg}} v$ver published to AUR!"
# Shortcut: publish core UI to AUR
aur-publish:
just aur-publish-pkg owlry
# Update and publish ALL AUR packages
aur-update-all:
#!/usr/bin/env bash
set -euo pipefail
for dir in aur/*/; do
pkg=$(basename "$dir")
[ -f "$dir/PKGBUILD" ] || continue
echo "=== $pkg ==="
just aur-update-pkg "$pkg"
echo ""
done
echo "All updated. Run 'just aur-publish-all' to publish."
aur-publish-all:
#!/usr/bin/env bash
set -euo pipefail
for dir in aur/*/; do
pkg=$(basename "$dir")
[ -d "$dir/.git" ] || continue
echo "=== $pkg ==="
just aur-publish-pkg "$pkg"
echo ""
done
echo "All published!"
# Show AUR package status
aur-status:
#!/usr/bin/env bash
echo "=== AUR Package Status ==="
for dir in aur/*/; do
pkg=$(basename "$dir")
[ -f "$dir/PKGBUILD" ] || continue
ver=$(grep '^pkgver=' "$dir/PKGBUILD" | sed 's/pkgver=//')
if [ -d "$dir/.git" ]; then
printf " ✓ %-30s %s\n" "$pkg" "$ver"
else
printf " ✗ %-30s %s (no AUR repo)\n" "$pkg" "$ver"
fi
done
# Commit AUR file changes to the main repo (handles embedded .git dirs)
aur-commit msg="chore(aur): update PKGBUILDs":
#!/usr/bin/env bash
set -euo pipefail
for dir in aur/*/; do
pkg=$(basename "$dir")
[ -f "$dir/PKGBUILD" ] || continue
just aur-stage "$pkg"
done
git diff --cached --quiet && { echo "No AUR changes to commit"; exit 0; }
git commit -m "{{msg}}"
# === Release Workflows ===
# Release a single crate: bump → push → tag → update AUR → publish AUR
release-crate crate new_version:
#!/usr/bin/env bash
set -euo pipefail
just bump-crate {{crate}} {{new_version}}
git push
just tag-crate {{crate}}
just push-tags
echo "Waiting for tag to propagate..."
sleep 3
just aur-update-pkg {{crate}}
just aur-commit "chore(aur): update {{crate}} to {{new_version}}"
git push
just aur-publish-pkg {{crate}}
echo ""
echo "{{crate}} v{{new_version}} released and published to AUR!"
# === Meta Package Management ===
# Bump meta-package versions
bump-meta new_version:
#!/usr/bin/env bash
set -euo pipefail
@@ -165,271 +320,14 @@ bump-meta new_version:
done
echo "Meta-packages bumped to {{new_version}}"
# Bump all crates (core UI + daemon + plugin-api + runtimes) to same version
bump-all new_version:
#!/usr/bin/env bash
set -euo pipefail
for toml in crates/*/Cargo.toml; do
crate=$(basename $(dirname "$toml"))
old=$(grep '^version' "$toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
if [ "$old" != "{{new_version}}" ]; then
echo "Bumping $crate from $old to {{new_version}}"
sed -i 's/^version = ".*"/version = "{{new_version}}"/' "$toml"
fi
done
cargo check --workspace
git add crates/*/Cargo.toml Cargo.lock
git commit -m "chore: bump all crates to {{new_version}}"
echo "All crates bumped to {{new_version}}"
# Bump core version (usage: just bump 0.2.0)
bump new_version:
#!/usr/bin/env bash
set -euo pipefail
if [ "{{version}}" = "{{new_version}}" ]; then
echo "Version is already {{new_version}}, skipping bump"
exit 0
fi
echo "Bumping core version from {{version}} to {{new_version}}"
sed -i 's/^version = ".*"/version = "{{new_version}}"/' crates/owlry/Cargo.toml
cargo check -p owlry
git add crates/owlry/Cargo.toml Cargo.lock
git commit -m "chore: bump version to {{new_version}}"
echo "Version bumped to {{new_version}}"
# Create and push a release tag
tag:
#!/usr/bin/env bash
set -euo pipefail
if git rev-parse "v{{version}}" >/dev/null 2>&1; then
echo "Tag v{{version}} already exists, skipping"
exit 0
fi
echo "Creating tag v{{version}}"
git tag -a "v{{version}}" -m "Release v{{version}}"
git push origin "v{{version}}"
echo "Tag v{{version}} pushed"
# Update AUR package (core UI)
aur-update:
#!/usr/bin/env bash
set -euo pipefail
cd "{{aur_core_dir}}"
url="https://somegit.dev/Owlibou/owlry"
echo "Updating PKGBUILD to version {{version}}"
sed -i 's/^pkgver=.*/pkgver={{version}}/' PKGBUILD
sed -i 's/^pkgrel=.*/pkgrel=1/' PKGBUILD
# Update checksums (b2sums)
echo "Updating checksums..."
b2sum=$(curl -sL "$url/archive/v{{version}}.tar.gz" | b2sum | cut -d' ' -f1)
sed -i "s/^b2sums=.*/b2sums=('$b2sum')/" PKGBUILD
# Generate .SRCINFO
echo "Generating .SRCINFO..."
makepkg --printsrcinfo > .SRCINFO
# Show diff
git diff
echo ""
echo "AUR package updated. Review changes above."
echo "Run 'just aur-publish' to commit and push."
# Publish AUR package (core UI)
aur-publish:
#!/usr/bin/env bash
set -euo pipefail
cd "{{aur_core_dir}}"
git add PKGBUILD .SRCINFO
git commit -m "Update to v{{version}}"
git push
echo "AUR package v{{version}} published!"
# Test AUR package build locally (core UI)
aur-test:
#!/usr/bin/env bash
set -euo pipefail
cd "{{aur_core_dir}}"
echo "Testing PKGBUILD..."
makepkg -sf
echo ""
echo "Package built successfully!"
ls -lh *.pkg.tar.zst
# === AUR Package Management (individual packages) ===
# Update a specific AUR package (usage: just aur-update-pkg owlry-core)
aur-update-pkg pkg:
#!/usr/bin/env bash
set -euo pipefail
aur_dir="aur/{{pkg}}"
if [ ! -d "$aur_dir" ]; then
echo "Error: $aur_dir not found"
exit 1
fi
url="https://somegit.dev/Owlibou/owlry"
# Determine crate version
case "{{pkg}}" in
owlry-meta-essentials|owlry-meta-tools|owlry-meta-widgets|owlry-meta-full)
# Meta-packages use static versioning (1.0.0), only bump pkgrel for dep changes
crate_ver=$(grep '^pkgver=' "$aur_dir/PKGBUILD" | sed 's/pkgver=//')
;;
*)
# Get version from crate
crate_dir="crates/{{pkg}}"
if [ ! -d "$crate_dir" ]; then
echo "Error: $crate_dir not found"
exit 1
fi
crate_ver=$(grep '^version' "$crate_dir/Cargo.toml" | head -1 | sed 's/.*"\(.*\)"/\1/')
;;
esac
cd "$aur_dir"
echo "Updating {{pkg}} PKGBUILD:"
echo " pkgver=$crate_ver"
sed -i "s/^pkgver=.*/pkgver=$crate_ver/" PKGBUILD
sed -i 's/^pkgrel=.*/pkgrel=1/' PKGBUILD
# Update checksums
if grep -q "^source=" PKGBUILD; then
echo "Updating checksums..."
b2sum=$(curl -sL "$url/archive/v$crate_ver.tar.gz" | b2sum | cut -d' ' -f1)
sed -i "s/^b2sums=.*/b2sums=('$b2sum')/" PKGBUILD
fi
# Generate .SRCINFO
echo "Generating .SRCINFO..."
makepkg --printsrcinfo > .SRCINFO
git diff --stat
echo ""
echo "{{pkg}} updated. Run 'just aur-publish-pkg {{pkg}}' to publish."
# Publish a specific AUR package
aur-publish-pkg pkg:
#!/usr/bin/env bash
set -euo pipefail
aur_dir="aur/{{pkg}}"
if [ ! -d "$aur_dir" ]; then
echo "Error: $aur_dir not found"
exit 1
fi
cd "$aur_dir"
ver=$(grep '^pkgver=' PKGBUILD | sed 's/pkgver=//')
git add PKGBUILD .SRCINFO
git commit -m "Update to v$ver"
git push origin master
echo "{{pkg}} v$ver published!"
# === Testing ===
# Test a specific AUR package build locally
aur-test-pkg pkg:
#!/usr/bin/env bash
set -euo pipefail
cd "aur/{{pkg}}"
echo "Testing {{pkg}} PKGBUILD..."
makepkg -sf
echo ""
echo "Package built successfully!"
ls -lh *.pkg.tar.zst
# List all AUR packages with their versions
aur-status:
#!/usr/bin/env bash
echo "=== AUR Package Status ==="
for dir in aur/*/; do
pkg=$(basename "$dir")
if [ -f "$dir/PKGBUILD" ]; then
ver=$(grep '^pkgver=' "$dir/PKGBUILD" | sed 's/pkgver=//')
if [ -d "$dir/.git" ]; then
status="✓"
else
status="✗ (not initialized)"
fi
printf " %s %-30s %s\n" "$status" "$pkg" "$ver"
fi
done
# Update ALL AUR packages (core + daemon + runtimes + meta)
aur-update-all:
#!/usr/bin/env bash
set -euo pipefail
echo "=== Updating core UI ==="
just aur-update
echo ""
echo "=== Updating core daemon ==="
just aur-update-pkg owlry-core
echo ""
echo "=== Updating runtimes ==="
just aur-update-pkg owlry-lua
just aur-update-pkg owlry-rune
echo ""
echo "=== Updating meta-packages ==="
for pkg in owlry-meta-essentials owlry-meta-tools owlry-meta-widgets owlry-meta-full; do
echo "--- $pkg ---"
(cd "aur/$pkg" && makepkg --printsrcinfo > .SRCINFO)
done
echo ""
echo "All AUR packages updated. Run 'just aur-publish-all' to publish."
# Publish ALL AUR packages
aur-publish-all:
#!/usr/bin/env bash
set -euo pipefail
echo "=== Publishing core UI ==="
just aur-publish
echo ""
echo "=== Publishing core daemon ==="
just aur-publish-pkg owlry-core
echo ""
echo "=== Publishing runtimes ==="
just aur-publish-pkg owlry-lua
just aur-publish-pkg owlry-rune
echo ""
echo "=== Publishing meta-packages ==="
for pkg in owlry-meta-essentials owlry-meta-tools owlry-meta-widgets owlry-meta-full; do
echo "--- $pkg ---"
just aur-publish-pkg "$pkg"
done
echo ""
echo "All AUR packages published!"
# Full release workflow for core only (bump + tag + aur)
release-core new_version: (bump new_version)
#!/usr/bin/env bash
set -euo pipefail
# Push version bump
git push
# Create and push tag
just tag
# Wait for tag to be available
echo "Waiting for tag to propagate..."
sleep 2
# Update AUR
just aur-update
echo ""
echo "Core release v{{new_version}} prepared!"
echo "Review AUR changes, then run 'just aur-publish'"