slopstopper-cli
A Python CLI plus GitHub Actions workflows that run security, hygiene and reliability checks on every PR. One command to install into any repo. This package is the CLI.
Status: Beta. Every check in the public catalogue runs through this package. The CI workflows under
.github/workflows/ss-*.ymlinstall the pinnedslopstopper-cliviajdx/mise-actionand callslopstopper run <category>:<check>, which is the same code path you use locally.
Install
Quick standalone try (unpinned):
pipx install slopstopper-cli
slopstopper --version
slopstopper checks list
slopstopper doctor
Published to PyPI on every release tag.
pipx upgrade slopstopper-clipulls the latest. Each release is also attached to the latest GitHub Release with a Sigstore build-provenance attestation. Verify it withgh attestation verify <wheel> --owner hungovercoders.
For a repo you'll keep, install the pinned suite so local and CI run the same version:
curl -fsSL https://raw.githubusercontent.com/hungovercoders/slopstopper/main/install.sh | bash
Requires mise.
install.shpinsslopstopper-cli+taskinmise.toml(the single source of truth both local runs and CI read) and seeds thess-*.ymlworkflows. Move the pin withinstall.sh --upgrade-cli/--cli-version.
Development (editable, from a clone of this repo):
pip install -e ./cli
slopstopper run hygiene:docs-size
CLI surface
slopstopper run <category>:<check> # run a check, write reports under .ss/reports/
slopstopper emit <c>:<n> --target {pr-comment,issue}
slopstopper discover <check> --event <e> # resolve pages.<check> from sitemap / changed / list
slopstopper config get <key> [<default>] # read .slopstopper.yml
slopstopper templates {list, path <n>, eject <n>} # inspect / customise bundled templates
slopstopper serve # bundled static server (auto-detects worker/headers.json)
slopstopper checks list [--category <c>] [--json]
slopstopper doctor # verify external tools are installed
slopstopper profile {list, show, expand <n>, detect} # project-shape profile (ui / api / library)
slopstopper --quiet … # suppress decorative output (CI logs)
slopstopper with no args prints a banner of the commands above plus a quick-start block.
Run the tests
# From the repo root:
task -t cli/Taskfile.yml test
# Or from cli/:
task test
# Filter to a single test:
task -t cli/Taskfile.yml test -- -k docs_size
From the repo root task contributing:test is an alias for the same target. It is also what CI runs (see ci-cli.yml), so local and CI invocations stay in sync. The Taskfile creates and reuses a project-local venv at cli/.venv/ (gitignored) so it doesn't conflict with system Python under PEP 668.
This workflow is slopstopper-internal. It is not part of the distributed ss-*-check.yml suite and is never seeded into adopter repos.
Layout
slopstopper/cli.pyis the argparse dispatcher and prints the bare-invocation bannerslopstopper/output.pyholds the shared formatters (running / success / warn / error / footer /--quiet)slopstopper/config.pyreads.slopstopper.yml(stdlib-only YAML subset)slopstopper/templates.pyresolves bundled templates and backs thetemplates {list, path, eject}APIslopstopper/emit.pywraps theghCLI to post PR comments and main-branch issuesslopstopper/discovery.pyresolves the pages to audit for reliability checksslopstopper/profiles.pyholds the project-shape profiles. It resolves which workflows a repo carries with(profile.disables − workflows.enabled) ∪ workflows.disabled(explicitworkflows.disabledwins if the same workflow is listed in both), plus the check → workflow map.install.shimports this module directly, so it is the only implementationslopstopper/checks/holds one module per check; the registry is in__init__.pyslopstopper/data/holds the bundled Playwright specs, lighthouserc dev/prod, server.js andprofiles.json
Adding a check
A check is more than a module. It needs a workflow, a Task target, profile classification, a badge label, docs, site copy and a skills entry. Follow the single checklist in the "New quality check" row of AGENTS.md rather than a summary here. Inside this package, slopstopper/checks/<name>.py exposes run(args) -> int (0 pass, 1 findings, 2 could-not-run) and registers in checks/__init__.py's REGISTRY. Its docstring's first line is what slopstopper checks list prints. It prints through from slopstopper import output so --quiet works, and declares a META dict if emit.py should post it.
Skills for agents
The duo under .claude/skills/slopstopper-{install,triage}/ is the long-form playbook for Claude Code agents working with this CLI. Update them when you add or rename a check, env var, task ss:* target, or profile.
Acknowledgements
The only third-party Python dependency of slopstopper-cli is lizard, the complexity engine behind hygiene:complexity, which must live in the same interpreter the CLI runs from. Every other tool (Playwright, axe-core, Lighthouse, Semgrep, Gitleaks, Trivy, ZAP) is invoked via subprocess only. Full credit, licences and upstream links for every tool we drive live in ATTRIBUTIONS.md.
License
MIT; the full text is in LICENSE.
Metadata
Release files for slopstopper-cli 0.19.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| slopstopper_cli-0.19.0.tar.gz | 280.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| slopstopper_cli-0.19.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 483.4 kB
Release files / slopstopper_cli-0.19.0.tar.gz
| Download URL | slopstopper_cli-0.19.0.tar.gz |
|---|---|
| Size | 280.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a2a5ac8c24e10bf46a20266945418db70ec2aee15592729d54d38eb380cf8a2
|
|
BLAKE2b-256 checksum How to use checksums |
095aeb4e8192ab0311d1b1c3755c55e7e494f9c4a4a7ec3d463b4f59a1830d66
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logRelease files / slopstopper_cli-0.19.0-py3-none-any.whl
| Download URL | slopstopper_cli-0.19.0-py3-none-any.whl |
|---|---|
| Size | 203.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f8da4dea3dde916a4dd3811bd901d38110e0099dda06615b14ca762b9b2a4d49
|
|
BLAKE2b-256 checksum How to use checksums |
4b031096c347994ecb6e4c1187a2e928119843d03ddf32231e1009255a60117e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency log