aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-25 10:37:06 +0200
committerDanilo M. <danix@danix.xyz>2026-09-25 10:37:06 +0200
commit20410eb37442a510e9ca3f1b038cee647ae5bf21 (patch)
tree26819129dcdc1614e7861122a2d1ba9c38783d44
parent9e4f0fa4c4273a81f40f26177604c43856dff8c1 (diff)
downloadslackware-pentesting-suite-20410eb37442a510e9ca3f1b038cee647ae5bf21.tar.gz
slackware-pentesting-suite-20410eb37442a510e9ca3f1b038cee647ae5bf21.zip
Move maintainer tooling out of the repo
Git hooks, the upstream sweep and the SBo delivery workflow are the maintainer's operational tools, not package knowledge. They now live in a private workspace that wraps all three SlackBuild repos, with one shared copy of each hook instead of three drifting ones. Also in this pass: - AGENTS.md: checksum loop documented as sbodl (sbofixinfo does not fix checksums), nvchecker must not run without a token config, prefer use_latest_release over use_max_tag - README: Git Hooks section replaced by a short Contributing note - sweep report renamed to LAST_SWEEP.md across all three repos Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
-rwxr-xr-x.extras/hooks/post-commit66
-rwxr-xr-x.extras/hooks/pre-commit84
-rwxr-xr-x.extras/mksboarchive45
-rw-r--r--.gitignore2
-rw-r--r--AGENTS.md128
-rw-r--r--CLAUDE.md247
-rw-r--r--README.md11
7 files changed, 36 insertions, 547 deletions
diff --git a/.extras/hooks/post-commit b/.extras/hooks/post-commit
deleted file mode 100755
index 6ed63f7..0000000
--- a/.extras/hooks/post-commit
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/bash
-# post-commit hook: create SBo submission archive for added/updated packages
-set -u
-
-REPO_ROOT=$(git rev-parse --show-toplevel)
-SBO_DIR="$REPO_ROOT/SBo"
-
-# Find packages whose .SlackBuild was added (A) or modified (M) in this commit.
-# git diff-tree output format: <status>\t<file>
-# We only want files exactly one directory deep, e.g. hugo/hugo.SlackBuild.
-PACKAGES=()
-while IFS=$'\t' read -r status file; do
- [[ "$status" != "A" && "$status" != "M" ]] && continue
- dir=$(dirname "$file")
- base=$(basename "$file")
- [[ "$dir" == "." ]] && continue # skip root-level files
- [[ "$dir" == *"/"* ]] && continue # skip files deeper than one level
- [[ "$base" == *.SlackBuild ]] || continue
- PACKAGES+=("$dir")
-done < <(git diff-tree --no-commit-id -r --name-status HEAD)
-
-[[ ${#PACKAGES[@]} -eq 0 ]] && exit 0
-
-for pkg in "${PACKAGES[@]}"; do
- echo ""
- echo "==> Package: $pkg"
- echo ""
- echo "Files to be archived:"
- echo "---------------------"
- while IFS= read -r f; do
- printf '%s\n' "${f#"$REPO_ROOT/"}"
- done < <(find "$REPO_ROOT/$pkg" -type f | sort)
- echo ""
- # Non-interactive override: set SBO_ARCHIVE=yes|no to skip the prompt.
- # Lets agents and scripts answer without a terminal.
- case "${SBO_ARCHIVE:-}" in
- [yY]|[yY][eE][sS]) answer=yes ;;
- [nN]|[nN][oO]) echo " -> Skipped (SBO_ARCHIVE=no)."; continue ;;
- "")
- # No override: need an interactive terminal to prompt.
- if [ ! -r /dev/tty ]; then
- echo " -> No terminal, skipped (set SBO_ARCHIVE=yes to archive)."
- continue
- fi
- printf "Create SBo archive for '%s'? [y/N] " "$pkg"
- answer=""
- read -r answer </dev/tty || answer=""
- ;;
- *) echo " -> Skipped (SBO_ARCHIVE='$SBO_ARCHIVE' unrecognized)."; continue ;;
- esac
- case "$answer" in
- [yY]|[yY][eE][sS])
- mkdir -p "$SBO_DIR"
- if tar -czf "$SBO_DIR/$pkg.tar.gz" -C "$REPO_ROOT" "$pkg"; then
- echo " -> Archive created: SBo/$pkg.tar.gz"
- else
- echo " -> Archive FAILED." >&2
- fi
- ;;
- *)
- echo " -> Skipped."
- ;;
- esac
-done
-
-exit 0
diff --git a/.extras/hooks/pre-commit b/.extras/hooks/pre-commit
deleted file mode 100755
index d2f9506..0000000
--- a/.extras/hooks/pre-commit
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/bash
-
-# 20220315 bkw: SBo pre-commit hook, wrapper for sbolint.
-
-# Installation:
-
-# Copy this to <gitdir>/.git/hooks, mode 0755 (or anyway, make it
-# executable). Also get sbolint and install it somewhere on $PATH,
-# like /usr/local/bin. sbolint comes from:
-
-# https://slackware.uk/~urchlay/repos/sbostuff/plain/sbolint
-
-# That's a wgettable URL. You can also clone the sbostuff
-# repo from https://slackware.uk/~urchlay/repos/sbostuff if you want.
-
-# Usage:
-
-# Just do your usual "git commit". When you do, sbolint will run on
-# the build you're updating. If it finds any issues, it will cause the
-# commit to abort, so you can fix whatever's wrong and try the commit
-# again.
-
-# Since sbolint isn't perfect, you can skip the check for any commit
-# by running e.g:
-
-# SBOLINT=no git commit <arguments>
-
-# You can also run sbolint by itself, and read its documentation with
-# "sbolint --docs".
-
-set -e
-exec 1>&2
-
-# Check for staged source archives (.tar.gz, .tar.xz, .tar.bz2, .zip, etc.)
-# Symlinks: auto-removed. Regular files: blocked (must not be committed).
-source_pattern='\.\(tar\.gz\|tar\.xz\|tar\.bz2\|tar\.zst\|tgz\|zip\|7z\|rpm\|deb\)$'
-source_blocked=""
-while IFS= read -r f; do
- mode=$(git ls-files --stage -- "$f" | awk '{print $1}')
- if [ "$mode" = "120000" ]; then
- echo "Removing staged symlink to source archive: $f"
- git rm --cached -q -- "$f"
- rm -f "$f"
- else
- source_blocked="$source_blocked $f"
- fi
-done < <(git diff --cached --name-only | grep -i "$source_pattern")
-if [ -n "$source_blocked" ]; then
- echo "*** ERROR: source archives staged for commit:"
- for f in $source_blocked; do echo "*** $f"; done
- echo "*** Remove them with: git rm --cached -- $source_blocked"
- exit 1
-fi
-
-# There should normally only be one changed build per commit, but this
-# rule may get broken when the repo's frozen pending a new Slackware
-# release. So use a loop.
-
-# The weird-looking "< <(command)" syntax is why this script must
-# have a #!/bin/bash at the top: it won't work with #!/bin/sh, even if
-# /bin/sh is a symlink to bash.
-
-if [ "${SBOLINT:-yes}" = "yes" ]; then
- sbolintfailed=""
- if ! which sbolint &>/dev/null; then
- echo "WARNING: can't find sbolint in PATH, no linting will be done"
- else
- while read build; do
- # if there's no slack-desc or README, assume the build has been removed.
- # the directory still might exist after a "git rm -rf" because it
- # might contain untracked files (e.g. the source tarball).
- if [ -e "$build/slack-desc" -o -e "$build/README" ]; then
- sbolint "$build" || sbolintfailed=1
- fi
- done < <(git diff --cached --name-only | cut -d/ -f1,2 | sort -u)
- fi
- if [ -n "$sbolintfailed" ]; then
- echo "*** sbolint failed, fix the errors or set SBOLINT=no"
- echo "*** in the environment to commit anyway."
- exit 1
- fi
-fi
-
-exit 0
diff --git a/.extras/mksboarchive b/.extras/mksboarchive
deleted file mode 100755
index 8691f48..0000000
--- a/.extras/mksboarchive
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-# Build the SBo submission tarball SBo/<pkg>.tar.gz for one package.
-# Same archive the post-commit hook produces, but on demand by name.
-set -eu
-
-usage() {
- cat <<EOF
-usage: ${0##*/} <package-name>
-
-Build the SBo submission tarball <package-name>.tar.gz, the same archive the
-post-commit hook produces, on demand by name. Run from the repo root: the
-package is the <package-name>/ directory below the current directory, with a
-matching <package-name>.SlackBuild. Any sbodl source symlinks in the package
-directory are removed first so they never leak into the tarball.
-
-Output goes to SBo/ by default; set OUTPUT to override:
- OUTPUT=/tmp ${0##*/} feroxbuster # writes /tmp/feroxbuster.tar.gz
-EOF
-}
-
-case "${1:-}" in
- -h|--help) usage; exit 0 ;;
-esac
-[ $# -eq 1 ] || { usage >&2; exit 2; }
-
-pkg=$1
-
-# Run this from the repo root. The package is the <pkg>/ directory below the
-# current directory; the tarball is written to SBo/ by default, override with
-# the OUTPUT env var.
-OUTPUT=${OUTPUT:-$PWD/SBo}
-
-# Must be a real package dir below CWD with a matching .SlackBuild.
-if [ ! -f "$pkg/$pkg.SlackBuild" ]; then
- echo "error: no '$pkg/$pkg.SlackBuild' here. Run from the repo root." >&2
- exit 1
-fi
-
-# Drop any sbodl source symlinks before archiving so they never end up in an
-# SBo submission tarball (the pre-commit hook does the same for staged files).
-find "$pkg" -type l -delete
-
-mkdir -p "$OUTPUT"
-tar -czf "$OUTPUT/$pkg.tar.gz" "$pkg"
-echo "Archive created: $OUTPUT/$pkg.tar.gz"
diff --git a/.gitignore b/.gitignore
index 63fa334..fbac2cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
.claude
*.bak
-LAST_SWEEP
+LAST_SWEEP.md
diff --git a/AGENTS.md b/AGENTS.md
index 059e520..6a009e2 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -5,23 +5,6 @@ This file governs how AI agents must behave in this repository.
---
-## Core Rules
-
-1. **Ask before acting.** If anything about the task is ambiguous — target
- version, which package, which build strategy — stop and ask. Do not infer
- intent and proceed.
-2. **Use available skills.** For git operations, commits, PRs, and any task
- covered by a skill, invoke the relevant skill. Do not improvise a workflow
- that a skill already defines.
-3. **One package per task.** Never modify multiple packages in a single
- operation unless explicitly instructed.
-4. **Never skip lint.** Every change must pass `sbolint` before committing.
- No exceptions.
-5. **Never commit without being asked.** Complete all file edits and
- verification steps, then wait for explicit instruction to commit.
-
----
-
## Repository Layout
Each package lives in its own top-level subfolder:
@@ -99,25 +82,17 @@ exact URL for the new version before editing.
### Step 3 — Fix the checksum
-Run `sbofixinfo` from inside the package directory:
-
-```bash
-cd <package-name> && sbofixinfo
-```
-
-If `sbofixinfo` reports no changes (common when the checksum is a placeholder),
-use the two-pass `sbodl` procedure instead:
+`sbofixinfo` does not fix checksums, it only normalizes `.info` formatting.
+The checksum loop is `sbodl`:
```bash
-# Pass 1 — downloads the source; fails because MD5SUM is wrong/placeholder
+# Pass 1: downloads the source and prints
+# WARN: md5sum doesn't match ... got: <new>
cd <package-name> && sbodl
-# Compute the real checksum from the downloaded file
-md5sum <downloaded-file> # adjust filename as needed
-
-# Update the MD5SUM (or MD5SUM_x86_64) in the .info file
+# Put the got: value into MD5SUM (or MD5SUM_x86_64) in the .info file
-# Pass 2 — verifies the checksum; must report "md5sum matches OK"
+# Pass 2: must report "md5sum matches OK"
cd <package-name> && sbodl
```
@@ -157,50 +132,29 @@ Then proceed:
1. Create the package directory with all required files:
`<prgnam>.SlackBuild`, `<prgnam>.info`, `README`, `slack-desc`
2. Choose the correct build strategy and follow the scripting rules below.
-3. Run `sbofixinfo`, then `sbodl` (two-pass if needed), then `sbolint`.
+3. Run `sbofixinfo`, then `sbodl` (two-pass, see above), then `sbolint`.
4. Report results and wait for commit instruction.
---
-## Version Sweep
+## Version Tracking: nvchecker.toml
-The `.extras/nvchecker.toml` file tracks upstream versions for all packages
-in the suite (both in-repo and sbo-slackbuilds). A sweep compares upstream
-against what this repo carries and identifies packages that need updating.
+`.extras/nvchecker.toml` is the **suite catalog**: it tracks upstream versions
+for every tool in the suite, not only the packages in this repo. That
+includes packages maintained in `sbo-slackbuilds` and tools packaged on SBo by
+others (e.g. `hashcat`, `john`). Stanzas without a package directory here are
+intentional; do not remove them. New packages get a stanza too.
-### Procedure
+The file has no `[__config__]`. Do not run it as-is against GitHub: the
+anonymous API budget (60 req/h) runs out and later stanzas 403. Run it from a
+throwaway copy with a `[__config__]` that adds a GitHub token keyfile, and
+probe single stanzas with `nvchecker -c <cfg> -e <name>`. Prefer
+`use_latest_release` over `use_max_tag` for github stanzas; `use_max_tag` is
+tightly rate-limited and only needed for repos that tag without cutting
+Releases.
-1. Generate a throwaway nvchecker config in the scratchpad (`/tmp/opencode/`)
- that prepends a `[__config__]` section pointing at the personal keyfile
- (`~/.config/nvchecker/keys.toml`, provides a GitHub token for 5000 req/h)
- plus scratchpad `oldver`/`newver` paths, then appends the stanzas from
- `.extras/nvchecker.toml`.
-
-2. Run `nvchecker -c <throwaway-config>` on the throwaway config. With a
- fresh `oldver`, every stanza reports "updated to X" — that is the
- *upstream* version, not a diff.
-
-3. For each **in-repo** package (cadaver, netexec, windows-binaries,
- webshells), compare the reported upstream version against the `VERSION=`
- in that package's `.info` file. Packages maintained in `sbo-slackbuilds`
- are out of scope for this repo's sweep.
-
-4. Update `LAST_SWEEP` (gitignored) with the date and a table showing
- carried version, upstream version, and status (current / needs bump)
- for each in-repo package.
-
-5. For any package that needs a bump, follow the Mandatory Workflow:
- Updating a Package Version above.
-
-### Important notes
-
-- Never run `nvchecker -c .extras/nvchecker.toml` directly — the tracked
- config has no `[__config__]`, so GitHub stanzas hit the anonymous rate
- limit (60 req/h) and 403.
-- Probe a single package with `nvchecker -c <config> -e <name>` when
- testing a specific stanza.
-- Never audit GitHub repos with raw `curl` loops — a burst burns the
- anonymous quota and later calls 403.
+Maintainer tooling (git hooks, the upstream sweep, test builds, SBo archive
+builder) is kept outside this repo, in the maintainer's private workspace.
---
@@ -348,41 +302,3 @@ Commit conventions:
- Add: `<package-name>: add version X.Y.Z`
- Update: `<package-name>: update to X.Y.Z`
- Fix: `<package-name>: fix <short description>`
-
----
-
-## Git Hooks
-
-Versioned source lives in `.extras/hooks/`. After a fresh clone, install them:
-
-```bash
-cp .extras/hooks/* .git/hooks/ && chmod 0755 .git/hooks/{pre,post}-commit
-```
-
-- `pre-commit` — runs `sbolint` on each changed package; aborts the commit on
- any error. Also auto-removes staged source-archive symlinks and blocks
- staged regular source archives (`*.tar.*`, `*.zip`, `*.deb`, etc.). Skip
- with `SBOLINT=no git commit ...`.
-- `post-commit` — for each added/updated `*.SlackBuild`, offers to build the
- SBo submission tarball into `SBo/<package>.tar.gz`.
-
-### `SBO_ARCHIVE` (non-interactive archive answer)
-
-`post-commit` normally prompts on a TTY. To answer without one (agents,
-scripts), set `SBO_ARCHIVE`:
-
-- `SBO_ARCHIVE=yes git commit ...` — build the tarball, no prompt
-- `SBO_ARCHIVE=no git commit ...` — skip, no prompt
-- unset + TTY → interactive prompt; unset + no TTY → skip
-
----
-
-## What Requires User Confirmation
-
-Stop and ask before doing any of the following:
-
-- Committing or pushing changes
-- Modifying files in more than one package directory
-- Deleting any file
-- Bypassing the pre-commit hook (`SBOLINT=no`)
-- Any action not covered by the workflows above
diff --git a/CLAUDE.md b/CLAUDE.md
index 417eab2..c3388e7 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,245 +1,8 @@
# Slackware Pentesting Suite
-A curated collection of penetration testing tools packaged as SlackBuilds for
-Slackware GNU/Linux, following [SlackBuilds.org (SBo)](https://slackbuilds.org)
-conventions where applicable.
+This file is intentionally thin. AGENTS.md is the single source of truth for
+this repository's rules and workflows, shared across every agent tool (Claude
+Code, opencode, etc). Do not re-populate this file with duplicated content,
+edit AGENTS.md instead.
----
-
-## Repo Structure
-
-Each package lives in its own top-level subfolder:
-
-```
-<package-name>/
-├── <package-name>.SlackBuild # Main build script
-├── <package-name>.info # Metadata (version, checksums, URLs)
-├── README # Description and usage notes
-├── slack-desc # Package description (11-line format)
-├── <package-name>.desktop # (optional) Desktop entry for GUI apps
-├── doinst.sh # (optional) Post-install script
-├── rc.<daemon> # (optional) Init script for daemon packages
-├── patches/ # (optional) Patch directory for source builds
-│ ├── series # (optional) Ordered patch list
-│ └── *.patch
-└── [...] # Other optional files (man pages, completions, etc.)
-```
-
----
-
-## Build Strategies
-
-Packages in this repo fall into several categories — the SlackBuild style
-differs accordingly.
-
-### 1. Source builds (Python)
-
-Packages such as `netexec` are built from upstream source using the Python
-build backend (see `~/Templates/SlackBuilds/python-template.SlackBuild`).
-
-### 2. Source builds (autotools / cmake)
-
-Packages such as `cadaver` are built from source using `./configure` or
-`cmake`. Follow standard SBo template conventions.
-
-### 3. Data / archive packages
-
-Packages such as `webshells`, `windows-binaries` install data files rather
-than compiled binaries. No stripping needed.
-
-> Several packages that used to live here (the Go builds `ffuf`/`gobuster`/
-> `nuclei`, the Rust build `feroxbuster`, the `.deb` repack
-> `metasploit-framework-bin`, and the data packages `SecLists`/`exploitdb`)
-> are now danix-official on SlackBuilds.org and maintained in the separate
-> [sbo-slackbuilds](https://github.com/danixland/sbo-slackbuilds) repo. Their
-> build strategies (Go/Rust source builds, `.deb` repack, the metasploit
-> msfvenom-completion and man-page regeneration) are documented in that repo's
-> `CLAUDE.md`.
-
----
-
-## SlackBuild Scripting Guidelines
-
-### Templates (source of truth)
-
-Local templates live in `~/Templates/SlackBuilds/`. **Always start from the
-matching template there** rather than writing a SlackBuild or its accompanying
-files from scratch or from memory. The directory holds:
-
-- Per-build-type SlackBuild templates: `autotools-template.SlackBuild`,
- `cmake-template.SlackBuild`, `meson-template.SlackBuild`,
- `go-template.SlackBuild`, `conraid-go-template.SlackBuild`,
- `python-template.SlackBuild`, `perl-template.SlackBuild`,
- `rubygem-template.SlackBuild`, `haskell-template.SlackBuild`. Pick the one
- matching the package's build system.
-- Shared support files: `slack-desc`, `template.info`, `doinst.sh`,
- `douninst.sh`, `README`. Use these as the base for the corresponding files
- in a package.
-
-When the local template and the upstream SBo template disagree, the local one
-wins. Only fall back to the [SBo template](https://slackbuilds.org/templates/)
-if no local template fits.
-
-### Copyright line
-
-In every `.SlackBuild`, the maintainer copyright line is exactly:
-
-```
-# Copyright <year> danix <danix@danix.xyz>
-```
-
-### General
-
-- Use `set -e` to abort on errors
-- Honor `$TMP`, `$BUILD`, `$TAG`, `$OUTPUT`; provide defaults if unset
-- Use `$ARCH` detection with proper `SLKCFLAGS` and `LIBDIRSUFFIX`
-- Strip binaries and libraries unless the package type makes it irrelevant
-- Install docs to `/usr/doc/$PRGNAM-$VERSION/`
-- Always include `find -L` + `chown`/`chmod` cleanup block before packaging
-- Use `makepkg -l y -c n` to create the final package
-
-### Patch support
-
-When upstream patches are needed, store them in `patches/` and apply via:
-
-```bash
-if compgen -G "$CWD/patches/*.patch" > /dev/null; then
- if [ -f "$CWD/patches/series" ]; then
- while IFS= read -r PATCH; do
- [ -z "$PATCH" ] && continue
- [ "${PATCH#\#}" != "$PATCH" ] && continue
- patch -p1 -i "$CWD/patches/$PATCH"
- done < "$CWD/patches/series"
- else
- for PATCH in "$CWD"/patches/*.patch; do
- patch -p1 -i "$PATCH"
- done
- fi
-fi
-```
-
----
-
-## `.info` File
-
-Must contain:
-
-```
-PRGNAM="..."
-VERSION="..."
-HOMEPAGE="..."
-DOWNLOAD="..."
-MD5SUM="..."
-DOWNLOAD_x86_64=""
-MD5SUM_x86_64=""
-REQUIRES=""
-MAINTAINER="danix"
-EMAIL="danix@danix.xyz"
-```
-
-- Use `DOWNLOAD="UNSUPPORTED"` when no 32-bit source exists
-- Use `DOWNLOAD_x86_64` / `MD5SUM_x86_64` for architecture-specific downloads
-- Checksums must match the exact source archive
-- `REQUIRES=""` if no SBo dependencies; list space-separated SBo names otherwise
-- For packages originally authored by others (e.g. Nessus), preserve the
- original `MAINTAINER` and `EMAIL` values
-
----
-
-## `slack-desc`
-
-- Exactly 11 lines in the `package-name: description` format
-- First line: `package-name: package-name (short one-liner)`
-- Lines 2–11: description; blank lines use `package-name:` with nothing after
-- Do not include the ruler line in the committed file
-
----
-
-## Tooling: sbo-maintainer-tools
-
-Source: https://slackware.uk/~urchlay/repos/sbo-maintainer-tools
-
-| Tool | Purpose |
-|------|---------|
-| `sbolint` | Lint `.SlackBuild`, `README`, `.info`, `slack-desc` |
-| `sbopkglint` | Lint the built package |
-| `sbofixinfo` | Auto-fix common `.info` file issues |
-| `sbodl` | Download sources and verify `MD5SUM`/`SHA256SUM` from `.info` |
-
-### Workflow per package
-
-```bash
-# 1. Fix any .info issues automatically
-cd <package-name> && sbofixinfo
-
-# 2. Download sources and verify checksums
-# NOTE: when updating to a new version, sbodl will download the source but fail
-# because the .info file still has the old (or placeholder) MD5SUM. In that case:
-# a) compute the checksum manually: md5sum <source-file>
-# b) update MD5SUM in the .info file
-# c) run sbodl again — it should now report "md5sum matches OK"
-cd <package-name> && sbodl
-
-# 3. Lint the script and metadata
-cd <package-name> && sbolint
-
-# 4. Build the package
-cd <package-name> && sudo bash <package-name>.SlackBuild
-
-# 5. Lint the built package
-cd <package-name> && sbopkglint
-
-# 6. Remove symlinks created by sbodl before staging
-# sbodl creates symlinks in the package directory pointing to downloaded sources.
-# These must never be committed to git.
-find . -type l -delete
-
-# 7. Commit
-git add <package-name>/
-git commit -m'<package-name>: add version X.Y.Z'
-```
-
----
-
-## Git Hooks
-
-Versioned source lives in `.extras/hooks/`. They are NOT auto-installed
-(git ignores `.git/hooks/` only if `core.hooksPath` is unset; the user's
-global `core.hooksPath` dispatches to `.git/hooks/<name>` when executable).
-After a fresh clone, install them:
-
-```bash
-cp .extras/hooks/* .git/hooks/ && chmod 0755 .git/hooks/{pre,post}-commit
-```
-
-- `pre-commit` — runs `sbolint` on each changed package; aborts the commit on
- any error. Also auto-removes staged source-archive symlinks and blocks
- staged regular source archives (`*.tar.*`, `*.zip`, `*.deb`, etc.). Skip
- with `SBOLINT=no git commit ...`.
-- `post-commit` — for each added/updated `*.SlackBuild`, offers to build the
- SBo submission tarball into `SBo/<package>.tar.gz`.
-
-### `SBO_ARCHIVE` (non-interactive archive answer)
-
-`post-commit` normally prompts on a TTY. To answer without one (agents,
-scripts), set `SBO_ARCHIVE`:
-
-- `SBO_ARCHIVE=yes git commit ...` — build the tarball, no prompt
-- `SBO_ARCHIVE=no git commit ...` — skip, no prompt
-- unset + TTY → interactive prompt; unset + no TTY → skip
-
----
-
-## Commit Conventions
-
-- One commit per package add/update
-- Commit message format:
- - Add: `<package-name>: add version X.Y.Z`
- - Update: `<package-name>: update to X.Y.Z`
- - Fix: `<package-name>: fix <short description>`
-
----
-
-## Maintainer
-
-danix — danix@danix.xyz
+@AGENTS.md
diff --git a/README.md b/README.md
index bfe05da..5d78614 100644
--- a/README.md
+++ b/README.md
@@ -69,9 +69,14 @@ Where a tool lives:
## Maintainer tooling
-The `.extras/` folder holds the tools used when maintaining this repo (git
-hooks, version-tracking config, and helper scripts). They are not needed to
-install any of the packages.
+The `.extras/` folder holds the suite's version-tracking config
+(`nvchecker.toml`) and `setup.sh`, a post-install helper that links the
+installed wordlists under `/usr/share/wordlists`. Neither is needed to build
+any of the packages.
+
+Contributing: run
+[`sbolint`](https://slackware.uk/~urchlay/repos/sbo-maintainer-tools) on every
+changed package before sending a patch or pull request.
## Development Approach