docs: move BEDIENUNGSANLEITUNG and INSTALL_FROM_ARCHIVE into docs/

Keep only README, LICENSE, and CHANGELOG as prose at the repo root
(tooling/convention) and move the remaining manuals under docs/ next to
SECURITY_AND_OPERATIONS.md.

- git mv the two files into docs/ (history preserved).
- Update all cross-references: README doc-index links, the internal
  SECURITY_AND_OPERATIONS link and the §12 pointer list in
  BEDIENUNGSANLEITUNG, and the repo inventory in SECURITY_AND_OPERATIONS §1.
- build_archive.py: point REQUIRED_FILES at docs/ and drop the now-redundant
  INCLUDE_FILES entries (the docs/ dir is included wholesale).
- build_archive.py: drop the obsolete requirements.txt<->pyproject dependency
  mirror check, which broke once requirements.txt was reduced to `.`
  (pyproject is the single source of truth). Verified by building and
  re-opening the archive.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-07-07 11:17:41 +02:00
commit b8680cc049
5 changed files with 16 additions and 46 deletions

View file

@ -15,8 +15,8 @@ Fehlerbehandlung.
| Dokument | Für wen / wofür |
|---|---|
| README (diese Datei) | Schnelleinstieg: Installation, Konfiguration, Verwendung |
| [`BEDIENUNGSANLEITUNG.md`](BEDIENUNGSANLEITUNG.md) | Vollständiges Benutzerhandbuch (alle Aktionen, Optionen, Fehlersuche) |
| [`INSTALL_FROM_ARCHIVE.md`](INSTALL_FROM_ARCHIVE.md) | Installation aus dem `.tar.gz`-Archiv + Archiv selbst bauen/verifizieren |
| [`docs/BEDIENUNGSANLEITUNG.md`](docs/BEDIENUNGSANLEITUNG.md) | Vollständiges Benutzerhandbuch (alle Aktionen, Optionen, Fehlersuche) |
| [`docs/INSTALL_FROM_ARCHIVE.md`](docs/INSTALL_FROM_ARCHIVE.md) | Installation aus dem `.tar.gz`-Archiv + Archiv selbst bauen/verifizieren |
| [`docs/SECURITY_AND_OPERATIONS.md`](docs/SECURITY_AND_OPERATIONS.md) | Architektur, Modul-/Repo-Übersicht, Sicherheits- & Betriebsmodell |
| `man/llamacppctl.1` | Vollständige Optionsreferenz (`man llamacppctl` bzw. `man ./man/llamacppctl.1`) |
| [`CHANGELOG.md`](CHANGELOG.md) | Versionshistorie |

View file

@ -73,8 +73,8 @@ REQUIRED_FILES = [
"tests/test_lock_ops.py",
"tests/test_actions.py",
"scripts/smoke.sh",
"BEDIENUNGSANLEITUNG.md",
"INSTALL_FROM_ARCHIVE.md",
"docs/BEDIENUNGSANLEITUNG.md",
"docs/INSTALL_FROM_ARCHIVE.md",
]
# Top-level directories to include wholesale (in addition to REQUIRED_FILES),
@ -90,8 +90,6 @@ INCLUDE_FILES = [
"requirements-dev.txt",
"llama.cpp.config.example",
"build_archive.py",
"BEDIENUNGSANLEITUNG.md",
"INSTALL_FROM_ARCHIVE.md",
]
EXCLUDE_DIR_NAMES = {"__pycache__", ".pytest_cache", ".venv", "venv", ".git", "*.egg-info"}
@ -124,14 +122,15 @@ def verify_required_files(project_dir: Path) -> None:
def verify_dependencies_declared(project_dir: Path) -> list:
"""Parses pyproject.toml and cross-checks it against requirements.txt.
"""Parses pyproject.toml and returns the declared runtime dependency
specifiers.
Returns the list of runtime dependency specifiers declared in
pyproject.toml. Raises BuildError on any mismatch.
pyproject.toml is the single source of truth for dependencies
(requirements.txt merely installs the package), so there is no requirements
mirror to cross-check. Raises BuildError if none are declared.
"""
log("Verifying declared dependencies are consistent...")
log("Reading declared runtime dependencies from pyproject.toml...")
pyproject_path = project_dir / "pyproject.toml"
requirements_path = project_dir / "requirements.txt"
try:
import tomllib # Python 3.11+
@ -171,37 +170,7 @@ def verify_dependencies_declared(project_dir: Path) -> list:
if not deps:
raise BuildError("No runtime dependencies found in pyproject.toml [project.dependencies]")
req_text = requirements_path.read_text(encoding="utf-8")
req_names = set()
for line in req_text.splitlines():
line = line.strip()
if not line or line.startswith("#"):
continue
# crude package-name extraction, e.g. "requests>=2.31,<3" -> "requests"
name = line
for sep in (">=", "<=", "==", "!=", ">", "<", "~="):
if sep in name:
name = name.split(sep, 1)[0]
req_names.add(name.strip().lower())
missing_from_requirements = []
for dep in deps:
name = dep
for sep in (">=", "<=", "==", "!=", ">", "<", "~="):
if sep in name:
name = name.split(sep, 1)[0]
name = name.strip().lower()
if name not in req_names:
missing_from_requirements.append(dep)
if missing_from_requirements:
raise BuildError(
"pyproject.toml declares dependencies not mirrored in requirements.txt:\n "
+ "\n ".join(missing_from_requirements)
)
log(f" pyproject.toml dependencies: {deps}")
log(" requirements.txt is consistent with pyproject.toml.")
return deps

View file

@ -8,7 +8,7 @@ nur auf `127.0.0.1` erreichbar.
Diese Anleitung deckt **Installation** und **Benutzung** vollständig ab. Zur
Installation aus dem fertigen Archiv siehe zusätzlich
[`INSTALL_FROM_ARCHIVE.md`](INSTALL_FROM_ARCHIVE.md). Details zum Sicherheits-
und Betriebsmodell stehen in [`docs/SECURITY_AND_OPERATIONS.md`](docs/SECURITY_AND_OPERATIONS.md);
und Betriebsmodell stehen in [`SECURITY_AND_OPERATIONS.md`](SECURITY_AND_OPERATIONS.md);
die vollständige Optionsreferenz in der Manpage (`man/llamacppctl.1`).
---
@ -280,4 +280,4 @@ SMOKE_GPU=1 scripts/smoke.sh
- `man/llamacppctl.1` — vollständige Optionsreferenz (`man ./man/llamacppctl.1`).
- `docs/SECURITY_AND_OPERATIONS.md` — Architektur, Sicherheits- und Betriebsmodell.
- `README.md` — Kurzüberblick.
- `INSTALL_FROM_ARCHIVE.md` — Installation aus dem `.tar.gz`-Archiv.
- `docs/INSTALL_FROM_ARCHIVE.md` — Installation aus dem `.tar.gz`-Archiv.

View file

@ -100,7 +100,7 @@ Das Archiv wird reproduzierbar von `build_archive.py` erzeugt. Es
1. prüft, ob alle erforderlichen Projektdateien vorhanden sind,
2. gleicht die deklarierten Abhängigkeiten in einer frischen venv ab,
3. lässt die komplette Test-Suite laufen,
4. baut das `.tar.gz` (nur Allowlist: `src/ tests/ docs/ man/ scripts/` + `pyproject.toml`, `README.md`, `LICENSE`, `CHANGELOG.md`, `requirements*.txt`, `llama.cpp.config.example`, `build_archive.py`, `BEDIENUNGSANLEITUNG.md`, `INSTALL_FROM_ARCHIVE.md`),
4. baut das `.tar.gz` (nur Allowlist: `src/ tests/ docs/ man/ scripts/` + `pyproject.toml`, `README.md`, `LICENSE`, `CHANGELOG.md`, `requirements*.txt`, `llama.cpp.config.example`, `build_archive.py`),
5. öffnet das Archiv erneut und verifiziert die enthaltenen Dateien,
6. installiert das Paket aus dem Archiv in einer weiteren frischen venv und testet das Konsolenskript.

View file

@ -43,9 +43,10 @@ scripts/smoke.sh Opt-in End-to-End-Rauchtest gegen echten Docker + GPU
`git config core.hooksPath .githooks`
.forgejo/workflows/ci.yml Forgejo-Actions-CI (läuft, sobald ein Runner registriert ist)
README.md Schnelleinstieg + Doku-Index
BEDIENUNGSANLEITUNG.md Vollständiges Benutzerhandbuch
INSTALL_FROM_ARCHIVE.md Installation aus dem Archiv + Archiv bauen/verifizieren
CHANGELOG.md / LICENSE Versionshistorie / MIT-Lizenz
docs/BEDIENUNGSANLEITUNG.md Vollständiges Benutzerhandbuch
docs/INSTALL_FROM_ARCHIVE.md Installation aus dem Archiv + Archiv bauen/verifizieren
docs/SECURITY_AND_OPERATIONS.md Dieses Dokument (Architektur/Sicherheit/Betrieb)
```
## 2. Konfigurationsmodell