SKILL.md


name: maintaining-aur-packages description: Creates and updates AUR packages following Arch packaging standards. Use when creating new AUR packages, updating existing AUR PKGBUILDs, bumping package versions, or when the user mentions AUR, PKGBUILD, makepkg, pacman packaging, or Arch Linux packages.

Code style

  • PKGBUILD is bash; .install files are POSIX-sh–compatible functions
  • Indent 2 spaces; UTF-8; LF endings; no trailing whitespace
  • Single quotes for literals; double quotes when expanding variables
  • Quote variables: "$pkgdir", "$srcdir", and all paths
  • Prefix custom PKGBUILD variables with _ to avoid collisions with makepkg internals
  • Arrays: arch, license, provides, conflicts use ( ... ) syntax
  • arch=('x86_64') for compiled packages; arch=('any') for arch-independent ones
  • license=() must use SPDX identifiers
  • Functions: prepare(), build(), check(), package(); only define the ones needed
  • No sudo, networking, or user config in build/package functions
  • Use install -Dm755 for binaries; set exact modes explicitly
  • Keep checksums in sync with sources
  • Keep .SRCINFO in lockstep with PKGBUILD; never commit build artifacts

Package types

When the working directory contains subdirectories with these suffixes, we're maintaining multiple packages for the same software:

  • suffix-less: Downloads a release archive, builds, and installs from source
  • -bin: Downloads the project's pre-built binary and installs it
  • -git: Clones the primary branch and builds from source; version is determined by updpkgsums, not specified manually

If no subdirectories exist, we're maintaining a single package. The current directory name indicates which type.

Constraints

  • The agent cannot run makepkg. Always give the user a copyable code block of makepkg commands instead.
  • Same applies to makepkg --printsrcinfo > .SRCINFO.
  • Use updpkgsums for checksums (agent can run this).
  • Use namcap to lint built .pkg.tar.zst files (agent can run this).
  • Use b2sums for all packages.

Creating packages

Follow this strict workflow. If a planning or todo tool is available, fill it out in detail; the session might get interrupted and need to resume.

  1. List the contents of the current working directory.

    • Read any text files present.
    • List subdirectory contents (ignore what looks like the upstream project repo).
    • Subdirectories with -bin or -git suffixes mean multiple packages for the same software.
  2. Ask for: package name (provides=), description (pkgdesc=), license (license=()), and the license path inside the project repo (for installing). For each non--git package, ask for the current version and source URL.

    • -git packages: Use "$pkgname::git+https://...#branch=BRANCH" as the source entry (the $pkgname:: prefix ensures makepkg clones into a directory matching $pkgname; the #branch= fragment selects the branch). Add git to makedepends. Use b2sums=('SKIP') — VCS sources have no static content to checksum. Include this versioning function:
      pkgver() {
        cd "$pkgname" || exit
        ( set -o pipefail
          git describe --long --abbrev=7 2>/dev/null | sed 's/\([^-]*-g\)/r\1/;s/-/./g' ||
          printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)"
        )
      }
      
    • -bin packages: Use bin-name-$pkgver::https://... in source, then install bin-name-$pkgver as bin-name. Obtain the license from the original repo. For GitHub sources, the raw URL is https://raw.githubusercontent.com/USER/REPO/refs/tags/{TAG}/LICENSE. For non-GitHub sources, ask for the raw tagged LICENSE URL.
  3. Write a PKGBUILD for each package. Maintainer comment: Amolith <amolith@secluded.site>. If multiple packages, include conflicts=() so they can't coexist. Packages with -git or -bin suffixes use versioned provides: provides=("pkgname=${pkgver}"). Use b2sums (except -git sources, which use 'SKIP').

  4. Ask to find and relay the build system/installation methods recommended by the project (e.g. cargo for Rust, go for Go).

  5. Adapt those instructions for each package's build(), check(), package(), etc. See build-patterns.md for language-specific templates.

  6. Present all diagnostics, whether seemingly relevant or not, with reasoning for each. Resolve genuine issues before proceeding.

  7. Update checksums with updpkgsums in each package directory.

  8. Give the user a copyable code block of makepkg -Ccsi commands. Include cd if multiple packages. Work through any build issues.

  9. After the user builds, run namcap on ./package-name-*.pkg.tar.zst. Report all issues with reasoning.

  10. Give the user makepkg --printsrcinfo > .SRCINFO commands (with cd if multiple packages).

  11. If only PKGBUILDs and .SRCINFOs were created, enter each package directory and git add + git commit them. If other tracked files were modified, show the diff and ask which to commit. Create a .gitignore in each repo listing everything not committed, using appropriate globs.

  12. Clean all artifacts with git clean -fdx.

Updating packages

Follow this strict workflow.

  1. List the contents of the current working directory.

    • Read any text files present.
    • List subdirectory contents (ignore what looks like the upstream project repo).
    • Subdirectories with -bin or -git suffixes mean multiple packages.
  2. We're upgrading to version $VERSION. Read the PKGBUILD(s), then edit the version number for non--git packages.

  3. Update checksums with updpkgsums.

  4. Present all diagnostics with reasoning. Resolve genuine issues before proceeding.

  5. Give the user a copyable code block of makepkg -Ccsi commands. Include cd if multiple packages. Work through any build issues.

  6. After the user builds, run namcap on ./package-name-*.pkg.tar.zst. Report all issues with reasoning.

  7. Give the user makepkg --printsrcinfo > .SRCINFO commands.

  8. If only PKGBUILD and .SRCINFO were modified, git add and git commit them. If other tracked files were modified, show the diff and ask which to commit.

  9. Clean all artifacts with git clean -fdx.

If anything other than pkgver is edited during the update, re-run shellcheck and namcap as appropriate.