From 49a7756a01d81b185d0f01c5acc2b18a1f7e3f17 Mon Sep 17 00:00:00 2001 From: dschlueter Date: Tue, 7 Jul 2026 10:36:14 +0200 Subject: [PATCH] docs: add CHANGELOG and ship LICENSE/CHANGELOG in the archive - Add CHANGELOG.md (Keep a Changelog format) with a 0.1.0 entry summarizing the initial release plus the recent healthcheck fix, image pin, and profile-naming changes. - Add LICENSE and CHANGELOG.md to the build_archive.py manifest so the distributable tarball actually contains the license and history. - Expand the README license section to the full MIT + copyright line. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 +++- build_archive.py | 4 ++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5fd3f4e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +All notable changes to this project are documented here. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.1.0] - 2026-07-07 + +Initial release. Replaces the previous collection of shell scripts +(`start-llm-server.sh`, `status-llm-server.sh`, `switch-llm.sh`, …) with a +single Python package. + +### Added +- CLI to start, check, stop, and switch (`--change`) `llama.cpp` OpenAI-compatible + Docker server instances, plus `--chat` and `--dry-run`. +- Layered configuration (builtin defaults → `[default]` → `[model.]` → + CLI overrides) with `[prompt.]` fallback system prompts and + `${ENV}`/`~` expansion. +- Security-hardened prompt input layer for `--system-*`/`--prompt-*`: file reads + limited to regular UTF-8 files with a size cap and symlink rejection; URL reads + are HTTPS-only with SSRF defenses (IP-literal and private/loopback/link-local/ + metadata blocking, DNS pinning against rebinding, no-credentials URLs, redirect + re-validation, content-type allowlist, streaming size limit). +- Loopback-only port publishing by default; `--expose` + `--api-key` for LAN use. +- Readiness check via a real chat completion (not just an open port) and an + exclusive non-blocking file lock for `--change`. +- MIT `LICENSE`, man page, and an opt-in end-to-end smoke test (`scripts/smoke.sh`). +- Continuous integration on Forgejo: `pytest` (Python 3.10 and 3.12), `ruff`, + and `mypy`. + +### Changed +- Pin the default `llama.cpp` Docker image by digest for reproducibility instead + of the moving `:server-cuda` tag. +- Model-size profile names carry a `b` suffix (`qwen35b`, `qwen27b`) so the digits + read as parameter count, not Qwen version; documentation examples run against + the `[default]` section so they work by copy & paste. + +### Fixed +- Override the image's baked-in Docker `HEALTHCHECK` (hardcoded to port 8080) so + it targets the configured `container_port`, ending the false "unhealthy" status + when the server runs on a different port. + +[Unreleased]: https://kitux.de/forgejo/dschlueter/llamacppctl/compare/v0.1.0...HEAD +[0.1.0]: https://kitux.de/forgejo/dschlueter/llamacppctl/releases/tag/v0.1.0 diff --git a/README.md b/README.md index c2e8d29..aa7bf54 100644 --- a/README.md +++ b/README.md @@ -177,4 +177,6 @@ SMOKE_GPU=1 scripts/smoke.sh ## Lizenz -MIT +MIT License +Copyright (c) 2026 Dieter Schlueter + diff --git a/build_archive.py b/build_archive.py index a8bf548..a117389 100644 --- a/build_archive.py +++ b/build_archive.py @@ -44,6 +44,8 @@ from pathlib import Path REQUIRED_FILES = [ "pyproject.toml", "README.md", + "LICENSE", + "CHANGELOG.md", "requirements.txt", "requirements-dev.txt", "llama.cpp.config.example", @@ -83,6 +85,8 @@ INCLUDE_DIRS = ["src", "tests", "docs", "man", "scripts"] INCLUDE_FILES = [ "pyproject.toml", "README.md", + "LICENSE", + "CHANGELOG.md", "requirements.txt", "requirements-dev.txt", "llama.cpp.config.example",