You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
2 days ago | |
|---|---|---|
| .agents | 5 days ago | |
| .opencode | 3 days ago | |
| cmd/declpac | 2 days ago | |
| docs | 5 days ago | |
| openspec | 3 days ago | |
| pkg | 2 days ago | |
| .gitignore | 3 days ago | |
| AGENTS.md | 5 days ago | |
| LICENSE | 5 days ago | |
| Makefile | 2 days ago | |
| README.md | 3 days ago | |
| go.mod | 4 days ago | |
| go.sum | 4 days ago | |
| skills-lock.json | 5 days ago | |
README.md
declpac
Declarative package manager for Arch Linux that syncs your system with a declared package list using pacman.
Features
- Declarative state management — define your desired package list in files or stdin
- Smart orphan cleanup — removes packages no longer needed
- Explicit package tracking — marks declared packages as explicit
- AUR support — builds and installs AUR packages automatically
- Machine-readable output — perfect for scripting
Installation
Build from Source
git clone https://github.com/Riyyi/declpac.git
cd declpac
go build -o declpac ./cmd/declpac
sudo mv declpac /usr/local/bin/
Dependencies
- Go 1.21+
- pacman
- makepkg (for AUR support)
- git (for AUR support)
- Root privileges
Usage
# Single state file
sudo declpac --state packages.txt
# Multiple state files
sudo declpac --state base.txt --state apps.txt
# From stdin
cat packages.txt | sudo declpac
# Preview changes without applying
sudo declpac --dry-run --state packages.txt
State File Format
One package name per line, lines beginning with # are comments:
bash
vim
git
docker
# this is a comment
Options
| Flag | Alias | Description |
|---|---|---|
--state |
-s |
State file to read package list from (can be used multiple times) |
--dry-run |
Preview changes without applying them | |
--help |
-h |
Show help message |
How It Works
- Read — Collect packages from all state files and stdin
- Merge — Combine into single package list
- Categorize — Check if packages are in official repos or AUR
- Sync — Install/update packages via pacman
- Build — Build and install AUR packages via makepkg
- Mark — Mark declared packages as explicit, all others as dependencies
- Cleanup — Remove orphaned packages
Database Freshness
If the pacman database is older than 24 hours, it is automatically refreshed.
Logging
Operations are logged to /var/log/declpac.log.
Output
# Packages installed/removed
Installed 5 packages, removed 2 packages
# No changes needed
Installed 0 packages, removed 0 packages
# Dry-run preview
Installed 3 packages, removed 1 packages
Would install: vim, git, docker
Would remove: python2
# Error
error: package not found: <package-name>
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error |
Examples
Minimal System
echo -e "base\nbase-devel\nlinux-headers\nvim\ngit\ncurl" > ~/.config/declpac/minimal.txt
sudo declpac --state ~/.config/declpac/minimal.txt
Development Environment
# development.txt
go
nodejs
python
rust
docker
sudo declpac --state development.txt
Dry-Run
sudo declpac --dry-run --state packages.txt
Troubleshooting
Permission denied
Use sudo:
sudo declpac --state packages.txt
Package not found
Check if the package exists:
pacman -Ss <package>
Database sync fails
sudo pacman -Syy
File Structure
declpac/
├── cmd/declpac/
│ └── main.go # Entry point
├── pkg/
│ ├── input/ # State file/stdin reading
│ ├── merge/ # Package merging
│ ├── fetch/ # Package resolution (pacman/AUR)
│ ├── pacman/ # Pacman operations
│ ├── validation/ # Database freshness check
│ ├── output/ # Output formatting
│ └── state/ # Logging
└── README.md
License
GPL-3.0