Sync a declarative package list with the pacman package manager
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.
 
 
AI Bot 8348cc21df Suppress command output from stdout, only log to file 11 hours ago
.agents Workaround for skills not loading in opencode for whatever reason 5 days ago
.opencode Improve make-commit skill documentation 3 days ago
cmd/declpac Reorder main calls 2 days ago
docs Add make-commit skill and AI commit documentation 5 days ago
openspec Archive experimental OpenSpec changes 15 hours ago
pkg Suppress command output from stdout, only log to file 11 hours ago
.gitignore Do not gitignore main.go file 2 days ago
AGENTS.md Workaround for skills not loading in opencode for whatever reason 5 days ago
LICENSE Update .gitignore and add LICENSE file 5 days ago
Makefile Add Makefile and fix pacman.go 2 days ago
README.md Rewrite README with accurate docs 2 days ago
go.mod Integrate dyalpm for local/sync package queries 4 days ago
go.sum Integrate dyalpm for local/sync package queries 4 days ago
skills-lock.json Initial commit 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

  1. Read — Collect packages from all state files and stdin
  2. Merge — Combine into single package list
  3. Categorize — Check if packages are in official repos or AUR
  4. Sync — Install/update packages via pacman
  5. Build — Build and install AUR packages via makepkg
  6. Mark — Mark declared packages as explicit, all others as dependencies
  7. 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