auntiepypi — both ends of the Python distribution pipe for the AgentCulture mesh.
Project description
auntiepypi
auntie (Python distribution:
auntiepypi) is both a CLI and an agent that maintains, uses, and serves the CLI for managing PyPI packages. It overviews packages on pypi.org, detects PyPI-flavored servers running locally, and starts/stops/restarts declared servers — informational first, actionable on demand.
Status: v0.6.0 — first-party PEP 503 server landed. Bare
auntie up / auntie down / auntie restart now start, stop, and
restart auntie's own simple-index server (read-only slice; configured
by [tool.auntiepypi.local]; loopback-only). Wheels in
$XDG_DATA_HOME/auntiepypi/wheels/ are served from
http://127.0.0.1:3141/simple/ and installable via
pip install --index-url. Lifecycle verbs continue to work against
declared servers (managed_by ∈ {systemd-user, command}); --all
now aggregates the first-party server with every supervised
declaration. auntie publish, HTTPS, and basic-auth are deferred to
v0.7.0.
Quick start
uv tool install auntiepypi
auntie --version
auntie overview --json | jq '.sections[] | select(.category == "servers")'
auntie overview requests # deep-dive into a PyPI package
auntie doctor # diagnose declared servers (dry-run)
auntie doctor --apply # act on actionable remediations
auntie up # start the first-party PEP 503 server
auntie up <name> # start one declared server
auntie up --all # first-party server + every supervised declaration
auntie down # stop the first-party server
auntie restart <name> # atomic for systemd-user; stop+start for command
Example servers-section output (one declared server):
{
"category": "servers",
"title": "main",
"light": "green",
"fields": [
{"name": "flavor", "value": "pypiserver"},
{"name": "port", "value": "8080"},
{"name": "status", "value": "up"},
{"name": "source", "value": "declared"}
]
}
For the overview and doctor to show anything, add the relevant blocks
to your repo's pyproject.toml:
[tool.auntiepypi]
packages = ["requests", "pip"]
scan_processes = false # opt into /proc scan; same as `--proc`
[[tool.auntiepypi.servers]]
name = "main"
flavor = "pypiserver"
port = 8080
managed_by = "systemd-user"
unit = "pypi-server.service"
auntie doctor walkthrough
auntie doctor classifies every known server into one of four
categories and explains exactly what to do next:
$ auntie doctor
# auntie doctor
summary: 1 actionable, 1 half-supervised, 1 skip, 0 ambiguous (3 total)
main down declared managed_by=command
diagnosis: down; would dispatch managed_by='command'
remediation: auntie doctor --apply
stale down declared managed_by=systemd-user
config_gap: managed_by="systemd-user" requires `unit`
diagnosis: half-supervised; --apply would delete this entry
remediation: add `unit = "…"` to keep supervision, or run `auntie doctor --apply`
pypiserver:8080 up port observed; not declared
remediation:
[[tool.auntiepypi.servers]]
name = "…"
flavor = "pypiserver"
port = 8080
managed_by = "manual"
(dry-run; pass --apply to act on 2 remediations)
Pass --apply to act. A numbered snapshot is written before any edit:
$ auntie doctor --apply
wrote pyproject.toml.1.bak (rollback: mv pyproject.toml.1.bak pyproject.toml)
...
If two entries share the same name, use --decide to choose which to
keep (or remove):
$ auntie doctor --apply --decide=duplicate:main=1
wrote pyproject.toml.1.bak (rollback: mv pyproject.toml.1.bak pyproject.toml)
wrote pyproject.toml: removed [[tool.auntiepypi.servers]] entry 'main' occurrence 1 (lines 7-12)
...
See docs/about.md for the longer non-technical
explainer. systemd-user unit templates for pypiserver / devpi-server
live in docs/deploy/.
Develop
uv sync # install + dev deps
uv run pytest -n auto -v # tests
uv run auntie --version # smoke
uv run pre-commit install # enable lint hooks
Quality pipeline mirrors the rest of the AgentCulture mesh: black,
isort, flake8 (+ flake8-bandit, flake8-bugbear), pylint,
bandit, markdownlint-cli2. CI runs on every PR + push to main.
Trusted Publishing
ghafi provisions the pypi / testpypi GitHub Environments and
.github/workflows/publish.yml follows the same OIDC Trusted Publishing
pattern every sibling uses — no secrets in the repo.
License
MIT. © 2026 Ori Nachum / AgentCulture.
— Claude
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file auntiepypi-0.6.0.tar.gz.
File metadata
- Download URL: auntiepypi-0.6.0.tar.gz
- Upload date:
- Size: 288.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95170fe936fba004f93bf3506e240d32503fb89d6ed1f52054004110b782b358
|
|
| MD5 |
881eeeaebb8749b6361840343283428d
|
|
| BLAKE2b-256 |
e3e8d3eb33c3f30cc486f66789ae05f964247dad1a57e06c9f96400139ce4fb3
|
File details
Details for the file auntiepypi-0.6.0-py3-none-any.whl.
File metadata
- Download URL: auntiepypi-0.6.0-py3-none-any.whl
- Upload date:
- Size: 88.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4d21e7fb66c87861e460bdb80af8e2ef55ccf2320ce90a880829a4211981fe0
|
|
| MD5 |
6e4f9808a4c3cb5cd6c3b5a4897ef9a3
|
|
| BLAKE2b-256 |
e00b850c5038adce6591f3729994aab72f0389f5d6606f0a88d66a9d56ba4ec8
|