diff --git a/.gitignore b/.gitignore index 4cc20fa..afce2e7 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,11 @@ pytest*.txt # Personal-Builds (BUILD-VERFAHREN §9) und lokale Backups *-personal.exe SoftwareCenter_PRE_*.py + +# ---- Agenten-interne Arbeitsnotizen (GITHUB-POLICY.md §3, T-20260926-510472849) ---- +BEFUNDE.md +*STATUS-LOG.txt +STORE_CONTRACT.md +STORE_READINESS.md +_WARTUNG/ +_STAGING/ diff --git a/BEFUNDE.md b/BEFUNDE.md deleted file mode 100644 index 6f829e6..0000000 --- a/BEFUNDE.md +++ /dev/null @@ -1,49 +0,0 @@ -# Befunde — SoftwareCenter - -**Erfasst am:** 2026-07-28 -**Rolle:** TICKET-MASTER / Plan-D-Handoff - -## Entscheidung und Git-Provenienz - -- Autorisierte Entscheidung `D-20260727-008`: lokalen Stand kontrolliert auf - `origin/master` rebasen, Commit und Icons erhalten, anschließend erneut - testen. -- Der ursprüngliche lokale Commit `4ccb965` wurde auf den Remote-Stand - `83ab6b3` rebaset und als `8dfa64f` fortgeführt. `c89960c` dokumentierte den - ersten Closeout. -- Die auf dem Remote bereits bewusst entfernte `web_companion`-Implementierung - bleibt entfernt. Eine durch den Rebase übernommene, dadurch unzutreffende - PWA-Zeile im Changelog wurde ebenfalls entfernt. -- Die im bisherigen OneDrive-Arbeitsstand enthaltenen - `BUGSWEEP-41`-Pfadprüfungen wurden als eigener, testbarer Codebestand - übernommen. Unabhängige Typografieänderungen sind keine Voraussetzung für - diesen Fix. -- Die autorisierten Icon-Masterdateien wurden bitgenau erhalten: - `SoftwareCenter.ico` - (`4052B690501B8D0BCE19270A4DEDC7136B4995D84EA11BFF72D657B01565CDBC`) - und `SoftwareCenter.png` - (`BA3DF6B23BE8DF0706EE632CC9C5C282703E9468C3A644ABE1B886F7E0F02125`). - -## Verifikation - -- `python -m pytest -q`: **124 bestanden** -- Die portable Katalogroutine besitzt separat **12 bestandene Tests**, - einschließlich read-only Daily Care, leerem/fehlerhaftem Scan, - `SUPPRESSED`-Erhalt, Idempotenz, Prozess-Abbruch und - Backup/Wiederherstellung beider Profile. -- Der reale Daily-Care-Lauf erkannte 59 Katalog-, Registry- und - Kandidateneinträge. Drei fehlende Startziele und acht nur geplante - Profiländerungen wurden gemeldet; es wurde keine Profil- oder - Registry-Mutation vorgenommen. - -## Tägliche Betriebsroutine - -Der headless Job `softwarecenter.launchboards.daily-care` ist im -`ellmos-scheduler` für täglich 06:20 Uhr Europe/Berlin registriert und im -Automation Master als read-only, vergleichbare Automatisierung erfasst. Die -versteckte Windows-Aufgabe -`ellmos SoftwareCenter LaunchBoards Daily Care` führt täglich genau einen -Scheduler-Tick aus, holt verpasste Starts nach und vermeidet parallele -Instanzen. Ein kontrollierter Hintergrundstart endete mit Resultat `0`; der -Scheduler bestätigte dabei einen neuen `last_tick_at`. Damit ist die tägliche -Ausführung auf WORKSTATION-LG aktiviert, ohne sichtbares Fenster. diff --git a/CHANGELOG.md b/CHANGELOG.md index 27231ae..59e5584 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - 2026-09-23 (Pfad A: Technical Hygiene, CI Lifecycle & Lock Defense) +### Fixed (Repo Hygiene, T-20260926-510472849) +- Untracked `BEFUNDE.md`, `STORE_CONTRACT.md` (internal Store release/versioning bookkeeping) and `_WARTUNG/msix_staging/` (staged MSIX build output) -- all stay on disk locally (gitignored), nothing was deleted. `PRODUCT_BOUNDARIES.md`, `scripts/verify_product_boundaries.py` and `tests/test_store_contract.py` now cite/check `STORE_LISTING.md`/`WINDOWS_STORE_PREP.md`/`store_package.json` only. +- `MARKETING-LOG.txt` and `RUNTIME_DAILY_CARE.md` were untracked in an earlier, over-eager pass on this branch and are restored here: `MARKETING-LOG.txt` is a deliberate public artifact (`pyproject.toml` project.url, a dedicated test); `RUNTIME_DAILY_CARE.md` is linked from README.md/README_de.md/README.es.md and is genuine migration/ops documentation, not agent scratch state. + ### Hygiene & Governance - Linter Zero-Tolerance: Resolved 7 ruff lint diagnostics (unused imports and import sorting in `SoftwareCenter.py` and `tests/test_ui_accessibility.py`); verified 100% clean across all rule-sets. - Open-Source Attribution: Created canonical root `NOTICE` attribution file (Lukas Geiger, file-bricks, open-bricks umbrella). @@ -26,6 +30,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - 2026-09-13 +### Fixed +- README main-window screenshot: `README/screenshots/main.png` predated the reproducible Store screenshot generator and showed an empty, freshly-installed board ("Allgemein", 0 entries) instead of the app's real functionality (T-20260926-413277423). Replaced the README (EN/DE/ES) and `STORE_LISTING.md` reference with the already-existing, regenerated `README/screenshots/store/main-window.png` (populated `Dev` board, produced by `generate_store_screenshots.py`), and removed the stale `main.png`. No LaunchBoards equivalent existed to check -- LaunchBoards has no tracked UI screenshot in this repo. + ### Added - Empty-Board Placeholder UI: When a board has 0 items, `SoftwareListWidget.paintEvent` renders a clean, non-intrusive empty-state overlay with title ("Dieses Board ist noch leer") and explanatory hint ("Ziehen Sie beliebige Apps, Dokumente, Ordner oder Verknüpfungen hierher.") adapting dynamically to system theme palettes. - Help / About Dialog: Added `Hilfe` -> `Über SoftwareCenter` (and `Über LaunchBoards` for sister profile) menu action with version and concise description of the universal organization layer. diff --git a/PRODUCT_BOUNDARIES.md b/PRODUCT_BOUNDARIES.md index 5aa8c52..3e00157 100644 --- a/PRODUCT_BOUNDARIES.md +++ b/PRODUCT_BOUNDARIES.md @@ -17,9 +17,11 @@ identity, or release artifact. | Store metadata | `store_package.json` | `store_package_launchboards.json` | | Local release artifact | versioned SoftwareCenter path | `releases/v1.0.0/LaunchBoards-1.0.0-win64.exe` | -`STORE_CONTRACT.md`, `STORE_LISTING.md`, and `WINDOWS_STORE_PREP.md` remain the -canonical SoftwareCenter Store contract and contain no LaunchBoards identity or -artifact. LaunchBoards metadata is intentionally separate and does not alter +`STORE_LISTING.md` and `WINDOWS_STORE_PREP.md` remain the canonical, public +SoftwareCenter Store contract and contain no LaunchBoards identity or +artifact (the former `STORE_CONTRACT.md` covered the same invariant but was +agent-internal release bookkeeping, untracked per T-20260926-510472849). +LaunchBoards metadata is intentionally separate and does not alter SoftwareCenter release hashes. ## Reproducible verification diff --git a/README.es.md b/README.es.md index aea4f8d..abb9474 100644 --- a/README.es.md +++ b/README.es.md @@ -21,7 +21,7 @@ Un organizador de escritorio ligero y multiplataforma para gestionar accesos dir > [!NOTE] > **Integración de IA / LLM e índice legible por máquinas:** SoftwareCenter proporciona metadatos estructurados en [`llms.txt`](llms.txt) y admite migraciones de perfiles a través de JSON versionado (`softwarecenter-profile-v1.json`). -![Ventana principal de SoftwareCenter](README/screenshots/main.png) +![Ventana principal de SoftwareCenter](README/screenshots/store/main-window.png) ## Navegación rápida diff --git a/README.md b/README.md index 0786545..6f8d64a 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ A lightweight, cross-platform desktop organizer for managing software shortcuts > [!NOTE] > **LLM / AI Integration & Machine-Readable Index:** SoftwareCenter provides structured machine-readable metadata in [`llms.txt`](llms.txt) and supports profile migrations via versioned JSON (`softwarecenter-profile-v1.json`). -![SoftwareCenter main window](README/screenshots/main.png) +![SoftwareCenter main window](README/screenshots/store/main-window.png) ## Quick Navigation diff --git a/README/screenshots/main.png b/README/screenshots/main.png deleted file mode 100644 index 2126604..0000000 Binary files a/README/screenshots/main.png and /dev/null differ diff --git a/README/screenshots/store/list-view.png b/README/screenshots/store/list-view.png index b56e8b6..c78433a 100644 Binary files a/README/screenshots/store/list-view.png and b/README/screenshots/store/list-view.png differ diff --git a/README/screenshots/store/main-window.png b/README/screenshots/store/main-window.png index 2f4199c..d7e0cae 100644 Binary files a/README/screenshots/store/main-window.png and b/README/screenshots/store/main-window.png differ diff --git a/README/screenshots/store/summary.json b/README/screenshots/store/summary.json index 6fffdc8..ceba511 100644 --- a/README/screenshots/store/summary.json +++ b/README/screenshots/store/summary.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-08-13T23:35:18Z", + "generated_at": "2026-09-26T11:34:00Z", "screenshots": [ { "name": "main", diff --git a/README/screenshots/store/tab-organization.png b/README/screenshots/store/tab-organization.png index 4bb9908..0c2a1b1 100644 Binary files a/README/screenshots/store/tab-organization.png and b/README/screenshots/store/tab-organization.png differ diff --git a/README/screenshots/store/tiles-view.png b/README/screenshots/store/tiles-view.png index 3e12f86..ce04842 100644 Binary files a/README/screenshots/store/tiles-view.png and b/README/screenshots/store/tiles-view.png differ diff --git a/README_de.md b/README_de.md index 2f0570a..4ed5887 100644 --- a/README_de.md +++ b/README_de.md @@ -21,7 +21,7 @@ Ein leichtgewichtiger, plattformübergreifender Desktop-Organizer für Software- > [!NOTE] > **KI / LLM Integration & Maschinelles Register:** SoftwareCenter bietet maschinenlesbare Metadaten in [`llms.txt`](llms.txt) und unterstützt Profil-Migrationen über versioniertes JSON (`softwarecenter-profile-v1.json`). -![SoftwareCenter Hauptfenster](README/screenshots/main.png) +![SoftwareCenter Hauptfenster](README/screenshots/store/main-window.png) ## Schnellnavigation diff --git a/STORE_CONTRACT.md b/STORE_CONTRACT.md deleted file mode 100644 index 0cb0d5b..0000000 --- a/STORE_CONTRACT.md +++ /dev/null @@ -1,53 +0,0 @@ -# SoftwareCenter Store-Vertrag - -Stand: 2026-08-25 - -## Release- und Artefaktstatus - -Es gibt am 2026-08-25 **keinen gültigen Store-Einreichkandidaten**. Die -Statusquellen werden deshalb ausdrücklich getrennt: - -| Quelle | Readback | Bedeutung | -|---|---|---| -| `pyproject.toml` | `1.2.0` | aktuelle Source-/Build-Linie | -| `SoftwareCenter.py` | `__version__ = 1.2.0` | Runtime-/Exportstand der Quelle | -| `store_package.json` | `1.2.0.0` | kanonischer Store-Metadatenstand | -| `releases/v1.2.0/SoftwareCenter-1.2.0-win64.exe` | SHA-256 `1AD7F9FE5AA89A004402E4F6833A67FBF85810C20B8444B3C634474F0B59C6C7` | lokal, unsigniert, nicht WACK-geprüft | - -Die Versionen sind einheitlich harmonisiert (`1.2.0` / `1.2.0.0`). Privacy-URL, -Support-URL, Publisher, Identity, `runFullTrust` und Kategorie sind in den -Metadaten konsistent. Vor einem Store-Release muss ein frisch signiertes MSIX mit -echtem WACK-Report erstellt werden; aktuell wird kein Signing oder Upload behauptet. - -`store_package.json` ist die kanonische, versionierte Metadatenquelle. Die -lokale Packaging-Einstellung und das Staging-Manifest müssen sie abbilden, nicht -eigenständig abweichen. - -| Feld | Kanonischer Wert | -|---|---| -| App / Identity | `SoftwareCenter` / `Geiger.SoftwareCenter` | -| Publisher | `CN=52596601-BAB4-4F3F-B182-E8F3F273B202` / `Geiger` | -| Version / EXE | `1.2.0.0` / `SoftwareCenter.exe` | -| Capability | `runFullTrust` | -| Ressourcen | `en-us`, `de-de` | -| Kategorie | `Utilities & Tools` | -| Privacy / Support | GitHub `PRIVACY_POLICY.md` / Issues | - -`releases/windowsstore/store_settings.json` ist eine lokale Build-Einstellung -und verwendet für `capabilities` denselben Wert `runFullTrust`. Das -`AppxManifest.xml` führt ihn als `rescap:Capability`. Dieser Abgleich bedeutet -keine Signierung, keinen MSIX-Build und keine Store-Einreichung. - -## Wiederholbarer Readback - -```powershell -python -m json.tool store_package.json -[xml](Get-Content -Raw _WARTUNG/msix_staging/AppxManifest.xml) -``` - -`releases/windowsstore/store_settings.json` ist eine lokale, nicht versionierte -Build-Einstellung und liegt nicht in jedem Arbeitsverzeichnis vor; das -versionierte Staging-Manifest steht unter `_WARTUNG/msix_staging/`. - -Danach Identity, Publisher, Version, `Application/@Executable`, die zwei -Ressourcen und `rescap:Capability/@Name` gegen die Tabelle vergleichen. diff --git a/STORE_LISTING.md b/STORE_LISTING.md index 74fe654..c087d7f 100644 --- a/STORE_LISTING.md +++ b/STORE_LISTING.md @@ -123,7 +123,7 @@ Es wird **keine Einreichung** behauptet. `pyproject.toml`, `SoftwareCenter.py` u - [x] No hardcoded paths in source code - [x] No debug print statements - [x] PySide6 (LGPL) -- license compatible with Store distribution -- [x] README-Screenshot vorhanden (`README/screenshots/main.png`) +- [x] README-Screenshot vorhanden (`README/screenshots/store/main-window.png`, generiert via `generate_store_screenshots.py`) - [x] Store-Screenshot-Set erzeugbar: `python generate_store_screenshots.py` schreibt `README/screenshots/store/main-window.png`, `tab-organization.png`, `tiles-view.png`, `list-view.png` und `summary.json` - [ ] Aktuelles MSIX als Einreichkandidat vorhanden (historisches OneDrive-Artefakt 2026-03-13; nicht frisch signiert/WACK-geprüft) - [ ] Code-Signing (.pfx) -- noch nicht konfiguriert in store_settings.json diff --git a/_WARTUNG/msix_staging/AppxManifest.xml b/_WARTUNG/msix_staging/AppxManifest.xml deleted file mode 100644 index bae2f56..0000000 --- a/_WARTUNG/msix_staging/AppxManifest.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - SoftwareCenter - Geiger - icons\Square150x150Logo.png - Desktop-App-Organizer und Launcher. Kategorisierung, Schnellstart, Übersicht installierter Software. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/_WARTUNG/msix_staging/icons/Square150x150Logo.png b/_WARTUNG/msix_staging/icons/Square150x150Logo.png deleted file mode 100644 index 517db3e..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square150x150Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Square310x310Logo.png b/_WARTUNG/msix_staging/icons/Square310x310Logo.png deleted file mode 100644 index 9fa6ded..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square310x310Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Square44x44Logo.png b/_WARTUNG/msix_staging/icons/Square44x44Logo.png deleted file mode 100644 index b049759..0000000 Binary files a/_WARTUNG/msix_staging/icons/Square44x44Logo.png and /dev/null differ diff --git a/_WARTUNG/msix_staging/icons/Wide310x150Logo.png b/_WARTUNG/msix_staging/icons/Wide310x150Logo.png deleted file mode 100644 index 2a0b3f4..0000000 Binary files a/_WARTUNG/msix_staging/icons/Wide310x150Logo.png and /dev/null differ diff --git a/scripts/verify_product_boundaries.py b/scripts/verify_product_boundaries.py index 1012e51..dd538f2 100644 --- a/scripts/verify_product_boundaries.py +++ b/scripts/verify_product_boundaries.py @@ -39,7 +39,7 @@ def verify_static_contract() -> dict[str, str]: build_script = (ROOT / "build_exe_launchboards.bat").read_text(encoding="utf-8") software_store_docs = "\n".join( (ROOT / name).read_text(encoding="utf-8") - for name in ("STORE_CONTRACT.md", "STORE_LISTING.md", "WINDOWS_STORE_PREP.md") + for name in ("STORE_LISTING.md", "WINDOWS_STORE_PREP.md") ) assert sc.PROFILE_SOFTWARECENTER.name == "SoftwareCenter" diff --git a/tests/test_store_contract.py b/tests/test_store_contract.py index dc7cd4d..1d6db3e 100644 --- a/tests/test_store_contract.py +++ b/tests/test_store_contract.py @@ -1,4 +1,10 @@ -"""Regression contract for versioned SoftwareCenter Store metadata.""" +"""Regression contract for versioned SoftwareCenter Store metadata. + +STORE_CONTRACT.md and _WARTUNG/msix_staging/ (staged MSIX build output) were +untracked as agent-internal / build-artifact material (T-20260926-510472849, +GITHUB-POLICY.md SS3). This contract now checks only files that stay public: +store_package.json, pyproject.toml, SoftwareCenter.py, and STORE_LISTING.md. +""" import json import re @@ -24,7 +30,6 @@ def _project_version() -> str: def test_store_package_is_the_documented_canonical_contract(): package = json.loads((ROOT / "store_package.json").read_text(encoding="utf-8")) listing = (ROOT / "STORE_LISTING.md").read_text(encoding="utf-8") - contract = (ROOT / "STORE_CONTRACT.md").read_text(encoding="utf-8") assert package["app_name"] == "SoftwareCenter" assert package["publisher"] == "CN=52596601-BAB4-4F3F-B182-E8F3F273B202" @@ -38,8 +43,6 @@ def test_store_package_is_the_documented_canonical_contract(): assert package["support_url"].endswith("/issues") assert "### Category\nUtilities & Tools" in listing - assert "`store_package.json` ist die kanonische" in contract - assert "`runFullTrust`" in contract def test_version_is_identical_in_every_store_relevant_source(): @@ -54,12 +57,5 @@ def test_version_is_identical_in_every_store_relevant_source(): assert runtime == project, f"SoftwareCenter.py {runtime} != pyproject.toml {project}" assert package["version"] == four_part - manifest = (ROOT / "_WARTUNG" / "msix_staging" / "AppxManifest.xml").read_text( - encoding="utf-8-sig" - ) - assert f'Version="{four_part}"' in manifest - - contract = (ROOT / "STORE_CONTRACT.md").read_text(encoding="utf-8") listing = (ROOT / "STORE_LISTING.md").read_text(encoding="utf-8") - assert f"`{four_part}`" in contract assert f"| Version | {four_part} |" in listing