diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-25 10:37:06 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-25 10:37:06 +0200 |
| commit | 20410eb37442a510e9ca3f1b038cee647ae5bf21 (patch) | |
| tree | 26819129dcdc1614e7861122a2d1ba9c38783d44 | |
| parent | 9e4f0fa4c4273a81f40f26177604c43856dff8c1 (diff) | |
| download | slackware-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-commit | 66 | ||||
| -rwxr-xr-x | .extras/hooks/pre-commit | 84 | ||||
| -rwxr-xr-x | .extras/mksboarchive | 45 | ||||
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | AGENTS.md | 128 | ||||
| -rw-r--r-- | CLAUDE.md | 247 | ||||
| -rw-r--r-- | README.md | 11 |
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" @@ -1,3 +1,3 @@ .claude *.bak -LAST_SWEEP +LAST_SWEEP.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 @@ -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 @@ -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 |
