From fa90a5c5de598e9db5e2b51fa51aab06a062c514 Mon Sep 17 00:00:00 2001 From: Dystroyer8 Date: Thu, 30 Jul 2026 16:45:36 +0200 Subject: [PATCH] build: configure Python development environment --- .python-version | 1 + CHANGELOG.md | 2 ++ docs/CHATGPT_HANDOFF.md | 31 ++++++++++++++++---------- docs/DEVELOPMENT_SETUP.md | 38 ++++++++++++++++++++++++++++++++ docs/NEXT_SESSION.md | 4 +--- docs/PROJECT_STATUS.md | 12 +++++++---- pyproject.toml | 15 +++++++++++++ scripts/verify_structure.py | 4 +--- uv.lock | 43 +++++++++++++++++++++++++++++++++++++ 9 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 .python-version create mode 100644 docs/DEVELOPMENT_SETUP.md create mode 100644 uv.lock diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/CHANGELOG.md b/CHANGELOG.md index 31d839d..04ec557 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ Alle wesentlichen Projektänderungen werden hier in verständlicher Form dokumen - Tokenbewusste Arbeitsweise als dauerhafte Regel ergänzt; Qualität und Sicherheit bleiben vorrangig. - Laufende Handoff-Aktualisierung nach jedem abgeschlossenen logischen Arbeitspaket festgelegt. - Vollständigen Erst-Handoff einmalig archiviert und die laufende Übergabe auf einen kompakten aktuellen Stand umgestellt. +- Isolierte Python-3.12-Entwicklungsumgebung mit uv-Lockfile und Ruff vorbereitet. +- Offizielle VS-Code-Erweiterungen für Python, Pylance und Python Environments eingerichtet. ### Security diff --git a/docs/CHATGPT_HANDOFF.md b/docs/CHATGPT_HANDOFF.md index 54e70a3..a91652e 100644 --- a/docs/CHATGPT_HANDOFF.md +++ b/docs/CHATGPT_HANDOFF.md @@ -50,7 +50,10 @@ Rootserver: - Konfigurationsbeispiel, Sicherheitsdokumente, ADRs und Strukturtest sind vorhanden. - Living-Mind-Verzeichnis ist ausschließlich ein inaktiver Vertrag ohne Frontend oder Fantasiedaten. - Projektbezogene Codex-Rollen Scout, Architect, Builder, Verifier und Security Reviewer sind konfiguriert; maximal zwei Unteragenten, nur Builder schreibend. -- Im normalen Windows-`PATH` sind Git und VS Code verfügbar. Eine Projektinstallation von Python, `uv`, Ruff, Ollama oder llama.cpp ist noch nicht bestätigt. +- Toolchain eingerichtet: uv 0.11.32 und CPython 3.12.13 isoliert unter `D:\Javis-Tools`; Ruff 0.16.0 in der lokalen `.venv`. +- Offizielle VS-Code-Erweiterungen installiert: Python 2026.4.0, Pylance 2026.3.1, Python Environments 1.36.0 und Debugpy 2026.6.0. +- Windows-PATH und vorhandene Python-Installationen wurden nicht verändert. +- Ollama oder llama.cpp sind noch nicht installiert. - Kein Obsidian-, Laptop- oder Rootserverzugriff wurde implementiert. - Keine KI-, Sprach-, Mobil- oder Statusfunktion ist implementiert. @@ -77,6 +80,9 @@ Rootserver: - Tokenbewusster Arbeitsablauf festgelegt: gezielte Reads, kurze Ergebnisse, keine unnötigen Agenten oder Plugins. - Werkzeugempfehlung auf `uv`, Microsoft Python/Pylance/Python Environments und Ruff begrenzt. - Langer Handoff einmalig unverändert archiviert und durch diese kompakte aktuelle Zusammenfassung ersetzt. +- Handoff-Verdichtung als Commit `e6eb995` nach `origin/main` gepusht. +- Branch `feat/core-chat` von diesem Stand erstellt. +- uv, CPython 3.12, lokale `.venv`, Ruff, Lockfile und offizielle VS-Code-Python-Erweiterungen eingerichtet. - Obsidian, Ubuntu-Laptop und Rootserver blieben unverändert. ## Aktuelle Tests @@ -89,15 +95,20 @@ Letzter bestätigter Grundgerüststand: - UTF-8- und interne Markdown-Linkprüfung: bestanden - Secret-Musterprüfung: keine Treffer - Gitignore-Prüfung für lokale Secret-Dateien: bestanden +- uv-Lock und `uv sync --dev`: bestanden +- Python in `.venv`: 3.12.13 +- Ruff in `.venv`: 0.16.0 Für den Textchat existieren noch keine Funktions- oder Modell-Smoke-Tests. ## Git-Stand +- aktueller Branch: `feat/core-chat` - stabiler Branch: `main` - Grundgerüstcommit: `6d04171` - letzter Commit vor der Handoff-Verdichtung: `0e82748` -- der Commit mit dieser Verdichtung ist über `git log -1 --oneline` zu bestimmen +- Handoff-Verdichtung auf `main`: `e6eb995` +- aktueller Feature-Commit ist über `git log -1 --oneline` zu bestimmen - `origin` verwendet HTTPS - kein Force-Push und keine umgeschriebene Historie @@ -106,12 +117,12 @@ Für den Textchat existieren noch keine Funktions- oder Modell-Smoke-Tests. - `49a1dd3`: erster Gitea-Verbindungstest - `6d04171`: sicheres Javis-Grundgerüst - `0e82748`: Werkzeug-, Token- und Handoff-Regeln -- aktuell: einmalige Archivierung und Verdichtung des Handoffs +- `e6eb995`: einmalige Archivierung und Verdichtung des Handoffs +- aktuell: isolierte Python-Toolchain und reproduzierbare Entwicklungsumgebung ## Offene Entscheidungen und Fehler - endgültiger Produkt-/Repositoryname bleibt offen -- konkrete Python-Version und Installation sind noch festzulegen - lokale Modelllaufzeit und erstes Modell sind noch nicht installiert oder benchmarked - genauer späterer Obsidian-Schreibbereich ist nicht freigegeben - endgültiger Secret-Provider ist offen; lokale Klartext-XML wäre nur restriktiv geschützt und Git-ignoriert zulässig @@ -132,12 +143,10 @@ Für den Textchat existieren noch keine Funktions- oder Modell-Smoke-Tests. Der genehmigte nächste Meilenstein ist `feat/core-chat`: -1. von sauberem `main` einen Feature-Branch erstellen -2. minimale Python-Toolchain mit `uv`, lokaler `.venv`, Ruff und offiziellen VS-Code-Erweiterungen einrichten -3. Ollama und llama.cpp anhand aktueller offizieller Quellen vergleichen und nur eine Laufzeit installieren -4. genau ein frei lokal nutzbares Modell unter ungefähr 10 GB herunterladen und auf der RTX 3060 messen -5. echten lokalen CLI-Chat mit Provider-Schnittstelle und SQLite-Sitzungen implementieren -6. Unit-, Ruff-, Persistenz-, Secret- und echten Modell-Smoke-Test ausführen -7. nur bei vollständig erfüllter Abnahme nach `main` mergen +1. Ollama als einfachere Windows-Laufzeit installieren; llama.cpp bleibt dokumentierte Alternative +2. genau `qwen3:8b` (`Q4_K_M`, 5,2 GB, Apache-2.0) herunterladen und auf der RTX 3060 messen +3. echten lokalen CLI-Chat mit Provider-Schnittstelle und SQLite-Sitzungen implementieren +4. Unit-, Ruff-, Persistenz-, Secret- und echten Modell-Smoke-Test ausführen +5. nur bei vollständig erfüllter Abnahme nach `main` mergen Nicht Teil dieses Meilensteins: Obsidian-Integration, Serverzugriff, Sprache, Mobile Client oder Living-Mind-Code. diff --git a/docs/DEVELOPMENT_SETUP.md b/docs/DEVELOPMENT_SETUP.md new file mode 100644 index 0000000..c1daf2e --- /dev/null +++ b/docs/DEVELOPMENT_SETUP.md @@ -0,0 +1,38 @@ +# Entwicklungsumgebung + +Stand: 30.07.2026, Branch `feat/core-chat`. + +## Installierte Werkzeuge + +| Werkzeug | Version | Speicherort | +|---|---:|---| +| uv | 0.11.32 | `D:\Javis-Tools\uv` | +| CPython | 3.12.13 | `D:\Javis-Tools\python` | +| Ruff | 0.16.0 | lokale Projektumgebung `.venv` | +| VS Code Python | 2026.4.0 | Benutzerprofil von VS Code | +| VS Code Pylance | 2026.3.1 | Benutzerprofil von VS Code | +| VS Code Python Environments | 1.36.0 | Benutzerprofil von VS Code | +| VS Code Debugpy | 2026.6.0 | Abhängigkeit der Python-Erweiterung | + +`uv` und Python wurden isoliert auf `D:` installiert. Eine vorhandene Python-Version wurde nicht ersetzt und der Windows-Benutzer- oder System-`PATH` wurde nicht verändert. + +## Projektumgebung + +- gewünschte Python-Linie: `3.12`, festgehalten in `.python-version` +- lokale Umgebung: `.venv`, durch Git ignoriert +- Abhängigkeiten: `pyproject.toml` +- reproduzierbare Auflösung: `uv.lock` +- einzige Entwicklungsabhängigkeit in dieser Phase: Ruff + +Typische Befehle aus dem Repository: + +```powershell +$env:UV_PYTHON_INSTALL_DIR = 'D:\Javis-Tools\python' +$env:UV_CACHE_DIR = 'D:\Javis-Tools\uv-cache' +& 'D:\Javis-Tools\uv\uv.exe' sync --dev +& 'D:\Javis-Tools\uv\uv.exe' run javis chat +& 'D:\Javis-Tools\uv\uv.exe' run ruff check . +& 'D:\Javis-Tools\uv\uv.exe' run ruff format --check . +``` + +Die absoluten Pfade sind ausschließlich lokale Entwicklungsdokumentation. Der Anwendungscode darf keine festen Windows-Pfade enthalten. diff --git a/docs/NEXT_SESSION.md b/docs/NEXT_SESSION.md index 04cb964..6a538a6 100644 --- a/docs/NEXT_SESSION.md +++ b/docs/NEXT_SESSION.md @@ -2,7 +2,7 @@ ## Ziel -Phase 1 auf `feat/core-chat`: minimale Python-Toolchain, genau eine lokale Modelllaufzeit und ein echter lokaler CLI-Textchat mit SQLite-Sitzungen. +Nächstes Arbeitspaket auf `feat/core-chat`: genau eine lokale Modelllaufzeit und ein echter lokaler CLI-Textchat mit SQLite-Sitzungen. ## Vor Änderungen erneut prüfen @@ -13,8 +13,6 @@ Phase 1 auf `feat/core-chat`: minimale Python-Toolchain, genau eine lokale Model ## Vorgeschlagener Umfang -- `uv`, unterstützte stabile Python-Version und offizielle VS-Code-Erweiterungen einrichten -- Microsoft Python/Pylance/Python Environments sowie Ruff als minimale Entwicklungswerkzeuge prüfen - Ollama und llama.cpp offiziell vergleichen; nur eine Laufzeit und ein Modell unter ungefähr 10 GB installieren - lokale Konfiguration, Provider-Schnittstelle und SQLite-Sitzungen implementieren - CLI mit neuen, gelisteten und fortsetzbaren Sitzungen diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index f21ddce..073b832 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -1,6 +1,6 @@ # Projektstatus -Stand: Dokumentationsverdichtung vor `feat/core-chat`, 30.07.2026. +Stand: Toolchain-Arbeitspaket auf `feat/core-chat`, 30.07.2026. ## Erreicht @@ -12,6 +12,9 @@ Stand: Dokumentationsverdichtung vor `feat/core-chat`, 30.07.2026. - projektinterne Codex-Agentensyntax anhand der aktuellen offiziellen Codex-Dokumentation geprüft - phasenbezogene Werkzeug- und Plugin-Empfehlungen sowie tokenbewusste Arbeitsregeln dokumentiert - vollständigen Erst-Handoff archiviert und kompakte laufende Übergabe eingeführt +- uv 0.11.32 und CPython 3.12.13 isoliert unter `D:\Javis-Tools` installiert +- lokale `.venv`, reproduzierbares `uv.lock` und Ruff 0.16.0 eingerichtet +- offizielle VS-Code-Erweiterungen Python, Pylance und Python Environments installiert ## Nicht implementiert @@ -19,10 +22,11 @@ KI, Chat, Provider, Gedächtnis, Obsidian-Adapter, Tools, Serverzugriff, Sprache ## Git -- Branch: `main` +- Branch: `feat/core-chat` - Grundgerüstcommit: `6d04171` -- Der aktuelle Dokumentationscommit ist mit `git log -1` zu ermitteln. +- Basis des Feature-Branches: `e6eb995` +- Der aktuelle Feature-Commit ist mit `git log -1` zu ermitteln. ## Bekannte Einschränkung -Im normalen Windows-`PATH` sind Python, `uv`, Ruff und eine lokale Modelllaufzeit noch nicht bestätigt. Der Textchat ist noch nicht implementiert. +Die Toolchain ist nutzbar, ohne den Windows-`PATH` zu verändern. Eine lokale Modelllaufzeit und der Textchat sind noch nicht implementiert. diff --git a/pyproject.toml b/pyproject.toml index 8a7ccd6..6ef1069 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,8 +10,23 @@ readme = "README.md" requires-python = ">=3.11" dependencies = [] +[project.scripts] +javis = "javis.interface.cli:main" + +[dependency-groups] +dev = [ + "ruff>=0.12,<1", +] + [tool.setuptools.packages.find] where = ["src"] [tool.pytest.ini_options] testpaths = ["tests"] + +[tool.ruff] +line-length = 100 +target-version = "py312" + +[tool.ruff.lint] +select = ["B", "E", "F", "I", "UP"] diff --git a/scripts/verify_structure.py b/scripts/verify_structure.py index 9565853..36e52ec 100644 --- a/scripts/verify_structure.py +++ b/scripts/verify_structure.py @@ -6,7 +6,6 @@ import sys import tomllib from pathlib import Path - ROOT = Path(__file__).resolve().parents[1] REQUIRED = ( "README.md", @@ -46,8 +45,7 @@ def main() -> int: forbidden = [ path for path in ROOT.rglob("*") - if path.is_file() - and path.name.lower() in {"key-pw.xml", "secrets.local.xml", ".env"} + if path.is_file() and path.name.lower() in {"key-pw.xml", "secrets.local.xml", ".env"} ] if forbidden: print("Forbidden local secret files are present:") diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..9935951 --- /dev/null +++ b/uv.lock @@ -0,0 +1,43 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "javis-ai" +version = "0.0.0" +source = { editable = "." } + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.12,<1" }] + +[[package]] +name = "ruff" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/94/1e5e4967626faf12fa56999cd6222dff6992ceb086ad7945756baf70c7a7/ruff-0.16.0.tar.gz", hash = "sha256:e460aafd5495ec89efaa6ced2e4a9a581116451e1c88b9d37ef497e0f8e93982", size = 4790557, upload-time = "2026-07-23T19:11:30.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/81/1c8818fee7ce1a04cd7d1b3172e0a8f8e4f1dc4feb7fc390e16daa8af323/ruff-0.16.0-py3-none-linux_armv6l.whl", hash = "sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e", size = 10754633, upload-time = "2026-07-23T19:10:46.415Z" }, + { url = "https://files.pythonhosted.org/packages/23/df/beaf59c09d68db84304d555f188b276a77132a5d5b0b67a5c762aa143628/ruff-0.16.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3c954b1d580bfa035b41654f7858cc7e71d5fc3ac5b723dd62bd9133830ed522", size = 10969164, upload-time = "2026-07-23T19:10:50.271Z" }, + { url = "https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81", size = 10488846, upload-time = "2026-07-23T19:10:52.639Z" }, + { url = "https://files.pythonhosted.org/packages/52/2a/a2db8e88cade358f5cdcb05674a917751074109315d014eb6352d9a893f7/ruff-0.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e364e5ed22ed8dc05082fd78e35308618260907ac2d3c1d637b2e682415b6c9", size = 10889729, upload-time = "2026-07-23T19:10:54.89Z" }, + { url = "https://files.pythonhosted.org/packages/42/65/62a771694ebd63029dc953e27dbad40e1588bd4860ff9fe881018fddaa49/ruff-0.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d327b8fc113a1d4421a04f3839d3752057c8dd1ee320223a6f3f52d04ada462a", size = 10568275, upload-time = "2026-07-23T19:10:56.993Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e2/ced249fe8af5f086c5c58cc21cc3356d50f32f7401c5df87050c999620a7/ruff-0.16.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b50c55e263103586b3dcf5f73d479eb8cb5fdb6098fec59a62891dab653717", size = 11385112, upload-time = "2026-07-23T19:10:59.615Z" }, + { url = "https://files.pythonhosted.org/packages/87/0b/05154977a8fd69eeb6c103271f55403bfd8711f5c0f8ed07489d95a504e7/ruff-0.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ff4a79ce3ec0172f3241943835de1c4cb4e2dcd07f0f8c2d02603dbbbee4b17", size = 12207008, upload-time = "2026-07-23T19:11:02.154Z" }, + { url = "https://files.pythonhosted.org/packages/fb/29/98225831a3a1eab0e02f4acc6ca6559a98611dcc68b6965ff4b7234627c1/ruff-0.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4", size = 11650842, upload-time = "2026-07-23T19:11:04.557Z" }, + { url = "https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b", size = 11400718, upload-time = "2026-07-23T19:11:09.233Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a2/a54eb4eae05d66364050a5d3b8a9c5ef88196531b3cbe7109d873f87f819/ruff-0.16.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:48044c678e9cb8698246c99b14aaccfa6601dea7379eb48a6f8f73f7a6d86cd0", size = 11426177, upload-time = "2026-07-23T19:11:11.994Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/16e3eea4b2a478a496919f5e36f17c4559e54620bd3bbac5d6affa068006/ruff-0.16.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7aa0959bad8eb8bef50340154fc9b58678dae31fa4293afa38b44b6e552c0213", size = 10856126, upload-time = "2026-07-23T19:11:14.221Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/252eb8b868a16eec7257c14f504f77537e734b2d69c762e639e588e304a3/ruff-0.16.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:28ea2b7df8ebf7f9da6b7d47b230ab48f387c0a29be3b474c4d0740e197bb9af", size = 10571208, upload-time = "2026-07-23T19:11:16.378Z" }, + { url = "https://files.pythonhosted.org/packages/21/09/817a482f542f7570cbb4554b26e896610c7114f539b1d9e2d2145bf6bef6/ruff-0.16.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:33a3dfac8c35f81498dea9181bccc2f4c4bc8f1521a1dd9406e77643e0f0fb09", size = 11063329, upload-time = "2026-07-23T19:11:19.173Z" }, + { url = "https://files.pythonhosted.org/packages/2e/23/9403c180ca1cb9b1f7335f5c3e5305c09d49ea5b345196682a36028bde4a/ruff-0.16.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a5237a0bda500d30d81b8e07a6973a5cbc772864cbf746ae2f4e8a2e01c9f4ed", size = 11489751, upload-time = "2026-07-23T19:11:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1d/1b2ef7bcde851c78d7f17f1cca13fd6dc695fc4b3d6197941e72cae5b132/ruff-0.16.0-py3-none-win32.whl", hash = "sha256:7fab76fa065c873f41ff744347c6e77bcc3dfec4bcc754dc26b63d23c0f7f5fb", size = 10785885, upload-time = "2026-07-23T19:11:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a3/d5e4ef7a56be3f928ffb90b94c25ba7d3cb9c7fe0736aeaaedf361770712/ruff-0.16.0-py3-none-win_amd64.whl", hash = "sha256:429c117f022bf481fabd9d551e7a3952b24c65e6ef44337ea09d90bebef14472", size = 11923141, upload-time = "2026-07-23T19:11:26.409Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9a/8415f2657cbe200f41a4531ccededf135505a92d4a012229121f885b26f9/ruff-0.16.0-py3-none-win_arm64.whl", hash = "sha256:14296fedcd2705c77ab8235439278bbb38f285cf7da5528b00b3e330c3d4872d", size = 11273407, upload-time = "2026-07-23T19:11:28.705Z" }, +]