Skip to content

Commit 7dd629a

Browse files
Lukas Geigerclaude
andcommitted
fix: Bugsweep-Fixes (40 Bugs), Workspace-Export und Tests
Bug-Fixes: - WinStorePackager: subprocess-Deadlock und Exception-Handler behoben (#39) - ProfilerBridge: SQLite-Connection-Leak (try/finally) auf allen 6 Sites (#40) - Settings: unbekannte Keys persistieren; sofortige Tab-Anwendung nach Speichern - Build-Dialog, New-Project-Dialog, Settings-Dialog: UI-Stabilität und Validierung - AI-Panel/Service: Event-Loop-Sicherheit in QThread, asyncio-Fehlerbehandlung - EventBus: Mutation-Safety (List-Copy vor Iteration), Duplikat-Schutz - Kompilator: capture_output statt PIPE, sichere return_code-Behandlung - sync_manager: try/finally für SQLite-Checkpoints - Diverse kleine Fixes (40 Bugs insgesamt) Neu: - workspace_export.py: redigierter Projekt-Export (Datei → Arbeitsstand exportieren) - tests/linux_platform_smoke.py: plattformübergreifender Smoke-Test - tests/test_workspace_export.py: 163 Zeilen Tests für Workspace-Export - pyproject.toml: PEP-517-Projektmetadaten CI: - tests.yml: linux-platform-smoke Job ergänzt - .gitignore: DECISIONS.md, PORTIERUNGSPLAN.md, TODO.md, DONE.md gitignored Tests: 73/73 grün, Smoke-Test bestanden Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9d71d00 commit 7dd629a

32 files changed

Lines changed: 1932 additions & 268 deletions

.github/workflows/stale.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
stale:
1414
runs-on: ubuntu-latest
1515
steps:
16-
- uses: actions/stale@v9
16+
- uses: actions/stale@v10
1717
with:
1818
stale-issue-message: >
1919
This issue has been automatically marked as stale because it has not had

.github/workflows/tests.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,33 @@ jobs:
3535
env:
3636
QT_QPA_PLATFORM: offscreen
3737
run: python -m unittest discover -s tests -v
38+
39+
linux-platform-smoke:
40+
runs-on: ubuntu-latest
41+
42+
steps:
43+
- name: Check out repository
44+
uses: actions/checkout@v6
45+
46+
- name: Set up Python
47+
uses: actions/setup-python@v6
48+
with:
49+
python-version: "3.11"
50+
51+
- name: Install dependencies
52+
run: |
53+
python -m pip install --upgrade pip
54+
python -m pip install -r requirements.txt
55+
56+
- name: Compile sources
57+
run: python -m compileall -q main.py manage_translations.py translator.py src tests
58+
59+
- name: Run unit tests
60+
env:
61+
QT_QPA_PLATFORM: offscreen
62+
run: python -m unittest discover -s tests -v
63+
64+
- name: Run Linux platform smoke
65+
env:
66+
QT_QPA_PLATFORM: offscreen
67+
run: python tests/linux_platform_smoke.py

.github/workflows/welcome.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ jobs:
1414
welcome:
1515
runs-on: ubuntu-latest
1616
steps:
17-
- uses: actions/first-interaction@v1
17+
- uses: actions/first-interaction@v3
1818
with:
19-
repo-token: ${{ secrets.GITHUB_TOKEN }}
20-
issue-message: |
19+
repo_token: ${{ secrets.GITHUB_TOKEN }}
20+
issue_message: |
2121
Welcome! 👋 Thanks for opening your first issue in this repository.
2222
2323
We'll review it as soon as possible. In the meantime:
2424
- Check if there's a similar issue already open
2525
- Add as much detail as possible (steps to reproduce, expected behavior, environment)
2626
2727
If you'd like to contribute a fix, PRs are always welcome!
28-
pr-message: |
28+
pr_message: |
2929
Welcome! 👋 Thanks for your first pull request in this repository.
3030
3131
A maintainer will review it soon. Please make sure:

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# =============================================================================
1+
# =============================================================================
22
# .gitignore Template fuer Software Entwicklung Projekte
33
# Kopieren und als .gitignore im Projektroot ablegen
44
# Projektspezifische Eintraege am Ende anfuegen
@@ -91,3 +91,7 @@ _archive/
9191
_private/
9292

9393
# ---- Projektspezifisch (hier eigene Eintraege anfuegen) ----
94+
DECISIONS.md
95+
PORTIERUNGSPLAN.md
96+
TODO.md
97+
DONE.md

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,30 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
55

66
## [Unreleased]
77

8+
### Build / Release
9+
- EXE neu gebaut 2026-06-01 (PyInstaller `--onefile`, `DevCenter.exe`); 25/25 Tests grün, Smoke-Test bestanden. Vorherige EXE: 2026-04-29. Anlass: workspace_export.py neu hinzugefügt.
10+
811
### Hinzugefügt / Added
912
- GitHub Actions Smoke-Checks für Python 3.10, 3.11 und 3.12.
1013
- Lokales `build_exe.bat` für den PyInstaller-Build mit `DevCenter.ico`.
1114
- Datenschutzhinweise für lokale Einstellungen, Datei-Indizes, Build-Artefakte und optionale API-Nutzung.
1215
- `llms.txt` mit maschinenlesbarer Projektpositionierung, Datenschutzgrenzen und relevanten Suchbegriffen.
16+
- Redigierter Workspace-Export `devcenter-workspace-v1.json` als Desktop-Funktion unter `Datei -> Arbeitsstand exportieren...`.
1317

1418
### Geändert / Changed
1519
- README, Contribution- und Security-Dokumentation auf `dev-bricks/DevCenter` aktualisiert.
1620
- Beispielkonfiguration für WinStorePackager anonymisiert und neutralisiert.
1721
- README auf englischen GitHub-Einstieg, klarere DevCenter-Namensabgrenzung und bessere Discoverability-Keywords erweitert.
1822
- Community-Workflows auf aktuelle Action-Versionen gehoben.
23+
- `AUFGABEN.txt`, `EXPORTFORMAT.md` und `web_companion/README.md` auf den umgesetzten Exportpfad synchronisiert.
1924

2025
### Behoben / Fixed
2126
- Persistenz unbekannter Einstellungsschlüssel abgesichert, damit UI-/Legacy-Aliase beim Speichern nicht verloren gehen.
2227
- Fehlende `chardet`-Abhängigkeit für frische CI-/Installationsumgebungen ergänzt.
23-
- Editor-Einstellungen werden nach dem Speichern auf offene Tabs angewendet; der Dialog persistiert jetzt auch „Aktuelle Zeile hervorheben“ und aktualisiert Schrift, Tab-Breite, Zeilennummern und Cursor-Markierung unmittelbar.
28+
- Editor-Einstellungen werden nach dem Speichern auf offene Tabs angewendet; der Dialog persistiert jetzt auch „Aktuelle Zeile hervorheben” und aktualisiert Schrift, Tab-Breite, Zeilennummern und Cursor-Markierung unmittelbar.
29+
- Workspace-Exporte redigieren jetzt offene Aufgaben, Projektpfade und aktuelle Analyseprobleme, ohne Secrets oder lokale Vollpfade mitzuschreiben.
30+
- `WinStorePackager`: subprocess-Deadlock behoben — `check_call` mit PIPE durch `subprocess.run(..., capture_output=True)` ersetzt; Exception-Handler liest jetzt immer `stderr or stdout`.
31+
- `ProfilerBridge`: SQLite-Connection-Leak auf Windows geschlossen — alle 6 `conn.close()`-Stellen in `search()`, `find_duplicates()` und `get_statistics()` verwenden jetzt `try/finally`.
2432

2533
## [1.0.0] - YYYY-MM-DD
2634

EXPORTFORMAT.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# Exportformat DevCenter
22

3-
Stand: 2026-05-27
3+
Stand: 2026-06-01
44

55
## Zweck
66

7-
`devcenter-workspace-v1.json` ist das geplante Austauschformat zwischen der DevCenter-Desktop-App und einem späteren Web-/PWA-Companion. Es soll Projektstatus, Analyseberichte, Build-Checklisten und redigierte Konfigurationen transportieren, ohne vollständige Quelltexte, API-Schlüssel, lokale Datenbanken oder Build-Artefakte weiterzugeben.
7+
`devcenter-workspace-v1.json` ist das Austauschformat zwischen der DevCenter-Desktop-App und einem späteren Web-/PWA-Companion. Es transportiert Projektstatus, Analyseberichte, Build-Checklisten und redigierte Konfigurationen, ohne vollständige Quelltexte, API-Schlüssel, lokale Datenbanken oder Build-Artefakte weiterzugeben.
8+
9+
Seit 2026-06-01 erzeugt die Desktop-App diesen Export direkt über `Datei -> Arbeitsstand exportieren...`.
810

911
## Grundregeln
1012

@@ -89,3 +91,11 @@ Stand: 2026-05-27
8991
- Tests decken Secret- und Pfadredaktion ab.
9092
- Companion kann eine Beispieldatei lokal importieren und anzeigen.
9193
- Kein Export enthält `api_key`, `token`, `secret`, `%APPDATA%`, `C:\Users\` oder unredigierte Projekt-Vollpfade.
94+
95+
## Implementierter Desktop-Export (2026-06-01)
96+
97+
- Liest Projektmetadaten aus `devcenter.json` und der aktuell geöffneten Projektkonfiguration.
98+
- Exportiert Analysezusammenfassung und die aktuelle Problem-Liste in redigierter Form.
99+
- Wandelt Projektpfade in `project-1/...` und externe lokale Pfade in stabile Referenzen wie `output-dir-1` um.
100+
- Übernimmt nur offene Aufgaben aus `AUFGABEN.txt`; erledigte Punkte bleiben außen vor.
101+
- Exportiert bewusst keine AI- oder Keyring-Daten.

README.md

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,61 @@
11
# 🚀 DevCenter
22

3-
**Python Development Suite** - Eine integrierte Entwicklungsumgebung für den kompletten Python-Entwicklungszyklus
3+
**Local-first Python IDE and developer toolkit for Windows.** DevCenter combines a PySide6 code editor, static analyzer, PyInstaller build helper, license collector, file index and optional Claude/Anthropic assistant in one desktop suite.
44

55
![Version](https://img.shields.io/badge/version-1.0.0-blue)
66
![Python](https://img.shields.io/badge/python-3.10+-green)
77
![License](https://img.shields.io/badge/license-GPL%20v3-blue)
88

9-
## 📋 Übersicht
9+
## Overview
10+
11+
DevCenter is a local desktop development suite for Python projects that covers the practical workflow from first file to release checklist:
12+
13+
**Write -> Analyze -> Test -> Build -> Publish**
14+
15+
It is designed for developers who want a lightweight local IDE with built-in project analysis, EXE packaging support, privacy-aware settings, and export planning for a future read-only Web/PWA companion.
16+
17+
This repository is **not** Azure DevCenter, Microsoft Dev Box, Moderne DevCenter or Devbox. It is the `dev-bricks/DevCenter` open-source Python desktop app.
18+
19+
![DevCenter main window showing the local Python IDE dashboard](README/screenshots/main.png)
20+
21+
## Why DevCenter
22+
23+
- **Local-first workflow:** projects, indexes, settings and build artifacts stay on your machine by default.
24+
- **Python desktop focus:** PySide6 interface, syntax highlighting, project explorer, terminal output and settings persistence.
25+
- **Static analysis built in:** method/class detection, complexity checks, import analysis, TODO/FIXME detection and encoding repair helpers.
26+
- **Build and release helpers:** PyInstaller wrapper, icon conversion, third-party license collection, release notes and export planning.
27+
- **Optional AI assistant:** Claude/Anthropic integration is opt-in and should use local settings, keyring or environment variables.
28+
- **Companion-ready export:** `Datei -> Arbeitsstand exportieren...` writes a redacted `devcenter-workspace-v1.json` for a future static Web/PWA viewer.
29+
30+
## Quick Start
31+
32+
```bash
33+
git clone https://github.com/dev-bricks/DevCenter.git
34+
cd DevCenter
35+
pip install -r requirements.txt
36+
python main.py
37+
```
38+
39+
Windows helpers:
40+
41+
```batch
42+
START_DevCenter.bat
43+
build_exe.bat
44+
```
45+
46+
## Keywords
47+
48+
`Python IDE`, `PySide6 IDE`, `local-first developer tools`, `offline Python editor`, `PyInstaller GUI`, `static code analyzer`, `developer toolkit`, `Windows Python desktop app`, `AI-assisted coding`, `license collector`, `project export`, `PWA companion`.
49+
50+
## Deutsch: Übersicht
1051

1152
DevCenter ist eine All-in-One Desktop-IDE für Python-Projekte, die den kompletten Entwicklungszyklus unterstützt:
1253

13-
**Code schreiben Analysieren Testen Kompilieren Veröffentlichen**
54+
**Code schreiben -> Analysieren -> Testen -> Kompilieren -> Veröffentlichen**
1455

15-
## Screenshot
56+
DevCenter ist eine lokale Desktop-Anwendung und nicht mit Azure DevCenter, Microsoft Dev Box, Moderne DevCenter oder Devbox identisch.
1657

17-
![DevCenter Hauptfenster](README/screenshots/main.png)
58+
![DevCenter Hauptfenster mit lokalem Python-IDE-Dashboard](README/screenshots/main.png)
1859

1960
### 🔧 Fusionierte Tools
2061

pyproject.toml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[project]
2+
name = "devcenter-suite"
3+
version = "1.0.0"
4+
description = "Entwickler-Zentrale: Build, Analyse, Sync und AI-Assistent"
5+
authors = [{ name = "Lukas Geiger", email = "lukasgeiger@googlemail.com" }]
6+
requires-python = ">=3.11"
7+
license = { file = "LICENSE" }
8+
readme = "README.md"
9+
10+
dependencies = [
11+
"PySide6>=6.5.0,<7.0.0",
12+
"pyinstaller>=5.0.0,<7.0.0",
13+
"Pillow>=9.0.0,<12.0.0",
14+
"anthropic>=0.18.0,<1.0.0",
15+
"keyring>=23.0.0,<26.0.0",
16+
"chardet>=5.0.0,<6.0.0",
17+
"ftfy>=6.1.0,<7.0.0",
18+
"pip-licenses>=4.0.0,<5.0.0",
19+
"watchdog>=3.0.0,<5.0.0",
20+
]
21+
22+
[project.optional-dependencies]
23+
dev = ["pytest>=8.0", "ruff>=0.5"]
24+
25+
[tool.pytest.ini_options]
26+
testpaths = ["tests"]
27+
28+
[tool.ruff]
29+
target-version = "py311"
30+
line-length = 100

resources/WinStorePackager/WindowsStorePublisher_3.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -940,13 +940,20 @@ def build_thread():
940940
*i18n_data_arg,
941941
staged_script
942942
]
943-
943+
944944
startupinfo = None
945945
if os.name == 'nt':
946946
startupinfo = subprocess.STARTUPINFO()
947947
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
948948

949-
subprocess.check_call(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo)
949+
subprocess.run(
950+
cmd,
951+
capture_output=True,
952+
encoding='utf-8',
953+
errors='replace',
954+
startupinfo=startupinfo,
955+
check=True,
956+
)
950957

951958
progress.update_status("Aufräumen...")
952959
for pattern in ["build", "*.spec"]:
@@ -980,7 +987,7 @@ def build_thread():
980987

981988
except subprocess.CalledProcessError as e:
982989
progress.close()
983-
err_out = e.stderr.decode('cp1252', errors='ignore') if e.stderr else "Unbekannter Fehler"
990+
err_out = e.stderr or e.stdout or "Unbekannter Fehler"
984991
self.after(0, lambda: messagebox.showerror("PyInstaller Fehler", f"{err_out}"))
985992
except Exception as e:
986993
progress.close()

src/core/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
from .project_manager import ProjectManager
88
from .settings_manager import SettingsManager
99
from .event_bus import EventBus
10+
from .workspace_export import build_workspace_export, export_workspace
1011

11-
__all__ = ['ProjectManager', 'SettingsManager', 'EventBus']
12+
__all__ = ['ProjectManager', 'SettingsManager', 'EventBus', 'build_workspace_export', 'export_workspace']

0 commit comments

Comments
 (0)