CI / lint + typecheck + test (push) Has been cancelled
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.
7.1 KiB
7.1 KiB
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
.envmit echten Keys nicht mehr fälschlich failen (nur noch, wenn.envgetrackt ist) - Tests:
unittest -binmake test/mise run test(ruhige Logs) - mypy:
disallow_untyped_defsfür kleine Module (policy, loop_effects, types, …) - Lint-Entscheidung dokumentiert: bewusst nur
py_compile(kein Ruff ohne Absprache) - Pre-commit-Hook (
make setup-hooks): schnelllint+typecheck .gitignore: nur Root-/*.jsonstatt global*.json(Package-JSON trackbar).env.exampleum alle CONFIG-ENV ergänztrequirements.txtals Spiegel vonpyproject.tomlgekennzeichnet- 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_failureohneprint/init_client; beiprovider_fallbackistChatAttempt.clientNone- Binding (
init_client) + UX-Print liegen inchat() _try_fallback_providerbleibt dünner BC-Wrapper (select + init + print)
Intern – Refactor R2 (öffentliche Client-API)
_pick_code_model→ öffentlichpick_code_model(analogpick_chat_model)commands.pyimportiert nur noch die öffentliche API
Intern – Refactor R3 (Cost-Warnung ohne Side-Effect in execute_once)
ChatResult.cost_warning: OpenRouter-Kostenmeldung als Datenexecute_oncesetzt nur das Feld (keinprint); Stream-Ausgabe unverändertchat()emittiert die Warnung via_emit_cost_warning
Intern – Refactor R4 (Deferred Minors)
- Policy:
format_cost_warningsoft 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-Abbruchstattchat-Fehler (versuch=…)
Intern – Strangler P1–P3 (CommandResult, Attempt-Plan, CostPolicy)
chatpy/policy.py:OpenRouterCostPolicy/DEFAULT_OPENROUTER_POLICYals Single Source of Truth für Free-Filter,:free-Guard,max_price, Cost-Warnungchatpy/client.py:execute_once(Einzelschuss);chat()als flache Attempt-Schleife (ChatAttempt,plan_after_failure,plan_safety_retry) statt rekursiverreturn chat(...)-Kette;set_sleeperfür Retry-Testschatpy/loop_effects.py:CommandResult(quit,pending_chat,clear_pending)chatpy/chat.py:apply_command_result;chat_loopsteuert quit/pending nur noch über Applychatpy/commands.py: allecmd_*liefernCommandResult- 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 lintnutzt Globchatpy/*.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; Tasksmise 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;/sessionsmit Metadaten /saveohne 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/
@pathangereichert (commands.prepare_message); Buffer danach geleert
Intern – gezielte Modularisierung
chatpy/stats.py:Statisticsaushistory.pyausgelagert (Re-Export bleibt)chatpy/session_snapshot.py: Session-Settings-Snapshots auscommands.pychat.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_tokensim API-Request- CLI:
--json,--quiet/-q,--session,--system-prompt-file - Exit-Codes Pipe/Einmal:
0OK,1Key/Config,2API-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), optionalOPENAI_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 //reloadum Local erweitert--version/--helplaufen 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
chatpy2.0 mit Launcherchat.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