Files
grok-bot 9916940f5a
CI / lint + typecheck + test (push) Has been cancelled
quality: P1–P3 Coverage, Sanitize, DX und Doku
Coverage-Hotspots (providers 100 %, chat-Pfade), Key-Sanitize in Commands/CLI,
Test-Buffer (-b), mypy-Overrides, CONTRIBUTING/SECURITY, .env.example und
gitignore-Verfeinerung. CI-Safety prüft lokale .env nur wenn getrackt.
2026-08-04 12:31:34 +02:00

7.1 KiB
Raw Permalink Blame History

Changelog

Alle wesentlichen Änderungen an chatpy werden in dieser Datei dokumentiert.

Format orientiert an Keep a Changelog, Versionierung nach Semantic Versioning.

[Unreleased]

Qualität / DX (P1–P3)

  • Coverage-Lücken: providers (dotenv-Fallback, switch_provider, _models_map), chat (_ensure_utf8, _list_models, CLI-Anhänge); providers → 100 % Cover
  • Attachment-/CLI-Fehlerpfade: utils.sanitize_error (Key-Leak-Tests)
  • CI-Safety: lokale gitignorierte .env mit echten Keys nicht mehr fälschlich failen (nur noch, wenn .env getrackt ist)
  • Tests: unittest -b in make test / mise run test (ruhige Logs)
  • mypy: disallow_untyped_defs für kleine Module (policy, loop_effects, types, …)
  • Lint-Entscheidung dokumentiert: bewusst nur py_compile (kein Ruff ohne Absprache)
  • Pre-commit-Hook (make setup-hooks): schnell lint + typecheck
  • .gitignore: nur Root-/*.json statt global *.json (Package-JSON trackbar)
  • .env.example um alle CONFIG-ENV ergänzt
  • requirements.txt als Spiegel von pyproject.toml gekennzeichnet
  • Neu: CONTRIBUTING.md, SECURITY.md
  • Architektur: Side-Effect-Grenzen dokumentiert

Intern – Refactor R1 (reine Attempt-Planung)

  • chatpy/client.py: _select_fallback_target (reine Zielwahl); plan_after_failure ohne print/init_client; bei provider_fallback ist ChatAttempt.client None
  • Binding (init_client) + UX-Print liegen in chat()
  • _try_fallback_provider bleibt dünner BC-Wrapper (select + init + print)

Intern – Refactor R2 (öffentliche Client-API)

  • _pick_code_model → öffentlich pick_code_model (analog pick_chat_model)
  • commands.py importiert nur noch die öffentliche API

Intern – Refactor R3 (Cost-Warnung ohne Side-Effect in execute_once)

  • ChatResult.cost_warning: OpenRouter-Kostenmeldung als Daten
  • execute_once setzt nur das Feld (kein print); Stream-Ausgabe unverändert
  • chat() emittiert die Warnung via _emit_cost_warning

Intern – Refactor R4 (Deferred Minors)

  • Policy: format_cost_warning soft bei ungültigen cost-Typen (getestet)
  • execute_once: dünne Happy-Path- und Fehler-Form-Tests
  • Safety-Hop nur nach Primary (extras_used == 0)
  • Stream-Log: execute_once-Stream-Abbruch statt chat-Fehler (versuch=…)

Intern – Strangler P1–P3 (CommandResult, Attempt-Plan, CostPolicy)

  • chatpy/policy.py: OpenRouterCostPolicy / DEFAULT_OPENROUTER_POLICY als Single Source of Truth für Free-Filter, :free-Guard, max_price, Cost-Warnung
  • chatpy/client.py: execute_once (Einzelschuss); chat() als flache Attempt-Schleife (ChatAttempt, plan_after_failure, plan_safety_retry) statt rekursiver return chat(...)-Kette; set_sleeper für Retry-Tests
  • chatpy/loop_effects.py: CommandResult (quit, pending_chat, clear_pending)
  • chatpy/chat.py: apply_command_result; chat_loop steuert quit/pending nur noch über Apply
  • chatpy/commands.py: alle cmd_* liefern CommandResult
  • Signatur von client.chat() und Free-Tier-Verhalten unverändert (Refactor)

Hinzugefügt – CI / Tooling

  • Gitea/Forgejo Actions: .gitea/workflows/ci.yml (PR-Gate = make check)
  • mise run lint nutzt Glob chatpy/*.py (Parity zu Makefile; keine fehlenden Module)
  • .gitignore: .mypy_cache/, .pytest_cache/
  • Doku: CI-Abschnitt in docs/development.md

Hinzugefügt – Typing / mypy

  • Dev-Dependency mypy; Tasks mise run typecheck / make typecheck
  • check = lint + typecheck + test
  • Erweiterte Domain-Typen in chatpy/types.py (ChatMessage, HistoryEntry, LocalConfig, ThinkState, Literals, ProvidersMap)
  • Package-weite Type-Hints (u. a. ChatState, Settings, commands, client)

Hinzugefügt – QoL-Kern (Anhänge, Web, Sessions, Export)

  • Modul chatpy/attachments.py: lokale Dateien + HTTP(S)-URLs als Kontext
  • Slash-Commands: /file, /web, /attach, /attach clear
  • Inline-Syntax @./pfad / @"datei mit leerzeichen.txt" in Nachrichten
  • CLI: --file / -f PATH|URL (wiederholbar)
  • /export json [name] neben Markdown-Export
  • Session-QoL: /session show, /session delete; /sessions mit Metadaten
  • /save ohne Namen → session_YYYYMMDD_HHMMSS.json
  • ENV: CHATPY_ATTACH_MAX_BYTES (Default 512 KiB), CHATPY_WEB_TIMEOUT (15 s)

Geändert

  • User-Message wird vor dem API-Call um Anhänge/@path angereichert (commands.prepare_message); Buffer danach geleert

Intern – gezielte Modularisierung

  • chatpy/stats.py: Statistics aus history.py ausgelagert (Re-Export bleibt)
  • chatpy/session_snapshot.py: Session-Settings-Snapshots aus commands.py
  • chat.py: Kompat-Re-Exports (_cmd_*, _COMMANDS, …) entfernt; Orchestrator schlanker
  • Tests rufen Commands/Provider-APIs über die kanonischen Module auf

[2.1.0] – 2026-08-02

Erste Feature-Release nach dem Package-Stand 2.0: Workflow, Scripting, Tokens und lokaler OpenAI-kompatibler Provider.

Hinzugefügt

Phase 1 – QoL / Persistenz

  • Slash-Commands: /retry, /undo, /last, /sessions, /theme, /context, /export [name]
  • Mehrzeilige Eingabe (""" … """) und readline (History + Tab-Complete)
  • Atomare JSON-Writes für History, Settings, Cache, Sessions
  • Legacy-Hinweis bei Root-JSON-Dateien (warn_legacy_root_json)

Phase 2 – Tokens / Scripting / Modell-Filter

  • Token-Kontext: history.get_context(..., max_tokens=); /context tokens N
  • /maxtokens N → settings.max_tokens im API-Request
  • CLI: --json, --quiet/-q, --session, --system-prompt-file
  • Exit-Codes Pipe/Einmal: 0 OK, 1 Key/Config, 2 API-Fehler
  • /model [suche] und Menü-Filter ?query

Phase 3 – Local Provider

  • Provider local (Ollama, LM Studio, vLLM, …) über OpenAI-kompatible API
  • ENV: OPENAI_COMPAT_BASE_URL (Activation), optional OPENAI_COMPAT_API_KEY, OPENAI_COMPAT_DEFAULT_MODEL
  • Modelle via GET {base}/models (ohne Cache); optionaler Key → Dummy "local"
  • Startup mit Cloud-Key oder Local-URL; --provider local
  • Kein Auto-Fallback Cloud ↔ Local; Free-Tier-Guards bleiben OpenRouter-only

Geändert

  • Banner, Help und Doku um Local-Provider und neue CLI-Flags ergänzt
  • build_providers / Startup-Gate / /reload um Local erweitert
  • --version / --help laufen vor dem Credential-Check (ohne Keys nutzbar)
  • Package-Version zentral in chatpy.__version__ / pyproject.toml (2.1.0)

Dokumentation

  • Spec & Plan unter docs/superpowers/
  • User-Guide, Konfiguration, Architektur, README, AGENTS aktualisiert

[2.0.0] – 2026-08-02

Initialer Package-Stand (Import).

Hinzugefügt

  • Package chatpy 2.0 mit Launcher chat.py / python -m chatpy
  • Provider: OpenRouter, Groq, NVIDIA NIM (OpenAI-kompatibel)
  • Free-Tier-Schutz OpenRouter (Free-Filter, :free-Guard, max_price)
  • Runtime unter .runtime/ (CHATPY_DATA_DIR), Settings, History, Sessions
  • Reasoning-Bereinigung, Provider-Fallback (Cloud), Rate-Limiter
  • Unit-Tests (unittest) und optionale Live-Tests
  • Doku: User-Guide, Architektur, Konfiguration, Entwicklung